jsdk-offical
Version:
JSDK is the most comprehensive TypeScript framework, like JDK.
196 lines (165 loc) • 7.45 kB
text/typescript
/**
* @project JSDK
* @license MIT
* @website https://github.com/fengboyue/jsdk
*
* @version 2.0.0
* @author Frank.Feng
*/
/// <reference path="Widget.ts"/>
module JS {
export namespace fx {
export enum DialogFaceMode {
round = 'round',
square = 'square'
}
export interface DialogButtonOption {
text: string;
colorMode?: ColorMode | string;
onClick?: ((this: Dialog, e: Event, button: HTMLElement, index: number) => boolean | void);
}
export class DialogConfig extends WidgetConfig<Dialog> {
title?: string = '';
faceMode?: DialogFaceMode = DialogFaceMode.square;
hidden?: boolean = true;
buttons?: Array<DialogButtonOption>;
html?: string | Element | JQuery<HTMLElement> = '';
url?: string;
autoDestroy?: boolean = true;
childWidgets?: JsonObject<WidgetConfig<any>>;
listeners?: DialogListeners;
}
export type DialogEvents = WidgetEvents;
export interface DialogListeners extends WidgetListeners<Dialog> {};
export class Dialog extends Widget {
private _children: JsonObject<Widget>;
constructor(config: DialogConfig) {
super(config);
}
private _loaded = false;
public load(api?: string, params?: JsonObject, encode?:boolean) {
let cfg = <DialogConfig>this._config,
remote: string = api || <string>cfg.url;
if (!remote) return;
let url = new URI(remote).queryObject(params, encode).toString();
cfg.url = url;
this._mainEl.find('div.modal-body').off().empty().html('<iframe frameborder="0" width="100%" height="100%" src="' + url + '"></iframe>');
}
public show<Dialog>() {
if (!this._loaded) this.load();
this._mainEl.modal('show');
return this;
}
public hide<Dialog>() {
this._mainEl.modal('hide');
return this;
}
public toggle() {
this._mainEl.modal('toggle');
return this;
}
public isShown(): boolean {
let d = this._mainEl.data('bs.modal');
return d ? d._isShown : false;
}
protected _mainEl: JQuery<HTMLElement>;/** 组件内部主DOM对象 */
protected _render() {
let cfg = <DialogConfig>this._config,
cHtml = cfg.html ? (Types.isString(cfg.html) ? cfg.html : $(cfg.html).html()) : '';
let btnHtml = '', buttons = cfg.buttons;
if (buttons && buttons.length > 0) {
btnHtml = '<div class="modal-footer">';
buttons.forEach((opt, i) => {
btnHtml += `<button id="${this.id + '_button' + i}" type="button" class="btn btn-${opt.colorMode || ColorMode.primary}" data-dismiss="modal">${opt.text}</button>`;
})
btnHtml += '</div>';
}
let titleHtml = '';
if(cfg.title) titleHtml = `
<div class="modal-header">
<div class="modal-title">${cfg.title}</div>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
`
let html = `
<div class="modal fade" tabindex="-1" role="dialog" aria-hidden="false" jsfx-role="main">
<div class="modal-dialog modal-dialog-centered" role="document" style="min-width:${CssTool.normValue(cfg.width,'auto')}">
<div class="modal-content" style="border-radius:${this._hasFaceMode(DialogFaceMode.round) ? '0.3rem' : '0px'}">
${titleHtml}
<div class="modal-body jsfx-dialog-body" style="height:${CssTool.normValue(cfg.height,'100%')}">
${cHtml}
</div>
${btnHtml}
</div>
</div>
</div>
`;
this.widgetEl.html(html);
this._renderChildren();
//bind buttons click
let btnCt = this.widgetEl.find('div.modal-footer');
if (buttons && btnCt.length == 1) {
buttons.forEach((opt, i) => {
let me = this;
if (opt.onClick) $('#' + this.id + '_button' + i).click(function (e: JQuery.Event) {
return opt.onClick.apply(me, [e.originalEvent, this, i])
})
})
}
//rebind events
this._mainEl = this.widgetEl.find('[jsfx-role=main]');
this._mainEl.off();
this._mainEl.on('show.bs.modal', () => { this._fire('showing') });
this._mainEl.on('shown.bs.modal', () => { this._fire('shown') });
this._mainEl.on('hide.bs.modal', () => { this._fire('hiding') });
this._mainEl.on('hidden.bs.modal', () => {
this._fire('hidden');
if ((<DialogConfig>this._config).autoDestroy) this.destroy();
});
this._mainEl.modal({
backdrop:'static',
show: !cfg.hidden
})
}
protected _destroy() {
super._destroy();
this._mainEl.modal('dispose');
$('div.modal-backdrop').remove();
Jsons.forEach(this._children, wgt => {
wgt.destroy()
})
}
public buttons(): JQuery {
return this._mainEl.find('div.modal-footer button')
}
public child<T = Widget | JsonObject<Widget>>(id?: string): T {
return id ? this._children : <any>this._children[id];
}
private _renderChildren() {
let els = this.widgetEl.find(`div.modal-body div[${View.WIDGET_ATTRIBUTE}]`);
if (els.length < 1) return;
this._children = {};
let wConfigs = (<DialogConfig>this._config).childWidgets;
els.each((i: number, e: HTMLElement) => {
let el = $(e),
name = el.attr('name'),
id = el.attr('id'),
alias = el.attr(View.WIDGET_ATTRIBUTE);
let cfg: WidgetConfig<Widget> = Jsons.union(wConfigs && wConfigs[id], { id: id, name: name });
this._children[id] = Class.aliasInstance<Widget>(alias, cfg);
});
}
protected _onAfterInit() {
if (!this._config.hidden) this.show();
}
}
}
}
import Dialog = JS.fx.Dialog;
import DialogConfig = JS.fx.DialogConfig;
import DialogEvents = JS.fx.DialogEvents;
import DialogListeners = JS.fx.DialogListeners;
import DialogFaceMode = JS.fx.DialogFaceMode;