##// END OF EJS Templates
Merge
Merge

File last commit:

r146:af4f8424e83d v1.9.0 default
r154:2a5720a0816e merge default
Show More
DjxWidgetBase.ts
142 lines | 5.2 KiB | video/mp2t | TypeScriptLexer
/ djx / src / main / ts / tsx / DjxWidgetBase.ts
cin
minor fix
r83 import { djbase, djclass } from "../declare";
cin
Converted to subproject djx, removed dojo-typings
r65 import _WidgetBase = require("dijit/_WidgetBase");
import _AttachMixin = require("dijit/_AttachMixin");
cin
fixed NlsBundle locale package loading...
r112 import { isNode, isElementNode } from "./traits";
cin
Converted to subproject djx, removed dojo-typings
r65 import registry = require("dijit/registry");
cin
@on decorator registers handlers directry on domNode, added support to multiple events in one decorator...
r85 import on = require("dojo/on");
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 import { Scope } from "./Scope";
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 import { queueRenderTask, getPriority, render } from "./render";
cin
fixed NlsBundle locale package loading...
r112 import { isNull } from "@implab/core-amd/safe";
cin
Converted to subproject djx, removed dojo-typings
r65
// type Handle = dojo.Handle;
export interface EventArgs {
bubbles?: boolean;
cancelable?: boolean;
composed?: boolean;
}
cin
linting
r109 // eslint-disable-next-line @typescript-eslint/no-unused-vars
export interface DjxWidgetBase<Attrs = object, Events extends { [name in keyof Events]: Event } = object> extends
cin
Switched to @implab/dojo-typings
r71 _WidgetBase<Events> {
cin
temp commit, working on @on() decorator
r72
cin
implemented @on("event-name") decorator for event handlers
r73 /** This property is declared only for type inference to work, it is never assigned
* and should not be used.
*/
cin
temp commit, working on @on() decorator
r72 readonly _eventMap: Events & GlobalEventHandlersEventMap;
cin
fixed DjxWidgetBase._eventHandlers initialization
r81
/** The list of pairs of event and method names. When the widget is created all methods from
* this list will be connected to corresponding events.
*
* This property is maintained in the prototype
*/
_eventHandlers: Array<{
eventName: string,
cin
linting
r109 handlerMethod: string;
cin
fixed DjxWidgetBase._eventHandlers initialization
r81 }>;
cin
Switched to @implab/dojo-typings
r71 }
cin
Converted to subproject djx, removed dojo-typings
r65
cin
Switched to @implab/dojo-typings
r71 type _super = {
startup(): void;
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102
destroy(preserveDom?: boolean): void;
cin
fixed tslint errors, added support for private methods to @on() decorator
r79 };
cin
Converted to subproject djx, removed dojo-typings
r65
@djclass
cin
linting
r109 // eslint-disable-next-line @typescript-eslint/no-unused-vars
export abstract class DjxWidgetBase<Attrs = object, Events = object> extends djbase<_super, _AttachMixin>(_WidgetBase, _AttachMixin) {
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 private readonly _scope = new Scope();
cin
Converted to subproject djx, removed dojo-typings
r65
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 private readonly _priority = getPriority() + 1;
cin
Converted to subproject djx, removed dojo-typings
r65 buildRendering() {
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 const node = render(this.render(), this._scope);
if (!isElementNode(node))
throw new Error("The render method must return a single DOM element");
this.domNode = node as HTMLElement;
cin
Converted to subproject djx, removed dojo-typings
r65 super.buildRendering();
// now we should get assigned data-dojo-attach-points
// place the contents of the original srcNode to the containerNode
const src = this.srcNodeRef;
const dest = this.containerNode;
cin
implemented @on("event-name") decorator for event handlers
r73 // the donNode is constructed now we need to connect event handlers
this._connectEventHandlers();
cin
Converted to subproject djx, removed dojo-typings
r65 if (src && dest) {
while (src.firstChild)
dest.appendChild(src.firstChild);
}
}
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 /** Schedules a new deferred rendition within the scope of the widget */
scheduleRender(task: () => void) {
return queueRenderTask(task, this._scope, this._priority);
}
cin
fixed NlsBundle locale package loading...
r112 abstract render(): JSX.Element;
cin
Converted to subproject djx, removed dojo-typings
r65
cin
temp commit, working on @on() decorator
r72 private _connectEventHandlers() {
cin
minor fix
r83 if (this._eventHandlers)
this._eventHandlers.forEach(({ eventName, handlerMethod }) => {
const handler = this[handlerMethod as keyof this];
if (typeof handler === "function")
cin
linting
r109 on(this.domNode, eventName, handler.bind(this) as (...args: unknown[]) => unknown);
cin
minor fix
r83 });
cin
temp commit, working on @on() decorator
r72 }
cin
Converted to subproject djx, removed dojo-typings
r65 _processTemplateNode<T extends (Element | Node | _WidgetBase)>(
baseNode: T,
cin
fixed NlsBundle locale package loading...
r112 getAttrFunc: (baseNode: T, attr: string) => string | undefined,
cin
Converted to subproject djx, removed dojo-typings
r65 // tslint:disable-next-line: ban-types
cin
linting
r109 attachFunc: (node: T, type: string, func?: (...args: unknown[]) => unknown) => dojo.Handle
cin
Converted to subproject djx, removed dojo-typings
r65 ): boolean {
if (isNode(baseNode)) {
const w = registry.byNode(baseNode);
if (w) {
// from dijit/_WidgetsInTemplateMixin
this._processTemplateNode(w,
cin
fixed NlsBundle locale package loading...
r112 (n, p) => {
const v = n.get(p as keyof typeof n);
return isNull(v) ? undefined : String(v);
}, // callback to get a property of a widget
cin
Converted to subproject djx, removed dojo-typings
r65 (widget, type, callback) => {
if (!callback)
throw new Error("The callback must be specified");
// callback to do data-dojo-attach-event to a widget
if (type in widget) {
// back-compat, remove for 2.0
return widget.connect(widget, type, callback as EventListener);
} else {
// 1.x may never hit this branch, but it's the default for 2.0
cin
linting
r109 return widget.on(type as keyof GlobalEventHandlersEventMap, callback);
cin
Converted to subproject djx, removed dojo-typings
r65 }
});
// don't process widgets internals
return false;
}
}
cin
linting
r109 // eslint-disable-next-line @typescript-eslint/ban-types
cin
fixed NlsBundle locale package loading...
r112 return super._processTemplateNode(baseNode, getAttrFunc as (baseNode: T, attr: string) => string, attachFunc as (node: T, type: string, func?: Function) => dojo.Handle);
cin
Converted to subproject djx, removed dojo-typings
r65 }
/** Starts current widget and all its supporting widgets (placed outside
* `containerNode`) and child widgets (placed inside `containerNode`)
*/
startup() {
// startup supporting widgets
registry.findWidgets(this.domNode, this.containerNode).forEach(w => w.startup());
super.startup();
}
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102
destroy(preserveDom?: boolean) {
this._scope.destroy();
super.destroy(preserveDom);
}
cin
Converted to subproject djx, removed dojo-typings
r65 }