import {
observable,
action,
computed
} from 'mobx';
import {
WeaForm,
WeaTableNew,
} from 'comsMobx';
import {
WeaLocaleProvider,
} from 'ecCom';
import {
Modal,
Button,
message,
} from 'antd';
import {
toJS
} from 'mobx';
import {
fetch,
getMenusCreationConfig,
getTopButtons,
getDropMenuDatas,
getSearchButtons,
callback,
componentReset,
string,
executeFunction,
page,
} from '../util/save-time-util.js';
import {
SearchForm
} from '../public/sweet-form.js';
const getLabel = WeaLocaleProvider.getLabel;
const confirm = Modal.confirm;
const {
TableStore
} = WeaTableNew;
class CommonStore {
hasOrgTree = true; //页面是否包含组织树
hasAdvancedSearch = true; //页面是否包含高级搜索
hasTable = true; //页面是否包含列表
hasRadioGroup = false; //页面是否包含单选组合
hasTab = false; //页面是否包含标签页
isOrgTreeInfluenceForm = false; //组织树是否影响表单的生成
asyncFetch; //异步请求
customizedStore; //各个页面的store
permissAsyncName; //权限接口名称
menusAsyncName; //功能按钮接口名称
searchAsyncName; //高级搜索接口名称
tableAsyncName; //列表接口名称
delAsyncName; //删除接口名称
formAsyncName; //表单接口名称
secondFormAsyncName; //同步设置表单接口名称
addAsyncName; //新建保存接口名称
editAsyncName; //编辑保存接口名称
saveSecondFormAsyncName; //同步设置保存接口名称
tabAsyncName; //标签页接口名称
radioGroupAsyncName; //单选组合接口名称
editIdPropertyName; //编辑保存id名称
delIdPropertyName; //删除id名称
searchLinkageFieldName; //高级搜索表单需要联动的表单域
@action setPageConfig = (params) => {
page.initConfig(params, this);
}
//************权限*************
@observable pageAccessPermission = {
hasRight: false,
loading: true,
}
//获取页面权限
@action getPermissionInfo = () => {
fetch({
asyncFetch: this.asyncFetch,
name: this.permissAsyncName,
logic: (cb) => {
const {
hasRight
} = cb;
if (hasRight) {
this.pageAccessPermission.hasRight = true;
}
this.pageAccessPermission.loading = false;
const {
receivePermissionInfo
} = this.customizedStore;
receivePermissionInfo && receivePermissionInfo(cb);
}
});
}
@action resetAccessPermissionProps = () => {
['hasRight', 'loading'].map((v, i) => {
this.pageAccessPermission[v] = (i === 0) ? false : true;
});
}
//*************头部**************
topComponentStaticProps = {
icon: ,
iconBgcolor: '#217346',
showDropIcon: true
};
@observable top = {
btnMenu: [],
}
//获取按钮、下拉菜单和右键菜单的复合数据
@action getMenus = () => {
const {
menusParams,
setButtonSelectDatas,
} = this.customizedStore;
fetch({
asyncFetch: this.asyncFetch,
name: this.menusAsyncName,
fetchParams: menusParams,
logic: (cb) => {
const {
btnMenu,
buttonSelect,
} = cb;
this.top.btnMenu = btnMenu;
//页面存在下拉菜单
if (buttonSelect) {
setButtonSelectDatas ? setButtonSelectDatas(buttonSelect) : console.error(`setButtonSelectDatas(function) is not defined,it should be defined in customizedStore! `);
}
}
});
}
//根据btnMenu,计算出topMenu和rightMenu
@computed get menusCreationConfig() {
const {
btnMenu
} = this.top;
return getMenusCreationConfig(btnMenu);
}
//Top组件的按钮
get topButtons() {
const {
topMenu
} = this.menusCreationConfig;
const {
menuStatus
} = this.customizedStore;
return getTopButtons.call(this.customizedStore, {
datas: topMenu,
disabled: menuStatus ? menuStatus : console.error(`menuStatus is not defined,it should be defined in customizedStore! `),
})
}
//获取右键菜单和top组件下拉菜单的数据
get dropMenuDatas() {
const {
rightMenu
} = this.menusCreationConfig;
const {
menuStatus
} = this.customizedStore;
return getDropMenuDatas.call(this.customizedStore, {
datas: rightMenu,
disabled: menuStatus ? menuStatus : console.error(`menuStatus is not defined,it should be defined in customizedStore! `),
});
}
@action resetMenusConfig = () => {
this.top.btnMenu = [];
}
//**************组织树******************
@observable orgTree = {
triggerRefresh: false,
organizationId: '',
organizationType: '0', //默认总部
}
//组织树点击事件的回调函数
@action handleOrgTreeNodeClick = (params) => {
const {
id,
type,
name
} = params;
const {
changeSpinning,
resetTableEditableDatas,
isNeedCallMenusAsyncFetch,
} = this.customizedStore;
//设置当前节点的类型
this.orgTree.organizationType = type;
//设置当前节点的ID
this.orgTree.organizationId = id;
//触发页面的加载状态
changeSpinning && changeSpinning(true);
//是否需要重新调用Menus接口
isNeedCallMenusAsyncFetch && this.getMenus();
//初始化高级搜索
this.hasAdvancedSearch && this.initAdvanceSearch();
//获取标签页数据、初始化标签页
this.hasTab && this.getTabDatas();
//重置单选组合
this.hasRadioGroup && this.resetRadioGroup();
//重置可编辑列表保存参数
resetTableEditableDatas && resetTableEditableDatas();
//刷新列表
if (this.hasTable && !this.hasTab && !this.hasRadioGroup) {
this.getSearchList();
}
}
//手动刷新组织树
@action triggerRefresh = () => {
this.orgTree.triggerRefresh = !this.orgTree.triggerRefresh;
}
@action resetOrgTreeProps = () => {
['organizationType', 'organizationId'].map((v, i) => {
this.orgTree[v] = (i === 0) ? '0' : ''
});
}
@computed get orgTreeBaseCallbackParamsCollector() {
const {
organizationType,
organizationId
} = this.orgTree;
const callbackParams = {
organizationType,
organizationId,
};
return callbackParams;
}
//***************高级搜索*****************
@observable search = {
isPanelShow: false,
conditions: [],
form: new WeaForm(),
}
//获取生成高级搜索表单的数据
@action getSearchCondition = () => {
fetch({
asyncFetch: this.asyncFetch,
name: this.searchAsyncName,
logic: (cb) => {
const {
condition
} = cb;
this.search.conditions = condition;
this.search.form.initFormFields(condition);
}
});
}
//获取高级搜索基本值
@computed get searchBaseValue() {
const {
form
} = this.search;
return form.isFormInit ? form.getFormParams()[this.searchLinkageFieldName] : '';
}
//获取高级搜索表单
get searchsAd() {
const {
form
} = this.search;
return
( e.keyCode == 13 && e.target.tagName === "INPUT") && ['changeSearchPanelStatus', 'getSearchList'].map((f, i) => this[f](i === 0 && false))}
>{}
}
//获取高级搜索按钮组
get buttonsAd() {
const {
form
} = this.search;
const buttons = getSearchButtons({
form,
search: () => ['changeSearchPanelStatus', 'getSearchList'].map((f, i) => this[f](i === 0 && false)),
cancel: () => this.changeSearchPanelStatus(false),
});
return buttons;
}
//获取高级搜索下拉面板的高度
@computed get advanceHeight() {
const {
conditions
} = this.search;
const length = conditions.length > 0 ? conditions[0].items.length : 0;
return Math.ceil(length / 2) * 52 + 20;
}
//改变下拉面板的状态
@action changeSearchPanelStatus = (bool) => {
this.search.isPanelShow = bool;
}
//联动高级搜索表单中的字段
@action changeAdvanceSearchField = (val) => {
const {
form
} = this.search;
form.isFormInit && form.updateFields({
[this.searchLinkageFieldName]: {
value: val
}
})
}
//初始化高级搜索
@action initAdvanceSearch = () => {
const {
form,
isPanelShow,
} = this.search;
if (isPanelShow) this.changeSearchPanelStatus(false);
if (form.isFormInit) {
form.reset(); //点击当前菜单
} else {
this.search.form = new WeaForm(); //切换菜单
}
}
@action resetSearchProps = () => {
['conditions', 'form', 'isPanelShow'].map((v, i) => {
this.search[v] = (i === 0) ? [] : (i === 1) ? new WeaForm() : false;
});
}
//***************页签*****************
@observable tab = {
activeKey: '0',
datas: [],
ids: [],
}
//切换标签页
@action setTabActiveKey = (key) => {
const {
handleTabClick
} = this.customizedStore;
this.tab.activeKey = key;
handleTabClick && handleTabClick();
}
@action getTabDatas = () => {
if (!this.tabAsyncName) return
const {
organizationType,
organizationId
} = this.orgTree;
const params = {};
if (this.hasOrgTree) {
Object.assign(params, {
organizationType,
organizationId
});
}
fetch({
asyncFetch: this.asyncFetch,
name: this.tabAsyncName,
fetchParams: params,
logic: (cb) => {
const datas = callback.getArrayDatas(cb)
const ids = callback.getTabId(cb);
this.tab.datas = datas;
this.tab.ids = ids;
this.setTabActiveKey(0);
}
});
}
@action resetTabProps = () => {
['activeKey', 'datas', 'ids'].map((v, i) => {
this.tab[v] = (i === 0) ? '0' : [];
})
}
//***************单选组合(RadioGroup)*****************
@observable radioGroup = {
config: [],
activeParams: '',
}
@action getRadioGroupConfig = () => {
const {
radioGroupAsyncFetchParams
} = this.customizedStore;
fetch({
asyncFetch: this.asyncFetch,
name: this.radioGroupAsyncName,
fetchParams: radioGroupAsyncFetchParams,
logic: (cb) => {
//RadioGroup组件初始化的时候,会触发一次onChange事件,因此会调用一次列表接口,所以这里不需要重复调用列表接口。
const {
condition: conditions
} = cb;
const {
addCustomizedConfig,
} = this.customizedStore;
addCustomizedConfig && addCustomizedConfig(conditions, cb);
if (conditions) {
this.dataRectification(conditions, {
labelcol: 4,
fieldcol: 20
});
this.radioGroup.config = conditions[0].items;
}
}
});
}
dataRectification = (conditions, obj) => {
conditions.map(c => {
c.items.map(item => {
Object.keys(obj).map(key => {
if (Object.keys(item).includes(key)) {
item[key] = obj[key];
}
});
});
});
}
@action exportActiveParams = (params) => {
const {
isRequiredElementComplete
} = this.customizedStore;
this.radioGroup.activeParams = params;
if (isRequiredElementComplete && isRequiredElementComplete(params)) {
this.getSearchList();
} else {
console.warn('isRequiredElementComplete(function) should be defined in customizedStore!');
}
}
@action resetRadioGroup = () => {
const {
handleBrowserChange
} = this.customizedStore;
handleBrowserChange && handleBrowserChange('', false);
//这里重置单选组合(RadioGroup)会连续触发两次onChange事件,因此会调用两次列表接口。
['radioGroup', 'browser'].map(type => {
this[`${type}_ref`] && componentReset[`reset${string.capitalize(type)}`](this[`${type}_ref`]);
});
}
@action resetRadioGroupProps = () => {
['config', 'activeParams'].map((v, i) => {
this.radioGroup[v] = (i === 0) ? [] : '';
});
['radioGroup', 'browser'].map(v => {
this[`${v}_ref`] = null;
});
}
@computed get rgBaseCallbackParamsCollector() {
const callParams = {
...this.radioGroup.activeParams
}
return callParams;
}
//***************列表*****************
@observable table = {
id: '',
tableStore: new TableStore(),
canViewTable: true,
}
@computed get radioGroupParams() {
const {
radioGroupCustomizedComParams
} = this.customizedStore;
return {
...this.radioGroup.activeParams,
...(radioGroupCustomizedComParams ? radioGroupCustomizedComParams : {})
}
}
//获取列表数据
@action getSearchList = () => {
const {
isRequiredElementComplete
} = this.customizedStore, {
activeParams
} = this.radioGroup;
if (isRequiredElementComplete && !isRequiredElementComplete(activeParams)) return
const {
organizationId,
organizationType
} = this.orgTree;
const params = {};
if (this.search.form.isFormInit) {
Object.assign(params, this.search.form.getFormParams());
}
if (this.hasOrgTree) {
Object.assign(params, {
organizationId,
organizationType,
});
}
if (this.hasRadioGroup) {
Object.assign(params, this.radioGroupParams);
}
if (this.hasTab) {
const {
ids,
activeKey
} = this.tab;
Object.assign(params, getTabParam && getTabParam.call(this));
}
this.resetTable();
fetch({
asyncFetch: this.asyncFetch,
name: this.tableAsyncName,
fetchParams: params,
logic: (cb) => {
const {
sessionkey,
status,
} = cb;
if (status && status === '-1') {
this.table.canViewTable = false;
return;
}
this.table.canViewTable = true;
this.table.tableStore.getDatas(sessionkey, 1);
const {
receiveTableAsyncCallback
} = this.customizedStore;
receiveTableAsyncCallback && receiveTableAsyncCallback(cb);
}
});
}
//获取table参数
@action getListParams = () => {
const {
isRequiredElementComplete
} = this.customizedStore, {
activeParams
} = this.radioGroup;
if (isRequiredElementComplete && !isRequiredElementComplete(activeParams)) return
const {
organizationId,
organizationType
} = this.orgTree;
const params = {};
if (this.search.form.isFormInit) {
Object.assign(params, this.search.form.getFormParams());
}
if (this.hasOrgTree) {
Object.assign(params, {
organizationId,
organizationType,
});
}
if (this.hasRadioGroup) {
Object.assign(params, this.radioGroupParams);
}
if (this.hasTab) {
const {
ids,
activeKey
} = this.tab;
Object.assign(params, getTabParam && getTabParam.call(this));
}
return params
}
//删除列表数据
delTableRows = (type) => {
const {
id,
tableStore
} = this.table;
fetch({
asyncFetch: this.asyncFetch,
name: this.delAsyncName,
fetchParams: {
[this.delIdPropertyName]: (type === 1) ? tableStore.selectedRowKeys.toString() : id,
},
logic: (cb) => {
const {
sign
} = cb;
if (sign === '1') {
message.success(cb.message);
this.getSearchList();
} else {
message.warning(cb.message);
}
}
});
}
@action setSelectedRowId = (id) => {
this.table.id = id;
}
@action setSelectedRowIndex = (index) => {
this.table.index = index;
}
@action resetTable = () => {
this.table.tableStore = new TableStore();
}
//**************弹框****************
//弹框组件的常量参数
dialogStaticProps = {
icon: 'icon-coms-hrm',
iconBgcolor: '#217346',
hasScroll: true,
}
@observable dialog = {
title: '',
visible: false,
type: 0,
}
@action openDialog = (params) => {
const {
title,
type,
} = params;
['title', 'type', 'visible'].map((v, i) => {
this.dialog[v] = (i < 2) ? params[v] : true;
});
//调用表单接口
this.getFormMaterial();
}
@action closeDialog = () => {
const {
closeDialog
} = this.customizedStore;
//设置弹框隐藏
this.dialog.visible = false;
//重置表单数据
this.resetForm();
//不同页面,关闭弹框时,除了重置表单之外,还有其他的重置项。
closeDialog && closeDialog();
}
//**************表单****************
@observable formElements = {
conditions: [],
form: new WeaForm(),
loading: true,
date: new Date(), //用来刷新form组件
}
//获取表单数据
@action getFormMaterial = () => {
const {
id,
index,
} = this.table, {
type,
} = this.dialog, {
organizationType,
organizationId
} = this.orgTree;
const fetchParams = (type === 1) ? {
[this.editIdPropertyName]: id
} : {};
if (this.hasOrgTree && this.isOrgTreeInfluenceForm) {
Object.assign(fetchParams, {
organizationType,
organizationId,
});
}
const {
isMainForm,
setAdditionalFormDatas
} = this.customizedStore;
if (!isMainForm) {
console.error(`isMainForm(function) is not defined,it should be defined in customizedStore!`);
return
}
fetch({
asyncFetch: this.asyncFetch,
name: isMainForm() ? this.formAsyncName : this.secondFormAsyncName,
fetchParams: fetchParams,
logic: (cb) => {
const {
condition,
} = cb;
['loading', 'conditions', 'form'].map((v, i) => {
if (i < 2) {
this.formElements[v] = (i === 0) ? false : condition
} else {
this.formElements[v].initFormFields(condition);
}
});
setAdditionalFormDatas && setAdditionalFormDatas(cb);
}
});
}
//保存表单信息
saveFormDatas = () => {
const {
form
} = this.formElements, {
id
} = this.table, {
type
} = this.dialog, {
organizationType
} = this.orgTree;
const {
neglectHiddenField,
furtherValidate,
isRepeat,
isFieldRepeat,
getAdditionalParams,
} = this.customizedStore;
//不检验隐藏的表单元素
neglectHiddenField && neglectHiddenField();
form.validateForm().then(f => {
if (f.isValid) {
//除了校验表单之外,不同的页面还有其他的校验项。
if (furtherValidate && !furtherValidate()) return;
//校验字段是否重复
if (isRepeat) {
isFieldRepeat && isFieldRepeat();
return
}
//保存的参数包含:表单生成的参数和其他参数
const fetchParams = Object.assign(form.getFormParams(), getAdditionalParams && getAdditionalParams());
if (this.hasOrgTree) {
Object.assign(fetchParams, {
organizationType,
});
}
(type === 1) && Object.assign(fetchParams, {
[this.editIdPropertyName]: id
});
this.canOperateForm(false);
fetch({
asyncFetch: this.asyncFetch,
name: (type === 0) ? this.addAsyncName : this.editAsyncName,
fetchParams,
logic: (cb) => {
const {
sign
} = cb;
if (sign === '1') {
message.success(cb.message);
this.closeDialog();
this.getSearchList();
} else {
this.canOperateForm(true);
message.warning(cb.message);
}
}
});
} else {
f.showErrors();
this.forceUpdateForm();
}
});
}
@action canOperateForm = (bool) => {
this.formElements.loading = !bool;
}
@action forceUpdateForm = () => {
this.formElements.date = new Date();
}
//重置表单
@action resetForm = () => {
['loading', 'conditions', 'form'].map((v, i) => {
this.formElements[v] = (i === 0) ? true : (i === 1) ? [] : new WeaForm();
});
}
setRef = (ref, type) => {
this[`${type}_ref`] = ref;
}
refreshPage = () => {
const {
refreshPage
} = this.customizedStore;
//强制刷新左侧树
this.hasOrgTree && this.triggerRefresh();
this.handleOrgTreeNodeClick({
id: '',
type: '0'
});
//不同页面会有个性化的重置项
refreshPage && refreshPage();
}
//重置页面配置项
resetPageConfig = () => {
['hasOrgTree', 'hasAdvancedSearch', 'hasTable'].map(v => {
this[v] = true;
});
['hasRadioGroup', 'hasTab', 'isOrgTreeInfluenceForm'].map(v => {
this[v] = false;
});
}
//页面最高层级的组件在要挂起的时候调用这个函数,重置store中的属性
//这里,不需要重置对象formElements内的属性,因为上个页面在关闭弹框时,会执行这一操作
//不需要重置对象dialog内的属性,因为在打开弹框的时候,会对dialog对象内的属性进行赋值操作
//不需要重置对象table内的属性,首先属性id不作为判断条件,其次在每次执行tableStore.getDatas()函数时,tableStore都会被重新new一次
resetStorePropertys = () => {
const {
form
} = this.formElements;
['resetAccessPermissionProps', 'resetMenusConfig', 'resetOrgTreeProps', 'resetSearchProps',
'resetTabProps', 'resetRadioGroupProps', 'resetPageConfig', 'resetForm'
].map(f => {
this[f]();
});
}
}
const commonStore = new CommonStore();
export {
commonStore
}