@sankhyalabs/core 0.0.0-bugfix-dev-KB-6165.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 (283) hide show
  1. package/.docs/.nojekyll +1 -0
  2. package/.docs/README.md +63 -0
  3. package/.docs/classes/ApplicationContext.md +90 -0
  4. package/.docs/classes/ArrayUtils.md +99 -0
  5. package/.docs/classes/AuthorizedServiceCaller.md +76 -0
  6. package/.docs/classes/Change.md +190 -0
  7. package/.docs/classes/DataUnit.md +2453 -0
  8. package/.docs/classes/DataUnitAction.md +96 -0
  9. package/.docs/classes/DataUnitStorage.md +116 -0
  10. package/.docs/classes/DateUtils.md +327 -0
  11. package/.docs/classes/ElementIDUtils.md +308 -0
  12. package/.docs/classes/ErrorException.md +214 -0
  13. package/.docs/classes/ErrorTracking.md +62 -0
  14. package/.docs/classes/FloatingManager.md +530 -0
  15. package/.docs/classes/HTMLBuilder.md +45 -0
  16. package/.docs/classes/HttpProvider.md +96 -0
  17. package/.docs/classes/JSUtils.md +115 -0
  18. package/.docs/classes/MaskFormatter-1.md +347 -0
  19. package/.docs/classes/NumberUtils.md +335 -0
  20. package/.docs/classes/ObjectUtils.md +160 -0
  21. package/.docs/classes/OnboardingUtils.md +126 -0
  22. package/.docs/classes/PromiseSync.md +91 -0
  23. package/.docs/classes/ReadyUtil.md +115 -0
  24. package/.docs/classes/RequestMetadata.md +84 -0
  25. package/.docs/classes/SelectionInfo.md +168 -0
  26. package/.docs/classes/SkwHttpProvider.md +109 -0
  27. package/.docs/classes/StringUtils.md +562 -0
  28. package/.docs/classes/TimeFormatter.md +98 -0
  29. package/.docs/classes/UserAgentUtils.md +58 -0
  30. package/.docs/classes/VersionUtils.md +42 -0
  31. package/.docs/classes/WaitingChangeException.md +200 -0
  32. package/.docs/classes/WarningException.md +214 -0
  33. package/.docs/enums/Action.md +294 -0
  34. package/.docs/enums/ChangeOperation.md +52 -0
  35. package/.docs/enums/DataType.md +63 -0
  36. package/.docs/enums/DependencyType.md +41 -0
  37. package/.docs/enums/SelectionMode.md +30 -0
  38. package/.docs/enums/SortMode.md +30 -0
  39. package/.docs/enums/UserInterface.md +195 -0
  40. package/.docs/interfaces/ChildDescriptor.md +41 -0
  41. package/.docs/interfaces/ChildLink.md +30 -0
  42. package/.docs/interfaces/DUActionInterceptor.md +29 -0
  43. package/.docs/interfaces/ExecutionContext.md +58 -0
  44. package/.docs/interfaces/FieldDescriptor.md +140 -0
  45. package/.docs/interfaces/Filter.md +41 -0
  46. package/.docs/interfaces/IElementIDInfo.md +30 -0
  47. package/.docs/interfaces/LoadDataRequest.md +101 -0
  48. package/.docs/interfaces/LoadDataResponse.md +36 -0
  49. package/.docs/interfaces/PageRequest.md +41 -0
  50. package/.docs/interfaces/PaginationInfo.md +75 -0
  51. package/.docs/interfaces/PromiseSyncCallback.md +39 -0
  52. package/.docs/interfaces/QuickFilter.md +41 -0
  53. package/.docs/interfaces/Record.md +62 -0
  54. package/.docs/interfaces/SavedRecord.md +85 -0
  55. package/.docs/interfaces/Sort.md +41 -0
  56. package/.docs/interfaces/SortingProvider.md +29 -0
  57. package/.docs/interfaces/UnitMetadata.md +52 -0
  58. package/.docs/interfaces/WaitingChange.md +41 -0
  59. package/.docs/modules/MaskFormatter.md +37 -0
  60. package/.docs/modules.md +74 -0
  61. package/.docs/package.json +15 -0
  62. package/.eslintignore +2 -0
  63. package/.eslintrc.cjs +35 -0
  64. package/.husky/commit-msg +4 -0
  65. package/.releaserc +58 -0
  66. package/README.md +62 -0
  67. package/commitlint.config.cjs +14 -0
  68. package/dist/async/PromiseSync.d.ts +29 -0
  69. package/dist/async/PromiseSync.js +31 -0
  70. package/dist/async/PromiseSync.js.map +1 -0
  71. package/dist/dataunit/DataUnit.d.ts +924 -0
  72. package/dist/dataunit/DataUnit.js +1621 -0
  73. package/dist/dataunit/DataUnit.js.map +1 -0
  74. package/dist/dataunit/DataUnitStorage.d.ts +24 -0
  75. package/dist/dataunit/DataUnitStorage.js +39 -0
  76. package/dist/dataunit/DataUnitStorage.js.map +1 -0
  77. package/dist/dataunit/formatting/PrettyFormatter.d.ts +2 -0
  78. package/dist/dataunit/formatting/PrettyFormatter.js +94 -0
  79. package/dist/dataunit/formatting/PrettyFormatter.js.map +1 -0
  80. package/dist/dataunit/loading/LoadDataRequest.d.ts +19 -0
  81. package/dist/dataunit/loading/LoadDataRequest.js +2 -0
  82. package/dist/dataunit/loading/LoadDataRequest.js.map +1 -0
  83. package/dist/dataunit/loading/LoadDataResponse.d.ts +9 -0
  84. package/dist/dataunit/loading/LoadDataResponse.js +2 -0
  85. package/dist/dataunit/loading/LoadDataResponse.js.map +1 -0
  86. package/dist/dataunit/loading/PaginationInfo.d.ts +13 -0
  87. package/dist/dataunit/loading/PaginationInfo.js +2 -0
  88. package/dist/dataunit/loading/PaginationInfo.js.map +1 -0
  89. package/dist/dataunit/metadata/DataType.d.ts +54 -0
  90. package/dist/dataunit/metadata/DataType.js +124 -0
  91. package/dist/dataunit/metadata/DataType.js.map +1 -0
  92. package/dist/dataunit/metadata/UnitMetadata.d.ts +88 -0
  93. package/dist/dataunit/metadata/UnitMetadata.js +36 -0
  94. package/dist/dataunit/metadata/UnitMetadata.js.map +1 -0
  95. package/dist/dataunit/state/HistReducer.d.ts +10 -0
  96. package/dist/dataunit/state/HistReducer.js +28 -0
  97. package/dist/dataunit/state/HistReducer.js.map +1 -0
  98. package/dist/dataunit/state/StateManager.d.ts +57 -0
  99. package/dist/dataunit/state/StateManager.js +97 -0
  100. package/dist/dataunit/state/StateManager.js.map +1 -0
  101. package/dist/dataunit/state/action/DataUnitAction.d.ts +40 -0
  102. package/dist/dataunit/state/action/DataUnitAction.js +42 -0
  103. package/dist/dataunit/state/action/DataUnitAction.js.map +1 -0
  104. package/dist/dataunit/state/slice/AddedRecordsSlice.d.ts +12 -0
  105. package/dist/dataunit/state/slice/AddedRecordsSlice.js +30 -0
  106. package/dist/dataunit/state/slice/AddedRecordsSlice.js.map +1 -0
  107. package/dist/dataunit/state/slice/ChangesSlice.d.ts +13 -0
  108. package/dist/dataunit/state/slice/ChangesSlice.js +105 -0
  109. package/dist/dataunit/state/slice/ChangesSlice.js.map +1 -0
  110. package/dist/dataunit/state/slice/InvalidFieldsSlice.d.ts +10 -0
  111. package/dist/dataunit/state/slice/InvalidFieldsSlice.js +66 -0
  112. package/dist/dataunit/state/slice/InvalidFieldsSlice.js.map +1 -0
  113. package/dist/dataunit/state/slice/LoadingControlSlice.d.ts +19 -0
  114. package/dist/dataunit/state/slice/LoadingControlSlice.js +45 -0
  115. package/dist/dataunit/state/slice/LoadingControlSlice.js.map +1 -0
  116. package/dist/dataunit/state/slice/RecordsSlice.d.ts +11 -0
  117. package/dist/dataunit/state/slice/RecordsSlice.js +62 -0
  118. package/dist/dataunit/state/slice/RecordsSlice.js.map +1 -0
  119. package/dist/dataunit/state/slice/RemovedRecordsSlice.d.ts +9 -0
  120. package/dist/dataunit/state/slice/RemovedRecordsSlice.js +25 -0
  121. package/dist/dataunit/state/slice/RemovedRecordsSlice.js.map +1 -0
  122. package/dist/dataunit/state/slice/SelectionSlice.d.ts +19 -0
  123. package/dist/dataunit/state/slice/SelectionSlice.js +155 -0
  124. package/dist/dataunit/state/slice/SelectionSlice.js.map +1 -0
  125. package/dist/dataunit/state/slice/SnapshotSlice.d.ts +19 -0
  126. package/dist/dataunit/state/slice/SnapshotSlice.js +106 -0
  127. package/dist/dataunit/state/slice/SnapshotSlice.js.map +1 -0
  128. package/dist/dataunit/state/slice/UnitMetadataSlice.d.ts +11 -0
  129. package/dist/dataunit/state/slice/UnitMetadataSlice.js +21 -0
  130. package/dist/dataunit/state/slice/UnitMetadataSlice.js.map +1 -0
  131. package/dist/dataunit/state/slice/WaitingChangesSlice.d.ts +12 -0
  132. package/dist/dataunit/state/slice/WaitingChangesSlice.js +56 -0
  133. package/dist/dataunit/state/slice/WaitingChangesSlice.js.map +1 -0
  134. package/dist/exceptions/ErrorException.d.ts +14 -0
  135. package/dist/exceptions/ErrorException.js +13 -0
  136. package/dist/exceptions/ErrorException.js.map +1 -0
  137. package/dist/exceptions/WaitingChangeException.d.ts +12 -0
  138. package/dist/exceptions/WaitingChangeException.js +12 -0
  139. package/dist/exceptions/WaitingChangeException.js.map +1 -0
  140. package/dist/exceptions/WarningException.d.ts +14 -0
  141. package/dist/exceptions/WarningException.js +13 -0
  142. package/dist/exceptions/WarningException.js.map +1 -0
  143. package/dist/html/HTMLBuilder.d.ts +3 -0
  144. package/dist/html/HTMLBuilder.js +9 -0
  145. package/dist/html/HTMLBuilder.js.map +1 -0
  146. package/dist/http/AuthorizedServiceCaller.d.ts +11 -0
  147. package/dist/http/AuthorizedServiceCaller.js +54 -0
  148. package/dist/http/AuthorizedServiceCaller.js.map +1 -0
  149. package/dist/http/HttpProvider.d.ts +25 -0
  150. package/dist/http/HttpProvider.js +74 -0
  151. package/dist/http/HttpProvider.js.map +1 -0
  152. package/dist/http/RequestMetadata.d.ts +30 -0
  153. package/dist/http/RequestMetadata.js +25 -0
  154. package/dist/http/RequestMetadata.js.map +1 -0
  155. package/dist/http/SkwHttpProvider.d.ts +9 -0
  156. package/dist/http/SkwHttpProvider.js +67 -0
  157. package/dist/http/SkwHttpProvider.js.map +1 -0
  158. package/dist/index.d.ts +34 -0
  159. package/dist/index.js +33 -0
  160. package/dist/index.js.map +1 -0
  161. package/dist/traking/ErrorTraking.d.ts +19 -0
  162. package/dist/traking/ErrorTraking.js +34 -0
  163. package/dist/traking/ErrorTraking.js.map +1 -0
  164. package/dist/ui/FloatingManager.d.ts +164 -0
  165. package/dist/ui/FloatingManager.js +358 -0
  166. package/dist/ui/FloatingManager.js.map +1 -0
  167. package/dist/utils/ApplicationContext.d.ts +26 -0
  168. package/dist/utils/ApplicationContext.js +38 -0
  169. package/dist/utils/ApplicationContext.js.map +1 -0
  170. package/dist/utils/ArrayUtils.d.ts +29 -0
  171. package/dist/utils/ArrayUtils.js +57 -0
  172. package/dist/utils/ArrayUtils.js.map +1 -0
  173. package/dist/utils/CriteriaModel.d.ts +107 -0
  174. package/dist/utils/CriteriaModel.js +172 -0
  175. package/dist/utils/CriteriaModel.js.map +1 -0
  176. package/dist/utils/CriteriaParameter.d.ts +69 -0
  177. package/dist/utils/CriteriaParameter.js +83 -0
  178. package/dist/utils/CriteriaParameter.js.map +1 -0
  179. package/dist/utils/DateUtils.d.ts +97 -0
  180. package/dist/utils/DateUtils.js +171 -0
  181. package/dist/utils/DateUtils.js.map +1 -0
  182. package/dist/utils/ElementIDUtils.d.ts +72 -0
  183. package/dist/utils/ElementIDUtils.js +161 -0
  184. package/dist/utils/ElementIDUtils.js.map +1 -0
  185. package/dist/utils/JSUtils.d.ts +36 -0
  186. package/dist/utils/JSUtils.js +66 -0
  187. package/dist/utils/JSUtils.js.map +1 -0
  188. package/dist/utils/MaskFormatter.d.ts +148 -0
  189. package/dist/utils/MaskFormatter.js +356 -0
  190. package/dist/utils/MaskFormatter.js.map +1 -0
  191. package/dist/utils/NumberUtils.d.ts +127 -0
  192. package/dist/utils/NumberUtils.js +245 -0
  193. package/dist/utils/NumberUtils.js.map +1 -0
  194. package/dist/utils/ObjectUtils.d.ts +47 -0
  195. package/dist/utils/ObjectUtils.js +68 -0
  196. package/dist/utils/ObjectUtils.js.map +1 -0
  197. package/dist/utils/OnboardingUtils.d.ts +17 -0
  198. package/dist/utils/OnboardingUtils.js +41 -0
  199. package/dist/utils/OnboardingUtils.js.map +1 -0
  200. package/dist/utils/ReadyUtil.d.ts +24 -0
  201. package/dist/utils/ReadyUtil.js +41 -0
  202. package/dist/utils/ReadyUtil.js.map +1 -0
  203. package/dist/utils/StringUtils.d.ts +167 -0
  204. package/dist/utils/StringUtils.js +328 -0
  205. package/dist/utils/StringUtils.js.map +1 -0
  206. package/dist/utils/TimeFormatter.d.ts +33 -0
  207. package/dist/utils/TimeFormatter.js +98 -0
  208. package/dist/utils/TimeFormatter.js.map +1 -0
  209. package/dist/utils/UserAgentUtils/index.d.ts +15 -0
  210. package/dist/utils/UserAgentUtils/index.js +48 -0
  211. package/dist/utils/UserAgentUtils/index.js.map +1 -0
  212. package/dist/utils/UserAgentUtils/navigatorAgentList.d.ts +17 -0
  213. package/dist/utils/UserAgentUtils/navigatorAgentList.js +40 -0
  214. package/dist/utils/UserAgentUtils/navigatorAgentList.js.map +1 -0
  215. package/dist/utils/VersionUtils.d.ts +7 -0
  216. package/dist/utils/VersionUtils.js +31 -0
  217. package/dist/utils/VersionUtils.js.map +1 -0
  218. package/jest.config.ts +17 -0
  219. package/mock/http/XMLHttpRequest-mock.js +26 -0
  220. package/package.json +52 -0
  221. package/scripts/runlink.bat +1 -0
  222. package/scripts/runlink.sh +1 -0
  223. package/src/async/PromiseSync.ts +49 -0
  224. package/src/dataunit/DataUnit.ts +1835 -0
  225. package/src/dataunit/DataUnitStorage.ts +43 -0
  226. package/src/dataunit/formatting/PrettyFormatter.ts +113 -0
  227. package/src/dataunit/loading/LoadDataRequest.ts +26 -0
  228. package/src/dataunit/loading/LoadDataResponse.ts +11 -0
  229. package/src/dataunit/loading/PaginationInfo.ts +18 -0
  230. package/src/dataunit/metadata/DataType.ts +127 -0
  231. package/src/dataunit/metadata/UnitMetadata.ts +102 -0
  232. package/src/dataunit/state/HistReducer.ts +34 -0
  233. package/src/dataunit/state/StateManager.ts +142 -0
  234. package/src/dataunit/state/action/DataUnitAction.ts +67 -0
  235. package/src/dataunit/state/slice/AddedRecordsSlice.ts +48 -0
  236. package/src/dataunit/state/slice/ChangesSlice.ts +125 -0
  237. package/src/dataunit/state/slice/InvalidFieldsSlice.ts +85 -0
  238. package/src/dataunit/state/slice/LoadingControlSlice.ts +60 -0
  239. package/src/dataunit/state/slice/RecordsSlice.ts +74 -0
  240. package/src/dataunit/state/slice/RemovedRecordsSlice.ts +30 -0
  241. package/src/dataunit/state/slice/SelectionSlice.ts +193 -0
  242. package/src/dataunit/state/slice/SnapshotSlice.ts +139 -0
  243. package/src/dataunit/state/slice/UnitMetadataSlice.ts +30 -0
  244. package/src/dataunit/state/slice/WaitingChangesSlice.ts +74 -0
  245. package/src/exceptions/ErrorException.ts +25 -0
  246. package/src/exceptions/WaitingChangeException.ts +21 -0
  247. package/src/exceptions/WarningException.ts +26 -0
  248. package/src/html/HTMLBuilder.ts +8 -0
  249. package/src/http/AuthorizedServiceCaller.ts +58 -0
  250. package/src/http/HttpProvider.ts +94 -0
  251. package/src/http/RequestMetadata.ts +42 -0
  252. package/src/http/SkwHttpProvider.ts +78 -0
  253. package/src/index.ts +93 -0
  254. package/src/traking/ErrorTraking.ts +37 -0
  255. package/src/ui/FloatingManager.ts +417 -0
  256. package/src/utils/ApplicationContext.ts +42 -0
  257. package/src/utils/ArrayUtils.ts +61 -0
  258. package/src/utils/CriteriaModel.ts +205 -0
  259. package/src/utils/CriteriaParameter.ts +108 -0
  260. package/src/utils/DateUtils.ts +195 -0
  261. package/src/utils/ElementIDUtils.ts +184 -0
  262. package/src/utils/JSUtils.ts +69 -0
  263. package/src/utils/MaskFormatter.ts +407 -0
  264. package/src/utils/NumberUtils.ts +283 -0
  265. package/src/utils/ObjectUtils.ts +76 -0
  266. package/src/utils/OnboardingUtils.ts +46 -0
  267. package/src/utils/ReadyUtil.ts +45 -0
  268. package/src/utils/StringUtils.ts +359 -0
  269. package/src/utils/TimeFormatter.ts +98 -0
  270. package/src/utils/UserAgentUtils/index.ts +62 -0
  271. package/src/utils/UserAgentUtils/navigatorAgentList.ts +39 -0
  272. package/src/utils/VersionUtils.ts +37 -0
  273. package/test/http/HttpProvider.spec.ts +35 -0
  274. package/test/http/SkwHttpProvider.ts.spec.ts +34 -0
  275. package/test/util/CriteriaModel.spec.ts +232 -0
  276. package/test/util/CriteriaParameter.spec.ts +52 -0
  277. package/test/util/DataUnitStorage.spec.ts +63 -0
  278. package/test/util/ElementIDUtils.spec.ts +272 -0
  279. package/test/util/MaskFormatter.spec.ts +138 -0
  280. package/test/util/NumberUtils.spec.ts +182 -0
  281. package/test/util/StringUtils.spec.ts +51 -0
  282. package/test/util/TimeFormatter.spec.ts +26 -0
  283. package/tsconfig.json +16 -0
