@sankhyalabs/core 4.1.0 → 4.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvalidFieldsSlice.js","sourceRoot":"","sources":["../../../../src/dataunit/state/slice/InvalidFieldsSlice.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sankhyalabs/core",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "Modulo core JavaScript da Sankhya.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -24,6 +24,7 @@ import { canRedo, canUndo, HistReducer } from "./state/HistReducer.js";
24
24
  import { getFormattedValue } from "./formatting/PrettyFormatter.js";
25
25
  import { v4 as uuid } from "uuid"
26
26
  import { DataUnitStorage } from "./DataUnitStorage.js";
27
+ import { getInvalidFieldMessage, InvalidFieldsReducer } from "./state/slice/InvalidFieldsSlice.js";
27
28
 
28
29
  const DEFAULT_DATAUNIT_NAME = "dataunit";
29
30
 
@@ -63,7 +64,8 @@ export default class DataUnit {
63
64
  SelectionReducer,
64
65
  ChangesReducer,
65
66
  WaitingChangesReducer,
66
- CurrentRecordsReducer
67
+ CurrentRecordsReducer,
68
+ InvalidFieldsReducer
67
69
  ]
68
70
  );
69
71
  this._observers = [];
@@ -693,6 +695,17 @@ export default class DataUnit {
693
695
  return modified || [];
694
696
  }
695
697
 
698
+ /**
699
+ *
700
+ * Obtém os registros adicionados no DataUnit.
701
+ *
702
+ * @returns - Lista dos registros adicionados.
703
+ *
704
+ */
705
+ public getAddedRecords(): Array<Record> {
706
+ return getAddedRecords(this._stateManager);
707
+ }
708
+
696
709
  /**
697
710
  *
698
711
  * Obtém metadados de um campo específico.
@@ -802,6 +815,43 @@ export default class DataUnit {
802
815
  }
803
816
  }
804
817
 
818
+ /**
819
+ *
820
+ * Marca campos como inválidos.
821
+ *
822
+ * @param fieldName - Nome do campo inválido.
823
+ * @param message - Mensagem descrevendo o motivo da invalidade.
824
+ * @param recordId - Indica qual registro está com o campo inválido.
825
+ *
826
+ */
827
+ public setInvalidField(fieldName: string, message: string, recordId: string): void {
828
+ this.dispatchAction(Action.FIELD_INVALIDATED, { fieldName, message, recordId }, undefined);
829
+ }
830
+
831
+ /**
832
+ *
833
+ * Limpa campos inválidos.
834
+ *
835
+ * @param recordId - Indica em qual registro o campo não está mais inválido.
836
+ * @param fieldName - Nome do campo. Caso omitido, todos os campos serão limpos.
837
+ *
838
+ */
839
+ public clearInvalid(recordId: string, fieldName?: string): void {
840
+ this.dispatchAction(Action.INVALIDATE_CLEAN, { fieldName, recordId }, undefined);
841
+ }
842
+
843
+ /**
844
+ *
845
+ * Obtém a mensagem de campo inválido para determinado registro.
846
+ *
847
+ * @param recordId - Identificador do registro.
848
+ * @param fieldName - Nome do campo.
849
+ *
850
+ */
851
+ public getInvalidMessage(recordId: string, fieldName: string): string|undefined {
852
+ return getInvalidFieldMessage(this._stateManager, fieldName, recordId);
853
+ }
854
+
805
855
  /**
806
856
  *
807
857
  * Inicia alteração no campo.
@@ -60,5 +60,9 @@ export enum Action{
60
60
 
61
61
  SELECTION_REMOVED = "selectionRemoved",
62
62
 
63
- CHILD_CHANGED = "childChanged"
63
+ CHILD_CHANGED = "childChanged",
64
+
65
+ FIELD_INVALIDATED = "fieldInvalidated",
66
+ INVALIDATE_CLEAN = "invalidateClean"
67
+
64
68
  }
@@ -99,7 +99,15 @@ export const getChangesToSave = (dataUnit: string, stateManager: StateManager):
99
99
  if (addedRecords) {
100
100
  addedRecords.forEach(r => {
101
101
  const operation: ChangeOperation = r.__copy__ ? ChangeOperation.COPY : ChangeOperation.INSERT;
102
- result.push(new Change(dataUnit, r, changes?.get(r.__record__id__), operation, r.__record__source__id__));
102
+ const changedFields = {...changes?.get(r.__record__id__)};
103
+ if(operation === ChangeOperation.INSERT){
104
+ Object.keys(r).forEach(fieldName => {
105
+ if(!fieldName.startsWith("__")){
106
+ changedFields[fieldName] = r[fieldName];
107
+ }
108
+ });
109
+ }
110
+ result.push(new Change(dataUnit, r, changedFields, operation, r.__record__source__id__));
103
111
  });
104
112
  }
105
113
 
@@ -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
+ }