silex-website-builder-goodevent
Version:
Free and easy website builder for everyone.
149 lines (132 loc) • 4.52 kB
text/typescript
/**
* Silex, live web creation
* http://projects.silexlabs.org/?/silex/
*
* Copyright (c) 2012 Silex Labs
* http://www.silexlabs.org/
*
* Silex is available under the GPL license
* http://www.silexlabs.org/silex/silex-licensing/
*/
/**
* @fileoverview This is the pane's base class
* Property panes displayed in the property tool box.
* Controls the params of the selected component.
*
*/
import { SelectableState } from 'drag-drop-stage-component/src/ts/Types';
import { Controller, Model } from '../../types';
/**
* base class for all UI panes of the view.pane package
*
* @param element container to render the UI
* @param model model class which holds
* the model instances - views use it for read
* operation only
* @param controller structure which holds
* the controller instances
*/
export class PaneBase {
protected pageNames: string[];
protected currentPageName: string;
/**
* store the last selection
*/
protected states: SelectableState[] = null;
/**
* base url for relative/absolute urls
*/
protected baseUrl = null;
constructor(protected element: HTMLElement, protected model: Model, protected controller: Controller) {}
/**
* notify the controller that the style changed
* @param styleName not css style but camel case
*/
styleChanged(styleName: string, opt_styleValue?: string, opt_elements?: HTMLElement[]) {
// notify the controller
this.controller.propertyToolController.styleChanged(styleName, opt_styleValue, opt_elements);
}
/**
* notify the controller that a property has changed
* @param propertyName property name, e.g. 'src'
*/
propertyChanged(propertyName: string, opt_propertyValue?: string, opt_elements?: HTMLElement[], opt_applyToContent?: boolean) {
// notify the controller
this.controller.propertyToolController.propertyChanged(propertyName, opt_propertyValue, opt_elements, opt_applyToContent);
}
/**
* refresh the displayed data
* @param selectedElements the elements currently selected
* @param pageNames the names of the pages which appear in the current HTML file
* @param currentPageName the name of the current page
*/
redraw(states: SelectableState[], pageNames: string[], currentPageName: string) {
this.states = states;
this.pageNames = pageNames;
this.currentPageName = currentPageName;
}
/**
* get the common property of a group of elements
* @param getPropertyFunction the callback which returns the value for one
* element
* @return ? {string|number|boolean} the value or null if the value is not the
* same for all elements
* FIXME: we should use Array::reduce
*/
getCommonProperty(states: SelectableState[], getPropertyFunction: (p1: SelectableState) => string | number | boolean | null): any {
let value = null;
let hasCommonValue: boolean = true;
let isFirstValue = true;
states.forEach((state) => {
const elementValue = getPropertyFunction(state);
if (isFirstValue) {
isFirstValue = false;
// init value
value = elementValue;
} else {
// check if there is a common type
if (elementValue !== value) {
hasCommonValue = false;
}
}
});
if (!hasCommonValue) {
value = null;
}
return value;
}
/**
* Init a combo box or
*/
protected initInput(selector: string, onChange: (e: Event) => void): HTMLInputElement {
return this.initEventTarget(selector, 'input', onChange);
}
/**
* Init a combo box or a checbox
*/
protected initComboBox(selector: string, onChange: (e: Event) => void): HTMLSelectElement {
return this.initEventTarget(selector, 'change', onChange) as any as HTMLSelectElement;
}
/**
* Init a combo box or a checbox
*/
protected initCheckBox(selector: string, onChange: (e: Event) => void): HTMLInputElement {
return this.initEventTarget(selector, 'change', onChange);
}
/**
* Init a combo box or
*/
private initEventTarget(selector: string, eventName: string, onChange: (e: Event) => void): HTMLInputElement {
// get a reference to the element
const eventTarget = this.element.querySelector(selector) as HTMLInputElement;
// attach event
eventTarget.addEventListener(eventName, (e: Event) => {
// let redraw update the value
e.preventDefault();
e.stopPropagation();
// call the provided callback
onChange(e);
});
return eventTarget;
}
}