diff --git a/bi.lessconfig.json b/bi.lessconfig.json index 7de7350ae..47959db2b 100644 --- a/bi.lessconfig.json +++ b/bi.lessconfig.json @@ -40,5 +40,6 @@ "@color-bi-text-header-background": "rgba(9, 30, 64, 0.9)", "@color-bi-text-header-background-theme-dark": "rgba(255, 255, 255, 0.9)", "@font-down-triangle": "e70b", - "@font-date": "e733" + "@font-date": "e733", + "@font-trigger-triangle": "e924" } \ No newline at end of file diff --git a/bin/cli/worker/template/main_thread.helper.t b/bin/cli/worker/template/main_thread.helper.t index 19ac36016..2ee06acb7 100644 --- a/bin/cli/worker/template/main_thread.helper.t +++ b/bin/cli/worker/template/main_thread.helper.t @@ -2,7 +2,7 @@ import { ${WorkerName}MainThreadWorker } from './main_thread/${workerName}_main_ // 不需要一起打包的话则不需要引入这行 // FuiWorkerPlugin中的属性会同步到fui-worker中,同时支持loader行内传入属性 // 根据实际需求传入inline,返回格式 true -> blob url,false -> servicePath -import { workerUrl } from 'fui-worker!./worker_thread/${workerName}_worker_thread'; +import workerUrl from 'fui-worker!./worker_thread/${workerName}_worker_thread'; export class ${WorkerName}WorkerHelper { private worker: ${WorkerName}MainThreadWorker; diff --git a/demo/js/widget/downlist/demo.downlist.js b/demo/js/widget/downlist/demo.downlist.js index 6c5382842..6b72ff61f 100644 --- a/demo/js/widget/downlist/demo.downlist.js +++ b/demo/js/widget/downlist/demo.downlist.js @@ -1,3 +1,15 @@ +(function () { + var CustomIcon = BI.inherit(BI.Widget, { + render: function () { + return { + type: "bi.label", + text: "✨", + }; + }, + }); + BI.shortcut("demo.downlist.icon", CustomIcon); +}()); + Demo.Downlist = BI.inherit(BI.Widget, { props: { baseCls: "demo-downlist" @@ -22,9 +34,9 @@ Demo.Downlist = BI.inherit(BI.Widget, { render: function () { var self = this; - // test + return { - type: "bi.horizontal_adapt", + type: "bi.left", items: [{ type: "bi.down_list_combo", ref: function (_ref) { @@ -131,7 +143,51 @@ Demo.Downlist = BI.inherit(BI.Widget, { // }] }] - ] + ], + }, { + type: "bi.down_list_combo", + el: { + type: "bi.button", + ghost: true, + iconPosition: "right", + icon: "column-next-page-h-font", + text: "自定义 trigger 和 icon 的级联下拉框", + }, + listeners: [{ + eventName: "EVENT_CHANGE", + action: function (v) { + console.log("触发值", v); + } + }, { + eventName: "EVENT_SON_VALUE_CHANGE", + action: function(v) { + console.log("二级菜单触发值", v) + } + }], + items: [ + [{ + el: { + text: "选项一", + value: 1, + icon: { + type: "demo.downlist.icon", + }, + }, + children: [{ + text: "选项一", + value: 11, + icon: { + type: "demo.downlist.icon", + }, + }, { + text: "选项二", + value: 12, + }], + }, { + text: "选项二", + value: 2, + }] + ], }, { type: "bi.multi_layer_down_list_combo", ref: function (_ref) { diff --git a/package.json b/package.json index 6ccd9486e..55640e6d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20220826175704", + "version": "2.0.20220906172430", "description": "fineui", "main": "dist/fineui_without_conflict.min.js", "types": "dist/lib/index.d.ts", diff --git a/src/base/single/editor/editor.multifile.js b/src/base/single/editor/editor.multifile.js index 21765474d..2be8de9d2 100644 --- a/src/base/single/editor/editor.multifile.js +++ b/src/base/single/editor/editor.multifile.js @@ -43,12 +43,14 @@ BI.MultifileEditor = BI.inherit(BI.Widget, { }); this.file.on(BI.File.EVENT_ERROR, function () { self.fireEvent(BI.MultifileEditor.EVENT_ERROR, arguments); + self._reset(); }); this.file.on(BI.File.EVENT_PROGRESS, function () { self.fireEvent(BI.MultifileEditor.EVENT_PROGRESS, arguments); }); this.file.on(BI.File.EVENT_UPLOADED, function () { self.fireEvent(BI.MultifileEditor.EVENT_UPLOADED, arguments); + self._reset(); }); BI.createWidget({ @@ -93,7 +95,6 @@ BI.MultifileEditor = BI.inherit(BI.Widget, { }, upload: function () { - this._reset(); this.file.upload(); }, diff --git a/src/base/single/editor/editor.textarea.js b/src/base/single/editor/editor.textarea.js index 9f91b0ce4..d3838d29e 100644 --- a/src/base/single/editor/editor.textarea.js +++ b/src/base/single/editor/editor.textarea.js @@ -79,7 +79,7 @@ BI.TextAreaEditor = BI.inherit(BI.Single, { BI.Widget._renderEngine.createElement(document).unbind("mousedown." + self.getName()); }); this.content.element.keydown(function () { - // 水印快速消失 + // 水印快速消失 self._checkWaterMark(); }); this.content.element.keyup(function (e) { @@ -111,7 +111,6 @@ BI.TextAreaEditor = BI.inherit(BI.Single, { cls: "bi-water-mark textarea-watermark", textAlign: "left", whiteSpace: o.scrolly ? "normal" : "nowrap", - title: o.watermark, text: o.watermark, invalid: o.invalid, disabled: o.disabled, diff --git a/src/base/single/input/file.js b/src/base/single/input/file.js index 290970141..a17bb4955 100644 --- a/src/base/single/input/file.js +++ b/src/base/single/input/file.js @@ -56,7 +56,7 @@ del: document.removeEventListener ? function (node, name, callback) { node.removeEventListener(name, callback, false); - + return this; } : function (node, name, callback) { @@ -113,8 +113,8 @@ if (isFunction(handler.onerror)) { handler.onerror(); } - - return; + + return; } for (var xhr = new XMLHttpRequest, upload = xhr.upload || { @@ -245,7 +245,7 @@ form.append("FileData", handler.file); xhr.send(form); } - + return handler; }; } else { @@ -298,7 +298,7 @@ handler.onload(rpe, { responseText: responseText }); } } - + try { // IE < 8 does not accept enctype attribute ... var form = document.createElement("
"), iframe = handler.iframe || (handler.iframe = document.createElement("")); @@ -353,7 +353,7 @@ }; } xhr = null; - + return sendFile; }(Object.prototype.toString)); @@ -705,6 +705,7 @@ reset: function () { if (this.wrap) { + this.wrap.files = []; this.wrap.attach_array = []; this.wrap.attach_names = []; this.wrap.attachNum = 0; diff --git a/src/base/single/label/abstract.label.js b/src/base/single/label/abstract.label.js index c0443b39d..ab67a671a 100644 --- a/src/base/single/label/abstract.label.js +++ b/src/base/single/label/abstract.label.js @@ -24,23 +24,6 @@ }); }, - getTitle: function () { - var title = this.options.title; - var text = this.options.text; - if (BI.isFunction(title)) { - return title(); - } - if (BI.isNotNull(title)) { - return title; - } - - if (BI.isFunction(text)) { - return text(); - } - - return text; - }, - _createJson: function () { var o = this.options; diff --git a/src/base/single/label/label.js b/src/base/single/label/label.js index 98bfa3707..905efd29a 100644 --- a/src/base/single/label/label.js +++ b/src/base/single/label/label.js @@ -10,6 +10,23 @@ BI.Label = BI.inherit(BI.AbstractLabel, { keyword: "", }, + getTitle: function () { + var title = this.options.title; + var text = this.options.text; + if (BI.isFunction(title)) { + return title(); + } + if (BI.isNotNull(title)) { + return title; + } + + if (BI.isFunction(text)) { + return text(); + } + + return text; + }, + doRedMark: function () { this.text.doRedMark.apply(this.text, arguments); }, diff --git a/src/base/single/tip/tip.tooltip.js b/src/base/single/tip/tip.tooltip.js index 70c710497..eadbd05e9 100644 --- a/src/base/single/tip/tip.tooltip.js +++ b/src/base/single/tip/tip.tooltip.js @@ -53,6 +53,7 @@ BI.Tooltip = BI.inherit(BI.Tip, { whiteSpace: "normal", text: text, textHeight: 18, + title: null, }; }), }); @@ -63,6 +64,7 @@ BI.Tooltip = BI.inherit(BI.Tip, { textAlign: o.textAlign, whiteSpace: "normal", text: o.text, + title: null, textHeight: 18, hgap: this._const.hgap, vgap: this._const.vgap, diff --git a/src/case/button/icon/iconhalf/icon.half.js b/src/case/button/icon/iconhalf/icon.half.js index 6a46b165e..f8c23afc4 100644 --- a/src/case/button/icon/iconhalf/icon.half.js +++ b/src/case/button/icon/iconhalf/icon.half.js @@ -7,20 +7,34 @@ BI.HalfButton = BI.inherit(BI.BasicButton, { _defaultConfig: function () { var conf = BI.HalfIconButton.superclass._defaultConfig.apply(this, arguments); return BI.extend(conf, { - extraCls: "bi-half-button bi-high-light-border", - height: 14, + selected: false, width: 14, - selected: false + height: 14, + iconWidth: 14, + iconHeight: 14, }); }, + render: function () { + var o = this.options; + return { + type: "bi.center_adapt", + items: [{ + type: "bi.default", + cls: "bi-half-button bi-high-light-border", + width: o.iconWidth, + height: o.iconHeight, + }], + }; + }, + doClick: function () { BI.HalfButton.superclass.doClick.apply(this, arguments); - if(this.isValid()) { + if (this.isValid()) { this.fireEvent(BI.HalfButton.EVENT_CHANGE); } } }); BI.HalfButton.EVENT_CHANGE = "EVENT_CHANGE"; -BI.shortcut("bi.half_button", BI.HalfButton); \ No newline at end of file +BI.shortcut("bi.half_button", BI.HalfButton); diff --git a/src/case/combo/textvaluecombo/combo.textvalue.js b/src/case/combo/textvaluecombo/combo.textvalue.js index b9aaac2ba..d6c80ac95 100644 --- a/src/case/combo/textvaluecombo/combo.textvalue.js +++ b/src/case/combo/textvaluecombo/combo.textvalue.js @@ -76,7 +76,6 @@ BI.TextValueCombo = BI.inherit(BI.Widget, { type: "bi.text_value_combo_popup", ref: ref => this.popup = ref, chooseType: o.chooseType, - value: o.value, items: o.items, listeners: [ { diff --git a/src/core/4.widget.js b/src/core/4.widget.js index d24c01566..df560dc24 100644 --- a/src/core/4.widget.js +++ b/src/core/4.widget.js @@ -748,7 +748,16 @@ this.purgeListeners(); }, + _assetMounted: function () { + if (!this.isVisible()) { + this._setVisible(true); + this._mount(false, false, false); + this._setVisible(false); + } + }, + _empty: function () { + this._assetMounted(); BI.each(this._children, function (i, widget) { widget && widget._unMount && widget._unMount(); }); @@ -790,6 +799,7 @@ }); }); this._watchers && (this._watchers = []); + this._assetMounted(); this.__d(); this.element.empty(); this.element.unbind(); @@ -799,6 +809,7 @@ }, _destroy: function () { + this._assetMounted(); this.__destroy(); this.element.destroy(); this.purgeListeners(); @@ -806,6 +817,7 @@ destroy: function () { var self = this, o = this.options; + this._assetMounted(); this.__destroy(); if (o.animation) { this._innerSetVisible(false); diff --git a/src/core/utils/i18n.js b/src/core/utils/i18n.js index 9cec7cc48..8611ec0a9 100644 --- a/src/core/utils/i18n.js +++ b/src/core/utils/i18n.js @@ -1,5 +1,8 @@ !(function () { var i18nStore = {}; + + var i18nFormatters = {}; + BI._.extend(BI, { changeI18n: function (i18n) { if (i18n) { @@ -9,6 +12,7 @@ addI18n: function (i18n) { BI.extend(i18nStore, i18n); }, + i18nText: function (key) { var localeText = i18nStore[key] || (BI.i18n && BI.i18n[key]) || ""; if (!localeText) { @@ -16,10 +20,18 @@ } var len = arguments.length; if (len > 1) { - if (localeText.indexOf("{R1}") > -1) { + if (localeText.indexOf("{R1") > -1) { for (var i = 1; i < len; i++) { - var key = "{R" + i + "}"; - localeText = BI.replaceAll(localeText, key, arguments[i] + ""); + var reg = new RegExp(`{R${i},(.*?)}`, "g"); + + var result = reg.exec(localeText); + + if (result) { + var formatName = result[1]; + localeText = BI.replaceAll(localeText, reg, i18nFormatters[formatName](key, arguments[i])); + } else { + localeText = BI.replaceAll(localeText, `{R${i}}`, arguments[i] + ""); + } } } else { var args = Array.prototype.slice.call(arguments); @@ -30,6 +42,10 @@ } } return localeText; + }, + + addI18nFormatter: function (formatName, fn) { + i18nFormatters[formatName] = fn; } }); })(); diff --git a/src/less/base/single/button/item.singleselect.icontext.less b/src/less/base/single/button/item.singleselect.icontext.less deleted file mode 100644 index 2f698d894..000000000 --- a/src/less/base/single/button/item.singleselect.icontext.less +++ /dev/null @@ -1,9 +0,0 @@ -@import "../../../index.less"; - -.bi-single-select-icon-text-item{ - &:active, &.active { - & .b-font:before { - color: @color-bi-text-active-single-select-icon-text-item; - } - } -} \ No newline at end of file diff --git a/src/router/router.js b/src/router/router.js index 40ca8f3c4..4a2cf0c2f 100644 --- a/src/router/router.js +++ b/src/router/router.js @@ -2326,7 +2326,7 @@ route.matched[lastRouteIndex] === current.matched[lastCurrentIndex] ) { this.ensureURL(); - return abort(createNavigationDuplicatedError(current, route)) + return; } var ref = resolveQueue( diff --git a/src/widget/downlist/item.downlist.js b/src/widget/downlist/item.downlist.js index 068c94fab..531806ca0 100644 --- a/src/widget/downlist/item.downlist.js +++ b/src/widget/downlist/item.downlist.js @@ -33,17 +33,21 @@ BI.DownListItem = BI.inherit(BI.BasicButton, { keyword: o.keyword, height: o.height }); + + + var icon = BI.isPlainObject(o.icon) ? o.icon : { + type: "bi.icon", + width: o.iconWidth, + height: o.iconHeight, + } + this.icon = BI.createWidget({ type: "bi.center_adapt", width: 36, height: o.height, items: [{ - el: { - type: "bi.icon", - width: o.iconWidth, - height: o.iconHeight - } - }] + el: icon, + }], }); BI.createWidget(BI.extend({ diff --git a/src/widget/downlist/item.downlistgroup.js b/src/widget/downlist/item.downlistgroup.js index e142a72b7..df4a09ac7 100644 --- a/src/widget/downlist/item.downlistgroup.js +++ b/src/widget/downlist/item.downlistgroup.js @@ -8,11 +8,11 @@ BI.DownListGroupItem = BI.inherit(BI.BasicButton, { }, // invalid: true, iconCls1: "dot-e-font", + icon: "", iconCls2: "pull-right-e-font" }); }, - _init: function () { - BI.DownListGroupItem.superclass._init.apply(this, arguments); + render: function () { var o = this.options; var self = this; this.text = BI.createWidget({ @@ -21,20 +21,29 @@ BI.DownListGroupItem = BI.inherit(BI.BasicButton, { textAlign: "left", text: o.text, value: o.value, - height: o.height - }); - - this.icon1 = BI.createWidget({ - type: "bi.icon_button", - cls: o.iconCls1, - width: 36, height: o.height, - iconHeight: o.iconHeight, - iconWidth: 36, - disableSelected: true, - selected: this._digest(o.value) }); + if (BI.isPlainObject(o.icon)) { + this.icon1 = BI.createWidget({ + width: 36, + height: o.height, + type: "bi.center_adapt", + items: [o.icon], + }); + } else { + this.icon1 = BI.createWidget({ + type: "bi.icon_button", + cls: o.iconCls1, + width: 36, + height: o.height, + iconHeight: o.iconHeight, + iconWidth: 36, + disableSelected: true, + selected: this._digest(o.value), + }); + } + this.icon2 = BI.createWidget({ type: "bi.icon_button", cls: o.iconCls2, @@ -42,27 +51,6 @@ BI.DownListGroupItem = BI.inherit(BI.BasicButton, { forceNotSelected: true }); - var blank = BI.createWidget({ - type: "bi.layout", - width: 24 - }); - BI.createWidget({ - type: "bi.absolute", - element: this, - items: [{ - el: this.icon2, - top: 0, - bottom: 0, - right: 0 - }] - }); - - BI.createWidget(BI.extend({ - element: this - }, BI.LogicFactory.createLogic("horizontal", BI.extend(o.logic, { - items: BI.LogicFactory.createLogicItemsByDirection("left", this.icon1, this.text, blank) - })))); - this.element.hover(function () { if (self.isEnabled()) { self.hover(); @@ -72,6 +60,12 @@ BI.DownListGroupItem = BI.inherit(BI.BasicButton, { self.dishover(); } }); + + return { + type: "bi.horizontal_fill", + columnSize: [36, "fill", 24], + items: [this.icon1, this.text, this.icon2] + } }, _getLevel: function () { @@ -117,8 +111,8 @@ BI.DownListGroupItem = BI.inherit(BI.BasicButton, { }, setValue: function (v) { - this.icon1.setSelected(this._digest(v)); - } + this.icon1.setSelected && this.icon1.setSelected(this._digest(v)); + }, }); BI.DownListGroupItem.EVENT_CHANGE = "EVENT_CHANGE"; -BI.shortcut("bi.down_list_group_item", BI.DownListGroupItem); \ No newline at end of file +BI.shortcut("bi.down_list_group_item", BI.DownListGroupItem); diff --git a/typescript/base/single/button/buttons/button.ts b/typescript/base/single/button/buttons/button.ts index 9b357ae0c..102db20cb 100644 --- a/typescript/base/single/button/buttons/button.ts +++ b/typescript/base/single/button/buttons/button.ts @@ -10,8 +10,11 @@ export declare class Button extends BasicButton { minWidth?: number; readonly?: boolean; iconCls?: string; - level?: 'common' | 'success' | 'warning' |'ignore', + level?: 'common' | 'success' | 'warning' | 'error' | 'ignore', block?: boolean; // 是否块状显示,即不显示边框,没有最小宽度的限制 + loading?: boolean, // 是否处于加载中 + light?: boolean, // 是否使用浅色 + plain?: boolean, // 是否是朴素按钮,和 clear 的区别是 plain 有悬浮效果 clear?: boolean; // 是否去掉边框和背景 ghost?: boolean; // 是否幽灵显示, 即正常状态无背景 iconGap?: number; diff --git a/webpack/attachments.js b/webpack/attachments.js index cf26e9d09..bf16b1505 100644 --- a/webpack/attachments.js +++ b/webpack/attachments.js @@ -7,8 +7,13 @@ const workerCompact = './dist/fix/worker.compact.js'; const lodashJs = "src/core/1.lodash.js"; const jqueryJs = "src/core/platform/web/jquery/_jquery.js"; +const runtimePolyfill = ["@babel/polyfill", "es6-promise/auto"]; + const basicAttachmentMap = { - polyfill: sync(["src/core/0.foundation.js", "src/polyfill/**/*.js"]).concat(["@babel/polyfill", "es6-promise/auto"]), + polyfill: sync([ + "src/core/0.foundation.js", + "src/polyfill/**/*.js", + ]).concat(runtimePolyfill), core: sync([ "src/less/core/**/*.less", "src/less/theme/**/*.less", @@ -202,6 +207,7 @@ const fineuiProxy = [].concat( ); const fineuiWithoutJqueryAndPolyfillJs = [].concat( + runtimePolyfill, sync([ "src/core/0.foundation.js", lodashJs,