Browse Source

Fix possible double entry in Layers. Closes #5820

pull/5907/head
Artur Arseniev 2 years ago
parent
commit
10858314fd
  1. 2
      src/dom_components/model/Component.ts
  2. 8
      src/dom_components/model/Components.ts
  3. 19
      src/dom_components/view/ComponentsView.ts
  4. 1
      src/navigator/index.ts
  5. 59
      src/navigator/view/ItemsView.ts

2
src/dom_components/model/Component.ts

@ -39,6 +39,7 @@ import Trait from '../../trait_manager/model/Trait';
import { ToolbarButtonProps } from './ToolbarButton'; import { ToolbarButtonProps } from './ToolbarButton';
import { TraitProperties } from '../../trait_manager/types'; import { TraitProperties } from '../../trait_manager/types';
import { ActionLabelComponents, ComponentsEvents } from '../types'; import { ActionLabelComponents, ComponentsEvents } from '../types';
import ItemView from '../../navigator/view/ItemView';
export interface IComponent extends ExtractMethods<Component> {} export interface IComponent extends ExtractMethods<Component> {}
@ -222,6 +223,7 @@ export default class Component extends StyleableModel<ComponentProperties> {
ccid!: string; ccid!: string;
views!: ComponentView[]; views!: ComponentView[];
view?: ComponentView; view?: ComponentView;
viewLayer?: ItemView;
frame?: Frame; frame?: Frame;
rule?: CssRule; rule?: CssRule;
prevColl?: Components; prevColl?: Components;

8
src/dom_components/model/Components.ts

@ -358,6 +358,14 @@ Component> {
} }
model.__postAdd({ recursive: true }); model.__postAdd({ recursive: true });
if (em && !opts.temporary) {
const triggerAdd = (model: Component) => {
em.trigger(ComponentsEvents.add, model, opts);
model.components().forEach(comp => triggerAdd(comp));
};
triggerAdd(model);
}
// this.__onAddEnd(); // this.__onAddEnd();
} }

19
src/dom_components/view/ComponentsView.ts

