mirror of https://github.com/artf/grapesjs.git
2 changed files with 171 additions and 162 deletions
@ -1,162 +0,0 @@ |
|||||
import { debounce } from 'underscore'; |
|
||||
import { Model, Module } from '../common'; |
|
||||
import defaults from './config/config'; |
|
||||
import TraitsView from './view/TraitsView'; |
|
||||
import TraitView from './view/TraitView'; |
|
||||
import TraitSelectView from './view/TraitSelectView'; |
|
||||
import TraitCheckboxView from './view/TraitCheckboxView'; |
|
||||
import TraitNumberView from './view/TraitNumberView'; |
|
||||
import TraitColorView from './view/TraitColorView'; |
|
||||
import TraitButtonView from './view/TraitButtonView'; |
|
||||
|
|
||||
export const evAll = 'trait'; |
|
||||
export const evPfx = `${evAll}:`; |
|
||||
export const evCustom = `${evPfx}custom`; |
|
||||
|
|
||||
export default () => { |
|
||||
const typesDef = { |
|
||||
text: TraitView, |
|
||||
number: TraitNumberView, |
|
||||
select: TraitSelectView, |
|
||||
checkbox: TraitCheckboxView, |
|
||||
color: TraitColorView, |
|
||||
button: TraitButtonView, |
|
||||
}; |
|
||||
|
|
||||
return { |
|
||||
...Module, |
|
||||
|
|
||||
TraitsView, |
|
||||
|
|
||||
events: { |
|
||||
all: evAll, |
|
||||
custom: evCustom, |
|
||||
}, |
|
||||
|
|
||||
/** |
|
||||
* Name of the module |
|
||||
* @type {String} |
|
||||
* @private |
|
||||
*/ |
|
||||
name: 'TraitManager', |
|
||||
|
|
||||
/** |
|
||||
* Get configuration object |
|
||||
* @name getConfig |
|
||||
* @function |
|
||||
* @return {Object} |
|
||||
*/ |
|
||||
|
|
||||
/** |
|
||||
* Initialize module. Automatically called with a new instance of the editor |
|
||||
* @param {Object} config Configurations |
|
||||
* @private |
|
||||
*/ |
|
||||
init(config = {}) { |
|
||||
this.__initConfig(defaults, config); |
|
||||
const c = this.config; |
|
||||
const model = new Model(); |
|
||||
this.model = model; |
|
||||
const { em } = this; |
|
||||
const ppfx = c.pStylePrefix; |
|
||||
this.types = { ...typesDef }; |
|
||||
ppfx && (c.stylePrefix = `${ppfx}${c.stylePrefix}`); |
|
||||
|
|
||||
const upAll = debounce(() => this.__upSel()); |
|
||||
model.listenTo(em, 'component:toggled', upAll); |
|
||||
|
|
||||
const update = debounce(() => this.__onUp()); |
|
||||
model.listenTo(em, 'trait:update', update); |
|
||||
|
|
||||
return this; |
|
||||
}, |
|
||||
|
|
||||
__upSel() { |
|
||||
this.select(this.em.getSelected()); |
|
||||
}, |
|
||||
|
|
||||
__onUp() { |
|
||||
this.select(this.getSelected()); |
|
||||
}, |
|
||||
|
|
||||
select(component) { |
|
||||
const traits = component ? component.getTraits() : []; |
|
||||
this.model.set({ component, traits }); |
|
||||
this.__trgCustom(); |
|
||||
}, |
|
||||
|
|
||||
getSelected() { |
|
||||
return this.model.get('component') || null; |
|
||||
}, |
|
||||
|
|
||||
getCurrent() { |
|
||||
return this.model.get('traits') || []; |
|
||||
}, |
|
||||
|
|
||||
__trgCustom(opts = {}) { |
|
||||
this.__ctn = this.__ctn || opts.container; |
|
||||
this.em.trigger(this.events.custom, { container: this.__ctn }); |
|
||||
}, |
|
||||
|
|
||||
postRender() { |
|
||||
this.__appendTo(); |
|
||||
}, |
|
||||
|
|
||||
/** |
|
||||
* |
|
||||
* Get Traits viewer |
|
||||
* @private |
|
||||
*/ |
|
||||
getTraitsViewer() { |
|
||||
return this.view; |
|
||||
}, |
|
||||
|
|
||||
/** |
|
||||
* Add new trait type |
|
||||
* @param {string} name Type name |
|
||||
* @param {Object} methods Object representing the trait |
|
||||
*/ |
|
||||
addType(name, trait) { |
|
||||
const baseView = this.getType('text'); |
|
||||
this.types[name] = baseView.extend(trait); |
|
||||
}, |
|
||||
|
|
||||
/** |
|
||||
* Get trait type |
|
||||
* @param {string} name Type name |
|
||||
* @return {Object} |
|
||||
*/ |
|
||||
getType(name) { |
|
||||
return this.getTypes()[name]; |
|
||||
}, |
|
||||
|
|
||||
/** |
|
||||
* Get all trait types |
|
||||
* @returns {Object} |
|
||||
*/ |
|
||||
getTypes() { |
|
||||
return this.types; |
|
||||
}, |
|
||||
|
|
||||
render() { |
|
||||
let { view } = this; |
|
||||
const config = this.getConfig(); |
|
||||
const el = view && view.el; |
|
||||
view = new TraitsView( |
|
||||
{ |
|
||||
el, |
|
||||
collection: [], |
|
||||
editor: config.em, |
|
||||
config, |
|
||||
}, |
|
||||
this.getTypes() |
|
||||
); |
|
||||
this.view = view; |
|
||||
return view.el; |
|
||||
}, |
|
||||
|
|
||||
destroy() { |
|
||||
this.__destroy(); |
|
||||
}, |
|
||||
}; |
|
||||
}; |
|
||||
@ -0,0 +1,171 @@ |
|||||
|
import { debounce } from 'underscore'; |
||||
|
import { Model } from '../common'; |
||||
|
import { Module } from '../abstract'; |
||||
|
import defaults, { TraitManagerConfig } from './config/config'; |
||||
|
import TraitsView from './view/TraitsView'; |
||||
|
import TraitView from './view/TraitView'; |
||||
|
import TraitSelectView from './view/TraitSelectView'; |
||||
|
import TraitCheckboxView from './view/TraitCheckboxView'; |
||||
|
import TraitNumberView from './view/TraitNumberView'; |
||||
|
import TraitColorView from './view/TraitColorView'; |
||||
|
import TraitButtonView from './view/TraitButtonView'; |
||||
|
import EditorModel from '../editor/model/Editor'; |
||||
|
import Component from '../dom_components/model/Component'; |
||||
|
|
||||
|
export const evAll = 'trait'; |
||||
|
export const evPfx = `${evAll}:`; |
||||
|
export const evCustom = `${evPfx}custom`; |
||||
|
|
||||
|
const typesDef = { |
||||
|
text: TraitView, |
||||
|
number: TraitNumberView, |
||||
|
select: TraitSelectView, |
||||
|
checkbox: TraitCheckboxView, |
||||
|
color: TraitColorView, |
||||
|
button: TraitButtonView, |
||||
|
}; |
||||
|
|
||||
|
interface ITraitView { |
||||
|
noLabel?: TraitView['noLabel']; |
||||
|
eventCapture?: TraitView['eventCapture']; |
||||
|
templateInput?: TraitView['templateInput']; |
||||
|
onEvent?: TraitView['onEvent']; |
||||
|
onUpdate?: TraitView['onUpdate']; |
||||
|
createInput?: TraitView['createInput']; |
||||
|
createLabel?: TraitView['createLabel']; |
||||
|
} |
||||
|
|
||||
|
export type CustomTrait<T> = ITraitView & T & ThisType<T & TraitView>; |
||||
|
|
||||
|
export default class TraitManager extends Module<TraitManagerConfig & { pStylePrefix?: string }> { |
||||
|
view?: TraitsView; |
||||
|
types: { [id: string]: { new (o: any): TraitView } }; |
||||
|
model: Model; |
||||
|
__ctn?: any; |
||||
|
TraitsView = TraitsView; |
||||
|
|
||||
|
events = { |
||||
|
all: evAll, |
||||
|
custom: evCustom, |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Get configuration object |
||||
|
* @name getConfig |
||||
|
* @function |
||||
|
* @return {Object} |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Initialize module. Automatically called with a new instance of the editor |
||||
|
* @param {Object} config Configurations |
||||
|
* @private |
||||
|
*/ |
||||
|
constructor(em: EditorModel) { |
||||
|
super(em, 'TraitManager', defaults); |
||||
|
const c = this.config; |
||||
|
const model = new Model(); |
||||
|
this.model = model; |
||||
|
const ppfx = c.pStylePrefix; |
||||
|
this.types = { ...typesDef }; |
||||
|
ppfx && (c.stylePrefix = `${ppfx}${c.stylePrefix}`); |
||||
|
|
||||
|
const upAll = debounce(() => this.__upSel(), 0); |
||||
|
model.listenTo(em, 'component:toggled', upAll); |
||||
|
|
||||
|
const update = debounce(() => this.__onUp(), 0); |
||||
|
model.listenTo(em, 'trait:update', update); |
||||
|
|
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
__upSel() { |
||||
|
this.select(this.em.getSelected()); |
||||
|
} |
||||
|
|
||||
|
__onUp() { |
||||
|
this.select(this.getSelected()); |
||||
|
} |
||||
|
|
||||
|
select(component?: Component) { |
||||
|
const traits = component ? component.getTraits() : []; |
||||
|
this.model.set({ component, traits }); |
||||
|
this.__trgCustom(); |
||||
|
} |
||||
|
|
||||
|
getSelected() { |
||||
|
return this.model.get('component') || null; |
||||
|
} |
||||
|
|
||||
|
getCurrent() { |
||||
|
return this.model.get('traits') || []; |
||||
|
} |
||||
|
|
||||
|
__trgCustom(opts: any = {}) { |
||||
|
this.__ctn = this.__ctn || opts.container; |
||||
|
this.em.trigger(this.events.custom, { container: this.__ctn }); |
||||
|
} |
||||
|
|
||||
|
postRender() { |
||||
|
this.__appendTo(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* Get Traits viewer |
||||
|
* @private |
||||
|
*/ |
||||
|
getTraitsViewer() { |
||||
|
return this.view; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Add new trait type |
||||
|
* @param {string} name Type name |
||||
|
* @param {Object} methods Object representing the trait |
||||
|
*/ |
||||
|
addType<T>(name: string, trait: CustomTrait<T>) { |
||||
|
const baseView = this.getType('text'); |
||||
|
//@ts-ignore
|
||||
|
this.types[name] = baseView.extend(trait); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get trait type |
||||
|
* @param {string} name Type name |
||||
|
* @return {Object} |
||||
|
*/ |
||||
|
getType(name: string) { |
||||
|
return this.getTypes()[name]; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get all trait types |
||||
|
* @returns {Object} |
||||
|
*/ |
||||
|
getTypes() { |
||||
|
return this.types; |
||||
|
} |
||||
|
|
||||
|
render() { |
||||
|
let { view } = this; |
||||
|
const config = this.getConfig(); |
||||
|
const el = view && view.el; |
||||
|
view = new TraitsView( |
||||
|
{ |
||||
|
el, |
||||
|
collection: [], |
||||
|
editor: config.em, |
||||
|
config, |
||||
|
}, |
||||
|
this.getTypes() |
||||
|
); |
||||
|
this.view = view; |
||||
|
return view.el; |
||||
|
} |
||||
|
|
||||
|
destroy() { |
||||
|
this.model.stopListening(); |
||||
|
this.model.clear(); |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue