626 lines
17 KiB
JavaScript
626 lines
17 KiB
JavaScript
/**
|
||
* @Author: 程亮
|
||
* @Date: 2022-06-09 10:14:20
|
||
* @LastEditTime: 2022-06-13 14:50:36
|
||
* @Description:
|
||
* @FilePath: /trunk/src4js/pc4mobx/organization/stores/baseStore.js
|
||
*/
|
||
import {
|
||
observable,
|
||
action,
|
||
computed,
|
||
extendObservable,
|
||
autorun
|
||
} from 'mobx';
|
||
import {
|
||
Button,
|
||
message,
|
||
Modal
|
||
} from 'antd';
|
||
import {
|
||
WeaForm,
|
||
WeaTableNew,
|
||
WeaLogView
|
||
} from 'comsMobx';
|
||
import {
|
||
WeaTableEdit,
|
||
WeaBrowser,
|
||
WeaButtonIcon,
|
||
WeaCascader,
|
||
WeaLoadingGlobal
|
||
} from 'ecCom';
|
||
import classnames from 'classnames';
|
||
import * as mobx from 'mobx';
|
||
import {
|
||
authorized,
|
||
detachable,
|
||
checkAuthAndDetach,
|
||
getPinYin
|
||
} from '../apis/common';
|
||
import {
|
||
i18n
|
||
} from '../public/i18n';
|
||
// import {
|
||
// logTypeDef
|
||
// } from '../public/logType';
|
||
import has from 'lodash/has';
|
||
import moment from 'moment';
|
||
|
||
const {OptionManage} = WeaCascader;
|
||
|
||
const confirm = Modal.confirm;
|
||
const info = Modal.confirm;
|
||
const {
|
||
LogStore
|
||
} = WeaLogView;
|
||
|
||
export default class HrmBaseStore {
|
||
/********************* unobservable list *********************/
|
||
//logTypeDef = logTypeDef;
|
||
getPinYin = getPinYin;
|
||
toJS = mobx.toJS;
|
||
moment = moment;
|
||
tabConfig = { //模块主tab组件参数,通过继承来重写
|
||
keyParam: 'viewCondition',
|
||
activeTabKey: ''
|
||
};
|
||
basicDialogParams = {
|
||
icon: "icon-coms-hrm",
|
||
iconBgcolor: "#217346",
|
||
style: {
|
||
width: 520,
|
||
height: 300
|
||
},
|
||
visible: false,
|
||
title: '',
|
||
}
|
||
menuIconCollection = {
|
||
save: 'icon-coms-Preservation',
|
||
create: 'icon-coms-New-Flow',
|
||
modify: 'icon-coms-edit',
|
||
remove: 'icon-coms-Batch-delete',
|
||
copy: 'icon-coms-form-copy',
|
||
entry: 'icon-coms-edit',
|
||
setting: 'icon-coms-Flow-setting',
|
||
log: 'icon-coms-Print-log',
|
||
multiModify: 'icon-coms-BatchEditing',
|
||
import: ' icon-coms-leading-in',
|
||
export: 'icon-coms-export',
|
||
search: 'icon-coms-search',
|
||
sync: 'icon-coms-Update-synchronization',
|
||
done: 'icon-coms-Upload-successfully',
|
||
selectAll: 'icon-coms-batch'
|
||
}
|
||
getBasicMenus = (logTypeKey, targetId = null) => {
|
||
let arr = [];
|
||
// if(logTypeKey){
|
||
// arr.push({
|
||
// key: '99',
|
||
// content: i18n.button.log(),
|
||
// icon: <i className={this.menuIconCollection.log}/>,
|
||
// onClick: () => this.showLog({logSmallType: this.logTypeDef[logTypeKey], targetId})
|
||
// });
|
||
// }
|
||
return arr;
|
||
}
|
||
|
||
generateLogMenu = (logType = '4', logTypeKey, targetId = null) => {
|
||
let arr = [];
|
||
if(logTypeKey){
|
||
arr.push({
|
||
key: '99',
|
||
content: i18n.button.log(),
|
||
icon: <i className={this.menuIconCollection.log}/>,
|
||
onClick: () => this.showLog({logType, logSmallType: this.logTypeDef[logTypeKey], targetId})
|
||
});
|
||
}
|
||
return arr;
|
||
}
|
||
|
||
dialogPropsDef = {
|
||
moduleName: 'hrm',
|
||
visible: false,
|
||
title: '',
|
||
moreBtn: {
|
||
datas: []
|
||
},
|
||
// hasScroll: true
|
||
}
|
||
refsDialogPropsDef = {
|
||
moduleName: 'hrm',
|
||
visible: false,
|
||
title: '',
|
||
}
|
||
dateSwitchTypeList = ['year', 'month', 'week', 'day'];
|
||
formTarget = {}; //form collection
|
||
opId = null; //数据操作对象主键ID
|
||
authorizationInfo = {};
|
||
|
||
/**
|
||
* 权限验证
|
||
* @param {String} moduleName [模块名]
|
||
* @param {Object} params [restful request url params]
|
||
* @param {Function} callback [验证通过后的callback function]
|
||
* @return {null}
|
||
*/
|
||
checkAuthorized = (moduleName, params, callback, apiMethod, needCheckDetachable = false) => {
|
||
if (needCheckDetachable) {
|
||
checkAuthAndDetach(moduleName, params, apiMethod).then(rs => {
|
||
rs.map((result, index) => {
|
||
if (result.status === '1') {
|
||
switch (index) {
|
||
case 0:
|
||
const init = !result.hasRight;
|
||
this.authorizationInfo = result;
|
||
this.containerInitFinished = {
|
||
...this.containerInitFinished,
|
||
init,
|
||
authorized: result.hasRight,
|
||
userId: result.userId
|
||
}
|
||
this.containerInitFinished.authorized && callback && callback();
|
||
break;
|
||
case 1:
|
||
this.containerInitFinished.detachable = result.detachable === '0' ? false : true
|
||
break;
|
||
}
|
||
}
|
||
})
|
||
})
|
||
} else {
|
||
authorized(moduleName, params, apiMethod).then((data) => {
|
||
if (data.status === '1') {
|
||
const init = !data.hasRight;
|
||
this.authorizationInfo = data;
|
||
this.containerInitFinished = {
|
||
init,
|
||
authorized: data.hasRight
|
||
}
|
||
this.containerInitFinished.authorized && callback && callback();
|
||
}
|
||
}, error => {
|
||
this.containerInitFinished = {
|
||
init: true,
|
||
authorized: false
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取激活的tab页下标
|
||
* @param {Array} tabs [tabData数组]
|
||
* @param {String} key [tabKey]
|
||
* @return {Integer} [tab下标]
|
||
*/
|
||
getTabIndex(tabs, key) {
|
||
if (tabs != null && tabs.length > 0) {
|
||
return _.findIndex(tabs, {
|
||
viewCondition: key
|
||
})
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/**
|
||
* 获取WeaTop按钮、WeaTab按钮以及右键菜单列表
|
||
* @param {Object} tabConfig [description]
|
||
* @return {Object} [description]
|
||
*/
|
||
btnsAndMenus = (tabConfig) => {
|
||
let topBtnDef = [], //WeaTop按钮
|
||
menuDef = [], //右键菜单
|
||
tabBtnDef = []; //WeaTab按钮
|
||
|
||
const activeTabIndex = this.getTabIndex(tabConfig.tabs, tabConfig.activeTabKey);
|
||
if (tabConfig.activeTabKey === '' || activeTabIndex < 0) {
|
||
return {
|
||
btns: topBtnDef,
|
||
menus: menuDef,
|
||
tabBtnDef: tabBtnDef
|
||
}
|
||
}
|
||
const tab = tabConfig.tabs[activeTabIndex];
|
||
const {
|
||
topButtonDef,
|
||
tabButtonDef
|
||
} = tab;
|
||
topButtonDef && topButtonDef.map((def, idx) => { //组织WeaTop按钮
|
||
const lbl = (typeof(def.label) == 'function' ? def.label() : def.label);
|
||
switch (def.comType) {
|
||
case 'button':
|
||
let disabled = false;
|
||
if (def.checkAction)
|
||
disabled = this[def.checkAction];
|
||
topBtnDef.push(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@rke64z@${idx}`} type={def.type} onClick={def.onClickHandle} disabled={disabled || def.disabled}>{lbl}</Button>);
|
||
menuDef.push({ //组织右键菜单
|
||
key: `$top-btn-${idx}`,
|
||
content: lbl,
|
||
icon: <i className={def.rightMenuIcon || def.icon}/>,
|
||
onClick: def.onClickHandle,
|
||
disabled: disabled || def.disabled || false
|
||
})
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
});
|
||
tabButtonDef && tabButtonDef.map((def, idx) => { //组织WeaTab按钮
|
||
const lab = (typeof(def.label) == 'function' ? def.label() : def.label);
|
||
let disabled = false;
|
||
if (def.checkAction)
|
||
disabled = this[def.checkAction];
|
||
switch (def.comType) {
|
||
case 'button':
|
||
const classes = classnames({
|
||
[def.icon]: true,
|
||
'tabBtn': true,
|
||
'tabBtn-active': !disabled,
|
||
'tabBtn-disable': disabled
|
||
});
|
||
if (def.brower == null) {
|
||
tabBtnDef.push(
|
||
<i
|
||
className={classes}
|
||
title={lab}
|
||
onClick={!disabled ? def.onClickHandle : null}
|
||
/>
|
||
);
|
||
} else {
|
||
switch (def.brower) {
|
||
case 'authorization':
|
||
tabBtnDef.push(
|
||
<WeaBrowser ecId={`${this && this.props && this.props.ecId || ''}_WeaBrowser@b3ewk2@${idx}`}
|
||
customized
|
||
tabs={[{name: i18n.label.byList(), key: '1', dataParams: {list: 1}},{name: i18n.label.byAuthGroup(), key: '2'}]}
|
||
title={i18n.label.selectAuthorization()}
|
||
icon={'icon-coms-hrm'}
|
||
iconBgcolor={'#217346'}
|
||
type={'hrmRoleRight'}
|
||
inputStyle={{width: 200}}
|
||
onChange={(ids, names, datas) => def.onClickHandle(ids, names, datas)}
|
||
isSingle={false}
|
||
>
|
||
<i
|
||
className={classes}
|
||
title={lab}
|
||
/>
|
||
</WeaBrowser>
|
||
);
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
case 'WeaButtonIcon':
|
||
tabBtnDef.push(
|
||
<WeaButtonIcon ecId={`${this && this.props && this.props.ecId || ''}_WeaButtonIcon@txomye@${idx}`} buttonType={def.icon} type='primary' disabled={disabled} onClick={!disabled ? def.onClickHandle : null} />
|
||
);
|
||
break;
|
||
case 'customer':
|
||
tabBtnDef.push(def.coms)
|
||
break;
|
||
default:
|
||
tabBtnDef.push(
|
||
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@iji04g@${idx}`} type={def.btnType || 'primary'} onClick={!disabled ? def.onClickHandle : null} disabled={disabled}>{lab}</Button>
|
||
);
|
||
break;
|
||
}
|
||
});
|
||
// menuDef.push(...this.getBasicMenus()); //组织右键菜单
|
||
return {
|
||
btns: topBtnDef,
|
||
menus: menuDef,
|
||
tabBtnDef: tabBtnDef
|
||
}
|
||
}
|
||
|
||
/**
|
||
* [description]
|
||
* @param {String} com [dialog's name]
|
||
* @param {Boolean} val [visible: true or false]
|
||
* @param {String} title [dialog's title]
|
||
* @param {Function} callback [callback function]
|
||
* @return {null}
|
||
*/
|
||
setDialogVisible = (com, val, title = '', callback) => {
|
||
this.dialogParams[com] = {
|
||
...this.dialogParams[com],
|
||
visible: val,
|
||
title: title
|
||
};
|
||
callback && callback();
|
||
}
|
||
|
||
confirmInfo = (props) => {
|
||
confirm({ ...props,
|
||
title: props.title || i18n.confirm.defaultTitle(),
|
||
okText: i18n.button.ok(),
|
||
cancelText: i18n.button.cancel()
|
||
});
|
||
}
|
||
|
||
hint = (props) => {
|
||
info({ ...props,
|
||
title: i18n.confirm.defaultTitle(),
|
||
okText: i18n.button.ok(),
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 初始化formStore
|
||
* @param {String} formName [form's name]
|
||
* @param {Array} fields [form field definition]
|
||
* @return {null}
|
||
*/
|
||
setFormData = (formName, fields) => {
|
||
this.formTarget[`${formName}Fields`] = fields;
|
||
this.formTarget[formName] = new WeaForm();
|
||
this.formTarget[formName].initFormFields(fields);
|
||
//this.formTarget[formName].setCondition(fields);
|
||
}
|
||
|
||
/**
|
||
* 请求高级搜索表单的通用方法
|
||
* @param {String} form [form's name]
|
||
* @param {Function} api [restful api function]
|
||
* @param {Object} params [restful request url params]
|
||
* @param {Function} callback [callback function]
|
||
* @return {null}
|
||
*/
|
||
requestFormData = (form, api, params = {}, callback) => {
|
||
api(params).then((data) => {
|
||
if (data.status === '1') {
|
||
this.setFormData(form, data.formField);
|
||
callback && callback();
|
||
}
|
||
}, error => {
|
||
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 获取表格数据的通用方法
|
||
* @param {String} tableStore [tableStore's name]
|
||
* @param {Function} api [restful api function]
|
||
* @param {Object} params [restful request url params]
|
||
* @return {null}
|
||
*/
|
||
requestTableData = (tableStore, api, params = {}, callback) => {
|
||
api(params).then(data => {
|
||
if (data.status === '1') {
|
||
tableStore.getDatas(data.sessionkey, 1);
|
||
callback && callback();
|
||
} else
|
||
message.error(data.message);
|
||
}, error => {
|
||
message.error(i18n.message.actionError());
|
||
});
|
||
}
|
||
|
||
showLog = (logTypeParams) => {
|
||
window.setLogViewProps({
|
||
...logTypeParams
|
||
});
|
||
}
|
||
/********************* unobservable list *********************/
|
||
|
||
/********************* observable list *********************/
|
||
@observable containerInitFinished = { //模块初始化状态
|
||
init: false,
|
||
authorized: false,
|
||
detachable: false
|
||
}
|
||
@observable topTabCount = {}; //WeaTab统计值
|
||
@observable rDate = new Date().getTime(); //状态刷新,组件引用该值监听变化重新render
|
||
@observable showError = new Date().getTime(); //状态刷新,组件引用该值监听变化重新render
|
||
@observable dialogParams = {}; //模态框参数
|
||
@observable i18nLoaded = false;
|
||
|
||
monitorI18n = () => {
|
||
this.i18nLoaded;
|
||
}
|
||
|
||
monitor = autorun(this.monitorI18n)
|
||
/********************* observable list *********************/
|
||
|
||
/********************* action list *********************/
|
||
@action definedColumn = (table, callback) => {//显示列定义
|
||
table.setColSetVisible(true);
|
||
table.tableColSet(true, callback);
|
||
}
|
||
/********************* action list *********************/
|
||
|
||
/********************* tableEdit props & functions *********************/
|
||
editTable = {}; //可编辑表格refs对象
|
||
editTableConfig = { //WeaTableEdit参数定义,通过继承来重写
|
||
showTitle: false,
|
||
draggable: true,
|
||
showAdd: false,
|
||
showDelete: false,
|
||
showCopy: false,
|
||
deleteConfirm: true
|
||
}
|
||
|
||
/**
|
||
* 设置WeaTableEdit的refs对象
|
||
* @param {Object} refs [WeaTableEdit]
|
||
*/
|
||
setEditTable = (refs, name) => {
|
||
this.editTable[name] = refs;
|
||
}
|
||
|
||
/**
|
||
* 通过refs对WeaTableEdit进行添加行、删除行、复制行操作
|
||
* @param {String} type [action]
|
||
*/
|
||
@action
|
||
recordOP = (target, type, callback = null) => {
|
||
switch (type) {
|
||
case 'add':
|
||
target.refs.edit.doAdd()
|
||
break;
|
||
case 'remove':
|
||
target.refs.edit.doDelete()
|
||
break;
|
||
case 'copy':
|
||
target.refs.edit.doCopy()
|
||
break;
|
||
case 'valid':
|
||
return target.refs.edit.doRequiredCheck()
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
generateTableEditRightMenuInfo = (tableConfig) => {
|
||
let rightMenuInfo = [];
|
||
const keys = Object.keys(tableConfig);
|
||
keys.map((key, index) => {
|
||
rightMenuInfo.push({
|
||
key: `8${index + 1}`,
|
||
disabled: tableConfig[key].disabled,
|
||
content: tableConfig[key].content,
|
||
icon: <i className={this.menuIconCollection[key]}/>,
|
||
onClick: tableConfig[key].callback
|
||
})
|
||
})
|
||
return rightMenuInfo;
|
||
}
|
||
|
||
generateTableSelectedData = (target) => {
|
||
let selectedData = {};
|
||
this.tableEditConfig[target].columns.map(column => {
|
||
column.hasOwnProperty('checkType') && column.checkType === 'checkbox' && Object.assign(selectedData, {
|
||
[column.dataIndex]: []
|
||
})
|
||
})
|
||
return selectedData;
|
||
}
|
||
|
||
generateOtherParams = (componentType, used, domkey) => {
|
||
let otherParams = {
|
||
customProps: {
|
||
'root': {
|
||
viewAttr: 1
|
||
}
|
||
},
|
||
optionManageProps: {
|
||
dialogProps: {
|
||
icon: "icon-coms-hrm",
|
||
iconBgcolor: "#217346",
|
||
},
|
||
showAdd: !used,
|
||
showCopy: !used,
|
||
showDelete: !used,
|
||
tableEditDraggable: !used
|
||
}
|
||
}
|
||
switch (componentType) {
|
||
case 'input':
|
||
Object.assign(otherParams.customProps, {
|
||
'input': {
|
||
viewAttr: 1
|
||
},
|
||
'input.text': {
|
||
viewAttr: 1
|
||
}
|
||
});
|
||
break;
|
||
case 'select':
|
||
Object.assign(otherParams.customProps, {
|
||
'select': {
|
||
viewAttr: 1,
|
||
},
|
||
// 'select.*': {
|
||
// parent: { type: "span", className: `${domkey}-clz` }
|
||
// },
|
||
});
|
||
break;
|
||
}
|
||
return otherParams;
|
||
}
|
||
|
||
convertData = (datas, target) => {
|
||
let tData = [],
|
||
selectedData = this.generateTableSelectedData(target);
|
||
datas.map((data, index) => {
|
||
let d = {};
|
||
Object.assign(d, {
|
||
...data.record,
|
||
...data.props,
|
||
isSysField: data.isSysField
|
||
});
|
||
delete d.key;
|
||
const selectedDataKey = Object.keys(selectedData);
|
||
selectedDataKey.map(key => {
|
||
data.record.hasOwnProperty(key) && data.record[key] === '1' && selectedData[key].push(index);
|
||
})
|
||
|
||
if (data.hasOwnProperty('com')) {
|
||
const keys = Object.keys(data.com);
|
||
keys.map(key => {
|
||
if (data.com[key].length > 0) {
|
||
let comDef = data.com[key][0];
|
||
if (comDef.type === 'CUSTOMFIELD' && data.hasOwnProperty(comDef.key) && data[comDef.key].length > 0) {
|
||
Object.assign(d, {
|
||
[comDef.key]: data[comDef.key],
|
||
});
|
||
Object.assign(comDef, {
|
||
viewAttr: 1,
|
||
otherParams: this.generateOtherParams(data[comDef.key][0], d.isSysField, d.fieldname),
|
||
})
|
||
} else if (comDef.type === 'INPUT' && key != 'fieldname') {
|
||
comDef.otherParams = {
|
||
...window.inputType
|
||
}
|
||
}
|
||
}
|
||
})
|
||
Object.assign(d, {
|
||
com: data.com
|
||
});
|
||
}
|
||
|
||
tData.push(d);
|
||
})
|
||
return {
|
||
datas: tData,
|
||
selectedData
|
||
}
|
||
}
|
||
|
||
getLocale() {
|
||
return {
|
||
firstDayOfWeek: 0,
|
||
lang: {
|
||
format: {
|
||
eras: [getLabel(383357, "公元前"), getLabel(383358, "公元")],
|
||
months: [getLabel(1492, "一月"), getLabel(1493, "二月"), getLabel(383385, "三月"), getLabel(383387, "四月"), getLabel(1496, "五月"), getLabel(383392, "六月"),
|
||
getLabel(383393, "七月"), getLabel(383394, "八月"), getLabel(383395, "九月"), getLabel(383396, "十月"), getLabel(383397, "十一月"), getLabel(383398, "十二月")
|
||
],
|
||
shortMonths: [getLabel(1492, "一月"), getLabel(1493, "二月"), getLabel(383385, "三月"), getLabel(383387, "四月"), getLabel(1496, "五月"), getLabel(383392, "六月"),
|
||
getLabel(383393, "七月"), getLabel(383394, "八月"), getLabel(383395, "九月"), getLabel(383396, "十月"), getLabel(383397, "十一月"), getLabel(383398, "十二月")
|
||
],
|
||
weekdays: [getLabel(24626, "星期天"), getLabel(383399, "星期一"), getLabel(383400, "星期二"), getLabel(383402, "星期三"), getLabel(383403, "星期四"),
|
||
getLabel(383404, "星期五"), getLabel(383405, "星期六")
|
||
],
|
||
shortWeekdays: [getLabel(16106, "周日"), getLabel(16100, "周一"), getLabel(16101, "周二"), getLabel(16102, "周三"), getLabel(16103, "周四"), getLabel(16104, "周五"),
|
||
getLabel(16105, "周六")
|
||
],
|
||
veryShortWeekdays: [getLabel(16106, "周日"), getLabel(16100, "周一"), getLabel(16101, "周二"), getLabel(16102, "周三"), getLabel(16103, "周四"), getLabel(16104, "周五"), getLabel(16105, "周六")],
|
||
ampms: [getLabel(383408, "上午"), getLabel(383409, "下午")],
|
||
datePatterns: [`yyyy'${getLabel(383372,"年")}'M'${getLabel(383373,"月")}'d'${getLabel(383374,"日")}' EEEE`, `yyyy'${getLabel(383372,"年")}'M'${getLabel(383373,"月")}'d'${getLabel(383374,"日")}'`, "yyyy-M-d", "yy-M-d"],
|
||
timePatterns: [`ahh'${getLabel(383411,"时")}'mm'${getLabel(383412,"分")}'ss'${getLabel(383414,"秒")}' 'GMT'Z`, `ahh'${getLabel(383411,"时")}'mm'${getLabel(383412,"分")}'ss'${getLabel(383414,"秒")}'`, "H:mm:ss", "ah:mm"],
|
||
dateTimePattern: '{date} {time}'
|
||
}
|
||
},
|
||
}
|
||
}
|
||
|
||
@action showWeaLoadingGlobal = (tip = '') => WeaLoadingGlobal.start({tip});
|
||
@action hideWeaLoadingGlobal = () => {
|
||
WeaLoadingGlobal.end(); // 停止遮罩loading
|
||
WeaLoadingGlobal.destroy(); // 销毁遮罩loading
|
||
}
|
||
/********************* tableEdit props & functions *********************/
|
||
} |