Files
icehrm/web/api/ReactModalAdapterBase.js

292 lines
7.0 KiB
JavaScript

import React from 'react';
import ReactDOM from 'react-dom';
import { Space, Tag } from 'antd';
import {
EditOutlined, DeleteOutlined, CopyOutlined, MonitorOutlined,
} from '@ant-design/icons';
import AdapterBase from './AdapterBase';
import IceFormModal from '../components/IceFormModal';
import IceStepFormModal from '../components/IceStepFromModal';
import IceTable from '../components/IceTable';
import MasterDataReader from './MasterDataReader';
class ReactModalAdapterBase extends AdapterBase {
static get MODAL_TYPE_NORMAL() { return 'Normal'; }
static get MODAL_TYPE_STEPS() { return 'Steps'; }
constructor(endPoint, tab, filter, orderBy) {
super(endPoint, tab, filter, orderBy);
this.modalType = this.MODAL_TYPE_NORMAL;
this.dataPipe = null;
this.formInitialized = false;
this.tableInitialized = false;
this.access = [];
this.localStorageEnabled = false;
this.isV2 = true;
this.masterDataReader = new MasterDataReader(this);
}
enableLocalStorage() {
this.localStorageEnabled = true;
}
setModalType(type) {
this.modalType = type;
}
setDataPipe(dataPipe) {
this.dataPipe = dataPipe;
}
setAccess(access) {
this.access = access;
}
hasAccess(type) {
return this.access.indexOf(type) > 0;
}
hasCustomButtons() {
return false;
}
initTable() {
if (this.tableInitialized) {
return false;
}
const tableDom = document.getElementById(`${this.tab}Table`);
if (tableDom) {
this.tableContainer = React.createRef();
let columns = this.getTableColumns();
if (this.hasAccess('save')
|| this.hasAccess('delete')
|| this.hasAccess('element')
|| this.hasCustomButtons()
) {
columns.push({
title: 'Actions',
key: 'actions',
render: this.getTableActionButtonJsx(this),
});
}
columns = columns.map((item) => {
item.title = this.gt(item.title);
return item;
});
ReactDOM.render(
<IceTable
ref={this.tableContainer}
reader={this.dataPipe}
columns={columns}
adapter={this}
>
{this.getTableChildComponents()}
</IceTable>,
tableDom,
);
}
this.tableInitialized = true;
return true;
}
initForm() {
if (this.formInitialized) {
return false;
}
this.formContainer = React.createRef();
if (this.modalType === this.MODAL_TYPE_NORMAL) {
ReactDOM.render(
<IceFormModal
ref={this.formContainer}
fields={this.getFormFields()}
adapter={this}
formReference={this.formReference}
/>,
document.getElementById(`${this.tab}Form`),
);
} else {
ReactDOM.render(
<IceStepFormModal
ref={this.formContainer}
fields={this.getMappedFields()}
adapter={this}
formReference={this.formReference}
/>,
document.getElementById(`${this.tab}Form`),
);
}
const filterDom = document.getElementById(`${this.tab}FilterForm`);
if (filterDom && this.getFilters()) {
this.filtersContainer = React.createRef();
ReactDOM.render(
<IceFormModal
ref={this.filtersContainer}
fields={this.getFilters()}
adapter={this}
saveCallback={(values, showError, closeModal) => {
this.setFilter(values);
this.filtersAlreadySet = true;
this.get([]);
this.tableContainer.current.setFilterData(values);
closeModal();
}}
/>,
filterDom,
);
}
this.formInitialized = true;
return true;
}
getTableChildComponents() {
return false;
}
reloadCurrentElement() {
this.viewElement(this.currentId);
}
getTableActionButtonJsx(adapter) {
return (text, record) => (
<Space size="middle">
{adapter.hasAccess('save') && adapter.showEdit
&& (
<Tag color="green" onClick={() => modJs.edit(record.id)} style={{ cursor: 'pointer' }}>
<EditOutlined />
{` ${adapter.gt('Edit')}`}
</Tag>
)}
{adapter.hasAccess('element')
&& (
<Tag color="blue" onClick={() => modJs.viewElement(record.id)} style={{ cursor: 'pointer' }}>
<MonitorOutlined />
{` ${adapter.gt('View')}`}
</Tag>
)}
{adapter.hasAccess('delete') && adapter.showDelete
&& (
<Tag color="volcano" onClick={() => modJs.deleteRow(record.id)} style={{ cursor: 'pointer' }}>
<DeleteOutlined />
{` ${adapter.gt('Delete')}`}
</Tag>
)}
{adapter.hasAccess('save')
&& (
<Tag color="cyan" onClick={() => modJs.copyRow(record.id)} style={{ cursor: 'pointer' }}>
<CopyOutlined />
{` ${adapter.gt('Copy')}`}
</Tag>
)}
</Space>
);
}
setTableLoading(value) {
this.tableContainer.current.setLoading(value);
}
/**
* Show the view form for an item
* @method viewElement
* @param id {int} id of the item to view
*/
viewElement(id) {
this.setTableLoading(true);
this.currentId = id;
this.getElement(id, {
noRender: true,
callBack: (element) => {
this.showElement(element);
this.setTableLoading(false);
},
});
}
showElement(element) {
this.renderForm(element, true);
}
/**
* Show the edit form for an item
* @method edit
* @param id {int} id of the item to edit
*/
edit(id) {
this.setTableLoading(true);
this.currentId = id;
this.getElement(id, []);
}
renderForm(object = null, viewOnly = false) {
if (object == null) {
this.currentId = null;
this.currentElement = null;
}
this.setTableLoading(false);
this.initForm();
this.formContainer.current.setViewOnly(viewOnly);
this.formContainer.current.show(object);
}
showFilters() {
this.initForm();
this.filtersContainer.current.show(this.filter);
}
resetFilters() {
this.filter = this.origFilter;
this.filtersAlreadySet = false;
this.currentFilterString = '';
this.get([]);
this.tableContainer.current.setFilterData(this.filter);
}
get() {
if (this.tableContainer && this.tableContainer.current) {
this.tableContainer.current.setCurrentElement(null);
}
this.initTable();
this.masterDataReader.updateAllMasterData()
.then(() => {
this.tableContainer.current.reload();
});
this.trackEvent('get', this.tab, this.table);
}
showLoader() {
// $('#iceloader').show();
}
addActualFieldsForStepModal(steps, fields) {
return steps.map((item) => {
item.fields = item.fields.reduce((acc, fieldName) => {
const field = fields.find(([name]) => name === fieldName);
if (field) {
acc.push(field);
}
return acc;
}, []);
return item;
});
}
getFormOptions() {
return {
width: 1024,
twoColumnLayout: false,
};
}
}
export default ReactModalAdapterBase;