\r\n
\r\n
}\r\n label={_.get(item, \"StatusName\", \"\")}\r\n />\r\n \r\n
\r\n \r\n
{_.get(item, \"ApprovalLevel\", \"\")}\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n {date}\r\n
\r\n \r\n {_.get(item, \"NotesU\", \"\")}\r\n \r\n \r\n \r\n )\r\n })\r\n }\r\n\r\n render() {\r\n const {classes, open, onClose} = this.props;\r\n const {dataHistory, isLoading} = this.state;\r\n return (\r\n
{\r\n this.filter.skip = 0;\r\n this.filter.limit = 11;\r\n onClose('showW75F8002')\r\n }}\r\n title={Config.lang(\"DHR_Lich_su_duyet\")}\r\n >\r\n\r\n \r\n {isLoading ?\r\n \r\n \r\n
\r\n : \"\"}\r\n \r\n
\r\n {this.renderHistoryTimeline()}\r\n
\r\n
\r\n \r\n {dataHistory.total > 11 ?\r\n \r\n \r\n
\r\n :\r\n \"\"}\r\n \r\n );\r\n }\r\n\r\n}\r\n\r\nexport default withStyles(styles, {withTheme: true})(W75F8002)","import React, {Component} from 'react';\r\nimport {withStyles} from \"@material-ui/core\";\r\nimport Modal from \"../../../common/modal/modal\";\r\nimport Config from \"../../../../config\";\r\nimport GridContainer from \"../../../grid-container/grid-container\";\r\nimport {Column} from \"devextreme-react/data-grid\";\r\nimport UserImage from \"../../../common/user/user-image\";\r\nimport _ from \"lodash\";\r\nimport {bindActionCreators, compose} from \"redux\";\r\nimport {connect} from \"react-redux\";\r\nimport * as generalActions from \"../../../../redux/general/general_actions\";\r\nimport UserName from \"../../../common/user/user-name\";\r\nimport InputAdornment from \"@material-ui/core/InputAdornment\";\r\nimport SearchIcon from \"@material-ui/icons/Search\";\r\nimport {TextField} from \"../../../common/form-material\";\r\nimport ButtonCustom from \"../../../common/button/button-custom\";\r\nimport Api from \"../../../../services/api\";\r\n\r\nconst styles = () => ({\r\n grid247: {\r\n \"& .grid-container\": {\r\n \"& > .paging\": {\r\n position: \"absolute\",\r\n }\r\n }\r\n\r\n }\r\n})\r\n\r\nclass W75F8001 extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selectedRowKeys: [],\r\n };\r\n this.preSelectedRowKeys = React.createRef();\r\n }\r\n\r\n getCurSelectedRowKeys = (data = [], dataSelected = []) => _.reduce(data, (acc, item) => {\r\n if (_.includes(dataSelected, _.get(item, \"EmployeeID\", \"\"))) {\r\n acc = [...acc, item.EmployeeID]\r\n }\r\n return acc;\r\n }, []);\r\n\r\n onChangePage = (page) => {\r\n const {selectedRowKeys} = this.state;\r\n this.tmpSelectedRowKeys = selectedRowKeys;\r\n this.props.onChangePage({skip: page * this.props.limit})\r\n };\r\n\r\n onChangePerPage = (perPage) => {\r\n const {selectedRowKeys} = this.state;\r\n this.tmpSelectedRowKeys = selectedRowKeys;\r\n this.props.onChangePage({skip: 0, limit: perPage})\r\n };\r\n\r\n onAgree = () => {\r\n const {onClose, voucherSelected} = this.props;\r\n const {selectedRowKeys} = this.state;\r\n const jsonDataParam = JSON.stringify(_.reduce(selectedRowKeys, (accUser, UserID) => {\r\n accUser = [...accUser, ..._.map(voucherSelected, item => ({\r\n ..._.pick(item, ['ApprovalFlowID', \"ApprovalLevel\", \"TransID\", \"ObjectID\"]),\r\n UserID,\r\n VoucherID: _.get(item, \"TransID\", \"\")\r\n }))];\r\n return accUser;\r\n }, []));\r\n const params = {\r\n delete: jsonDataParam,\r\n data: jsonDataParam\r\n }\r\n Config.popup.show(\"YES_NO\", Config.lang(\"Ban_co_muon_thay_the_nguoi_duyet\"), () => {\r\n (async () => {\r\n const res = await Api.put(\"/w75f8000/choose-approver\", params);\r\n const resData = _.get(res, \"data\", []);\r\n const resDataErrMessage = _.get(resData, \"Message\", \"\");\r\n const resStatus = _.get(resData, \"Status\", 1);\r\n const resErrMessage = _.get(res, \"message\", \"\");\r\n if (resErrMessage || resDataErrMessage || resStatus) {\r\n Config.popup.show(\"ERROR\", resErrMessage);\r\n return false;\r\n }\r\n Config.notify.show(\"success\", Config.lang(\"Thay_the_nguoi_duyet_thanh_cong\"), 2000);\r\n onClose(\"showW75F8001\", true);\r\n })();\r\n });\r\n }\r\n\r\n onSelectionChanged = async ({selectedRowKeys}) => {\r\n const {getCboEmployees} = this.props;\r\n let allSelectedRowKeys = _.uniq([...(this.preSelectedRowKeys.current || []), ...selectedRowKeys]);\r\n const currentRowSelected = this.getCurSelectedRowKeys(getCboEmployees.rows, allSelectedRowKeys);\r\n const deselectedRowKeys = _.filter(currentRowSelected, rowKey => !_.includes(selectedRowKeys, rowKey));\r\n await (() => this.preSelectedRowKeys.current = _.filter(allSelectedRowKeys, rowKey => !_.includes(deselectedRowKeys, rowKey)))();\r\n this.setState({selectedRowKeys});\r\n }\r\n\r\n renderAvatar = (e) => {\r\n const {data} = e.row;\r\n return (
\r\n \r\n
);\r\n };\r\n\r\n renderInfo = (e) => {\r\n const {data} = e.row;\r\n return (\r\n
\r\n
\r\n {_.get(data, \"EmployeeID\", \"\")}
\r\n {_.get(data, \"DutyName\", \"\")}
\r\n \r\n )\r\n }\r\n\r\n render() {\r\n const {selectedRowKeys} = this.state;\r\n const {getCboEmployees, open, onClose, onSearchEmployee, loading, skip, limit} = this.props;\r\n const countNumberAllSelectedRowKeys = _.size(_.uniq([...(this.preSelectedRowKeys.current ?? []), ...selectedRowKeys]))\r\n const hasAEmployeeChecked = countNumberAllSelectedRowKeys > 0;\r\n return (\r\n
onClose('showW75F8001')}\r\n title={`${Config.lang(\"Them_nguoi_duyet\")} ${!!countNumberAllSelectedRowKeys ? countNumberAllSelectedRowKeys : \"\"}`}\r\n >\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n onChange={e => onSearchEmployee(_.get(e, \"target.value\", \"\"))}\r\n fullWidth\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default compose(connect((state) => ({\r\n getCboEmployees: state.general.getCboEmployees,\r\n}), (dispatch) => ({\r\n generalActions: bindActionCreators(generalActions, dispatch),\r\n})), withStyles(styles, {withTheme: true}))(W75F8001)","import React, {useEffect, useState, useRef} from 'react';\r\nimport {Modal, ModalBody, ModalHeader, Button, ButtonIcon, Dropdown} from \"diginet-core-ui/components\";\r\nimport GridContainer from \"../../../grid-container/grid-container\";\r\nimport Config from \"../../../../config\";\r\nimport {Column, CustomRule} from \"devextreme-react/data-grid\";\r\nimport _ from \"lodash\";\r\nimport {bindActionCreators} from \"redux\";\r\nimport {connect} from \"react-redux\";\r\nimport {FormGroup} from \"react-bootstrap\";\r\nimport * as w75F8003Actions from \"../../../../redux/W75/W75F8003/W75F8003_actions\";\r\n\r\nconst W75F8003 = ({open, data, onClose, w75F8003Actions, iPermission}) => {\r\n const userList = _.filter(Config.listUsers, item => !!item.UserID);\r\n const [dataGrid, setDataGrid] = useState([]);\r\n const [isLoading, setLoading] = useState(false);\r\n\r\n const {\r\n TransID = \"\",\r\n ApprovalFlowID = \"\",\r\n ApprovalLevel = \"\",\r\n ObjectID = \"\"\r\n } = _.pick(data, [\"TransID\", \"ApprovalFlowID\", \"ApprovalLevel\", \"ObjectID\"]);\r\n\r\n let refGrid = null;\r\n let dataSourceListUser = useRef([...userList]);\r\n let userSelected = useRef([]);\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n w75F8003Actions.loadForm({TransID, ApprovalFlowID, ApprovalLevel}, (err, data) => {\r\n setLoading(false);\r\n if (err) return Config.popup.show(\"ERROR\", err);\r\n if (data) {\r\n setDataGrid(_(data).map(Config.getUser).filter(_.size).map(item => ({\r\n ..._.pick(item, [\"EmployeeID\", \"UserID\", \"UserName\", \"DutyName\", \"DepartmentName\"]),\r\n isError: false,\r\n isNew: false,\r\n isUpdated: false\r\n })).value());\r\n dataSourceListUser.current = _.filter(dataSourceListUser.current, item => !_.includes(_.map(data, \"UserID\"), item.UserID));\r\n }\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const getIndexUser = empID => _.findIndex(dataGrid, [\"EmployeeID\", empID]);\r\n\r\n const setUserSelected = (oldUserID, newUserID = \"\") => {\r\n if (_.some(userSelected.current, userID => userID === oldUserID)) userSelected.current = _.filter(userSelected.current, elm => elm !== oldUserID)\r\n if(newUserID) userSelected.current = _.uniq([...userSelected.current, newUserID]);\r\n }\r\n\r\n const onInsertNewRow = () => refGrid && refGrid.instance.addRow();\r\n\r\n const onSaveRow = (data = {}) => {\r\n if (!data?.UserID) return false;\r\n const indexUser = getIndexUser(data.EmployeeID);\r\n let isError = false;\r\n const params = {\r\n UserIDGrid: data?.UserID ?? \"\",\r\n ObjectID,\r\n TransID,\r\n ApprovalFlowID,\r\n ApprovalLevel\r\n }\r\n setLoading(true);\r\n w75F8003Actions.saveRow(params, err => {\r\n setLoading(false);\r\n if (err) {\r\n isError = true;\r\n Config.popup.show(\"ERROR\", err);\r\n }\r\n if (!isError) Config.popup.show(\"success\", Config.lang(\"Luu_thanh_cong\"));\r\n\r\n setDataGrid([\r\n ..._.slice(dataGrid, 0, indexUser),\r\n {\r\n ...dataGrid[indexUser],\r\n isUpdated: false,\r\n isNew: false,\r\n isError\r\n },\r\n ..._.slice(dataGrid, indexUser + 1)\r\n ]);\r\n })\r\n };\r\n\r\n const onDeleteRow = (data = {}) => {\r\n if (!data?.UserID) return false;\r\n let userRemove;\r\n const params = {\r\n UserIDGrid: data?.UserID || \"\",\r\n TransID,\r\n ApprovalFlowID,\r\n ApprovalLevel\r\n }\r\n const indexUser = getIndexUser(data.EmployeeID);\r\n Config.popup.show(\"YES_NO\", Config.lang(\"Ban_co_chac_muon_xoa?\"), () => {\r\n setLoading(true);\r\n w75F8003Actions.deleteRow(params, err => {\r\n setLoading(false);\r\n if (err) {\r\n userRemove = {\r\n ...dataGrid[indexUser],\r\n isUpdated: false,\r\n isError: true\r\n };\r\n Config.popup.show(\"ERROR\", err);\r\n }\r\n if (!userRemove) {\r\n Config.popup.show(\"success\", Config.lang(\"Xoa_thanh_cong\"));\r\n setUserSelected(data?.UserID);\r\n }\r\n setDataGrid([\r\n ..._.slice(dataGrid, 0, indexUser),\r\n userRemove,\r\n ..._.slice(dataGrid, indexUser + 1)\r\n ]);\r\n })\r\n })\r\n };\r\n\r\n const renderAction = ({data = {}}) => _.map([{\r\n name: \"Save\",\r\n disabled: iPermission < 3 || ((data.isUpdated ? !data.isUpdated : !data.isNew) || false),\r\n onClick: () => onSaveRow(data),\r\n }, {\r\n name: \"Delete\",\r\n disabled: iPermission < 4 || ((data.isUpdated ? data.isUpdated : data.isNew || data.isError) || false),\r\n onClick: () => onDeleteRow(data),\r\n }\r\n ], (props, i) =>
);\r\n\r\n const cellRender = ({data}) => _([...dataSourceListUser.current, data]).filter([\"UserID\", _.get(data, \"UserID\", \"\")]).get(\"[0].UserName\", \"\")\r\n\r\n const editCellRender = (e) => {\r\n const {data = {}, rowIndex, component} = e;\r\n let getDataUserSelected;\r\n const dataSource = _.filter(dataSourceListUser.current, item => !_.includes(userSelected.current, item.UserID));\r\n if(data?.UserID) getDataUserSelected = _.find(userList,[\"UserID\", data.UserID]);\r\n return
{\r\n const userID = _.get(ev, \"value\", \"\");\r\n const {DutyName = \"\", DepartmentName = \"\"} = _(dataSourceListUser.current).filter([\"UserID\", userID]).get(\"[0]\", {});\r\n e.setValue(userID);\r\n component.cellValue(rowIndex, \"DutyName\", DutyName);\r\n component.cellValue(rowIndex, \"DepartmentName\", DepartmentName);\r\n setUserSelected(data.UserID, userID);\r\n component.closeEditCell();\r\n }}\r\n />\r\n };\r\n\r\n return onClose(\"showW75F8003\", true)}>\r\n \r\n \r\n \r\n \r\n
\r\n \r\n refGrid = ref}\r\n rowAlternationEnabled={false}\r\n style={{border: 'none'}}\r\n showRowLines={false}\r\n typePaging={\"normal\"}\r\n keyExpr={\"EmployeeID\"}\r\n dataSource={dataGrid}\r\n showBorders={false}\r\n showColumnLines={false}\r\n noDataText={Config.lang(\"No_data\")}\r\n loading={isLoading}\r\n height={Config.getHeightGrid() - 180}\r\n pagerFullScreen={false}\r\n selection={{mode: \"none\"}}\r\n editing={{\r\n mode: 'cell',\r\n refreshMode: 'reshape',\r\n allowUpdating: true,\r\n startEditAction: \"click\"\r\n }}\r\n onInitNewRow={e => {\r\n e.data.isNew = true;\r\n e.data.isUpdated = false;\r\n e.data.isError = false;\r\n }}\r\n onRowUpdated={(e) => {\r\n e.data.isUpdated = true;\r\n e.data.isError = false;\r\n setTimeout(() => e.component.saveEditData(), 300)\r\n }}\r\n onRowPrepared={(e) => {\r\n if (!e) return false;\r\n const {data} = e;\r\n e.rowElement.style.backgroundColor = \"none\";\r\n if (data?.isUpdated) e.rowElement.style.backgroundColor = \"rgba(139, 195, 74, 0.32)\";\r\n if (data?.isError) e.rowElement.style.backgroundColor = \"rgb(217,83,79, 0.32)\";\r\n if (data?.isNew) e.rowElement.style.backgroundColor = \"rgb(100, 149, 237, 0.32)\";\r\n }}\r\n allowColumnResizing={true}\r\n >\r\n \r\n \r\n !!e.data.UserID}\r\n message=\"Giá trị bắt buộc nhập\"/>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n};\r\n\r\nexport default connect((state) => (\r\n {\r\n getForm: state.W75F8003.getForm,\r\n }), (dispatch) => (\r\n {\r\n w75F8003Actions: bindActionCreators(w75F8003Actions, dispatch),\r\n }\r\n))(W75F8003)","/**\r\n * @copyright 2019 @ DigiNet\r\n * @author TRIHAO\r\n * @create 1/8/2020\r\n * @Example Demo man hinh duyet chung...\r\n */\r\nimport React from \"react\";\r\nimport {connect} from \"react-redux\";\r\nimport {compose} from \"redux\";\r\nimport Config from \"../../../../config\";\r\nimport {Row, Col, FormGroup} from \"react-bootstrap\"\r\nimport ActionToolbar from \"../../../common/toolbar/action-toolbar\";\r\nimport withStyles from \"@material-ui/core/styles/withStyles\";\r\nimport Approvals from \"../../../approvals/approvals\";\r\nimport DateBoxPicker from \"../../../common/form-material/date-box\";\r\nimport {Combo, TextField} from \"../../../common/form-material\";\r\n\r\nconst styles = {\r\n\r\n};\r\nclass W84F3000 extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n text: \"\"\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n }\r\n\r\n //Form demo..\r\n renderFormInfo = () => {\r\n const disabled = true;\r\n const loading = false;\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n this.handleChange(\"ProjectID\", e)}\r\n />\r\n \r\n
\r\n \r\n \r\n \r\n \r\n this.handleChange('AttendanceDate', e)}\r\n />\r\n \r\n \r\n this.handleChange(\"HandOverID\", e)}\r\n />\r\n \r\n
\r\n \r\n \r\n \r\n \r\n this.handleChange('MasterNote', e)}\r\n fullWidth\r\n />\r\n \r\n
\r\n \r\n >\r\n );\r\n };\r\n\r\n onSelectionChanged = (e) => {\r\n console.log('=== onSelectionChanged', e);\r\n };\r\n\r\n render() {\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default compose(connect(state => ({\r\n //reducers...\r\n}), (dispatch) => ({\r\n //bind ations...\r\n})), withStyles(styles))(W84F3000);\r\n"],"sourceRoot":""}