fineui是帆软报表和BI产品线所使用的前端框架。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

472 lines
15 KiB

import {
shortcut,
extend,
emptyFn,
createWidget,
toPix,
nextTick,
Events,
AbsoluteLayout,
VerticalAdaptLayout,
deepClone
} from "@/core";
import { Single, Combo } from "@/base";
import { MultiTreeSearchInsertPane } from "trigger/multi.tree.search.insert.pane";
import { MultiTreePopup } from "multi.tree.popup";
import { MultiSelectTrigger } from "../multiselect/multiselect.trigger";
import {
TriggerIconButton,
ListPartTree,
ListDisplayTree,
Listasynctree
} from "@/case";
import { MultiSelectCheckSelectedSwitcher } from "../multiselect/trigger/switcher.checkselected";
@shortcut()
export class MultiTreeListCombo extends Single {
static xtype = "bi.multi_tree_list_combo";
static EVENT_FOCUS = "EVENT_FOCUS";
static EVENT_BLUR = "EVENT_BLUR";
static EVENT_STOP = "EVENT_STOP";
static EVENT_CLICK_ITEM = "EVENT_CLICK_ITEM";
static EVENT_SEARCHING = "EVENT_SEARCHING";
static EVENT_CONFIRM = "EVENT_CONFIRM";
static EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
_defaultConfig() {
return extend(super._defaultConfig(...arguments), {
baseCls: "bi-multi-tree-list-combo",
itemsCreator: emptyFn,
valueFormatter: emptyFn,
height: 24,
allowEdit: true,
allowInsertValue: true,
isNeedAdjustWidth: true,
text: "",
});
}
_init() {
const self = this,
o = this.options;
super._init(...arguments);
let isInit = false;
let want2showCounter = false;
this.storeValue = { value: o.value || [] };
this.trigger = createWidget({
type: "bi.multi_select_trigger",
allowEdit: o.allowEdit,
text: o.text,
defaultText: o.defaultText,
watermark: o.watermark,
height: toPix(o.height, o.simple ? 1 : 2),
valueFormatter: o.valueFormatter,
masker: {
offset: {
left: 0,
top: 0,
right: 0,
bottom: BI.SIZE_CONSANTS.LIST_ITEM_HEIGHT + 1,
},
},
searcher: {
type: "bi.multi_list_tree_searcher",
itemsCreator: o.itemsCreator,
popup: {
type: o.allowInsertValue
? "bi.multi_tree_search_insert_pane"
: "bi.multi_tree_search_pane",
el: {
type: ListPartTree.xtype,
},
listeners: [
{
eventName: MultiTreeSearchInsertPane.EVENT_ADD_ITEM,
action () {
self.storeValue.value.unshift([
self.trigger.getSearcher().getKeyword()
]);
self._assertShowValue();
// setValue以更新paras.value, 之后从search popup中拿到的就能有add的值了
self.combo.setValue(self.storeValue);
self.numberCounter.setValue(self.storeValue);
self._stopEditing();
self._dataChange = true;
},
}
],
},
},
switcher: {
el: {
type: "bi.multi_tree_check_selected_button",
},
popup: {
type: "bi.multi_tree_check_pane",
el: {
type: ListDisplayTree.xtype,
},
itemsCreator: o.itemsCreator,
},
},
value: this.storeValue,
});
this.combo = createWidget({
type: Combo.xtype,
cls: o.simple ? "bi-border-bottom" : "bi-border bi-border-radius",
toggle: !o.allowEdit,
container: o.container,
el: this.trigger,
adjustLength: 1,
popup: {
type: MultiTreePopup.xtype,
ref () {
self.popup = this;
self.trigger.setAdapter(this);
self.numberCounter.setAdapter(this);
},
el: {
type: Listasynctree.xtype,
},
listeners: [
{
eventName: MultiTreePopup.EVENT_AFTERINIT,
action () {
self.numberCounter.adjustView();
isInit = true;
if (want2showCounter === true) {
showCounter();
}
},
},
{
eventName: MultiTreePopup.EVENT_CHANGE,
action () {
change = true;
const val = {
type: BI.Selection.Multi,
value: this.hasChecked() ? this.getValue() : [],
};
self.trigger.getSearcher().setState(val);
self.numberCounter.setButtonChecked(val);
self.storeValue = { value: self.combo.getValue() };
self.fireEvent(
MultiTreeListCombo.EVENT_CLICK_ITEM,
self.getValue()
);
self._dataChange = true;
},
},
{
eventName: MultiTreePopup.EVENT_CLICK_CONFIRM,
action () {
self.combo.hideView();
},
},
{
eventName: MultiTreePopup.EVENT_CLICK_CLEAR,
action () {
clear = true;
self._dataChange = true;
self.setValue();
self._defaultState();
},
}
],
itemsCreator: o.itemsCreator,
onLoaded () {
nextTick(() => {
self.numberCounter.adjustView();
self.trigger.getSearcher().adjustView();
});
},
maxWidth: o.isNeedAdjustWidth ? "auto" : 500,
},
isNeedAdjustWidth: o.isNeedAdjustWidth,
value: this.storeValue,
hideChecker (e) {
return (
triggerBtn.element.find(e.target).length === 0 &&
self.numberCounter.element.find(e.target).length === 0
);
},
});
var change = false;
var clear = false; // 标识当前是否点击了清空
const isSearching = function () {
return self.trigger.getSearcher().isSearching();
};
const isPopupView = function () {
return self.combo.isViewVisible();
};
this.trigger.on(MultiSelectTrigger.EVENT_FOCUS, () => {
self.fireEvent(MultiTreeListCombo.EVENT_FOCUS);
});
this.trigger.on(MultiSelectTrigger.EVENT_BLUR, () => {
self.fireEvent(MultiTreeListCombo.EVENT_BLUR);
});
this.trigger.on(MultiSelectTrigger.EVENT_START, function () {
self.storeValue = { value: self.combo.getValue() };
this.setValue(self.storeValue);
self.numberCounter.setValue(self.storeValue);
});
this.trigger.on(MultiSelectTrigger.EVENT_STOP, function () {
self.storeValue = { value: this.getValue() };
self.combo.setValue(self.storeValue);
self.numberCounter.setValue(self.storeValue);
nextTick(() => {
if (isPopupView()) {
self.combo.populate();
}
});
self.fireEvent(MultiTreeListCombo.EVENT_STOP);
});
this.trigger.on(MultiSelectTrigger.EVENT_SEARCHING, () => {
self.fireEvent(MultiTreeListCombo.EVENT_SEARCHING);
});
function showCounter() {
if (isSearching()) {
self.storeValue = { value: self.trigger.getValue() };
} else if (isPopupView()) {
self.storeValue = { value: self.combo.getValue() };
}
self.trigger.setValue(self.storeValue);
self.numberCounter.setValue(self.storeValue);
}
this.trigger.on(MultiSelectTrigger.EVENT_TRIGGER_CLICK, () => {
self.combo.toggle();
});
this.trigger.on(MultiSelectTrigger.EVENT_CHANGE, function () {
const checked = this.getSearcher().hasChecked();
const val = {
type: BI.Selection.Multi,
value: checked ? { 1: 1 } : {},
};
this.getSearcher().setState(
checked ? BI.Selection.Multi : BI.Selection.None
);
self.numberCounter.setButtonChecked(val);
self.fireEvent(
MultiTreeListCombo.EVENT_CLICK_ITEM,
self.combo.getValue()
);
self._dataChange = true;
});
this.combo.on(Combo.EVENT_BEFORE_POPUPVIEW, function () {
if (isSearching()) {
return;
}
if (!this.isViewVisible()) {
self._dataChange = false; // 标记数据是否发生变化
}
if (change === true) {
self.storeValue = { value: self.combo.getValue() };
change = false;
}
self.combo.setValue(self.storeValue);
self.numberCounter.setValue(self.storeValue);
self.populate();
self.fireEvent(MultiTreeListCombo.EVENT_BEFORE_POPUPVIEW);
});
this.combo.on(Combo.EVENT_BEFORE_HIDEVIEW, () => {
if (isSearching()) {
self.trigger.stopEditing();
self._dataChange &&
self.fireEvent(MultiTreeListCombo.EVENT_CONFIRM);
} else {
if (isPopupView()) {
self._stopEditing();
self.storeValue = { value: self.combo.getValue() };
if (clear === true) {
self.storeValue = { value: [] };
}
self._dataChange &&
self.fireEvent(MultiTreeListCombo.EVENT_CONFIRM);
}
}
clear = false;
change = false;
});
var triggerBtn = createWidget({
type: TriggerIconButton.xtype,
width: o.height,
height: o.height,
cls: "multi-select-trigger-icon-button",
});
triggerBtn.on(TriggerIconButton.EVENT_CHANGE, () => {
self.numberCounter.hideView();
if (self.combo.isViewVisible()) {
self.combo.hideView();
} else {
self.combo.showView();
}
});
this.numberCounter = createWidget({
type: "bi.multi_select_check_selected_switcher",
el: {
type: "bi.multi_tree_check_selected_button",
},
popup: {
type: "bi.multi_tree_check_pane",
},
itemsCreator: o.itemsCreator,
masker: {
offset: {
left: 0,
top: 0,
right: 0,
bottom: BI.SIZE_CONSANTS.LIST_ITEM_HEIGHT + 1,
},
},
valueFormatter: o.valueFormatter,
value: o.value,
});
this.numberCounter.on(
MultiSelectCheckSelectedSwitcher.EVENT_TRIGGER_CHANGE,
() => {
if (!self.combo.isViewVisible()) {
self.combo.showView();
}
}
);
this.numberCounter.on(
MultiSelectCheckSelectedSwitcher.EVENT_BEFORE_POPUPVIEW,
() => {
if (want2showCounter === false) {
want2showCounter = true;
}
if (isInit === true) {
want2showCounter = null;
showCounter();
}
}
);
this.numberCounter.on(Events.VIEW, b => {
nextTick(() => {
// 自动调整宽度
self.trigger.refreshPlaceHolderWidth(
b === true ? self.numberCounter.element.outerWidth() + 8 : 0
);
});
});
this.numberCounter.on(
MultiSelectCheckSelectedSwitcher.EVENT_AFTER_HIDEVIEW,
() => {
nextTick(() => {
// 收起时自动调整宽度
self.trigger.refreshPlaceHolderWidth(0);
});
}
);
this.trigger.element.click(e => {
if (self.trigger.element.find(e.target).length > 0) {
self.numberCounter.hideView();
}
});
createWidget({
type: AbsoluteLayout.xtype,
element: this,
items: [
{
el: this.combo,
left: 0,
right: 0,
top: 0,
bottom: 0,
},
{
el: triggerBtn,
right: 0,
top: 0,
bottom: 0,
},
{
el: {
type: VerticalAdaptLayout.xtype,
items: [this.numberCounter],
},
right: o.height,
top: 0,
height: o.height,
}
],
});
}
_assertShowValue() {
this.trigger.getSearcher().setState(this.storeValue);
this.numberCounter.setButtonChecked(this.storeValue);
}
_stopEditing() {
this.trigger.stopEditing();
this.numberCounter.hideView();
}
_defaultState() {
this._stopEditing();
this.combo.hideView();
}
showView() {
this.combo.showView();
}
hideView() {
this.combo.hideView();
}
getSearcher() {
return this.trigger.getSearcher();
}
setValue(v) {
this.storeValue.value = v || [];
this.combo.setValue({
value: v || [],
});
this.numberCounter.setValue({
value: v || [],
});
}
getValue() {
return deepClone(this.storeValue.value);
}
populate() {
this.combo.populate();
}
focus() {
this.trigger.focus();
}
blur() {
this.trigger.blur();
}
setWaterMark(v) {
this.trigger.setWaterMark(v);
}
}