@flowerforce/flower-core 3.1.2-beta.4 → 3.1.2-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +26 -7
- package/dist/index.esm.js +26 -7
- package/dist/src/interfaces/ReducerInterface.d.ts +17 -2
- package/dist/src/interfaces/SelectorsInterface.d.ts +6 -1
- package/dist/src/interfaces/Store.d.ts +3 -0
- package/dist/src/interfaces/UtilsInterface.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
@@ -438,14 +438,13 @@ const FlowerStateUtils = {
|
|
438
438
|
};
|
439
439
|
const createFormData = (form) => {
|
440
440
|
const validationErrors = form && form.errors;
|
441
|
-
const
|
442
|
-
const allErrors = { ...(validationErrors || {}), ...(customErrors || {}) };
|
441
|
+
const allErrors = Object.values(validationErrors || {});
|
443
442
|
return {
|
444
443
|
touched: form?.touched || false,
|
445
444
|
errors: form?.errors,
|
446
445
|
customErrors: form?.customErrors,
|
447
446
|
isValidating: form?.isValidating,
|
448
|
-
isValid: allErrors
|
447
|
+
isValid: allErrors.flat().length === 0
|
449
448
|
};
|
450
449
|
};
|
451
450
|
|
@@ -620,18 +619,33 @@ const FlowerCoreReducers = {
|
|
620
619
|
'errors',
|
621
620
|
payload.id
|
622
621
|
]);
|
622
|
+
_unset(state, [
|
623
|
+
payload.name,
|
624
|
+
'form',
|
625
|
+
payload.currentNode,
|
626
|
+
'customErrors',
|
627
|
+
payload.id
|
628
|
+
]);
|
623
629
|
_unset(state, [payload.name, 'form', payload.currentNode, 'isValidating']);
|
624
630
|
},
|
625
631
|
formFieldTouch: (state, { payload }) => {
|
626
632
|
_set(state, [payload.name, 'form', payload.currentNode, 'touches', payload.id], payload.touched);
|
627
633
|
},
|
634
|
+
formFieldDirty: (state, { payload }) => {
|
635
|
+
_set(state, [payload.name, 'form', payload.currentNode, 'dirty', payload.id], payload.dirty);
|
636
|
+
},
|
628
637
|
addData: (state, { payload }) => {
|
629
638
|
const prevData = _get(state, [payload.flowName, 'data']);
|
630
639
|
_set(state, [payload.flowName, 'data'], { ...prevData, ...payload.value });
|
631
640
|
},
|
632
641
|
addDataByPath: (state, { payload }) => {
|
642
|
+
const { path: newpath } = getPath(payload.id);
|
643
|
+
const currentNode = FlowerStateUtils.makeSelectCurrentNodeId(payload.flowName)(state);
|
633
644
|
if (payload.id && payload.id.length) {
|
634
|
-
_set(state, [payload.flowName, 'data', ...
|
645
|
+
_set(state, [payload.flowName, 'data', ...newpath], payload.value);
|
646
|
+
if (payload?.dirty) {
|
647
|
+
_set(state, [payload.flowName, 'form', currentNode, 'dirty', payload.id], payload.dirty);
|
648
|
+
}
|
635
649
|
}
|
636
650
|
},
|
637
651
|
// TODO usato al momento solo il devtool
|
@@ -646,12 +660,14 @@ const FlowerCoreReducers = {
|
|
646
660
|
_set(state, [payload.name, 'form', payload.currentNode, 'isValidating'], payload.isValidating);
|
647
661
|
},
|
648
662
|
resetForm: (state, { payload }) => {
|
649
|
-
const touchedFields = _get(state, [payload.flowName, 'form', payload.id, '
|
663
|
+
const touchedFields = _get(state, [payload.flowName, 'form', payload.id, 'errors'], {});
|
650
664
|
Object.keys(touchedFields).forEach((key) => {
|
651
665
|
const { flowNameFromPath = payload.flowName, path } = getPath(key);
|
652
666
|
_unset(state, [flowNameFromPath, 'data', ...path]);
|
653
667
|
});
|
654
|
-
_unset(state, [payload.flowName, 'form', payload.id]);
|
668
|
+
_unset(state, [payload.flowName, 'form', payload.id, 'touches']);
|
669
|
+
_unset(state, [payload.flowName, 'form', payload.id, 'dirty']);
|
670
|
+
_unset(state, [payload.flowName, 'form', payload.id, 'touched']);
|
655
671
|
},
|
656
672
|
node: (state, { payload }) => {
|
657
673
|
const { name, history } = payload;
|
@@ -763,6 +779,7 @@ const FlowerCoreStateSelectors = {
|
|
763
779
|
getDataFromState: (id) => (data) => (id === '*' ? data : _get(data, id)),
|
764
780
|
makeSelectNodeFormTouched: (form) => form && form.touched,
|
765
781
|
makeSelectNodeFormFieldTouched: (id) => (form) => form && form.touches && form.touches[id],
|
782
|
+
makeSelectNodeFormFieldDirty: (id) => (form) => form && form.dirty && form.dirty[id],
|
766
783
|
makeSelectCurrentNodeId: (flower, startNodeId) => _get(flower, ['current']) || startNodeId,
|
767
784
|
makeSelectCurrentNodeDisabled: (nodes, current) => !!_get(nodes, [current, 'disabled']),
|
768
785
|
makeSelectPrevNodeRetain: (nodes, history, current) => {
|
@@ -780,7 +797,9 @@ const FlowerCoreStateSelectors = {
|
|
780
797
|
if (nodes[prevFlowerNode] && nodes[prevFlowerNode].disabled)
|
781
798
|
return;
|
782
799
|
// eslint-disable-next-line consistent-return
|
783
|
-
return
|
800
|
+
return nodes[prevFlowerNode] && nodes[prevFlowerNode].retain
|
801
|
+
? prevFlowerNode
|
802
|
+
: undefined;
|
784
803
|
},
|
785
804
|
makeSelectNodeErrors: createFormData,
|
786
805
|
makeSelectFieldError: (name, id, validate) => (data, form) => {
|
package/dist/index.esm.js
CHANGED
@@ -436,14 +436,13 @@ const FlowerStateUtils = {
|
|
436
436
|
};
|
437
437
|
const createFormData = (form) => {
|
438
438
|
const validationErrors = form && form.errors;
|
439
|
-
const
|
440
|
-
const allErrors = { ...(validationErrors || {}), ...(customErrors || {}) };
|
439
|
+
const allErrors = Object.values(validationErrors || {});
|
441
440
|
return {
|
442
441
|
touched: form?.touched || false,
|
443
442
|
errors: form?.errors,
|
444
443
|
customErrors: form?.customErrors,
|
445
444
|
isValidating: form?.isValidating,
|
446
|
-
isValid: allErrors
|
445
|
+
isValid: allErrors.flat().length === 0
|
447
446
|
};
|
448
447
|
};
|
449
448
|
|
@@ -618,18 +617,33 @@ const FlowerCoreReducers = {
|
|
618
617
|
'errors',
|
619
618
|
payload.id
|
620
619
|
]);
|
620
|
+
_unset(state, [
|
621
|
+
payload.name,
|
622
|
+
'form',
|
623
|
+
payload.currentNode,
|
624
|
+
'customErrors',
|
625
|
+
payload.id
|
626
|
+
]);
|
621
627
|
_unset(state, [payload.name, 'form', payload.currentNode, 'isValidating']);
|
622
628
|
},
|
623
629
|
formFieldTouch: (state, { payload }) => {
|
624
630
|
_set(state, [payload.name, 'form', payload.currentNode, 'touches', payload.id], payload.touched);
|
625
631
|
},
|
632
|
+
formFieldDirty: (state, { payload }) => {
|
633
|
+
_set(state, [payload.name, 'form', payload.currentNode, 'dirty', payload.id], payload.dirty);
|
634
|
+
},
|
626
635
|
addData: (state, { payload }) => {
|
627
636
|
const prevData = _get(state, [payload.flowName, 'data']);
|
628
637
|
_set(state, [payload.flowName, 'data'], { ...prevData, ...payload.value });
|
629
638
|
},
|
630
639
|
addDataByPath: (state, { payload }) => {
|
640
|
+
const { path: newpath } = getPath(payload.id);
|
641
|
+
const currentNode = FlowerStateUtils.makeSelectCurrentNodeId(payload.flowName)(state);
|
631
642
|
if (payload.id && payload.id.length) {
|
632
|
-
_set(state, [payload.flowName, 'data', ...
|
643
|
+
_set(state, [payload.flowName, 'data', ...newpath], payload.value);
|
644
|
+
if (payload?.dirty) {
|
645
|
+
_set(state, [payload.flowName, 'form', currentNode, 'dirty', payload.id], payload.dirty);
|
646
|
+
}
|
633
647
|
}
|
634
648
|
},
|
635
649
|
// TODO usato al momento solo il devtool
|
@@ -644,12 +658,14 @@ const FlowerCoreReducers = {
|
|
644
658
|
_set(state, [payload.name, 'form', payload.currentNode, 'isValidating'], payload.isValidating);
|
645
659
|
},
|
646
660
|
resetForm: (state, { payload }) => {
|
647
|
-
const touchedFields = _get(state, [payload.flowName, 'form', payload.id, '
|
661
|
+
const touchedFields = _get(state, [payload.flowName, 'form', payload.id, 'errors'], {});
|
648
662
|
Object.keys(touchedFields).forEach((key) => {
|
649
663
|
const { flowNameFromPath = payload.flowName, path } = getPath(key);
|
650
664
|
_unset(state, [flowNameFromPath, 'data', ...path]);
|
651
665
|
});
|
652
|
-
_unset(state, [payload.flowName, 'form', payload.id]);
|
666
|
+
_unset(state, [payload.flowName, 'form', payload.id, 'touches']);
|
667
|
+
_unset(state, [payload.flowName, 'form', payload.id, 'dirty']);
|
668
|
+
_unset(state, [payload.flowName, 'form', payload.id, 'touched']);
|
653
669
|
},
|
654
670
|
node: (state, { payload }) => {
|
655
671
|
const { name, history } = payload;
|
@@ -761,6 +777,7 @@ const FlowerCoreStateSelectors = {
|
|
761
777
|
getDataFromState: (id) => (data) => (id === '*' ? data : _get(data, id)),
|
762
778
|
makeSelectNodeFormTouched: (form) => form && form.touched,
|
763
779
|
makeSelectNodeFormFieldTouched: (id) => (form) => form && form.touches && form.touches[id],
|
780
|
+
makeSelectNodeFormFieldDirty: (id) => (form) => form && form.dirty && form.dirty[id],
|
764
781
|
makeSelectCurrentNodeId: (flower, startNodeId) => _get(flower, ['current']) || startNodeId,
|
765
782
|
makeSelectCurrentNodeDisabled: (nodes, current) => !!_get(nodes, [current, 'disabled']),
|
766
783
|
makeSelectPrevNodeRetain: (nodes, history, current) => {
|
@@ -778,7 +795,9 @@ const FlowerCoreStateSelectors = {
|
|
778
795
|
if (nodes[prevFlowerNode] && nodes[prevFlowerNode].disabled)
|
779
796
|
return;
|
780
797
|
// eslint-disable-next-line consistent-return
|
781
|
-
return
|
798
|
+
return nodes[prevFlowerNode] && nodes[prevFlowerNode].retain
|
799
|
+
? prevFlowerNode
|
800
|
+
: undefined;
|
782
801
|
},
|
783
802
|
makeSelectNodeErrors: createFormData,
|
784
803
|
makeSelectFieldError: (name, id, validate) => (data, form) => {
|
@@ -5,7 +5,7 @@ export type ActionWithPayload<T> = {
|
|
5
5
|
payload: T;
|
6
6
|
};
|
7
7
|
type ReducerFunctionSign<T extends object, R> = (state: Record<string, Flower<T>>, action: ActionWithPayload<R>) => Record<string, Flower<T>> | void;
|
8
|
-
export type ActionsTypes = 'historyAdd' | 'historyPrevToNode' | 'setFormTouched' | 'forceAddHistory' | 'historyPop' | 'restoreHistory' | 'replaceNode' | 'initializeFromNode' | 'forceResetHistory' | 'destroy' | 'initNodes' | 'setCurrentNode' | 'formAddErrors' | 'formRemoveErrors' | 'addData' | 'addDataByPath' | 'replaceData' | 'unsetData' | 'setFormIsValidating' | 'resetForm' | 'formFieldTouch' | 'node' | 'prevToNode' | 'next' | 'prev' | 'reset';
|
8
|
+
export type ActionsTypes = 'historyAdd' | 'historyPrevToNode' | 'setFormTouched' | 'forceAddHistory' | 'historyPop' | 'restoreHistory' | 'replaceNode' | 'initializeFromNode' | 'forceResetHistory' | 'destroy' | 'initNodes' | 'setCurrentNode' | 'formAddErrors' | 'formRemoveErrors' | 'addData' | 'addDataByPath' | 'replaceData' | 'unsetData' | 'setFormIsValidating' | 'resetForm' | 'formFieldTouch' | 'formFieldDirty' | 'node' | 'prevToNode' | 'next' | 'prev' | 'reset';
|
9
9
|
/**
|
10
10
|
* These functions are Redux reducers used in a Flux architecture for managing state transitions and updates in a Flower application.
|
11
11
|
*/
|
@@ -192,6 +192,20 @@ export type ReducersFunctions<T extends Record<string, any> = Record<string, Flo
|
|
192
192
|
[x: string]: string[];
|
193
193
|
} | string[];
|
194
194
|
}>;
|
195
|
+
/**
|
196
|
+
* @param state
|
197
|
+
* @param action
|
198
|
+
*
|
199
|
+
* Set touch form single field
|
200
|
+
*
|
201
|
+
* @returns state
|
202
|
+
*/
|
203
|
+
formFieldDirty: ReducerFunctionSign<T, {
|
204
|
+
name: string;
|
205
|
+
currentNode: string;
|
206
|
+
id: string;
|
207
|
+
dirty?: boolean;
|
208
|
+
}>;
|
195
209
|
/**
|
196
210
|
* @param state
|
197
211
|
* @param action
|
@@ -240,9 +254,10 @@ export type ReducersFunctions<T extends Record<string, any> = Record<string, Flo
|
|
240
254
|
* @returns state
|
241
255
|
*/
|
242
256
|
addDataByPath: ReducerFunctionSign<T, {
|
243
|
-
id: string
|
257
|
+
id: string;
|
244
258
|
flowName: string;
|
245
259
|
value: T | string;
|
260
|
+
dirty?: boolean;
|
246
261
|
}>;
|
247
262
|
/**
|
248
263
|
* @param state
|
@@ -51,7 +51,7 @@ export interface ISelectors {
|
|
51
51
|
* @param current
|
52
52
|
* @returns
|
53
53
|
*/
|
54
|
-
makeSelectPrevNodeRetain<T extends Record<string, any>>(nodes: Flower<T>['nodes'], history: Flower<T>['history'], current: Flower<T>['current']):
|
54
|
+
makeSelectPrevNodeRetain<T extends Record<string, any>>(nodes: Flower<T>['nodes'], history: Flower<T>['history'], current: Flower<T>['current']): string | undefined;
|
55
55
|
/**
|
56
56
|
* @param nodes
|
57
57
|
* @param current
|
@@ -76,6 +76,11 @@ export interface ISelectors {
|
|
76
76
|
* @returns
|
77
77
|
*/
|
78
78
|
makeSelectNodeFormFieldTouched<T extends Record<string, any>>(id: string): (form: Form<T> | undefined) => boolean | undefined;
|
79
|
+
/**
|
80
|
+
* @param form
|
81
|
+
* @returns
|
82
|
+
*/
|
83
|
+
makeSelectNodeFormFieldDirty<T extends Record<string, any>>(id: string): (form: Form<T> | undefined) => boolean | undefined;
|
79
84
|
/**
|
80
85
|
* @param flower
|
81
86
|
* @returns
|