From 281ad45b5dc91881db6cf3bc8f393b91629318b3 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Fri, 31 Mar 2017 10:19:53 +0200 Subject: [PATCH] add experimental CBind mixin --- Makefile | 1 + mixin/CBind.js | 138 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 mixin/CBind.js diff --git a/Makefile b/Makefile index b84c1f6..8677fe1 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ WWWBASEDIR=${DESTDIR}/usr/share/javascript/${PACKAGE} JSSRC= \ Utils.js \ Toolkit.js \ + mixin/CBind.js \ data/reader/JsonObject.js \ data/ProxmoxProxy.js \ data/UpdateQueue.js \ diff --git a/mixin/CBind.js b/mixin/CBind.js new file mode 100644 index 0000000..2b69cca --- /dev/null +++ b/mixin/CBind.js @@ -0,0 +1,138 @@ +Ext.define('Proxmox.Mixin.CBind', { + extend: 'Ext.Mixin', + + mixinConfig: { + before: { + initComponent: 'cloneTemplates' + } + }, + + cloneTemplates: function() { + var me = this; + + if (typeof(me.cbindData) == "function") { + me.cbindData = me.cbindData(me.initialConfig) || {}; + } + + var getConfigValue = function(cname) { + + if (cname in me.initialConfig) { + return me.initialConfig[cname]; + } + if (cname in me.cbindData) { + return me.cbindData[cname]; + } + if (cname in me) { + return me[cname]; + } + throw "unable to get cbind data for '" + cname + "'"; + }; + + var applyCBind = function(obj) { + var cbind = obj.cbind, prop, cdata, cvalue, match, found; + if (!cbind) return; + + for (prop in cbind) { + cdata = cbind[prop]; + + found = false; + if (match = /^\{(!)?([a-z_][a-z0-9_]*)\}$/.exec(cdata)) { + var cvalue = getConfigValue(match[2]); + if (match[1]) cvalue = !cvalue; + obj[prop] = cvalue; + found = true; + } else { + obj[prop] = cdata.replace(/{([a-z_][a-z0-9_]*)\}/g, function(match, cname) { + var cvalue = getConfigValue(cname); + found = true; + return cvalue; + }); + } + if (!found) { + throw "unable to parse cbind template '" + cdata + "'"; + } + + } + }; + + if (me.cbind) { + applyCBind(me); + } + + var cloneTemplateArray = function(org) { + var copy, i, found, el, elcopy, arrayLength; + + arrayLength = org.length; + found = false; + for (i = 0; i < arrayLength; i++) { + el = org[i]; + if (el.constructor == Object && el.xtype) { + found = true; + break; + } + } + + if (!found) return org; // no need to copy + + copy = []; + for (i = 0; i < arrayLength; i++) { + el = org[i]; + if (el.constructor == Object && el.xtype) { + elcopy = cloneTemplateObject(el); + if (elcopy.cbind) { + applyCBind(elcopy); + } + copy.push(elcopy); + } else if (el.constructor == Object && el.xtype) { + elcopy = cloneTemplateObject(el); + if (elcopy.cbind) { + applyCBind(elcopy); + } + copy.push(elcopy); + } else { + copy.push(el); + } + } + return copy; + }; + + var cloneTemplateObject = function(org) { + var res = {}, prop, el, copy; + for (prop in org) { + el = org[prop]; + if (el.constructor == Object && el.xtype) { + copy = cloneTemplateObject(el); + if (copy.cbind) { + applyCBind(copy); + } + res[prop] = copy; + } else if (el.constructor == Array) { + copy = cloneTemplateArray(el); + res[prop] = copy; + } else { + res[prop] = el; + } + } + return res; + }; + + var condCloneProperties = function() { + var prop, el, i, tmp; + + for (prop in me) { + el = me[prop]; + if (el === undefined || el === null) continue; + if (typeof(el) === 'object' && el.constructor == Object) { + if (el.xtype) { + me[prop] = cloneTemplateObject(el); + } + } else if (el.constructor == Array) { + tmp = cloneTemplateArray(el); + me[prop] = tmp; + } + } + }; + + condCloneProperties(); + } +}); -- 2.39.2