@@ -0,0 +1,48 @@
1
+
2
+ import { ActionReducer, StateAction } from "../StateManager.js";
3
+ import { Action } from "../action/DataUnitAction.js";
4
+ import StateManager from "../StateManager.js";
5
+ import { Record } from "../../DataUnit.js";
6
+
7
+ class AddedRecordsReducerImpl implements ActionReducer{
8
+
9
+ public sliceName: string = "hist::addedRecords";
10
+
11
+ public reduce(_stateManager:StateManager, currentState: Array<Record>, action: StateAction): Array<Record>|undefined {
12
+ switch(action.type){
13
+ case Action.RECORDS_ADDED:
14
+ case Action.RECORDS_COPIED:
15
+ return (currentState||[]).concat(action.payload);
16
+ case Action.DATA_SAVED:
17
+ case Action.EDITION_CANCELED:
18
+ return undefined;
19
+ }
20
+ return currentState;
21
+ }
22
+ }
23
+
24
+ export const AddedRecordsReducer = new AddedRecordsReducerImpl();
25
+
26
+ export const getAddedRecords = (stateManager: StateManager): Array<Record> => {
27
+ return stateManager.select(AddedRecordsReducer.sliceName, (state: Array<Record>) => state);
28
+ };
29
+
30
+ export const prepareAddedRecordId = (stateManager: StateManager, source: Array<any>, parentRecordId?: string): Array<Record> => {
31
+ let index = (getAddedRecords(stateManager) || []).length;
32
+ return source.map(item => ({
33
+ ...item,
34
+ __record__id__: `NEW_${index++}`,
35
+ ...(parentRecordId && { __parent__record__id__: parentRecordId }),
36
+ }));
37
+ };
38
+
39
+ export const prepareCopiedRecord = (stateManager: StateManager, source: Array<Record>, parentRecordId?: string): Array<Record> => {
40
+ let index = (getAddedRecords(stateManager)||[]).length;
41
+ return source.map(item => ({
42
+ ...item,
43
+ __record__id__: "NEW_" + (index++),
44
+ ...(parentRecordId && { __parent__record__id__: parentRecordId }),
45
+ __record__source__id__: item.__record__id__,
46
+ __copy__: true})
47
+ );
48
+ };
@@ -0,0 +1,125 @@
1
+
2
+ import { ActionReducer, StateAction } from "../StateManager.js";
3
+ import { Action } from "../action/DataUnitAction.js";
4
+ import StateManager from "../StateManager.js";
5
+ import { getRecords } from "./RecordsSlice.js";
6
+ import { getRemovedRecords } from "./RemovedRecordsSlice.js";
7
+ import { getAddedRecords } from "./AddedRecordsSlice.js";
8
+ import { Change, ChangeOperation, Record } from "../../DataUnit.js";
9
+ import { getWaitingChanges } from "./WaitingChangesSlice.js";
10
+ import { getSelectionRecords } from './SnapshotSlice.js';
11
+
12
+ class ChangesReducerImpl implements ActionReducer{
13
+
14
+ public sliceName: string = "hist::changes";
15
+
16
+ public reduce(stateManager:StateManager, currentState: Map<string, any>, action: StateAction): Map<string, any>|undefined {
17
+ switch(action.type){
18
+ case Action.RECORDS_COPIED:
19
+ const records: Array<Record> = action.payload;
20
+ const changes = new Map(getChanges(stateManager));
21
+ records.forEach(
22
+ r => {
23
+ const rChanges = {...changes.get(r.__record__id__), ...r};
24
+ delete rChanges.__old__id__;
25
+ delete rChanges.__record__id__;
26
+ delete rChanges.__parent__record__id__;
27
+ delete rChanges.__record__source__id__;
28
+ delete rChanges.__record__label__;
29
+ delete rChanges.__copy__;
30
+ delete rChanges.__owner__dataunit__name__;
31
+ changes.set(r.__record__id__, rChanges);
32
+ }
33
+ );
34
+ return changes;
35
+ case Action.DATA_CHANGED:
36
+ const selection: Array<string> = action.payload.records || getSelectionRecords(stateManager)?.map(record => record.__record__id__);
37
+ if(selection){
38
+ const newState = new Map(currentState);
39
+ selection.forEach(recordId => {
40
+ const newChanges = {...newState.get(recordId), ...action.payload};
41
+ delete newChanges.records;
42
+ newState.set(recordId, newChanges);
43
+ });
44
+ return newState;
45
+ }
46
+ return currentState;
47
+
48
+ case Action.DATA_SAVED:
49
+ case Action.EDITION_CANCELED:
50
+ return undefined;
51
+ }
52
+ return currentState;
53
+ }
54
+
55
+ }
56
+
57
+ export const ChangesReducer = new ChangesReducerImpl();
58
+
59
+ export const getChanges = (stateManager: StateManager): Map<string, any> => {
60
+ return stateManager.select(ChangesReducer.sliceName, (state: Map<string, any>) => state);
61
+ }
62
+
63
+ export const isDirty = (stateManager: StateManager): boolean => {
64
+
65
+ if (getAddedRecords(stateManager) !== undefined) {
66
+ return true;
67
+ }
68
+
69
+ if (getRemovedRecords(stateManager) !== undefined) {
70
+ return true;
71
+ }
72
+
73
+ return hasDirtyRecords(stateManager);
74
+ }
75
+
76
+ export const hasDirtyRecords = (stateManager: StateManager): boolean => {
77
+ if(getWaitingChanges(stateManager) !== undefined){
78
+ return true;
79
+ }
80
+
81
+ return getChanges(stateManager) !== undefined;
82
+ }
83
+
84
+ export const getChangesToSave = (dataUnit: string, stateManager: StateManager): Array<Change> => {
85
+ const result: Array<Change> = [];
86
+
87
+ const changes = getChanges(stateManager);
88
+ const records = getSelectionRecords(stateManager);
89
+
90
+ records?.forEach(r => {
91
+ if(changes){
92
+ const c = changes.get(r.__record__id__);
93
+ if (c) {
94
+ result.push(new Change(dataUnit, r, c, ChangeOperation.UPDATE, r.__record__source__id__));
95
+ }
96
+ }
97
+ });
98
+
99
+ const addedRecords = getAddedRecords(stateManager);
100
+ if (addedRecords) {
101
+ addedRecords.forEach(r => {
102
+ const operation: ChangeOperation = r.__copy__ ? ChangeOperation.COPY : ChangeOperation.INSERT;
103
+ const changedFields = {...changes?.get(r.__record__id__)};
104
+ if(operation === ChangeOperation.INSERT){
105
+ Object.keys(r).forEach(fieldName => {
106
+ if(!fieldName.startsWith("__") && !Object.keys(changedFields)?.includes(fieldName)){
107
+ changedFields[fieldName] = r[fieldName];
108
+ }
109
+ });
110
+ }
111
+ result.push(new Change(dataUnit, r, changedFields, operation, r.__record__source__id__));
112
+ });
113
+ }
114
+
115
+ const removedRecords = getRemovedRecords(stateManager);
116
+ const recordsById: any = {};
117
+ records?.forEach(r=>recordsById[r.__record__id__] = r);
118
+ if (removedRecords) {
119
+ removedRecords.forEach(id => {
120
+ result.push(new Change(dataUnit, recordsById[id], undefined, ChangeOperation.DELETE));
121
+ });
122
+ }
123
+
124
+ return result;
125
+ }
@@ -0,0 +1,85 @@
1
+
2
+ import { ActionReducer, StateAction } from "../StateManager.js";
3
+ import { UnitMetadata, FieldDescriptor } from "../../metadata/UnitMetadata.js";
4
+ import { Action } from "../action/DataUnitAction.js";
5
+ import StateManager from "../StateManager.js";
6
+
7
+
8
+ class InvalidFieldsReducerImpl implements ActionReducer{
9
+
10
+ public sliceName: string = "hist::invalidFields";
11
+
12
+ public reduce(_stateManager:StateManager, currentState: Map<string, Map<string, string>>, action: StateAction): Map<string, Map<string, string>>|undefined {
13
+
14
+ switch(action.type){
15
+ case Action.FIELD_INVALIDATED:
16
+ return makeInvalid(currentState, action.payload);
17
+ case Action.INVALIDATE_CLEAN:
18
+ return clearRecord(currentState, action.payload);
19
+ }
20
+
21
+ return currentState;
22
+ }
23
+ }
24
+
25
+ export const InvalidFieldsReducer = new InvalidFieldsReducerImpl();
26
+
27
+ export const getInvalidFields = (stateManager: StateManager): Map<string, Map<string, string>> => {
28
+ return stateManager.select(InvalidFieldsReducer.sliceName, (state: Map<string, Map<string, string>>) => state);
29
+ };
30
+
31
+ export const getInvalidFieldMessage = (stateManager: StateManager, fieldName: string, recordId: string): string | undefined => {
32
+ const invalidFields = getInvalidFields(stateManager);
33
+ if(invalidFields){
34
+ const recordInvalidFields = invalidFields.get(recordId);
35
+ if(recordInvalidFields){
36
+ return recordInvalidFields.get(fieldName);
37
+ }
38
+ }
39
+ return undefined;
40
+ }
41
+
42
+ const clearRecord = (currentState:Map<string, Map<string, string>>, payload: any): Map<string, Map<string, string>>|undefined => {
43
+
44
+ const {recordId, fieldName} = payload;
45
+
46
+ if(recordId == undefined){
47
+ return undefined;
48
+ }
49
+
50
+ if(currentState){
51
+ const recordInvalidFields = currentState.get(recordId);
52
+ if(recordInvalidFields){
53
+ const newState: Map<string, Map<string, string>> = new Map(currentState);
54
+ if(fieldName == undefined){
55
+ newState.delete(recordId);
56
+ } else {
57
+ const newRecorcInvalidFields: Map<string, string> = new Map(recordInvalidFields);
58
+ newRecorcInvalidFields.delete(fieldName);
59
+ if(newRecorcInvalidFields.size > 0){
60
+ newState.set(recordId, newRecorcInvalidFields);
61
+ } else {
62
+ newState.delete(recordId);
63
+ }
64
+ return newState;
65
+ }
66
+ }
67
+
68
+ return currentState;
69
+ }
70
+
71
+ return undefined;
72
+ }
73
+
74
+ const makeInvalid = (currentState:Map<string, Map<string, string>>, payload: any): Map<string, Map<string, string>>|undefined => {
75
+
76
+ const {recordId, message, fieldName} = payload;
77
+
78
+ const recordInvalidFields = new Map(currentState?.get(recordId));
79
+ recordInvalidFields.set(fieldName, message);
80
+
81
+ const newState = new Map(currentState);
82
+ newState.set(recordId, recordInvalidFields);
83
+
84
+ return newState;
85
+ }
@@ -0,0 +1,60 @@
1
+
2
+ import { LoadDataRequest } from "../../loading/LoadDataRequest.js";
3
+ import { PaginationInfo } from "../../loading/PaginationInfo.js";
4
+ import { Action } from "../action/DataUnitAction.js";
5
+ import StateManager, { ActionReducer, StateAction } from "../StateManager.js";
6
+
7
+ class LoadingControlReducerImpl implements ActionReducer {
8
+
9
+ public sliceName: string = "loadingControl";
10
+
11
+ public reduce(stateManager: StateManager, currentState: LoadingControlState, action: StateAction): LoadingControlState {
12
+ switch (action.type) {
13
+ case Action.LOADING_DATA :
14
+ return {...currentState, lastRequest: action.payload};
15
+ case Action.DATA_LOADED:
16
+ return {...currentState, paginationInfo: action.payload?.paginationInfo};
17
+ }
18
+ return currentState;
19
+ }
20
+ }
21
+
22
+ export const LoadingControlReducer = new LoadingControlReducerImpl();
23
+
24
+ export const getPaginationInfo = (stateManager: StateManager): PaginationInfo|undefined => {
25
+ const state: LoadingControlState = stateManager.select(LoadingControlReducer.sliceName, (state: LoadingControlState) => state);
26
+ return state ? state.paginationInfo : undefined;
27
+ };
28
+
29
+ export const getCurrentRequest = (stateManager: StateManager): LoadDataRequest|undefined => {
30
+ const state: LoadingControlState = stateManager.select(LoadingControlReducer.sliceName, (state: LoadingControlState) => state);
31
+ return state ? state.lastRequest : undefined;
32
+ };
33
+
34
+ export const getCurrentPage = (stateManager: StateManager): number => {
35
+ const paginationInfo = getPaginationInfo(stateManager);
36
+ return paginationInfo ? paginationInfo.currentPage : 0;
37
+ };
38
+
39
+ export const getLastPage = (stateManager: StateManager, pageSize: number): number => {
40
+ const paginationInfo = getPaginationInfo(stateManager);
41
+ return paginationInfo ? Math.ceil(paginationInfo.total / pageSize) : 0;
42
+ };
43
+
44
+ export const hasMorePages = (stateManager: StateManager): boolean => {
45
+ const paginationInfo = getPaginationInfo(stateManager);
46
+ if(paginationInfo && paginationInfo.hasMore){
47
+ return true;
48
+ }
49
+ return false;
50
+ }
51
+
52
+ export const hasPreviousPages = (stateManager: StateManager): boolean => {
53
+ const paginationInfo = getPaginationInfo(stateManager);
54
+ return paginationInfo ? paginationInfo.currentPage > 0 : false;
55
+ }
56
+
57
+ interface LoadingControlState{
58
+ lastRequest: LoadDataRequest;
59
+ paginationInfo: PaginationInfo;
60
+ }
@@ -0,0 +1,74 @@
1
+ import { ActionReducer, StateAction } from "../StateManager.js";
2
+ import StateManager from "../StateManager.js";
3
+ import { getRemovedRecords } from "./RemovedRecordsSlice.js";
4
+ import { Action } from "../action/DataUnitAction.js";
5
+ import { Record, SavedRecord } from "../../DataUnit.js";
6
+
7
+ class RecordsReducerImpl implements ActionReducer {
8
+
9
+ public sliceName: string = "records";
10
+
11
+ public reduce(stateManager: StateManager, currentState: Array<Record>, action: StateAction): Array<Record> {
12
+ switch (action.type) {
13
+
14
+ case Action.DATA_LOADED:
15
+ return action.payload ? action.payload.records : undefined;
16
+ case Action.RECORDS_REMOVED:
17
+
18
+ const {records, buffered} = action.payload;
19
+ if(!buffered){
20
+ return currentState.filter(r=>!records.includes(r.__record__id__));
21
+ }
22
+ return currentState;
23
+
24
+ case Action.DATA_SAVED:
25
+
26
+ const recordsMap: Map<string, Record> = new Map();
27
+ const currentRecords = getRecords(stateManager);
28
+
29
+ if (currentRecords) {
30
+ const removed: Array<string> = getRemovedRecords(stateManager) || [];
31
+ currentRecords.forEach(r => {
32
+ if (!removed.includes(r.__record__id__)) {
33
+ recordsMap.set(r.__record__id__, r);
34
+ }
35
+ });
36
+ }
37
+
38
+ const newRecords: Array<Record> = [];
39
+ const savedRecords: Array<SavedRecord> = action.payload.records;
40
+ savedRecords.forEach(sr => {
41
+ const recordId = sr.__old__id__ || sr.__record__id__;
42
+ const newRecord: Record = { ...sr };
43
+ if(recordsMap.has(recordId)){
44
+ recordsMap.set(recordId, newRecord);
45
+ } else if(this.isNewRecord(newRecord)){
46
+ newRecords.push(newRecord);
47
+ }
48
+ delete newRecord["__old__id__"];
49
+ });
50
+ return newRecords.concat(Array.from(recordsMap.values()));
51
+
52
+ case Action.RECORD_LOADED:
53
+ action.payload.forEach((record: any) => {
54
+ for(let i = 0; i < currentState.length; i++){
55
+ if(currentState[i].__record__id__ === record.__record__id__){
56
+ currentState[i] = record;
57
+ }
58
+ }
59
+ });
60
+ }
61
+ return currentState;
62
+ }
63
+
64
+ private isNewRecord(record: Record){
65
+ return (!Object.prototype.hasOwnProperty.call(record,"__old__id__")
66
+ || record["__old__id__"] !== record["__record__id__"]);
67
+ }
68
+ }
69
+
70
+ export const RecordsReducer = new RecordsReducerImpl();
71
+
72
+ export const getRecords = (stateManager: StateManager): Array<Record> => {
73
+ return stateManager.select(RecordsReducer.sliceName, (state: Array<Record>) => state);
74
+ };
@@ -0,0 +1,30 @@
1
+
2
+ import { ActionReducer, StateAction } from "../StateManager.js";
3
+ import { Action } from "../action/DataUnitAction.js";
4
+ import StateManager from "../StateManager.js";
5
+
6
+ class RemovedRecordsReducerImpl implements ActionReducer{
7
+
8
+ public sliceName: string = "hist::removedRecords";
9
+
10
+ public reduce(_stateManager:StateManager, currentState: Array<string>, action: StateAction): Array<string>|undefined {
11
+ switch(action.type){
12
+ case Action.RECORDS_REMOVED:
13
+ const {records, buffered} = action.payload;
14
+ if(buffered){
15
+ return (currentState||[]).concat(records);
16
+ }
17
+ return currentState;
18
+ case Action.EDITION_CANCELED:
19
+ case Action.DATA_SAVED:
20
+ return undefined;
21
+ }
22
+ return currentState;
23
+ }
24
+ }
25
+
26
+ export const RemovedRecordsReducer = new RemovedRecordsReducerImpl();
27
+
28
+ export const getRemovedRecords = (stateManager: StateManager): Array<string> => {
29
+ return stateManager.select(RemovedRecordsReducer.sliceName, (state: Array<string>) => state);
30
+ };
@@ -0,0 +1,193 @@
1
+ import { ActionReducer, StateAction } from "../StateManager.js";
2
+ import { Action } from "../action/DataUnitAction.js";
3
+ import StateManager from "../StateManager.js";
4
+ import { getCurrentRecords, getSelectionRecords } from "./SnapshotSlice.js";
5
+ import { Record, SavedRecord, SelectionInfo, SelectionMode } from "../../DataUnit.js";
6
+ import { getCurrentRequest, getPaginationInfo } from "./LoadingControlSlice.js";
7
+ import { PaginationInfo } from "../../loading/PaginationInfo.js";
8
+
9
+ class SelectionReducerImpl implements ActionReducer {
10
+
11
+ public sliceName: string = "hist::selection";
12
+
13
+ public reduce(stateManager: StateManager, currentState: SelectionState, action: StateAction): SelectionState|undefined {
14
+
15
+ switch (action.type) {
16
+ case Action.DATA_LOADED:
17
+ return !action.payload?.keepSelection ? undefined : currentState;
18
+ case Action.RECORDS_ADDED:
19
+ case Action.RECORDS_COPIED:
20
+ return {currentSelection: action.payload.map((r: Record)=>r.__record__id__), lastSelection: currentState?.currentSelection};
21
+ case Action.DATA_SAVED:
22
+ return {currentSelection: updateSavedIds(stateManager, action.payload.records)};
23
+ case Action.RECORDS_REMOVED:
24
+ const removed: Array<string> = action.payload.records;
25
+
26
+ if (currentState && removed) {
27
+ const currentSelection = currentState.currentSelection;
28
+ const record = currentSelection.filter(recordId => !removed.includes(recordId));
29
+
30
+ if(record.length === 0) {
31
+ const currentRecords = getCurrentRecords(stateManager);
32
+ let removedIndex = action.payload.removedIndex.slice(-1)[0];
33
+ let currentIndex = 0;
34
+
35
+ if(removedIndex >= currentRecords.size - 1) {
36
+ removedIndex--;
37
+ } else {
38
+ removedIndex++
39
+ }
40
+
41
+ currentRecords.forEach((value, key) => {
42
+ if(currentIndex === removedIndex) {
43
+ record.push(key);
44
+ }
45
+ currentIndex++;
46
+ })
47
+
48
+ }
49
+ return {currentSelection: record};
50
+ }
51
+ return currentState;
52
+
53
+ case Action.NEXT_SELECTED:
54
+ case Action.PREVIOUS_SELECTED:
55
+
56
+ const currentRecords = getCurrentRecords(stateManager);
57
+ const currentSelection = currentState?.currentSelection;
58
+ if (currentRecords && currentRecords.size > 0) {
59
+ let index: number;
60
+ if (!currentState || currentSelection.length === 0) {
61
+ index = action.type === Action.PREVIOUS_SELECTED ? 0 : Math.min(1, currentRecords.size);
62
+ } else {
63
+ index = getItemIndex(currentSelection[0], currentRecords) + (action.type === Action.PREVIOUS_SELECTED ? -1 : 1);
64
+ }
65
+ if (index < currentRecords.size && index >= 0) {
66
+ return { currentSelection: [Array.from(currentRecords.values())[index].__record__id__] };
67
+ }
68
+ }
69
+
70
+ return undefined;
71
+
72
+ case Action.SELECTION_CHANGED:
73
+ const { type, selection: selectionSource } = action.payload;
74
+
75
+ if(selectionSource === SelectionMode.ALL_RECORDS){
76
+ return {currentSelection: [], mode: SelectionMode.ALL_RECORDS};
77
+ }
78
+
79
+ if (selectionSource && type === "index") {
80
+ const currentRecords = getCurrentRecords(stateManager);
81
+ if (currentRecords) {
82
+ const records = Array.from(currentRecords.values());
83
+ const selectionById: Array<string> = [];
84
+ selectionSource.forEach((i: number) => {
85
+ if (i >= 0 && i < currentRecords.size) {
86
+ selectionById.push(records[i].__record__id__);
87
+ }
88
+ });
89
+ return {currentSelection: selectionById};
90
+ }
91
+ }
92
+
93
+ return {currentSelection: selectionSource };
94
+ case Action.EDITION_CANCELED:
95
+ if(currentState?.lastSelection){
96
+ return { currentSelection: currentState.lastSelection };
97
+ }
98
+ break;
99
+ }
100
+
101
+ return currentState;
102
+ }
103
+ }
104
+
105
+ export const SelectionReducer = new SelectionReducerImpl();
106
+
107
+ export const getSelectionState = (stateManager: StateManager): SelectionState => {
108
+ return stateManager.select(SelectionReducer.sliceName, (state: SelectionState) => state);
109
+ }
110
+
111
+ export const getSelection = (stateManager: StateManager): Array<string> => {
112
+ let selection: Array<string> | undefined = getCurrentSelection(stateManager);
113
+
114
+ if (!selection || selection.length === 0) {
115
+ return [];
116
+ }
117
+
118
+ return selection;
119
+ };
120
+
121
+ export const getSelectionInfo = (stateManager: StateManager): SelectionInfo => {
122
+
123
+ const selection = getSelectionState(stateManager);
124
+ if(selection && selection.mode === SelectionMode.ALL_RECORDS){
125
+ const currentRequest = getCurrentRequest(stateManager);
126
+ const paginationInfo: PaginationInfo | undefined = getPaginationInfo(stateManager);
127
+ return new SelectionInfo(
128
+ [],
129
+ SelectionMode.ALL_RECORDS,
130
+ paginationInfo?.total || 0,
131
+ currentRequest?.filters,
132
+ currentRequest?.sort
133
+ );
134
+ }
135
+
136
+ return new SelectionInfo(getSelectionRecords(stateManager) || [], SelectionMode.SOME_RECORDS, undefined);
137
+ }
138
+
139
+ export const hasNext = (stateManager: StateManager): boolean => {
140
+ const records = getCurrentRecords(stateManager);
141
+ if (records) {
142
+ const selection = getCurrentSelection(stateManager);
143
+ if (!selection || selection.length === 0) {
144
+ return records.size > 0;
145
+ }
146
+ return records.size > (getItemIndex(selection[0], records) + 1);
147
+ }
148
+ return false;
149
+ };
150
+
151
+ export const hasPrevious = (stateManager: StateManager): boolean => {
152
+ const records = getCurrentRecords(stateManager);
153
+ if (records) {
154
+ const selection = getCurrentSelection(stateManager);
155
+ if (!selection || selection.length === 0) {
156
+ return false;
157
+ }
158
+ return getItemIndex(selection[0], records) > 0;
159
+ }
160
+ return false;
161
+ };
162
+
163
+ function getItemIndex(key: string, map: Map<string, any>): number {
164
+ return Array.from(map.keys()).indexOf(key);
165
+ }
166
+
167
+ function updateSavedIds(stateManager:StateManager, savedRecords:Array<SavedRecord>): Array<string>{
168
+ const currentSelection: Array<string> = getSelection(stateManager);
169
+ if(currentSelection){
170
+ const newSelection: Array<string> = [];
171
+ currentSelection.forEach( id => {
172
+ const record = savedRecords.find(r => r.__old__id__ === id);
173
+ if(record){
174
+ newSelection.push(record.__record__id__);
175
+ } else {
176
+ newSelection.push(id);
177
+ }
178
+ });
179
+ return newSelection;
180
+ }
181
+ return currentSelection;
182
+ }
183
+
184
+ function getCurrentSelection(stateManager: StateManager):Array<string> | undefined{
185
+ const selectionState = getSelectionState(stateManager);
186
+ return selectionState ? selectionState.currentSelection : undefined;
187
+ }
188
+
189
+ interface SelectionState{
190
+ currentSelection: Array<string>;
191
+ mode?: SelectionMode;
192
+ lastSelection?: Array<string>;
193
+ }