sdc_client 0.57.11 → 0.57.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/misc.xml +2 -2
- package/.idea/workspace.xml +133 -39
- package/SimpleDomControlClient.iml +5 -2
- package/dist/index.js +6 -6
- package/dist/ugly.index.js +1 -1
- package/package.json +1 -1
- package/src/simpleDomControl/AbstractSDC.js +5 -0
- package/src/simpleDomControl/sdc_main.js +10 -8
- package/src/simpleDomControl/sdc_socket.js +24 -6
- package/src/simpleDomControl/sdc_test_utils.js +34 -10
- package/src/simpleDomControl/sdc_utils.js +45 -23
- package/src/simpleDomControl/sdc_view.js +162 -30
- package/test/controller.test.js +1 -41
- package/test/utils.js +89 -0
- package/test/view.test.js +141 -0
package/dist/ugly.index.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n;e.d(t,{n$:()=>ne,du:()=>R,yA:()=>ue,g3:()=>h,u2:()=>m,n9:()=>O,on:()=>E,yy:()=>k,R6:()=>p,$n:()=>P,hA:()=>he,VB:()=>fe,hZ:()=>q});const r=/([^\s,]+)/g,o=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function s(){return n||(n=$("body")),n}function i(){return new Promise((function(e){e()}))}function l(e){return(e=(e=e.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))).replace(/[0-9]+/g,(e=>`-${e}`))).replace(/^[-]/g,"")}function a(e){return e.replace(/-./g,(e=>`${e[1].toUpperCase()}`))}const c=(e,t)=>{let n=t,r=Object.getOwnPropertyNames(e.prototype).concat(Object.getOwnPropertySymbols(e.prototype));for(;""!==n.name;)Object.getOwnPropertyNames(n.prototype).concat(Object.getOwnPropertySymbols(n.prototype)).forEach((t=>{t.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)||r.includes(t)||(r.push(t),Object.defineProperty(e.prototype,t,Object.getOwnPropertyDescriptor(n.prototype,t)))})),n=Object.getPrototypeOf(n)};function u(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",d,!1),e},data:e,cache:!1,contentType:!1,processData:!1,beforeSend:function(e,t){(function(e){return/^(GET|HEAD|OPTIONS|TRACE)$/.test(e)})(t.type)||this.crossDomain||e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}})}function d(e){if(e.lengthComputable){var t=Math.round(e.loaded/e.total*100),n=$(".progress-container");100===t?n.hide():n.show(),t+="%",n.find(".progress-bar").css({width:t}).text(t)}}function h(e,t=null){return"string"!=typeof e?e:t&&void 0!==t[e]?"function"==typeof t[e]?t[e].bind(t):t[e]:e.match(/^(true|false)$/)?"true"===e:"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substr(1,e.length-2):e:void 0}function f(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function m(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function p(e,t){t=$("<div>").append(t),e.find(".has-error").removeClass("has-error").find(".alert-danger").safeRemove(),e.find(".non-field-errors").safeRemove();let n=t.find("input[type=file]").parent();e.find("input[type=file]").parent().each((function(e){$(this).replaceWith(n[e])}));let r=0===t.find(".non-field-errors").insertAfter(e.find(".hidden-form-fields")).length;return t.find(".has-error").each((function(){r=!1;let t=$(this),n=t.data("auto-id"),o=e.find(".form-group."+n);o.addClass("has-error"),o.find(".form-input-container").append(t.find(".alert-danger"))})),r}function g(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),o={};for(let t in r)r.hasOwnProperty(t)&&t!==x&&!e.includes(t)&&(o[t]=r[t]);n=[];for(let t=0;t<e.length;t++){let o=e[t];r.hasOwnProperty(o)?n.push(r[o]):n.push("undefined")}return n.push(o),n}(e,t);return function(e,t=null){let n=[];for(let r=0;r<e.length;r++){let o=h(e[r],t);n.push(o)}return n}(r,n)}function y(e,t,n){if(!e)return!1;if("function"!=typeof e.onInit)return!1;let s;var i;"function"==typeof e._on_init_params?s=e._on_init_params():s=(i=e.onInit.toString().replace(o,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(r)||[];let l=g(s,t,n._parentController);if(e.onInit.apply(n,l),n===e)for(let r in e._mixins)y(e._mixins[r],t,n)}let v={},w={};function C(e,t){if(e){let n=a(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function b(e,t,n,r){let o=[];r=function(e,t){e=(e=e.concat(w[t][1])).filter(((e,t,n)=>n.indexOf(e)===t));let n=!0;for(;n;){n=!1;for(let t of e)for(let r of w[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)o.push(w[e][0]);let s=new(function(e,...t){let n=class{constructor(...n){let r={};t.forEach((e=>{let t;Object.assign(this,t=new e),t._tagName=e.prototype._tagName,t._isMixin=!0,r[e.name]=t})),Object.assign(this,new e),this._mixins=r}get mixins(){return this._mixins}};return c(n,e),t.forEach((e=>{c(n,e)})),n}(w[n][0],...o));return s._tagName=n,C(e,s),s.$container=t,function(e,t){y(t,e,t)}(t,s),s}function O(e,t,n,r){let o=a(n);if(v[o]){let n=v[o];return C(e,n),n.$container=t,n}return b(e,t,n,r)}function k(e){const t=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=I(e,e.contentUrl),e.contentUrl=t.url),Promise.all([L(e.contentUrl,t.args,e._tagName,e.contentReload)]).then((function(e){let t=e[0];if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null}))}(e).then((t=>!e.onLoad||e._onLoadDone?t:(e._onLoadDone=!0,(e.onLoad(t)||i()).then((()=>t)))))}(e).then((function(t){return function(e,t){return J(e,t).then((function(t){if(t=t||!0,e.willShow){let n=e.willShow();if(n instanceof Promise)return n.then((function(){return t}))}return t}))}(e,t)})).then((()=>function(e){return e.refresh&&e.refresh()}(e))).catch((function(t){return J(e,t)}));return e.load_async?Promise.resolve():t}let S={},N={};function E(e,t){return P(e),N.hasOwnProperty(e)?t[N[e]]?void S[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function P(e,t){t||(t=e),N[e]||(N[e]=t,S[e]=[])}function R(e){for(let t in S)if(S.hasOwnProperty(t))for(let n=S[t].length;n>=0;n--)e===S[t][n]&&S[t].splice(n,1)}function q(e){let t=Array.apply(null,arguments);if(e=t.shift(),!S.hasOwnProperty(e)||!N.hasOwnProperty(e))return i();let n=S[e],r=N[e],o=[];for(let e=0;e<n.length;e++){let s=n[e][r].apply(n[e],t);void 0!==s&&o.push(s)}return Promise.all(o)}let F={};const x="_controller_",T="_sdc_controller_";function A(e,t,n){if(!e)return[];let r=e.children(),o=[];return r.each((function(e,r){let s=$(r),i=s.prop("tagName").toLowerCase().split("_");$.inArray(i[0],t)>=0?o.push({tag:i[0],super:i.splice(1)||[],dom:s}):i[0].startsWith("this.")?s.addClass(`_bind_to_update_handler sdc_uuid_${n._uuid}`):o=o.concat(A(s,t,n))})),o}function L(e,t,n,r){return e?F[n]?Promise.resolve(F[n]):(t.VERSION=ue.VERSION,t._method="content",$.get(e,t).then((function(e){return r||(F[n]=e),e})).catch((function(e){throw 301===e.status&&q("_RedirectOnView",e.responseJSON["url-link"]),q("navLoaded",{controller_name:()=>e.status}),`<sdc-error data-code="${e.status}">${e.responseText}</sdc-error>`}))):Promise.resolve(!1)}function j(e,t){return t=t||e.data(x),D(ue.tagNames,e,t)}function I(e){let t=e.contentUrl;if(e&&0===e._urlParams.length){let n,r=/%\(([^)]+)\)\w/gm;for(e._urlParams=[];n=r.exec(t);)e._urlParams.push(n[1]),e.contentReload=!0}let n=function(e,t){return g(e._urlParams,t)}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(e._urlParams.hasOwnProperty(r)){let o=e._urlParams[r],s=RegExp("%\\("+o+"\\)\\w","gm");t=t.replace(s,""+n.shift())}return t}(e,t,n)),e.parsedContentUrl=t,{url:t,args:n[n.length-1]}}function M(e){return e.hasClass(T)?e.data(`${x}`):e.closest(`.${T}`).data(`${x}`)}function U(e,t,n,r){let o=e.data(x);return o?j(e,o):(o=O(r,e,t,n),e.data(x,o),e.addClass(T),k(o))}function J(e,t){if(t&&t.length>0){e.$container.empty(),e.$container.attr(e._tagName,"");for(let t in e._mixins)e.$container.attr(e._mixins[t]._tagName,"");e.$container.append(t)}return j(e.$container,e)}function D(e,t,n){return new Promise((r=>{let o=A(t,e,n),s=o.length;if(0===s)return r();for(let e=0;e<o.length;e++)U(o[e].dom,o[e].tag,o[e].super,n).then((()=>{if(s--,0===s)return r()}))}))}function V(e,t,n){if(e[0].nodeType!==t[0].nodeType||e.prop("nodeName")!==t.prop("nodeName"))return void t.safeReplace(e);if(3===e[0].nodeType)return void(e[0].nodeValue!==t[0].nodeValue&&(t[0].nodeValue=e[0].nodeValue));!function(e,t){const n=e[0].attributes??[],r=t[0].attributes??[];[...n].forEach((n=>{t.is(`[${n.name}]`)||e.removeAttr(n.name)})),[...r].forEach((t=>{t.name.startsWith("data")||e.attr(t.name)===t.value||e.attr(t.name,t.value)})),Object.entries(t.data()).forEach((([t,n])=>{t!==x&&e.data(t,n)}))}(t,e);const r=e.contents(),o=t.contents(),s=Math.max(r.length,o.length);for(let e=0;e<s;e++)e>=o.length?t.append($(r[e])):e>=r.length?$(o[e]).safeRemove():V($(r[e]),$(o[e]),n)}const B=25e3;class G{constructor(e,t){this.pk=e,this._model=t}set model(e){this._model=e}get model(){return this._model}load(e){if(!this._model)throw new TypeError("Model is not set!!");return e.newModel(this._model,{pk:this.pk})}}const W={get(e,t){const n=e[t]??void 0;if(n instanceof G){if(!n.pk&&0!==n.pk)return null;const e=new Number(n.pk);return e.load=n.load.bind(n),e}return n},set(e,t,n){if(t in e){const r=e[t];r instanceof G?n.hasOwnProperty("pk")?r.pk=n.pk:r.pk=n:e[t]=n}else e[t]=n;return!0}};class K{constructor(e,t={}){this.values_list=[],this.values={},this.model_name=e,this.model_query=t,this._is_connected=!1,this._is_conneting_process=!1,this._auto_reconnect=!0,this.socket=null,this.open_request={},this.on_update=()=>{},this.on_create=()=>{},this.form_id=f()}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.values_list.length?{value:this.values_list[e],done:!1}:{value:null,done:!0})}}length(){return this.values_list.length}byPk(e){if(null!==e){e=parseInt(e),isNaN(e)&&(e=-1);let t=this.values_list.find((t=>t.pk===e));return t||(t=new Proxy({pk:e},W),this.values_list.push(t)),t}return{pk:e}}filter(e){return this.model_query=Object.assign({},this.model_query,e),this}load(){return this.isConnected().then((()=>{const e=f();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}))}listView(e={},t=null,n=null){let r=$('<div class="container-fluid">');return this.isConnected().then((()=>{const o=f();this.socket.send(JSON.stringify({event:"model",event_type:"list_view",event_id:o,args:{model_name:this.model_name,model_query:this.model_query,filter:e}})),this.open_request[o]=[e=>{r.append(e.html),ue.refresh(r),t&&t(e)},e=>{n&&n(e)}]})),r}detailView(e=-1,t=null,n=null){e=parseInt(e),isNaN(e)&&(e=-1);let r,o=$('<div class="container-fluid">');return r=0!==this.values_list.length?this.isConnected():this.load(),r.then((()=>{-1===e&&(e=this.values_list[0].pk);const r=f();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:r,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[r]=[e=>{o.append(e.html),ue.refresh(o),t&&t(e)},e=>{n&&n(e)}]})),o}syncFormToModel(e){return this.syncForm(e)}syncModelToForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));let t=this;e.each((function(){if(!this.hasAttribute("data-model_pk"))return;let e=$(this).data("model_pk"),n=t.byPk(e);for(let e of this.elements){let t=e.name;if(t&&""!==t)if("checkbox"===e.type)e.checked=n[t];else if("file"===e.type&&n[t]instanceof File){let r=new DataTransfer;r.items.add(n[t]),e.files=r}else $(e).val(n[t])}}))}syncForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));const t=this;let n=[];return e.each((function(){let e=$(this).data("model_pk"),r=t.byPk(e);for(let e of this.elements){let t=e.name;t&&""!==t&&("hidden"===e.type?r[t]=(o=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===o.toLowerCase():"undefined"!==o?"none"===o.toLowerCase()?null:o.match(/^-?\d+$/)?parseInt(o):o.match(/^-?\d+\.?\d+$/)?parseFloat(o):o.match(/^(['][^']*['])|(["][^"]*["])$/)?o.substring(1,o.length-1):o:void 0:"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}var o;return n.push(r),r})),this.values_list.length<=1&&n.length>0&&(this.values=n.at(-1)),n}createForm(e=null,t=null){let n=$('<div class="container-fluid">');return this.isConnected().then((()=>{this._getForm(null,"create_form",null,n,e,t)})),n}editForm(e=-1,t=null,n=null){let r;e=parseInt(e),isNaN(e)&&(e=-1),r=0!==this.values_list.length?this.isConnected():this.load();let o=$('<div class="container-fluid">');return r.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"edit_form",null,o,t,n)})),o}namedForm(e=-1,t,n=null,r=null){let o;e=parseInt(e),isNaN(e)&&(e=-1),o=0!==this.values_list.length?this.isConnected():this.load();let s=$('<div class="container-fluid">');return o.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"named_form",t,s,n,r)})),s}_getForm(e,t,n,r,o,s){e=parseInt(e),isNaN(e)&&(e=-1);const i=f();this.socket.send(JSON.stringify({event:"model",event_type:t,event_id:i,args:{model_name:this.model_name,model_query:this.model_query,pk:e,form_name:n}}));const l=null===e||-1===e?"create":"edit";this.open_request[i]=[t=>{r.append(t.html);let n=r.closest("form").addClass(`sdc-model-${l}-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e);n.length>0&&!n[0].hasAttribute("sdc_submit")&&n.attr("sdc_submit","submitModelFormDistributor"),ue.refresh(r),o&&o(t)},e=>{s&&s(e)}]}new(){return new Promise(((e,t)=>{const n=$("<form>").append(this.createForm((()=>{this.syncFormToModel(n),e()}),t))}))}save(e=-1){return e=parseInt(e),isNaN(e)&&(e=-1),this.isConnected().then((()=>{let t;t=e>-1?[this.byPk(e)]:this.values_list;let n=[];return t.forEach((e=>{const t=f();n.push(new Promise(((n,r)=>{this._readFiles(e).then((o=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t),n(e)},r]}))})))})),Promise.all(n)}))}create(e=this.values){const t=f();return this.isConnected().then((()=>new Promise(((n,r)=>{this._readFiles(e).then((o=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t)[0],n(e)},r]}))}))))}delete(e=-1){e=parseInt(e),isNaN(e)&&(e=-1),-1===e&&(e=this.values?.pk);const t=f();return this.isConnected().then((()=>new Promise(((n,r)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[t]=[n,r]}))))}isConnected(){return new Promise(((e,t)=>{if(this._is_connected)e();else if(this._is_conneting_process){const[n,r]=this.open_request._connecting_process;this.open_request._connecting_process=[()=>{n(),e()},()=>{r(),t()}]}else this._is_conneting_process=!0,this.open_request._connecting_process=[()=>{},()=>{}],this._connectToServer().then((()=>{e(this._checkConnection())}))}))}close(){this.socket&&(this._auto_reconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket)}clean(){return this.values_list=[],this.values={},this}_readFiles(e){let t=[],n={};for(const[r,o]of Object.entries(e))o instanceof File&&t.push(new Promise(((e,t)=>{((r,o)=>{let s=new FileReader;s.onload=s=>{const i=f();this.open_request[i]=[e,t];let l=s.target.result,a=parseInt(Math.ceil(l.length/B));n[r]={id:i,file_name:o.name,field_name:r,content_length:o.size};for(let e=0;e<a;++e)this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:i,args:{chunk:l.slice(B*e,B*(e+1)),idx:e,number_of_chunks:a,file_name:o.name,field_name:r,content_length:o.size,content_type:o.type,model_name:this.model_name,model_query:this.model_query}}))},s.onerror=()=>{t()},s.readAsBinaryString(o)})(r,o)})));return Promise.all(t).then((()=>n))}_onMessage(e){let t=JSON.parse(e.data);if(t.is_error)this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][1](t),delete this.open_request[t.event_id]),(t.msg||t.header)&&q("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),delete this.open_request._connecting_process,this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&q("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),delete this.open_request._connecting_process;else if("load"===t.type){const e=JSON.parse(t.args.data);this.values_list=[],t.args.data=this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=this._parseServerRes(e);n="on_create"===t.type?this.on_create:this.on_update,n(r),t.args.data=r}let e=t.data?.instance;e&&(t.data.instance=JSON.parse(t.data.instance)),this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][0](t),delete this.open_request[t.event_id])}}_connectToServer(){return new Promise((e=>{const t=`${this.model_name}`+(this.model_id>0?`/${this.model_id}`:"");"https:"===window.location.protocol?this.socket=new WebSocket(`wss://${window.location.host}/sdc_ws/model/${t}`):this.socket=new WebSocket(`ws://${window.location.host}/sdc_ws/model/${t}`),this.socket.onmessage=this._onMessage.bind(this),this.socket.onclose=e=>{console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`),this._is_connected=!1;for(const[t,n]of Object.entries(this.open_request))n[1](e);this.open_request={},setTimeout((()=>{this._auto_reconnect&&this._connectToServer().then((()=>{}))}),1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._is_connected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}}))}_checkConnection(){const e=f();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}_parseServerRes(e){let t=[];for(let n of e){const e=n.pk,r=this.byPk(e);for(const[e,t]of Object.entries(n.fields))t&&"object"==typeof t&&t.__is_sdc_model__?r[e]=new G(t.pk,t.model):r[e]=t;t.push(r)}return 1===this.values_list.length?this.values=this.values_list.at(-1):this.values={},t}}let H=!1,Z=!1,z=null,X={};function Q(){return window.SERVER_CALL_VIA_WEB_SOCKET?new Promise((e=>H?e():Z?void setTimeout((()=>{Q().then((()=>{e()}))}),200):e(ee()))):Promise.resolve(!0)}function Y(){window.SERVER_CALL_VIA_WEB_SOCKET&&function(){if(H){H=!1;try{z.close()}catch(e){}}}()}function ee(){return Z=!0,new Promise((e=>{z="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),z.onmessage=function(e){te(JSON.parse(e.data))},z.onclose=function(){H&&console.error("SDC Socket closed unexpectedly"),H=!1;for(const[e,t]of Object.entries(X))t[1]({}),delete X[e];setTimeout((()=>{ee()}),1e3)},z.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),H)try{z.close()}catch(e){}},z.onopen=function(){H=!0,Z=!1,e()}}))}function te(e){if(e||(e={}),e.is_error)(e.msg||e.header)&&q("pushErrorMsg",e.header||"",e.msg||""),e.id&&X[e.id]&&(X[e.id][1](e.data||null),delete X[e.id]);else if((e.msg||e.header)&&q("pushMsg",e.header||"",e.msg||""),e.type&&"sdc_recall"===e.type)e.id&&X[e.id]&&(X[e.id][0](e.data),delete X[e.id]);else if(e.type&&"sdc_event"===e.type){let t=e.event;t&&q(t,e.payload)}else e.type&&"sdc_redirect"===e.type&&q("onNavLink",e.link)}class ne{constructor(){this._uuid=f(),this.contentUrl="",this.contentReload=!1,this.events=[],this.load_async=!1,this._isEventsSet=!1,this._allEvents=null,this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName="",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){ue.DEBUG&&console.debug(e,this._tagName);let n=[];if(!this._isMixin){this._isMixin=!0;for(let r in this._mixins){let o=this._mixins[r];"function"==typeof o[e]&&n.push(o[e].apply(this,t))}return Promise.all(n).then((()=>{this._isMixin=!1}))}}onInit(){ue.DEBUG&&console.DEBUG(Array.apply(null,arguments),this._tagName)}get parentController(){return this._parentController}get childController(){return this._childController}onLoad(){return this._runLifecycle("onLoad",arguments)}willShow(){return this._runLifecycle("willShow",arguments)}onRefresh(){return this._runLifecycle("onRefresh",arguments)}onRemove(){return this._runLifecycle("onRemove",arguments),!0}remove(){for(const e of this._models)e.close();let e=this._childController;for(let t in e)if(e.hasOwnProperty(t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){R(this);const e=a(this._tagName);if(this._parentController._childController[e]){let t=this._parentController._childController[e];for(let e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)}return this.$container.remove(),!0}return!1}controller_name(){return this._tagName.replace(/-./g,(e=>` ${e[1].toUpperCase()}`)).replace(/^./g,(e=>`${e.toUpperCase()}`))}addEvent(e,t,n){this.getEvents(),this._allEvents[e]=this._allEvents[e]||{},this._allEvents[e][t]=n}getEvents(){if(this._allEvents)return this._allEvents;let e=[];e=e.concat(this.events);for(let t in this._mixins){let n=this._mixins[t];Array.isArray(n.events)&&(e=e.concat(n.events))}return this._allEvents=_.merge(...e)}post(e,t){return ue.post(this,e,t)}get(e,t){return ue.get(this,e,t)}submitForm(e,t,n){return ue.submitFormAndUpdateView(this,e,t,n)}serverCall(e,t){let n=this.contentUrl.match(/sdc_view\/([^/]+)/i);if(n&&!(n.length<2))return function(e,t,n,r,o){return window.SERVER_CALL_VIA_WEB_SOCKET?function(e,t,n,r){let o=f();return Q().then((()=>{z.send(JSON.stringify({event:"sdc_call",id:o,controller:t,app:e,function:n,args:r}))})),new Promise(((e,t)=>{X[o]=[e,t]}))}(e,t,r,o):function(e,t,n){return"object"!=typeof n&&Array.isArray(n)&&null===n&&(n={arg0:n}),n={data:JSON.stringify(n),_sdc_func_name:t,_method:"sdc_server_call"},$.post({url:e,data:n,beforeSend:function(e,t){e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}}).then((e=>{const t=e._return_data;return te(t),t})).catch((e=>{const t=e.responseJSON;throw t.is_error=!0,te(t),e}))}(n,r,o)}(n[1],this._tagName,this.parsedContentUrl,e,t);console.error("To use the serverCall function the contentUrl must be set: "+this.name)}newModel(e,t={}){if(e instanceof Number&&e.hasOwnProperty("load"))return e.load(this);const n=new K(e,t);return this._models.push(n),n}updateModel(e,t={},n){let r=new K(e,t);return r.load().then((()=>{r.values|=n,r.save().then((()=>(r.close(),r.values)))}))}find(e){return this.$container.find(e)}refresh(){return ue.refresh(this.$container,this)}reload(){return ue.reloadController(this)}reconcile(e,t=null){return ue.reconcile(this,e,t)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}iterateAllChildren(){let e=this._childController,t=[];for(let n in e)if(e.hasOwnProperty(n))for(let r of e[n])t.push(r),t.push(...r.iterateAllChildren());return t}defaultSubmitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let r=e.data("model");const o=r.syncForm(e);for(let t of o)n.push(new Promise(((n,o)=>{let s;s=null!==t.pk&&t.pk>=0?r.save(t.pk):r.create(t),s.then((t=>{m(e),this.submit_model_form_success&&this.submit_model_form_success(t[0]);for(const e of this.iterateAllChildren())e.submit_model_form_success&&e.submit_model_form_success(t[0]);n(t)})).catch((t=>{p(e,$(t.html)),this.submit_model_form_error&&this.submit_model_form_error(t);for(const e of this.iterateAllChildren())e.submit_model_form_error&&e.submit_model_form_error(t);o(t)}))})))}return Promise.all(n).then((e=>Object.assign({},...e.flat())))}}const re=["onbeforeunload"],oe=Object.keys(window).filter((e=>/^on/.test(e)&&!re.includes(e))).map((e=>e.slice(2)));function se(e){let t=e.type;e.hasOwnProperty("namespace")&&e.namespace&&e.namespace.length&&(t+=`.${e.namespace}`);let n=$(e.target),r=null,o=!1,s=!1;for(e.stopImmediatePropagation=()=>s=!0,e.stopPropagation=()=>s=o=!0;n.length;){let i=n.attr(`sdc_${t}`);if(i){if(!r&&(r=M(n),!r))return;for(;r;){if(i.split(" ").forEach((s=>{if(o)return;let i=null;if("function"==typeof s)i=s;else if("function"==typeof r[s])i=r[s];else if("string"==typeof s&&s.startsWith("this.event_")){if(i=r.getEvents()[t],!i)return;if(i=i[s.slice(11)],!i)return}i&&i.call(r,n,e)})),s)return;r=r._parentController}}if(o)return;n=n.parent()}return{res:!0}}function ie(e){if(e._isEventsSet)return;const t=e.getEvents();for(let n in t)if(t.hasOwnProperty(n)){let r=t[n];for(let t in r)r.hasOwnProperty(t)&&e.find(t).each((function(){let e=$(this),r=e.attr(`sdc_${n}`)||null;r=r?r.split(" "):[];const o=`this.event_${t}`;-1===r.indexOf(o)&&(r.push(o),e.attr(`sdc_${n}`,r.join(" ")))}))}}const le={classname:"class"};window.sdcDom=function(e,t,...n){if(!e)return"";const r=function(e,t){let n,r=!1;if("string"==typeof e)n=$(document.createElement(e));else{const t=`this.${e.name}`;n=$(document.createElement(t)),n.data("handler",e),r=!0}return t&&Object.entries(t).forEach((([e,t])=>{e.startsWith("on")?n[0].addEventListener(e.substring(2).toLowerCase(),t):(le[e.toLowerCase()]&&(e=le[e.toLowerCase()]),n[0].setAttribute(e,t))})),r&&n.addClass("_bind_to_update_handler _with_handler"),n}(e,t);for(const e of n)r.append(e);return r};let ae,ce,ue={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:v,rootController:null,_isInit:!1,_origin_trigger:null,init_sdc:()=>{ue._isInit||(ue._isInit=!0,ue._origin_trigger?Y():(ue._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return oe.includes(t)||(oe.push(t),$(window).on(t,se)),ue._origin_trigger.call(this,e)},ue.updateJquery()),Q(),function(){const e=$(window);oe.forEach((t=>{e.off(t).on(t,se)}))}(),ue.rootController=ue.rootController||new ne),ue.tagNames=Object.keys(w);for(let[e,t]of Object.entries(ue.Global))t.$container||(v[e].$container=s());return D(ue.tagNames,s(),ue.rootController)},updateJquery:()=>{$.fn.safeReplace=function(e){return ue.safeReplace($(this),e)},$.fn.safeEmpty=function(){return ue.safeEmpty($(this))},$.fn.safeRemove=function(){return ue.safeRemove($(this))}},controllerToTag:e=>l(e.name).replace(/-controller$/,""),registerGlobal:e=>{let t=ue.controllerToTag(e),n=new e;w[t]=[n,[]],n._tagName=t,window[a(t)]=v[a(t)]=n},cleanCache:()=>{F={}},register:e=>{let t=ue.controllerToTag(e);return w[t]=[e,[]],e.prototype._tagName=t,{addMixin:(...e)=>{for(let n of e){let e;"string"==typeof n?e=l(n):n&&(e=ue.controllerToTag(n)),w[t][1].push(e)}}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=ue.CSRF_TOKEN,ue.ajax(e,t,params,$.post)),get:(e,t,n)=>ue.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=ue.VERSION,n._method=n._method||"api";const o=new Promise(((s,i)=>r(t,n).then(((t,n,r)=>{s(t,n,r),"redirect"===t.status?q("onNavLink",t["url-link"]):o.then((()=>{ue.refresh(e.$container)}))})).catch(i)));return o},submitFormAndUpdateView:(e,t,n,r)=>{let o=new FormData(t);const s=e=>{e["url-link"]?q("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise(((l,a)=>{u(o,n||t.action,r||t.method).then(((t,n,r)=>{l(t,n,r),"redirect"===t.status?s(t):i.then((()=>{ue.refresh(e.$container)}))})).catch(((e,t,n)=>{301===e.status?(e=e.responseJSON,s(e),l(e,t,n)):a(e,t,n)}))}));return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise(((o,s)=>{u(r,t||e.action,n||e.method).then(o).catch(s)}))},getController:e=>M(e),safeEmpty:e=>(e.children().each((function(e,t){let n=$(t);ue.safeRemove(n)})),e),safeReplace:(e,t)=>(t.insertBefore(e),ue.safeRemove(e)),safeRemove:e=>(e.each((function(){let e=$(this);e.data(`${x}`)&&e.data(`${x}`).remove()})),e.find(`.${T}`).each((function(){const e=$(this).data(`${x}`);e&&e.remove()})),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=I(e,e.contentUrl);return e.contentUrl=t.url,L(e.contentUrl,t.args,e._tagName,e.contentReload)}return new Promise((e=>{e($())}))}(e).then((t=>{let n=$(t);return ue.reconcile(e,n)})),reconcile:(e,t,n=null)=>{if(!n){let n=e.$container.clone().empty();n.append(t),t=n}return n=n??e.$container,ue.refresh(t,e,!0).then((()=>{var r;return V(t,n,e),(r=e)._childController={},r.find(`.${T}`).each((function(){const e=M($(this));e===r&&C(r,e)})),e}))},refresh:(e,t,n=!1)=>{if(t||(t=ue.getController(e)),!t)return i();let r=t,o=[];for(;r;)r._isEventsSet=!1,o.unshift(r),r=r._parentController;return e??=t.$container,D(ue.tagNames,e,t).then((()=>{(function(e,t){return function(e,t){const n=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each((function(){const t=$(this);let r;if(t.hasClass("_with_handler"))r=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(r=e[t])}"function"==typeof r&&(r=r.bind(e)(t.data())),void 0!==r&&n.push(Promise.resolve(r).then((n=>{let r=$("<div></div>");return r.append(n),r=t.clone().empty().append(r),e.reconcile(r,t)})))})),Promise.all(n)}(e,t??e.$container)})(t,e).then((()=>{for(let e of o)ie(e);!n&&t.onRefresh(e)}))}))}};function de(){if(!jest)throw new Error("JEST is not defined");ae||(ce=$.ajax.bind($),ae=jest.spyOn($,"ajax"),ae.mockImplementation((function(e){return ce(e).then((e=>e)).catch((e=>e))})))}const he=Y,fe={get_controller:async function(e,t={},n=""){de();const r=$("body");ue.updateJquery(),r.safeEmpty();const o=$(`<${e}>${n}</${e}>`);for(const[e,n]of Object.entries(t))o.data(e,n);const s=$("<div></div>").append(o);return r.append(s),ue._isInit=!1,ue.cleanCache(),await ue.init_sdc(),ue.getController(o)},getCsrfToken:function(){return function(e){if(document.cookie&&""!==document.cookie){const t=document.cookie.split(";");for(let n=0;n<t.length;n++){const r=t[n].trim();if(r.substring(0,10)===e+"=")return decodeURIComponent(r.substring(10))}}return""}("csrftoken")},controllerFromTestHtml:async function(e){de();const t=$("body");return ue.updateJquery(),t.safeEmpty().append(e),ue._isInit=!1,ue.cleanCache(),await ue.init_sdc(),ue.rootController.iterateAllChildren()}};var _e=t.n$,me=t.du,pe=t.yA,ge=t.g3,ye=t.u2,ve=t.n9,we=t.on,$e=t.yy,Ce=t.R6,be=t.$n,Oe=t.hA,ke=t.VB,Se=t.hZ;export{_e as AbstractSDC,me as allOff,pe as app,ge as checkIfParamNumberBoolOrString,ye as clearErrorsInForm,ve as controllerFactory,we as on,$e as runControlFlowFunctions,Ce as setErrorsInForm,be as setEvent,Oe as socketReconnect,ke as test_utils,Se as trigger};
|
1
|
+
var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n;e.d(t,{n$:()=>oe,du:()=>R,yA:()=>he,g3:()=>d,u2:()=>f,n9:()=>b,on:()=>P,yy:()=>k,R6:()=>m,$n:()=>S,hA:()=>fe,VB:()=>_e,hZ:()=>q});const r=/([^\s,]+)/g,o=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function s(){return n||(n=$("body")),n}function i(){return new Promise((function(e){e()}))}function l(e){return(e=(e=e.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))).replace(/[0-9]+/g,(e=>`-${e}`))).replace(/^[-]/g,"")}function a(e){return e.replace(/-./g,(e=>`${e[1].toUpperCase()}`))}const c=(e,t)=>{let n=t,r=Object.getOwnPropertyNames(e.prototype).concat(Object.getOwnPropertySymbols(e.prototype));for(;""!==n.name;)Object.getOwnPropertyNames(n.prototype).concat(Object.getOwnPropertySymbols(n.prototype)).forEach((t=>{t.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)||r.includes(t)||(r.push(t),Object.defineProperty(e.prototype,t,Object.getOwnPropertyDescriptor(n.prototype,t)))})),n=Object.getPrototypeOf(n)};function u(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",h,!1),e},data:e,cache:!1,contentType:!1,processData:!1,beforeSend:function(e,t){(function(e){return/^(GET|HEAD|OPTIONS|TRACE)$/.test(e)})(t.type)||this.crossDomain||e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}})}function h(e){if(e.lengthComputable){var t=Math.round(e.loaded/e.total*100),n=$(".progress-container");100===t?n.hide():n.show(),t+="%",n.find(".progress-bar").css({width:t}).text(t)}}function d(e,t=null){return"string"!=typeof e?e:t&&void 0!==t[e]?"function"==typeof t[e]?t[e].bind(t):t[e]:e.match(/^(true|false)$/)?"true"===e:"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substr(1,e.length-2):e:void 0}function p(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function f(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function m(e,t){t=$("<div>").append(t),e.find(".has-error").removeClass("has-error").find(".alert-danger").safeRemove(),e.find(".non-field-errors").safeRemove();let n=t.find("input[type=file]").parent();e.find("input[type=file]").parent().each((function(e){$(this).replaceWith(n[e])}));let r=0===t.find(".non-field-errors").insertAfter(e.find(".hidden-form-fields")).length;return t.find(".has-error").each((function(){r=!1;let t=$(this),n=t.data("auto-id"),o=e.find(".form-group."+n);o.addClass("has-error"),o.find(".form-input-container").append(t.find(".alert-danger"))})),r}function g(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),o={};for(let t in r)r.hasOwnProperty(t)&&t!==F&&!e.includes(t)&&(o[t]=r[t]);n=[];for(let t=0;t<e.length;t++){let o=e[t];r.hasOwnProperty(o)?n.push(r[o]):n.push("undefined")}return n.push(o),n}(e,t);return function(e,t=null){let n=[];for(let r=0;r<e.length;r++){let o=d(e[r],t);n.push(o)}return n}(r,n)}function y(e,t,n){if(!e)return!1;if("function"!=typeof e.onInit)return!1;let s;var i;"function"==typeof e._on_init_params?s=e._on_init_params():s=(i=e.onInit.toString().replace(o,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(r)||[];let l=g(s,t,n._parentController);if(e.onInit.apply(n,l),n===e)for(let r in e._mixins)y(e._mixins[r],t,n)}let v={},w={};function O(e,t){if(e){let n=a(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function C(e,t,n,r){let o=[];r=function(e,t){e=(e=e.concat(w[t][1])).filter(((e,t,n)=>n.indexOf(e)===t));let n=!0;for(;n;){n=!1;for(let t of e)for(let r of w[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)o.push(w[e][0]);let s=new(function(e,...t){let n={[e.name]:class{constructor(...n){let r={};t.forEach((e=>{let t;Object.assign(this,t=new e),t._tagName=e.prototype._tagName,t._isMixin=!0,r[e.name]=t})),Object.assign(this,new e),this._mixins=r}static get name(){return e.name}static className(){return this.name}get mixins(){return this._mixins}}}[e.name];return c(n,e),t.forEach((e=>{c(n,e)})),n}(w[n][0],...o));return s._tagName=n,O(e,s),s.$container=t,function(e,t){y(t,e,t)}(t,s),s}function b(e,t,n,r){let o=a(n);if(v[o]){let n=v[o];return O(e,n),n.$container=t,n}return C(e,t,n,r)}function k(e){const t=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=L(e,e.contentUrl),e.contentUrl=t.url),Promise.all([j(e.contentUrl,t.args,e._tagName,e.contentReload)]).then((function(e){let t=e[0];if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null}))}(e).then((t=>!e.onLoad||e._onLoadDone?t:(e._onLoadDone=!0,(e.onLoad(t)||i()).then((()=>t)))))}(e).then((function(t){return function(e,t){return J(e,t).then((function(t){if(t=t||!0,e.willShow){let n=e.willShow();if(n instanceof Promise)return n.then((function(){return t}))}return t}))}(e,t)})).then((()=>function(e){return e.refresh&&e.refresh()}(e))).catch((function(t){return J(e,t)}));return e.load_async?Promise.resolve():t}let N={},E={};function P(e,t){return S(e),E.hasOwnProperty(e)?t[E[e]]?void N[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function S(e,t){t||(t=e),E[e]||(E[e]=t,N[e]=[])}function R(e){for(let t in N)if(N.hasOwnProperty(t))for(let n=N[t].length;n>=0;n--)e===N[t][n]&&N[t].splice(n,1)}function q(e){let t=Array.apply(null,arguments);if(e=t.shift(),!N.hasOwnProperty(e)||!E.hasOwnProperty(e))return i();let n=N[e],r=E[e],o=[];for(let e=0;e<n.length;e++){let s=n[e][r].apply(n[e],t);void 0!==s&&o.push(s)}return Promise.all(o)}let x={};const F="_controller_",T="_sdc_controller_";function A(e,t,n){if(!e)return[];let r=e.children(),o=[];return r.each((function(e,r){let s=$(r),i=s.prop("tagName").toLowerCase().split("_");$.inArray(i[0],t)>=0?o.push({tag:i[0],super:i.splice(1)||[],dom:s}):i[0].startsWith("this.")?s.addClass(`_bind_to_update_handler sdc_uuid_${n._uuid}`):o=o.concat(A(s,t,n))})),o}function j(e,t,n,r){return e?x[n]?Promise.resolve(x[n]):(t.VERSION=he.VERSION,t._method="content",$.get(e,t).then((function(e){return r||(x[n]=e),e})).catch((function(e){throw 301===e.status&&q("_RedirectOnView",e.responseJSON["url-link"]),q("navLoaded",{controller_name:()=>e.status}),`<sdc-error data-code="${e.status}">${e.responseText}</sdc-error>`}))):Promise.resolve(!1)}function I(e,t){return t=t||e.data(F),D(he.tagNames,e,t)}function L(e){let t=e.contentUrl;if(e&&0===e._urlParams.length){let n,r=/%\(([^)]+)\)\w/gm;for(e._urlParams=[];n=r.exec(t);)e._urlParams.push(n[1]),e.contentReload=!0}let n=function(e,t){return g(e._urlParams,t)}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(e._urlParams.hasOwnProperty(r)){let o=e._urlParams[r],s=RegExp("%\\("+o+"\\)\\w","gm");t=t.replace(s,""+n.shift())}return t}(e,t,n)),e.parsedContentUrl=t,{url:t,args:n[n.length-1]}}function M(e){return e.hasClass(T)?e.data(`${F}`):e.closest(`.${T}`).data(`${F}`)}function U(e,t,n,r){let o=e.data(F);return o?I(e,o):(o=b(r,e,t,n),e.data(F,o),e.addClass(T),k(o))}function J(e,t){if(t&&t.length>0){e.$container.empty(),e.$container.attr(e._tagName,"");for(let t in e._mixins)e.$container.attr(e._mixins[t]._tagName,"");e.$container.append(t)}return I(e.$container,e)}function D(e,t,n){return new Promise((r=>{let o=A(t,e,n),s=o.length;if(0===s)return r();for(let e=0;e<o.length;e++)U(o[e].dom,o[e].tag,o[e].super,n).then((()=>{if(s--,0===s)return r()}))}))}function V(e,t=[],n=null){t.push(function(e){if(3===e[0].nodeType)return`TEXT__${e[0].nodeValue}`;const t=[e[0].tagName];return"INPUT"===e[0].nodeName&&[["name",""],["type","text"],["id",""]].forEach((([n,r])=>{const o=e.attr(n)??r;o&&t.push(o)})),t.join("__")}(e));const r={$element:e,id:t.join("::"),depth:t.length,idx:0,op:null,parent:n};return[r].concat(e.contents().toArray().map((e=>V($(e),t.slice(),r))).flat())}function B(e,t){const n=V(t),r=V(e);n.map(((e,t)=>e.idx=t)),r.map(((e,t)=>e.idx=t));const o=Math.max(...r.concat(n).map((e=>e.depth))),s=G(n,r,o);let i=0,l=[];s.forEach((e=>{const{op:t,$element:n,idx:r}=e;if("keep_counterpart"===t.type){if(t.counterpart.idx+i!==r){const n=e.getBefore();n?t.counterpart.$element.insertAfter(n.$element):e.getRealParent().$element.prepend(t.counterpart.$element)}!function(e,t){const n=e[0].attributes??[],r=t[0].attributes??[];[...n].forEach((n=>{t.is(`[${n.name}]`)||e.removeAttr(n.name)})),[...r].forEach((t=>{t.name.startsWith("data")||e.attr(t.name)===t.value||e.attr(t.name,t.value)})),Object.entries(t.data()).forEach((([t,n])=>{e.data(t,n)}))}(t.counterpart.$element,n),n.hasClass(T)&&(n.data(F).$container=t.counterpart.$element,n.data(F,null)),l.push(n)}else if("delete"===t.type)n.safeRemove(),i--;else if("insert_ignore"===t.type)i++;else if("insert"===t.type){i++;const{after:t,target:r}=e.op;t?n.insertAfter(t.$element):r&&r.$element.prepend(n)}})),l.forEach((e=>e.safeRemove()))}function G(e,t,n){return t.filter((e=>e.depth===n&&!e.op)).forEach((t=>{const n=e.find((e=>!e.op&&e.id===t.id));if(n){const e=(t,n)=>{t.op={type:"keep",idx:n.idx},n.op={type:"keep_counterpart",counterpart:t},(t=t.parent)&&!t.op&&(n=n.parent,e(t,n))};e(n,t)}})),n>1?G(e,t,n-1):(e.forEach(((t,n)=>{if(!t.op){const r=(e[n-1]?.op.idx??-1)+1;t.op={type:"delete",idx:r}}})),t.forEach(((e,n)=>{if(e.getBefore=()=>function(e,n){const r=e.depth;for(;n>=0&&e.depth>=r;)if((e=t[n-=1]).depth===r)return"keep_counterpart"===e.op.type?e.op.counterpart:e;return null}(e,n),e.getRealParent=()=>{return(t=e).parent?"keep_counterpart"===t.parent.op.type?t.parent.op.counterpart:t.parent:null;var t},!e.op){const t=e.getRealParent(),n="insert"===t?.op.type?"insert_ignore":"insert";e.op={type:n,target:t,after:e.getBefore()}}})),[...e,...t].sort(((e,t)=>(e.op?.idx??e.idx)-(t.op?.idx??t.idx))))}const W=25e3;class K{constructor(e,t){this.pk=e,this._model=t}set model(e){this._model=e}get model(){return this._model}load(e){if(!this._model)throw new TypeError("Model is not set!!");return e.newModel(this._model,{pk:this.pk})}}const H={get(e,t){const n=e[t]??void 0;if(n instanceof K){if(!n.pk&&0!==n.pk)return null;const e=new Number(n.pk);return e.load=n.load.bind(n),e}return n},set(e,t,n){if(t in e){const r=e[t];r instanceof K?n.hasOwnProperty("pk")?r.pk=n.pk:r.pk=n:e[t]=n}else e[t]=n;return!0}};class X{constructor(e,t={}){this._onNoOpenRequests=[],this.values_list=[],this.values={},this.model_name=e,this.model_query=t,this._is_connected=!1,this._is_conneting_process=!1,this._auto_reconnect=!0,this.socket=null,this.open_request={},this.on_update=()=>{},this.on_create=()=>{},this.form_id=p()}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.values_list.length?{value:this.values_list[e],done:!1}:{value:null,done:!0})}}length(){return this.values_list.length}byPk(e){if(null!==e){e=parseInt(e),isNaN(e)&&(e=-1);let t=this.values_list.find((t=>t.pk===e));return t||(t=new Proxy({pk:e},H),this.values_list.push(t)),t}return{pk:e}}filter(e){return this.model_query=Object.assign({},this.model_query,e),this}load(){return this.isConnected().then((()=>{const e=p();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}))}listView(e={},t=null,n=null){let r=$('<div class="container-fluid">');return this.isConnected().then((()=>{const o=p();this.socket.send(JSON.stringify({event:"model",event_type:"list_view",event_id:o,args:{model_name:this.model_name,model_query:this.model_query,filter:e}})),this.open_request[o]=[e=>{r.append(e.html),he.refresh(r),t&&t(e)},e=>{n&&n(e)}]})),r}detailView(e=-1,t=null,n=null){e=parseInt(e),isNaN(e)&&(e=-1);let r,o=$('<div class="container-fluid">');return r=0!==this.values_list.length?this.isConnected():this.load(),r.then((()=>{-1===e&&(e=this.values_list[0].pk);const r=p();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:r,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[r]=[e=>{o.append(e.html),he.refresh(o),t&&t(e)},e=>{n&&n(e)}]})),o}syncFormToModel(e){return this.syncForm(e)}syncModelToForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));let t=this;e.each((function(){if(!this.hasAttribute("data-model_pk"))return;let e=$(this).data("model_pk"),n=t.byPk(e);for(let e of this.elements){let t=e.name;if(t&&""!==t)if("checkbox"===e.type)e.checked=n[t];else if("file"===e.type&&n[t]instanceof File){let r=new DataTransfer;r.items.add(n[t]),e.files=r}else $(e).val(n[t])}}))}syncForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));const t=this;let n=[];return e.each((function(){let e=$(this).data("model_pk"),r=t.byPk(e);for(let e of this.elements){let t=e.name;t&&""!==t&&("hidden"===e.type?r[t]=(o=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===o.toLowerCase():"undefined"!==o?"none"===o.toLowerCase()?null:o.match(/^-?\d+$/)?parseInt(o):o.match(/^-?\d+\.?\d+$/)?parseFloat(o):o.match(/^(['][^']*['])|(["][^"]*["])$/)?o.substring(1,o.length-1):o:void 0:"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}var o;return n.push(r),r})),this.values_list.length<=1&&n.length>0&&(this.values=n.at(-1)),n}createForm(e=null,t=null){let n=$('<div class="container-fluid">');return this.isConnected().then((()=>{this._getForm(null,"create_form",null,n,e,t)})),n}editForm(e=-1,t=null,n=null){let r;e=parseInt(e),isNaN(e)&&(e=-1),r=0!==this.values_list.length?this.isConnected():this.load();let o=$('<div class="container-fluid">');return r.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"edit_form",null,o,t,n)})),o}namedForm(e=-1,t,n=null,r=null){let o;e=parseInt(e),isNaN(e)&&(e=-1),o=0!==this.values_list.length?this.isConnected():this.load();let s=$('<div class="container-fluid">');return o.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"named_form",t,s,n,r)})),s}_getForm(e,t,n,r,o,s){e=parseInt(e),isNaN(e)&&(e=-1);const i=p();this.socket.send(JSON.stringify({event:"model",event_type:t,event_id:i,args:{model_name:this.model_name,model_query:this.model_query,pk:e,form_name:n}}));const l=null===e||-1===e?"create":"edit";this.open_request[i]=[t=>{r.append(t.html);let n=r.closest("form").addClass(`sdc-model-${l}-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e);n.length>0&&!n[0].hasAttribute("sdc_submit")&&n.attr("sdc_submit","submitModelFormDistributor"),he.refresh(r),o&&o(t)},e=>{s&&s(e)}]}new(){return new Promise(((e,t)=>{const n=$("<form>").append(this.createForm((()=>{this.syncFormToModel(n),e()}),t))}))}save(e=-1){return e=parseInt(e),isNaN(e)&&(e=-1),this.isConnected().then((()=>{let t;t=e>-1?[this.byPk(e)]:this.values_list;let n=[];return t.forEach((e=>{const t=p();n.push(new Promise(((n,r)=>{this._readFiles(e).then((o=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t),n(e)},r]}))})))})),Promise.all(n)}))}create(e=this.values){const t=p();return this.isConnected().then((()=>new Promise(((n,r)=>{this._readFiles(e).then((o=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t)[0],n(e)},r]}))}))))}delete(e=-1){e=parseInt(e),isNaN(e)&&(e=-1),-1===e&&(e=this.values?.pk);const t=p();return this.isConnected().then((()=>new Promise(((n,r)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[t]=[n,r]}))))}isConnected(){return new Promise(((e,t)=>{if(this._is_connected)e();else if(this._is_conneting_process){const[n,r]=this.open_request._connecting_process;this.open_request._connecting_process=[()=>{n(),e()},()=>{r(),t()}]}else this._is_conneting_process=!0,this.open_request._connecting_process=[()=>{},()=>{}],this._connectToServer().then((()=>{e(this._checkConnection())}))}))}close(){this.socket&&(this._auto_reconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket)}clean(){return this.values_list=[],this.values={},this}_readFiles(e){let t=[],n={};for(const[r,o]of Object.entries(e))o instanceof File&&t.push(new Promise(((e,t)=>{((r,o)=>{let s=new FileReader;s.onload=s=>{const i=p();this.open_request[i]=[e,t];let l=s.target.result,a=parseInt(Math.ceil(l.length/W));n[r]={id:i,file_name:o.name,field_name:r,content_length:o.size};for(let e=0;e<a;++e)this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:i,args:{chunk:l.slice(W*e,W*(e+1)),idx:e,number_of_chunks:a,file_name:o.name,field_name:r,content_length:o.size,content_type:o.type,model_name:this.model_name,model_query:this.model_query}}))},s.onerror=()=>{t()},s.readAsBinaryString(o)})(r,o)})));return Promise.all(t).then((()=>n))}_onMessage(e){let t=JSON.parse(e.data);if(t.is_error)this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][1](t),this._closeOpenRequest(t.event_id)),(t.msg||t.header)&&q("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),this._closeOpenRequest("_connecting_process"),this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&q("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),this._closeOpenRequest("_connecting_process");else if("load"===t.type){const e=JSON.parse(t.args.data);this.values_list=[],t.args.data=this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=this._parseServerRes(e);n="on_create"===t.type?this.on_create:this.on_update,n(r),t.args.data=r}let e=t.data?.instance;e&&(t.data.instance=JSON.parse(t.data.instance)),this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][0](t),this._closeOpenRequest(t.event_id))}}noOpenRequests(){return new Promise((e=>{if(0===Object.keys(this.open_request).length)return e();this._onNoOpenRequests.push(e)}))}_closeOpenRequest(e){delete this.open_request[e],0===Object.keys(this.open_request).length&&(this._onNoOpenRequests.forEach((e=>e())),this._onNoOpenRequests=[])}_connectToServer(){return new Promise((e=>{const t=`${this.model_name}`+(this.model_id>0?`/${this.model_id}`:"");"https:"===window.location.protocol?this.socket=new WebSocket(`wss://${window.location.host}/sdc_ws/model/${t}`):this.socket=new WebSocket(`ws://${window.location.host}/sdc_ws/model/${t}`),this.socket.onmessage=this._onMessage.bind(this),this.socket.onclose=e=>{console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`),this._is_connected=!1;for(const[t,n]of Object.entries(this.open_request))n[1](e);this.open_request={},setTimeout((()=>{this._auto_reconnect&&this._connectToServer().then((()=>{}))}),1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._is_connected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}}))}_checkConnection(){const e=p();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}_parseServerRes(e){let t=[];for(let n of e){const e=n.pk,r=this.byPk(e);for(const[e,t]of Object.entries(n.fields))t&&"object"==typeof t&&t.__is_sdc_model__?r[e]=new K(t.pk,t.model):r[e]=t;t.push(r)}return 1===this.values_list.length?this.values=this.values_list.at(-1):this.values={},t}}let Z=!1,z=!1,Q=null,Y={};function ee(){return window.SERVER_CALL_VIA_WEB_SOCKET?new Promise((e=>Z?e():z?void setTimeout((()=>{ee().then((()=>{e()}))}),200):e(ne()))):Promise.resolve(!0)}function te(){window.SERVER_CALL_VIA_WEB_SOCKET&&function(){if(Z){Z=!1;try{Q.close()}catch(e){}}}()}function ne(){return z=!0,new Promise((e=>{Q="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),Q.onmessage=function(e){re(JSON.parse(e.data))},Q.onclose=function(){Z&&console.error("SDC Socket closed unexpectedly"),Z=!1;for(const[e,t]of Object.entries(Y))t[1]({}),delete Y[e];setTimeout((()=>{ne()}),1e3)},Q.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),Z)try{Q.close()}catch(e){}},Q.onopen=function(){Z=!0,z=!1,e()}}))}function re(e){if(e||(e={}),e.is_error)(e.msg||e.header)&&q("pushErrorMsg",e.header||"",e.msg||""),e.id&&Y[e.id]&&(Y[e.id][1](e.data||null),delete Y[e.id]);else if((e.msg||e.header)&&q("pushMsg",e.header||"",e.msg||""),e.type&&"sdc_recall"===e.type)e.id&&Y[e.id]&&(Y[e.id][0](e.data),delete Y[e.id]);else if(e.type&&"sdc_event"===e.type){let t=e.event;t&&q(t,e.payload)}else e.type&&"sdc_redirect"===e.type&&q("onNavLink",e.link)}class oe{constructor(){this._uuid=p(),this.contentUrl="",this.contentReload=!1,this.parsedContentUrl=null,this.events=[],this.load_async=!1,this._isEventsSet=!1,this._allEvents=null,this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName="",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){he.DEBUG&&console.debug(e,this._tagName);let n=[];if(!this._isMixin){this._isMixin=!0;for(let r in this._mixins){let o=this._mixins[r];"function"==typeof o[e]&&n.push(o[e].apply(this,t))}return Promise.all(n).then((()=>{this._isMixin=!1}))}}onInit(){he.DEBUG&&console.DEBUG(Array.apply(null,arguments),this._tagName)}get parentController(){return this._parentController}get childController(){return this._childController}onLoad(){return this._runLifecycle("onLoad",arguments)}willShow(){return this._runLifecycle("willShow",arguments)}onRefresh(){return this._runLifecycle("onRefresh",arguments)}onRemove(){return this._runLifecycle("onRemove",arguments),!0}noOpenModelRequests(){return Promise.all(this._models.map((e=>e.noOpenRequests())))}remove(){for(const e of this._models)e.close();let e=this._childController;for(let t in e)if(e.hasOwnProperty(t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){R(this);const e=a(this._tagName);if(this._parentController._childController[e]){let t=this._parentController._childController[e];for(let e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)}return this.$container.remove(),!0}return!1}controller_name(){return this._tagName.replace(/-./g,(e=>` ${e[1].toUpperCase()}`)).replace(/^./g,(e=>`${e.toUpperCase()}`))}addEvent(e,t,n){this.getEvents(),this._allEvents[e]=this._allEvents[e]||{},this._allEvents[e][t]=n}getEvents(){if(this._allEvents)return this._allEvents;let e=[];e=e.concat(this.events);for(let t in this._mixins){let n=this._mixins[t];Array.isArray(n.events)&&(e=e.concat(n.events))}return this._allEvents=_.merge(...e)}post(e,t){return he.post(this,e,t)}get(e,t){return he.get(this,e,t)}submitForm(e,t,n){return he.submitFormAndUpdateView(this,e,t,n)}serverCall(e,t){let n=this.contentUrl.match(/sdc_view\/([^/]+)/i);if(n&&!(n.length<2))return function(e,t,n,r,o){return window.SERVER_CALL_VIA_WEB_SOCKET?function(e,t,n,r){let o=p();return ee().then((()=>{Q.send(JSON.stringify({event:"sdc_call",id:o,controller:t,app:e,function:n,args:r}))})),new Promise(((e,t)=>{Y[o]=[e,t]}))}(e,t,r,o):function(e,t,n){return"object"!=typeof n&&Array.isArray(n)&&null===n&&(n={arg0:n}),n={data:JSON.stringify(n),_sdc_func_name:t,_method:"sdc_server_call"},$.post({url:e,data:n,beforeSend:function(e,t){e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}}).then((e=>{const t=e._return_data;return re(t),t})).catch((e=>{const t=e.responseJSON;throw t.is_error=!0,re(t),e}))}(n,r,o)}(n[1],this._tagName,this.parsedContentUrl,e,t);console.error("To use the serverCall function the contentUrl must be set: "+this.name)}newModel(e,t={}){if(e instanceof Number&&e.hasOwnProperty("load"))return e.load(this);const n=new X(e,t);return this._models.push(n),n}updateModel(e,t={},n){let r=new X(e,t);return r.load().then((()=>{r.values|=n,r.save().then((()=>(r.close(),r.values)))}))}find(e){return this.$container.find(e)}refresh(){return he.refresh(this.$container,this)}reload(){return he.reloadController(this)}reconcile(e,t=null){return he.reconcile(this,e,t)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}iterateAllChildren(){let e=this._childController,t=[];for(let n in e)if(e.hasOwnProperty(n))for(let r of e[n])t.push(r),t.push(...r.iterateAllChildren());return t}defaultSubmitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let r=e.data("model");const o=r.syncForm(e);for(let t of o)n.push(new Promise(((n,o)=>{let s;s=null!==t.pk&&t.pk>=0?r.save(t.pk):r.create(t),s.then((t=>{f(e),this.submit_model_form_success&&this.submit_model_form_success(t[0]);for(const e of this.iterateAllChildren())e.submit_model_form_success&&e.submit_model_form_success(t[0]);n(t)})).catch((t=>{m(e,$(t.html)),this.submit_model_form_error&&this.submit_model_form_error(t);for(const e of this.iterateAllChildren())e.submit_model_form_error&&e.submit_model_form_error(t);o(t)}))})))}return Promise.all(n).then((e=>Object.assign({},...e.flat())))}}const se=["onbeforeunload"],ie=Object.keys(window).filter((e=>/^on/.test(e)&&!se.includes(e))).map((e=>e.slice(2)));function le(e){let t=e.type;e.hasOwnProperty("namespace")&&e.namespace&&e.namespace.length&&(t+=`.${e.namespace}`);let n=$(e.target),r=null,o=!1,s=!1;for(e.stopImmediatePropagation=()=>s=!0,e.stopPropagation=()=>s=o=!0;n.length;){let i=n.attr(`sdc_${t}`);if(i){if(!r&&(r=M(n),!r))return;for(;r;){if(i.split(" ").forEach((s=>{if(o)return;let i=null;if("function"==typeof s)i=s;else if("function"==typeof r[s])i=r[s];else if("string"==typeof s&&s.startsWith("this.event_")){if(i=r.getEvents()[t],!i)return;if(i=i[s.slice(11)],!i)return}i&&i.call(r,n,e)})),s)return;r=r._parentController}}if(o)return;n=n.parent()}return{res:!0}}function ae(e){if(e._isEventsSet)return;const t=e.getEvents();for(let n in t)if(t.hasOwnProperty(n)){let r=t[n];for(let t in r)r.hasOwnProperty(t)&&e.find(t).each((function(){let e=$(this),r=e.attr(`sdc_${n}`)||null;r=r?r.split(" "):[];const o=`this.event_${t}`;-1===r.indexOf(o)&&(r.push(o),e.attr(`sdc_${n}`,r.join(" ")))}))}}const ce={classname:"class"};window.sdcDom=function(e,t,...n){if(!e)return"";const r=function(e,t){let n,r=!1;if("string"==typeof e)n=$(document.createElement(e));else{const t=`this.${e.name}`;n=$(document.createElement(t)),n.data("handler",e),r=!0}return t&&Object.entries(t).forEach((([e,t])=>{e.startsWith("on")?n[0].addEventListener(e.substring(2).toLowerCase(),t):(ce[e.toLowerCase()]&&(e=ce[e.toLowerCase()]),n[0].setAttribute(e,t))})),r&&n.addClass("_bind_to_update_handler _with_handler"),n}(e,t);for(const e of n)r.append(e);return r};let ue,he={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:v,rootController:null,_isInit:!1,_origin_trigger:null,init_sdc:()=>{he._isInit||(he._isInit=!0,he._origin_trigger?te():(he._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return ie.includes(t)||(ie.push(t),$(window).on(t,le)),he._origin_trigger.call(this,e)},he.updateJquery()),ee(),function(){const e=$(window);ie.forEach((t=>{e.off(t).on(t,le)}))}(),he.rootController=he.rootController||new oe),he.tagNames=Object.keys(w);for(let[e,t]of Object.entries(he.Global))t.$container||(v[e].$container=s());return D(he.tagNames,s(),he.rootController)},updateJquery:()=>{$.fn.safeReplace=function(e){return he.safeReplace($(this),e)},$.fn.safeEmpty=function(){return he.safeEmpty($(this))},$.fn.safeRemove=function(){return he.safeRemove($(this))}},controllerToTag:e=>l(e.name).replace(/-controller$/,""),registerGlobal:e=>{let t=he.controllerToTag(e),n=new e;w[t]=[n,[]],n._tagName=t,window[a(t)]=v[a(t)]=n},cleanCache:()=>{x={}},register:e=>{let t=he.controllerToTag(e);return w[t]=[e,[]],e.prototype._tagName=t,{addMixin:(...e)=>{for(let n of e){let e;"string"==typeof n?e=l(n):n&&(e=he.controllerToTag(n)),w[t][1].push(e)}}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=he.CSRF_TOKEN,he.ajax(e,t,params,$.post)),get:(e,t,n)=>he.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=he.VERSION,n._method=n._method||"api";const o=new Promise(((s,i)=>r(t,n).then(((t,n,r)=>{s(t,n,r),"redirect"===t.status?q("onNavLink",t["url-link"]):o.then((()=>{he.refresh(e.$container)}))})).catch(i)));return o},submitFormAndUpdateView:(e,t,n,r)=>{let o=new FormData(t);const s=e=>{e["url-link"]?q("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise(((l,a)=>{u(o,n||t.action,r||t.method).then(((t,n,r)=>{l(t,n,r),"redirect"===t.status?s(t):i.then((()=>{he.refresh(e.$container)}))})).catch(((e,t,n)=>{301===e.status?(e=e.responseJSON,s(e),l(e,t,n)):a(e,t,n)}))}));return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise(((o,s)=>{u(r,t||e.action,n||e.method).then(o).catch(s)}))},getController:e=>M(e),safeEmpty:e=>(e.children().each((function(e,t){let n=$(t);he.safeRemove(n)})),e),safeReplace:(e,t)=>(t.insertBefore(e),he.safeRemove(e)),safeRemove:e=>(e.each((function(){let e=$(this);e.data(`${F}`)&&e.data(`${F}`).remove()})),e.find(`.${T}`).each((function(){const e=$(this).data(`${F}`);e&&e.remove()})),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=L(e,e.contentUrl);return e.contentUrl=t.url,j(e.contentUrl,t.args,e._tagName,e.contentReload)}return new Promise((e=>{e($())}))}(e).then((t=>{let n=$(t);return he.reconcile(e,n)})),reconcile:(e,t,n=null)=>{if(!n){let n=e.$container.clone().empty();n.data(F,null),n.removeClass(T),n.append(t),t=n}return n=n??e.$container,he.refresh(t,e,!0).then((()=>{var r;return B(t,n),(r=e)._childController={},r.find(`.${T}`).each((function(){const e=M($(this));e===r&&O(r,e)})),e}))},refresh:(e,t,n=!1)=>{if(t||(t=he.getController(e)),!t)return i();let r=t,o=[];for(;r;)r._isEventsSet=!1,o.unshift(r),r=r._parentController;return e??=t.$container,D(he.tagNames,e,t).then((()=>{(function(e,t){return function(e,t){const n=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each((function(){const t=$(this);let r;if(t.hasClass("_with_handler"))r=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(r=e[t])}"function"==typeof r&&(r=r.bind(e)(t.data())),void 0!==r&&n.push(Promise.resolve(r).then((n=>{let r=$("<div></div>");return r.append(n),r=t.clone().empty().append(r),e.reconcile(r,t)})))})),Promise.all(n)}(e,t??e.$container)})(t,e).then((()=>{for(let e of o)ae(e);!n&&t.onRefresh(e)}))}))}},de=[];function pe(){if(!jest)throw new Error("JEST is not defined");0===de.length&&(ue=$.ajax.bind($),de.push(jest.spyOn($,"ajax")),de[0].mockImplementation((function(e){return ue(e).then((e=>e)).catch((e=>e))})))}const fe=te,_e={get_controller:async function(e,t={},n=""){pe();const r=$("body");he.updateJquery(),r.safeEmpty();const o=$(`<${e}>${n}</${e}>`);for(const[e,n]of Object.entries(t))o.data(e,n);const s=$("<div></div>").append(o);return r.append(s),he._isInit=!1,he.cleanCache(),await he.init_sdc(),he.getController(o)},getCsrfToken:function(){return function(e){if(document.cookie&&""!==document.cookie){const t=document.cookie.split(";");for(let n=0;n<t.length;n++){const r=t[n].trim();if(r.substring(0,10)===e+"=")return decodeURIComponent(r.substring(10))}}return""}("csrftoken")},controllerFromTestHtml:async function(e,t=null){pe();const n=$("body");he.updateJquery(),n.safeEmpty().append(e),he._isInit=!1,he.cleanCache(),await he.init_sdc();let r=he.rootController.iterateAllChildren();if(!t)return r;const o=r[0].onRefresh,s=jest.spyOn(r[0],"onRefresh");return new Promise((e=>{s.mockImplementation((function(){s.mockRestore();const t=o.apply(r[0],arguments);return e(r),t}))}))}};var me=t.n$,ge=t.du,ye=t.yA,ve=t.g3,we=t.u2,$e=t.n9,Oe=t.on,Ce=t.yy,be=t.R6,ke=t.$n,Ne=t.hA,Ee=t.VB,Pe=t.hZ;export{me as AbstractSDC,ge as allOff,ye as app,ve as checkIfParamNumberBoolOrString,we as clearErrorsInForm,$e as controllerFactory,Oe as on,Ce as runControlFlowFunctions,be as setErrorsInForm,ke as setEvent,Ne as socketReconnect,Ee as test_utils,Pe as trigger};
|
package/package.json
CHANGED
@@ -9,6 +9,7 @@ export class AbstractSDC {
|
|
9
9
|
this._uuid = uuidv4();
|
10
10
|
this.contentUrl = '';
|
11
11
|
this.contentReload = false;
|
12
|
+
this.parsedContentUrl = null;
|
12
13
|
this.events = [];
|
13
14
|
this.load_async = false;
|
14
15
|
this._isEventsSet = false;
|
@@ -123,6 +124,10 @@ export class AbstractSDC {
|
|
123
124
|
return true;
|
124
125
|
}
|
125
126
|
|
127
|
+
noOpenModelRequests( ) {
|
128
|
+
return Promise.all(this._models.map(x => x.noOpenRequests()));
|
129
|
+
}
|
130
|
+
|
126
131
|
remove() {
|
127
132
|
for (const model of this._models) {
|
128
133
|
model.close();
|
@@ -353,6 +353,8 @@ export let app = {
|
|
353
353
|
reconcile: (controller, $virtualNode, $realNode = null) => {
|
354
354
|
if (!$realNode) {
|
355
355
|
let $temp = controller.$container.clone().empty();
|
356
|
+
$temp.data(DATA_CONTROLLER_KEY, null);
|
357
|
+
$temp.removeClass(CONTROLLER_CLASS);
|
356
358
|
$temp.append($virtualNode);
|
357
359
|
$virtualNode = $temp;
|
358
360
|
}
|
@@ -360,7 +362,7 @@ export let app = {
|
|
360
362
|
$realNode = $realNode ?? controller.$container;
|
361
363
|
|
362
364
|
return app.refresh($virtualNode, controller, true).then(() => {
|
363
|
-
reconcile($virtualNode, $realNode
|
365
|
+
reconcile($virtualNode, $realNode);
|
364
366
|
resetChildren(controller);
|
365
367
|
return controller;
|
366
368
|
});
|
@@ -369,14 +371,14 @@ export let app = {
|
|
369
371
|
|
370
372
|
/**
|
371
373
|
*
|
372
|
-
* @param {jquery} $
|
374
|
+
* @param {jquery} $dom
|
373
375
|
* @param {AbstractSDC} leafController
|
374
376
|
* @param {bool} silent
|
375
377
|
* @return {Promise<jQuery>}
|
376
378
|
*/
|
377
|
-
refresh: ($
|
379
|
+
refresh: ($dom, leafController, silent = false) => {
|
378
380
|
if (!leafController) {
|
379
|
-
leafController = app.getController($
|
381
|
+
leafController = app.getController($dom);
|
380
382
|
}
|
381
383
|
|
382
384
|
if (!leafController) {
|
@@ -391,15 +393,15 @@ export let app = {
|
|
391
393
|
controller = controller._parentController;
|
392
394
|
}
|
393
395
|
|
394
|
-
$
|
396
|
+
$dom ??= leafController.$container;
|
395
397
|
|
396
|
-
return replaceTagElementsInContainer(app.tagNames, $
|
397
|
-
reloadMethodHTML(leafController, $
|
398
|
+
return replaceTagElementsInContainer(app.tagNames, $dom, leafController).then(() => {
|
399
|
+
reloadMethodHTML(leafController, $dom).then(() => {
|
398
400
|
for (let con of controllerList) {
|
399
401
|
setControllerEvents(con);
|
400
402
|
}
|
401
403
|
|
402
|
-
!silent && leafController.onRefresh($
|
404
|
+
!silent && leafController.onRefresh($dom);
|
403
405
|
});
|
404
406
|
|
405
407
|
});
|
@@ -71,7 +71,6 @@ const ModelProxyHandler = {
|
|
71
71
|
}
|
72
72
|
|
73
73
|
|
74
|
-
|
75
74
|
function parse_hidden_inputs(value) {
|
76
75
|
|
77
76
|
let isFloatReg = /^-?\d+\.?\d+$/;
|
@@ -97,7 +96,6 @@ function parse_hidden_inputs(value) {
|
|
97
96
|
}
|
98
97
|
|
99
98
|
|
100
|
-
|
101
99
|
export class Model {
|
102
100
|
/**
|
103
101
|
*
|
@@ -105,6 +103,7 @@ export class Model {
|
|
105
103
|
* @param model_query {json}
|
106
104
|
*/
|
107
105
|
constructor(model_name, model_query = {}) {
|
106
|
+
this._onNoOpenRequests = [];
|
108
107
|
this.values_list = [];
|
109
108
|
this.values = {};
|
110
109
|
this.model_name = model_name;
|
@@ -623,7 +622,7 @@ export class Model {
|
|
623
622
|
if (data.is_error) {
|
624
623
|
if (this.open_request.hasOwnProperty(data.event_id)) {
|
625
624
|
this.open_request[data.event_id][1](data);
|
626
|
-
|
625
|
+
this._closeOpenRequest(data.event_id);
|
627
626
|
}
|
628
627
|
if (data.msg || data.header) {
|
629
628
|
trigger('pushErrorMsg', data.header || '', data.msg || '');
|
@@ -631,7 +630,7 @@ export class Model {
|
|
631
630
|
|
632
631
|
if (data.type === 'connect') {
|
633
632
|
this.open_request['_connecting_process'][1](data);
|
634
|
-
|
633
|
+
this._closeOpenRequest('_connecting_process');
|
635
634
|
this._auto_reconnect = false;
|
636
635
|
this.socket.close();
|
637
636
|
}
|
@@ -645,7 +644,7 @@ export class Model {
|
|
645
644
|
this._is_connected = true;
|
646
645
|
this._is_conneting_process = false;
|
647
646
|
this.open_request['_connecting_process'][0](data);
|
648
|
-
|
647
|
+
this._closeOpenRequest('_connecting_process');
|
649
648
|
} else if (data.type === 'load') {
|
650
649
|
const json_res = JSON.parse(data.args.data);
|
651
650
|
this.values_list = [];
|
@@ -675,11 +674,30 @@ export class Model {
|
|
675
674
|
|
676
675
|
if (this.open_request.hasOwnProperty(data.event_id)) {
|
677
676
|
this.open_request[data.event_id][0](data);
|
678
|
-
|
677
|
+
this._closeOpenRequest(data.event_id);
|
679
678
|
}
|
680
679
|
}
|
681
680
|
}
|
682
681
|
|
682
|
+
noOpenRequests() {
|
683
|
+
return new Promise(resolve => {
|
684
|
+
if (Object.keys(this.open_request).length === 0) {
|
685
|
+
return resolve();
|
686
|
+
}
|
687
|
+
|
688
|
+
this._onNoOpenRequests.push(resolve);
|
689
|
+
});
|
690
|
+
}
|
691
|
+
|
692
|
+
_closeOpenRequest(event_id) {
|
693
|
+
delete this.open_request[event_id];
|
694
|
+
if (Object.keys(this.open_request).length === 0) {
|
695
|
+
this._onNoOpenRequests.forEach(x => x());
|
696
|
+
this._onNoOpenRequests = [];
|
697
|
+
}
|
698
|
+
|
699
|
+
}
|
700
|
+
|
683
701
|
_connectToServer() {
|
684
702
|
return new Promise((resolve) => {
|
685
703
|
|
@@ -1,20 +1,22 @@
|
|
1
1
|
/**
|
2
2
|
* @jest-environment jsdom
|
3
3
|
*/
|
4
|
+
;
|
4
5
|
|
5
|
-
import {app} from './sdc_main.js'
|
6
|
-
|
6
|
+
import {app} from './sdc_main.js'
|
7
|
+
|
8
|
+
let spy = [], _originAjax;
|
7
9
|
|
8
10
|
function setDefaults() {
|
9
|
-
if(!jest) throw new Error("JEST is not defined");
|
10
|
-
if(
|
11
|
+
if (!jest) throw new Error("JEST is not defined");
|
12
|
+
if (spy.length === 0) {
|
11
13
|
_originAjax = $.ajax.bind($);
|
12
14
|
|
13
|
-
spy
|
15
|
+
spy.push(jest.spyOn(
|
14
16
|
$,
|
15
17
|
'ajax'
|
16
|
-
);
|
17
|
-
spy.mockImplementation(function (a) {
|
18
|
+
));
|
19
|
+
spy[0].mockImplementation(function (a) {
|
18
20
|
return _originAjax(a).then((html) => {
|
19
21
|
return html;
|
20
22
|
}).catch((html) => {
|
@@ -50,9 +52,10 @@ export function getCsrfToken() {
|
|
50
52
|
/**
|
51
53
|
*
|
52
54
|
* @param html{string} HTML: .
|
55
|
+
* @param afterLifecycle{bool} Lifecycle Methode -> Reruns the controller after the root controller has run the "onRefresh" methode. This is optional.
|
53
56
|
* @returns {Promise<Array<{AbstractSDC}>>}
|
54
57
|
*/
|
55
|
-
export async function controllerFromTestHtml(html) {
|
58
|
+
export async function controllerFromTestHtml(html, afterLifecycle = null) {
|
56
59
|
setDefaults();
|
57
60
|
const $body = $('body');
|
58
61
|
app.updateJquery();
|
@@ -61,7 +64,28 @@ export async function controllerFromTestHtml(html) {
|
|
61
64
|
app.cleanCache();
|
62
65
|
await app.init_sdc();
|
63
66
|
|
64
|
-
|
67
|
+
|
68
|
+
let children = app.rootController.iterateAllChildren();
|
69
|
+
|
70
|
+
if (!afterLifecycle) {
|
71
|
+
return children
|
72
|
+
}
|
73
|
+
|
74
|
+
const origenRefresh = children[0].onRefresh;
|
75
|
+
|
76
|
+
const refreshSpy = jest.spyOn(
|
77
|
+
children[0],
|
78
|
+
'onRefresh'
|
79
|
+
);
|
80
|
+
|
81
|
+
return new Promise((resolve) => {
|
82
|
+
refreshSpy.mockImplementation(function () {
|
83
|
+
refreshSpy.mockRestore();
|
84
|
+
const res = origenRefresh.apply(children[0], arguments);
|
85
|
+
resolve(children);
|
86
|
+
return res;
|
87
|
+
});
|
88
|
+
});
|
65
89
|
}
|
66
90
|
|
67
91
|
/**
|
@@ -72,7 +96,7 @@ export async function controllerFromTestHtml(html) {
|
|
72
96
|
* @param origen_html{string} HTML: Mocked content of the content in your target HTML container.
|
73
97
|
* @returns {Promise<{AbstractSDC}>}
|
74
98
|
*/
|
75
|
-
export async function get_controller(
|
99
|
+
export async function get_controller(tag_name, init_arguments = {}, origen_html = '') {
|
76
100
|
setDefaults();
|
77
101
|
const $body = $('body');
|
78
102
|
app.updateJquery();
|
@@ -56,6 +56,7 @@ export function tagNameToCamelCase(str) {
|
|
56
56
|
str = str.replace(/-./g, letter => `${letter[1].toUpperCase()}`);
|
57
57
|
return str;
|
58
58
|
}
|
59
|
+
|
59
60
|
export function tagNameToReadableName(str) {
|
60
61
|
str = str.replace(/-./g, letter => ` ${letter[1].toUpperCase()}`).replace(/^./g, letter => `${letter.toUpperCase()}`);
|
61
62
|
return str;
|
@@ -83,31 +84,42 @@ const copyProps = (targetClass, sourceClass) => {
|
|
83
84
|
|
84
85
|
/**
|
85
86
|
*
|
86
|
-
* @param {AbstractSDC} baseClass
|
87
|
-
* @param {AbstractSDC} mixins
|
87
|
+
* @param {typeof AbstractSDC} baseClass
|
88
|
+
* @param {typeof AbstractSDC} mixins
|
88
89
|
* @returns {AbstractSDC}
|
89
90
|
*/
|
90
91
|
export function agileAggregation(baseClass, ...mixins) {
|
91
92
|
|
92
|
-
let base =
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
93
|
+
let base = {
|
94
|
+
[baseClass.name]: class {
|
95
|
+
constructor(..._args) {
|
96
|
+
let _mixins = {};
|
97
|
+
mixins.forEach((mixin) => {
|
98
|
+
let newMixin;
|
99
|
+
Object.assign(this, (newMixin = new mixin()));
|
100
|
+
newMixin._tagName = mixin.prototype._tagName;
|
101
|
+
newMixin._isMixin = true;
|
102
|
+
_mixins[mixin.name] = newMixin;
|
103
|
+
});
|
104
|
+
|
105
|
+
Object.assign(this, new baseClass());
|
106
|
+
this._mixins = _mixins;
|
107
|
+
}
|
102
108
|
|
103
|
-
Object.assign(this, new baseClass());
|
104
|
-
this._mixins = _mixins;
|
105
|
-
}
|
106
109
|
|
107
|
-
|
108
|
-
|
110
|
+
static get name() {
|
111
|
+
return baseClass.name;
|
112
|
+
}
|
113
|
+
|
114
|
+
static className() {
|
115
|
+
return this.name
|
116
|
+
}
|
117
|
+
|
118
|
+
get mixins() {
|
119
|
+
return this._mixins;
|
120
|
+
}
|
109
121
|
}
|
110
|
-
};
|
122
|
+
}[baseClass.name];
|
111
123
|
|
112
124
|
copyProps(base, baseClass);
|
113
125
|
|
@@ -141,7 +153,7 @@ export function uploadFileFormData(formData, url, method) {
|
|
141
153
|
cache: false,
|
142
154
|
contentType: false,
|
143
155
|
processData: false,
|
144
|
-
beforeSend: function(xhr, settings) {
|
156
|
+
beforeSend: function (xhr, settings) {
|
145
157
|
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
|
146
158
|
xhr.setRequestHeader("X-CSRFToken", window.CSRF_TOKEN);
|
147
159
|
}
|
@@ -171,8 +183,8 @@ export function checkIfParamNumberBoolOrString(paramElement, controller = null)
|
|
171
183
|
return paramElement;
|
172
184
|
}
|
173
185
|
|
174
|
-
if(controller && typeof controller[paramElement] !== 'undefined') {
|
175
|
-
if(typeof controller[paramElement] === 'function') {
|
186
|
+
if (controller && typeof controller[paramElement] !== 'undefined') {
|
187
|
+
if (typeof controller[paramElement] === 'function') {
|
176
188
|
return controller[paramElement].bind(controller);
|
177
189
|
}
|
178
190
|
return controller[paramElement];
|
@@ -213,7 +225,7 @@ export function clearErrorsInForm($form) {
|
|
213
225
|
}
|
214
226
|
|
215
227
|
export function setErrorsInForm($form, $resForm) {
|
216
|
-
$resForm
|
228
|
+
$resForm = $('<div>').append($resForm);
|
217
229
|
|
218
230
|
$form.find('.has-error').removeClass('has-error').find('.alert-danger').safeRemove();
|
219
231
|
$form.find('.non-field-errors').safeRemove();
|
@@ -233,4 +245,14 @@ export function setErrorsInForm($form, $resForm) {
|
|
233
245
|
});
|
234
246
|
|
235
247
|
return hasNoError;
|
236
|
-
}
|
248
|
+
}
|
249
|
+
|
250
|
+
export function jqueryInsertAt($container, index, $newElement) {
|
251
|
+
let lastIndex = $container.children().size();
|
252
|
+
if (index < lastIndex) {
|
253
|
+
$container.children().eq(index).before($newElement);
|
254
|
+
} else {
|
255
|
+
$container.append($newElement);
|
256
|
+
}
|
257
|
+
return this;
|
258
|
+
}
|