import { shortcut } from "../../decorator"; import { Layout } from "../layout"; import { extend, each, isNotNull, isFunction, findIndex, isWidget, some, map, isKey } from "../../2.base"; import { _lazyCreateWidget } from "../../5.inject"; import { Events } from "../../constant"; import { Action } from "../../action"; /** * 卡片布局,可以做到当前只显示一个组件,其他的都隐藏 * @class CardLayout * @extends Layout * * @cfg {JSON} options 配置属性 * @cfg {String} options.defaultShowName 默认展示的子组件名 */ @shortcut() export class CardLayout extends Layout { static xtype = "bi.card"; props() { return extend(super.props(...arguments), { baseCls: "bi-card-layout", items: [], }); } render() { super.render(...arguments); const o = this.options; const items = isFunction(o.items) ? this.__watch(o.items, (context, newValue) => { this.populate(newValue); }) : o.items; this.populate(items); } stroke(items) { const o = this.options; this.showIndex = void 0; each(items, (i, item) => { if (item) { let w; if (!this.hasWidget(item.cardName)) { w = _lazyCreateWidget(item); w.on(Events.DESTROY, () => { const index = findIndex(o.items, (i, tItem) => tItem.cardName === item.cardName); if (index > -1) { o.items.splice(index, 1); } }); this.addWidget(this._getChildName(item.cardName), w); } else { w = this.getWidgetByName(this._getChildName(item.cardName)); } w.element.css({ position: "relative", top: "0", left: "0", width: "100%", height: "100%", }); w.setVisible(false); } }); } resize() { // console.log("Card布局不需要resize"); } update(opt) { return this.forceUpdate(opt); } empty(...args) { super.empty(...args); this.options.items = []; } populate(...args) { super.populate(...args); this._mount(); this.options.defaultShowName && this.showCardByName(this.options.defaultShowName); } isCardExisted(cardName) { return some(this.options.items, (i, item) => item.cardName === cardName && item.el); } getCardByName(cardName) { if (!this.isCardExisted(cardName)) { throw new Error("cardName不存在", cardName); } return this._children[this._getChildName(cardName)]; } _deleteCardByName(cardName) { delete this._children[this._getChildName(cardName)]; const index = findIndex(this.options.items, (i, item) => item.cardName === cardName); if (index > -1) { this.options.items.splice(index, 1); } } deleteCardByName(cardName) { if (!this.isCardExisted(cardName)) { throw new Error("cardName不存在", cardName); } const child = this._children[this._getChildName(cardName)]; this._deleteCardByName(cardName); child && child._destroy(); } addCardByName(cardName, cardItem) { if (this.isCardExisted(cardName)) { throw new Error("cardName 已存在", cardName); } const widget = _lazyCreateWidget(cardItem, this); widget.element.css({ position: "relative", top: "0", left: "0", width: "100%", height: "100%", }).appendTo(this.element); widget.invisible(); this.addWidget(this._getChildName(cardName), widget); this.options.items.push({ el: cardItem, cardName }); return widget; } showCardByName(name, action, callback) { // name不存在的时候全部隐藏 const exist = this.isCardExisted(name); if (isNotNull(this.showIndex)) { this.lastShowIndex = this.showIndex; } this.showIndex = name; let flag = false; each(this.options.items, (i, item) => { const el = this._children[this._getChildName(item.cardName)]; if (el) { if (name !== item.cardName) { // 动画效果只有在全部都隐藏的时候才有意义,且只要执行一次动画操作就够了 !flag && !exist && (Action && action instanceof Action) ? (action.actionBack(el), flag = true) : el.invisible(); } else { (Action && action instanceof Action) ? action.actionPerformed(void 0, el, callback) : (el.visible(), callback && callback()); } } }); } showLastCard() { this.showIndex = this.lastShowIndex; each(this.options.items, (i, item) => { this._children[this._getChildName(item.cardName)].setVisible(this.showIndex === i); }); } setDefaultShowName(name) { this.options.defaultShowName = name; return this; } getDefaultShowName() { return this.options.defaultShowName; } getAllCardNames() { return map(this.options.items, (i, item) => item.cardName); } getShowingCard() { if (!isKey(this.showIndex)) { return void 0; } return this.getWidgetByName(this._getChildName(this.showIndex)); } deleteAllCard() { each(this.getAllCardNames(), (i, name) => { this.deleteCardByName(name); }); } hideAllCard() { each(this.options.items, (i, item) => { this._children[this._getChildName(item.cardName)].invisible(); }); } isAllCardHide() { let flag = true; some(this.options.items, (i, item) => { if (this._children[this._getChildName(item.cardName)].isVisible()) { flag = false; return false; } }); return flag; } removeWidget(nameOrWidget) { let removeName; if (isWidget(nameOrWidget)) { each(this._children, (name, child) => { if (child === nameOrWidget) { removeName = name; } }); } else { removeName = nameOrWidget; } if (removeName) { this._deleteCardByName(removeName); } } }