Best JavaScript code snippet using playwright-internal
knockback-core.js
Source:knockback-core.js  
1/*2  knockback-core.js 0.16.73  (c) 2011, 2012 Kevin Malakoff - http://kmalakoff.github.com/knockback/4  License: MIT (http://www.opensource.org/licenses/mit-license.php)5  Dependencies: Knockout.js, Backbone.js, and Underscore.js.6*/7(function() {8  return (function(factory) {9    // AMD10    if (typeof define === 'function' && define.amd) {11      return define('knockback', ['underscore', 'backbone', 'knockout'], factory);12    }13    // CommonJS/NodeJS or No Loader14    else {15      return factory.call(this);16    }17  })(function() {// Generated by CoffeeScript 1.3.318/*19  knockback-core.js 0.16.720  (c) 2011, 2012 Kevin Malakoff.21  Knockback.js is freely distributable under the MIT license.22  See the following for full license details:23    https://github.com/kmalakoff/knockback/blob/master/LICENSE24  Dependencies: Knockout.js, Backbone.js, and Underscore.js.25*/26var Backbone, COMPARE_ASCENDING, COMPARE_DESCENDING, COMPARE_EQUAL, KB_TYPE_ARRAY, KB_TYPE_COLLECTION, KB_TYPE_MODEL, KB_TYPE_SIMPLE, KB_TYPE_UNKNOWN, addStatisticsEvent, collapseOptions, kb, ko, onReady, _, _argumentsAddKey, _arraySplice, _legacyWarning, _throwMissing, _throwUnexpected, _unwrapModels, _unwrapObservable, _wrappedKey,27  __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };28kb = (function() {29  function kb() {}30  kb.VERSION = '0.16.7';31  kb.TYPE_UNKNOWN = 0;32  kb.TYPE_SIMPLE = 1;33  kb.TYPE_ARRAY = 2;34  kb.TYPE_MODEL = 3;35  kb.TYPE_COLLECTION = 4;36  kb.release = function(obj, pre_release_fn) {37    var array, item, view_model, view_models, _i, _j, _len, _len1;38    if ((!obj || (obj !== Object(obj))) || ((typeof obj === 'function') && !ko.isObservable(obj)) || obj.__kb_destroyed || ((obj instanceof Backbone.Model) || (obj instanceof Backbone.Collection))) {39      return this;40    }41    if (_.isArray(obj)) {42      array = obj.splice(0, obj.length);43      for (_i = 0, _len = array.length; _i < _len; _i++) {44        item = array[_i];45        kb.release(item);46      }47      return this;48    }49    obj.__kb_destroyed = true;50    !pre_release_fn || pre_release_fn();51    if (ko.isObservable(obj) || (typeof obj.dispose === 'function') || (typeof obj.destroy === 'function') || (typeof obj.release === 'function')) {52      if (ko.isObservable(obj) && _.isArray(array = obj())) {53        if (obj.__kb_is_co || (obj.__kb_is_o && (obj.valueType() === KB_TYPE_COLLECTION))) {54          if (obj.destroy) {55            obj.destroy();56          } else if (obj.dispose) {57            obj.dispose();58          }59        } else if (array.length) {60          view_models = array.slice(0);61          array.splice(0, array.length);62          for (_j = 0, _len1 = view_models.length; _j < _len1; _j++) {63            view_model = view_models[_j];64            kb.release(view_model);65          }66        }67      } else if (obj.release) {68        obj.release();69      } else if (obj.destroy) {70        obj.destroy();71      } else if (obj.dispose) {72        obj.dispose();73      }74    } else {75      this.releaseKeys(obj);76    }77    return this;78  };79  kb.releaseKeys = function(obj) {80    var key, value;81    for (key in obj) {82      value = obj[key];83      (key === '__kb') || kb.release(value, (function() {84        return obj[key] = null;85      }));86    }87    return this;88  };89  kb.releaseOnNodeRemove = function(view_model, node) {90    view_model || _throwUnexpected(this, 'missing view model');91    node || _throwUnexpected(this, 'missing node');92    return ko.utils.domNodeDisposal.addDisposeCallback(node, function() {93      return kb.release(view_model);94    });95  };96  kb.renderTemplate = function(template, view_model, options) {97    var el, observable;98    if (options == null) {99      options = {};100    }101    el = document.createElement('div');102    observable = ko.renderTemplate(template, view_model, options, el, 'replaceChildren');103    if (el.children.length === 1) {104      el = el.children[0];105    }106    kb.releaseOnNodeRemove(view_model, el);107    observable.dispose();108    return el;109  };110  kb.renderAutoReleasedTemplate = function(template, view_model, options) {111    if (options == null) {112      options = {};113    }114    _legacyWarning('kb.renderAutoReleasedTemplate', '0.16.3', 'Please use kb.renderTemplate instead');115    return this.renderTemplate(template, view_model, options = {});116  };117  kb.applyBindings = function(view_model, node) {118    ko.applyBindings(view_model, node);119    return kb.releaseOnNodeRemove(view_model, node);120  };121  return kb;122})();123this.Knockback = this.kb = kb;124if (typeof exports !== 'undefined') {125  module.exports = kb;126}127if (!this._ && (typeof require !== 'undefined')) {128  try {129    _ = require('lodash');130  } catch (e) {131    _ = require('underscore');132  }133} else {134  _ = this._;135}136kb._ = _ = _.hasOwnProperty('_') ? _._ : _;137kb.Backbone = Backbone = !this.Backbone && (typeof require !== 'undefined') ? require('backbone') : this.Backbone;138kb.ko = ko = !this.ko && (typeof require !== 'undefined') ? require('knockout') : this.ko;139_throwMissing = function(instance, message) {140  throw "" + (_.isString(instance) ? instance : instance.constructor.name) + ": " + message + " is missing";141};142_throwUnexpected = function(instance, message) {143  throw "" + (_.isString(instance) ? instance : instance.constructor.name) + ": " + message + " is unexpected";144};145_legacyWarning = function(identifier, last_version, message) {146  var _base;147  this._legacy_warnings || (this._legacy_warnings = {});148  (_base = this._legacy_warnings)[identifier] || (_base[identifier] = 0);149  this._legacy_warnings[identifier]++;150  return console.warn("warning: '" + identifier + "' has been deprecated (will be removed in Knockback after " + last_version + "). " + message + ".");151};152_arraySplice = Array.prototype.splice;153_unwrapObservable = ko.utils.unwrapObservable;154collapseOptions = function(options) {155  var result;156  result = _.clone(options);157  while (options.options) {158    _.defaults(result, options.options);159    options = options.options;160  }161  delete result.options;162  return result;163};164KB_TYPE_UNKNOWN = kb.TYPE_UNKNOWN;165KB_TYPE_SIMPLE = kb.TYPE_SIMPLE;166KB_TYPE_ARRAY = kb.TYPE_ARRAY;167KB_TYPE_MODEL = kb.TYPE_MODEL;168KB_TYPE_COLLECTION = kb.TYPE_COLLECTION;169/*170  knockback-utils.js171  (c) 2011, 2012 Kevin Malakoff.172  Knockback.js is freely distributable under the MIT license.173  See the following for full license details:174    https://github.com/kmalakoff/knockback/blob/master/LICENSE175  Dependencies: Knockout.js, Backbone.js, and Underscore.js.176    Optional dependency: Backbone.ModelRef.js.177*/178_wrappedKey = function(obj, key, value) {179  if (arguments.length === 2) {180    if (obj && obj.__kb && obj.__kb.hasOwnProperty(key)) {181      return obj.__kb[key];182    } else {183      return void 0;184    }185  }186  obj || _throwUnexpected(this, "no obj for wrapping " + key);187  obj.__kb || (obj.__kb = {});188  obj.__kb[key] = value;189  return value;190};191_argumentsAddKey = function(args, key) {192  _arraySplice.call(args, 1, 0, key);193  return args;194};195_unwrapModels = function(obj) {196  var key, result, value;197  if (!obj) {198    return obj;199  }200  if (obj.__kb) {201    if ('object' in obj.__kb) {202      return obj.__kb.object;203    } else {204      return obj;205    }206  } else if (_.isArray(obj)) {207    return _.map(obj, function(test) {208      return _unwrapModels(test);209    });210  } else if (_.isObject(obj) && (obj.constructor === {}.constructor)) {211    result = {};212    for (key in obj) {213      value = obj[key];214      result[key] = _unwrapModels(value);215    }216    return result;217  }218  return obj;219};220kb.utils = (function() {221  function utils() {}222  utils.wrappedObservable = function(obj, value) {223    return _wrappedKey.apply(this, _argumentsAddKey(arguments, 'observable'));224  };225  utils.wrappedObject = function(obj, value) {226    return _wrappedKey.apply(this, _argumentsAddKey(arguments, 'object'));227  };228  utils.wrappedModel = function(obj, value) {229    if (arguments.length === 1) {230      value = _wrappedKey(obj, 'object');231      if (_.isUndefined(value)) {232        return obj;233      } else {234        return value;235      }236    } else {237      return _wrappedKey(obj, 'object', value);238    }239  };240  utils.wrappedStore = function(obj, value) {241    return _wrappedKey.apply(this, _argumentsAddKey(arguments, 'store'));242  };243  utils.wrappedStoreIsOwned = function(obj, value) {244    return _wrappedKey.apply(this, _argumentsAddKey(arguments, 'store_is_owned'));245  };246  utils.wrappedFactory = function(obj, value) {247    return _wrappedKey.apply(this, _argumentsAddKey(arguments, 'factory'));248  };249  utils.wrappedEventWatcher = function(obj, value) {250    return _wrappedKey.apply(this, _argumentsAddKey(arguments, 'event_watcher'));251  };252  utils.wrappedEventWatcherIsOwned = function(obj, value) {253    return _wrappedKey.apply(this, _argumentsAddKey(arguments, 'event_watcher_is_owned'));254  };255  utils.wrappedDestroy = function(obj) {256    var __kb;257    if (!obj.__kb) {258      return;259    }260    if (obj.__kb.event_watcher) {261      obj.__kb.event_watcher.releaseCallbacks(obj);262    }263    __kb = obj.__kb;264    obj.__kb = null;265    if (__kb.observable) {266      __kb.observable.destroy = __kb.observable.release = null;267      this.wrappedDestroy(__kb.observable);268      __kb.observable = null;269    }270    __kb.factory = null;271    if (__kb.event_watcher_is_owned) {272      __kb.event_watcher.destroy();273    }274    __kb.event_watcher = null;275    if (__kb.store_is_owned) {276      __kb.store.destroy();277    }278    return __kb.store = null;279  };280  utils.valueType = function(observable) {281    if (!observable) {282      return KB_TYPE_UNKNOWN;283    }284    if (observable.__kb_is_o) {285      return observable.valueType();286    }287    if (observable.__kb_is_co || (observable instanceof Backbone.Collection)) {288      return KB_TYPE_COLLECTION;289    }290    if ((observable instanceof kb.ViewModel) || (observable instanceof Backbone.Model)) {291      return KB_TYPE_MODEL;292    }293    if (_.isArray(observable)) {294      return KB_TYPE_ARRAY;295    }296    return KB_TYPE_SIMPLE;297  };298  utils.pathJoin = function(path1, path2) {299    return (path1 ? (path1[path1.length - 1] !== '.' ? "" + path1 + "." : path1) : '') + path2;300  };301  utils.optionsPathJoin = function(options, path) {302    return _.defaults({303      path: this.pathJoin(options.path, path)304    }, options);305  };306  utils.inferCreator = function(value, factory, path, owner, key) {307    var creator, relation;308    if (factory) {309      creator = factory.creatorForPath(value, path);310    }311    if (creator) {312      return creator;313    }314    if (owner && Backbone.RelationalModel && (owner instanceof Backbone.RelationalModel)) {315      key = _unwrapObservable(key);316      relation = _.find(owner.getRelations(), function(test) {317        return test.key === key;318      });319      if (relation) {320        if (relation.collectionType || _.isArray(relation.keyContents)) {321          return kb.CollectionObservable;322        } else {323          return kb.ViewModel;324        }325      }326    }327    if (!value) {328      return null;329    }330    if (value instanceof Backbone.Model) {331      return kb.ViewModel;332    }333    if (value instanceof Backbone.Collection) {334      return kb.CollectionObservable;335    }336    return null;337  };338  utils.createFromDefaultCreator = function(obj, options) {339    if (obj instanceof Backbone.Model) {340      return kb.viewModel(obj, options);341    }342    if (obj instanceof Backbone.Collection) {343      return kb.collectionObservable(obj, options);344    }345    if (_.isArray(obj)) {346      return ko.observableArray(obj);347    }348    return ko.observable(obj);349  };350  utils.hasModelSignature = function(obj) {351    return obj && (obj.attributes && !obj.models) && (typeof obj.get === 'function') && (typeof obj.trigger === 'function');352  };353  utils.hasCollectionSignature = function(obj) {354    return obj && obj.models && (typeof obj.get === 'function') && (typeof obj.trigger === 'function');355  };356  utils.release = function(obj) {357    _legacyWarning('kb.utils.release', '0.16.0', 'Please use kb.release instead');358    return kb.release(obj);359  };360  return utils;361})();362/*363  knockback_factory.js364  (c) 2011, 2012 Kevin Malakoff.365  Knockback.Factory is freely distributable under the MIT license.366  See the following for full license details:367    https://github.com/kmalakoff/knockback/blob/master/LICENSE368*/369kb.Factory = (function() {370  Factory.useOptionsOrCreate = function(options, obj, owner_path) {371    var factory;372    if (options.factory && (!options.factories || (options.factories && options.factory.hasPathMappings(options.factories, owner_path)))) {373      return kb.utils.wrappedFactory(obj, options.factory);374    }375    factory = kb.utils.wrappedFactory(obj, new kb.Factory(options.factory));376    if (options.factories) {377      factory.addPathMappings(options.factories, owner_path);378    }379    return factory;380  };381  function Factory(parent_factory) {382    this.parent_factory = parent_factory;383    this.paths = {};384  }385  Factory.prototype.hasPath = function(path) {386    return this.paths.hasOwnProperty(path) || (this.parent_factory && this.parent_factory.hasPath(path));387  };388  Factory.prototype.addPathMapping = function(path, create_info) {389    return this.paths[path] = create_info;390  };391  Factory.prototype.addPathMappings = function(factories, owner_path) {392    var create_info, path;393    for (path in factories) {394      create_info = factories[path];395      this.paths[kb.utils.pathJoin(owner_path, path)] = create_info;396    }397  };398  Factory.prototype.hasPathMappings = function(factories, owner_path) {399    var all_exist, creator, existing_creator, path;400    all_exist = true;401    for (path in factories) {402      creator = factories[path];403      all_exist &= (existing_creator = this.creatorForPath(null, kb.utils.pathJoin(owner_path, path))) && (creator === existing_creator);404    }405    return all_exist;406  };407  Factory.prototype.creatorForPath = function(obj, path) {408    var creator;409    if ((creator = this.paths[path])) {410      if (creator.view_model) {411        return creator.view_model;412      } else {413        return creator;414      }415    }416    if (this.parent_factory) {417      if ((creator = this.parent_factory.creatorForPath(obj, path))) {418        return creator;419      }420    }421    return null;422  };423  return Factory;424})();425/*426  knockback_store.js427  (c) 2012 Kevin Malakoff.428  Knockback.Store is freely distributable under the MIT license.429  See the following for full license details:430    https://github.com/kmalakoff/knockback/blob/master/LICENSE431*/432kb.Store = (function() {433  Store.useOptionsOrCreate = function(options, obj, observable) {434    if (options.store) {435      options.store.register(obj, observable, options);436      return kb.utils.wrappedStore(observable, options.store);437    } else {438      kb.utils.wrappedStoreIsOwned(observable, true);439      return kb.utils.wrappedStore(observable, new kb.Store());440    }441  };442  function Store() {443    this.observable_records = [];444    this.replaced_observables = [];445  }446  Store.prototype.destroy = function() {447    return this.clear();448  };449  Store.prototype.clear = function() {450    var record, _i, _len, _ref;451    _ref = this.observable_records.splice(0, this.observable_records.length);452    for (_i = 0, _len = _ref.length; _i < _len; _i++) {453      record = _ref[_i];454      kb.release(record.observable);455    }456    kb.release(this.replaced_observables);457  };458  Store.prototype.register = function(obj, observable, options) {459    var creator;460    if (!observable) {461      return;462    }463    if (ko.isObservable(observable) || observable.__kb_is_co) {464      return;465    }466    kb.utils.wrappedObject(observable, obj);467    obj || (observable.__kb_null = true);468    creator = options.creator ? options.creator : (options.path && options.factory ? options.factory.creatorForPath(obj, options.path) : null);469    if (!creator) {470      creator = observable.constructor;471    }472    this.observable_records.push({473      obj: obj,474      observable: observable,475      creator: creator476    });477    return observable;478  };479  Store.prototype.findIndex = function(obj, creator) {480    var index, record, _ref;481    if (!obj || (obj instanceof Backbone.Model)) {482      _ref = this.observable_records;483      for (index in _ref) {484        record = _ref[index];485        if (!record.observable) {486          continue;487        }488        if (record.observable.__kb_destroyed) {489          record.obj = null;490          record.observable = null;491          continue;492        }493        if ((!obj && !record.observable.__kb_null) || (obj && (record.observable.__kb_null || (record.obj !== obj)))) {494          continue;495        } else if ((record.creator === creator) || (record.creator.create && (record.creator.create === creator.create))) {496          return index;497        }498      }499    }500    return -1;501  };502  Store.prototype.find = function(obj, creator) {503    var index;504    if ((index = this.findIndex(obj, creator)) < 0) {505      return null;506    } else {507      return this.observable_records[index].observable;508    }509  };510  Store.prototype.isRegistered = function(observable) {511    var record, _i, _len, _ref;512    _ref = this.observable_records;513    for (_i = 0, _len = _ref.length; _i < _len; _i++) {514      record = _ref[_i];515      if (record.observable === observable) {516        return true;517      }518    }519    return false;520  };521  Store.prototype.findOrCreate = function(obj, options) {522    var creator, observable;523    options.store = this;524    options.creator || (options.creator = kb.utils.inferCreator(obj, options.factory, options.path));525    if (!options.creator && (obj instanceof Backbone.Model)) {526      options.creator = kv.ViewModel;527    }528    creator = options.creator;529    if (!creator) {530      return kb.utils.createFromDefaultCreator(obj, options);531    } else if (creator.models_only) {532      return obj;533    }534    if (creator) {535      observable = this.find(obj, creator);536    }537    if (observable) {538      return observable;539    }540    if (creator.create) {541      observable = creator.create(obj, options);542    } else {543      observable = new creator(obj, options);544    }545    observable || (observable = ko.observable(null));546    if (!ko.isObservable(observable)) {547      this.isRegistered(observable) || this.register(obj, observable, options);548    }549    return observable;550  };551  Store.prototype.findOrReplace = function(obj, creator, observable) {552    var index, record;553    obj || raiseUnexpected('obj missing');554    if ((index = this.findIndex(obj, creator)) < 0) {555      return this.register(obj, observable, {556        creator: creator557      });558    } else {559      record = this.observable_records[index];560      (kb.utils.wrappedObject(record.observable) === obj) || _throwUnexpected(this, 'different object');561      if (record.observable !== observable) {562        (record.observable.constructor === observable.constructor) || _throwUnexpected(this, 'replacing different type');563        this.replaced_observables.push(record.observable);564        record.observable = observable;565      }566      return observable;567    }568  };569  return Store;570})();571/*572  knockback_event_watcher.js573  (c) 2011, 2012 Kevin Malakoff.574  Knockback.Observable is freely distributable under the MIT license.575  See the following for full license details:576    https://github.com/kmalakoff/knockback/blob/master/LICENSE577*/578addStatisticsEvent = function(emitter, event_name, info) {579  return !kb.statistics || kb.statistics.addModelEvent({580    name: event_name,581    emitter: emitter,582    key: info.key,583    path: info.path584  });585};586kb.EventWatcher = (function() {587  EventWatcher.useOptionsOrCreate = function(options, emitter, obj, callback_options) {588    if (options.event_watcher) {589      if (!(options.event_watcher.emitter() === emitter || (options.event_watcher.model_ref === emitter))) {590        _throwUnexpected(this, 'emitter not matching');591      }592      return kb.utils.wrappedEventWatcher(obj, options.event_watcher).registerCallbacks(obj, callback_options);593    } else {594      kb.utils.wrappedEventWatcherIsOwned(obj, true);595      return kb.utils.wrappedEventWatcher(obj, new kb.EventWatcher(emitter)).registerCallbacks(obj, callback_options);596    }597  };598  function EventWatcher(emitter, obj, callback_options) {599    this._onModelUnloaded = __bind(this._onModelUnloaded, this);600    this._onModelLoaded = __bind(this._onModelLoaded, this);601    this.__kb || (this.__kb = {});602    this.__kb.callbacks = {};603    this.__kb._onModelLoaded = _.bind(this._onModelLoaded, this);604    this.__kb._onModelUnloaded = _.bind(this._onModelUnloaded, this);605    if (callback_options) {606      this.registerCallbacks(obj, callback_options);607    }608    if (emitter) {609      this.emitter(emitter);610    } else {611      this.ee = null;612    }613  }614  EventWatcher.prototype.destroy = function() {615    this.emitter(null);616    this.__kb.callbacks = null;617    return kb.utils.wrappedDestroy(this);618  };619  EventWatcher.prototype.emitter = function(new_emitter) {620    var callbacks, event_name, info, list, previous_emitter, _i, _len, _ref;621    if ((arguments.length === 0) || (this.ee === new_emitter)) {622      return this.ee;623    }624    if (this.model_ref) {625      this.model_ref.unbind('loaded', this.__kb._onModelLoaded);626      this.model_ref.unbind('unloaded', this.__kb._onModelUnloaded);627      this.model_ref.release();628      this.model_ref = null;629    }630    if (Backbone.ModelRef && (new_emitter instanceof Backbone.ModelRef)) {631      this.model_ref = new_emitter;632      this.model_ref.retain();633      this.model_ref.bind('loaded', this.__kb._onModelLoaded);634      this.model_ref.bind('unloaded', this.__kb._onModelUnloaded);635      new_emitter = this.model_ref.model();636    } else {637      delete this.model_ref;638    }639    previous_emitter = this.ee;640    this.ee = new_emitter;641    _ref = this.__kb.callbacks;642    for (event_name in _ref) {643      callbacks = _ref[event_name];644      if (previous_emitter) {645        previous_emitter.unbind(event_name, callbacks.fn);646      }647      if (new_emitter) {648        this.ee.bind(event_name, callbacks.fn);649      }650      list = callbacks.list;651      for (_i = 0, _len = list.length; _i < _len; _i++) {652        info = list[_i];653        if (info.emitter) {654          info.emitter(this.ee);655        }656      }657    }658    return new_emitter;659  };660  EventWatcher.prototype.registerCallbacks = function(obj, callback_info) {661    var callbacks, event_name, event_names, event_selector, info, list, _i, _len,662      _this = this;663    obj || _throwMissing(this, 'obj');664    callback_info || _throwMissing(this, 'info');665    event_selector = callback_info.event_selector ? callback_info.event_selector : 'change';666    event_names = event_selector.split(' ');667    for (_i = 0, _len = event_names.length; _i < _len; _i++) {668      event_name = event_names[_i];669      if (!event_name) {670        continue;671      }672      callbacks = this.__kb.callbacks[event_name];673      if (!callbacks) {674        list = [];675        callbacks = {676          list: list,677          fn: function(emitter) {678            var info, _j, _len1;679            for (_j = 0, _len1 = list.length; _j < _len1; _j++) {680              info = list[_j];681              if (info.update && !info.rel_fn) {682                if (emitter && info.key && (emitter.hasChanged && !emitter.hasChanged(_unwrapObservable(info.key)))) {683                  continue;684                }685                !kb.statistics || addStatisticsEvent(emitter, event_name, info);686                info.update();687              }688            }689            return null;690          }691        };692        this.__kb.callbacks[event_name] = callbacks;693        if (this.ee) {694          this.ee.bind(event_name, callbacks.fn);695        }696      }697      info = _.defaults({698        obj: obj699      }, callback_info);700      callbacks.list.push(info);701    }702    if (this.ee) {703      if (Backbone.RelationalModel && (this.ee instanceof Backbone.RelationalModel) && _.contains(event_names, 'change')) {704        this._modelBindRelatationalInfo('change', info);705      }706      info.emitter(this.ee) && info.emitter;707    }708  };709  EventWatcher.prototype.releaseCallbacks = function(obj) {710    var callbacks, event_name, index, info, _ref, _ref1;711    if (!this.__kb.callbacks) {712      return;713    }714    _ref = this.__kb.callbacks;715    for (event_name in _ref) {716      callbacks = _ref[event_name];717      _ref1 = callbacks.list;718      for (index in _ref1) {719        info = _ref1[index];720        if (info.obj !== obj) {721          continue;722        }723        callbacks.list.splice(index, 1);724        if (info.rel_fn) {725          this._modelUnbindRelatationalInfo(event_name, info);726        }727        if (info.emitter) {728          info.emitter(null);729        }730        return;731      }732    }733  };734  EventWatcher.prototype._onModelLoaded = function(model) {735    var callbacks, event_name, info, is_relational, list, _i, _len, _ref;736    is_relational = Backbone.RelationalModel && (model instanceof Backbone.RelationalModel);737    this.ee = model;738    _ref = this.__kb.callbacks;739    for (event_name in _ref) {740      callbacks = _ref[event_name];741      this.ee.bind(event_name, callbacks.fn);742      list = callbacks.list;743      for (_i = 0, _len = list.length; _i < _len; _i++) {744        info = list[_i];745        if (is_relational) {746          this._modelBindRelatationalInfo(event_name, info);747        }748        if (info.emitter) {749          info.emitter(this.ee);750        }751      }752    }753  };754  EventWatcher.prototype._onModelUnloaded = function(model) {755    var callbacks, event_name, info, list, _i, _len, _ref;756    this.ee = null;757    _ref = this.__kb.callbacks;758    for (event_name in _ref) {759      callbacks = _ref[event_name];760      model.unbind(event_name, callbacks.fn);761      list = callbacks.list;762      for (_i = 0, _len = list.length; _i < _len; _i++) {763        info = list[_i];764        if (info.rel_fn) {765          this._modelUnbindRelatationalInfo(event_name, info);766        }767        if (info.emitter) {768          info.emitter(null);769        }770      }771    }772  };773  EventWatcher.prototype._modelBindRelatationalInfo = function(event_name, info) {774    var key, relation;775    if ((event_name === 'change') && info.key && info.update) {776      key = _unwrapObservable(info.key);777      relation = _.find(this.ee.getRelations(), function(test) {778        return test.key === key;779      });780      if (!relation) {781        return;782      }783      info.rel_fn = function(emitter) {784        !kb.statistics || addStatisticsEvent(emitter, "" + event_name + " (relational)", info);785        return info.update();786      };787      if (relation.collectionType || _.isArray(relation.keyContents)) {788        info.is_collection = true;789        this.ee.bind("add:" + info.key, info.rel_fn);790        this.ee.bind("remove:" + info.key, info.rel_fn);791      } else {792        this.ee.bind("update:" + info.key, info.rel_fn);793      }794    }795  };796  EventWatcher.prototype._modelUnbindRelatationalInfo = function(event_name, info) {797    if (!info.rel_fn) {798      return;799    }800    if (info.is_collection) {801      this.ee.unbind("add:" + info.key, info.rel_fn);802      this.ee.unbind("remove:" + info.key, info.rel_fn);803    } else {804      this.ee.unbind("update:" + info.key, info.rel_fn);805    }806    info.rel_fn = null;807  };808  return EventWatcher;809})();810kb.emitterObservable = function(emitter, observable) {811  return new kb.EventWatcher(emitter, observable);812};813/*814  knockback-observable.js815  (c) 2012 Kevin Malakoff.816  Knockback.Observable is freely distributable under the MIT license.817  See the following for full license details:818    https://github.com/kmalakoff/knockback/blob/master/LICENSE819*/820kb.Observable = (function() {821  function Observable(model, options, vm) {822    var create_options, event_watcher, observable,823      _this = this;824    this.vm = vm;825    options || _throwMissing(this, 'options');826    this.vm || (this.vm = {});827    if (_.isString(options) || ko.isObservable(options)) {828      create_options = this.create_options = {829        key: options830      };831    } else {832      create_options = this.create_options = collapseOptions(options);833    }834    this.key = create_options.key;835    delete create_options.key;836    this.key || _throwMissing(this, 'key');837    !create_options.args || (this.args = create_options.args, delete create_options.args);838    !create_options.read || (this.read = create_options.read, delete create_options.read);839    !create_options.write || (this.write = create_options.write, delete create_options.write);840    event_watcher = create_options.event_watcher;841    delete create_options.event_watcher;842    this.vo = ko.observable(null);843    this._model = ko.observable();844    observable = kb.utils.wrappedObservable(this, ko.dependentObservable({845      read: function() {846        var arg, args, new_value, _i, _len, _ref;847        args = [_unwrapObservable(_this.key)];848        if (_this.args) {849          if (_.isArray(_this.args)) {850            _ref = _this.args;851            for (_i = 0, _len = _ref.length; _i < _len; _i++) {852              arg = _ref[_i];853              args.push(_unwrapObservable(arg));854            }855          } else {856            args.push(_unwrapObservable(_this.args));857          }858        }859        if (_this._mdl === _this._model() && _this._mdl) {860          new_value = _this.read ? _this.read.apply(_this.vm, args) : _this._mdl.get.apply(_this._mdl, args);861          _this.update(new_value);862        }863        return _unwrapObservable(_this.vo());864      },865      write: function(new_value) {866        var arg, args, set_info, unwrapped_new_value, _i, _len, _ref;867        unwrapped_new_value = _unwrapModels(new_value);868        set_info = {};869        set_info[_unwrapObservable(_this.key)] = unwrapped_new_value;870        args = _this.write ? [unwrapped_new_value] : [set_info];871        if (_this.args) {872          if (_.isArray(_this.args)) {873            _ref = _this.args;874            for (_i = 0, _len = _ref.length; _i < _len; _i++) {875              arg = _ref[_i];876              args.push(_unwrapObservable(arg));877            }878          } else {879            args.push(_unwrapObservable(_this.args));880          }881        }882        if (_this._mdl) {883          if (_this.write) {884            _this.write.apply(_this.vm, args);885          } else {886            _this._mdl.set.apply(_this._mdl, args);887          }888        }889        return _this.update(new_value);890      },891      owner: this.vm892    }));893    observable.__kb_is_o = true;894    create_options.store = kb.utils.wrappedStore(observable, create_options.store);895    create_options.path = kb.utils.pathJoin(create_options.path, this.key);896    if (create_options.factories && ((typeof create_options.factories === 'function') || create_options.factories.create)) {897      create_options.factory = kb.utils.wrappedFactory(observable, new kb.Factory(create_options.factory));898      create_options.factory.addPathMapping(create_options.path, create_options.factories);899    } else {900      create_options.factory = kb.Factory.useOptionsOrCreate(create_options, observable, create_options.path);901    }902    delete create_options.factories;903    observable.value = _.bind(this.value, this);904    observable.valueType = _.bind(this.valueType, this);905    observable.destroy = _.bind(this.destroy, this);906    observable.model = this.model = ko.dependentObservable({907      read: function() {908        _this._model();909        return _this._mdl;910      },911      write: function(new_model) {912        if (_this.__kb_destroyed || (_this._mdl === new_model)) {913          return;914        }915        _this._mdl = new_model;916        _this.update(null);917        return _this._model(new_model);918      }919    });920    kb.EventWatcher.useOptionsOrCreate({921      event_watcher: event_watcher922    }, model, this, {923      emitter: this.model,924      update: _.bind(this.update, this),925      key: this.key,926      path: create_options.path927    });928    this.__kb_value || this.update();929    if (kb.LocalizedObservable && create_options.localizer) {930      observable = new create_options.localizer(observable);931      delete create_options.localizer;932    }933    if (kb.DefaultObservable && create_options.hasOwnProperty('default')) {934      observable = kb.defaultObservable(observable, create_options["default"]);935      delete create_options["default"];936    }937    return observable;938  }939  Observable.prototype.destroy = function() {940    var observable;941    observable = kb.utils.wrappedObservable(this);942    this.__kb_destroyed = true;943    kb.release(this.__kb_value);944    this.__kb_value = null;945    this.model.dispose();946    this._mdl = this.model = observable.model = null;947    return kb.utils.wrappedDestroy(this);948  };949  Observable.prototype.value = function() {950    return this.__kb_value;951  };952  Observable.prototype.valueType = function() {953    var new_value;954    new_value = this._mdl ? this._mdl.get(this.key) : null;955    this.value_type || this._updateValueObservable(new_value);956    return this.value_type;957  };958  Observable.prototype.update = function(new_value) {959    var new_type, value;960    if (this.__kb_destroyed) {961      return;962    }963    if (this._mdl && !arguments.length) {964      new_value = this._mdl.get(_unwrapObservable(this.key));965    }966    (new_value !== void 0) || (new_value = null);967    new_type = kb.utils.valueType(new_value);968    if (!this.__kb_value || (this.__kb_value.__kb_destroyed || (this.__kb_value.__kb_null && new_value))) {969      this.__kb_value = void 0;970      this.value_type = void 0;971    }972    value = this.__kb_value;973    if (_.isUndefined(this.value_type) || (this.value_type !== new_type && new_type !== KB_TYPE_UNKNOWN)) {974      if ((this.value_type === KB_TYPE_COLLECTION) && (new_type === KB_TYPE_ARRAY)) {975        return value(new_value);976      } else {977        return this._updateValueObservable(new_value);978      }979    } else if (this.value_type === KB_TYPE_MODEL) {980      if (typeof value.model === 'function') {981        if (value.model() !== new_value) {982          return value.model(new_value);983        }984      } else if (kb.utils.wrappedObject(value) !== new_value) {985        return this._updateValueObservable(new_value);986      }987    } else if (this.value_type === KB_TYPE_COLLECTION) {988      if (value.collection() !== new_value) {989        return value.collection(new_value);990      }991    } else {992      if (value() !== new_value) {993        return value(new_value);994      }995    }996  };997  Observable.prototype._updateValueObservable = function(new_value) {998    var create_options, creator, previous_value, value;999    create_options = this.create_options;1000    create_options.creator = kb.utils.inferCreator(new_value, create_options.factory, create_options.path, this._mdl, this.key);1001    this.value_type = KB_TYPE_UNKNOWN;1002    creator = create_options.creator;1003    previous_value = this.__kb_value;1004    this.__kb_value = void 0;1005    if (previous_value) {1006      kb.release(previous_value);1007    }1008    if (creator) {1009      if (create_options.store) {1010        value = create_options.store.findOrCreate(new_value, create_options);1011      } else {1012        if (creator.models_only) {1013          value = new_value;1014          this.value_type = KB_TYPE_SIMPLE;1015        } else if (creator.create) {1016          value = creator.create(new_value, create_options);1017        } else {1018          value = new creator(new_value, create_options);1019        }1020      }1021    } else {1022      if (_.isArray(new_value)) {1023        this.value_type = KB_TYPE_ARRAY;1024        value = ko.observableArray(new_value);1025      } else {1026        this.value_type = KB_TYPE_SIMPLE;1027        value = ko.observable(new_value);1028      }1029    }1030    if (this.value_type === KB_TYPE_UNKNOWN) {1031      if (!ko.isObservable(value)) {1032        this.value_type = KB_TYPE_MODEL;1033        if (typeof value.model !== 'function') {1034          kb.utils.wrappedObject(value, new_value);1035        }1036      } else if (value.__kb_is_co) {1037        this.value_type = KB_TYPE_COLLECTION;1038      } else {1039        this.value_type = KB_TYPE_SIMPLE;1040      }1041    }1042    this.__kb_value = value;1043    return this.vo(value);1044  };1045  return Observable;1046})();1047kb.observable = function(model, options, view_model) {1048  return new kb.Observable(model, options, view_model);1049};1050/*1051  knockback-view-model.js1052  (c) 2011, 2012 Kevin Malakoff.1053  Knockback.Observable is freely distributable under the MIT license.1054  See the following for full license details:1055    https://github.com/kmalakoff/knockback/blob/master/LICENSE1056*/1057kb.ViewModel = (function() {1058  ViewModel.extend = Backbone.Model.extend;1059  function ViewModel(model, options, view_model) {1060    var attribute_keys, bb_model, event_watcher, keys, mapped_keys, mapping_info, vm_key, _mdl, _ref,1061      _this = this;1062    !model || (model instanceof Backbone.Model) || ((typeof model.get === 'function') && (typeof model.bind === 'function')) || _throwUnexpected(this, 'not a model');1063    options || (options = {});1064    view_model || (view_model = {});1065    if (_.isArray(options)) {1066      options = {1067        keys: options1068      };1069    } else {1070      options = collapseOptions(options);1071    }1072    this.__kb || (this.__kb = {});1073    this.__kb.vm_keys = {};1074    this.__kb.model_keys = {};1075    this.__kb.view_model = _.isUndefined(view_model) ? this : view_model;1076    !options.internals || (this.__kb.internals = options.internals);1077    !options.excludes || (this.__kb.excludes = options.excludes);1078    kb.Store.useOptionsOrCreate(options, model, this);1079    this.__kb.path = options.path;1080    kb.Factory.useOptionsOrCreate(options, this, options.path);1081    _mdl = _wrappedKey(this, '_mdl', ko.observable());1082    this.model = ko.dependentObservable({1083      read: function() {1084        _mdl();1085        return kb.utils.wrappedObject(_this);1086      },1087      write: function(new_model) {1088        var event_watcher, missing;1089        if (kb.utils.wrappedObject(_this) === new_model) {1090          return;1091        }1092        if (_this.__kb_null) {1093          !new_model || _throwUnexpected(_this, 'model set on shared null');1094          return;1095        }1096        kb.utils.wrappedObject(_this, new_model);1097        event_watcher = kb.utils.wrappedEventWatcher(_this);1098        if (!event_watcher) {1099          _mdl(new_model);1100          return;1101        }1102        event_watcher.emitter(new_model);1103        if (!(_this.__kb.keys || !new_model || !new_model.attributes)) {1104          missing = _.difference(_.keys(new_model.attributes), _.keys(_this.__kb.model_keys));1105          if (missing) {1106            _this._createObservables(new_model, missing);1107          }1108        }1109        _mdl(new_model);1110      }1111    });1112    event_watcher = kb.utils.wrappedEventWatcher(this, new kb.EventWatcher(model, this, {1113      emitter: this.model1114    }));1115    if (options.requires && _.isArray(options.requires)) {1116      keys = _.clone(options.requires);1117    }1118    if (this.__kb.internals) {1119      keys = keys ? _.union(keys, this.__kb.internals) : _.clone(this.__kb.internals);1120    }1121    if (options.keys) {1122      if (_.isArray(options.keys)) {1123        this.__kb.keys = options.keys;1124        keys = keys ? _.union(keys, options.keys) : _.clone(options.keys);1125      } else {1126        mapped_keys = {};1127        _ref = options.keys;1128        for (vm_key in _ref) {1129          mapping_info = _ref[vm_key];1130          mapped_keys[_.isString(mapping_info) ? mapping_info : (mapping_info.key ? mapping_info.key : vm_key)] = true;1131        }1132        this.__kb.keys = _.keys(mapped_keys);1133      }1134    } else {1135      bb_model = event_watcher.emitter();1136      if (bb_model && bb_model.attributes) {1137        attribute_keys = _.keys(bb_model.attributes);1138        keys = keys ? _.union(keys, attribute_keys) : attribute_keys;1139      }1140    }1141    if (keys && this.__kb.excludes) {1142      keys = _.difference(keys, this.__kb.excludes);1143    }1144    if (_.isObject(options.keys) && !_.isArray(options.keys)) {1145      this._mapObservables(model, options.keys);1146    }1147    if (_.isObject(options.requires) && !_.isArray(options.requires)) {1148      this._mapObservables(model, options.requires);1149    }1150    !options.mappings || this._mapObservables(model, options.mappings);1151    !keys || this._createObservables(model, keys);1152    !kb.statistics || kb.statistics.register('ViewModel', this);1153  }1154  ViewModel.prototype.destroy = function() {1155    var vm_key;1156    if (this.__kb.view_model !== this) {1157      for (vm_key in this.__kb.vm_keys) {1158        this.__kb.view_model[vm_key] = null;1159      }1160    }1161    this.__kb.view_model = null;1162    kb.releaseKeys(this);1163    kb.utils.wrappedDestroy(this);1164    return !kb.statistics || kb.statistics.unregister('ViewModel', this);1165  };1166  ViewModel.prototype.shareOptions = function() {1167    return {1168      store: kb.utils.wrappedStore(this),1169      factory: kb.utils.wrappedFactory(this)1170    };1171  };1172  ViewModel.prototype._createObservables = function(model, keys) {1173    var create_options, key, vm_key, _i, _len;1174    create_options = {1175      store: kb.utils.wrappedStore(this),1176      factory: kb.utils.wrappedFactory(this),1177      path: this.__kb.path,1178      event_watcher: kb.utils.wrappedEventWatcher(this)1179    };1180    for (_i = 0, _len = keys.length; _i < _len; _i++) {1181      key = keys[_i];1182      vm_key = this.__kb.internals && _.contains(this.__kb.internals, key) ? "_" + key : key;1183      if (this[vm_key]) {1184        continue;1185      }1186      this.__kb.vm_keys[vm_key] = true;1187      this.__kb.model_keys[key] = true;1188      create_options.key = key;1189      this[vm_key] = this.__kb.view_model[vm_key] = kb.observable(model, create_options, this);1190    }1191  };1192  ViewModel.prototype._mapObservables = function(model, mappings) {1193    var create_options, mapping_info, vm_key;1194    create_options = {1195      store: kb.utils.wrappedStore(this),1196      factory: kb.utils.wrappedFactory(this),1197      path: this.__kb.path,1198      event_watcher: kb.utils.wrappedEventWatcher(this)1199    };1200    for (vm_key in mappings) {1201      mapping_info = mappings[vm_key];1202      if (this[vm_key]) {1203        continue;1204      }1205      mapping_info = _.isString(mapping_info) ? {1206        key: mapping_info1207      } : _.clone(mapping_info);1208      mapping_info.key || (mapping_info.key = vm_key);1209      this.__kb.vm_keys[vm_key] = true;1210      this.__kb.model_keys[mapping_info.key] = true;1211      this[vm_key] = this.__kb.view_model[vm_key] = kb.observable(model, _.defaults(mapping_info, create_options), this);1212    }1213  };1214  return ViewModel;1215})();1216kb.viewModel = function(model, options, view_model) {1217  return new kb.ViewModel(model, options, view_model);1218};1219kb.observables = function(model, binding_info, view_model) {1220  _legacyWarning('kb.observables', '0.16.0', 'Please use kb.viewModel instead');1221  return new kb.ViewModel(model, binding_info, view_model);1222};1223/*1224  knockback-collection-observable.js1225  (c) 2011, 2012 Kevin Malakoff.1226  Knockback.CollectionObservable is freely distributable under the MIT license.1227  See the following for full license details:1228    https://github.com/kmalakoff/knockback/blob/master/LICENSE1229*/1230COMPARE_EQUAL = 0;1231COMPARE_ASCENDING = -1;1232COMPARE_DESCENDING = 1;1233kb.compare = function(value_a, value_b) {1234  if (_.isString(value_a)) {1235    return value_a.localeCompare(value_b);1236  }1237  if (_.isString(value_b)) {1238    return value_b.localeCompare(value_a);1239  }1240  if (typeof value_a !== "object") {1241    return (value_a === value_b ? COMPARE_EQUAL : (value_a < value_b ? COMPARE_ASCENDING : COMPARE_DESCENDING));1242  }1243  if (value_a === value_b) {1244    return COMPARE_EQUAL;1245  } else {1246    if (value_a < value_b) {1247      return COMPARE_ASCENDING;1248    } else {1249      return COMPARE_DESCENDING;1250    }1251  }1252};1253kb.CollectionObservable = (function() {1254  CollectionObservable.extend = Backbone.Model.extend;1255  function CollectionObservable(collection, options) {1256    var create_options, observable,1257      _this = this;1258    !collection || (collection instanceof Backbone.Collection) || _throwUnexpected(this, 'not a collection');1259    options || (options = {});1260    observable = kb.utils.wrappedObservable(this, ko.observableArray([]));1261    observable.__kb_is_co = true;1262    this.in_edit = 0;1263    this.__kb || (this.__kb = {});1264    this.__kb._onCollectionChange = _.bind(this._onCollectionChange, this);1265    options = collapseOptions(options);1266    if (options.sort_attribute) {1267      this._comparator = ko.observable(this._attributeComparator(options.sort_attribute));1268    } else {1269      if (options.sorted_index) {1270        _legacyWarning('sortedIndex no longer supported', '0.16.7', 'please use comparator instead');1271      }1272      this._comparator = ko.observable(options.comparator);1273    }1274    if (options.filters) {1275      this._filters = ko.observableArray(_.isArray(options.filters) ? options.filters : options.filters ? [options.filters] : void 0);1276    } else {1277      this._filters = ko.observableArray([]);1278    }1279    create_options = this.create_options = {1280      store: kb.Store.useOptionsOrCreate(options, collection, observable)1281    };1282    this.path = options.path;1283    create_options.factory = kb.utils.wrappedFactory(observable, this._shareOrCreateFactory(options));1284    create_options.path = kb.utils.pathJoin(options.path, 'models');1285    create_options.creator = create_options.factory.creatorForPath(null, create_options.path);1286    if (create_options.creator) {1287      this.models_only = create_options.creator.models_only;1288    }1289    observable.destroy = _.bind(this.destroy, this);1290    observable.shareOptions = _.bind(this.shareOptions, this);1291    observable.filters = _.bind(this.filters, this);1292    observable.comparator = _.bind(this.comparator, this);1293    observable.sortAttribute = _.bind(this.sortAttribute, this);1294    observable.viewModelByModel = _.bind(this.viewModelByModel, this);1295    observable.hasViewModels = _.bind(this.hasViewModels, this);1296    this._collection = ko.observable(collection);1297    observable.collection = this.collection = ko.dependentObservable({1298      read: function() {1299        return _this._collection();1300      },1301      write: function(new_collection) {1302        var previous_collection;1303        if ((previous_collection = _this._collection()) === new_collection) {1304          return;1305        }1306        if (previous_collection) {1307          previous_collection.unbind('all', _this.__kb._onCollectionChange);1308        }1309        if (new_collection) {1310          new_collection.bind('all', _this.__kb._onCollectionChange);1311        }1312        return _this._collection(new_collection);1313      }1314    });1315    if (collection) {1316      collection.bind('all', this.__kb._onCollectionChange);1317    }1318    this._mapper = ko.dependentObservable(function() {1319      var comparator, current_collection, filters, models, view_models;1320      comparator = _this._comparator();1321      filters = _this._filters();1322      current_collection = _this._collection();1323      if (_this.in_edit) {1324        return;1325      }1326      observable = kb.utils.wrappedObservable(_this);1327      if (current_collection) {1328        models = current_collection.models;1329      }1330      if (!models || (current_collection.models.length === 0)) {1331        view_models = [];1332      } else {1333        if (filters.length) {1334          models = _.filter(models, function(model) {1335            return !_this._modelIsFiltered(model);1336          });1337        }1338        if (comparator) {1339          view_models = _.map(models, function(model) {1340            return _this._createViewModel(model);1341          }).sort(comparator);1342        } else {1343          if (_this.models_only) {1344            view_models = filters.length ? models : models.slice();1345          } else {1346            view_models = _.map(models, function(model) {1347              return _this._createViewModel(model);1348            });1349          }1350        }1351      }1352      _this.in_edit++;1353      observable(view_models);1354      return _this.in_edit--;1355    });1356    observable.subscribe(_.bind(this._onObservableArrayChange, this));1357    !kb.statistics || kb.statistics.register('CollectionObservable', this);1358    return observable;1359  }1360  CollectionObservable.prototype.destroy = function() {1361    var array, collection, observable;1362    observable = kb.utils.wrappedObservable(this);1363    collection = this._collection();1364    if (collection) {1365      collection.unbind('all', this.__kb._onCollectionChange);1366      array = observable();1367      array.splice(0, array.length);1368    }1369    this._mapper.dispose();1370    this._mapper = null;1371    kb.release(this._filters);1372    this._comparator(null);1373    this.collection.dispose();1374    observable.collection = this.collection = null;1375    observable.collection = null;1376    kb.utils.wrappedDestroy(this);1377    return !kb.statistics || kb.statistics.unregister('CollectionObservable', this);1378  };1379  CollectionObservable.prototype.shareOptions = function() {1380    var observable;1381    observable = kb.utils.wrappedObservable(this);1382    return {1383      store: kb.utils.wrappedStore(observable),1384      factory: kb.utils.wrappedFactory(observable)1385    };1386  };1387  CollectionObservable.prototype.filters = function(filters) {1388    if (filters) {1389      return this._filters(_.isArray(filters) ? filters : [filters]);1390    } else {1391      return this._filters([]);1392    }1393  };1394  CollectionObservable.prototype.comparator = function(comparator) {1395    return this._comparator(comparator);1396  };1397  CollectionObservable.prototype.sortedIndex = function() {1398    return _legacyWarning('sortedIndex no longer supported', '0.16.7', 'please use comparator instead');1399  };1400  CollectionObservable.prototype.sortAttribute = function(sort_attribute) {1401    return this._comparator(sort_attribute ? this._attributeComparator(sort_attribute) : null);1402  };1403  CollectionObservable.prototype.viewModelByModel = function(model) {1404    var id_attribute;1405    if (this.models_only) {1406      return null;1407    }1408    id_attribute = model.hasOwnProperty(model.idAttribute) ? model.idAttribute : 'cid';1409    return _.find(kb.utils.wrappedObservable(this)(), function(test) {1410      return test.__kb.object[id_attribute] === model[id_attribute];1411    });1412  };1413  CollectionObservable.prototype.hasViewModels = function() {1414    return !this.models_only;1415  };1416  CollectionObservable.prototype._shareOrCreateFactory = function(options) {1417    var absolute_models_path, existing_creator, factories, factory;1418    absolute_models_path = kb.utils.pathJoin(options.path, 'models');1419    factories = options.factories;1420    if ((factory = options.factory)) {1421      if ((existing_creator = factory.creatorForPath(null, absolute_models_path)) && (!factories || (factories['models'] === existing_creator))) {1422        if (!factories) {1423          return factory;1424        }1425        if (factory.hasPathMappings(factories, options.path)) {1426          return factory;1427        }1428      }1429    }1430    factory = new kb.Factory(options.factory);1431    if (factories) {1432      factory.addPathMappings(factories, options.path);1433    }1434    if (!factory.creatorForPath(null, absolute_models_path)) {1435      if (options.hasOwnProperty('models_only')) {1436        if (options.models_only) {1437          factory.addPathMapping(absolute_models_path, {1438            models_only: true1439          });1440        } else {1441          factory.addPathMapping(absolute_models_path, kb.ViewModel);1442        }1443      } else if (options.view_model) {1444        factory.addPathMapping(absolute_models_path, options.view_model);1445      } else if (options.create) {1446        factory.addPathMapping(absolute_models_path, {1447          create: options.create1448        });1449      } else {1450        factory.addPathMapping(absolute_models_path, kb.ViewModel);1451      }1452    }1453    return factory;1454  };1455  CollectionObservable.prototype._onCollectionChange = function(event, arg) {1456    var collection, comparator, observable, view_model;1457    if (this.in_edit) {1458      return;1459    }1460    switch (event) {1461      case 'reset':1462      case 'resort':1463        this._collection.notifySubscribers(this._collection());1464        break;1465      case 'new':1466      case 'add':1467        if (this._modelIsFiltered(arg)) {1468          return;1469        }1470        observable = kb.utils.wrappedObservable(this);1471        collection = this._collection();1472        if ((view_model = this.viewModelByModel(arg))) {1473          return;1474        }1475        view_model = this._createViewModel(arg);1476        this.in_edit++;1477        if ((comparator = this._comparator())) {1478          observable().push(view_model);1479          observable.sort(comparator);1480        } else {1481          observable.splice(collection.indexOf(arg), 0, view_model);1482        }1483        this.in_edit--;1484        break;1485      case 'remove':1486      case 'destroy':1487        this._onModelRemove(arg);1488        break;1489      case 'change':1490        if (this._modelIsFiltered(arg)) {1491          this._onModelRemove(arg);1492        } else {1493          view_model = this.viewModelByModel(arg);1494          if (view_model) {1495            if ((comparator = this._comparator())) {1496              observable = kb.utils.wrappedObservable(this);1497              this.in_edit++;1498              observable.sort(comparator);1499              this.in_edit--;1500            }1501          } else {1502            this._onCollectionChange('add', arg);1503          }1504        }1505    }1506  };1507  CollectionObservable.prototype._onModelRemove = function(model) {1508    var observable, view_model;1509    view_model = this.models_only ? model : this.viewModelByModel(model);1510    if (!view_model) {1511      return;1512    }1513    observable = kb.utils.wrappedObservable(this);1514    this.in_edit++;1515    observable.remove(view_model);1516    return this.in_edit--;1517  };1518  CollectionObservable.prototype._onObservableArrayChange = function(models_or_view_models) {1519    var collection, has_filters, model, models, observable, view_model, view_models, _i, _len,1520      _this = this;1521    if (this.in_edit) {1522      return;1523    }1524    (this.models_only && (!models_or_view_models.length || kb.utils.hasModelSignature(models_or_view_models[0]))) || (!this.models_only && (!models_or_view_models.length || (_.isObject(models_or_view_models[0]) && !kb.utils.hasModelSignature(models_or_view_models[0])))) || _throwUnexpected(this, 'incorrect type passed');1525    observable = kb.utils.wrappedObservable(this);1526    collection = this._collection();1527    has_filters = this._filters().length;1528    if (!collection) {1529      return;1530    }1531    view_models = models_or_view_models;1532    if (this.models_only) {1533      if (has_filters) {1534        models = _.filter(models_or_view_models, function(model) {1535          return !_this._modelIsFiltered(model);1536        });1537      }1538    } else {1539      !has_filters || (view_models = []);1540      models = [];1541      for (_i = 0, _len = models_or_view_models.length; _i < _len; _i++) {1542        view_model = models_or_view_models[_i];1543        model = kb.utils.wrappedObject(view_model);1544        if (has_filters) {1545          if (this._modelIsFiltered(model)) {1546            continue;1547          }1548          view_models.push(view_model);1549        }1550        this.create_options.store.findOrReplace(model, this.create_options.creator, view_model);1551        models.push(model);1552      }1553    }1554    this.in_edit++;1555    (models_or_view_models.length === view_models.length) || observable(view_models);1556    _.isEqual(collection.models, models) || collection.reset(models);1557    this.in_edit--;1558  };1559  CollectionObservable.prototype._attributeComparator = function(sort_attribute) {1560    var modelAttributeCompare;1561    modelAttributeCompare = function(model_a, model_b) {1562      var attribute_name;1563      attribute_name = _unwrapObservable(sort_attribute);1564      return kb.compare(model_a.get(attribute_name), model_b.get(attribute_name));1565    };1566    return (this.models_only ? modelAttributeCompare : function(model_a, model_b) {1567      return modelAttributeCompare(kb.utils.wrappedModel(model_a), kb.utils.wrappedModel(model_b));1568    });1569  };1570  CollectionObservable.prototype._createViewModel = function(model) {1571    if (this.models_only) {1572      return model;1573    } else {1574      return this.create_options.store.findOrCreate(model, this.create_options);1575    }1576  };1577  CollectionObservable.prototype._modelIsFiltered = function(model) {1578    var filter, filters, _i, _len;1579    filters = this._filters();1580    for (_i = 0, _len = filters.length; _i < _len; _i++) {1581      filter = filters[_i];1582      filter = _unwrapObservable(filter);1583      if (((typeof filter === 'function') && filter(model)) || (model && (model.id === filter))) {1584        return true;1585      }1586    }1587    return false;1588  };1589  return CollectionObservable;1590})();1591kb.collectionObservable = function(collection, options) {1592  return new kb.CollectionObservable(collection, options);1593};1594/*1595  knockback-inject.js1596  (c) 2011, 2012 Kevin Malakoff.1597  Knockback.Inject is freely distributable under the MIT license.1598  See the following for full license details:1599    https://github.com/kmalakoff/knockback/blob/master/LICENSE1600*/1601ko.bindingHandlers['inject'] = {1602  'init': function(element, value_accessor, all_bindings_accessor, view_model) {1603    return kb.Inject.inject(_unwrapObservable(value_accessor()), view_model, element, value_accessor, all_bindings_accessor);1604  }1605};1606kb.Inject = (function() {1607  function Inject() {}1608  Inject.inject = function(data, view_model, element, value_accessor, all_bindings_accessor, nested) {1609    var inject, result, wrapper;1610    inject = function(data) {1611      var key, target, value;1612      if (_.isFunction(data)) {1613        view_model = new data(view_model, element, value_accessor, all_bindings_accessor);1614        kb.releaseOnNodeRemove(view_model, element);1615      } else {1616        if (data.view_model) {1617          view_model = new data.view_model(view_model, element, value_accessor, all_bindings_accessor);1618          kb.releaseOnNodeRemove(view_model, element);1619        }1620        for (key in data) {1621          value = data[key];1622          if (key === 'view_model') {1623            continue;1624          }1625          if (key === 'create') {1626            value(view_model, element, value_accessor, all_bindings_accessor);1627          } else if (_.isObject(value) && !_.isFunction(value)) {1628            target = nested || (value && value.create) ? {} : view_model;1629            view_model[key] = kb.Inject.inject(value, target, element, value_accessor, all_bindings_accessor, true);1630          } else {1631            view_model[key] = value;1632          }1633        }1634      }1635      return view_model;1636    };1637    if (nested) {1638      return inject(data);1639    } else {1640      result = (wrapper = ko.dependentObservable(function() {1641        return inject(data);1642      }))();1643      wrapper.dispose();1644      return result;1645    }1646  };1647  Inject.injectViewModels = function(root) {1648    var afterBinding, app, beforeBinding, data, expression, findElements, options, results, _i, _len;1649    results = [];1650    findElements = function(el) {1651      var attr, child_el, _i, _len, _ref;1652      if (!el.__kb_injected) {1653        if (el.attributes && (attr = _.find(el.attributes, function(attr) {1654          return attr.name === 'kb-inject';1655        }))) {1656          el.__kb_injected = true;1657          results.push({1658            el: el,1659            view_model: {},1660            binding: attr.value1661          });1662        }1663      }1664      _ref = el.childNodes;1665      for (_i = 0, _len = _ref.length; _i < _len; _i++) {1666        child_el = _ref[_i];1667        findElements(child_el);1668      }1669    };1670    findElements(root || document);1671    for (_i = 0, _len = results.length; _i < _len; _i++) {1672      app = results[_i];1673      if (expression = app.binding) {1674        (expression.search(/[:]/) < 0) || (expression = "{" + expression + "}");1675        data = (new Function("", "return ( " + expression + " )"))();1676        data || (data = {});1677        (!data.options) || (options = data.options, delete data.options);1678        options || (options = {});1679        app.view_model = kb.Inject.inject(data, app.view_model, app.el, null, null, true);1680        afterBinding = app.view_model.afterBinding || options.afterBinding;1681        beforeBinding = app.view_model.beforeBinding || options.beforeBinding;1682      }1683      if (beforeBinding) {1684        beforeBinding(app.view_model, app.el, options);1685      }1686      kb.applyBindings(app.view_model, app.el, options);1687      if (afterBinding) {1688        afterBinding(app.view_model, app.el, options);1689      }1690    }1691    return results;1692  };1693  return Inject;1694})();1695kb.injectViewModels = kb.Inject.injectViewModels;1696if (this.$) {1697  this.$(function() {1698    return kb.injectViewModels();1699  });1700} else {1701  (onReady = function() {1702    if (document.readyState !== "complete") {1703      return setTimeout(onReady, 0);1704    }1705    return kb.injectViewModels();1706  })();1707}1708; return kb;});...step1.js
Source:step1.js  
1import React, { Component } from 'react';2import {CardBody, Col, Row, FormGroup, Label, Input, TabPane, TabContent, Button } from 'reactstrap';3import Select from 'react-select';4class Step1 extends Component {5    constructor(props) {6        super(props);7        this.state = {8            noRegisterFaskesKb: null,9            hidden_noRegisterFaskesKb: false,10            noJaringanJejaring: null,11            jenisFaskesKb: [12                {value: '1', label: 'STATIS'},13                {value: '2', label: 'BERGERAK'},14            ],15            select1: null,16            show_jenisFaskesKb: [],17            hidden_jenisFaskesKb: true,18            tingkatFaskesKb : [19                {value: '11', label: 'FKRTL', kd_jenisFaskesKb: '1' },20                {value: '12', label: 'FKTP', kd_jenisFaskesKb: '1' },21                {value: '13', label: 'JARINGAN', kd_jenisFaskesKb: '2' },22                {value: '14', label: 'JEJARING', kd_jenisFaskesKb: '2' },23                {value: '15', label: 'MUYAN', kd_jenisFaskesKb: '3'},24                {value: '16', label: 'KAPAL LAUT', kd_jenisFaskesKb: '3'},25            ],26            select2: null,27            show_tingkatFaskesKb: [],28            hidden_tingkatFaskesKb: true,29            tingkatPelayanan: [30                {value: '21', label: 'KLINIK UTAMA', kd_tingkatFaskesKb: '11' },31                {value: '22', label: 'RS UMUM', kd_tingkatFaskesKb: '11'},32                {value: '23', label: 'RS KHUSUS', kd_tingkatFaskesKb: '11'},33                {value: '24', label: 'PUSKESMAS', kd_tingkatFaskesKb: '12'},34                {value: '25', label: 'PRAKTIK DOKTER', kd_tingkatFaskesKb: '12'},35                {value: '26', label: 'KLINIK PRATAMA', kd_tingkatFaskesKb: '12'},36                {value: '27', label: 'RS TIPE D PRATAMA', kd_tingkatFaskesKb: '12'},37                {value: '28', label: 'PUSTU', kd_tingkatFaskesKb: '13'},38                {value: '29', label: 'PUSLING', kd_tingkatFaskesKb: '13'},39                {value: '30', label: 'POSKESDES/POLINDES', kd_tingkatFaskesKb: '13'},40                {value: '31', label: 'PRAKTEK BIDAN', kd_tingkatFaskesKb: '14'},41            ],42            select3: null,43            show_tingkatPelayanan: [],44            hidden_tingkatPelayanan: true,45            select4: null,46            statusKepemilikan : [],47            hidden_statusKepemilikan: true,48            show_kbPerusahaan: [{ value: 'ya', label: 'Ya' }, { value: 'tidak', label: 'TIDAK' },],49            kbPerusahaan: null,50            hidden_kbPerusahaan: true,51            show_pkbrs: [{ value: 'ya', label: 'Ya' },{ value: 'tidak', label: 'TIDAK' },],52            pkbrs: null,53            hidden_pkbrs: true,54            kerjasamaBpjs: [{ value: 'ya', label: 'Ya' },{ value: 'tidak', label: 'TIDAK' },],55            kerjasamaBpjsLsngTdk: [],56            selKerjasamaBpjs: true,57            valKerjasamaBpjs: null,58            selKerjasamaBpjsLsngTdk: true,59            valKerjasamaBpjsLsngTdk: null,60            activeTab: '',61            62        }63    }64    65    // input nomor faskes kb66    inputFaskeskb = (e) => {67        if(e.target.value){68            e.target.value = Math.max(0, parseInt(e.target.value) ).toString().slice(0,3)69            this.setState({70                noRegisterFaskesKb: e.target.value,71                show_jenisFaskesKb: this.state.jenisFaskesKb.filter(item => item.value === '1'),72                hidden_jenisFaskesKb: false, select1: null, select2: null, select3: null, select4: null,73                show_tingkatFaskesKb: [], show_tingkatPelayanan: [], statusKepemilikan : [],74                hidden_tingkatFaskesKb: true, hidden_tingkatPelayanan: true, hidden_statusKepemilikan: true,75                kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: null, 76                valKerjasamaBpjsLsngTdk: null, selKerjasamaBpjs: true, activeTab: ''77            })78        }79        else{80            this.setState({81                show_jenisFaskesKb: [], select1: null, hidden_jenisFaskesKb: true, 82                show_tingkatFaskesKb: [], select2: null, hidden_tingkatFaskesKb: true,83                show_tingkatPelayanan: [], select3: null, hidden_tingkatPelayanan: true,84                select4: null, statusKepemilikan : [], hidden_statusKepemilikan: true, kbPerusahaan: null, pkbrs: null,85                kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: null, 86                valKerjasamaBpjsLsngTdk: null, selKerjasamaBpjs: true, activeTab: ''87            })88        }89    }90    91    // input jaringan jejaring92    JaringanJejaring = (e) => {93        if(e.target.value){94            e.target.value = Math.max(0, parseInt(e.target.value) ).toString().slice(0,2)95            this.setState({96                hidden_noRegisterFaskesKb: true,97                noJaringanJejaring: e.target.value,98                show_jenisFaskesKb: this.state.jenisFaskesKb.filter(item => item.value === '1'),99                hidden_jenisFaskesKb: false, select1: null, select2: null, select3: null, select4: null,100                show_tingkatFaskesKb: [], show_tingkatPelayanan: [], statusKepemilikan : [],101                hidden_tingkatFaskesKb: true, hidden_tingkatPelayanan: true, hidden_statusKepemilikan: true,102                kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: null, 103                valKerjasamaBpjsLsngTdk: null, selKerjasamaBpjs: true, activeTab: ''104            })105        }106        else {107            this.setState({108                hidden_noRegisterFaskesKb: false, noJaringanJejaring: null,109                select1: null, show_tingkatFaskesKb: [], select2: null, hidden_tingkatFaskesKb: true,110                show_tingkatPelayanan: [], statusKepemilikan : [], select3: null, hidden_tingkatPelayanan: true, select4: null,111                hidden_statusKepemilikan: true, kbPerusahaan: null, pkbrs: null,112                kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: null, 113                valKerjasamaBpjsLsngTdk: null, selKerjasamaBpjs: true, activeTab: ''114                 115 116            })117        }118    }119    // Jenis Faskes KB120    changeSel1 = (e) => {121        if(e){122            if(this.state.noRegisterFaskesKb){123                if(this.state.noJaringanJejaring){124                    this.setState({125                        show_tingkatFaskesKb: this.state.tingkatFaskesKb.filter(item => item.kd_jenisFaskesKb === '2'),126                        hidden_tingkatFaskesKb: false, hidden_tingkatPelayanan: true, select1: e, select2: null, select3: null127                    })128                }129                else {130                    this.setState({131                        show_tingkatFaskesKb: this.state.tingkatFaskesKb.filter(item => item.kd_jenisFaskesKb === '1'),132                        hidden_tingkatFaskesKb: false, hidden_tingkatPelayanan: true, select1: e, select2: null, select3: null133                    })134                }135            }136            137        } else {138            this.setState({139                show_tingkatFaskesKb: [], hidden_tingkatFaskesKb: true, hidden_tingkatPelayanan: true, select1: null, select2: null, select3: null,140                select4: null, hidden_statusKepemilikan: true, kbPerusahaan: null, pkbrs: null,141                kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: null, 142                valKerjasamaBpjsLsngTdk: null, selKerjasamaBpjs: true, activeTab: '', hidden_pkbrs: true, hidden_kbPerusahaan: true,143            })144        }145    }146    // Jenis tinggkat faskes kb147    changeSel2 = (e) => {148        if (e) {149            if(e.kd_jenisFaskesKb === '1' || e.kd_jenisFaskesKb === '2'){150                this.setState({151                    show_tingkatPelayanan: this.state.tingkatPelayanan.filter(item => item.kd_tingkatFaskesKb === e.value),152                    hidden_tingkatPelayanan: false, select2: e, select3: null153                })154            } else {155                this.setState({156                    show_tingkatPelayanan: [], select2: e, select3: null, select4: null, hidden_statusKepemilikan: true,157                    kbPerusahaan: null, pkbrs: null, 158                })   159            }160        }161        else {162            this.setState({163                show_tingkatPelayanan: [], select2: null, hidden_tingkatPelayanan: true, select3: null, select4: null, 164                hidden_statusKepemilikan: true, kbPerusahaan: null, pkbrs: null,165                kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: null, 166                valKerjasamaBpjsLsngTdk: null, selKerjasamaBpjs: true, activeTab: '', hidden_pkbrs: true, hidden_kbPerusahaan: true,167            })168        }169    }170    // Jenis tingkat pelayan171    changeSel3 = (e) => {172        if(e){173            if(e.value === '21'){174                this.setState({175                    statusKepemilikan: [{value: '', label: 'BUMN/BUMD'}, {value: '', label: 'SWASTA'},{value: '', label: 'LSOM'},],176                    select3: e,  hidden_statusKepemilikan: false, 177                })178            }179            else if(e.value === '22' || e.value === '23'){180                this.setState({181                    statusKepemilikan: [{value: '', label: 'KEMENKES PUSAT'}, {value: '', label: 'DINKES PROVINSI'},182                                        {value: '', label: 'DINKES KAB/KOTA'}, {value: '', label: 'TNI'}, {value: '', label: 'POLRI'},183                                        {value: '', label: 'BUMN/BUMD'}, {value: '', label: 'SWASTA'}, {value: '', label: 'LSOM'},],184                    select3: e, hidden_statusKepemilikan: false, 185                })186            }187            else if (e.value === '24') {188                this.setState({189                    statusKepemilikan: [{value: '', label: 'DINKES KABUPATEN/KOTA'}], select3: e, hidden_statusKepemilikan: false,190                })191            }192            else if (e.value === '25'){193                this.setState({194                    statusKepemilikan: [{value: '', label: 'SWASTA'}], select3: e, hidden_statusKepemilikan: false,195                })196            }197            else if (e.value === '26'){198                this.setState({199                    statusKepemilikan: [{value: '', label: 'KEMENKES PUSAT'}, {value: '', label: 'DINKES PROVINSI'}, 200                                        {value: '', label: 'DINKES KAB/KOTA'},{value: '', label: 'TNI'}, {value: '', label: 'POLRI'}, 201                                        {value: '', label: 'BUMN/BUMD'}, {value: '', label: 'SWASTA'}, {value: '', label: 'LSOM'},],202                    select3: e, hidden_statusKepemilikan: false,203                })204                205            }206            else if (e.value === '27'){207                this.setState({208                    statusKepemilikan: [{value: '', label: 'KEMENKES PUSAT'}, {value: '', label: 'DINKES PROVINSI'}, 209                                        {value: '', label: 'DINKES KAB/KOTA'},{value: '', label: 'TNI'}, {value: '', label: 'POLRI'}, 210                                        {value: '', label: 'BUMN/BUMD'}, {value: '', label: 'SWASTA'}, {value: '', label: 'LSOM'},],211                    select3: e, hidden_statusKepemilikan: false,212                })213            }214            else if (e.value === '28' || e.value === '29' || e.value === '30') {215                this.setState({216                    statusKepemilikan: [{value: '', label: 'DINKES KAB/KOTA'}], select3: e, hidden_statusKepemilikan: false,217                })218            }219            else if (e.value === '31') {220                this.setState({221                    statusKepemilikan: [{value: '', label: 'SWASTA'}], select3: e, hidden_statusKepemilikan: false,222                })223            }224        }225        else {226            this.setState({227                statusKepemilikan: [], select3: null, select4: null, hidden_statusKepemilikan: true, kbPerusahaan: null, pkbrs: null,228                kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: null, 229                valKerjasamaBpjsLsngTdk: null, selKerjasamaBpjs: true, activeTab: '', hidden_pkbrs: true, hidden_kbPerusahaan: true,230            })231        }232    }233    changeSel4 = (e) => {234        if(e){235            if(this.state.select3.value === '21'){236                this.setState({237                    select4: e, kbPerusahaan: [{ value: 'tidak', label: 'TIDAK' }], pkbrs: [{ value: 'tidak', label: 'TIDAK' }],238                    selKerjasamaBpjs: false239                })240            }241            else if (this.state.select3.value === '22' || this.state.select3.value === '23'){242                this.setState({243                    select4: e, 244                    kbPerusahaan: [{ value: 'tidak', label: 'TIDAK' }], 245                    // pkbrs: [{ value: 'ya', label: 'Ya' }],246                    hidden_pkbrs: false,247                    // selKerjasamaBpjs: false248                })249            }250            else if(this.state.select3.value === '24'){251                this.setState({252                    select4: e, kbPerusahaan: [{ value: 'tidak', label: 'TIDAK' }], pkbrs: [{ value: 'tidak', label: 'TIDAK' }],253                    selKerjasamaBpjs: false254                })255            }256            else if(this.state.select3.value === '25'){257                this.setState({258                    select4: e, kbPerusahaan: [{ value: 'tidak', label: 'TIDAK' }], pkbrs: [{ value: 'tidak', label: 'TIDAK' }],259                    selKerjasamaBpjs: false260                })261            }262            else if(this.state.select3.value === '26'){263                // if(e.label === 'KEMENKES PUSAT' || e.label === 'DINKES PROVINSI' || e.label === 'DINKES KAB/KOTA' || e.label === 'TNI' || e.label === 'POLRI'){264                    this.setState({265                        select4: e, 266                        // kbPerusahaan: [{ value: 'tidak', label: 'TIDAK' }], 267                        pkbrs: [{ value: 'tidak', label: 'TIDAK' }],268                        hidden_kbPerusahaan: false,269                    })270                // }271                // else if(e.label === 'BUMN/BUMD' || e.label === 'SWASTA' || e.label === 'LSOM'){272                //     this.setState({273                //         select4: e, kbPerusahaan: [{ value: 'ya', label: 'Ya' }], pkbrs: [{ value: 'tidak', label: 'TIDAK' }],274                //         selKerjasamaBpjs: false275                //     })276                // }277            }278            else if(this.state.select3.value === '27'){279                this.setState({280                    select4: e, 281                    kbPerusahaan: [{ value: 'tidak', label: 'TIDAK' }], 282                    // pkbrs: [{ value: 'ya', label: 'Ya' }],283                    hidden_pkbrs: false,284                })285            } 286            else if(this.state.select3.value === '28' || this.state.select3.value === '29' || this.state.select3.value === '30') {287                this.setState({288                    select4: e, kbPerusahaan: [{ value: 'tidak', label: 'TIDAK' }], pkbrs: [{ value: 'tidak', label: 'TIDAK' }],289                    selKerjasamaBpjs: false290                })291            }292            else if(this.state.select3.value === '31'){293                this.setState({294                    select4: e, kbPerusahaan: [{ value: 'tidak', label: 'TIDAK' }], pkbrs: [{ value: 'tidak', label: 'TIDAK' }],295                    selKerjasamaBpjs: false296                })297            }298        }299        else {300            this.setState({301                select4: null, kbPerusahaan: null, pkbrs: null, 302                kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: null, 303                valKerjasamaBpjsLsngTdk: null, selKerjasamaBpjs: true, hidden_pkbrs: true, hidden_kbPerusahaan: true, activeTab: ''304            })305        }306    }307    // selKerjasamaBpjs: true,308    // selKerjasamaBpjsLsngTdk: true,309    changeKbPerusahaan = (e) => {310        if(e){311            if(this.state.select3.value === '26'){312                this.setState({313                    kbPerusahaan: e, selKerjasamaBpjs: false314                })315            }316        }317        else {318            this.setState({319                kbPerusahaan: [], selKerjasamaBpjs: true320            })321        }322    }323    changeSelPkbrs = (e) => {324        if(e){325            if(this.state.select3.value === '22' || this.state.select3.value === '23') {326                this.setState({327                    pkbrs: e, selKerjasamaBpjs: false328                })329            }330            else if(this.state.select3.value === '27') {331                this.setState({332                    pkbrs: e, selKerjasamaBpjs: false333                })334            }335        }336        else{337            this.setState({338                pkbrs: [], selKerjasamaBpjs: true, selKerjasamaBpjsLsngTdk: true, kerjasamaBpjsLsngTdk: [],339                valKerjasamaBpjs: null, valKerjasamaBpjsLsngTdk: null, activeTab: ''340            })341        }342        console.log(e)343    }344    option4 = (e) => {345        // console.log(e.value)346        if(e){347            if(e.value === 'ya'){348                if(this.state.noJaringanJejaring){349                    this.setState({350                        kerjasamaBpjsLsngTdk: [{ value: 'tidak_langsung', label: 'Tidak Langsung' }], selKerjasamaBpjsLsngTdk: false, valKerjasamaBpjs: e351                    })352                }353                else if (this.state.noRegisterFaskesKb) {354                    this.setState({355                        kerjasamaBpjsLsngTdk: [{ value: 'langsung', label: 'Langsung' }], selKerjasamaBpjsLsngTdk: false, valKerjasamaBpjs: e356                    })357                }358            }359            else if(e.value === 'tidak') {360                this.setState({361                    kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: e, valKerjasamaBpjsLsngTdk: null, activeTab: ''362                })363            }364        }365        else{366            this.setState({367                kerjasamaBpjsLsngTdk: [], selKerjasamaBpjsLsngTdk: true, valKerjasamaBpjs: null, valKerjasamaBpjsLsngTdk: null, activeTab: ''368            })369        }370    }371    option5 = (e) => {372        if (e === null){373            this.setState({374                activeTab: '', valKerjasamaBpjsLsngTdk: null375            })376        } else if (e.value === 'langsung'){377            this.setState({378                activeTab: '1', valKerjasamaBpjsLsngTdk: e379            })380        } else if (e.value === 'tidak_langsung'){381            this.setState({382                activeTab: '2', valKerjasamaBpjsLsngTdk: e383            })384        }385    }386    render() {387        return (388            <div>389                <Row>390                    <Col sm="12">391                        <Row>392                            <Col md="3"></Col>393                            394                            <Col md="6" style={{ textAlign: 'center' }}>395                            <CardBody>396                                <h6>KARTU PENDAFTARAN TEMPAT PELAYANAN KB</h6>397                                <Row>398                                    <Col md="3" xs="6" style={{ textAlign: 'center' }} >399                                        <Row>400                                            <Input style={{ marginRight: '5px', textAlign: 'center' }} type="read-only" id="text-input" name="text-input" value={this.props.kd_prov} disabled/>401                                        </Row>402                                        <Row >403                                            <Col md="12" style={{ textAlign: 'center' }}>404                                                <Label>Kode Provinsi</Label>405                                            </Col>406                                        </Row>407                                    </Col>408                                    <Col md="3" xs="6">409                                        <Row>410                                            <Input style={{ marginRight: '5px', textAlign: 'center' }} type="read-only" id="text-input" name="text-input" value={this.props.kd_kab} disabled/>411                                        </Row>412                                        <Row>413                                            <Col md="12" style={{ textAlign: 'center' }}>414                                                <Label>Kode Kabupaten/Kota</Label>415                                            </Col>416                                        </Row>417                                    </Col>418                                    <Col md="3" xs="6">419                                        <Row>420                                            <Input type="number" 421                                            // onInput = {(e) =>{422                                            //     e.target.value = Math.max(0, parseInt(e.target.value) ).toString().slice(0,3)423                                            // }}424                                            onInput={this.inputFaskeskb}425                                            disabled={this.state.hidden_noRegisterFaskesKb}426                                            style={{ marginRight: '5px', textAlign: 'center' }} id="text-input" name="text-input" />427                                        </Row>428                                        <Row>429                                            <Col md="12" style={{ textAlign: 'center' }}>430                                                <Label>No. Register Faskes KB</Label>431                                            </Col>432                                        </Row>433                                    </Col>434                                    <Col md="3" xs="6">435                                        <Row>436                                            <Input type="number" 437                                            // onInput = {(e) =>{438                                            //     e.target.value = Math.max(0, parseInt(e.target.value) ).toString().slice(0,2)439                                            // }}440                                            onInput={this.JaringanJejaring}441                                            style={{ marginRight: '5px', textAlign: 'center' }} id="text-input" name="text-input"/>442                                        </Row>443                                        <Row>444                                            <Col md="12" style={{ textAlign: 'center' }}>445                                                <Label>No. Jaringan/Jejaring Faskes KB</Label>446                                            </Col>447                                        </Row>448                                    </Col>449                                </Row>450                            </CardBody>451                            </Col>452                            <Col md="3"></Col>453                        </Row>454                        <CardBody className="card-body-nopad">455                        <h6>I. Identitas </h6>456                        <div style={{position:'absolute', right: '20px', marginTop:'-30px', fontSize:'12px'}}>{this.props.currentStep}/{this.props.totalSteps}</div>457                            <FormGroup>458                                <Row>459                                    <Col md="4">460                                        <Label className="labelForm">1. Nama Tempat Pelayan KB</Label>461                                    </Col>462                                    <Col md="4">463                                        <Input type="text" id="text-input" name="text-input" />464                                    </Col>465                                </Row>466                                <Row>467                                    <Col md="12">468                                        <Label style={{ marginTop: '10px' }} className="labelForm">2. Alamat</Label>469                                        <Row>470                                            <Col md="4" xs="12" style={{ paddingTop: '10px' }}>471                                                <Label className="labelForm">a. Jalan :</Label>472                                            </Col>473                                            <Col md="4" style={{ paddingTop: '10px' }}>474                                                <Input type="text" id="text-input" name="text-input" />475                                            </Col>476                                            <Col md="2" xs="6" style={{ paddingTop: '10px' }}>477                                                <Row>478                                                    <Col md="3" xs="4"><Label className="labelForm">RT</Label></Col>479                                                    <Col md="9" xs="8"><Input type="read-only" id="text-input" name="text-input" value={this.props.rt} /></Col>480                                                </Row>481                                            </Col>482                                            <Col md="2" xs="6" style={{ paddingTop: '10px' }}>483                                                <Row>484                                                    <Col md="3" xs="4"><Label className="labelForm">RW</Label></Col>485                                                    <Col md="9" xs="8"><Input type="read-only" id="text-input" name="text-input" value={this.props.rw} /></Col>486                                                </Row>487                                            </Col>488                                        </Row>489                                        <Row>490                                            <Col md="4" style={{marginTop:'10px'}}>491                                                <Label>b. Desa/Kelurahan :</Label>492                                            </Col>493                                            <Col md="7" xs="9" style={{marginTop:'10px'}}>494                                                <Input type="text" id="text-input" name="text-input" value={this.props.desa} />495                                            </Col>496                                            <Col md="1" xs="3" style={{marginTop:'10px'}}>497                                                <Input type="text" id="text-input" name="text-input" value={this.props.kd_des} />498                                            </Col>499                                        </Row>500                                        <Row>501                                            <Col md="4" style={{marginTop:'10px'}}>502                                                <Label>c. Kecamatan :</Label>503                                            </Col>504                                            <Col md="7" xs="9" style={{marginTop:'10px'}}>505                                                <Input type="text" id="text-input" name="text-input" value={this.props.kecamatan} />506                                            </Col>507                                            <Col md="1" xs="3" style={{marginTop:'10px'}}>508                                                <Input type="text" id="text-input" name="text-input" value={this.props.kd_kec} />509                                            </Col>510                                        </Row>511                                        <Row>512                                            <Col md="4" style={{marginTop:'10px'}}>513                                                <Label>d. Kabupaten :</Label>514                                            </Col>515                                            <Col md="7" xs="9" style={{marginTop:'10px'}}>516                                                <Input type="text" id="text-input" name="text-input" value={this.props.kabupaten} />517                                            </Col>518                                            <Col md="1" xs="3" style={{marginTop:'10px'}}>519                                                <Input type="text" id="text-input" name="text-input" value={this.props.kd_kab} />520                                            </Col>521                                        </Row>522                                        <Row>523                                            <Col md="4" style={{marginTop:'10px'}}>524                                                <Label>e. Provinsi :</Label>525                                            </Col>526                                            <Col md="7" xs="9" style={{marginTop:'10px'}}>527                                                <Input type="text" id="text-input" name="text-input" value={this.props.provinsi} />528                                            </Col>529                                            <Col md="1" xs="3" style={{marginTop:'10px'}}>530                                                <Input type="text" id="text-input" name="text-input" value={this.props.kd_prov} />531                                            </Col>532                                        </Row>533                                    </Col>534                                </Row>535                                <Row style={{ paddingTop: '20px' }}>536                                    <Col md="4" style={{ paddingTop: '10px' }}>537                                        <Label>3. Jenis</Label>538                                    </Col>539                                    <Col md="2" style={{ paddingTop: '10px' }}>540                                        <Select options={this.state.show_jenisFaskesKb} onChange={this.changeSel1} placeholder="Jenis Faskes KB" value={this.state.select1} isDisabled={this.state.hidden_jenisFaskesKb} isClearable />541                                    </Col>542                                    <Col md="2" style={{ paddingTop: '10px' }}>543                                        <Select options={this.state.show_tingkatFaskesKb} onChange={this.changeSel2} placeholder="Jenis Tingkat Faskes KB" value={this.state.select2} isDisabled={this.state.hidden_tingkatFaskesKb} isClearable />544                                    </Col>545                                    <Col md="2" style={{ paddingTop: '10px' }}>546                                        <Select options={this.state.show_tingkatPelayanan} onChange={this.changeSel3} placeholder="Jenis Tingkat Pelayanan" value={this.state.select3} isDisabled={this.state.hidden_tingkatPelayanan} isClearable />547                                    </Col>548                                </Row>549                                <Row style={{ marginTop: '15px' }}>550                                    <Col md='4' style={{ paddingTop: '10px' }}>551                                        <Label>4. Kepemilikan</Label>552                                    </Col>553                                    <Col md="2" style={{ paddingTop: '10px' }}>554                                        <Select options={this.state.statusKepemilikan} onChange={this.changeSel4} value={this.state.select4} isDisabled={this.state.hidden_statusKepemilikan} placeholder="Status Kepemilikan" isClearable />555                                    </Col>556                                </Row>557                                <Row style={{ marginTop: '15px' }}>558                                    <Col md='4' style={{ paddingTop: '10px' }}>559                                        <Label>5. Apakah faskes KB termasuk pada:</Label>560                                    </Col>561                                    <Col md="1" style={{ paddingTop: '10px' }}>562                                        <Label>KB Perusahaan</Label>563                                    </Col>564                                    <Col md="2" style={{ paddingTop: '10px' }}>565                                        <Select options={this.state.show_kbPerusahaan} isDisabled={this.state.hidden_kbPerusahaan} onChange={this.changeKbPerusahaan} value={this.state.kbPerusahaan} isClearable />566                                    </Col>567                                    <Col md="1" style={{ paddingTop: '10px' }}>568                                        <Label>PKBRS</Label>569                                    </Col>570                                    <Col md="2" style={{ paddingTop: '10px' }}>571                                        <Select options={this.state.show_pkbrs} isDisabled={this.state.hidden_pkbrs} onChange={this.changeSelPkbrs} value={this.state.pkbrs} isClearable />572                                    </Col>573                                </Row>574                                <Row style={{ marginTop: '15px' }}>575                                    <Col md="4" xs="12" style={{ paddingTop: '10px' }}>576                                        <Label>6. Kerjasama Dengan BPJS Kesehatan </Label>577                                        <Label style={{ paddingLeft: '10px'}}>(pilih Ya atau Tidak, jika Ya, maka pilih Langsung atau Tidak Langsung, selanjutnya isi No. PKS, masa berlaku PKS dan no. registernya pada BPJS Kesehatan)</Label>578                                    </Col>579                                    <Col md="2" xs="6" style={{ paddingTop: '10px' }}>580                                        <Select options={this.state.kerjasamaBpjs} isDisabled={this.state.selKerjasamaBpjs} value={this.state.valKerjasamaBpjs} onChange={this.option4} isClearable />    581                                    </Col>582                                    <Col md="2" xs="6" style={{ paddingTop: '10px' }}>583                                        <Select options={this.state.kerjasamaBpjsLsngTdk} isDisabled={this.state.selKerjasamaBpjsLsngTdk} value={this.state.valKerjasamaBpjsLsngTdk} onChange={this.option5} isClearable />    584                                    </Col>585                                </Row>586                                <TabContent style={{ border: 'none' }} activeTab={this.state.activeTab}>587                                    <TabPane tabId="1">588                                        <Row style={{ marginTop: '5px' }}>589                                            <Col md="4"></Col>590                                            <Col md="4">591                                                <Label>Langsung</Label>592                                                <Row style={{ marginTop: '15px' }}>593                                                    <Col md="4">594                                                        <Label>No. PKS : </Label>595                                                    </Col>596                                                    <Col md="5">597                                                        <Input type="text" id="text-input" name="text-input" />598                                                    </Col>599                                                </Row>600                                                <Row style={{ marginTop: '15px' }}>601                                                    <Col md="4">602                                                        <Label>Masa Berlaku Awal : </Label>603                                                    </Col>604                                                    <Col md="5">605                                                        <Input type="date" id="text-input" name="text-input" />606                                                    </Col>607                                                </Row>608                                                <Row style={{ marginTop: '15px' }}>609                                                    <Col md="4">610                                                        <Label>Masa Berlaku Akhir : </Label>611                                                    </Col>612                                                    <Col md="5">613                                                        <Input type="date" id="text-input" name="text-input" />614                                                    </Col>615                                                </Row>616                                                <Row style={{ marginTop: '15px' }}>617                                                    <Col md="4">618                                                        <Label>No. Register : </Label>619                                                    </Col>620                                                    <Col md="5">621                                                        <Input type="text" id="text-input" name="text-input" />622                                                    </Col>623                                                </Row>624                                            </Col>625                                        </Row>626                                    </TabPane>627                                    <TabPane tabId="2">628                                        <Row style={{ marginTop: '5px' }}>629                                            <Col md="4"></Col>630                                            <Col md="4">631                                                <Label>Tidak Langsung</Label>632                                                <Row style={{ marginTop: '15px' }}>633                                                    <Col md="4">634                                                        <Label>No. PKS : </Label>635                                                    </Col>636                                                    <Col md="5">637                                                        <Input type="text" id="text-input" name="text-input" />638                                                    </Col>639                                                </Row>640                                                <Row style={{ marginTop: '15px' }}>641                                                    <Col md="4">642                                                        <Label>Masa Berlaku Awal : </Label>643                                                    </Col>644                                                    <Col md="5">645                                                        <Input type="date" id="text-input" name="text-input" />646                                                    </Col>647                                                </Row>648                                                <Row style={{ marginTop: '15px' }}>649                                                    <Col md="4">650                                                        <Label>Masa Berlaku Akhir : </Label>651                                                    </Col>652                                                    <Col md="5">653                                                        <Input type="date" id="text-input" name="text-input" />654                                                    </Col>655                                                </Row>656                                            </Col>657                                        </Row>658                                    </TabPane>659                                </TabContent>660                            </FormGroup>661                        </CardBody>662                    </Col>663                </Row>664                <div style={{display:'flex', justifyContent:'space-between'}}>665                    <Button className="btn btn-warning" onClick={this.props.buttonBack}>Sebelumnya</Button>666                    <Button className="btn btn-info" onClick={this.props.nextStep}>Selanjutnya</Button>667                </div>668            </div>669        )670    }671}...routes.js
Source:routes.js  
1import React from 'react';2import CreatePPLKB from './views/Pages/dallap/sdm/pplkb/create';3const Dashboard = React.lazy(() => import('./views/Dashboard'));4const Icon = React.lazy(() => import('./views/Base/Icon'));5const Table = React.lazy(() => import('./views/Base/Table'));6// YAN KB PELKON7const Pendaftaran = React.lazy(() => import('./views/Pages/yankbpelkon/pendaftaran/index'));8const CreateYankbpelkon = React.lazy(() => import('./views/Pages/yankbpelkon/pendaftaran/create/create'));9const LihatYankbpelkon = React.lazy(() => import('./views/Pages/yankbpelkon/pendaftaran/lihat/lihat'));10const EditYankbpelkon = React.lazy(() => import('./views/Pages/yankbpelkon/pendaftaran/edit/edit'));11const RegistrasiYAN = React.lazy(() => import('./views/Pages/yankbpelkon/registrasi/index'));12const CreateRegistrasi = React.lazy(() => import('./views/Pages/yankbpelkon/registrasi/create/create'));13const EditRegistrasi = React.lazy(() => import('./views/Pages/yankbpelkon/registrasi/edit/edit'));14const LihatRegistrasi = React.lazy(() => import('./views/Pages/yankbpelkon/registrasi/lihat/lihat'));15const MutasiAlokon = React.lazy(() => import('./views/Pages/yankbpelkon/mutasiAlokon'));16const CreateMutasiAlokon = React.lazy(() => import('./views/Pages/yankbpelkon/mutasiAlokon/create/create'));17const EditMutasiAlokon = React.lazy(() => import('./views/Pages/yankbpelkon/mutasiAlokon/edit/edit'));18const LihatMutasiAlokon = React.lazy(() => import('./views/Pages/yankbpelkon/mutasiAlokon/lihat/lihat'));19// Dallap Laporan20const DallapLaporan = React.lazy(() => import('./views/Pages/dallap/report/index'))21const DetailDallap = React.lazy(() => import('./views/Pages/dallap/report/detail'))22const DetailDallapProvinsi = React.lazy(() => import('./views/Pages/dallap/report/provinsi'))23const DetailDallapKabupaten = React.lazy(() => import('./views/Pages/dallap/report/kabupaten'))24const BulanTable1 = React.lazy(() => import('./views/Pages/dallap/report/bulanTable1/detail'))25const BulanTable1Provinsi = React.lazy(() => import('./views/Pages/dallap/report/bulanTable1/provinsi'))26const BulanTable1Kabupaten = React.lazy(() => import('./views/Pages/dallap/report/bulanTable1/kabupaten'))27const BulanTable2 = React.lazy(() => import('./views/Pages/dallap/report/bulanTable2/detail'))28const BulanTable2Provinsi = React.lazy(() => import('./views/Pages/dallap/report/bulanTable2/provinsi'))29const BulanTable2Kabupaten = React.lazy(() => import('./views/Pages/dallap/report/bulanTable2/kabupaten'))30const BulanTable3 = React.lazy(() => import('./views/Pages/dallap/report/bulanTable3/detail'))31const BulanTable3Provinsi = React.lazy(() => import('./views/Pages/dallap/report/bulanTable3/provinsi'))32const BulanTable3Kabupaten = React.lazy(() => import('./views/Pages/dallap/report/bulanTable3/kabupaten'))33// YANKB Laporan34const YanKBLaporan = React.lazy(() => import('./views/Pages/yankbpelkon/report/index'))35const DetailYankb = React.lazy(() => import('./views/Pages/yankbpelkon/report/detail'))36const DetailYankbProvinsi = React.lazy(() => import('./views/Pages/yankbpelkon/report/provinsi'))37const DetailYankbKabupaten = React.lazy(() => import('./views/Pages/yankbpelkon/report/kabupaten'))38const BulanTable1YanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/bulanTable1/detail'))39const BulanTable1ProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/bulanTable1/provinsi'))40const BulanTable1KabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/bulanTable1/kabupaten'))41const BulanTable2YanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/bulanTable2/detail'))42const BulanTable2ProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/bulanTable2/provinsi'))43const BulanTable2KabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/bulanTable2/kabupaten'))44const BulanTable3YanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/bulanTable3/detail'))45const BulanTable3ProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/bulanTable3/provinsi'))46const BulanTable3KabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/bulanTable3/kabupaten'))47const TahunTable2YanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable2/detail'))48const TahunTable2ProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable2/provinsi'))49const TahunTable2KabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable2/kabupaten'))50const TahunTable3YanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable3/detail'))51const TahunTable3ProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable3/provinsi'))52const TahunTable3KabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable3/kabupaten'))53const TahunTable4YanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable4/detail'))54const TahunTable4ProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable4/provinsi'))55const TahunTable4KabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable4/kabupaten'))56const TahunTable4BYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable4B/detail'))57const TahunTable4BProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable4B/provinsi'))58const TahunTable4BKabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable4B/kabupaten'))59const TahunTable5AYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable5A/detail'))60const TahunTable5AProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable5A/provinsi'))61const TahunTable5AKabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable5A/kabupaten'))62const TahunTable5BYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable5B/detail'))63const TahunTable5BProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable5B/provinsi'))64const TahunTable5BKabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable5B/kabupaten'))65const TahunTable5CYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable5C/detail'))66const TahunTable5CProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable5C/provinsi'))67const TahunTable5CKabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable5C/kabupaten'))68const TahunTable8AYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable8A/detail'))69const TahunTable8AProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable8A/provinsi'))70const TahunTable8AKabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable8A/kabupaten'))71const TahunTable8BYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable8B/detail'))72const TahunTable8BProvinsiYanb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable8B/provinsi'))73const TahunTable8BKabupatenYanKb = React.lazy(() => import('./views/Pages/yankbpelkon/report/tahunTable8B/kabupaten'))74// Sumber Daya Manusia75const PPLKB = React.lazy(() => import('./views/Pages/dallap/sdm/pplkb'));76const PKB = React.lazy(() => import('./views/Pages/dallap/sdm/pkb/index'));77const CreatePKB = React.lazy(() => import('./views/Pages/dallap/sdm/pkb/create'));78const PPKBD = React.lazy(() => import('./views/Pages/dallap/sdm/ppkbd/index'));79const CreatePPKBD = React.lazy(() => import('./views/Pages/dallap/sdm/ppkbd/create'));80const SubPPKBD = React.lazy(() => import('./views/Pages/dallap/sdm/subPpkbd'));81const KelompokKB = React.lazy(() => import('./views/Pages/dallap/sdm/kelompokKb'));82const PUSDAK = React.lazy(() => import('./views/Pages/dallap/sdm/pusdak'));83// Sarana84const BPKB = React.lazy(() => import('./views/Pages/dallap/sarana/bpkb'));85const PendaftaranMPC = React.lazy(() => import('./views/Pages/dallap/sarana/mpc'));86const PendaftaranMUPEN = React.lazy(() => import('./views/Pages/dallap/sarana/mupen'));87const Penyuluhan = React.lazy(() => import('./views/Pages/dallap/sarana/penyuluhan'));88const RegistrasiMPC = React.lazy(() => import('./views/Pages/dallap/sarana/rog-mpc'));89const RegistrasiMUPEN = React.lazy(() => import('./views/Pages/dallap/sarana/rog-mupen'));90// Sarana91const KelompokBKB = React.lazy(() => import('./views/Pages/dallap/kelompok/kelompok_bkb'));92const RegisterBKB = React.lazy(() => import('./views/Pages/dallap/kelompok/register_bkb'));93// Administrasi94const Umfaskes = React.lazy(() => import('./views/Pages/administrasi/Umfaskes'));95// const MasterFormula = React.lazy(() => import('./views/Master/Formula/Formula'));96// const MasterUser = React.lazy(() => import('./views/Master/User/User'));97// const MasterMenu = React.lazy(() => import('./views/Master/Menu/Menu'));98// const Daily = React.lazy(() => import('./views/Transaction/Planning/Daily'));99// const Dds = React.lazy(() => import('./views/Transaction/Planning/Dds'));100// const SampleColor = React.lazy(() => import('./views/Transaction/Planning/SampleColor'));101// const Po = React.lazy(() => import('./views/Report/Po'));102// const Performance = React.lazy(() => import('./views/Report/Performance'));103// const Monthly = React.lazy(() => import('./views/Report/Monthly'));104// const Yearly = React.lazy(() => import('./views/Report/Yearly'));105// https://github.com/ReactTraining/react-router/tree/master/packages/react-router-config106const routes = [107    { path: '/beranda', exact: true, name: 'Beranda', component: Dashboard},108    // { path: '/beranda', name: 'Beranda', component: Dashboard },109    { path: '/icon', name: 'Icon', component: Icon },110    { path: '/table', name: 'Sample Table', component: Table },111    // { path: '/planning', exact: true, name: 'Planning', component: Daily },112    // { path: '/planning/dp', name: 'Distribution Plan', component: Daily },113    // { path: '/planning/dds', name: 'Daily Distribution Schedule', component: Dds },114    // { path: '/planning/samplecolor', name: 'Sample Color', component: SampleColor },115    // { path: '/report', exact: true, name: 'Report', component: Po },116    // { path: '/report/po', name: 'PO Completeness', component: Po },117    // { path: '/report/performance', name: 'Distribution Performance', component: Performance },118    // { path: '/report/monthly', name: 'Monthly View', component: Monthly },119    // { path: '/report/yearly', name: 'Yearly View', component: Yearly },120    // { path: '/master', exact: true, name: 'Master Data', component: MasterFormula },121    // { path: '/master/formula', name: 'Formula', component: MasterFormula },122    // { path: '/master/user', name: 'User', component: MasterUser },123    // { path: '/master/menu', name: 'Menu', component: MasterMenu },124    // { path: '/um', exact: true, name: 'User Management', component: MasterUser },125    // Start Router Project126    //YAN KB / PELKON127    { path: '/pendaftaran', exact: true, name: 'Pendaftaran Tempat Pelayanan KB', component: Pendaftaran },128    { path: '/pendaftaran/create', name: 'Tambah', component: CreateYankbpelkon },129    { path: '/pendaftaran/lihat', name: 'lihat', component: LihatYankbpelkon },130    { path: '/pendaftaran/edit', name: 'edit', component: EditYankbpelkon },131    { path: '/register', exact: true, name: 'Register Pelayanan KB', component: RegistrasiYAN },132    { path: '/register/create', name: 'Tambah', component: CreateRegistrasi },133    { path: '/register/edit', name: 'Edit', component: EditRegistrasi },134    { path: '/register/lihat', name: 'Lihat', component: LihatRegistrasi },135    { path: '/alokon', exact: true, name: 'Mutasi Alokon', component: MutasiAlokon },136    { path: '/alokon/create', name: 'Tambah', component: CreateMutasiAlokon },137    { path: '/alokon/edit', name: 'Edit', component: EditMutasiAlokon },138    { path: '/alokon/lihat', name: 'Lihat', component: LihatMutasiAlokon },139    //Sumber Daya Manusia140    { path: '/sdm', exact: true, name: 'Sumber Daya Manusia', component: PPLKB },141    { path: '/sdm/pplkb', exact: true, name: 'Pendaftaran PPLKB', component: PPLKB },142    { path: '/sdm/pplkb/create', name: 'Tambah', component: CreatePPLKB },143    { path: '/sdm/pkb', exact: true, name: 'Pendaftaran PKB/PLKB', component: PKB },144    { path: '/sdm/pkb/create', name: 'Tambah', component: CreatePKB },145    { path: '/sdm/ppkbd', exact: true, name: 'Pendaftaran PPKBD', component: PPKBD },146    { path: '/sdm/ppkbd/create', name: 'Tambah', component: CreatePPKBD },147    { path: '/sdm/subPpkbd', name: 'Pendaftaran Sub PPKBD', component: SubPPKBD },148    { path: '/sdm/kelompokKb', name: 'Pendaftaran Kelompok KB', component: KelompokKB },149    { path: '/sdm/pusdak', name: 'Register PUSDAK', component: PUSDAK },150    //Sarana151    { path: '/sarana', exact: true, name: 'SARANA', component: BPKB },152    { path: '/sarana/bpkb', name: 'Pendaftaran BP KB', component: BPKB },153    { path: '/sarana/penyuluhan', name: 'Register Kegiatan Penyuluhan', component: Penyuluhan },154    { path: '/sarana/mupen', name: 'Pendaftaran MUPEN', component: PendaftaranMUPEN },155    { path: '/sarana/mpc', name: 'Pendaftaran MPC', component: PendaftaranMPC },156    { path: '/sarana/rog-mupen', name: 'Register Operasional Gerak MUPEN', component: RegistrasiMUPEN },157    { path: '/sarana/rog-mpc', name: 'Register Operasional Gerak MPC', component: RegistrasiMPC },158    //Kelompok Kegiatan159    { path: '/kegiatan', exact: true, name: 'Kelompok Kegiatan', component: KelompokBKB },160    { path: '/kegiatan/kelompok_bkb', name: 'Kelompok BKB', component: KelompokBKB },161    { path: '/kegiatan/register_bkb', name: 'Register Kegiatan BKB', component: RegisterBKB },162    //Report163    { path: '/lap/dallap', exact: true, name: 'Laporan Dallap', component: DallapLaporan },164    { path: '/lap/DetailDallap', exact: true, name: 'Detail Laporan Dallap', component: DetailDallap },165    { path: '/lap/DetailDallap/provinsi', exact: true, name: 'Detail Laporan Provinsi', component: DetailDallapProvinsi },166    { path: '/lap/DetailDallap/kabupaten', exact: true, name: 'Detail Laporan Kabupaten', component: DetailDallapKabupaten },167    //DallapReport168    { path: '/lap/DetailDallap/table1', exact: true, name: 'Wilayah institusi KB di lapangan', component: BulanTable1 },169    { path: '/lap/DetailDallap/table1/provinsi', exact: true, name: '', component: BulanTable1Provinsi },170    { path: '/lap/DetailDallap/table1/kabupaten', exact: true, name: '', component: BulanTable1Kabupaten },171    { path: '/lap/DetailDallap/table2', exact: true, name: 'Frekuensi Operasional Mupen Provinsi', component: BulanTable2 },172    { path: '/lap/DetailDallap/table2/provinsi', exact: true, name: '', component: BulanTable2Provinsi },173    { path: '/lap/DetailDallap/table2/kabupaten', exact: true, name: '', component: BulanTable2Kabupaten },174    { path: '/lap/DetailDallap/table3', exact: true, name: 'Frekuensi Operasional Mupen Kab/Kota', component: BulanTable3 },175    { path: '/lap/DetailDallap/table3/provinsi', exact: true, name: '', component: BulanTable3Provinsi },176    { path: '/lap/DetailDallap/table3/kabupaten', exact: true, name: '', component: BulanTable3Kabupaten },177    //YankbReport178    { path: '/lap/DetailYankb/table1', exact: true, name: 'Cakupan tempat pelayanan KB', component: BulanTable1YanKb },179    { path: '/lap/DetailYankb/table1/provinsi', exact: true, name: '', component: BulanTable1ProvinsiYanb },180    { path: '/lap/DetailYankb/table1/kabupaten', exact: true, name: '', component: BulanTable1KabupatenYanKb },181    { path: '/lap/DetailYankb/bulan/table2', exact: true, name: 'Hasil Pelayanan KB Baru Dan Daftar Ulang', component: BulanTable2YanKb },182    { path: '/lap/DetailYankb/bulan/table2/provinsi', exact: true, name: '', component: BulanTable2ProvinsiYanb },183    { path: '/lap/DetailYankb/bulan/table2/kabupaten', exact: true, name: '', component: BulanTable2KabupatenYanKb },184    { path: '/lap/DetailYankb/bulan/table3', exact: true, name: 'Pencapaian Peserta KB Baru Berdasarkan Metode Kontrasepsi', component: BulanTable3YanKb },185    { path: '/lap/DetailYankb/bulan/table3/provinsi', exact: true, name: '', component: BulanTable3ProvinsiYanb },186    { path: '/lap/DetailYankb/bulan/table3/kabupaten', exact: true, name: '', component: BulanTable3KabupatenYanKb },187    { path: '/lap/DetailYankb/tahun/table2', exact: true, name: 'Tempat pelayanan KB Pemerintah', component: TahunTable2YanKb },188    { path: '/lap/DetailYankb/tahun/table2/provinsi', exact: true, name: '', component: TahunTable2ProvinsiYanb },189    { path: '/lap/DetailYankb/tahun/table2/kabupaten', exact: true, name: '', component: TahunTable2KabupatenYanKb },190    { path: '/lap/DetailYankb/tahun/table3', exact: true, name: 'Tempat pelayanan KB Swasta', component: TahunTable3YanKb },191    { path: '/lap/DetailYankb/tahun/table3/provinsi', exact: true, name: '', component: TahunTable3ProvinsiYanb },192    { path: '/lap/DetailYankb/tahun/table3/kabupaten', exact: true, name: '', component: TahunTable3KabupatenYanKb },193    { path: '/lap/DetailYankb/tahun/table4', exact: true, name: 'Tempat pelayanan KB Pemerintah Berdasarkan Kepemilikan', component: TahunTable4YanKb },194    { path: '/lap/DetailYankb/tahun/table4/provinsi', exact: true, name: '', component: TahunTable4ProvinsiYanb },195    { path: '/lap/DetailYankb/tahun/table4/kabupaten', exact: true, name: '', component: TahunTable4KabupatenYanKb },196    { path: '/lap/DetailYankb/tahun/table4B', exact: true, name: 'Tempat pelayanan KB Swasta Berdasarkan Kepemilikan', component: TahunTable4BYanKb },197    { path: '/lap/DetailYankb/tahun/table4B/provinsi', exact: true, name: '', component: TahunTable4BProvinsiYanb },198    { path: '/lap/DetailYankb/tahun/table4B/kabupaten', exact: true, name: '', component: TahunTable4BKabupatenYanKb },199    { path: '/lap/DetailYankb/tahun/table5A', exact: true, name: 'Tempat pelayanan KB Swasta Berdasarkan Kepemilikan', component: TahunTable5AYanKb },200    { path: '/lap/DetailYankb/tahun/table5A/provinsi', exact: true, name: '', component: TahunTable5AProvinsiYanb },201    { path: '/lap/DetailYankb/tahun/table5A/kabupaten', exact: true, name: '', component: TahunTable5AKabupatenYanKb },202    { path: '/lap/DetailYankb/tahun/table5B', exact: true, name: 'YANKB Laporan Tempat Pelayanan KB Pemerintah Berdasarkan Status Kerjasama Dengan BPJS Kesehatan', component: TahunTable5BYanKb },203    { path: '/lap/DetailYankb/tahun/table5B/provinsi', exact: true, name: '', component: TahunTable5BProvinsiYanb },204    { path: '/lap/DetailYankb/tahun/table5B/kabupaten', exact: true, name: '', component: TahunTable5BKabupatenYanKb },205    { path: '/lap/DetailYankb/tahun/table5C', exact: true, name: 'YANKB Laporan Tempat Pelayanan KB Pemerintah Berdasarkan Status Kerjasama Dengan BPJS Kesehatan', component: TahunTable5CYanKb },206    { path: '/lap/DetailYankb/tahun/table5C/provinsi', exact: true, name: '', component: TahunTable5CProvinsiYanb },207    { path: '/lap/DetailYankb/tahun/table5C/kabupaten', exact: true, name: '', component: TahunTable5CKabupatenYanKb },208    { path: '/lap/DetailYankb/tahun/table8A', exact: true, name: 'Tempat Pelayanan KB Berdasarkan Klasifikasi Pelayanan KB', component: TahunTable8AYanKb },209    { path: '/table8A/provinsi', exact: true, name: 'Detail Laporan YAN KB / Tempat Pelayanan KB Berdasarkan Klasifikasi Pelayanan KB', component: TahunTable8AProvinsiYanb },210    { path: '/table8A/kabupaten', exact: true, name: 'Detail Laporan YAN KB / Tempat Pelayanan KB Berdasarkan Klasifikasi Pelayanan KB', component: TahunTable8AKabupatenYanKb },211    { path: '/lap/DetailYankb/tahun/table8B', exact: true, name: 'Faskes KB Berdasarkan Status Kerjasama Dengan BPJS Kesehatan Dan Klasifikasi KB', component: TahunTable8BYanKb },212    { path: '/table8B/provinsi', exact: true, name: 'Detail Laporan YAN KB / Faskes KB Berdasarkan Status Kerjasama Dengan BPJS Kesehatan Dan Klasifikasi KB', component: TahunTable8BProvinsiYanb },213    { path: '/table8B/kabupaten', exact: true, name: 'Detail Laporan YAN KB / Faskes KB Berdasarkan Status Kerjasama Dengan BPJS Kesehatan Dan Klasifikasi KB', component: TahunTable8BKabupatenYanKb },214    { path: '/lap/yankb', exact: true, name: 'Laporan YAN KB', component: YanKBLaporan },215    { path: '/lap/DetailYankb', exact: true, name: 'Detail Laporan YAN KB', component: DetailYankb },216    { path: '/lap/DetailYankb/provinsi', exact: true, name: 'Laporan YAN KB Provinsi', component: DetailYankbProvinsi },217    { path: '/lap/DetailYankb/kabupaten', exact: true, name: 'Laporan YAN KB Kabupaten', component: DetailYankbKabupaten },218    //Administrasi219    { path: '/adm/umfaskes', exact: true, name: 'User Manajemen Faskes', component: Umfaskes },220];...EntityInfo.js
Source:EntityInfo.js  
1function EntityInfo(cnt_id){2	this.cnt_id = cnt_id;3	this.container = $(cnt_id);4	this.legend="Entity Info";5	this.info_list = $(document.createElement("ul"));6	this.gender_list = {'M':'Male','F':'Female','U':'Unknown','O':'Others'};7	this.group_btn = null;8	this.kb_row = null;9	this.kb_row_pos = 0;10	this.kb_toggle_btn =$(document.createElement("button")).addClass("btn dropdown-toggle").attr("data-toggle","dropdown").text("0/0"); 11	this.kb_toggle_menu = $(document.createElement("ul")).addClass("dropdown-menu");12	this.carousel = new function(){};13	this.column_ext = null;14	this.kb_row_select = {};15	this.kb_row_select_id = null;16	this.isCoref = false;17};18EntityInfo.prototype.init = function(carousel){19	if(carousel != undefined){20		this.carousel = carousel;	21	}22	23	this.group_btn = $(document.createElement("div")).addClass("btn-group").append(24		$(document.createElement("button")).addClass("btn").text("<").click($.proxy(this.listPrev, this)),25		this.kb_toggle_btn,26		$(document.createElement("button")).addClass("btn").text(">").click($.proxy(this.listNext, this)),27		this.kb_toggle_menu28	);29	this.container.append(30		$(document.createElement("div")).addClass("page-header").append(31			$(document.createElement("span")).text(this.legend),32			$(document.createElement("div")).addClass("pull-right").append(33				this.group_btn				34			)35		),36		37		this.info_list38	);39	40    this.group_btn.hide();41};42	43EntityInfo.prototype.clear = function(){44	this.info_list.empty();45	this.group_btn.hide();46};47EntityInfo.prototype.setColumnExtension = function(ext){48	if(ext != null && ext!= undefined){49		this.column_ext = ext;50	}else{51		this.column_ext = null;52	};53};54EntityInfo.prototype.listNext = function(){55	//console.log((this.kb_row_pos -1) % this.kb_row.length);56	this.kb_row_pos = (this.kb_row_pos + 1) % this.kb_row.length;57	//console.log(this.kb_row_pos);58	this._update(this.kb_row[this.kb_row_pos]);59	this.kb_toggle_btn.text((this.kb_row_pos + 1)+"/"+this.kb_row.length);60	this.group_btn.show();61};62EntityInfo.prototype.listPrev = function(){63	//console.log((this.kb_row_pos -1) % this.kb_row.length);64	this.kb_row_pos = (this.kb_row_pos -1) < 0 ? this.kb_row.length-1 : ((this.kb_row_pos -1) % this.kb_row.length);65	//console.log(this.kb_row_pos);66	this._update(this.kb_row[this.kb_row_pos]);67	this.kb_toggle_btn.text((this.kb_row_pos + 1)+"/"+this.kb_row.length);68	this.group_btn.show();69};70EntityInfo.prototype.listSelect = function(event){71	var element = event.target;72	this.kb_row_pos = parseInt($(element).attr("data-position"));73	this._update(this.kb_row[this.kb_row_pos]);74	this.kb_toggle_btn.text((this.kb_row_pos + 1)+"/"+this.kb_row.length);75	this.group_btn.show();76};77EntityInfo.prototype.getChanges = function(){78	return this.kb_row_select;79};80EntityInfo.prototype.update = function(kb_item, isCoref){81	this.clear();82	this.isCoref = isCoref;83	//console.log(kb_item);84	this.group_btn.hide();85	if(Array.isArray(kb_item)){86		this.kb_row = kb_item;87		this.kb_row_pos = 0;88		this.kb_row_select_id = String(this.kb_row[0]["id"].replace(":","-"));89		if(this.kb_row_select.hasOwnProperty(this.kb_row_select_id)){90			this.kb_row_pos = this.kb_row_select[this.kb_row_select_id];91		}92		93		this.kb_toggle_btn.text((this.kb_row_pos+1)+"/"+this.kb_row.length);94		this.kb_toggle_menu.empty();95		for(var i in kb_item){96			var txt = this.getBestTextField(kb_item[i]);97			98			this.kb_toggle_menu.append(99				$(document.createElement("li")).append(100					$(document.createElement("a")).attr({"href":"#","data-position":i}).text(txt).click($.proxy(this.listSelect,this))101				)102			);103		}104		105		this._update(this.kb_row[this.kb_row_pos]);106		this.group_btn.show();107	}else{108		this.kb_row_select_id = null;109		this._update(kb_item);110		111	}112};113EntityInfo.prototype.getBestTextField = function(kb_item){114	var fields = ["preferred term","name","display term","hidden text"];115	var field = "";116	var text = "";117	for(var i in fields){118		field = fields[i];119		if(kb_item[field] != "" && kb_item[field] != undefined){120			text = kb_item[field];121			break;122		}123	}124	125	return text;126	127};128EntityInfo.prototype._update = function(kb_row){129	this.clear();130	var data="";131	var prefix = null;132	var ext = null;133	if(this.column_ext != null){134		prefix = kb_row["id"].split(":")[0];135		if(this.column_ext.hasOwnProperty(prefix)){136			ext = this.column_ext[prefix];137			138		}139	}140	141	if(this.kb_row_select_id != null){142		this.kb_row_select[this.kb_row_select_id] = this.kb_row_pos;143	}144	//this.carousel.update(kb_row);145	for(var i in kb_row){146		liitem = $(document.createElement('li'));147		if(kb_row[i] == "" || i.endsWith("escaped") || i == "hidden text" || i == "hidden rows"){148			continue;149		}else if(ext != null && ext.hasOwnProperty(i)){150			var data = (ext[i]["data"] == '') ? kb_row[i] : ext[i]["data"]+kb_row[i];151	152			if(ext[i]["type"] == "url"){153				liitem.append($(document.createElement('b')).text(i + ": "));154				liitem.append($(document.createElement('a')).attr('href',data).text(kb_row[i]));155			}else if(ext[i]["type"] == "image"){156				liitem.append($(document.createElement('b')).text(i + ": "));157				liitem.append(kb_row[i].join(", "));158				this.carousel.addImages(kb_row[i], ext[i]["data"]);159			}160		}else if(i == "type"){161			liitem.append($(document.createElement('b')).text(i + ": "));162			var text = (this.isCoref == true) ? kb_row[i]+(" (coref)") :  kb_row[i];163			liitem.append(text);164		}else if(i.endsWith("url")){165			liitem.append($(document.createElement('b')).text(i + ": "));166			liitem.append($(document.createElement('a')).attr('href',kb_row[i]).text(kb_row[i]));167		}else if(i == "ulan id"){168				liitem.append($(document.createElement('b')).text(i + ": "));169			    liitem.append($(document.createElement('a')).attr('href','http://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid='+kb_row[i]).text(kb_row[i]));170		}else if(i == "image"){171			liitem.append($(document.createElement('b')).text(i + ": "));172			liitem.append(kb_row[i].join(", "));173		}else if(i == "geonames id"){174			liitem.append($(document.createElement('b')).text(i + ": "));175			liitem.append($(document.createElement('a')).attr('href','http://www.geonames.org/'+kb_row[i]).text(kb_row[i]));176		}else if(i == "feature code"){177			liitem.append($(document.createElement('b')).text(i + ": "));		178			liitem.append(kb_row[i][1]+ " ("+ kb_row[i][0]+ ")");	179		}else{180			if(Array.isArray(kb_row[i])){181				data = kb_row[i].join("; ");182				if(i == "timezone"){183					data = "UTC"+data;184				}else if(i == "freebase types"){185					//console.log(data);186					data = Array();187					for (index = 0; index < kb_row[i].length; index++) {188    					item = kb_row[i][index];189    					data.push($(document.createElement('a')).attr("href", item.substring(1, item.length-1)).text(item));190    					data.push("; ");191    					//console.log(item.substring(1, item.length-1));192					}193					data.pop();194					liitem.append($(document.createElement('b')).text(i + ": "));195					liitem.append(data);196					this.info_list.append(liitem);197					continue;198				}199			}else{200				data = kb_row[i];201				if(i == "gender"){202					data = this.gender_list[data];203				}204				205			}206			liitem.append($(document.createElement('b')).text(i + ": "));207			//liitem.append(i + ": " + data);208			209			d = data.replace(/\\n/g, '<br />');210			d = d.replace(/_/g, ' ');211			var r = /\\u([\d\w]{4})/gi;212			d = d.replace(r, function (match, grp) {213    			return String.fromCharCode(parseInt(grp, 16)); } );214			d = unescape(d);215			liitem.append(d);216		}217		this.info_list.append(liitem);218	}219};220String.prototype.endsWith = function(suffix) {221    return this.indexOf(suffix, this.length - suffix.length) !== -1;...file-upload.js
Source:file-upload.js  
1KB.component('file-upload', function (containerElement, options) {2    var inputFileElement = null;3    var dropzoneElement = null;4    var files = [];5    var currentFileIndex = 0;6    function onProgress(e) {7        if (e.lengthComputable) {8            var progress = e.loaded / e.total;9            var percentage = Math.floor(progress * 100);10            KB.find('#file-progress-' + currentFileIndex).attr('value', progress);11            KB.find('#file-percentage-' + currentFileIndex).replaceText('(' + percentage + '%)');12        }13    }14    function onError() {15        var errorElement = KB.dom('div').addClass('file-error').text(options.labelUploadError).build();16        KB.find('#file-item-' + currentFileIndex).add(errorElement);17    }18    function onServerError(response) {19        var errorElement = KB.dom('div').addClass('file-error').text(response.message).build();20        KB.find('#file-item-' + currentFileIndex).add(errorElement);21        KB.trigger('modal.stop');22    }23    function onComplete() {24        currentFileIndex++;25        if (currentFileIndex < files.length) {26            KB.http.uploadFile(options.url, files[currentFileIndex], options.csrf, onProgress, onComplete, onError, onServerError);27        } else {28            KB.trigger('modal.stop');29            KB.trigger('modal.hide');30            var alertElement = KB.dom('div')31                .addClass('alert')32                .addClass('alert-success')33                .text(options.labelSuccess)34                .build();35            var buttonElement = KB.dom('button')36                .attr('type', 'button')37                .addClass('btn')38                .addClass('btn-blue')39                .click(onCloseWindow)40                .text(options.labelCloseSuccess)41                .build();42            KB.dom(dropzoneElement).replace(KB.dom('div').add(alertElement).add(buttonElement).build());43        }44    }45    function onCloseWindow() {46        window.location.reload();47    }48    function onSubmit() {49        currentFileIndex = 0;50        uploadFiles();51    }52    function onFileChange() {53        for (var i = 0; i < inputFileElement.files.length; i++) {54            files.push(inputFileElement.files[i]);55        }56        showFiles();57    }58    function onClickFileBrowser() {59        files = [];60        currentFileIndex = 0;61        inputFileElement.click();62    }63    function onDragOver(e) {64        e.stopPropagation();65        e.preventDefault();66    }67    function onDrop(e) {68        e.stopPropagation();69        e.preventDefault();70        for (var i = 0; i < e.dataTransfer.files.length; i++) {71            files.push(e.dataTransfer.files[i]);72        }73        showFiles();74    }75    function uploadFiles() {76        if (files.length > 0) {77            KB.http.uploadFile(options.url, files[currentFileIndex], options.csrf, onProgress, onComplete, onError, onServerError);78        }79    }80    function showFiles() {81        if (files.length > 0) {82            KB.trigger('modal.enable');83            KB.dom(dropzoneElement)84                .empty()85                .add(buildFileListElement());86        } else {87            KB.trigger('modal.disable');88            KB.dom(dropzoneElement)89                .empty()90                .add(buildInnerDropzoneElement());91        }92    }93    function buildFileInputElement() {94        return KB.dom('input')95            .attr('id', 'file-input-element')96            .attr('type', 'file')97            .attr('name', 'files[]')98            .attr('multiple', true)99            .on('change', onFileChange)100            .hide()101            .build();102    }103    function buildInnerDropzoneElement() {104        var dropzoneLinkElement = KB.dom('a')105            .attr('href', '#')106            .text(options.labelChooseFiles)107            .click(onClickFileBrowser)108            .build();109        return KB.dom('div')110            .attr('id', 'file-dropzone-inner')111            .text(options.labelDropzone + ' ' + options.labelOr + ' ')112            .add(dropzoneLinkElement)113            .build();114    }115    function buildDropzoneElement() {116        var dropzoneElement = KB.dom('div')117            .attr('id', 'file-dropzone')118            .add(buildInnerDropzoneElement())119            .build();120        dropzoneElement.ondragover = onDragOver;121        dropzoneElement.ondrop = onDrop;122        dropzoneElement.ondragover = onDragOver;123        return dropzoneElement;124    }125    function buildFileListItem(index) {126        var isOversize = false;127        var progressElement = KB.dom('progress')128            .attr('id', 'file-progress-' + index)129            .attr('value', 0)130            .build();131        var percentageElement = KB.dom('span')132            .attr('id', 'file-percentage-' + index)133            .text('(0%)')134            .build();135        var deleteElement = KB.dom('span')136            .attr('id', 'file-delete-' + index)137            .html('<a href="#"><i class="fa fa-trash fa-fw"></i></a>')138            .on('click', function () {139                files.splice(index, 1);140                KB.find('#file-item-' + index).remove();141                showFiles();142            })143            .build();144        var itemElement = KB.dom('li')145            .attr('id', 'file-item-' + index)146            .add(deleteElement)147            .add(progressElement)148            .text(' ' + files[index].name + ' ')149            .add(percentageElement);150        if (files[index].size > options.maxSize) {151            itemElement.add(KB.dom('div').addClass('file-error').text(options.labelOversize).build());152            isOversize = true;153        }154        if (isOversize) {155            KB.trigger('modal.disable');156        }157        return itemElement.build();158    }159    function buildFileListElement() {160        var fileListElement = KB.dom('ul')161            .attr('id', 'file-list')162            .build();163        for (var i = 0; i < files.length; i++) {164            fileListElement.appendChild(buildFileListItem(i));165        }166        return fileListElement;167    }168    this.render = function () {169        KB.on('modal.submit', onSubmit);170        KB.on('modal.close', function () {171           KB.removeListener('modal.submit', onSubmit);172        });173        inputFileElement = buildFileInputElement();174        dropzoneElement = buildDropzoneElement();175        containerElement.appendChild(inputFileElement);176        containerElement.appendChild(dropzoneElement);177    };...modal.js
Source:modal.js  
1(function () {2    var isOpen = false;3    function onOverlayClick(e) {4        if (e.target.matches('#modal-overlay')) {5            e.stopPropagation();6            e.preventDefault();7            destroy();8        }9    }10    function onCloseButtonClick() {11        KB.trigger('modal.close');12    }13    function onFormSubmit() {14        KB.trigger('modal.loading');15        submitForm();16    }17    function getForm() {18        return document.querySelector('#modal-content form:not(.js-modal-ignore-form)');19    }20    function submitForm() {21        var form = getForm();22        if (form) {23            var url = form.getAttribute('action');24            if (url) {25                KB.http.postForm(url, form).success(function (response) {26                    KB.trigger('modal.stop');27                    if (response) {28                        replace(response);29                    } else {30                        destroy();31                    }32                }).error(function (response) {33                    KB.trigger('modal.stop');34                    if (response.hasOwnProperty('message')) {35                        window.alert(response.message);36                    }37                });38            }39        }40    }41    function afterRendering() {42        var formElement = KB.find('#modal-content form');43        if (formElement) {44            formElement.on('submit', onFormSubmit, false);45        }46        var autoFocusElement = document.querySelector('#modal-content input[autofocus]');47        if (autoFocusElement) {48            autoFocusElement.focus();49        }50        KB.render();51        _KB.datePicker();52        _KB.autoComplete();53        _KB.tagAutoComplete();54        _KB.get('Task').onPopoverOpened();55        KB.trigger('modal.afterRender');56    }57    function replace(html) {58        var contentElement = KB.find('#modal-content');59        if (contentElement) {60            contentElement.replace(KB.dom('div')61                .attr('id', 'modal-content')62                .html(html)63                .build()64            );65            afterRendering();66        }67    }68    function create(html, width, overlayClickDestroy) {69        var closeButtonElement = KB.dom('a')70            .attr('href', '#')71            .attr('id', 'modal-close-button')72            .html('<i class="fa fa-times"></i>')73            .click(onCloseButtonClick)74            .build();75        var headerElement = KB.dom('div')76            .attr('id', 'modal-header')77            .add(closeButtonElement)78            .build();79        var contentElement = KB.dom('div')80            .attr('id', 'modal-content')81            .html(html)82            .build();83        var boxElement = KB.dom('div')84            .attr('id', 'modal-box')85            .style('width', width)86            .add(headerElement)87            .add(contentElement)88            .build();89        var overlayElement = KB.dom('div')90            .attr('id', 'modal-overlay')91            .add(boxElement)92            .build();93        if (overlayClickDestroy) {94            overlayElement.addEventListener('click', onOverlayClick, false);95        }96        document.body.appendChild(overlayElement);97        afterRendering();98    }99    function destroy() {100        isOpen = false;101        var overlayElement = KB.find('#modal-overlay');102        if (overlayElement) {103            KB.trigger('modal.beforeDestroy');104            overlayElement.remove();105        }106    }107    function getWidth(size) {108        var viewport = KB.utils.getViewportSize();109        if (viewport.width < 700) {110            return '99%';111        }112        switch (size) {113            case 'large':114                return viewport.width < 1350 ? '98%' : '1350px';115            case 'medium':116                return viewport.width < 1024 ? '70%' : '1024px';117        }118        return viewport.width < 800 ? '75%' : '800px';119    }120    KB.on('modal.close', function () {121        destroy();122    });123    KB.on('modal.submit', function () {124        submitForm();125    });126    KB.modal = {127        open: function (url, size, overlayClickDestroy) {128            KB.trigger('modal.open');129            _KB.get('Dropdown').close();130            destroy();131            if (typeof overlayClickDestroy === 'undefined') {132                overlayClickDestroy = true;133            }134            KB.http.get(url).success(function (response) {135                isOpen = true;136                create(response, getWidth(size), overlayClickDestroy);137            });138        },139        close: function () {140            destroy();141        },142        isOpen: function () {143            return isOpen;144        },145        replace: function (url) {146            KB.http.get(url).success(function (response) {147                replace(response);148            });149        },150        getForm: getForm,151        submitForm: submitForm152    };...keyboard-shortcuts.js
Source:keyboard-shortcuts.js  
1KB.keyboardShortcuts = function () {2    function goToLink (selector) {3        if (! KB.modal.isOpen()) {4            var element = KB.find(selector);5            if (element !== null) {6                window.location = element.attr('href');7            }8        }9    }10    function submitForm() {11        if (KB.modal.isOpen()) {12            KB.modal.submitForm();13        } else {14            var forms = $("form");15            if (forms.length == 1) {16                forms.submit();17            } else if (forms.length > 1) {18                if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') {19                    $(document.activeElement).parents("form").submit();20                }21            }22        }23    }24    KB.onKey('?', function () {25        if (! KB.modal.isOpen()) {26            KB.modal.open(KB.find('body').data('keyboardShortcutUrl'));27        }28    });29    KB.onKey('Escape', function () {30        if (! KB.exists('#suggest-menu')) {31            KB.trigger('modal.close');32            _KB.get("Dropdown").close();33        }34    }, true);35    KB.onKey('Enter', submitForm, true, true);36    KB.onKey('Enter', submitForm, true, false, true);37    KB.onKey('b', function () {38        if (! KB.modal.isOpen()) {39            KB.trigger('board.selector.open');40        }41    });42    if (KB.exists('#board')) {43        KB.onKey('c', function () {44            if (! KB.modal.isOpen()) {45                _KB.get('BoardHorizontalScrolling').toggle();46            }47        });48        KB.onKey('s', function () {49            if (! KB.modal.isOpen()) {50                _KB.get('BoardCollapsedMode').toggle();51            }52        });53        KB.onKey('n', function () {54            if (! KB.modal.isOpen()) {55                KB.modal.open(KB.find('#board').data('taskCreationUrl'), 'large', false);56            }57        });58    }59    if (KB.exists('#task-view')) {60        KB.onKey('e', function () {61            if (! KB.modal.isOpen()) {62                KB.modal.open(KB.find('#task-view').data('editUrl'), 'large', false);63            }64        });65        KB.onKey('c', function () {66            if (! KB.modal.isOpen()) {67                KB.modal.open(KB.find('#task-view').data('commentUrl'), 'medium', false);68            }69        });70        KB.onKey('s', function () {71            if (! KB.modal.isOpen()) {72                KB.modal.open(KB.find('#task-view').data('subtaskUrl'), 'medium', false);73            }74        });75        KB.onKey('l', function () {76            if (! KB.modal.isOpen()) {77                KB.modal.open(KB.find('#task-view').data('internalLinkUrl'), 'medium', false);78            }79        });80    }81    KB.onKey('f', function () {82        if (! KB.modal.isOpen()) {83            KB.focus('#form-search');84        }85    });86    KB.onKey('r', function () {87        if (! KB.modal.isOpen()) {88            var reset = $(".filter-reset").data("filter");89            var input = $("#form-search");90            input.val(reset);91            $("form.search").submit();92        }93    });94    KB.onKey('v+o', function () {95        goToLink('a.view-overview');96    });97    KB.onKey('v+b', function () {98        goToLink('a.view-board');99    });100    KB.onKey('v+l', function () {101        goToLink('a.view-listing');102    });...test_formatFileSize.js
Source:test_formatFileSize.js  
1/* This Source Code Form is subject to the terms of the Mozilla Public2 * License, v. 2.0. If a copy of the MPL was not distributed with this3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */4/*5 * Tests for the formatFileSize method.6 */7load("../../../../mailnews/resources/logHelper.js");8load("../../../../mailnews/resources/asyncTestUtils.js");9var gStringBundle = Services.strings.createBundle(10  "chrome://messenger/locale/messenger.properties");11var gMessenger = Cc["@mozilla.org/messenger;1"]12                   .createInstance(Ci.nsIMessenger);13function isDigit(c) {14  return "0123456789".indexOf(c) != -1;15}16function test_formatFileSize(aArgs) {17  const strings = {  b: "byteAbbreviation2",18                    kb: "kiloByteAbbreviation2",19                    mb: "megaByteAbbreviation2",20                    gb: "gigaByteAbbreviation2" };21  let actual = gMessenger.formatFileSize(aArgs.bytes, aArgs.useKB);22  let expected = gStringBundle.GetStringFromName(strings[aArgs.units])23                              .replace("%.*f", aArgs.mantissa);24  // If the actual string contains a non-numeric character at the position25  // where we'd expect a decimal separator, assume it is a localized separator26  // and just convert it to a dot for easy comparing.27  let separatorPos = aArgs.mantissa.indexOf(".");28  if (!isDigit(actual.charAt(separatorPos)))29    actual = actual.substring(0, separatorPos) + "." + actual.substr(separatorPos + 1);30  do_check_eq(actual, expected);31}32/* ===== Driver ===== */33var test_data = [34  { bytes:                   0, useKB: false, mantissa:    "0", units:  "b" },35  { bytes:                   1, useKB: false, mantissa:    "1", units:  "b" },36  { bytes:                  10, useKB: false, mantissa:   "10", units:  "b" },37  { bytes:                 999, useKB: false, mantissa:  "999", units:  "b" },38  { bytes:                1000, useKB: false, mantissa:  "1.0", units: "kb" },39  { bytes:                1024, useKB: false, mantissa:  "1.0", units: "kb" },40  { bytes:             10*1024, useKB: false, mantissa: "10.0", units: "kb" },41  { bytes:            999*1024, useKB: false, mantissa:  "999", units: "kb" },42  { bytes:           1000*1024, useKB: false, mantissa:  "1.0", units: "mb" },43  { bytes:           1024*1024, useKB: false, mantissa:  "1.0", units: "mb" },44  { bytes:        10*1024*1024, useKB: false, mantissa: "10.0", units: "mb" },45  { bytes:       999*1024*1024, useKB: false, mantissa:  "999", units: "mb" },46  { bytes:      1000*1024*1024, useKB: false, mantissa:  "1.0", units: "gb" },47  { bytes:      1024*1024*1024, useKB: false, mantissa:  "1.0", units: "gb" },48  { bytes:   10*1024*1024*1024, useKB: false, mantissa: "10.0", units: "gb" },49  { bytes:  999*1024*1024*1024, useKB: false, mantissa:  "999", units: "gb" },50  { bytes: 1000*1024*1024*1024, useKB: false, mantissa: "1000", units: "gb" },51  { bytes:                   0, useKB: true,  mantissa:    "0", units: "kb" },52  { bytes:                   1, useKB: true,  mantissa:  "0.1", units: "kb" },53  { bytes:                 500, useKB: true,  mantissa:  "0.5", units: "kb" },54  { bytes:                 999, useKB: true,  mantissa:  "1.0", units: "kb" },55];56var tests = [57  parameterizeTest(test_formatFileSize, test_data)58];59function run_test() {60  async_run_tests(tests);...Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.keyboard.press('ArrowUp');7  await page.keyboard.press('ArrowDown');8  await page.keyboard.press('ArrowLeft');9  await page.keyboard.press('ArrowRight');10  await page.keyboard.press('Enter');11  await page.keyboard.press('Tab');12  await page.keyboard.press('Backspace');13  await page.keyboard.press('Delete');14  await page.keyboard.press('Escape');15  await page.keyboard.press('PageUp');16  await page.keyboard.press('PageDown');17  await page.keyboard.press('Home');18  await page.keyboard.press('End');19  await page.keyboard.press('Insert');20  await page.keyboard.press('F1');21  await page.keyboard.press('F2');22  await page.keyboard.press('F3');23  await page.keyboard.press('F4');24  await page.keyboard.press('F5');25  await page.keyboard.press('F6');26  await page.keyboard.press('F7');27  await page.keyboard.press('F8');28  await page.keyboard.press('F9');29  await page.keyboard.press('F10');30  await page.keyboard.press('F11');31  await page.keyboard.press('F12');32  await page.keyboard.press('Meta');33  await page.keyboard.press('Control');34  await page.keyboard.press('Alt');35  await page.keyboard.press('Shift');36  await page.keyboard.press(' ');37  await page.keyboard.press('!');38  await page.keyboard.press('"');39  await page.keyboard.press('#');40  await page.keyboard.press('$');41  await page.keyboard.press('%');42  await page.keyboard.press('&');43  await page.keyboard.press('\'');44  await page.keyboard.press('(');45  await page.keyboard.press(')');46  await page.keyboard.press('*');47  await page.keyboard.press('+');48  await page.keyboard.press(',');49  await page.keyboard.press('-');50  await page.keyboard.press('.');51  await page.keyboard.press('/');52  await page.keyboard.press('0');53  await page.keyboard.press('1');54  await page.keyboard.press('2');55  await page.keyboard.press('3');56  await page.keyboard.press('4');57  await page.keyboard.press('5');58  await page.keyboard.press('6');59  await page.keyboard.press('7');60  await page.keyboard.press('8');Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.keyboard.press('KeyK');7  await page.screenshot({ path: 'example.png' });8  await browser.close();9})();10const { chromium } = require('playwright');11(async () => {12  const browser = await chromium.launch();13  const context = await browser.newContext();14  const page = await context.newPage();15  await page.keyboard.press('KeyK');16  await page.screenshot({ path: 'example.png' });17  await browser.close();18})();19const { chromium } = require('playwright');20(async () => {21  const browser = await chromium.launch();22  const context = await browser.newContext();23  const page = await context.newPage();24  await page.keyboard.press('KeyK');25  await page.screenshot({ path: 'example.png' });26  await browser.close();27})();28const { chromium } = require('playwright');29(async () => {30  const browser = await chromium.launch();31  const context = await browser.newContext();32  const page = await context.newPage();33  await page.keyboard.press('KeyK');34  await page.screenshot({ path: 'example.png' });35  await browser.close();36})();37const { chromium } = require('playwright');38(async () => {39  const browser = await chromium.launch();40  const context = await browser.newContext();41  const page = await context.newPage();42  await page.keyboard.press('KeyK');43  await page.screenshot({ path: 'example.png' });44  await browser.close();45})();46const { chromium } = require('playwright');Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.keyboard.press('ArrowLeft');7  await browser.close();8})();Using AI Code Generation
1const {chromium} = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.keyboard.press('a');7  await page.keyboard.press('b');8  await page.keyboard.press('c');9  await page.keyboard.press('Enter');10  await browser.close();11})();Using AI Code Generation
1const {chromium} = require('playwright');2(async () => {3  const browser = await chromium.launch({headless: false});4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.keyboard.press('a');7  await page.keyboard.press('b');8  await page.keyboard.press('c');9  await page.keyboard.press('d');10  await page.keyboard.press('e');11  await page.keyboard.press('f');12  await page.keyboard.press('g');13  await page.keyboard.press('h');14  await page.keyboard.press('i');15  await page.keyboard.press('j');16  await page.keyboard.press('k');17  await page.keyboard.press('l');18  await page.keyboard.press('m');19  await page.keyboard.press('n');20  await page.keyboard.press('o');21  await page.keyboard.press('p');22  await page.keyboard.press('q');23  await page.keyboard.press('r');24  await page.keyboard.press('s');25  await page.keyboard.press('t');26  await page.keyboard.press('u');27  await page.keyboard.press('v');28  await page.keyboard.press('w');29  await page.keyboard.press('x');30  await page.keyboard.press('y');31  await page.keyboard.press('z');Using AI Code Generation
1const {chromium, devices} = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext({5    geolocation: {longitude: 12.492507, latitude: 41.889938},6  });7  const page = await context.newPage();8  await page.waitForSelector('text="Your location"');9  const element = await page.$('text="Your location"');10  await element.scrollIntoViewIfNeeded();Using AI Code Generation
1const { Playwright } = require('playwright-core');2module.exports = async function() {3  const playwright = new Playwright();4  const browser = await playwright.chromium.launch();5  const context = await browser.newContext();6  const page = await context.newPage();7  await page.keyboard.press('Tab');8  await page.keyboard.press('Enter');9  await browser.close();10}Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.keyboard.press('Control+T');7  await page.keyboard.press('Control+L');8  await page.keyboard.press('Enter');9  await page.waitForTimeout(2000);10  await browser.close();11})();12page.keyboard.press()13page.keyboard.type()14browser.close()15browser.newContext()16page.goto()17page.waitForTimeout()18require()LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
