d2aura 23.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/abstractApi.d.ts +21 -0
- package/api/abstractApi.js +56 -0
- package/api/abstractApi.js.map +1 -0
- package/api/abstractEntityApi.d.ts +37 -0
- package/api/abstractEntityApi.js +145 -0
- package/api/abstractEntityApi.js.map +1 -0
- package/api/advancedFilterApi.d.ts +56 -0
- package/api/advancedFilterApi.js +108 -0
- package/api/advancedFilterApi.js.map +1 -0
- package/api/archiveApi.d.ts +14 -0
- package/api/archiveApi.js +25 -0
- package/api/archiveApi.js.map +1 -0
- package/api/comparison/entityComparisonUtils.d.ts +4 -0
- package/api/comparison/entityComparisonUtils.js +15 -0
- package/api/comparison/entityComparisonUtils.js.map +1 -0
- package/api/constants/constants.d.ts +5 -0
- package/api/constants/constants.js +6 -0
- package/api/constants/constants.js.map +1 -0
- package/api/constants/d2ChartConstants.d.ts +5 -0
- package/api/constants/d2ChartConstants.js +6 -0
- package/api/constants/d2ChartConstants.js.map +1 -0
- package/api/edaApi.d.ts +36 -0
- package/api/edaApi.js +109 -0
- package/api/edaApi.js.map +1 -0
- package/api/impl/errorHandling.d.ts +1 -0
- package/api/impl/errorHandling.js +72 -0
- package/api/impl/errorHandling.js.map +1 -0
- package/api/impl/utils/reportError.d.ts +2 -0
- package/api/impl/utils/reportError.js +157 -0
- package/api/impl/utils/reportError.js.map +1 -0
- package/api/impl/utils/reportServiceMessage.d.ts +1 -0
- package/api/impl/utils/reportServiceMessage.js +29 -0
- package/api/impl/utils/reportServiceMessage.js.map +1 -0
- package/api/types/accessRight.d.ts +5 -0
- package/api/types/accessRight.js +7 -0
- package/api/types/accessRight.js.map +1 -0
- package/api/types/advancedFilter.d.ts +22 -0
- package/api/types/advancedFilter.js +16 -0
- package/api/types/advancedFilter.js.map +1 -0
- package/api/types/apiResult.d.ts +5 -0
- package/api/types/apiResult.js +2 -0
- package/api/types/apiResult.js.map +1 -0
- package/api/types/auditableEntity.d.ts +10 -0
- package/api/types/auditableEntity.js +2 -0
- package/api/types/auditableEntity.js.map +1 -0
- package/api/types/d2ArTypes.d.ts +5 -0
- package/api/types/d2ArTypes.js +2 -0
- package/api/types/d2ArTypes.js.map +1 -0
- package/api/types/d2ChartTypes.d.ts +26 -0
- package/api/types/d2ChartTypes.js +7 -0
- package/api/types/d2ChartTypes.js.map +1 -0
- package/api/types/dbBoolean.d.ts +5 -0
- package/api/types/dbBoolean.js +15 -0
- package/api/types/dbBoolean.js.map +1 -0
- package/api/types/entity.d.ts +7 -0
- package/api/types/entity.js +2 -0
- package/api/types/entity.js.map +1 -0
- package/api/types/entityListResult.d.ts +4 -0
- package/api/types/entityListResult.js +2 -0
- package/api/types/entityListResult.js.map +1 -0
- package/api/types/entityResult.d.ts +4 -0
- package/api/types/entityResult.js +2 -0
- package/api/types/entityResult.js.map +1 -0
- package/api/types/nounGender.d.ts +5 -0
- package/api/types/nounGender.js +7 -0
- package/api/types/nounGender.js.map +1 -0
- package/api/util/d2Boolean.d.ts +8 -0
- package/api/util/d2Boolean.js +14 -0
- package/api/util/d2Boolean.js.map +1 -0
- package/api/util/d2ChartUtils.d.ts +7 -0
- package/api/util/d2ChartUtils.js +62 -0
- package/api/util/d2ChartUtils.js.map +1 -0
- package/api/util/edaUtils.d.ts +5 -0
- package/api/util/edaUtils.js +33 -0
- package/api/util/edaUtils.js.map +1 -0
- package/api/util/fileUtils.d.ts +3 -0
- package/api/util/fileUtils.js +22 -0
- package/api/util/fileUtils.js.map +1 -0
- package/api/validation/abstractEntityValidationUtils.d.ts +8 -0
- package/api/validation/abstractEntityValidationUtils.js +24 -0
- package/api/validation/abstractEntityValidationUtils.js.map +1 -0
- package/core/types/panelConfiguration.d.ts +3 -0
- package/core/types/panelConfiguration.js +2 -0
- package/core/types/panelConfiguration.js.map +1 -0
- package/core/util/humanizeDuration.d.ts +1 -0
- package/core/util/humanizeDuration.js +24 -0
- package/core/util/humanizeDuration.js.map +1 -0
- package/core/util/isStringEmpty.d.ts +1 -0
- package/core/util/isStringEmpty.js +4 -0
- package/core/util/isStringEmpty.js.map +1 -0
- package/core/util/locationUtils.d.ts +10 -0
- package/core/util/locationUtils.js +34 -0
- package/core/util/locationUtils.js.map +1 -0
- package/coreui/abstractApp.d.ts +22 -0
- package/coreui/abstractApp.js +49 -0
- package/coreui/abstractApp.js.map +1 -0
- package/coreui/abstractListPanel.d.ts +88 -0
- package/coreui/abstractListPanel.js +426 -0
- package/coreui/abstractListPanel.js.map +1 -0
- package/coreui/abstractPage.d.ts +18 -0
- package/coreui/abstractPage.js +104 -0
- package/coreui/abstractPage.js.map +1 -0
- package/coreui/auth/loginForm.d.ts +27 -0
- package/coreui/auth/loginForm.js +47 -0
- package/coreui/auth/loginForm.js.map +1 -0
- package/coreui/auth/logoutButton.d.ts +9 -0
- package/coreui/auth/logoutButton.js +23 -0
- package/coreui/auth/logoutButton.js.map +1 -0
- package/coreui/components/about/aboutModalDialog.d.ts +30 -0
- package/coreui/components/about/aboutModalDialog.js +96 -0
- package/coreui/components/about/aboutModalDialog.js.map +1 -0
- package/coreui/components/advancedFilter/advancedFilterButton.d.ts +26 -0
- package/coreui/components/advancedFilter/advancedFilterButton.js +115 -0
- package/coreui/components/advancedFilter/advancedFilterButton.js.map +1 -0
- package/coreui/components/advancedFilter/advancedFilterColumnDefinitions.d.ts +18 -0
- package/coreui/components/advancedFilter/advancedFilterColumnDefinitions.js +39 -0
- package/coreui/components/advancedFilter/advancedFilterColumnDefinitions.js.map +1 -0
- package/coreui/components/advancedFilter/advancedFilterUtils.d.ts +12 -0
- package/coreui/components/advancedFilter/advancedFilterUtils.js +101 -0
- package/coreui/components/advancedFilter/advancedFilterUtils.js.map +1 -0
- package/coreui/components/advancedFilter/advancedFilterValidationUtils.d.ts +11 -0
- package/coreui/components/advancedFilter/advancedFilterValidationUtils.js +59 -0
- package/coreui/components/advancedFilter/advancedFilterValidationUtils.js.map +1 -0
- package/coreui/components/advancedFilter/advancedFilteredGrid.d.ts +55 -0
- package/coreui/components/advancedFilter/advancedFilteredGrid.js +165 -0
- package/coreui/components/advancedFilter/advancedFilteredGrid.js.map +1 -0
- package/coreui/components/advancedFilter/components/advancedFilterOperatorSelect.d.ts +14 -0
- package/coreui/components/advancedFilter/components/advancedFilterOperatorSelect.js +35 -0
- package/coreui/components/advancedFilter/components/advancedFilterOperatorSelect.js.map +1 -0
- package/coreui/components/advancedFilter/components/advancedFilterValueInput.d.ts +23 -0
- package/coreui/components/advancedFilter/components/advancedFilterValueInput.js +148 -0
- package/coreui/components/advancedFilter/components/advancedFilterValueInput.js.map +1 -0
- package/coreui/components/advancedFilter/conditionList/advancedFilterConditionDetailPanel.d.ts +18 -0
- package/coreui/components/advancedFilter/conditionList/advancedFilterConditionDetailPanel.js +82 -0
- package/coreui/components/advancedFilter/conditionList/advancedFilterConditionDetailPanel.js.map +1 -0
- package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListModalDialog.d.ts +23 -0
- package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListModalDialog.js +58 -0
- package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListModalDialog.js.map +1 -0
- package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListPanel.d.ts +31 -0
- package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListPanel.js +211 -0
- package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListPanel.js.map +1 -0
- package/coreui/components/advancedFilter/filterList/advancedFilterListModalDialog.d.ts +15 -0
- package/coreui/components/advancedFilter/filterList/advancedFilterListModalDialog.js +48 -0
- package/coreui/components/advancedFilter/filterList/advancedFilterListModalDialog.js.map +1 -0
- package/coreui/components/advancedFilter/filterSave/filterSaveModalDialog.d.ts +18 -0
- package/coreui/components/advancedFilter/filterSave/filterSaveModalDialog.js +37 -0
- package/coreui/components/advancedFilter/filterSave/filterSaveModalDialog.js.map +1 -0
- package/coreui/components/advancedFilter/floatingColumnFilter/advancedFilterFloatingColumnComponent.d.ts +26 -0
- package/coreui/components/advancedFilter/floatingColumnFilter/advancedFilterFloatingColumnComponent.js +81 -0
- package/coreui/components/advancedFilter/floatingColumnFilter/advancedFilterFloatingColumnComponent.js.map +1 -0
- package/coreui/components/assignEntitiesToEntity/abstractEntitiesOnEntityList.d.ts +32 -0
- package/coreui/components/assignEntitiesToEntity/abstractEntitiesOnEntityList.js +102 -0
- package/coreui/components/assignEntitiesToEntity/abstractEntitiesOnEntityList.js.map +1 -0
- package/coreui/components/changePasswordModalDialog/changePasswordModalDialog.d.ts +23 -0
- package/coreui/components/changePasswordModalDialog/changePasswordModalDialog.js +83 -0
- package/coreui/components/changePasswordModalDialog/changePasswordModalDialog.js.map +1 -0
- package/coreui/components/colorTag/colorTag.d.ts +9 -0
- package/coreui/components/colorTag/colorTag.js +17 -0
- package/coreui/components/colorTag/colorTag.js.map +1 -0
- package/coreui/components/d2Chart/d2ChartOptions.d.ts +3 -0
- package/coreui/components/d2Chart/d2ChartOptions.js +73 -0
- package/coreui/components/d2Chart/d2ChartOptions.js.map +1 -0
- package/coreui/components/d2Chart/d2ChartPanel.d.ts +48 -0
- package/coreui/components/d2Chart/d2ChartPanel.js +325 -0
- package/coreui/components/d2Chart/d2ChartPanel.js.map +1 -0
- package/coreui/components/d2Chart/d2ChartTablePanel.d.ts +31 -0
- package/coreui/components/d2Chart/d2ChartTablePanel.js +121 -0
- package/coreui/components/d2Chart/d2ChartTablePanel.js.map +1 -0
- package/coreui/components/d2Chart/d2ChartToolboxPanel.d.ts +27 -0
- package/coreui/components/d2Chart/d2ChartToolboxPanel.js +116 -0
- package/coreui/components/d2Chart/d2ChartToolboxPanel.js.map +1 -0
- package/coreui/components/edaManager/abstract/edaManagerAbstractPanel.d.ts +51 -0
- package/coreui/components/edaManager/abstract/edaManagerAbstractPanel.js +169 -0
- package/coreui/components/edaManager/abstract/edaManagerAbstractPanel.js.map +1 -0
- package/coreui/components/edaManager/abstract/edaManagerAbstractTablePanel.d.ts +32 -0
- package/coreui/components/edaManager/abstract/edaManagerAbstractTablePanel.js +87 -0
- package/coreui/components/edaManager/abstract/edaManagerAbstractTablePanel.js.map +1 -0
- package/coreui/components/edaManager/abstract/edaManagerAbstractVectorList.d.ts +24 -0
- package/coreui/components/edaManager/abstract/edaManagerAbstractVectorList.js +98 -0
- package/coreui/components/edaManager/abstract/edaManagerAbstractVectorList.js.map +1 -0
- package/coreui/components/edaManager/compactPanel/edaManagerCompactPanel.d.ts +19 -0
- package/coreui/components/edaManager/compactPanel/edaManagerCompactPanel.js +52 -0
- package/coreui/components/edaManager/compactPanel/edaManagerCompactPanel.js.map +1 -0
- package/coreui/components/edaManager/compactPanel/initialLayout.d.ts +2 -0
- package/coreui/components/edaManager/compactPanel/initialLayout.js +26 -0
- package/coreui/components/edaManager/compactPanel/initialLayout.js.map +1 -0
- package/coreui/components/edaManager/components/detail/components/edaVectorMassChangeButton.d.ts +38 -0
- package/coreui/components/edaManager/components/detail/components/edaVectorMassChangeButton.js +182 -0
- package/coreui/components/edaManager/components/detail/components/edaVectorMassChangeButton.js.map +1 -0
- package/coreui/components/edaManager/components/detail/edaVectorDetailModalDialog.d.ts +23 -0
- package/coreui/components/edaManager/components/detail/edaVectorDetailModalDialog.js +122 -0
- package/coreui/components/edaManager/components/detail/edaVectorDetailModalDialog.js.map +1 -0
- package/coreui/components/edaManager/components/detail/edaVectorDetailTablePanel.d.ts +16 -0
- package/coreui/components/edaManager/components/detail/edaVectorDetailTablePanel.js +63 -0
- package/coreui/components/edaManager/components/detail/edaVectorDetailTablePanel.js.map +1 -0
- package/coreui/components/edaManager/components/detail/initialLayout.d.ts +2 -0
- package/coreui/components/edaManager/components/detail/initialLayout.js +29 -0
- package/coreui/components/edaManager/components/detail/initialLayout.js.map +1 -0
- package/coreui/components/edaManager/components/edaManagerTablePanel.d.ts +22 -0
- package/coreui/components/edaManager/components/edaManagerTablePanel.js +80 -0
- package/coreui/components/edaManager/components/edaManagerTablePanel.js.map +1 -0
- package/coreui/components/edaManager/components/edaManagerTimePanel.d.ts +22 -0
- package/coreui/components/edaManager/components/edaManagerTimePanel.js +38 -0
- package/coreui/components/edaManager/components/edaManagerTimePanel.js.map +1 -0
- package/coreui/components/edaManager/components/edaManagerVectorList.d.ts +11 -0
- package/coreui/components/edaManager/components/edaManagerVectorList.js +35 -0
- package/coreui/components/edaManager/components/edaManagerVectorList.js.map +1 -0
- package/coreui/components/edaManager/components/edaStepSelect/edaStepConstants.d.ts +0 -0
- package/coreui/components/edaManager/components/edaStepSelect/edaStepConstants.js +2 -0
- package/coreui/components/edaManager/components/edaStepSelect/edaStepConstants.js.map +1 -0
- package/coreui/components/edaManager/components/edaStepSelect/edaStepSelect.d.ts +13 -0
- package/coreui/components/edaManager/components/edaStepSelect/edaStepSelect.js +14 -0
- package/coreui/components/edaManager/components/edaStepSelect/edaStepSelect.js.map +1 -0
- package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelect.d.ts +10 -0
- package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelect.js +20 -0
- package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelect.js.map +1 -0
- package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelectModalDialog.d.ts +13 -0
- package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelectModalDialog.js +22 -0
- package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelectModalDialog.js.map +1 -0
- package/coreui/components/edaManager/constants.d.ts +2 -0
- package/coreui/components/edaManager/constants.js +11 -0
- package/coreui/components/edaManager/constants.js.map +1 -0
- package/coreui/components/edaManager/panel/edaManagerPanel.d.ts +13 -0
- package/coreui/components/edaManager/panel/edaManagerPanel.js +32 -0
- package/coreui/components/edaManager/panel/edaManagerPanel.js.map +1 -0
- package/coreui/components/edaManager/panel/initialLayout.d.ts +2 -0
- package/coreui/components/edaManager/panel/initialLayout.js +39 -0
- package/coreui/components/edaManager/panel/initialLayout.js.map +1 -0
- package/coreui/components/editor/abstractEntityConfigPanel.d.ts +82 -0
- package/coreui/components/editor/abstractEntityConfigPanel.js +307 -0
- package/coreui/components/editor/abstractEntityConfigPanel.js.map +1 -0
- package/coreui/components/filePicker/filePicker.d.ts +20 -0
- package/coreui/components/filePicker/filePicker.js +57 -0
- package/coreui/components/filePicker/filePicker.js.map +1 -0
- package/coreui/components/grid/auditEntityRowStyleRules.d.ts +3 -0
- package/coreui/components/grid/auditEntityRowStyleRules.js +34 -0
- package/coreui/components/grid/auditEntityRowStyleRules.js.map +1 -0
- package/coreui/components/grid/detailHeaderPanel.d.ts +13 -0
- package/coreui/components/grid/detailHeaderPanel.js +29 -0
- package/coreui/components/grid/detailHeaderPanel.js.map +1 -0
- package/coreui/components/grid/standardColumns.d.ts +14 -0
- package/coreui/components/grid/standardColumns.js +150 -0
- package/coreui/components/grid/standardColumns.js.map +1 -0
- package/coreui/components/history/entityHistoryListPanel.d.ts +38 -0
- package/coreui/components/history/entityHistoryListPanel.js +154 -0
- package/coreui/components/history/entityHistoryListPanel.js.map +1 -0
- package/coreui/components/languageSelect/languageSelect.d.ts +17 -0
- package/coreui/components/languageSelect/languageSelect.js +28 -0
- package/coreui/components/languageSelect/languageSelect.js.map +1 -0
- package/coreui/components/modalWithIcon/openModalWithIcon.d.ts +8 -0
- package/coreui/components/modalWithIcon/openModalWithIcon.js +30 -0
- package/coreui/components/modalWithIcon/openModalWithIcon.js.map +1 -0
- package/coreui/components/select/abstractSelect.d.ts +57 -0
- package/coreui/components/select/abstractSelect.js +233 -0
- package/coreui/components/select/abstractSelect.js.map +1 -0
- package/coreui/components/select/abstractSelectModalDialog.d.ts +33 -0
- package/coreui/components/select/abstractSelectModalDialog.js +110 -0
- package/coreui/components/select/abstractSelectModalDialog.js.map +1 -0
- package/coreui/components/select/selectUtils.d.ts +4 -0
- package/coreui/components/select/selectUtils.js +14 -0
- package/coreui/components/select/selectUtils.js.map +1 -0
- package/coreui/components/titleWithCodePanel/titleWithCodePanel.d.ts +10 -0
- package/coreui/components/titleWithCodePanel/titleWithCodePanel.js +20 -0
- package/coreui/components/titleWithCodePanel/titleWithCodePanel.js.map +1 -0
- package/coreui/icons/icons.d.ts +3 -0
- package/coreui/icons/icons.js +18 -0
- package/coreui/icons/icons.js.map +1 -0
- package/coreui/layout/contextToolbar.d.ts +15 -0
- package/coreui/layout/contextToolbar.js +41 -0
- package/coreui/layout/contextToolbar.js.map +1 -0
- package/coreui/style/index.less +165 -0
- package/coreui/style/login.css +214 -0
- package/package.json +65 -0
- package/tsconfig.json +38 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ExtendedDataGrid from "d2coreui/components/grid/extendedDataGrid";
|
|
3
|
+
import { getDateTimeColumn, getStringColumn } from "../grid/standardColumns";
|
|
4
|
+
import { EntityColumn } from "../advancedFilter/advancedFilterColumnDefinitions";
|
|
5
|
+
import i18n from "d2core/i18n/i18n";
|
|
6
|
+
import dayjs from "d2core/dayjs";
|
|
7
|
+
import DetailHeaderPanel from "../grid/detailHeaderPanel";
|
|
8
|
+
import { Divider } from "antd";
|
|
9
|
+
import EntityComparisonUtils from "../../../api/comparison/entityComparisonUtils";
|
|
10
|
+
import { LocaleHolder } from "d2core/i18n/localeHolder";
|
|
11
|
+
import cloneDeep from "lodash/cloneDeep";
|
|
12
|
+
export default class EntityHistoryListPanel extends React.Component {
|
|
13
|
+
constructor(props) {
|
|
14
|
+
super(props);
|
|
15
|
+
this.dataGrid = null;
|
|
16
|
+
this.firstLoadedPage = null;
|
|
17
|
+
this.manualReload = true;
|
|
18
|
+
this.mask = LocaleHolder.getDateTimeFormat(true, true, false);
|
|
19
|
+
this.state = {
|
|
20
|
+
columnDefs: this.getInitialColumnDefs(),
|
|
21
|
+
loading: false,
|
|
22
|
+
datasource: {
|
|
23
|
+
getRows: async (params) => {
|
|
24
|
+
if (this.firstLoadedPage) {
|
|
25
|
+
let pageableList;
|
|
26
|
+
if (this.manualReload && params.startRow === 0 && params.endRow === 100) {
|
|
27
|
+
this.manualReload = false;
|
|
28
|
+
pageableList = this.firstLoadedPage;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
pageableList = await this.getRecords(params.startRow, params.endRow);
|
|
32
|
+
}
|
|
33
|
+
params.successCallback(pageableList.data, pageableList.totalNumberOfRows);
|
|
34
|
+
if (this.state.selectedData.length === 0) {
|
|
35
|
+
const rowNode = this.gridApi?.getRowNode("0");
|
|
36
|
+
if (rowNode) {
|
|
37
|
+
rowNode.setSelected(true);
|
|
38
|
+
this.setState({ selectedData: [rowNode.data] });
|
|
39
|
+
this.dataGrid?.showDetailPanel(true);
|
|
40
|
+
}
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
this.forceUpdate();
|
|
43
|
+
}, 400);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
params.successCallback([], 0);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
selectedData: [],
|
|
52
|
+
};
|
|
53
|
+
this.onSelectionChanged = this.onSelectionChanged.bind(this);
|
|
54
|
+
this.onLoadData = this.onLoadData.bind(this);
|
|
55
|
+
this.renderDetailPanel = this.renderDetailPanel.bind(this);
|
|
56
|
+
}
|
|
57
|
+
async onLoadData(callback) {
|
|
58
|
+
this.manualReload = true;
|
|
59
|
+
this.firstLoadedPage = await this.getRecords(0, 100);
|
|
60
|
+
callback(this.firstLoadedPage.totalNumberOfRows);
|
|
61
|
+
this.gridApi?.onFilterChanged();
|
|
62
|
+
}
|
|
63
|
+
async getRecords(from, to) {
|
|
64
|
+
this.setState({ loading: true });
|
|
65
|
+
const pageableList = await this.props.api.getHistory(this.props.entity?.id, from, to);
|
|
66
|
+
this.setState({ loading: false });
|
|
67
|
+
return pageableList;
|
|
68
|
+
}
|
|
69
|
+
getInitialColumnDefs() {
|
|
70
|
+
if (!this.initialColumnDefs) {
|
|
71
|
+
this.initialColumnDefs = [
|
|
72
|
+
getDateTimeColumn(EntityColumn.CREATE_DATE, undefined, { sortable: false, headerName: i18n("Date") }),
|
|
73
|
+
getStringColumn(EntityColumn.CREATED_BY, undefined, { headerName: i18n("User"), sortable: false }),
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
return this.initialColumnDefs;
|
|
77
|
+
}
|
|
78
|
+
renderConfigHeader() {
|
|
79
|
+
let rightContentTitle = i18n("Current");
|
|
80
|
+
if (this.state.selectedData.length === 2) {
|
|
81
|
+
rightContentTitle = dayjs(this.state.selectedData[1]?.date_in).format(this.mask);
|
|
82
|
+
}
|
|
83
|
+
return (React.createElement("div", null,
|
|
84
|
+
React.createElement(DetailHeaderPanel, { onPrevRecord: () => this.dataGrid?.selectNextPreviousRecord(true), onNextRecord: () => this.dataGrid?.selectNextPreviousRecord(false), onClose: () => this.onCloseDetailPanel() }),
|
|
85
|
+
React.createElement("div", { style: { display: "flex", marginTop: 4, fontWeight: 500 } },
|
|
86
|
+
React.createElement("div", { style: { width: "50%" } },
|
|
87
|
+
React.createElement("span", { style: { marginLeft: 12 } }, dayjs(this.state.selectedData[0]?.date_in).format(this.mask))),
|
|
88
|
+
React.createElement(Divider, { style: { height: "auto", margin: "8px 0px 0px" }, type: "vertical" }),
|
|
89
|
+
React.createElement("div", { style: { width: "50%" } },
|
|
90
|
+
React.createElement("span", { style: { marginLeft: 12 } }, rightContentTitle)))));
|
|
91
|
+
}
|
|
92
|
+
renderDetailPanel() {
|
|
93
|
+
const leftContentEntity = this.getLeftContentEntity();
|
|
94
|
+
const rightContentEntity = this.getRightContentEntity();
|
|
95
|
+
const differences = EntityComparisonUtils.compare(leftContentEntity, rightContentEntity);
|
|
96
|
+
return (React.createElement("div", null,
|
|
97
|
+
this.renderConfigHeader(),
|
|
98
|
+
React.createElement("div", { style: { display: "flex" } },
|
|
99
|
+
this.props.renderDetail(leftContentEntity, differences),
|
|
100
|
+
React.createElement(Divider, { style: { height: "auto", margin: 0 }, type: "vertical" }),
|
|
101
|
+
this.props.renderDetail(rightContentEntity, differences))));
|
|
102
|
+
}
|
|
103
|
+
getLeftContentEntity() {
|
|
104
|
+
if (this.state.selectedData[0]) {
|
|
105
|
+
const leftContentEntity = cloneDeep(this.state.selectedData[0]);
|
|
106
|
+
leftContentEntity.id = this.props.entity.id;
|
|
107
|
+
return leftContentEntity;
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
getRightContentEntity() {
|
|
112
|
+
if (this.state.selectedData.length === 2) {
|
|
113
|
+
const rightContentEntity = cloneDeep(this.state.selectedData[1]);
|
|
114
|
+
rightContentEntity.id = this.props.entity.id;
|
|
115
|
+
return rightContentEntity;
|
|
116
|
+
}
|
|
117
|
+
return this.props.entity;
|
|
118
|
+
}
|
|
119
|
+
onCloseDetailPanel() {
|
|
120
|
+
this.setState({ selectedData: this.gridApi?.getSelectedRows() ?? [] });
|
|
121
|
+
this.dataGrid?.showDetailPanel(false);
|
|
122
|
+
}
|
|
123
|
+
onSelectionChanged(event) {
|
|
124
|
+
this.props.onSelectionChanged();
|
|
125
|
+
const selectedRows = event.api.getSelectedRows();
|
|
126
|
+
if (selectedRows.length > 0) {
|
|
127
|
+
this.setState({ selectedData: selectedRows });
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.setState({ selectedData: [] });
|
|
131
|
+
this.dataGrid?.showDetailPanel(false);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
render() {
|
|
135
|
+
return (React.createElement("div", { style: { position: "relative", width: "100%", height: "100%" } },
|
|
136
|
+
React.createElement(ExtendedDataGrid, { ref: (dataGrid) => {
|
|
137
|
+
this.dataGrid = dataGrid;
|
|
138
|
+
}, defaultGridConfiguration: { pageSize: -1 }, onGridReady: (params) => {
|
|
139
|
+
this.gridApi = params.api;
|
|
140
|
+
}, rowModelType: "infinite", datasource: this.state.datasource, onLoadData: this.onLoadData, onSelectionChanged: this.onSelectionChanged, columnDefs: this.state.columnDefs, search: {
|
|
141
|
+
onSearch: () => {
|
|
142
|
+
this.dataGrid?.loadData();
|
|
143
|
+
},
|
|
144
|
+
hidden: true,
|
|
145
|
+
}, onRowDoubleClicked: (event) => {
|
|
146
|
+
this.setState({ selectedData: [event.data] });
|
|
147
|
+
this.dataGrid?.showDetailPanel(true);
|
|
148
|
+
}, detailPanel: {
|
|
149
|
+
defaultWidth: this.props.detailPanelWidth,
|
|
150
|
+
renderer: this.renderDetailPanel
|
|
151
|
+
}, rowSelection: "multiple", noRecordsOverlayRenderer: () => React.createElement("div", null) })));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=entityHistoryListPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entityHistoryListPanel.js","sourceRoot":"","sources":["../../../../../coreui/components/history/entityHistoryListPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\r\nimport {GridApi, GridReadyEvent, IDatasource, IGetRowsParams, SelectionChangedEvent} from \"ag-grid-community\";\r\nimport ExtendedDataGrid from \"d2coreui/components/grid/extendedDataGrid\";\r\nimport AuditableEntity from \"../../../api/types/auditableEntity\";\r\nimport {DataGridColDef, OnLoadDataCallback} from \"d2coreui/components/grid/dataGrid\";\r\nimport AbstractEntityApi, {PageableList} from \"../../../api/abstractEntityApi\";\r\nimport {getDateTimeColumn, getStringColumn} from \"../grid/standardColumns\";\r\nimport {EntityColumn} from \"../advancedFilter/advancedFilterColumnDefinitions\";\r\nimport i18n from \"d2core/i18n/i18n\";\r\nimport dayjs from \"d2core/dayjs\";\r\nimport DetailHeaderPanel from \"../grid/detailHeaderPanel\";\r\nimport {Divider} from \"antd\";\r\nimport EntityComparisonUtils from \"../../../api/comparison/entityComparisonUtils\";\r\nimport {LocaleHolder} from \"d2core/i18n/localeHolder\";\r\nimport cloneDeep from \"lodash/cloneDeep\";\r\n\r\ninterface Props<T extends AuditableEntity> {\r\n api: AbstractEntityApi<T>\r\n entity?: T\r\n detailPanelWidth: number\r\n\r\n onSelectionChanged(): void\r\n\r\n renderDetail(entity: T | undefined, differences: string[]): React.ReactNode\r\n}\r\n\r\ninterface State<T extends AuditableEntity> {\r\n columnDefs: DataGridColDef[]\r\n loading: boolean\r\n datasource: IDatasource\r\n selectedData: T[]\r\n}\r\n\r\nexport default class EntityHistoryListPanel<T extends AuditableEntity> extends React.Component<Props<T>, State<T>> {\r\n private initialColumnDefs?: DataGridColDef[];\r\n private dataGrid: ExtendedDataGrid<T> | null = null;\r\n private gridApi?: GridApi;\r\n private firstLoadedPage: PageableList<T> | null = null;\r\n private manualReload = true;\r\n private mask = LocaleHolder.getDateTimeFormat(true, true, false);\r\n\r\n constructor(props: Readonly<Props<T>>) {\r\n super(props);\r\n\r\n this.state = {\r\n columnDefs: this.getInitialColumnDefs(),\r\n loading: false,\r\n datasource: {\r\n getRows: async (params: IGetRowsParams) => {\r\n if (this.firstLoadedPage) {\r\n let pageableList: PageableList<T>;\r\n if (this.manualReload && params.startRow === 0 && params.endRow === 100) {\r\n this.manualReload = false;\r\n pageableList = this.firstLoadedPage;\r\n } else {\r\n pageableList = await this.getRecords(params.startRow, params.endRow);\r\n }\r\n params.successCallback(pageableList.data, pageableList.totalNumberOfRows);\r\n\r\n if (this.state.selectedData.length === 0) {\r\n const rowNode = this.gridApi?.getRowNode(\"0\");\r\n if (rowNode) {\r\n rowNode.setSelected(true);\r\n this.setState({selectedData: [rowNode.data]});\r\n this.dataGrid?.showDetailPanel(true);\r\n }\r\n setTimeout(() => {\r\n this.forceUpdate();\r\n }, 400);\r\n }\r\n } else {\r\n params.successCallback([], 0);\r\n }\r\n }\r\n },\r\n selectedData: [],\r\n }\r\n\r\n this.onSelectionChanged = this.onSelectionChanged.bind(this);\r\n this.onLoadData = this.onLoadData.bind(this);\r\n this.renderDetailPanel = this.renderDetailPanel.bind(this);\r\n }\r\n\r\n private async onLoadData(callback: OnLoadDataCallback) {\r\n this.manualReload = true;\r\n this.firstLoadedPage = await this.getRecords(0, 100);\r\n callback(this.firstLoadedPage.totalNumberOfRows);\r\n this.gridApi?.onFilterChanged();\r\n }\r\n\r\n private async getRecords(from: number, to: number): Promise<PageableList<T>> {\r\n this.setState({loading: true});\r\n const pageableList = await this.props.api.getHistory(this.props.entity?.id!, from, to);\r\n this.setState({loading: false});\r\n return pageableList;\r\n }\r\n\r\n private getInitialColumnDefs(): DataGridColDef[] {\r\n if (!this.initialColumnDefs) {\r\n this.initialColumnDefs = [\r\n getDateTimeColumn(EntityColumn.CREATE_DATE, undefined, {sortable: false, headerName: i18n(\"Date\")}),\r\n getStringColumn(EntityColumn.CREATED_BY, undefined, {headerName: i18n(\"User\"), sortable: false}),\r\n ]\r\n }\r\n\r\n return this.initialColumnDefs;\r\n }\r\n\r\n private renderConfigHeader() {\r\n let rightContentTitle = i18n(\"Current\");\r\n if (this.state.selectedData.length === 2) {\r\n rightContentTitle = dayjs(this.state.selectedData[1]?.date_in).format(this.mask);\r\n }\r\n\r\n return (\r\n <div>\r\n <DetailHeaderPanel\r\n onPrevRecord={() => this.dataGrid?.selectNextPreviousRecord(true)}\r\n onNextRecord={() => this.dataGrid?.selectNextPreviousRecord(false)}\r\n onClose={() => this.onCloseDetailPanel()}\r\n />\r\n <div style={{display: \"flex\", marginTop: 4, fontWeight: 500}}>\r\n <div style={{width: \"50%\"}}>\r\n <span style={{marginLeft: 12}}>\r\n {dayjs(this.state.selectedData[0]?.date_in).format(this.mask)}\r\n </span>\r\n </div>\r\n <Divider style={{height: \"auto\", margin: \"8px 0px 0px\"}} type=\"vertical\"/>\r\n <div style={{width: \"50%\"}}>\r\n <span style={{marginLeft: 12}}>{rightContentTitle}</span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n renderDetailPanel(): React.ReactElement {\r\n const leftContentEntity = this.getLeftContentEntity();\r\n const rightContentEntity = this.getRightContentEntity();\r\n const differences = EntityComparisonUtils.compare(leftContentEntity, rightContentEntity);\r\n\r\n return (\r\n <div>\r\n {this.renderConfigHeader()}\r\n <div style={{display: \"flex\"}}>\r\n {this.props.renderDetail(leftContentEntity, differences)}\r\n <Divider style={{height: \"auto\", margin: 0}} type=\"vertical\"/>\r\n {this.props.renderDetail(rightContentEntity, differences)}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n private getLeftContentEntity(): T | undefined {\r\n if (this.state.selectedData[0]) {\r\n const leftContentEntity = cloneDeep(this.state.selectedData[0]);\r\n leftContentEntity.id = this.props.entity!.id;\r\n return leftContentEntity;\r\n }\r\n return undefined;\r\n }\r\n\r\n private getRightContentEntity(): T | undefined {\r\n if (this.state.selectedData.length === 2) {\r\n const rightContentEntity = cloneDeep(this.state.selectedData[1]);\r\n rightContentEntity.id = this.props.entity!.id;\r\n return rightContentEntity;\r\n }\r\n return this.props.entity;\r\n }\r\n\r\n private onCloseDetailPanel() {\r\n this.setState({selectedData: this.gridApi?.getSelectedRows() ?? []});\r\n this.dataGrid?.showDetailPanel(false);\r\n }\r\n\r\n private onSelectionChanged(event: SelectionChangedEvent) {\r\n this.props.onSelectionChanged();\r\n const selectedRows = event.api.getSelectedRows();\r\n if (selectedRows.length > 0) {\r\n this.setState({selectedData: selectedRows});\r\n } else {\r\n this.setState({selectedData: []});\r\n this.dataGrid?.showDetailPanel(false);\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <div style={{position: \"relative\", width: \"100%\", height: \"100%\"}}>\r\n <ExtendedDataGrid<T>\r\n ref={(dataGrid) => {\r\n this.dataGrid = dataGrid;\r\n }}\r\n defaultGridConfiguration={{pageSize: -1}}\r\n onGridReady={(params: GridReadyEvent) => {\r\n this.gridApi = params.api;\r\n }}\r\n rowModelType=\"infinite\"\r\n datasource={this.state.datasource}\r\n onLoadData={this.onLoadData}\r\n onSelectionChanged={this.onSelectionChanged}\r\n columnDefs={this.state.columnDefs}\r\n search={{\r\n onSearch: () => {\r\n this.dataGrid?.loadData();\r\n },\r\n hidden: true,\r\n }}\r\n onRowDoubleClicked={(event) => {\r\n this.setState({selectedData: [event.data]});\r\n this.dataGrid?.showDetailPanel(true);\r\n }}\r\n detailPanel={{\r\n defaultWidth: this.props.detailPanelWidth,\r\n renderer: this.renderDetailPanel\r\n }}\r\n rowSelection=\"multiple\"\r\n noRecordsOverlayRenderer={() => <div/>}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n}"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export declare enum LanguageEnum {
|
|
3
|
+
ENGLISH = "en",
|
|
4
|
+
SLOVAK = "sk",
|
|
5
|
+
UKRAINE = "uk"
|
|
6
|
+
}
|
|
7
|
+
interface Props {
|
|
8
|
+
value: LanguageEnum;
|
|
9
|
+
allowedLanguages: LanguageEnum[];
|
|
10
|
+
onChange(value: LanguageEnum): void;
|
|
11
|
+
}
|
|
12
|
+
export default class LanguageSelect extends React.Component<Props> {
|
|
13
|
+
private languageFlagMap;
|
|
14
|
+
constructor(props: Readonly<Props>);
|
|
15
|
+
render(): React.JSX.Element;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Select } from "antd";
|
|
3
|
+
import flagEN from "../../images/flags/flag_en.svg";
|
|
4
|
+
import flagSK from "../../images/flags/flag_sk.svg";
|
|
5
|
+
import flagUK from "../../images/flags/flag_uk.svg";
|
|
6
|
+
export var LanguageEnum;
|
|
7
|
+
(function (LanguageEnum) {
|
|
8
|
+
LanguageEnum["ENGLISH"] = "en";
|
|
9
|
+
LanguageEnum["SLOVAK"] = "sk";
|
|
10
|
+
LanguageEnum["UKRAINE"] = "uk";
|
|
11
|
+
})(LanguageEnum || (LanguageEnum = {}));
|
|
12
|
+
export default class LanguageSelect extends React.Component {
|
|
13
|
+
constructor(props) {
|
|
14
|
+
super(props);
|
|
15
|
+
this.languageFlagMap = {
|
|
16
|
+
[LanguageEnum.ENGLISH]: { svg: flagEN, title: "United Kingdom" },
|
|
17
|
+
[LanguageEnum.SLOVAK]: { svg: flagSK, title: "Slovakia" },
|
|
18
|
+
[LanguageEnum.UKRAINE]: { svg: flagUK, title: "Ukraine" },
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
render() {
|
|
22
|
+
return (React.createElement(Select, { variant: "borderless", style: { width: 72, marginRight: 8 }, value: this.props.value, onChange: this.props.onChange }, this.props.allowedLanguages.map(value => {
|
|
23
|
+
return (React.createElement(Select.Option, { value: value, key: value },
|
|
24
|
+
React.createElement("img", { style: { marginBottom: 2 }, src: this.languageFlagMap[value].svg, width: "34", height: "20", alt: this.languageFlagMap[value].title })));
|
|
25
|
+
})));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=languageSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languageSelect.js","sourceRoot":"","sources":["../../../../../coreui/components/languageSelect/languageSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAC,MAAM,MAAM,CAAC;AAC5B,OAAO,MAAM,MAAM,gCAAgC,CAAC;AACpD,OAAO,MAAM,MAAM,gCAAgC,CAAC;AACpD,OAAO,MAAM,MAAM,gCAAgC,CAAC;AAEpD,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACpB,8BAAc,CAAA;IACd,6BAAa,CAAA;IACb,8BAAc,CAAA;AAClB,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AASD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,KAAK,CAAC,SAAgB;IAO9D,YAAY,KAAsB;QAC9B,KAAK,CAAC,KAAK,CAAC,CAAC;QAPT,oBAAe,GAAgE;YACnF,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAC;YAC9D,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAC;YACvD,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAC;SAC1D,CAAA;IAID,CAAC;IAED,MAAM;QACF,OAAO,CACH,oBAAC,MAAM,IACH,OAAO,EAAC,YAAY,EACpB,KAAK,EAAE,EAAC,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAC,EAClC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EACvB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAE5B,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACrC,OAAO,CACH,oBAAC,MAAM,CAAC,MAAM,IAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK;gBACnC,6BACI,KAAK,EAAE,EAAC,YAAY,EAAE,CAAC,EAAC,EACxB,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,EACpC,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,KAAK,GACxC,CACU,CACnB,CAAC;QACN,CAAC,CAAC,CACG,CACZ,CAAC;IACN,CAAC;CAEJ","sourcesContent":["import React from \"react\";\r\nimport {Select} from \"antd\";\r\nimport flagEN from \"../../images/flags/flag_en.svg\";\r\nimport flagSK from \"../../images/flags/flag_sk.svg\";\r\nimport flagUK from \"../../images/flags/flag_uk.svg\";\r\n\r\nexport enum LanguageEnum {\r\n ENGLISH = \"en\",\r\n SLOVAK = \"sk\",\r\n UKRAINE = \"uk\",\r\n}\r\n\r\ninterface Props {\r\n value: LanguageEnum\r\n allowedLanguages: LanguageEnum[]\r\n\r\n onChange(value: LanguageEnum): void\r\n}\r\n\r\nexport default class LanguageSelect extends React.Component<Props> {\r\n private languageFlagMap: { [language in LanguageEnum]: { svg: any, title: string } } = {\r\n [LanguageEnum.ENGLISH]: {svg: flagEN, title: \"United Kingdom\"},\r\n [LanguageEnum.SLOVAK]: {svg: flagSK, title: \"Slovakia\"},\r\n [LanguageEnum.UKRAINE]: {svg: flagUK, title: \"Ukraine\"},\r\n }\r\n\r\n constructor(props: Readonly<Props>) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return (\r\n <Select\r\n variant=\"borderless\"\r\n style={{width: 72, marginRight: 8}}\r\n value={this.props.value}\r\n onChange={this.props.onChange}\r\n >\r\n {this.props.allowedLanguages.map(value => {\r\n return (\r\n <Select.Option value={value} key={value}>\r\n <img\r\n style={{marginBottom: 2}}\r\n src={this.languageFlagMap[value].svg}\r\n width=\"34\"\r\n height=\"20\"\r\n alt={this.languageFlagMap[value].title}\r\n />\r\n </Select.Option>\r\n );\r\n })}\r\n </Select>\r\n );\r\n }\r\n\r\n}"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ModalDialogFuncProps } from "d2coreui/components/modal/modalDialog";
|
|
2
|
+
import React from "react";
|
|
3
|
+
export declare function openModalWithIcon(props: Omit<ModalDialogFuncProps, "mode"> & {
|
|
4
|
+
customIcon: React.ReactNode;
|
|
5
|
+
text: React.ReactNode;
|
|
6
|
+
}): {
|
|
7
|
+
destroy: () => void;
|
|
8
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ModalDialog } from "d2coreui/components/modal/modalDialog";
|
|
2
|
+
import React from "react";
|
|
3
|
+
export function openModalWithIcon(props) {
|
|
4
|
+
const { customIcon, text } = props;
|
|
5
|
+
return ModalDialog.success({
|
|
6
|
+
mode: "NO_BUTTONS",
|
|
7
|
+
styles: {
|
|
8
|
+
body: {
|
|
9
|
+
textAlign: "center"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
icon: null,
|
|
13
|
+
centered: true,
|
|
14
|
+
autoFocusButton: null,
|
|
15
|
+
content: React.createElement("div", { style: {
|
|
16
|
+
display: "flex",
|
|
17
|
+
flexDirection: "column",
|
|
18
|
+
alignItems: "center",
|
|
19
|
+
gap: 20,
|
|
20
|
+
margin: "12px 0px 28px"
|
|
21
|
+
} },
|
|
22
|
+
customIcon,
|
|
23
|
+
text),
|
|
24
|
+
okButtonProps: {
|
|
25
|
+
block: true
|
|
26
|
+
},
|
|
27
|
+
...props
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=openModalWithIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openModalWithIcon.js","sourceRoot":"","sources":["../../../../../coreui/components/modalWithIcon/openModalWithIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAwC,MAAM,uCAAuC,CAAC;AACzG,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,iBAAiB,CAAC,KAGjC;IACG,MAAM,EAAC,UAAU,EAAE,IAAI,EAAC,GAAG,KAAK,CAAC;IAEjC,OAAO,WAAW,CAAC,OAAO,CAAC;QACvB,IAAI,cAA4B;QAChC,MAAM,EAAE;YACJ,IAAI,EAAE;gBACF,SAAS,EAAE,QAAQ;aACtB;SACJ;QACD,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,IAAI;QACrB,OAAO,EACH,6BACI,KAAK,EAAE;gBACH,OAAO,EAAE,MAAM;gBACf,aAAa,EAAE,QAAQ;gBACvB,UAAU,EAAE,QAAQ;gBACpB,GAAG,EAAE,EAAE;gBACP,MAAM,EAAE,eAAe;aAC1B;YAEA,UAAU;YACV,IAAI,CACH;QACV,aAAa,EAAE;YACX,KAAK,EAAE,IAAI;SACd;QACD,GAAG,KAAK;KACX,CAAC,CAAA;AACN,CAAC","sourcesContent":["import {ModalDialog, ModalDialogFuncProps, ModalDialogMode} from \"d2coreui/components/modal/modalDialog\";\r\nimport React from \"react\";\r\n\r\nexport function openModalWithIcon(props: Omit<ModalDialogFuncProps, \"mode\"> & {\r\n customIcon: React.ReactNode,\r\n text: React.ReactNode\r\n}): { destroy: () => void } {\r\n const {customIcon, text} = props;\r\n\r\n return ModalDialog.success({\r\n mode: ModalDialogMode.NO_BUTTONS,\r\n styles: {\r\n body: {\r\n textAlign: \"center\"\r\n }\r\n },\r\n icon: null,\r\n centered: true,\r\n autoFocusButton: null,\r\n content:\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n gap: 20,\r\n margin: \"12px 0px 28px\"\r\n }}\r\n >\r\n {customIcon}\r\n {text}\r\n </div>,\r\n okButtonProps: {\r\n block: true\r\n },\r\n ...props\r\n })\r\n}"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Entity from "../../../api/types/entity";
|
|
3
|
+
import AbstractEntityApi from "../../../api/abstractEntityApi";
|
|
4
|
+
import { AdvancedFilterApi, AdvancedFilterCondition } from "../../../api/advancedFilterApi";
|
|
5
|
+
export declare enum DetailModalDialogMode {
|
|
6
|
+
NEW = 0,
|
|
7
|
+
DETAIL = 1
|
|
8
|
+
}
|
|
9
|
+
export interface SelectedEntity {
|
|
10
|
+
id: number;
|
|
11
|
+
name: string | null;
|
|
12
|
+
code: string | null;
|
|
13
|
+
extra?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface AbstractSelectProps<T extends Entity> {
|
|
16
|
+
api: AbstractEntityApi<T>;
|
|
17
|
+
advancedFilterApi: AdvancedFilterApi;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
selectedItem?: SelectedEntity;
|
|
20
|
+
filterConditions?: AdvancedFilterCondition[];
|
|
21
|
+
onItemSelected?(selectedItem?: T): void;
|
|
22
|
+
}
|
|
23
|
+
export interface AbstractSelectState<T extends Entity> {
|
|
24
|
+
selectDialogVisible: boolean;
|
|
25
|
+
detailDialogVisible: boolean;
|
|
26
|
+
detailModalDialogMode?: DetailModalDialogMode;
|
|
27
|
+
entityToCreateOrEdit?: T;
|
|
28
|
+
loading: boolean;
|
|
29
|
+
suggestedItems: T[];
|
|
30
|
+
waitingForNewEntity: boolean;
|
|
31
|
+
waitingForEntityDetail: boolean;
|
|
32
|
+
}
|
|
33
|
+
export default abstract class AbstractSelect<T extends Entity, P extends AbstractSelectProps<T>, S extends AbstractSelectState<T> = AbstractSelectState<T>> extends React.Component<P, S> {
|
|
34
|
+
protected constructor(props: Readonly<P>);
|
|
35
|
+
protected initialState: AbstractSelectState<T>;
|
|
36
|
+
componentDidUpdate(prevProps: Readonly<P>): void;
|
|
37
|
+
protected getFilterConditionForCode(searchString?: string): AdvancedFilterCondition;
|
|
38
|
+
protected getFilterConditionForName(searchString?: string): AdvancedFilterCondition;
|
|
39
|
+
protected getFilterConditions(searchString?: string): AdvancedFilterCondition[];
|
|
40
|
+
private onLoadData;
|
|
41
|
+
protected createNewEntity(): Promise<T>;
|
|
42
|
+
protected getEntity(id: number): Promise<T>;
|
|
43
|
+
private renderNewEntityButton;
|
|
44
|
+
private renderDetailEntityButton;
|
|
45
|
+
private showCancelButton;
|
|
46
|
+
private showDetailButton;
|
|
47
|
+
private showNewEntityButton;
|
|
48
|
+
protected getSuffixIcon(): React.ReactNode;
|
|
49
|
+
abstract renderSelectDialog(): React.ReactNode;
|
|
50
|
+
protected onSaveEntity(savedEntity: T): void;
|
|
51
|
+
renderDetailPanel(): React.ReactNode;
|
|
52
|
+
protected getNewEntityModalDialogTitle(): string;
|
|
53
|
+
private getModalDialogTitle;
|
|
54
|
+
private renderDetailPanelModalDialog;
|
|
55
|
+
protected getExtraValueForDropdown(_suggestedItem: T): string | undefined;
|
|
56
|
+
render(): React.JSX.Element;
|
|
57
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { CloseCircleOutlined, LoadingOutlined, MonitorOutlined, PlusCircleOutlined, SelectOutlined } from "@ant-design/icons";
|
|
3
|
+
import { Select } from "antd";
|
|
4
|
+
import { AdvancedFilterLogicalOperator, AdvancedFilterOperator } from "../../../api/advancedFilterApi";
|
|
5
|
+
import debounce from "lodash/debounce";
|
|
6
|
+
import AdvancedFilterUtils from "../advancedFilter/advancedFilterUtils";
|
|
7
|
+
import { ModalDialog } from "d2coreui/components/modal/modalDialog";
|
|
8
|
+
import i18n from "d2core/i18n/i18n";
|
|
9
|
+
import { EntityColumn, getStringAdvancedFilterColumn } from "../advancedFilter/advancedFilterColumnDefinitions";
|
|
10
|
+
import { ERROR_COLOR } from "../../../api/constants/constants";
|
|
11
|
+
import TitleWithCodePanel from "../titleWithCodePanel/titleWithCodePanel";
|
|
12
|
+
import ColorTag from "../colorTag/colorTag";
|
|
13
|
+
import { createStyles } from "antd-style";
|
|
14
|
+
import WithCss from "d2coreui/components/style/withCss";
|
|
15
|
+
const useStyles = createStyles(({ css }) => {
|
|
16
|
+
return {
|
|
17
|
+
abstractSelectWithDetail: css `
|
|
18
|
+
.ant-select-selection-item {
|
|
19
|
+
max-width: calc(100% - 52px);
|
|
20
|
+
}
|
|
21
|
+
`
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
export var DetailModalDialogMode;
|
|
25
|
+
(function (DetailModalDialogMode) {
|
|
26
|
+
DetailModalDialogMode[DetailModalDialogMode["NEW"] = 0] = "NEW";
|
|
27
|
+
DetailModalDialogMode[DetailModalDialogMode["DETAIL"] = 1] = "DETAIL";
|
|
28
|
+
})(DetailModalDialogMode || (DetailModalDialogMode = {}));
|
|
29
|
+
export default class AbstractSelect extends React.Component {
|
|
30
|
+
constructor(props) {
|
|
31
|
+
super(props);
|
|
32
|
+
this.initialState = {
|
|
33
|
+
selectDialogVisible: false,
|
|
34
|
+
detailDialogVisible: false,
|
|
35
|
+
loading: false,
|
|
36
|
+
suggestedItems: [],
|
|
37
|
+
waitingForNewEntity: false,
|
|
38
|
+
waitingForEntityDetail: false,
|
|
39
|
+
};
|
|
40
|
+
this.onLoadData = debounce(this.onLoadData.bind(this), 500);
|
|
41
|
+
this.onSaveEntity = this.onSaveEntity.bind(this);
|
|
42
|
+
}
|
|
43
|
+
componentDidUpdate(prevProps) {
|
|
44
|
+
if (prevProps.selectedItem?.id !== this.props.selectedItem?.id) {
|
|
45
|
+
this.setState({ suggestedItems: [] });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
getFilterConditionForCode(searchString) {
|
|
49
|
+
return AdvancedFilterUtils.createNewCondition(-1, getStringAdvancedFilterColumn(EntityColumn.CODE), {
|
|
50
|
+
operator: AdvancedFilterOperator.LIKE,
|
|
51
|
+
value: `%${searchString ?? ""}%`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
getFilterConditionForName(searchString) {
|
|
55
|
+
return AdvancedFilterUtils.createNewCondition(-2, getStringAdvancedFilterColumn(EntityColumn.NAME), {
|
|
56
|
+
operator: AdvancedFilterOperator.LIKE,
|
|
57
|
+
value: `%${searchString ?? ""}%`,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
getFilterConditions(searchString) {
|
|
61
|
+
const filterConditionForCode = this.getFilterConditionForCode(searchString);
|
|
62
|
+
filterConditionForCode.left_par = 1;
|
|
63
|
+
filterConditionForCode.logical_operator = AdvancedFilterLogicalOperator.OR;
|
|
64
|
+
const filterConditionForName = this.getFilterConditionForName(searchString);
|
|
65
|
+
filterConditionForName.right_par = 1;
|
|
66
|
+
return [
|
|
67
|
+
filterConditionForCode,
|
|
68
|
+
filterConditionForName,
|
|
69
|
+
];
|
|
70
|
+
}
|
|
71
|
+
async onLoadData(searchString) {
|
|
72
|
+
this.setState({ loading: true });
|
|
73
|
+
const filterConditions = this.getFilterConditions(searchString);
|
|
74
|
+
if (this.props.filterConditions) {
|
|
75
|
+
filterConditions[filterConditions.length - 1].logical_operator = AdvancedFilterLogicalOperator.AND;
|
|
76
|
+
filterConditions.push(...this.props.filterConditions);
|
|
77
|
+
}
|
|
78
|
+
const pageableList = await this.props.api.getAllData(0, 10, "", filterConditions, true);
|
|
79
|
+
this.setState({ suggestedItems: pageableList.data, loading: false });
|
|
80
|
+
}
|
|
81
|
+
async createNewEntity() {
|
|
82
|
+
return await this.props.api.createNewEntity();
|
|
83
|
+
}
|
|
84
|
+
async getEntity(id) {
|
|
85
|
+
return await this.props.api.getEntity(id);
|
|
86
|
+
}
|
|
87
|
+
renderNewEntityButton() {
|
|
88
|
+
if (this.state.waitingForNewEntity) {
|
|
89
|
+
return React.createElement(LoadingOutlined, null);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
return (React.createElement(PlusCircleOutlined, { title: i18n("Create New Entity"), style: { cursor: "pointer" }, disabled: this.state.waitingForEntityDetail, onClick: async () => {
|
|
93
|
+
this.setState({
|
|
94
|
+
waitingForNewEntity: true,
|
|
95
|
+
detailModalDialogMode: DetailModalDialogMode.NEW
|
|
96
|
+
});
|
|
97
|
+
const newEntity = await this.createNewEntity();
|
|
98
|
+
this.setState({
|
|
99
|
+
entityToCreateOrEdit: newEntity,
|
|
100
|
+
detailDialogVisible: true,
|
|
101
|
+
waitingForNewEntity: false
|
|
102
|
+
});
|
|
103
|
+
} }));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
renderDetailEntityButton(id) {
|
|
107
|
+
if (this.state.waitingForEntityDetail) {
|
|
108
|
+
return React.createElement(LoadingOutlined, null);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
return (React.createElement(MonitorOutlined, { title: i18n("Show Detail"), disabled: this.state.waitingForNewEntity, onClick: async () => {
|
|
112
|
+
this.setState({
|
|
113
|
+
waitingForEntityDetail: true,
|
|
114
|
+
detailModalDialogMode: DetailModalDialogMode.DETAIL
|
|
115
|
+
});
|
|
116
|
+
const entity = await this.getEntity(id);
|
|
117
|
+
this.setState({
|
|
118
|
+
entityToCreateOrEdit: entity,
|
|
119
|
+
detailDialogVisible: true,
|
|
120
|
+
waitingForEntityDetail: false
|
|
121
|
+
});
|
|
122
|
+
} }));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
showCancelButton() {
|
|
126
|
+
return !!this.props.selectedItem;
|
|
127
|
+
}
|
|
128
|
+
showDetailButton() {
|
|
129
|
+
return !!this.props.selectedItem && !!this.renderDetailPanel();
|
|
130
|
+
}
|
|
131
|
+
showNewEntityButton() {
|
|
132
|
+
return !!this.renderDetailPanel();
|
|
133
|
+
}
|
|
134
|
+
getSuffixIcon() {
|
|
135
|
+
if (this.props.disabled) {
|
|
136
|
+
if (this.showDetailButton()) {
|
|
137
|
+
return this.renderDetailEntityButton(this.props.selectedItem.id);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
return React.createElement("span", null);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else if (this.state.loading) {
|
|
144
|
+
return React.createElement(LoadingOutlined, null);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
return (React.createElement(React.Fragment, null,
|
|
148
|
+
this.showCancelButton() &&
|
|
149
|
+
React.createElement(CloseCircleOutlined, { style: { color: ERROR_COLOR }, title: i18n("Cancel Selected Entity"), onClick: () => {
|
|
150
|
+
this.props.onItemSelected?.(undefined);
|
|
151
|
+
} }),
|
|
152
|
+
this.showDetailButton() && this.renderDetailEntityButton(this.props.selectedItem.id),
|
|
153
|
+
this.showNewEntityButton() && this.renderNewEntityButton(),
|
|
154
|
+
React.createElement(SelectOutlined, { title: i18n("Open Select Dialog"), onClick: () => {
|
|
155
|
+
this.setState({ selectDialogVisible: true });
|
|
156
|
+
} })));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
onSaveEntity(savedEntity) {
|
|
160
|
+
this.props.onItemSelected?.(savedEntity);
|
|
161
|
+
this.setState({ detailDialogVisible: false, entityToCreateOrEdit: undefined });
|
|
162
|
+
}
|
|
163
|
+
renderDetailPanel() {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
getNewEntityModalDialogTitle() {
|
|
167
|
+
return i18n("New Entity");
|
|
168
|
+
}
|
|
169
|
+
getModalDialogTitle() {
|
|
170
|
+
if (this.state.detailModalDialogMode === DetailModalDialogMode.NEW) {
|
|
171
|
+
return this.getNewEntityModalDialogTitle();
|
|
172
|
+
}
|
|
173
|
+
else if (this.state.detailModalDialogMode === DetailModalDialogMode.DETAIL) {
|
|
174
|
+
return React.createElement(TitleWithCodePanel, { title: i18n("Detail"), code: this.state.entityToCreateOrEdit?.code ?? "" });
|
|
175
|
+
}
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
renderDetailPanelModalDialog() {
|
|
179
|
+
return (React.createElement(ModalDialog, { mode: "NO_BUTTONS", open: this.state.detailDialogVisible, onCancel: () => this.setState({ detailDialogVisible: false }), styles: { body: { padding: 0 } }, title: this.getModalDialogTitle(), initialWidth: 720, initialHeight: window.innerHeight * 0.95, forceRender: true }, this.renderDetailPanel()));
|
|
180
|
+
}
|
|
181
|
+
getExtraValueForDropdown(_suggestedItem) {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
render() {
|
|
185
|
+
const selectedItem = this.props.selectedItem;
|
|
186
|
+
const hasDetailPanel = !!this.renderDetailPanel();
|
|
187
|
+
let value;
|
|
188
|
+
if (selectedItem && selectedItem.id >= 0) {
|
|
189
|
+
value = {
|
|
190
|
+
key: selectedItem.id.toString(),
|
|
191
|
+
value: selectedItem.id,
|
|
192
|
+
label: React.createElement("span", null,
|
|
193
|
+
selectedItem.code,
|
|
194
|
+
(selectedItem.code && selectedItem.name) ? ` (${selectedItem.name})` : selectedItem.name,
|
|
195
|
+
selectedItem.extra && ` ${selectedItem.extra}`)
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
value = undefined;
|
|
200
|
+
}
|
|
201
|
+
return (React.createElement("div", { onDoubleClick: () => {
|
|
202
|
+
if (!this.props.disabled && !this.state.detailDialogVisible) {
|
|
203
|
+
this.setState({ selectDialogVisible: true });
|
|
204
|
+
}
|
|
205
|
+
} },
|
|
206
|
+
this.renderSelectDialog(),
|
|
207
|
+
this.renderDetailPanelModalDialog(),
|
|
208
|
+
React.createElement(WithCss, { useStyles: useStyles }, (css) => React.createElement(Select, { className: !this.props.disabled && hasDetailPanel ? css.styles.abstractSelectWithDetail : undefined, disabled: this.props.disabled, style: { width: "100%" }, labelInValue: true, showSearch: true, filterOption: false, value: value, notFoundContent: null, onChange: (value) => {
|
|
209
|
+
if (!value) {
|
|
210
|
+
this.props.onItemSelected?.(undefined);
|
|
211
|
+
}
|
|
212
|
+
}, onFocus: () => {
|
|
213
|
+
this.onLoadData();
|
|
214
|
+
}, onClick: event => {
|
|
215
|
+
if (event.target instanceof HTMLInputElement || event.target instanceof HTMLSpanElement) {
|
|
216
|
+
this.onLoadData();
|
|
217
|
+
}
|
|
218
|
+
}, onSearch: searchString => {
|
|
219
|
+
this.onLoadData(searchString);
|
|
220
|
+
}, onSelect: (selectedValue) => {
|
|
221
|
+
const item = this.state.suggestedItems.find(value => value.id === selectedValue.value);
|
|
222
|
+
this.props.onItemSelected?.(item);
|
|
223
|
+
}, suffixIcon: React.createElement("span", { style: { display: "flex", gap: 4, fontSize: 14, color: "rgba(0, 0, 0, 0.55)" } }, this.getSuffixIcon()) }, this.state.suggestedItems.map(suggestedItem => {
|
|
224
|
+
const extraValueForDropdown = this.getExtraValueForDropdown(suggestedItem);
|
|
225
|
+
const displayName = `${suggestedItem.name ?? ""} ${extraValueForDropdown ?? ""}`;
|
|
226
|
+
return (React.createElement(Select.Option, { value: suggestedItem.id, key: suggestedItem.id },
|
|
227
|
+
React.createElement("div", { style: { display: "flex", justifyContent: "space-between" } },
|
|
228
|
+
suggestedItem.code && React.createElement(ColorTag, null, suggestedItem.code),
|
|
229
|
+
React.createElement("div", { title: displayName }, displayName))));
|
|
230
|
+
})))));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=abstractSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstractSelect.js","sourceRoot":"","sources":["../../../../../coreui/components/select/abstractSelect.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\r\nimport Entity from \"../../../api/types/entity\";\r\nimport {\r\n CloseCircleOutlined,\r\n LoadingOutlined,\r\n MonitorOutlined,\r\n PlusCircleOutlined,\r\n SelectOutlined\r\n} from \"@ant-design/icons\";\r\nimport {LabeledValue} from \"antd/es/select\";\r\nimport {Select} from \"antd\";\r\nimport AbstractEntityApi from \"../../../api/abstractEntityApi\";\r\nimport {\r\n AdvancedFilterApi,\r\n AdvancedFilterCondition,\r\n AdvancedFilterLogicalOperator,\r\n AdvancedFilterOperator\r\n} from \"../../../api/advancedFilterApi\";\r\nimport debounce from \"lodash/debounce\";\r\nimport AdvancedFilterUtils from \"../advancedFilter/advancedFilterUtils\";\r\nimport {ModalDialog, ModalDialogMode} from \"d2coreui/components/modal/modalDialog\";\r\nimport i18n from \"d2core/i18n/i18n\";\r\nimport {EntityColumn, getStringAdvancedFilterColumn} from \"../advancedFilter/advancedFilterColumnDefinitions\";\r\nimport {ERROR_COLOR} from \"../../../api/constants/constants\";\r\nimport TitleWithCodePanel from \"../titleWithCodePanel/titleWithCodePanel\";\r\nimport ColorTag from \"../colorTag/colorTag\";\r\nimport {createStyles} from \"antd-style\";\r\nimport WithCss from \"d2coreui/components/style/withCss\";\r\n\r\nconst useStyles = createStyles(({css}) => {\r\n return {\r\n abstractSelectWithDetail: css`\r\n .ant-select-selection-item {\r\n max-width: calc(100% - 52px);\r\n }\r\n `\r\n }\r\n});\r\n\r\nexport enum DetailModalDialogMode {\r\n NEW, DETAIL\r\n}\r\n\r\nexport interface SelectedEntity {\r\n id: number\r\n name: string | null\r\n code: string | null\r\n extra?: string\r\n}\r\n\r\nexport interface AbstractSelectProps<T extends Entity> {\r\n api: AbstractEntityApi<T>\r\n advancedFilterApi: AdvancedFilterApi\r\n disabled?: boolean\r\n\r\n selectedItem?: SelectedEntity\r\n filterConditions?: AdvancedFilterCondition[]\r\n\r\n onItemSelected?(selectedItem?: T): void\r\n}\r\n\r\nexport interface AbstractSelectState<T extends Entity> {\r\n selectDialogVisible: boolean\r\n detailDialogVisible: boolean\r\n detailModalDialogMode?: DetailModalDialogMode\r\n entityToCreateOrEdit?: T\r\n loading: boolean\r\n suggestedItems: T[]\r\n waitingForNewEntity: boolean\r\n waitingForEntityDetail: boolean\r\n}\r\n\r\nexport default abstract class AbstractSelect<T extends Entity,\r\n P extends AbstractSelectProps<T>,\r\n S extends AbstractSelectState<T> = AbstractSelectState<T>> extends React.Component<P, S> {\r\n\r\n protected constructor(props: Readonly<P>) {\r\n super(props);\r\n\r\n // @ts-ignore\r\n this.onLoadData = debounce(this.onLoadData.bind(this), 500);\r\n this.onSaveEntity = this.onSaveEntity.bind(this);\r\n }\r\n\r\n protected initialState: AbstractSelectState<T> = {\r\n selectDialogVisible: false,\r\n detailDialogVisible: false,\r\n loading: false,\r\n suggestedItems: [],\r\n waitingForNewEntity: false,\r\n waitingForEntityDetail: false,\r\n }\r\n\r\n componentDidUpdate(prevProps: Readonly<P>) {\r\n if (prevProps.selectedItem?.id !== this.props.selectedItem?.id) {\r\n this.setState({suggestedItems: []});\r\n }\r\n }\r\n\r\n protected getFilterConditionForCode(searchString?: string): AdvancedFilterCondition {\r\n return AdvancedFilterUtils.createNewCondition(-1, getStringAdvancedFilterColumn(EntityColumn.CODE), {\r\n operator: AdvancedFilterOperator.LIKE,\r\n value: `%${searchString ?? \"\"}%`,\r\n });\r\n }\r\n\r\n protected getFilterConditionForName(searchString?: string): AdvancedFilterCondition {\r\n return AdvancedFilterUtils.createNewCondition(-2, getStringAdvancedFilterColumn(EntityColumn.NAME), {\r\n operator: AdvancedFilterOperator.LIKE,\r\n value: `%${searchString ?? \"\"}%`,\r\n })\r\n }\r\n\r\n protected getFilterConditions(searchString?: string): AdvancedFilterCondition[] {\r\n const filterConditionForCode = this.getFilterConditionForCode(searchString);\r\n filterConditionForCode.left_par = 1;\r\n filterConditionForCode.logical_operator = AdvancedFilterLogicalOperator.OR;\r\n\r\n const filterConditionForName = this.getFilterConditionForName(searchString);\r\n filterConditionForName.right_par = 1;\r\n\r\n return [\r\n filterConditionForCode,\r\n filterConditionForName,\r\n ]\r\n }\r\n\r\n private async onLoadData(searchString?: string) {\r\n this.setState({loading: true});\r\n\r\n const filterConditions = this.getFilterConditions(searchString);\r\n if (this.props.filterConditions) {\r\n filterConditions[filterConditions.length - 1].logical_operator = AdvancedFilterLogicalOperator.AND;\r\n filterConditions.push(...this.props.filterConditions);\r\n }\r\n\r\n const pageableList = await this.props.api.getAllData(\r\n 0,\r\n 10,\r\n \"\",\r\n filterConditions,\r\n true\r\n );\r\n\r\n this.setState({suggestedItems: pageableList.data, loading: false});\r\n }\r\n\r\n protected async createNewEntity(): Promise<T> {\r\n return await this.props.api.createNewEntity();\r\n }\r\n\r\n protected async getEntity(id: number): Promise<T> {\r\n return await this.props.api.getEntity(id);\r\n }\r\n\r\n private renderNewEntityButton() {\r\n if (this.state.waitingForNewEntity) {\r\n return <LoadingOutlined/>\r\n } else {\r\n return (\r\n <PlusCircleOutlined\r\n title={i18n(\"Create New Entity\")}\r\n style={{cursor: \"pointer\"}}\r\n disabled={this.state.waitingForEntityDetail}\r\n onClick={async () => {\r\n this.setState({\r\n waitingForNewEntity: true,\r\n detailModalDialogMode: DetailModalDialogMode.NEW\r\n });\r\n const newEntity = await this.createNewEntity();\r\n this.setState({\r\n entityToCreateOrEdit: newEntity,\r\n detailDialogVisible: true,\r\n waitingForNewEntity: false\r\n });\r\n }}\r\n />\r\n );\r\n }\r\n }\r\n\r\n private renderDetailEntityButton(id: number) {\r\n if (this.state.waitingForEntityDetail) {\r\n return <LoadingOutlined/>\r\n } else {\r\n return (\r\n <MonitorOutlined\r\n title={i18n(\"Show Detail\")}\r\n disabled={this.state.waitingForNewEntity}\r\n onClick={async () => {\r\n this.setState({\r\n waitingForEntityDetail: true,\r\n detailModalDialogMode: DetailModalDialogMode.DETAIL\r\n });\r\n const entity = await this.getEntity(id);\r\n this.setState({\r\n entityToCreateOrEdit: entity,\r\n detailDialogVisible: true,\r\n waitingForEntityDetail: false\r\n });\r\n }}\r\n />\r\n );\r\n }\r\n }\r\n\r\n private showCancelButton(): boolean {\r\n return !!this.props.selectedItem;\r\n }\r\n\r\n private showDetailButton(): boolean {\r\n return !!this.props.selectedItem && !!this.renderDetailPanel();\r\n }\r\n\r\n private showNewEntityButton(): boolean {\r\n return !!this.renderDetailPanel();\r\n }\r\n\r\n protected getSuffixIcon(): React.ReactNode {\r\n if (this.props.disabled) {\r\n if (this.showDetailButton()) {\r\n return this.renderDetailEntityButton(this.props.selectedItem!.id)\r\n } else {\r\n return <span/>;\r\n }\r\n } else if (this.state.loading) {\r\n return <LoadingOutlined/>;\r\n } else {\r\n return (\r\n <>\r\n {this.showCancelButton() &&\r\n <CloseCircleOutlined\r\n style={{color: ERROR_COLOR}}\r\n title={i18n(\"Cancel Selected Entity\")}\r\n onClick={() => {\r\n this.props.onItemSelected?.(undefined);\r\n }}\r\n />\r\n }\r\n {this.showDetailButton() && this.renderDetailEntityButton(this.props.selectedItem!.id)}\r\n {this.showNewEntityButton() && this.renderNewEntityButton()}\r\n <SelectOutlined\r\n title={i18n(\"Open Select Dialog\")}\r\n onClick={() => {\r\n this.setState({selectDialogVisible: true})\r\n }}\r\n />\r\n </>\r\n );\r\n }\r\n }\r\n\r\n abstract renderSelectDialog(): React.ReactNode;\r\n\r\n protected onSaveEntity(savedEntity: T) {\r\n this.props.onItemSelected?.(savedEntity);\r\n this.setState({detailDialogVisible: false, entityToCreateOrEdit: undefined});\r\n }\r\n\r\n renderDetailPanel(): React.ReactNode {\r\n return undefined;\r\n }\r\n\r\n protected getNewEntityModalDialogTitle(): string {\r\n return i18n(\"New Entity\");\r\n }\r\n\r\n private getModalDialogTitle() {\r\n if (this.state.detailModalDialogMode === DetailModalDialogMode.NEW) {\r\n return this.getNewEntityModalDialogTitle();\r\n } else if (this.state.detailModalDialogMode === DetailModalDialogMode.DETAIL) {\r\n return <TitleWithCodePanel title={i18n(\"Detail\")} code={this.state.entityToCreateOrEdit?.code ?? \"\"}/>\r\n }\r\n return undefined;\r\n }\r\n\r\n private renderDetailPanelModalDialog() {\r\n return (\r\n <ModalDialog\r\n mode={ModalDialogMode.NO_BUTTONS}\r\n open={this.state.detailDialogVisible}\r\n onCancel={() => this.setState({detailDialogVisible: false})}\r\n styles={{body: {padding: 0}}}\r\n title={this.getModalDialogTitle()}\r\n initialWidth={720}\r\n initialHeight={window.innerHeight * 0.95}\r\n forceRender\r\n >\r\n {this.renderDetailPanel()}\r\n </ModalDialog>\r\n );\r\n }\r\n\r\n protected getExtraValueForDropdown(_suggestedItem: T): string | undefined {\r\n return undefined;\r\n }\r\n\r\n render() {\r\n const selectedItem = this.props.selectedItem;\r\n const hasDetailPanel = !!this.renderDetailPanel();\r\n\r\n let value: LabeledValue | undefined;\r\n if (selectedItem && selectedItem.id >= 0) {\r\n value = {\r\n key: selectedItem.id.toString(),\r\n value: selectedItem.id,\r\n label:\r\n <span>\r\n {selectedItem.code}\r\n {(selectedItem.code && selectedItem.name) ? ` (${selectedItem.name})` : selectedItem.name}\r\n {selectedItem.extra && ` ${selectedItem.extra}`}\r\n </span>\r\n };\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return (\r\n <div\r\n onDoubleClick={() => {\r\n if (!this.props.disabled && !this.state.detailDialogVisible) {\r\n this.setState({selectDialogVisible: true});\r\n }\r\n }}\r\n >\r\n {this.renderSelectDialog()}\r\n {this.renderDetailPanelModalDialog()}\r\n <WithCss useStyles={useStyles}>{(css) =>\r\n <Select\r\n className={!this.props.disabled && hasDetailPanel ? css.styles.abstractSelectWithDetail : undefined}\r\n disabled={this.props.disabled}\r\n style={{width: \"100%\"}}\r\n labelInValue\r\n showSearch\r\n filterOption={false}\r\n value={value}\r\n notFoundContent={null}\r\n onChange={(value: any) => {\r\n if (!value) {\r\n this.props.onItemSelected?.(undefined);\r\n }\r\n }}\r\n onFocus={() => {\r\n this.onLoadData();\r\n }}\r\n onClick={event => {\r\n if (event.target instanceof HTMLInputElement || event.target instanceof HTMLSpanElement) {\r\n this.onLoadData();\r\n }\r\n }}\r\n onSearch={searchString => {\r\n this.onLoadData(searchString);\r\n }}\r\n onSelect={(selectedValue: LabeledValue) => {\r\n const item = this.state.suggestedItems.find(value => value.id === selectedValue.value);\r\n this.props.onItemSelected?.(item);\r\n }}\r\n suffixIcon={\r\n <span style={{display: \"flex\", gap: 4, fontSize: 14, color: \"rgba(0, 0, 0, 0.55)\"}}>\r\n {this.getSuffixIcon()}\r\n </span>\r\n }\r\n >\r\n {this.state.suggestedItems.map(suggestedItem => {\r\n const extraValueForDropdown = this.getExtraValueForDropdown(suggestedItem);\r\n const displayName = `${suggestedItem.name ?? \"\"} ${extraValueForDropdown ?? \"\"}`\r\n return (\r\n <Select.Option value={suggestedItem.id} key={suggestedItem.id}>\r\n <div style={{display: \"flex\", justifyContent: \"space-between\"}}>\r\n {suggestedItem.code && <ColorTag>{suggestedItem.code}</ColorTag>}\r\n <div title={displayName}>{displayName}</div>\r\n </div>\r\n </Select.Option>\r\n );\r\n })}\r\n </Select>\r\n }</WithCss>\r\n </div>\r\n )\r\n }\r\n}"]}
|