@plaudit/gutenberg-api-extensions 2.82.0 → 2.84.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/blocks/SNPGroupComponent.js.map +1 -1
- package/dist/blocks/common-native-property-constructors.js +3 -2
- package/dist/blocks/common-native-property-constructors.js.map +1 -1
- package/dist/blocks/data-controller/actions.d.ts +135 -0
- package/dist/blocks/data-controller/actions.js +19 -0
- package/dist/blocks/data-controller/actions.js.map +1 -0
- package/dist/blocks/data-controller/reducer.d.ts +4 -0
- package/dist/blocks/data-controller/reducer.js +143 -0
- package/dist/blocks/data-controller/reducer.js.map +1 -0
- package/dist/blocks/data-controller/trigger-handlers.d.ts +140 -0
- package/dist/blocks/data-controller/trigger-handlers.js +117 -0
- package/dist/blocks/data-controller/trigger-handlers.js.map +1 -0
- package/dist/blocks/data-controller/utils.d.ts +43 -0
- package/dist/blocks/data-controller/utils.js +359 -0
- package/dist/blocks/data-controller/utils.js.map +1 -0
- package/dist/blocks/data-controller.d.ts +4 -37
- package/dist/blocks/data-controller.js +33 -604
- package/dist/blocks/data-controller.js.map +1 -1
- package/dist/blocks/layered-styles-impl.js +9 -8
- package/dist/blocks/layered-styles-impl.js.map +1 -1
- package/dist/blocks/layout/NodeContext.js +3 -3
- package/dist/blocks/layout/NodeContext.js.map +1 -1
- package/dist/blocks/simple-native-property-api.d.ts +10 -7
- package/dist/blocks/simple-native-property-api.js.map +1 -1
- package/dist/blocks/simple-native-property-impl.js +29 -24
- package/dist/blocks/simple-native-property-impl.js.map +1 -1
- package/dist/blocks/snp-data-store.d.ts +9 -6
- package/dist/blocks/snp-data-store.js +17 -12
- package/dist/blocks/snp-data-store.js.map +1 -1
- package/dist/controls/FullSizeToggleControl.d.ts +1 -1
- package/dist/controls/FullSizeToggleControl.js.map +1 -1
- package/dist/lib/gutenberg-api-extensions-state/layered-block-styles-logic.js +12 -12
- package/dist/lib/gutenberg-api-extensions-state/layered-block-styles-logic.js.map +1 -1
- package/dist/lib/gutenberg-api-extensions-state/snp-logic.js +2 -2
- package/dist/lib/gutenberg-api-extensions-state/snp-logic.js.map +1 -1
- package/package.json +7 -7
- package/simple-native-properties.md +1 -0
- package/src/blocks/SNPGroupComponent.tsx +1 -1
- package/src/blocks/common-native-property-constructors.tsx +3 -2
- package/src/blocks/data-controller/actions.ts +20 -0
- package/src/blocks/data-controller/reducer.ts +149 -0
- package/src/blocks/data-controller/trigger-handlers.ts +138 -0
- package/src/blocks/data-controller/utils.ts +339 -0
- package/src/blocks/data-controller.ts +38 -605
- package/src/blocks/layered-styles-impl.ts +10 -9
- package/src/blocks/layout/NodeContext.tsx +3 -3
- package/src/blocks/simple-native-property-api.ts +12 -10
- package/src/blocks/simple-native-property-impl.tsx +31 -24
- package/src/blocks/snp-data-store.ts +22 -13
- package/src/controls/FullSizeToggleControl.tsx +3 -3
- package/src/lib/gutenberg-api-extensions-state/layered-block-styles-logic.ts +12 -11
- package/src/lib/gutenberg-api-extensions-state/snp-logic.ts +2 -2
|
@@ -17,18 +17,18 @@ exports.layeredBlockStylesLogicSelectors = {
|
|
|
17
17
|
}
|
|
18
18
|
};
|
|
19
19
|
function layeredBlockStylesLogic(state, action) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
switch (action.type) {
|
|
21
|
+
case "ADD_LAYERED_BLOCK_STYLES":
|
|
22
|
+
return (0, immer_1.produce)(state, (draft) => {
|
|
23
|
+
const blockLayeredStyles = draft.layeredBlockStyles[action.blockName] ?? (draft.layeredBlockStyles[action.blockName] = {});
|
|
24
|
+
for (const layer of action.properties) {
|
|
25
|
+
blockLayeredStyles[layer.name] = layer;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
case "SET_LAYERED_BLOCK_STYLES":
|
|
29
|
+
return (0, immer_1.produce)(state, (draft) => {
|
|
30
|
+
draft.layeredBlockStyles[action.blockName] = action.properties;
|
|
31
|
+
});
|
|
32
32
|
}
|
|
33
33
|
return state;
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layered-block-styles-logic.js","sourceRoot":"","sources":["../../../src/lib/gutenberg-api-extensions-state/layered-block-styles-logic.ts"],"names":[],"mappings":";;;AA2BA,
|
|
1
|
+
{"version":3,"file":"layered-block-styles-logic.js","sourceRoot":"","sources":["../../../src/lib/gutenberg-api-extensions-state/layered-block-styles-logic.ts"],"names":[],"mappings":";;;AA2BA,0DAeC;AA1CD,iCAA8B;AAajB,QAAA,8BAA8B,GAAG;IAC7C,qBAAqB,CAAC,SAAoB,EAAE,UAAoC;QAC/E,OAAO,EAAC,IAAI,EAAE,0BAA0B,EAAE,SAAS,EAAE,UAAU,EAAC,CAAC;IAClE,CAAC;CACD,CAAC;AACW,QAAA,gCAAgC,GAAG;IAC/C,gBAAgB,CAAC,KAAmC,EAAE,SAAoB,EAAE,SAAiB;QAC5F,OAAO,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IACD,iBAAiB,CAAC,KAAmC,EAAE,SAAoB;QAC1E,OAAO,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;CACD,CAAC;AAEF,SAAgB,uBAAuB,CAAC,KAAmC,EAAE,MAA2D;IACvI,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,0BAA0B;YAC9B,OAAO,IAAA,eAAO,EAAC,KAAK,EAAE,CAAC,KAAmB,EAAE,EAAE;gBAC7C,MAAM,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC3H,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACvC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBACxC,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,KAAK,0BAA0B;YAC9B,OAAO,IAAA,eAAO,EAAC,KAAK,EAAE,CAAC,KAAmB,EAAE,EAAE;gBAC7C,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;YAChE,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -62,7 +62,7 @@ function snpLogic(state, action) {
|
|
|
62
62
|
});
|
|
63
63
|
case "ADD_OR_UPDATE_EXTRA_PROP_TRANSFORM":
|
|
64
64
|
return (0, immer_1.produce)(state, (draft) => {
|
|
65
|
-
const blockTransforms =
|
|
65
|
+
const blockTransforms = (draft.extraPropTransforms[action.blockName] ??= {});
|
|
66
66
|
if (blockTransforms[action.propPath]) {
|
|
67
67
|
blockTransforms[action.propPath].styleProperty = action.extraPropTransform.styleProperty;
|
|
68
68
|
}
|
|
@@ -88,7 +88,7 @@ function snpLogic(state, action) {
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
function addProperties(block, properties, simpleNativePanelsAndTabs) {
|
|
91
|
-
const panels = (simpleNativePanelsAndTabs[block]
|
|
91
|
+
const panels = (simpleNativePanelsAndTabs[block] ??= []);
|
|
92
92
|
if ('title' in properties) {
|
|
93
93
|
panels.push(properties);
|
|
94
94
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snp-logic.js","sourceRoot":"","sources":["../../../src/lib/gutenberg-api-extensions-state/snp-logic.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"snp-logic.js","sourceRoot":"","sources":["../../../src/lib/gutenberg-api-extensions-state/snp-logic.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plaudit/gutenberg-api-extensions",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.84.0",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
5
5
|
"files": [
|
|
6
6
|
"./dist",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"./controls": "./dist/controls/index.js"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@reduxjs/toolkit": "^
|
|
24
|
+
"@reduxjs/toolkit": "^2.11.2",
|
|
25
25
|
"@types/react": "^18.3.27",
|
|
26
|
-
"@types/wordpress__block-editor": "^
|
|
26
|
+
"@types/wordpress__block-editor": "^15.0.0",
|
|
27
27
|
"@types/wordpress__blocks": "^12.5.18",
|
|
28
28
|
"@wordpress/block-editor": "^15.10.0",
|
|
29
29
|
"@wordpress/blocks": "^15.10.0",
|
|
@@ -36,13 +36,13 @@
|
|
|
36
36
|
"@wordpress/hooks": "^4.37.0",
|
|
37
37
|
"@wordpress/i18n": "^6.10.0",
|
|
38
38
|
"@wordpress/icons": "^11.4.0",
|
|
39
|
-
"framer-motion": "^12.
|
|
39
|
+
"framer-motion": "^12.26.2",
|
|
40
40
|
"html-react-parser": "^5.2.11",
|
|
41
|
-
"immer": "^
|
|
41
|
+
"immer": "^11.1.3",
|
|
42
42
|
"react": "^18.3.1",
|
|
43
43
|
"react-dom": "^18.3.1",
|
|
44
|
-
"react-error-boundary": "^6.0.
|
|
45
|
-
"redux": "^
|
|
44
|
+
"react-error-boundary": "^6.0.3",
|
|
45
|
+
"redux": "^5.0.1"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"typescript": "^5.9.3"
|
|
@@ -805,6 +805,7 @@ Wrap your controls in **Panels** to create collapsible sections in the sidebar.
|
|
|
805
805
|
- `position` (number): Panel display order.
|
|
806
806
|
- `raw` (boolean): Render panel without wrapper (advanced).
|
|
807
807
|
- `identifier` (any): Custom identifier for the panel.
|
|
808
|
+
- `dataStoreTypeOverride` (`'layered-styles'`|`'attribute'`|`undefined`): Allows the data store type to be overridden for the panel. Default: `undefined`
|
|
808
809
|
|
|
809
810
|
**Example:**
|
|
810
811
|
|
|
@@ -19,7 +19,7 @@ export function SNPGroupComponent({config, hydratedProperties, Label, Messages}:
|
|
|
19
19
|
className={config.component?.className ? `plaudit-snp-group-component ${config.component.className}` : "plaudit-snp-group-component"}
|
|
20
20
|
label={config.label}
|
|
21
21
|
resetAll={useCallback(resetAllFilters => {
|
|
22
|
-
setValue((resetAllFilters ?? []).reduce((q: any, filter
|
|
22
|
+
setValue((resetAllFilters ?? []).reduce((q: any, filter) => filter(q), value))
|
|
23
23
|
}, [value, setValue])}
|
|
24
24
|
>
|
|
25
25
|
{...hydratedProperties.map(property => <LaidOutPropertyRow property={property} inToolsPanel={true} />)}
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
import {normalizePickableOptionsToObjects, normalizePickableOptionsToPairs} from "../controls/shared";
|
|
26
26
|
import {useSuspendableOptions} from "./hooks/useSuspendableOptions";
|
|
27
27
|
import {makeToolsPanelContextValue, ToolsPanelContext} from "./layout/ToolsPanelContext";
|
|
28
|
+
import {store as gutenbergApiExtensionsStore} from "../lib/gutenberg-api-extensions-state";
|
|
28
29
|
import {clone} from "../lib/helpers";
|
|
29
30
|
import {arrayIsNotEmpty, BlockName} from "../lib/useful-types";
|
|
30
31
|
import type {CSNPControlComponentProps} from "./shared-internal-types";
|
|
@@ -65,14 +66,14 @@ function validateAndRecordPotentialStyleProperty(
|
|
|
65
66
|
if (parentTypes.includes('array')) {
|
|
66
67
|
console.error(`A SNP was configured with a styleProperty, but it is within an array-type SNP. This is unsupported`, "SNP in error:", config);
|
|
67
68
|
} else {
|
|
68
|
-
dispatch(
|
|
69
|
+
dispatch(gutenbergApiExtensionsStore)
|
|
69
70
|
.addOrUpdateExtraPropTransform(blockName, propPath, {propName: config.name, forLayeredStyles, styleProperty: config.styleProperty});
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
74
|
function injectBlockSourcedDefault(config: PDSimpleNativeProperty, blockName: BlockName): typeof config {
|
|
74
75
|
if (config.default === undefined) {
|
|
75
|
-
const existingAttr = select(
|
|
76
|
+
const existingAttr = select(gutenbergApiExtensionsStore).baselineBlockAttrs(blockName)?.attributes?.[config.name];
|
|
76
77
|
if (existingAttr && typeof existingAttr === 'object' && 'default' in existingAttr) {
|
|
77
78
|
if (existingAttr.default !== undefined) {
|
|
78
79
|
const expectedPropType = getPropType(config);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {HydratedLaidOutProperties} from "../simple-native-property-internal-shared";
|
|
2
|
+
import type {DataStore} from "../simple-native-property-api";
|
|
3
|
+
import {createGlobalAction, createPathedAction} from "./trigger-handlers";
|
|
4
|
+
|
|
5
|
+
export const actions = {
|
|
6
|
+
addProperties: createGlobalAction<{properties: HydratedLaidOutProperties, dataStore: DataStore}>('addProperties', {conditionChecks: true, changedByManagedControl: true}),
|
|
7
|
+
checkConditions: createGlobalAction('checkConditions', {conditionChecks: true}), // This action is handled implicitly
|
|
8
|
+
commitBatchAddedProperties: createGlobalAction('commitBatchAddedProperties'),
|
|
9
|
+
markManagedControlChangeHandled: createGlobalAction('markManagedControlChangeHandled'),
|
|
10
|
+
validateNodes: createGlobalAction('validateNodes'),
|
|
11
|
+
node: {
|
|
12
|
+
add: createPathedAction<{value?: any, subtype?: string}>('node/add', {conditionChecks: true, changedByManagedControl: true}),
|
|
13
|
+
remove: createPathedAction('node/remove', {conditionChecks: true, changedByManagedControl: true}),
|
|
14
|
+
move: createPathedAction<{from: number, to: number}|{from: string, to: string}>('node/move', {conditionChecks: true}),
|
|
15
|
+
validate: createPathedAction('node/validate', {validation: true}), // This action is handled implicitly
|
|
16
|
+
write: createPathedAction<{value?: any}>('node/write', {conditionChecks: true, validation: true, changedByManagedControl: true}),
|
|
17
|
+
}
|
|
18
|
+
} as const;
|
|
19
|
+
|
|
20
|
+
export type DataControllerActions = ReturnType<typeof actions[Exclude<keyof typeof actions, 'node'>]|typeof actions['node'][keyof typeof actions['node']]>;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import {createReducer} from "@reduxjs/toolkit";
|
|
2
|
+
import {produce} from "immer";
|
|
3
|
+
|
|
4
|
+
import {actions} from "./actions";
|
|
5
|
+
import {DCStoreState, walkToNodeInValue} from "../data-controller";
|
|
6
|
+
import {PathError} from "../PathError";
|
|
7
|
+
import {buildDefaultValueFromDefinition} from "../simple-native-property-internal-shared";
|
|
8
|
+
import type {HydratedSimpleNativeProperty} from "../simple-native-property-api";
|
|
9
|
+
import {triggerHandlers, validateFoundNode} from "./trigger-handlers";
|
|
10
|
+
import {
|
|
11
|
+
applyToTree,
|
|
12
|
+
buildNodeFromDataAndDefinition, getDataStore,
|
|
13
|
+
moveNodeWithinParent,
|
|
14
|
+
populateValueBasedOnDefinition,
|
|
15
|
+
removeFromParentNode, removeValueFromBackingDataStore,
|
|
16
|
+
resolveParentNodeDefinition, TreeMutatorResult,
|
|
17
|
+
walkToNode, writeValueToBackingDataStoreWithCorrections
|
|
18
|
+
} from "./utils";
|
|
19
|
+
|
|
20
|
+
export function buildReducer(blockClientId: string) {
|
|
21
|
+
const initialState: DCStoreState = {
|
|
22
|
+
treeRoot: {children: {}, rendered: true}, dataStores: {byProperty: {}, list: []}, blockClientId, changedByManagedControl: false, rerenderTrigger: 0,
|
|
23
|
+
batchAddedPropertiesThatNeedWriteThrough: []
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
return createReducer(initialState, builder => {
|
|
27
|
+
builder
|
|
28
|
+
.addCase(actions.addProperties, (state, {payload: {properties, dataStore}, meta}) => {
|
|
29
|
+
if (!state.dataStores.list.includes(dataStore)) {
|
|
30
|
+
state.dataStores.list.push(dataStore);
|
|
31
|
+
}
|
|
32
|
+
for (const property of properties) {
|
|
33
|
+
for (const prop of Array.isArray(property) ? property : [property]) {
|
|
34
|
+
if (dataStore.getValue(prop.name) === undefined && meta.inBatch) {
|
|
35
|
+
state.batchAddedPropertiesThatNeedWriteThrough.push(prop);
|
|
36
|
+
}
|
|
37
|
+
dataStore.addProperty(prop, !meta.inBatch);
|
|
38
|
+
state.dataStores.byProperty[prop.name] = dataStore;
|
|
39
|
+
state.treeRoot.children[prop.name] = buildNodeFromDataAndDefinition(dataStore.getValue(prop.name), prop);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return state;
|
|
43
|
+
})
|
|
44
|
+
.addCase(actions.validateNodes, state => {
|
|
45
|
+
let hasChanged = false;
|
|
46
|
+
applyToTree(state.treeRoot, (node, path) => {
|
|
47
|
+
if (!node.rendered) {
|
|
48
|
+
return TreeMutatorResult.SKIP_DESCENDANTS;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (validateFoundNode(node, path, state)) {
|
|
52
|
+
hasChanged = true;
|
|
53
|
+
}
|
|
54
|
+
return TreeMutatorResult.CONTINUE;
|
|
55
|
+
});
|
|
56
|
+
if (hasChanged) {
|
|
57
|
+
state.rerenderTrigger++;
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
.addCase(actions.markManagedControlChangeHandled, state => {
|
|
61
|
+
state.changedByManagedControl = false;
|
|
62
|
+
})
|
|
63
|
+
.addCase(actions.commitBatchAddedProperties, state => {
|
|
64
|
+
const batch = [...state.batchAddedPropertiesThatNeedWriteThrough];
|
|
65
|
+
state.batchAddedPropertiesThatNeedWriteThrough = [];
|
|
66
|
+
for (const batchAddedProperty of batch) {
|
|
67
|
+
if (state.treeRoot.children[batchAddedProperty.name]?.rendered) {
|
|
68
|
+
writeValueToBackingDataStoreWithCorrections([batchAddedProperty.name], state, buildDefaultValueFromDefinition(batchAddedProperty));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
.addCase(actions.node.add, (state, {payload: {path, value, subtype}}) => {
|
|
73
|
+
const parentDefinition = resolveParentNodeDefinition(state.treeRoot, path);
|
|
74
|
+
if (!parentDefinition) {
|
|
75
|
+
throw new Error("Cannot add children to a node without a definition");
|
|
76
|
+
}
|
|
77
|
+
const nodeNameOrIndex = path[path.length - 1];
|
|
78
|
+
let parentDefinitionChildren: HydratedSimpleNativeProperty[] | undefined;
|
|
79
|
+
if (Array.isArray(parentDefinition.children) || parentDefinition.children === undefined) {
|
|
80
|
+
parentDefinitionChildren = parentDefinition.children;
|
|
81
|
+
} else {
|
|
82
|
+
const actualSubtype = value?.type ?? subtype;
|
|
83
|
+
if (!actualSubtype || !parentDefinition.children[actualSubtype]) {
|
|
84
|
+
throw new PathError("Unable to locate the definition of the named node because its type could not be resolved.", path);
|
|
85
|
+
}
|
|
86
|
+
parentDefinitionChildren = parentDefinition.children[actualSubtype];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (typeof nodeNameOrIndex === 'string') {
|
|
90
|
+
const definition = parentDefinitionChildren?.find(definition => definition.name === nodeNameOrIndex);
|
|
91
|
+
if (definition === undefined) {
|
|
92
|
+
throw new PathError("Unable to locate the definition of the named node.", path);
|
|
93
|
+
}
|
|
94
|
+
const data = populateValueBasedOnDefinition(value, parentDefinition);
|
|
95
|
+
const builtNode = buildNodeFromDataAndDefinition(data, definition);
|
|
96
|
+
const parentNode = walkToNode(state.treeRoot, path.slice(0, path.length - 1));
|
|
97
|
+
if (parentNode.children === undefined) {
|
|
98
|
+
parentNode.children = {[nodeNameOrIndex]: builtNode};
|
|
99
|
+
} else {
|
|
100
|
+
if (Array.isArray(parentNode.children)) {
|
|
101
|
+
throw new PathError("Encountered a node with indexed descendants while expecting one with string-keyed descendants.", path);
|
|
102
|
+
}
|
|
103
|
+
parentNode.children[nodeNameOrIndex] = builtNode;
|
|
104
|
+
}
|
|
105
|
+
writeValueToBackingDataStoreWithCorrections(path, state, data);
|
|
106
|
+
} else if (nodeNameOrIndex === undefined) {
|
|
107
|
+
throw new PathError("Encountered an undefined name in a path.", path);
|
|
108
|
+
} else {
|
|
109
|
+
const data = populateValueBasedOnDefinition(value, parentDefinition);
|
|
110
|
+
const builtNode = buildNodeFromDataAndDefinition(data, parentDefinition);
|
|
111
|
+
const parentNode = walkToNode(state.treeRoot, path.slice(0, path.length - 1));
|
|
112
|
+
if (parentNode.children === undefined) {
|
|
113
|
+
parentNode.children = [];
|
|
114
|
+
parentNode.children[nodeNameOrIndex] = builtNode;
|
|
115
|
+
} else {
|
|
116
|
+
if (!Array.isArray(parentNode.children)) {
|
|
117
|
+
throw new PathError("Encountered a node with string-keyed descendants while expecting one with indexed descendants.", path);
|
|
118
|
+
}
|
|
119
|
+
parentNode.children[nodeNameOrIndex] = builtNode;
|
|
120
|
+
}
|
|
121
|
+
writeValueToBackingDataStoreWithCorrections(path, state, data);
|
|
122
|
+
}
|
|
123
|
+
})
|
|
124
|
+
.addCase(actions.node.remove, (state, {payload: {path}}) => {
|
|
125
|
+
const parentNode = walkToNode(state.treeRoot, path.slice(0, path.length - 1));
|
|
126
|
+
removeFromParentNode(parentNode.children, path);
|
|
127
|
+
removeValueFromBackingDataStore(getDataStore(path[0], state), path);
|
|
128
|
+
})
|
|
129
|
+
.addCase(actions.node.move, (state, {payload: {path, ...action}}) => {
|
|
130
|
+
// If from and to are the same, then this is a no-op, so we can just skip it
|
|
131
|
+
if (action.from === action.to) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
state.changedByManagedControl = true;
|
|
135
|
+
moveNodeWithinParent(walkToNode(state.treeRoot, path).children, path, action);
|
|
136
|
+
const dataStore = getDataStore(path[0], state);
|
|
137
|
+
dataStore.setValue(path[0], produce(dataStore.getValue(path[0]), (dsDraft: any) => {
|
|
138
|
+
moveNodeWithinParent(walkToNodeInValue(dsDraft, path), path, action);
|
|
139
|
+
}));
|
|
140
|
+
})
|
|
141
|
+
.addCase(actions.node.write, (state, {payload: {path, value}}) => {
|
|
142
|
+
writeValueToBackingDataStoreWithCorrections(path, state, value);
|
|
143
|
+
})
|
|
144
|
+
;
|
|
145
|
+
for (const {attachTo} of Object.values(triggerHandlers)) {
|
|
146
|
+
attachTo(builder);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import {ActionReducerMapBuilder, CaseReducer, createAction, PayloadAction, PayloadActionCreator} from "@reduxjs/toolkit";
|
|
2
|
+
import type {Draft} from "immer";
|
|
3
|
+
|
|
4
|
+
import type {NodePath, RawPath} from "../simple-native-property-api";
|
|
5
|
+
import {PathError} from "../PathError";
|
|
6
|
+
import type {DCNode, DCStoreState} from "../data-controller";
|
|
7
|
+
import {buildDefaultValueFromDefinition} from "../simple-native-property-internal-shared";
|
|
8
|
+
import {resolveValueForCondition, testCondition} from "../conditions";
|
|
9
|
+
import {
|
|
10
|
+
applyToTree,
|
|
11
|
+
getDataStore,
|
|
12
|
+
getOptionalValue,
|
|
13
|
+
removeValueFromBackingDataStore,
|
|
14
|
+
TreeMutatorResult,
|
|
15
|
+
walkToNode,
|
|
16
|
+
walkToNodeInValue,
|
|
17
|
+
writeValueToBackingDataStore
|
|
18
|
+
} from "./utils";
|
|
19
|
+
|
|
20
|
+
type BasePayload = {[key in string]: any}&{type?: never, inBatch?: never};
|
|
21
|
+
type BaseMetadata = {[key in string]: any}&{inBatch?: never};
|
|
22
|
+
type BaseReducer<State, P extends BasePayload, M extends BaseMetadata> = CaseReducer<State, PayloadAction<P, string, M&{inBatch?: boolean}>>;
|
|
23
|
+
function makeTriggerHandler<State, P extends BasePayload = {}, M extends BaseMetadata = {}>(reducer: BaseReducer<State, P, M>) {
|
|
24
|
+
type ActionType = PayloadAction<P, string, M&{inBatch?: boolean}>&{meta: M&{inBatch?: boolean}};
|
|
25
|
+
type TriggeringActionCreator = PayloadActionCreator<P, string, (...args: any[]) => {payload: P, meta: M&{inBatch?: boolean}}>;
|
|
26
|
+
const triggeringActionCreators: TriggeringActionCreator[] = [];
|
|
27
|
+
const isInstance = (action: any): action is ActionType => {
|
|
28
|
+
return triggeringActionCreators.some(actionCreator => actionCreator.match(action));
|
|
29
|
+
};
|
|
30
|
+
const shouldTrigger = (action: any): action is ActionType => isInstance(action) && (action.meta.inBatch !== true);
|
|
31
|
+
return {
|
|
32
|
+
addAction: (action: TriggeringActionCreator) => triggeringActionCreators.push(action), isInstance, shouldTrigger,
|
|
33
|
+
attachTo: (builder: ActionReducerMapBuilder<State>) => builder.addMatcher(shouldTrigger, reducer)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const triggerHandlers = {
|
|
38
|
+
validation: makeTriggerHandler<DCStoreState, {path: NodePath}>((state, {payload: {path}}) => {
|
|
39
|
+
validateNode(path, state);
|
|
40
|
+
return state;
|
|
41
|
+
}),
|
|
42
|
+
conditionChecks: makeTriggerHandler<DCStoreState>(performConditionChecks),
|
|
43
|
+
changedByManagedControl: makeTriggerHandler<DCStoreState>(state => {
|
|
44
|
+
state.changedByManagedControl = true;
|
|
45
|
+
}),
|
|
46
|
+
} as const;
|
|
47
|
+
|
|
48
|
+
type CommonTriggers = {changedByManagedControl?: boolean, conditionChecks?: boolean};
|
|
49
|
+
type BaseActionMeta<ADDITIONAL_TRIGGERS extends {[K in Exclude<keyof typeof triggerHandlers, keyof CommonTriggers>]?: boolean}> = {inBatch?: boolean, triggers: CommonTriggers&ADDITIONAL_TRIGGERS};
|
|
50
|
+
|
|
51
|
+
export type GlobalActionMeta = BaseActionMeta<{}>;
|
|
52
|
+
export function createGlobalAction<P extends {[key: Exclude<string, 'type'|'inBatch'>]: any} = {}, T extends string = string>(type: T, triggers: GlobalActionMeta['triggers'] = {}) {
|
|
53
|
+
const res = createAction(type, (payload: P, inBatch: boolean = false) => ({payload, meta: {inBatch, triggers}}));
|
|
54
|
+
for (const [trigger, enabled] of Object.entries(triggers)) {
|
|
55
|
+
if (enabled) {
|
|
56
|
+
triggerHandlers[trigger as keyof typeof triggers].addAction(res);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return res;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export type PathedActionMeta = BaseActionMeta<{validation?: boolean}>;
|
|
63
|
+
export function createPathedAction<P extends {[key: Exclude<string, 'type'|'path'|'inBatch'>]: any} = {}, T extends string = string>(type: T, triggers: PathedActionMeta['triggers'] = {}) {
|
|
64
|
+
const res = createAction(type, (payload: P&{path: NodePath}, inBatch: boolean = false) => ({payload, meta: {inBatch, triggers}}));
|
|
65
|
+
for (const [trigger, enabled] of Object.entries(triggers)) {
|
|
66
|
+
if (enabled) {
|
|
67
|
+
triggerHandlers[trigger as keyof typeof triggers].addAction(res);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return res;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function validateNode(path: NodePath, draft: Draft<DCStoreState>) {
|
|
74
|
+
if (validateFoundNode(walkToNode(draft.treeRoot, path), path, draft)) {
|
|
75
|
+
draft.rerenderTrigger = draft.rerenderTrigger + 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @return true iff the validation state changed
|
|
81
|
+
*/
|
|
82
|
+
export function validateFoundNode(node: DCNode, path: NodePath, draft: Draft<DCStoreState>) {
|
|
83
|
+
const definition = node.definition;
|
|
84
|
+
if (definition) {
|
|
85
|
+
let validationError: string;
|
|
86
|
+
const value = getOptionalValue(path, draft);
|
|
87
|
+
if (definition.required && !value) {
|
|
88
|
+
validationError = `"${definition.label || definition.name}" is required.`;
|
|
89
|
+
} else {
|
|
90
|
+
validationError = definition.validator?.(value) ?? "";
|
|
91
|
+
}
|
|
92
|
+
if (node.validationError !== validationError) {
|
|
93
|
+
node.validationError = validationError;
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
type PropertyValueResolverBuilder = (path: RawPath) => (propertyPath: RawPath) => any;
|
|
101
|
+
function performConditionChecks(state: Draft<DCStoreState>) {
|
|
102
|
+
const blockClientId = state.blockClientId;
|
|
103
|
+
const propertyValueResolverBuilder: PropertyValueResolverBuilder =
|
|
104
|
+
path => propertyPath => resolveValueForCondition(propertyPath, path, blockClientId,
|
|
105
|
+
property => getDataStore(property, state, false));
|
|
106
|
+
applyToTree(state.treeRoot, (node, path) => {
|
|
107
|
+
const condition = node.condition;
|
|
108
|
+
if (condition === undefined) {
|
|
109
|
+
node.rendered = true;
|
|
110
|
+
return TreeMutatorResult.CONTINUE;
|
|
111
|
+
} else {
|
|
112
|
+
const newRendered = testCondition(condition, propertyValueResolverBuilder(path));
|
|
113
|
+
if (newRendered !== node.rendered) {
|
|
114
|
+
const dataStore = getDataStore(path[0], state);
|
|
115
|
+
let currentValue: any;
|
|
116
|
+
try {
|
|
117
|
+
currentValue = walkToNodeInValue(dataStore.getValue(path[0]), path);
|
|
118
|
+
} catch (e) {
|
|
119
|
+
if (!(e instanceof PathError)) {
|
|
120
|
+
throw e;
|
|
121
|
+
}
|
|
122
|
+
currentValue = undefined;
|
|
123
|
+
}
|
|
124
|
+
if (!newRendered) {
|
|
125
|
+
// Create a backup if we are transitioning from rendered -> unrendered
|
|
126
|
+
node.backup = currentValue;
|
|
127
|
+
removeValueFromBackingDataStore(dataStore, path);
|
|
128
|
+
} else if (currentValue === undefined) {
|
|
129
|
+
// Restore from backup if we are transitioning from unrendered -> rendered
|
|
130
|
+
const stateNode = walkToNode(state.treeRoot, path);
|
|
131
|
+
writeValueToBackingDataStore(dataStore, path, stateNode.backup ?? buildDefaultValueFromDefinition(stateNode.definition));
|
|
132
|
+
}
|
|
133
|
+
node.rendered = newRendered;
|
|
134
|
+
}
|
|
135
|
+
return node.rendered ? TreeMutatorResult.CONTINUE : TreeMutatorResult.SKIP_DESCENDANTS;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|