JAVASCRIPT   25

atomdataloader

Guest on 4th June 2022 01:11:08 AM

  1. import promise from "../thirdparty/promiz";
  2. import proxy from "../load/proxy";
  3. import DataDriver from "../load/drivers/index";
  4.  
  5.  
  6. import {ajax} from "../load/ajax";
  7.  
  8. import {bind} from "../webix/helpers";
  9. import {callEvent} from "../webix/customevents";
  10.  
  11. const AtomDataLoader={
  12.         $init:function(config){
  13.                 //prepare data store
  14.                 this.data = {};
  15.                 this.waitData = promise.defer();
  16.  
  17.                 if (config)
  18.                         this._settings.datatype = config.datatype||"json";
  19.                 this.$ready.push(this._load_when_ready);
  20.         },
  21.         _load_when_ready:function(){
  22.                 this._ready_for_data = true;
  23.                
  24.                 if (this._settings.url)
  25.                         this.url_setter(this._settings.url);
  26.                 if (this._settings.data)
  27.                         this.data_setter(this._settings.data);
  28.         },
  29.         url_setter:function(value){
  30.                 value = proxy.$parse(value);
  31.  
  32.                 if (!this._ready_for_data) return value;
  33.                 this.load(value, this._settings.datatype);     
  34.                 return value;
  35.         },
  36.         data_setter:function(value){
  37.                 if (!this._ready_for_data) return value;
  38.                 this.parse(value, this._settings.datatype);
  39.                 return true;
  40.         },
  41.         //loads data from external URL
  42.         load:function(url,call){
  43.                 var details = arguments[2] || null;
  44.  
  45.                 if(!this.callEvent("onBeforeLoad",[]))
  46.                         return promise.reject();               
  47.  
  48.                 if (typeof call == "string"){   //second parameter can be a loading type or callback
  49.                         //we are not using setDriver as data may be a non-datastore here
  50.                         this.data.driver = DataDriver[call];
  51.                         call = arguments[2];
  52.                 } else if (!this.data.driver)
  53.                         this.data.driver = DataDriver.json;
  54.  
  55.                 var result;
  56.  
  57.                 //proxy
  58.                 url = proxy.$parse(url);
  59.                 if (url.$proxy && url.load){
  60.                         result = url.load(this, details);
  61.                 }
  62.                 //promize
  63.                 else if (typeof url === "function"){
  64.                         result = url.call(this, details);
  65.                 }
  66.                 //normal url
  67.                 else {
  68.                         result = ajax().bind(this).get(url);
  69.                 }
  70.  
  71.                 //we wrap plain data in promise to keep the same processing for it
  72.                 if(result && !result.then){
  73.                         result = promise.resolve(result);
  74.                 }
  75.  
  76.                 if(result && result.then){
  77.                         result.then((data) => {
  78.                                 if (this.$destructed)
  79.                                         return;
  80.                                 this._onLoad(data);
  81.                                 if (call)
  82.                                         ajax.$callback(this, call, "", data, -1);
  83.                         }, (x) => {
  84.                                 this._onLoadError(x);
  85.                         });
  86.                 }
  87.                 return result;
  88.         },
  89.         //loads data from object
  90.         parse:function(data,type){
  91.                 if (data && typeof data.then == "function"){
  92.                         return data.then(bind(function(data){
  93.                                 this.parse(data, type);
  94.                         }, this));
  95.                 }
  96.  
  97.                 //loading data from other component
  98.                 if (data && data.sync && this.sync)
  99.                         return this._syncData(data);
  100.  
  101.                 if(!this.callEvent("onBeforeLoad",[]))
  102.                         return promise.reject();
  103.  
  104.                 this.data.driver = DataDriver[type||"json"];
  105.                 this._onLoad(data);
  106.         },
  107.         _syncData: function(data){
  108.                 if(this.data)
  109.                         this.data.attachEvent("onSyncApply",bind(function(){
  110.                                 if(this._call_onready)
  111.                                         this._call_onready();
  112.                         },this));
  113.  
  114.                 this.sync(data);
  115.         },
  116.         _parse:function(data){
  117.                 var parsed, record,
  118.                         driver = this.data.driver;
  119.  
  120.                 record = driver.getRecords(data)[0];
  121.                 parsed = record?driver.getDetails(record):{};
  122.  
  123.                 if (this.setValues)
  124.                         this.setValues(parsed);
  125.                 else
  126.                         this.data = parsed;
  127.         },
  128.         _onLoadContinue:function(data){
  129.                 if (data){
  130.                         if(!this.$onLoad || !this.$onLoad(data, this.data.driver)){
  131.                                 if(this.data && this.data._parse)
  132.                                         this.data._parse(data); //datastore
  133.                                 else
  134.                                         this._parse(data);
  135.                         }
  136.                 }
  137.                 else
  138.                         this._onLoadError(data);
  139.  
  140.                 //data loaded, view rendered, call onready handler
  141.                 if(this._call_onready)
  142.                         this._call_onready();
  143.  
  144.                 this.callEvent("onAfterLoad",[]);
  145.                 this.waitData.resolve();
  146.         },
  147.         //default after loading callback
  148.         _onLoad:function(data){
  149.                 if (data && typeof data.text === "function"){
  150.                         data = data.text();
  151.                 }
  152.  
  153.                 data = this.data.driver.toObject(data);
  154.                 if(data && data.then)
  155.                         data.then((data) => { this._onLoadContinue(data); });
  156.                 else
  157.                         this._onLoadContinue(data);
  158.         },
  159.         _onLoadError:function(xhttp){
  160.                 this.callEvent("onAfterLoad",[]);
  161.                 this.callEvent("onLoadError",arguments);
  162.                 callEvent("onLoadError", [xhttp, this]);
  163.         },
  164.         _check_data_feed:function(data){
  165.                 if (!this._settings.dataFeed || this._ignore_feed || !data)
  166.                         return true;
  167.  
  168.                 var url = this._settings.dataFeed;
  169.                 if (typeof url == "function")
  170.                         return url.call(this, (data.id||data), data);
  171.  
  172.                 url = url+(url.indexOf("?")==-1?"?":"&")+"action=get&id="+encodeURIComponent(data.id||data);
  173.                 if(!this.callEvent("onBeforeLoad",[]))
  174.                         return false;
  175.  
  176.                 ajax(url, function(text,xml,loader){
  177.                         this._ignore_feed = true;
  178.                         var driver = DataDriver.json;
  179.                         var data = driver.toObject(text, xml);
  180.                         if (data)
  181.                                 this.setValues(driver.getDetails(driver.getRecords(data)[0]));
  182.                         else
  183.                                 this._onLoadError(loader);
  184.                         this._ignore_feed = false;
  185.                         this.callEvent("onAfterLoad",[]);
  186.                 }, this);
  187.                 return false;
  188.         }
  189. };
  190.  
  191. export default AtomDataLoader;

Raw Paste


Login or Register to edit or fork this paste. It's free.