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.
Files changed (274) hide show
  1. package/api/abstractApi.d.ts +21 -0
  2. package/api/abstractApi.js +56 -0
  3. package/api/abstractApi.js.map +1 -0
  4. package/api/abstractEntityApi.d.ts +37 -0
  5. package/api/abstractEntityApi.js +145 -0
  6. package/api/abstractEntityApi.js.map +1 -0
  7. package/api/advancedFilterApi.d.ts +56 -0
  8. package/api/advancedFilterApi.js +108 -0
  9. package/api/advancedFilterApi.js.map +1 -0
  10. package/api/archiveApi.d.ts +14 -0
  11. package/api/archiveApi.js +25 -0
  12. package/api/archiveApi.js.map +1 -0
  13. package/api/comparison/entityComparisonUtils.d.ts +4 -0
  14. package/api/comparison/entityComparisonUtils.js +15 -0
  15. package/api/comparison/entityComparisonUtils.js.map +1 -0
  16. package/api/constants/constants.d.ts +5 -0
  17. package/api/constants/constants.js +6 -0
  18. package/api/constants/constants.js.map +1 -0
  19. package/api/constants/d2ChartConstants.d.ts +5 -0
  20. package/api/constants/d2ChartConstants.js +6 -0
  21. package/api/constants/d2ChartConstants.js.map +1 -0
  22. package/api/edaApi.d.ts +36 -0
  23. package/api/edaApi.js +109 -0
  24. package/api/edaApi.js.map +1 -0
  25. package/api/impl/errorHandling.d.ts +1 -0
  26. package/api/impl/errorHandling.js +72 -0
  27. package/api/impl/errorHandling.js.map +1 -0
  28. package/api/impl/utils/reportError.d.ts +2 -0
  29. package/api/impl/utils/reportError.js +157 -0
  30. package/api/impl/utils/reportError.js.map +1 -0
  31. package/api/impl/utils/reportServiceMessage.d.ts +1 -0
  32. package/api/impl/utils/reportServiceMessage.js +29 -0
  33. package/api/impl/utils/reportServiceMessage.js.map +1 -0
  34. package/api/types/accessRight.d.ts +5 -0
  35. package/api/types/accessRight.js +7 -0
  36. package/api/types/accessRight.js.map +1 -0
  37. package/api/types/advancedFilter.d.ts +22 -0
  38. package/api/types/advancedFilter.js +16 -0
  39. package/api/types/advancedFilter.js.map +1 -0
  40. package/api/types/apiResult.d.ts +5 -0
  41. package/api/types/apiResult.js +2 -0
  42. package/api/types/apiResult.js.map +1 -0
  43. package/api/types/auditableEntity.d.ts +10 -0
  44. package/api/types/auditableEntity.js +2 -0
  45. package/api/types/auditableEntity.js.map +1 -0
  46. package/api/types/d2ArTypes.d.ts +5 -0
  47. package/api/types/d2ArTypes.js +2 -0
  48. package/api/types/d2ArTypes.js.map +1 -0
  49. package/api/types/d2ChartTypes.d.ts +26 -0
  50. package/api/types/d2ChartTypes.js +7 -0
  51. package/api/types/d2ChartTypes.js.map +1 -0
  52. package/api/types/dbBoolean.d.ts +5 -0
  53. package/api/types/dbBoolean.js +15 -0
  54. package/api/types/dbBoolean.js.map +1 -0
  55. package/api/types/entity.d.ts +7 -0
  56. package/api/types/entity.js +2 -0
  57. package/api/types/entity.js.map +1 -0
  58. package/api/types/entityListResult.d.ts +4 -0
  59. package/api/types/entityListResult.js +2 -0
  60. package/api/types/entityListResult.js.map +1 -0
  61. package/api/types/entityResult.d.ts +4 -0
  62. package/api/types/entityResult.js +2 -0
  63. package/api/types/entityResult.js.map +1 -0
  64. package/api/types/nounGender.d.ts +5 -0
  65. package/api/types/nounGender.js +7 -0
  66. package/api/types/nounGender.js.map +1 -0
  67. package/api/util/d2Boolean.d.ts +8 -0
  68. package/api/util/d2Boolean.js +14 -0
  69. package/api/util/d2Boolean.js.map +1 -0
  70. package/api/util/d2ChartUtils.d.ts +7 -0
  71. package/api/util/d2ChartUtils.js +62 -0
  72. package/api/util/d2ChartUtils.js.map +1 -0
  73. package/api/util/edaUtils.d.ts +5 -0
  74. package/api/util/edaUtils.js +33 -0
  75. package/api/util/edaUtils.js.map +1 -0
  76. package/api/util/fileUtils.d.ts +3 -0
  77. package/api/util/fileUtils.js +22 -0
  78. package/api/util/fileUtils.js.map +1 -0
  79. package/api/validation/abstractEntityValidationUtils.d.ts +8 -0
  80. package/api/validation/abstractEntityValidationUtils.js +24 -0
  81. package/api/validation/abstractEntityValidationUtils.js.map +1 -0
  82. package/core/types/panelConfiguration.d.ts +3 -0
  83. package/core/types/panelConfiguration.js +2 -0
  84. package/core/types/panelConfiguration.js.map +1 -0
  85. package/core/util/humanizeDuration.d.ts +1 -0
  86. package/core/util/humanizeDuration.js +24 -0
  87. package/core/util/humanizeDuration.js.map +1 -0
  88. package/core/util/isStringEmpty.d.ts +1 -0
  89. package/core/util/isStringEmpty.js +4 -0
  90. package/core/util/isStringEmpty.js.map +1 -0
  91. package/core/util/locationUtils.d.ts +10 -0
  92. package/core/util/locationUtils.js +34 -0
  93. package/core/util/locationUtils.js.map +1 -0
  94. package/coreui/abstractApp.d.ts +22 -0
  95. package/coreui/abstractApp.js +49 -0
  96. package/coreui/abstractApp.js.map +1 -0
  97. package/coreui/abstractListPanel.d.ts +88 -0
  98. package/coreui/abstractListPanel.js +426 -0
  99. package/coreui/abstractListPanel.js.map +1 -0
  100. package/coreui/abstractPage.d.ts +18 -0
  101. package/coreui/abstractPage.js +104 -0
  102. package/coreui/abstractPage.js.map +1 -0
  103. package/coreui/auth/loginForm.d.ts +27 -0
  104. package/coreui/auth/loginForm.js +47 -0
  105. package/coreui/auth/loginForm.js.map +1 -0
  106. package/coreui/auth/logoutButton.d.ts +9 -0
  107. package/coreui/auth/logoutButton.js +23 -0
  108. package/coreui/auth/logoutButton.js.map +1 -0
  109. package/coreui/components/about/aboutModalDialog.d.ts +30 -0
  110. package/coreui/components/about/aboutModalDialog.js +96 -0
  111. package/coreui/components/about/aboutModalDialog.js.map +1 -0
  112. package/coreui/components/advancedFilter/advancedFilterButton.d.ts +26 -0
  113. package/coreui/components/advancedFilter/advancedFilterButton.js +115 -0
  114. package/coreui/components/advancedFilter/advancedFilterButton.js.map +1 -0
  115. package/coreui/components/advancedFilter/advancedFilterColumnDefinitions.d.ts +18 -0
  116. package/coreui/components/advancedFilter/advancedFilterColumnDefinitions.js +39 -0
  117. package/coreui/components/advancedFilter/advancedFilterColumnDefinitions.js.map +1 -0
  118. package/coreui/components/advancedFilter/advancedFilterUtils.d.ts +12 -0
  119. package/coreui/components/advancedFilter/advancedFilterUtils.js +101 -0
  120. package/coreui/components/advancedFilter/advancedFilterUtils.js.map +1 -0
  121. package/coreui/components/advancedFilter/advancedFilterValidationUtils.d.ts +11 -0
  122. package/coreui/components/advancedFilter/advancedFilterValidationUtils.js +59 -0
  123. package/coreui/components/advancedFilter/advancedFilterValidationUtils.js.map +1 -0
  124. package/coreui/components/advancedFilter/advancedFilteredGrid.d.ts +55 -0
  125. package/coreui/components/advancedFilter/advancedFilteredGrid.js +165 -0
  126. package/coreui/components/advancedFilter/advancedFilteredGrid.js.map +1 -0
  127. package/coreui/components/advancedFilter/components/advancedFilterOperatorSelect.d.ts +14 -0
  128. package/coreui/components/advancedFilter/components/advancedFilterOperatorSelect.js +35 -0
  129. package/coreui/components/advancedFilter/components/advancedFilterOperatorSelect.js.map +1 -0
  130. package/coreui/components/advancedFilter/components/advancedFilterValueInput.d.ts +23 -0
  131. package/coreui/components/advancedFilter/components/advancedFilterValueInput.js +148 -0
  132. package/coreui/components/advancedFilter/components/advancedFilterValueInput.js.map +1 -0
  133. package/coreui/components/advancedFilter/conditionList/advancedFilterConditionDetailPanel.d.ts +18 -0
  134. package/coreui/components/advancedFilter/conditionList/advancedFilterConditionDetailPanel.js +82 -0
  135. package/coreui/components/advancedFilter/conditionList/advancedFilterConditionDetailPanel.js.map +1 -0
  136. package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListModalDialog.d.ts +23 -0
  137. package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListModalDialog.js +58 -0
  138. package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListModalDialog.js.map +1 -0
  139. package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListPanel.d.ts +31 -0
  140. package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListPanel.js +211 -0
  141. package/coreui/components/advancedFilter/conditionList/advancedFilterConditionListPanel.js.map +1 -0
  142. package/coreui/components/advancedFilter/filterList/advancedFilterListModalDialog.d.ts +15 -0
  143. package/coreui/components/advancedFilter/filterList/advancedFilterListModalDialog.js +48 -0
  144. package/coreui/components/advancedFilter/filterList/advancedFilterListModalDialog.js.map +1 -0
  145. package/coreui/components/advancedFilter/filterSave/filterSaveModalDialog.d.ts +18 -0
  146. package/coreui/components/advancedFilter/filterSave/filterSaveModalDialog.js +37 -0
  147. package/coreui/components/advancedFilter/filterSave/filterSaveModalDialog.js.map +1 -0
  148. package/coreui/components/advancedFilter/floatingColumnFilter/advancedFilterFloatingColumnComponent.d.ts +26 -0
  149. package/coreui/components/advancedFilter/floatingColumnFilter/advancedFilterFloatingColumnComponent.js +81 -0
  150. package/coreui/components/advancedFilter/floatingColumnFilter/advancedFilterFloatingColumnComponent.js.map +1 -0
  151. package/coreui/components/assignEntitiesToEntity/abstractEntitiesOnEntityList.d.ts +32 -0
  152. package/coreui/components/assignEntitiesToEntity/abstractEntitiesOnEntityList.js +102 -0
  153. package/coreui/components/assignEntitiesToEntity/abstractEntitiesOnEntityList.js.map +1 -0
  154. package/coreui/components/changePasswordModalDialog/changePasswordModalDialog.d.ts +23 -0
  155. package/coreui/components/changePasswordModalDialog/changePasswordModalDialog.js +83 -0
  156. package/coreui/components/changePasswordModalDialog/changePasswordModalDialog.js.map +1 -0
  157. package/coreui/components/colorTag/colorTag.d.ts +9 -0
  158. package/coreui/components/colorTag/colorTag.js +17 -0
  159. package/coreui/components/colorTag/colorTag.js.map +1 -0
  160. package/coreui/components/d2Chart/d2ChartOptions.d.ts +3 -0
  161. package/coreui/components/d2Chart/d2ChartOptions.js +73 -0
  162. package/coreui/components/d2Chart/d2ChartOptions.js.map +1 -0
  163. package/coreui/components/d2Chart/d2ChartPanel.d.ts +48 -0
  164. package/coreui/components/d2Chart/d2ChartPanel.js +325 -0
  165. package/coreui/components/d2Chart/d2ChartPanel.js.map +1 -0
  166. package/coreui/components/d2Chart/d2ChartTablePanel.d.ts +31 -0
  167. package/coreui/components/d2Chart/d2ChartTablePanel.js +121 -0
  168. package/coreui/components/d2Chart/d2ChartTablePanel.js.map +1 -0
  169. package/coreui/components/d2Chart/d2ChartToolboxPanel.d.ts +27 -0
  170. package/coreui/components/d2Chart/d2ChartToolboxPanel.js +116 -0
  171. package/coreui/components/d2Chart/d2ChartToolboxPanel.js.map +1 -0
  172. package/coreui/components/edaManager/abstract/edaManagerAbstractPanel.d.ts +51 -0
  173. package/coreui/components/edaManager/abstract/edaManagerAbstractPanel.js +169 -0
  174. package/coreui/components/edaManager/abstract/edaManagerAbstractPanel.js.map +1 -0
  175. package/coreui/components/edaManager/abstract/edaManagerAbstractTablePanel.d.ts +32 -0
  176. package/coreui/components/edaManager/abstract/edaManagerAbstractTablePanel.js +87 -0
  177. package/coreui/components/edaManager/abstract/edaManagerAbstractTablePanel.js.map +1 -0
  178. package/coreui/components/edaManager/abstract/edaManagerAbstractVectorList.d.ts +24 -0
  179. package/coreui/components/edaManager/abstract/edaManagerAbstractVectorList.js +98 -0
  180. package/coreui/components/edaManager/abstract/edaManagerAbstractVectorList.js.map +1 -0
  181. package/coreui/components/edaManager/compactPanel/edaManagerCompactPanel.d.ts +19 -0
  182. package/coreui/components/edaManager/compactPanel/edaManagerCompactPanel.js +52 -0
  183. package/coreui/components/edaManager/compactPanel/edaManagerCompactPanel.js.map +1 -0
  184. package/coreui/components/edaManager/compactPanel/initialLayout.d.ts +2 -0
  185. package/coreui/components/edaManager/compactPanel/initialLayout.js +26 -0
  186. package/coreui/components/edaManager/compactPanel/initialLayout.js.map +1 -0
  187. package/coreui/components/edaManager/components/detail/components/edaVectorMassChangeButton.d.ts +38 -0
  188. package/coreui/components/edaManager/components/detail/components/edaVectorMassChangeButton.js +182 -0
  189. package/coreui/components/edaManager/components/detail/components/edaVectorMassChangeButton.js.map +1 -0
  190. package/coreui/components/edaManager/components/detail/edaVectorDetailModalDialog.d.ts +23 -0
  191. package/coreui/components/edaManager/components/detail/edaVectorDetailModalDialog.js +122 -0
  192. package/coreui/components/edaManager/components/detail/edaVectorDetailModalDialog.js.map +1 -0
  193. package/coreui/components/edaManager/components/detail/edaVectorDetailTablePanel.d.ts +16 -0
  194. package/coreui/components/edaManager/components/detail/edaVectorDetailTablePanel.js +63 -0
  195. package/coreui/components/edaManager/components/detail/edaVectorDetailTablePanel.js.map +1 -0
  196. package/coreui/components/edaManager/components/detail/initialLayout.d.ts +2 -0
  197. package/coreui/components/edaManager/components/detail/initialLayout.js +29 -0
  198. package/coreui/components/edaManager/components/detail/initialLayout.js.map +1 -0
  199. package/coreui/components/edaManager/components/edaManagerTablePanel.d.ts +22 -0
  200. package/coreui/components/edaManager/components/edaManagerTablePanel.js +80 -0
  201. package/coreui/components/edaManager/components/edaManagerTablePanel.js.map +1 -0
  202. package/coreui/components/edaManager/components/edaManagerTimePanel.d.ts +22 -0
  203. package/coreui/components/edaManager/components/edaManagerTimePanel.js +38 -0
  204. package/coreui/components/edaManager/components/edaManagerTimePanel.js.map +1 -0
  205. package/coreui/components/edaManager/components/edaManagerVectorList.d.ts +11 -0
  206. package/coreui/components/edaManager/components/edaManagerVectorList.js +35 -0
  207. package/coreui/components/edaManager/components/edaManagerVectorList.js.map +1 -0
  208. package/coreui/components/edaManager/components/edaStepSelect/edaStepConstants.d.ts +0 -0
  209. package/coreui/components/edaManager/components/edaStepSelect/edaStepConstants.js +2 -0
  210. package/coreui/components/edaManager/components/edaStepSelect/edaStepConstants.js.map +1 -0
  211. package/coreui/components/edaManager/components/edaStepSelect/edaStepSelect.d.ts +13 -0
  212. package/coreui/components/edaManager/components/edaStepSelect/edaStepSelect.js +14 -0
  213. package/coreui/components/edaManager/components/edaStepSelect/edaStepSelect.js.map +1 -0
  214. package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelect.d.ts +10 -0
  215. package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelect.js +20 -0
  216. package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelect.js.map +1 -0
  217. package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelectModalDialog.d.ts +13 -0
  218. package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelectModalDialog.js +22 -0
  219. package/coreui/components/edaManager/components/edaVectorSelect/edaVectorSelectModalDialog.js.map +1 -0
  220. package/coreui/components/edaManager/constants.d.ts +2 -0
  221. package/coreui/components/edaManager/constants.js +11 -0
  222. package/coreui/components/edaManager/constants.js.map +1 -0
  223. package/coreui/components/edaManager/panel/edaManagerPanel.d.ts +13 -0
  224. package/coreui/components/edaManager/panel/edaManagerPanel.js +32 -0
  225. package/coreui/components/edaManager/panel/edaManagerPanel.js.map +1 -0
  226. package/coreui/components/edaManager/panel/initialLayout.d.ts +2 -0
  227. package/coreui/components/edaManager/panel/initialLayout.js +39 -0
  228. package/coreui/components/edaManager/panel/initialLayout.js.map +1 -0
  229. package/coreui/components/editor/abstractEntityConfigPanel.d.ts +82 -0
  230. package/coreui/components/editor/abstractEntityConfigPanel.js +307 -0
  231. package/coreui/components/editor/abstractEntityConfigPanel.js.map +1 -0
  232. package/coreui/components/filePicker/filePicker.d.ts +20 -0
  233. package/coreui/components/filePicker/filePicker.js +57 -0
  234. package/coreui/components/filePicker/filePicker.js.map +1 -0
  235. package/coreui/components/grid/auditEntityRowStyleRules.d.ts +3 -0
  236. package/coreui/components/grid/auditEntityRowStyleRules.js +34 -0
  237. package/coreui/components/grid/auditEntityRowStyleRules.js.map +1 -0
  238. package/coreui/components/grid/detailHeaderPanel.d.ts +13 -0
  239. package/coreui/components/grid/detailHeaderPanel.js +29 -0
  240. package/coreui/components/grid/detailHeaderPanel.js.map +1 -0
  241. package/coreui/components/grid/standardColumns.d.ts +14 -0
  242. package/coreui/components/grid/standardColumns.js +150 -0
  243. package/coreui/components/grid/standardColumns.js.map +1 -0
  244. package/coreui/components/history/entityHistoryListPanel.d.ts +38 -0
  245. package/coreui/components/history/entityHistoryListPanel.js +154 -0
  246. package/coreui/components/history/entityHistoryListPanel.js.map +1 -0
  247. package/coreui/components/languageSelect/languageSelect.d.ts +17 -0
  248. package/coreui/components/languageSelect/languageSelect.js +28 -0
  249. package/coreui/components/languageSelect/languageSelect.js.map +1 -0
  250. package/coreui/components/modalWithIcon/openModalWithIcon.d.ts +8 -0
  251. package/coreui/components/modalWithIcon/openModalWithIcon.js +30 -0
  252. package/coreui/components/modalWithIcon/openModalWithIcon.js.map +1 -0
  253. package/coreui/components/select/abstractSelect.d.ts +57 -0
  254. package/coreui/components/select/abstractSelect.js +233 -0
  255. package/coreui/components/select/abstractSelect.js.map +1 -0
  256. package/coreui/components/select/abstractSelectModalDialog.d.ts +33 -0
  257. package/coreui/components/select/abstractSelectModalDialog.js +110 -0
  258. package/coreui/components/select/abstractSelectModalDialog.js.map +1 -0
  259. package/coreui/components/select/selectUtils.d.ts +4 -0
  260. package/coreui/components/select/selectUtils.js +14 -0
  261. package/coreui/components/select/selectUtils.js.map +1 -0
  262. package/coreui/components/titleWithCodePanel/titleWithCodePanel.d.ts +10 -0
  263. package/coreui/components/titleWithCodePanel/titleWithCodePanel.js +20 -0
  264. package/coreui/components/titleWithCodePanel/titleWithCodePanel.js.map +1 -0
  265. package/coreui/icons/icons.d.ts +3 -0
  266. package/coreui/icons/icons.js +18 -0
  267. package/coreui/icons/icons.js.map +1 -0
  268. package/coreui/layout/contextToolbar.d.ts +15 -0
  269. package/coreui/layout/contextToolbar.js +41 -0
  270. package/coreui/layout/contextToolbar.js.map +1 -0
  271. package/coreui/style/index.less +165 -0
  272. package/coreui/style/login.css +214 -0
  273. package/package.json +65 -0
  274. 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}"]}