diff --git a/src/dom_components/model/Component.ts b/src/dom_components/model/Component.ts index d3fa91463..37e3656e1 100644 --- a/src/dom_components/model/Component.ts +++ b/src/dom_components/model/Component.ts @@ -584,7 +584,7 @@ export default class Component extends StyleableModel { * component.removeAttributes('some-attr'); * component.removeAttributes(['some-attr1', 'some-attr2']); */ - removeAttributes(attrs: string[] = [], opts: SetOptions = {}) { + removeAttributes(attrs: string | string[] = [], opts: SetOptions = {}) { const attrArr = Array.isArray(attrs) ? attrs : [attrs]; const compAttr = this.getAttributes(); attrArr.map(i => delete compAttr[i]); diff --git a/src/dom_components/model/types.ts b/src/dom_components/model/types.ts index 5461bf44c..26a9822c9 100644 --- a/src/dom_components/model/types.ts +++ b/src/dom_components/model/types.ts @@ -42,6 +42,14 @@ export interface ComponentDelegateProps { * } */ copy?: (cmp: Component) => Component | Nullable; + /** + * Delegate select command to another component. + * @example + * delegate: { + * select: (cmp) => cmp.findType('other-type')[0], + * } + */ + select?: (cmp: Component) => Component | Nullable; } export interface ComponentProperties { diff --git a/src/editor/model/Editor.ts b/src/editor/model/Editor.ts index fc56eae1d..1955bc5db 100644 --- a/src/editor/model/Editor.ts +++ b/src/editor/model/Editor.ts @@ -480,7 +480,7 @@ export default class EditorModel extends Model { const { event } = opts; const ctrlKey = event && (event.ctrlKey || event.metaKey); const { shiftKey } = event || {}; - const els = (isArray(el) ? el : [el]).map(el => getModel(el, $)); + const els = (isArray(el) ? el : [el]).map(el => getModel(el, $)).map(cmp => cmp?.delegate?.select?.(cmp) || cmp); const selected = this.getSelectedAll(); const mltSel = this.getConfig().multipleSelection; let added; @@ -501,7 +501,7 @@ export default class EditorModel extends Model { if (opts.useValid) { let parent = model.parent(); while (parent && !parent.get('selectable')) parent = parent.parent(); - model = parent; + model = parent!; } else { return; } diff --git a/src/utils/mixins.ts b/src/utils/mixins.ts index 5adf2e1ff..1f1e64820 100644 --- a/src/utils/mixins.ts +++ b/src/utils/mixins.ts @@ -187,7 +187,7 @@ export const deepMerge = (...args: ObjectAny[]) => { * @param {HTMLElement|Component} el Component or HTML element * @return {Component} */ -const getModel = (el: any, $?: any) => { +const getModel = (el: any, $?: any): Component => { let model = el; if (!$ && el && el.__cashData) { model = el.__cashData.model;