@ -7,7 +7,6 @@ import Component from '../model/Component';
import ComponentView from './ComponentView'; import ComponentView from './ComponentView';
import FrameView from '../../canvas/view/FrameView'; import FrameView from '../../canvas/view/FrameView';
import Components from '../model/Components'; import Components from '../model/Components';
import { ComponentsEvents } from '../types';
export default class ComponentsView extends View { export default class ComponentsView extends View {
opts!: any; opts!: any;
@ -47,18 +46,8 @@ export default class ComponentsView extends View {
* @param {Object} opts * @param {Object} opts
* @private * @private
* */ * */
addTo(model: Component, coll: any = {}, opts: { temporary?: boolean } = {}) { addTo(model: Component) {
const { em } = this; this.addToCollection(model, null, this.collection.indexOf(model));
const i = this.collection.indexOf(model);
this.addToCollection(model, null, i);
if (em && !opts.temporary) {
const triggerAdd = (model: Component) => {
em.trigger(ComponentsEvents.add, model, opts);
model.components().forEach(comp => triggerAdd(comp));
};
triggerAdd(model);
}
} }
/** /**
@ -70,10 +59,8 @@ export default class ComponentsView extends View {
* @return {Object} Object rendered * @return {Object} Object rendered
* @private * @private
* */ * */
addToCollection(model: Component, fragmentEl?: DocumentFragment | null, index?: number) { addToCollection(model: Component, fragment?: DocumentFragment | null, index?: number) {
// if (!this.compView) this.compView = require('./ComponentView').default;
const { config, opts, em } = this; const { config, opts, em } = this;
const fragment = fragmentEl || null;
const { frameView } = config; const { frameView } = config;
const sameFrameView = frameView?.model && model.getView(frameView.model); const sameFrameView = frameView?.model && model.getView(frameView.model);
const dt = opts.componentTypes || em?.Components.getTypes(); const dt = opts.componentTypes || em?.Components.getTypes();

1
src/navigator/index.ts

@ -324,7 +324,6 @@ export default class LayerManager extends Module<LayerManagerConfig> {
} }
if (selected && scrollLayers) { if (selected && scrollLayers) {
// @ts-ignore
const el = selected.viewLayer?.el; const el = selected.viewLayer?.el;
el?.scrollIntoView(scrollLayers); el?.scrollIntoView(scrollLayers);
} }

59
src/navigator/view/ItemsView.ts

@ -1,13 +1,17 @@
import { isUndefined } from 'underscore';
import { View } from '../../common'; import { View } from '../../common';
import Component from '../../dom_components/model/Component'; import Component from '../../dom_components/model/Component';
import EditorModel from '../../editor/model/Editor'; import EditorModel from '../../editor/model/Editor';
import ItemView from './ItemView'; import ItemView from './ItemView';
import Components from '../../dom_components/model/Components';
export default class ItemsView extends View { export default class ItemsView extends View {
items: ItemView[]; items: ItemView[];
opt: any; opt: any;
config: any; config: any;
parentView: ItemView; parentView: ItemView;
/** @ts-ignore */
collection!: Components;
constructor(opt: any = {}) { constructor(opt: any = {}) {
super(opt); super(opt);
@ -47,11 +51,9 @@ export default class ItemsView extends View {
} }
removeChildren(removed: Component) { removeChildren(removed: Component) {
// @ts-ignore
const view = removed.viewLayer; const view = removed.viewLayer;
if (!view) return; if (!view) return;
view.remove(); view.remove();
// @ts-ignore
delete removed.viewLayer; delete removed.viewLayer;
} }
@ -62,8 +64,7 @@ export default class ItemsView extends View {
* @return Object * @return Object
* */ * */
addTo(model: Component) { addTo(model: Component) {
var i = this.collection.indexOf(model); this.addToCollection(model, null, this.collection.indexOf(model));
this.addToCollection(model, null, i);
} }
/** /**
@ -74,41 +75,47 @@ export default class ItemsView extends View {
* *
* @return Object Object created * @return Object Object created
* */ * */
addToCollection(model: Component, fragmentEl: DocumentFragment | null, index?: number) { addToCollection(model: Component, fragment: DocumentFragment | null, index?: number) {
const { parentView, opt, config } = this; const { parentView, opt, config, el } = this;
const { ItemView, opened, module, level, sorter } = opt; const { ItemView, opened, module, level, sorter } = opt;
const fragment = fragmentEl || null; const item: ItemView =
const item = new ItemView({ model.viewLayer ||
ItemView, new ItemView({
level, ItemView,
model, level,
parentView, model,
config, parentView,
sorter, config,
opened, sorter,
module, opened,
}); module,
});
const rendered = item.render().el; const rendered = item.render().el;
if (fragment) { if (fragment) {
fragment.appendChild(rendered); fragment.appendChild(rendered);
} else { } else {
if (typeof index !== 'undefined') { const parent = el;
var method = 'before'; const children = parent.childNodes;
if (!isUndefined(index)) {
const lastIndex = children.length == index;
// If the added model is the last of collection // If the added model is the last of collection
// need to change the logic of append // need to change the logic of append
if (this.$el.children().length == index) { if (lastIndex) {
index--; index--;
method = 'after';
} }
// In case the added is new in the collection index will be -1 // In case the added is new in the collection index will be -1
if (index < 0) { if (lastIndex || !children.length) {
this.$el.append(rendered); parent.appendChild(rendered);
} else { } else {
// @ts-ignore parent.insertBefore(rendered, children[index]);
this.$el.children().eq(index)[method](rendered);
} }
} else this.$el.append(rendered); } else {
parent.appendChild(rendered);
}
} }
this.items.push(item); this.items.push(item);
return rendered; return rendered;

Loading…
Cancel
Save