From 37fe86780cf35e223a2dabc9fdb897e1e677028f Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Tue, 3 Mar 2020 23:52:17 +0100 Subject: [PATCH 1/2] Update cash-dom --- package-lock.json | 6 +- package.json | 2 +- src/editor/model/Editor.js | 3 +- src/utils/ColorPicker.js | 2 +- src/utils/extender.js | 230 ++++++------------------------------- 5 files changed, 45 insertions(+), 198 deletions(-) diff --git a/package-lock.json b/package-lock.json index 941977569..b1632436c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6903,9 +6903,9 @@ "dev": true }, "cash-dom": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/cash-dom/-/cash-dom-1.3.7.tgz", - "integrity": "sha512-cWqx3b+8Vh5hvRd87voSW7hxHVhUekGiOUd7iix8fP29cl6TBIInkAqYVSKaL2xeVewS3/kfPnIIC+Xl3nVe/A==" + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/cash-dom/-/cash-dom-2.3.9.tgz", + "integrity": "sha512-2a4/LSFQPMbLhBYiJ5Z5rEz5Pic8jMVUqkqZ42w01gkopVUnxnaJcvZifcx6QFykJyWDsUWfISt4xRSyjAaK9w==" }, "ccount": { "version": "1.0.4", diff --git a/package.json b/package.json index 96f7f2792..c5c75a4c9 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "@babel/runtime": "^7.7.1", "backbone": "1.3.3", "backbone-undo": "^0.2.5", - "cash-dom": "^1.3.7", + "cash-dom": "^2.3.9", "codemirror": "^5.49.2", "codemirror-formatting": "^1.0.0", "keymaster": "^1.6.2", diff --git a/src/editor/model/Editor.js b/src/editor/model/Editor.js index ac63496fb..2daf71a38 100644 --- a/src/editor/model/Editor.js +++ b/src/editor/model/Editor.js @@ -6,10 +6,12 @@ import { toArray, keys } from 'underscore'; +import $ from 'cash-dom'; import Backbone from 'backbone'; import Extender from 'utils/extender'; import { getModel } from 'utils/mixins'; +Backbone.$ = $; const deps = [ require('utils'), require('i18n'), @@ -43,7 +45,6 @@ Extender({ $: Backbone.$ }); -const $ = Backbone.$; const logs = { debug: console.log, info: console.info, diff --git a/src/utils/ColorPicker.js b/src/utils/ColorPicker.js index f8fd6210f..62d8ef097 100644 --- a/src/utils/ColorPicker.js +++ b/src/utils/ColorPicker.js @@ -694,7 +694,7 @@ export default function($, undefined) { return; } - boundElement.trigger(event, [get()]); + boundElement.trigger('beforeShow.spectrum', [get()]); if (callbacks.beforeShow(get()) === false || event.isDefaultPrevented()) { return; diff --git a/src/utils/extender.js b/src/utils/extender.js index 5e90b5e90..55991b2e9 100644 --- a/src/utils/extender.js +++ b/src/utils/extender.js @@ -1,167 +1,10 @@ import { isObject, isString, each, isUndefined } from 'underscore'; -export default ({ $, Backbone }) => { - if (Backbone) { - const ViewProt = Backbone.View.prototype; - const eventNsMap = {}; - ViewProt.eventNsMap = eventNsMap; - - ViewProt.delegate = function(eventName, selector, listener) { - const vid = '.delegateEvents' + this.cid; - this.$el.on(eventName, selector, listener); - //return this; - let eventMap = eventNsMap[vid]; - - if (!eventMap) { - eventMap = []; - eventNsMap[vid] = eventMap; - } - - eventMap.push({ eventName, selector, listener }); - return this; - }; - - ViewProt.undelegateEvents = function() { - const vid = '.delegateEvents' + this.cid; - if (this.$el) { - //this.$el.off(); return this; - let eventMap = eventNsMap[vid]; - - if (eventMap) { - eventMap.forEach(({ eventName, selector, listener }) => { - this.$el.off(eventName); - }); - } - } - return this; - }; - - ViewProt.undelegate = function(ev, sel, list) { - const vid = '.delegateEvents' + this.cid; - //this.$el.off(ev, sel, list); return this; - let eventMap = eventNsMap[vid]; - - if (eventMap) { - eventMap.forEach(({ eventName, selector, listener }) => { - if (eventName == ev && selector == sel) { - this.$el.off(eventName); - } - }); - } - - return this; - }; - } - +export default ({ $ }) => { if ($ && $.prototype.constructor.name !== 'jQuery') { const fn = $.fn; - const splitNamespace = function(name) { - const namespaceArray = name.split('.'); - return name.indexOf('.') !== 0 - ? [namespaceArray[0], namespaceArray.slice(1)] - : [null, namespaceArray]; - }; - - const on = $.prototype.on; - const off = $.prototype.off; - const trigger = $.prototype.trigger; - const offset = $.prototype.offset; - const getEvents = eventName => eventName.split(/[,\s]+/g); - const getNamespaces = eventName => eventName.split('.'); - - fn.on = function(eventName, delegate, callback, runOnce) { - if (typeof eventName == 'string') { - const events = getEvents(eventName); - - if (events.length == 1) { - eventName = events[0]; - let namespaces = getNamespaces(eventName); - - if (eventName.indexOf('.') !== 0) { - eventName = namespaces[0]; - } - - namespaces = namespaces.slice(1); - - if (namespaces.length) { - //console.log('Found event with namespaces', namespaces, eventName, delegate, this); - const cashNs = this.data('_cashNs') || []; - // cashNs[namespace] - this.data('_cashNs', namespaces); // for each ns need to store '.store' => eventName, delegate, callback - } - - return on.call(this, eventName, delegate, callback, runOnce); - } else { - events.forEach(eventName => - this.on(eventName, delegate, callback, runOnce) - ); - return this; - } - } else { - return on.call(this, eventName, delegate, callback, runOnce); - } - }; - - fn.off = function(eventName, callback) { - if (typeof eventName == 'string') { - const events = getEvents(eventName); - - if (events.length == 1) { - eventName = events[0]; - let namespaces = getNamespaces(eventName); - - if (eventName.indexOf('.') !== 0) { - eventName = namespaces[0]; - } - - namespaces = namespaces.slice(1); - - if (namespaces.length) { - // Have to off only with the same namespace - } - - return off.call(this, eventName, callback); - } else { - events.forEach(eventName => this.off(eventName, callback)); - return this; - } - } else { - return off.call(this, eventName, callback); - } - }; - - fn.trigger = function(eventName, data) { - if (eventName instanceof $.Event) { - return this.trigger(eventName.type, data); - } - - if (typeof eventName == 'string') { - const events = getEvents(eventName); - - if (events.length == 1) { - eventName = events[0]; - let namespaces = getNamespaces(eventName); - - if (eventName.indexOf('.') !== 0) { - eventName = namespaces[0]; - } - - namespaces = namespaces.slice(1); - - if (namespaces.length) { - // have to trigger with same namespaces and eventName - } - - return trigger.call(this, eventName, data); - } else { - events.forEach(eventName => this.trigger(eventName, data)); - return this; - } - } else { - return trigger.call(this, eventName, data); - } - }; + // Additional helpers fn.hide = function() { return this.css('display', 'none'); @@ -178,39 +21,41 @@ export default ({ $, Backbone }) => { }; // For SVGs in IE - (fn.removeClass = function(c) { - if (!arguments.length) { - return this.attr('class', ''); - } - const classes = isString(c) && c.match(/\S+/g); - return classes - ? this.each(function(el) { - each(classes, function(c) { - if (el.classList) { - el.classList.remove(c); - } else { - const val = el.className; - const bval = el.className.baseVal; - - if (!isUndefined(bval)) { - val.baseVal = bval.replace(c, ''); - } else { - el.className = val.replace(c, ''); - } - } - }); - }) - : this; - }), - (fn.remove = function() { - return this.each(node => { - return node.parentNode && node.parentNode.removeChild(node); - }); - }), - // For spectrum compatibility - (fn.bind = function(ev, h) { - return this.on(ev, h); - }); + // (fn.removeClass = function(c) { + // if (!arguments.length) { + // return this.attr('class', ''); + // } + // const classes = isString(c) && c.match(/\S+/g); + // return classes + // ? this.each(function(el) { + // each(classes, function(c) { + // if (el.classList) { + // el.classList.remove(c); + // } else { + // const val = el.className; + // const bval = el.className.baseVal; + + // if (!isUndefined(bval)) { + // val.baseVal = bval.replace(c, ''); + // } else { + // el.className = val.replace(c, ''); + // } + // } + // }); + // }) + // : this; + // }), + // (fn.remove = function() { + // return this.each(node => { + // return node.parentNode && node.parentNode.removeChild(node); + // }); + // }), + + // For spectrum compatibility + + fn.bind = function(ev, h) { + return this.on(ev, h); + }; fn.unbind = function(ev, h) { if (isObject(ev)) { @@ -261,6 +106,7 @@ export default ({ $, Backbone }) => { return win ? win.pageYOffset : el.scrollTop || 0; }; + const offset = $.prototype.offset; fn.offset = function(coords) { let top, left; From 83754ddb0f5c728da291948a45a061c032b667eb Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Wed, 4 Mar 2020 00:06:23 +0100 Subject: [PATCH 2/2] Avoid false positive warnings with traits. Closes #2615 --- src/domain_abstract/view/DomainViews.js | 31 ++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/domain_abstract/view/DomainViews.js b/src/domain_abstract/view/DomainViews.js index 8e804cf32..8945beafb 100644 --- a/src/domain_abstract/view/DomainViews.js +++ b/src/domain_abstract/view/DomainViews.js @@ -1,3 +1,4 @@ +import { includes } from 'underscore'; import Backbone from 'backbone'; export default Backbone.View.extend({ @@ -45,6 +46,30 @@ export default Backbone.View.extend({ * */ add(model, fragment) { const { config, reuseView, itemsView = {} } = this; + const inputTypes = [ + 'button', + 'checkbox', + 'color', + 'date', + 'datetime-local', + 'email', + 'file', + 'hidden', + 'image', + 'month', + 'number', + 'password', + 'radio', + 'range', + 'reset', + 'search', + 'submit', + 'tel', + 'text', + 'time', + 'url', + 'week' + ]; var frag = fragment || null; var itemView = this.itemView; var typeField = model.get(this.itemType); @@ -52,7 +77,11 @@ export default Backbone.View.extend({ if (itemsView[typeField]) { itemView = itemsView[typeField]; - } else if (typeField && !itemsView[typeField]) { + } else if ( + typeField && + !itemsView[typeField] && + !includes(inputTypes, typeField) + ) { this.itemViewNotFound(typeField); }