@bluprynt/forms-viewer 1.0.0 → 3.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.
- package/dist/index.cjs +24 -9
- package/dist/index.d.cts +11 -5
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +11 -5
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +23 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -4,6 +4,7 @@ let react = require("react");
|
|
|
4
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
5
|
//#region src/constants.ts
|
|
6
6
|
const ROOT = Symbol("ROOT");
|
|
7
|
+
const DEFAULT = Symbol("DEFAULT");
|
|
7
8
|
//#endregion
|
|
8
9
|
//#region src/form-context.tsx
|
|
9
10
|
const FormContext = (0, react.createContext)(void 0);
|
|
@@ -246,15 +247,16 @@ const FormContent = (props) => {
|
|
|
246
247
|
components: props.components,
|
|
247
248
|
showInlineValidation
|
|
248
249
|
};
|
|
249
|
-
|
|
250
|
+
const selectedSection = section === DEFAULT ? resolveDefaultSection(items, visibilityMap) : section;
|
|
251
|
+
if (selectedSection === void 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FormItems, {
|
|
250
252
|
items,
|
|
251
253
|
...sharedProps
|
|
252
254
|
});
|
|
253
|
-
if (
|
|
255
|
+
if (selectedSection === ROOT) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FormItems, {
|
|
254
256
|
items: items.filter((item) => item.type !== "section"),
|
|
255
257
|
...sharedProps
|
|
256
258
|
});
|
|
257
|
-
const foundSection = findSection(items,
|
|
259
|
+
const foundSection = findSection(items, selectedSection);
|
|
258
260
|
if (!foundSection || !visibilityMap.get(foundSection.id)) return null;
|
|
259
261
|
const Section = props.components.section;
|
|
260
262
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Section, {
|
|
@@ -265,6 +267,10 @@ const FormContent = (props) => {
|
|
|
265
267
|
})
|
|
266
268
|
}, foundSection.id);
|
|
267
269
|
};
|
|
270
|
+
const resolveDefaultSection = (items, visibilityMap) => {
|
|
271
|
+
if (items.filter((item) => item.type !== "section").some((item) => visibilityMap.get(item.id))) return ROOT;
|
|
272
|
+
return items.find((item) => item.type === "section" && visibilityMap.get(item.id) !== false)?.id;
|
|
273
|
+
};
|
|
268
274
|
//#endregion
|
|
269
275
|
//#region src/form-editor.tsx
|
|
270
276
|
const FormEditor = ({ components, onChange }) => {
|
|
@@ -416,10 +422,10 @@ const FormFieldsValidation = ({ container: ContainerComponent, field: FieldCompo
|
|
|
416
422
|
}, group.field?.id)) });
|
|
417
423
|
};
|
|
418
424
|
//#endregion
|
|
419
|
-
//#region src/form-sections.
|
|
420
|
-
const
|
|
421
|
-
const { definition,
|
|
422
|
-
|
|
425
|
+
//#region src/use-form-sections.ts
|
|
426
|
+
const useFormSections = (defaultSectionTitle = "General", defaultSectionDescription) => {
|
|
427
|
+
const { definition, visibilityMap, data } = useFormContext();
|
|
428
|
+
return (0, react.useMemo)(() => {
|
|
423
429
|
if (!definition) return [];
|
|
424
430
|
const result = [];
|
|
425
431
|
const rootFields = definition.content.filter((item) => item.type !== "section");
|
|
@@ -442,10 +448,17 @@ const FormSections = ({ container: Container, item: Item, defaultSectionTitle =
|
|
|
442
448
|
defaultSectionTitle,
|
|
443
449
|
defaultSectionDescription
|
|
444
450
|
]);
|
|
451
|
+
};
|
|
452
|
+
//#endregion
|
|
453
|
+
//#region src/form-sections.tsx
|
|
454
|
+
const FormSections = ({ container: Container, item: Item, defaultSectionTitle, defaultSectionDescription, onSelect }) => {
|
|
455
|
+
const { definition, data, documentErrors, section } = useFormContext();
|
|
456
|
+
const entries = useFormSections(defaultSectionTitle, defaultSectionDescription);
|
|
445
457
|
if (!definition || !data || documentErrors && documentErrors.length > 0) return null;
|
|
446
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Container, { children: entries.map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Item, {
|
|
458
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Container, { children: entries.map((entry, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Item, {
|
|
459
|
+
index,
|
|
447
460
|
section: entry,
|
|
448
|
-
active: entry.id === section,
|
|
461
|
+
active: section === DEFAULT ? index === 0 : entry.id === section,
|
|
449
462
|
select: () => onSelect?.(entry.id)
|
|
450
463
|
}, entry.id === ROOT ? "root" : String(entry.id))) });
|
|
451
464
|
};
|
|
@@ -466,6 +479,7 @@ const FormViewer = ({ components }) => {
|
|
|
466
479
|
});
|
|
467
480
|
};
|
|
468
481
|
//#endregion
|
|
482
|
+
exports.DEFAULT = DEFAULT;
|
|
469
483
|
Object.defineProperty(exports, "DocumentError", {
|
|
470
484
|
enumerable: true,
|
|
471
485
|
get: function() {
|
|
@@ -486,3 +500,4 @@ Object.defineProperty(exports, "FormValuesEditor", {
|
|
|
486
500
|
exports.FormViewer = FormViewer;
|
|
487
501
|
exports.ROOT = ROOT;
|
|
488
502
|
exports.useFormContext = useFormContext;
|
|
503
|
+
exports.useFormSections = useFormSections;
|
package/dist/index.d.cts
CHANGED
|
@@ -4,6 +4,8 @@ import { ComponentType, FC, PropsWithChildren, ReactNode } from "react";
|
|
|
4
4
|
//#region src/constants.d.ts
|
|
5
5
|
declare const ROOT: unique symbol;
|
|
6
6
|
type ROOT = typeof ROOT;
|
|
7
|
+
declare const DEFAULT: unique symbol;
|
|
8
|
+
type DEFAULT = typeof DEFAULT;
|
|
7
9
|
//#endregion
|
|
8
10
|
//#region src/form-context.d.ts
|
|
9
11
|
type FormContextValue = {
|
|
@@ -14,14 +16,14 @@ type FormContextValue = {
|
|
|
14
16
|
validation: FormValidationResult$1 | undefined;
|
|
15
17
|
documentErrors: readonly DocumentValidationError$1[] | undefined;
|
|
16
18
|
fieldErrors: Map<number, FieldValidationError$1[]>;
|
|
17
|
-
section: typeof ROOT | number | undefined;
|
|
19
|
+
section: typeof ROOT | typeof DEFAULT | number | undefined;
|
|
18
20
|
showInlineValidation: boolean;
|
|
19
21
|
};
|
|
20
22
|
declare const useFormContext: () => FormContextValue;
|
|
21
23
|
type FormProps = {
|
|
22
24
|
definition?: FormDefinition$1;
|
|
23
25
|
data?: FormDocument$1;
|
|
24
|
-
section?: typeof ROOT | number;
|
|
26
|
+
section?: typeof ROOT | typeof DEFAULT | number;
|
|
25
27
|
showInlineValidation?: boolean;
|
|
26
28
|
children: ReactNode;
|
|
27
29
|
};
|
|
@@ -166,11 +168,15 @@ type FormFieldsValidationProps = {
|
|
|
166
168
|
};
|
|
167
169
|
declare const FormFieldsValidation: FC<FormFieldsValidationProps>;
|
|
168
170
|
//#endregion
|
|
169
|
-
//#region src/form-sections.d.ts
|
|
171
|
+
//#region src/use-form-sections.d.ts
|
|
170
172
|
type FormSectionEntry = Omit<SectionContentItem$1, 'id' | 'type'> & {
|
|
171
173
|
id: typeof ROOT | number;
|
|
172
174
|
};
|
|
175
|
+
declare const useFormSections: (defaultSectionTitle?: string, defaultSectionDescription?: string) => FormSectionEntry[];
|
|
176
|
+
//#endregion
|
|
177
|
+
//#region src/form-sections.d.ts
|
|
173
178
|
type FormSectionItemProps = {
|
|
179
|
+
index: number;
|
|
174
180
|
section: FormSectionEntry;
|
|
175
181
|
active: boolean;
|
|
176
182
|
select: () => void;
|
|
@@ -180,7 +186,7 @@ type FormSectionsProps = {
|
|
|
180
186
|
item: ComponentType<FormSectionItemProps>;
|
|
181
187
|
defaultSectionTitle?: string;
|
|
182
188
|
defaultSectionDescription?: string;
|
|
183
|
-
onSelect?: (id: typeof ROOT | number) => void;
|
|
189
|
+
onSelect?: (id: typeof ROOT | typeof DEFAULT | number) => void;
|
|
184
190
|
};
|
|
185
191
|
declare const FormSections: FC<FormSectionsProps>;
|
|
186
192
|
//#endregion
|
|
@@ -190,5 +196,5 @@ type FormViewerProps = {
|
|
|
190
196
|
};
|
|
191
197
|
declare const FormViewer: FC<FormViewerProps>;
|
|
192
198
|
//#endregion
|
|
193
|
-
export { type ArrayEditProps, type ArrayItemDef, type ArrayViewProps, type BaseEditFieldProps, type BaseViewFieldProps, type BooleanEditProps, type BooleanViewProps, type ContentItem, type DateEditProps, type DateViewProps, DocumentError, type DocumentValidationError, type DocumentValidationErrorCode, type EditorArrayItemProps, type EditorComponentMap, type EditorFieldProps, type ErrorProps, type FieldContentItem, type FieldEntry, type FieldType, type FieldValidationError, type FieldValidationFieldEntry, type FileEditProps, type FileValue, type FileViewProps, Form, type FormDefinition, type FormDocument, FormDocumentValidation, FormEditor, FormFieldsValidation, type FormSectionEntry, type FormSectionItemProps, FormSections, type FormSnapshot, type FormValidationResult, type FormValues, FormValuesEditor, FormViewer, type NumberEditProps, type NumberViewProps, ROOT, type SectionContentItem, type SectionEditProps, type SectionViewProps, type SelectEditProps, type SelectOption, type SelectViewProps, type StringEditProps, type StringViewProps, type ViewerComponentMap, useFormContext };
|
|
199
|
+
export { type ArrayEditProps, type ArrayItemDef, type ArrayViewProps, type BaseEditFieldProps, type BaseViewFieldProps, type BooleanEditProps, type BooleanViewProps, type ContentItem, DEFAULT, type DateEditProps, type DateViewProps, DocumentError, type DocumentValidationError, type DocumentValidationErrorCode, type EditorArrayItemProps, type EditorComponentMap, type EditorFieldProps, type ErrorProps, type FieldContentItem, type FieldEntry, type FieldType, type FieldValidationError, type FieldValidationFieldEntry, type FileEditProps, type FileValue, type FileViewProps, Form, type FormDefinition, type FormDocument, FormDocumentValidation, FormEditor, FormFieldsValidation, type FormSectionEntry, type FormSectionItemProps, FormSections, type FormSnapshot, type FormValidationResult, type FormValues, FormValuesEditor, FormViewer, type NumberEditProps, type NumberViewProps, ROOT, type SectionContentItem, type SectionEditProps, type SectionViewProps, type SelectEditProps, type SelectOption, type SelectViewProps, type StringEditProps, type StringViewProps, type ViewerComponentMap, useFormContext, useFormSections };
|
|
194
200
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/constants.ts","../src/form-context.tsx","../src/form-document-validation.tsx","../src/types/base.ts","../src/types/editor.ts","../src/types/viewer.ts","../src/form-editor.tsx","../src/form-fields-validation.tsx","../src/form-sections.tsx","../src/form-viewer.tsx"],"mappings":";;;;cAAa,IAAA;AAAA,KACD,IAAA,UAAc,IAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/constants.ts","../src/form-context.tsx","../src/form-document-validation.tsx","../src/types/base.ts","../src/types/editor.ts","../src/types/viewer.ts","../src/form-editor.tsx","../src/form-fields-validation.tsx","../src/use-form-sections.ts","../src/form-sections.tsx","../src/form-viewer.tsx"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -4,6 +4,8 @@ import { ComponentType, FC, PropsWithChildren, ReactNode } from "react";
|
|
|
4
4
|
//#region src/constants.d.ts
|
|
5
5
|
declare const ROOT: unique symbol;
|
|
6
6
|
type ROOT = typeof ROOT;
|
|
7
|
+
declare const DEFAULT: unique symbol;
|
|
8
|
+
type DEFAULT = typeof DEFAULT;
|
|
7
9
|
//#endregion
|
|
8
10
|
//#region src/form-context.d.ts
|
|
9
11
|
type FormContextValue = {
|
|
@@ -14,14 +16,14 @@ type FormContextValue = {
|
|
|
14
16
|
validation: FormValidationResult$1 | undefined;
|
|
15
17
|
documentErrors: readonly DocumentValidationError$1[] | undefined;
|
|
16
18
|
fieldErrors: Map<number, FieldValidationError$1[]>;
|
|
17
|
-
section: typeof ROOT | number | undefined;
|
|
19
|
+
section: typeof ROOT | typeof DEFAULT | number | undefined;
|
|
18
20
|
showInlineValidation: boolean;
|
|
19
21
|
};
|
|
20
22
|
declare const useFormContext: () => FormContextValue;
|
|
21
23
|
type FormProps = {
|
|
22
24
|
definition?: FormDefinition$1;
|
|
23
25
|
data?: FormDocument$1;
|
|
24
|
-
section?: typeof ROOT | number;
|
|
26
|
+
section?: typeof ROOT | typeof DEFAULT | number;
|
|
25
27
|
showInlineValidation?: boolean;
|
|
26
28
|
children: ReactNode;
|
|
27
29
|
};
|
|
@@ -166,11 +168,15 @@ type FormFieldsValidationProps = {
|
|
|
166
168
|
};
|
|
167
169
|
declare const FormFieldsValidation: FC<FormFieldsValidationProps>;
|
|
168
170
|
//#endregion
|
|
169
|
-
//#region src/form-sections.d.ts
|
|
171
|
+
//#region src/use-form-sections.d.ts
|
|
170
172
|
type FormSectionEntry = Omit<SectionContentItem$1, 'id' | 'type'> & {
|
|
171
173
|
id: typeof ROOT | number;
|
|
172
174
|
};
|
|
175
|
+
declare const useFormSections: (defaultSectionTitle?: string, defaultSectionDescription?: string) => FormSectionEntry[];
|
|
176
|
+
//#endregion
|
|
177
|
+
//#region src/form-sections.d.ts
|
|
173
178
|
type FormSectionItemProps = {
|
|
179
|
+
index: number;
|
|
174
180
|
section: FormSectionEntry;
|
|
175
181
|
active: boolean;
|
|
176
182
|
select: () => void;
|
|
@@ -180,7 +186,7 @@ type FormSectionsProps = {
|
|
|
180
186
|
item: ComponentType<FormSectionItemProps>;
|
|
181
187
|
defaultSectionTitle?: string;
|
|
182
188
|
defaultSectionDescription?: string;
|
|
183
|
-
onSelect?: (id: typeof ROOT | number) => void;
|
|
189
|
+
onSelect?: (id: typeof ROOT | typeof DEFAULT | number) => void;
|
|
184
190
|
};
|
|
185
191
|
declare const FormSections: FC<FormSectionsProps>;
|
|
186
192
|
//#endregion
|
|
@@ -190,5 +196,5 @@ type FormViewerProps = {
|
|
|
190
196
|
};
|
|
191
197
|
declare const FormViewer: FC<FormViewerProps>;
|
|
192
198
|
//#endregion
|
|
193
|
-
export { type ArrayEditProps, type ArrayItemDef, type ArrayViewProps, type BaseEditFieldProps, type BaseViewFieldProps, type BooleanEditProps, type BooleanViewProps, type ContentItem, type DateEditProps, type DateViewProps, DocumentError, type DocumentValidationError, type DocumentValidationErrorCode, type EditorArrayItemProps, type EditorComponentMap, type EditorFieldProps, type ErrorProps, type FieldContentItem, type FieldEntry, type FieldType, type FieldValidationError, type FieldValidationFieldEntry, type FileEditProps, type FileValue, type FileViewProps, Form, type FormDefinition, type FormDocument, FormDocumentValidation, FormEditor, FormFieldsValidation, type FormSectionEntry, type FormSectionItemProps, FormSections, type FormSnapshot, type FormValidationResult, type FormValues, FormValuesEditor, FormViewer, type NumberEditProps, type NumberViewProps, ROOT, type SectionContentItem, type SectionEditProps, type SectionViewProps, type SelectEditProps, type SelectOption, type SelectViewProps, type StringEditProps, type StringViewProps, type ViewerComponentMap, useFormContext };
|
|
199
|
+
export { type ArrayEditProps, type ArrayItemDef, type ArrayViewProps, type BaseEditFieldProps, type BaseViewFieldProps, type BooleanEditProps, type BooleanViewProps, type ContentItem, DEFAULT, type DateEditProps, type DateViewProps, DocumentError, type DocumentValidationError, type DocumentValidationErrorCode, type EditorArrayItemProps, type EditorComponentMap, type EditorFieldProps, type ErrorProps, type FieldContentItem, type FieldEntry, type FieldType, type FieldValidationError, type FieldValidationFieldEntry, type FileEditProps, type FileValue, type FileViewProps, Form, type FormDefinition, type FormDocument, FormDocumentValidation, FormEditor, FormFieldsValidation, type FormSectionEntry, type FormSectionItemProps, FormSections, type FormSnapshot, type FormValidationResult, type FormValues, FormValuesEditor, FormViewer, type NumberEditProps, type NumberViewProps, ROOT, type SectionContentItem, type SectionEditProps, type SectionViewProps, type SelectEditProps, type SelectOption, type SelectViewProps, type StringEditProps, type StringViewProps, type ViewerComponentMap, useFormContext, useFormSections };
|
|
194
200
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/constants.ts","../src/form-context.tsx","../src/form-document-validation.tsx","../src/types/base.ts","../src/types/editor.ts","../src/types/viewer.ts","../src/form-editor.tsx","../src/form-fields-validation.tsx","../src/form-sections.tsx","../src/form-viewer.tsx"],"mappings":";;;;cAAa,IAAA;AAAA,KACD,IAAA,UAAc,IAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/constants.ts","../src/form-context.tsx","../src/form-document-validation.tsx","../src/types/base.ts","../src/types/editor.ts","../src/types/viewer.ts","../src/form-editor.tsx","../src/form-fields-validation.tsx","../src/use-form-sections.ts","../src/form-sections.tsx","../src/form-viewer.tsx"],"mappings":";;;;cAAa,IAAA;AAAA,KACD,IAAA,UAAc,IAAA;AAAA,cAEb,OAAA;AAAA,KACD,OAAA,UAAiB,OAAA;;;KCUxB,gBAAA;EACD,UAAA,EAAY,gBAAA;EACZ,IAAA,EAAM,cAAA;EACN,MAAA,EAAQ,UAAA;EACR,aAAA,EAAe,GAAA;EACf,UAAA,EAAY,sBAAA;EACZ,cAAA,WAAyB,yBAAA;EACzB,WAAA,EAAa,GAAA,SAAY,sBAAA;EACzB,OAAA,SAAgB,IAAA,UAAc,OAAA;EAC9B,oBAAA;AAAA;AAAA,cAKS,cAAA,QAAqB,gBAAA;AAAA,KAO7B,SAAA;EACD,UAAA,GAAa,gBAAA;EACb,IAAA,GAAO,cAAA;EACP,OAAA,UAAiB,IAAA,UAAc,OAAA;EAC/B,oBAAA;EACA,QAAA,EAAU,SAAA;AAAA;AAAA,cAGD,IAAA,EAAM,EAAA,CAAG,SAAA;;;KCrCjB,2BAAA;EACD,SAAA,EAAW,aAAA,CAAc,iBAAA;EACzB,KAAA,EAAO,aAAA,CAAc,yBAAA;AAAA;AAAA,cAGZ,sBAAA,EAAwB,EAAA,CAAG,2BAAA;;;KCT5B,kBAAA;EACR,KAAA,EAAO,kBAAA;EACP,MAAA,EAAQ,sBAAA;AAAA;AAAA,KAGA,kBAAA,GAAqB,kBAAA;EAC7B,QAAA,GAAW,KAAA;AAAA;AAAA,KAGH,UAAA;EACR,MAAA,EAAQ,sBAAA;EACR,KAAA,EAAO,kBAAA;AAAA;;;KCPC,eAAA,GAAkB,kBAAA;EAC1B,KAAA;EACA,QAAA,GAAW,KAAA;AAAA;AAAA,KAGH,eAAA,GAAkB,kBAAA;EAC1B,KAAA;EACA,QAAA,GAAW,KAAA;AAAA;AAAA,KAGH,gBAAA,GAAmB,kBAAA;EAC3B,KAAA;EACA,QAAA,GAAW,KAAA;AAAA;AAAA,KAGH,aAAA,GAAgB,kBAAA;EACxB,KAAA;EACA,QAAA,GAAW,KAAA;AAAA;AAAA,KAGH,eAAA,GAAkB,kBAAA;EAC1B,KAAA;EACA,OAAA,EAAS,cAAA;EACT,QAAA,GAAW,KAAA;AAAA;AAAA,KAGH,cAAA,GAAiB,kBAAA;EACzB,KAAA;EACA,OAAA,EAAS,cAAA;EACT,QAAA,EAAU,SAAA;EACV,SAAA;EACA,YAAA,GAAe,KAAA;EACf,UAAA,GAAa,SAAA,UAAmB,OAAA;AAAA;AAAA,KAGxB,aAAA,GAAgB,kBAAA;EACxB,KAAA,EAAO,WAAA;EACP,QAAA,GAAW,KAAA,EAAO,WAAA;AAAA;AAAA,KAGV,gBAAA;EACR,OAAA,EAAS,oBAAA;EACT,QAAA,EAAU,SAAA;AAAA;AAAA,KAGF,kBAAA;EACR,MAAA,EAAQ,aAAA,CAAc,eAAA;EACtB,MAAA,EAAQ,aAAA,CAAc,eAAA;EACtB,OAAA,EAAS,aAAA,CAAc,gBAAA;EACvB,IAAA,EAAM,aAAA,CAAc,aAAA;EACpB,MAAA,EAAQ,aAAA,CAAc,eAAA;EACtB,KAAA,EAAO,aAAA,CAAc,cAAA;EACrB,IAAA,EAAM,aAAA,CAAc,aAAA;EACpB,OAAA,EAAS,aAAA,CAAc,gBAAA;EACvB,KAAA,GAAQ,aAAA,CAAc,UAAA;AAAA;AAAA,KAGd,gBAAA;EACR,QAAA,GAAW,KAAA;EACX,SAAA;EACA,YAAA,IAAgB,KAAA;EAChB,UAAA,IAAc,SAAA,UAAmB,OAAA;AAAA;AAAA,KAGzB,oBAAA;EACR,QAAA,GAAW,KAAA;AAAA;;;KCjEH,eAAA,GAAkB,kBAAA;EAC1B,KAAA;AAAA;AAAA,KAGQ,eAAA,GAAkB,kBAAA;EAC1B,KAAA;AAAA;AAAA,KAGQ,gBAAA,GAAmB,kBAAA;EAC3B,KAAA;AAAA;AAAA,KAGQ,aAAA,GAAgB,kBAAA;EACxB,KAAA;AAAA;AAAA,KAGQ,eAAA,GAAkB,kBAAA;EAC1B,KAAA;EACA,OAAA,EAAS,cAAA;AAAA;AAAA,KAGD,cAAA,GAAiB,kBAAA;EACzB,KAAA;EACA,OAAA,EAAS,cAAA;EACT,QAAA,EAAU,SAAA;AAAA;AAAA,KAGF,aAAA,GAAgB,kBAAA;EACxB,KAAA,EAAO,WAAA;AAAA;AAAA,KAGC,gBAAA;EACR,OAAA,EAAS,oBAAA;EACT,QAAA,EAAU,SAAA;AAAA;AAAA,KAGF,kBAAA;EACR,MAAA,EAAQ,aAAA,CAAc,eAAA;EACtB,MAAA,EAAQ,aAAA,CAAc,eAAA;EACtB,OAAA,EAAS,aAAA,CAAc,gBAAA;EACvB,IAAA,EAAM,aAAA,CAAc,aAAA;EACpB,MAAA,EAAQ,aAAA,CAAc,eAAA;EACtB,KAAA,EAAO,aAAA,CAAc,cAAA;EACrB,IAAA,EAAM,aAAA,CAAc,aAAA;EACpB,OAAA,EAAS,aAAA,CAAc,gBAAA;EACvB,KAAA,GAAQ,aAAA,CAAc,UAAA;AAAA;;;KC3CrB,eAAA;EACD,UAAA,EAAY,kBAAA;EACZ,QAAA,GAAW,IAAA,EAAM,cAAA,EAAc,UAAA,EAAY,sBAAA;AAAA;AAAA,cAGlC,UAAA,EAAY,EAAA,CAAG,eAAA;;;KCPhB,yBAAA;EACR,KAAA,EAAO,YAAA;EACP,MAAA,EAAQ,sBAAA;AAAA;AAAA,KAGP,yBAAA;EACD,SAAA,EAAW,aAAA,CAAc,iBAAA;EACzB,KAAA,EAAO,aAAA,CAAc,iBAAA,CAAkB,yBAAA;EACvC,KAAA,EAAO,aAAA,CAAc,sBAAA;AAAA;AAAA,cAGZ,oBAAA,EAAsB,EAAA,CAAG,yBAAA;;;KCV1B,gBAAA,GAAmB,IAAA,CAAK,oBAAA;EAChC,EAAA,SAAW,IAAA;AAAA;AAAA,cAGF,eAAA,GACT,mBAAA,WACA,yBAAA,cACD,gBAAA;;;KCNS,oBAAA;EACR,KAAA;EACA,OAAA,EAAS,gBAAA;EACT,MAAA;EACA,MAAA;AAAA;AAAA,KAGC,iBAAA;EACD,SAAA,EAAW,aAAA,CAAc,iBAAA;EACzB,IAAA,EAAM,aAAA,CAAc,oBAAA;EACpB,mBAAA;EACA,yBAAA;EACA,QAAA,IAAY,EAAA,SAAW,IAAA,UAAc,OAAA;AAAA;AAAA,cAG5B,YAAA,EAAc,EAAA,CAAG,iBAAA;;;KCjBzB,eAAA;EACD,UAAA,EAAY,kBAAA;AAAA;AAAA,cAGH,UAAA,EAAY,EAAA,CAAG,eAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import { Fragment, createContext, useCallback, useContext, useMemo, useRef } fro
|
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
//#region src/constants.ts
|
|
5
5
|
const ROOT = Symbol("ROOT");
|
|
6
|
+
const DEFAULT = Symbol("DEFAULT");
|
|
6
7
|
//#endregion
|
|
7
8
|
//#region src/form-context.tsx
|
|
8
9
|
const FormContext = createContext(void 0);
|
|
@@ -245,15 +246,16 @@ const FormContent = (props) => {
|
|
|
245
246
|
components: props.components,
|
|
246
247
|
showInlineValidation
|
|
247
248
|
};
|
|
248
|
-
|
|
249
|
+
const selectedSection = section === DEFAULT ? resolveDefaultSection(items, visibilityMap) : section;
|
|
250
|
+
if (selectedSection === void 0) return /* @__PURE__ */ jsx(FormItems, {
|
|
249
251
|
items,
|
|
250
252
|
...sharedProps
|
|
251
253
|
});
|
|
252
|
-
if (
|
|
254
|
+
if (selectedSection === ROOT) return /* @__PURE__ */ jsx(FormItems, {
|
|
253
255
|
items: items.filter((item) => item.type !== "section"),
|
|
254
256
|
...sharedProps
|
|
255
257
|
});
|
|
256
|
-
const foundSection = findSection(items,
|
|
258
|
+
const foundSection = findSection(items, selectedSection);
|
|
257
259
|
if (!foundSection || !visibilityMap.get(foundSection.id)) return null;
|
|
258
260
|
const Section = props.components.section;
|
|
259
261
|
return /* @__PURE__ */ jsx(Section, {
|
|
@@ -264,6 +266,10 @@ const FormContent = (props) => {
|
|
|
264
266
|
})
|
|
265
267
|
}, foundSection.id);
|
|
266
268
|
};
|
|
269
|
+
const resolveDefaultSection = (items, visibilityMap) => {
|
|
270
|
+
if (items.filter((item) => item.type !== "section").some((item) => visibilityMap.get(item.id))) return ROOT;
|
|
271
|
+
return items.find((item) => item.type === "section" && visibilityMap.get(item.id) !== false)?.id;
|
|
272
|
+
};
|
|
267
273
|
//#endregion
|
|
268
274
|
//#region src/form-editor.tsx
|
|
269
275
|
const FormEditor = ({ components, onChange }) => {
|
|
@@ -415,10 +421,10 @@ const FormFieldsValidation = ({ container: ContainerComponent, field: FieldCompo
|
|
|
415
421
|
}, group.field?.id)) });
|
|
416
422
|
};
|
|
417
423
|
//#endregion
|
|
418
|
-
//#region src/form-sections.
|
|
419
|
-
const
|
|
420
|
-
const { definition,
|
|
421
|
-
|
|
424
|
+
//#region src/use-form-sections.ts
|
|
425
|
+
const useFormSections = (defaultSectionTitle = "General", defaultSectionDescription) => {
|
|
426
|
+
const { definition, visibilityMap, data } = useFormContext();
|
|
427
|
+
return useMemo(() => {
|
|
422
428
|
if (!definition) return [];
|
|
423
429
|
const result = [];
|
|
424
430
|
const rootFields = definition.content.filter((item) => item.type !== "section");
|
|
@@ -441,10 +447,17 @@ const FormSections = ({ container: Container, item: Item, defaultSectionTitle =
|
|
|
441
447
|
defaultSectionTitle,
|
|
442
448
|
defaultSectionDescription
|
|
443
449
|
]);
|
|
450
|
+
};
|
|
451
|
+
//#endregion
|
|
452
|
+
//#region src/form-sections.tsx
|
|
453
|
+
const FormSections = ({ container: Container, item: Item, defaultSectionTitle, defaultSectionDescription, onSelect }) => {
|
|
454
|
+
const { definition, data, documentErrors, section } = useFormContext();
|
|
455
|
+
const entries = useFormSections(defaultSectionTitle, defaultSectionDescription);
|
|
444
456
|
if (!definition || !data || documentErrors && documentErrors.length > 0) return null;
|
|
445
|
-
return /* @__PURE__ */ jsx(Container, { children: entries.map((entry) => /* @__PURE__ */ jsx(Item, {
|
|
457
|
+
return /* @__PURE__ */ jsx(Container, { children: entries.map((entry, index) => /* @__PURE__ */ jsx(Item, {
|
|
458
|
+
index,
|
|
446
459
|
section: entry,
|
|
447
|
-
active: entry.id === section,
|
|
460
|
+
active: section === DEFAULT ? index === 0 : entry.id === section,
|
|
448
461
|
select: () => onSelect?.(entry.id)
|
|
449
462
|
}, entry.id === ROOT ? "root" : String(entry.id))) });
|
|
450
463
|
};
|
|
@@ -465,6 +478,6 @@ const FormViewer = ({ components }) => {
|
|
|
465
478
|
});
|
|
466
479
|
};
|
|
467
480
|
//#endregion
|
|
468
|
-
export { DocumentError, Form, FormDocumentValidation, FormEditor, FormFieldsValidation, FormSections, FormValuesEditor, FormViewer, ROOT, useFormContext };
|
|
481
|
+
export { DEFAULT, DocumentError, Form, FormDocumentValidation, FormEditor, FormFieldsValidation, FormSections, FormValuesEditor, FormViewer, ROOT, useFormContext, useFormSections };
|
|
469
482
|
|
|
470
483
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["DocumentError"],"sources":["../src/constants.ts","../src/form-context.tsx","../src/form-document-validation.tsx","../src/form/utils.ts","../src/form/form-items.tsx","../src/form/form-content.tsx","../src/form-editor.tsx","../src/form-fields-validation.tsx","../src/form-sections.tsx","../src/form-viewer.tsx"],"sourcesContent":["export const ROOT: unique symbol = Symbol('ROOT')\nexport type ROOT = typeof ROOT\n","import { createContext, type FC, type ReactNode, useContext, useMemo } from 'react'\n\nimport {\n DocumentError,\n DocumentValidationError,\n FieldValidationError,\n FormDefinition,\n FormDocument,\n FormEngine,\n FormValidationResult,\n} from '@bluprynt/forms-core'\n\nimport type { ROOT } from './constants'\n\ntype FormContextValue = {\n definition: FormDefinition | undefined\n data: FormDocument | undefined\n engine: FormEngine | undefined\n visibilityMap: Map<number, boolean>\n validation: FormValidationResult | undefined\n documentErrors: readonly DocumentValidationError[] | undefined\n fieldErrors: Map<number, FieldValidationError[]>\n section: typeof ROOT | number | undefined\n showInlineValidation: boolean\n}\n\nconst FormContext = createContext<FormContextValue | undefined>(undefined)\n\nexport const useFormContext = (): FormContextValue => {\n const context = useContext(FormContext)\n if (!context) throw new Error('useFormContext must be used within a <Form> provider')\n\n return context\n}\n\ntype FormProps = {\n definition?: FormDefinition\n data?: FormDocument\n section?: typeof ROOT | number\n showInlineValidation?: boolean\n children: ReactNode\n}\n\nexport const Form: FC<FormProps> = ({ definition, data, section, showInlineValidation = true, children }) => {\n const { engine, documentErrors: definitionErrors } = useMemo(() => {\n if (!definition) return {}\n\n try {\n return { engine: new FormEngine(definition) }\n } catch (error) {\n if (error instanceof DocumentError) return { documentErrors: error.errors }\n throw error\n }\n }, [definition])\n\n const { visibilityMap, validation, documentErrors, fieldErrors } = useMemo(() => {\n const visibilityMap = engine && data ? engine.getVisibilityMap(data) : new Map<number, boolean>()\n const validation =\n engine && data\n ? engine.validate(data)\n : ({\n valid: true,\n fieldErrors: new Map<number, FieldValidationError[]>(),\n } satisfies FormValidationResult)\n\n return {\n visibilityMap,\n validation,\n documentErrors: [...(definitionErrors ?? []), ...(validation?.documentErrors ?? [])],\n fieldErrors: validation?.fieldErrors ?? new Map<number, FieldValidationError[]>(),\n } as const\n }, [engine, data, definitionErrors])\n\n const value: FormContextValue = {\n definition,\n data,\n engine,\n visibilityMap,\n validation,\n documentErrors,\n fieldErrors,\n section,\n showInlineValidation,\n } as const\n\n return <FormContext.Provider value={value}>{children}</FormContext.Provider>\n}\n","import type { ComponentType, FC, PropsWithChildren } from 'react'\n\nimport type { DocumentValidationError } from '@bluprynt/forms-core'\n\nimport { useFormContext } from './form-context'\n\ntype FormDocumentValidationProps = {\n container: ComponentType<PropsWithChildren>\n error: ComponentType<DocumentValidationError>\n}\n\nexport const FormDocumentValidation: FC<FormDocumentValidationProps> = ({\n container: ContainerComponent,\n error: ErrorComponent,\n}) => {\n const { documentErrors } = useFormContext()\n\n if (!documentErrors?.length) return null\n\n return (\n <ContainerComponent>\n {documentErrors.map((error, index) => (\n <ErrorComponent\n // biome-ignore lint/suspicious/noArrayIndexKey: index is unique in array\n key={`error-${error.code}-${error.itemId ?? ''}-${index}`}\n {...error}\n />\n ))}\n </ContainerComponent>\n )\n}\n","import type {\n ArrayItemDef,\n ContentItem,\n FieldContentItem,\n FieldType,\n FieldValidationError,\n SectionContentItem,\n} from '@bluprynt/forms-core'\n\n/**\n * Retrieves validation errors for a specific field from the pre-indexed error map.\n *\n * Uses O(1) map lookup by `fieldId`. When `itemIndex` is omitted, returns only\n * **field-level** errors (those without an `itemIndex`). When `itemIndex` is\n * provided, returns only **item-level** errors matching the given array item index.\n *\n * @param fieldErrors - Map from field id to its validation errors.\n * @param fieldId - The numeric ID of the field to retrieve errors for.\n * @param itemIndex - Optional zero-based index of the array item. When omitted, only\n * field-level errors (where `itemIndex` is `null` / `undefined`) are returned.\n * @returns Errors for the given field (and optionally item index). Empty array if none.\n *\n * @example\n * ```ts\n * // Field-level errors only (no itemIndex on the error)\n * getFieldErrors(fieldErrors, 5)\n *\n * // Errors for the third item of array field 5\n * getFieldErrors(fieldErrors, 5, 2)\n * ```\n */\nexport const getFieldErrors = (\n fieldErrors: Map<number, FieldValidationError[]>,\n fieldId: number,\n itemIndex?: number,\n): FieldValidationError[] => {\n const errors = fieldErrors.get(fieldId) ?? []\n if (itemIndex === undefined) return errors.filter((e) => e.itemIndex == null)\n return errors.filter((e) => e.itemIndex === itemIndex)\n}\n\n/**\n * Creates a synthetic {@link FieldContentItem} that represents a single item inside an array field.\n *\n * Array fields store their per-item schema in `arrayField.item` ({@link ArrayItemDef}).\n * Components that render individual array items need a standard `FieldContentItem` shape,\n * so this helper projects the item definition into one, preserving the parent field's `id`\n * while adopting the item's `type`, `label`, `description`, `validation`, and `options`.\n *\n * @param arrayField - The array field definition whose `.item` property describes the item schema.\n * @param _index - The zero-based position of the item in the array (reserved for future use,\n * e.g. per-item overrides).\n * @returns A `FieldContentItem` that can be passed directly to a typed field component.\n *\n * @example\n * ```ts\n * const arrayField: FieldContentItem = {\n * id: 10, type: 'array', label: 'Tags',\n * item: { type: 'string', label: 'Tag' },\n * }\n *\n * const itemDef = getArrayField(arrayField, 0)\n * // → { id: 10, type: 'string', label: 'Tag', ... }\n * ```\n */\nexport const getArrayField = (arrayField: FieldContentItem, _index: number): FieldContentItem => {\n const itemDef = arrayField.item as ArrayItemDef\n return {\n id: arrayField.id,\n type: itemDef.type as FieldType,\n label: itemDef.label,\n description: itemDef.description,\n validation: itemDef.validation as FieldContentItem['validation'],\n options: itemDef.options,\n }\n}\n\n/**\n * Recursively searches content items for a section with the given id.\n *\n * Walks the content tree depth-first, checking sections and their nested\n * content. Returns the first matching {@link SectionContentItem}, or\n * `undefined` if no section with that id exists.\n *\n * @param items - The content items to search through.\n * @param sectionId - The numeric id of the section to find.\n * @returns The matching section, or `undefined` if not found.\n *\n * @example\n * ```ts\n * const section = findSection(definition.content, 42)\n * if (section) {\n * // render section.content\n * }\n * ```\n */\nexport const findSection = (items: ContentItem[], sectionId: number): SectionContentItem | undefined => {\n for (const item of items) {\n if (item.type === 'section') {\n if (item.id === sectionId) return item\n const found = findSection(item.content, sectionId)\n if (found) return found\n }\n }\n return undefined\n}\n","import { type FC, Fragment } from 'react'\n\nimport type {\n ArrayItemDef,\n ContentItem,\n FieldContentItem,\n FieldValidationError,\n FormValues,\n} from '@bluprynt/forms-core'\n\nimport type { EditorArrayItemProps, EditorComponentMap, EditorFieldProps, ViewerComponentMap } from '../types'\nimport { getArrayField, getFieldErrors } from './utils'\n\ntype FormItemsProps = {\n items: ContentItem[]\n visibilityMap: Map<number, boolean>\n values: FormValues\n fieldErrors: Map<number, FieldValidationError[]>\n components: ViewerComponentMap | EditorComponentMap\n showInlineValidation: boolean\n renderFieldProps?: (field: FieldContentItem) => EditorFieldProps\n renderArrayItemProps?: (arrayField: FieldContentItem, index: number) => EditorArrayItemProps\n}\n\nexport const FormItems: FC<FormItemsProps> = ({\n items,\n visibilityMap,\n values,\n fieldErrors,\n components,\n showInlineValidation,\n renderFieldProps,\n renderArrayItemProps,\n}) => {\n const SectionComponent = components.section\n const ErrorComponent = showInlineValidation ? components.error : undefined\n\n const elements: React.ReactNode[] = []\n\n for (const item of items) {\n if (!visibilityMap.get(item.id)) continue\n\n if (item.type === 'section') {\n elements.push(\n <SectionComponent key={item.id} section={item}>\n <FormItems\n items={item.content}\n visibilityMap={visibilityMap}\n values={values}\n fieldErrors={fieldErrors}\n components={components}\n showInlineValidation={showInlineValidation}\n renderFieldProps={renderFieldProps}\n renderArrayItemProps={renderArrayItemProps}\n />\n </SectionComponent>,\n )\n } else if (item.type === 'array') {\n const errors = getFieldErrors(fieldErrors, item.id)\n const modeProps = renderFieldProps?.(item) ?? {}\n\n const ArrayComponent = components.array as React.ComponentType<Record<string, unknown>>\n const arrayValue = (values[String(item.id)] as unknown[] | undefined) ?? []\n const itemDef = item.item as ArrayItemDef\n const ItemComponent = components[\n itemDef.type as keyof Omit<ViewerComponentMap, 'array' | 'section' | 'error'>\n ] as React.ComponentType<Record<string, unknown>> | undefined\n\n elements.push(\n <ArrayComponent\n key={item.id}\n field={item}\n value={values[String(item.id)]}\n itemDef={item.item}\n errors={errors}\n {...modeProps}>\n {ItemComponent\n ? arrayValue.map((itemValue, index) => {\n const itemErrors = getFieldErrors(fieldErrors, item.id, index)\n const synthetic = getArrayField(item, index)\n const itemModeProps = renderArrayItemProps?.(item, index) ?? {}\n\n const baseProps: Record<string, unknown> = {\n field: synthetic,\n value: itemValue,\n errors: itemErrors,\n ...itemModeProps,\n }\n\n if (itemDef.type === 'select') {\n baseProps.options = itemDef.options ?? []\n }\n\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: index is unique in array\n <Fragment key={`${item.id}-${index}`}>\n <ItemComponent {...baseProps} />\n {ErrorComponent && itemErrors.length > 0 && (\n <ErrorComponent errors={itemErrors} field={synthetic} />\n )}\n </Fragment>\n )\n })\n : null}\n </ArrayComponent>,\n )\n\n if (ErrorComponent && errors.length > 0) {\n elements.push(<ErrorComponent key={`${item.id}-error`} errors={errors} field={item} />)\n }\n } else {\n const errors = getFieldErrors(fieldErrors, item.id)\n const modeProps = renderFieldProps?.(item) ?? {}\n\n const fieldProps: Record<string, unknown> = {\n field: item,\n value: values[String(item.id)],\n errors,\n ...modeProps,\n }\n\n if (item.type === 'select') fieldProps.options = (item as FieldContentItem).options ?? []\n\n const fieldType = item.type as keyof Omit<ViewerComponentMap, 'array' | 'section' | 'error'>\n const FieldComponent = components[fieldType] as React.ComponentType<Record<string, unknown>>\n\n elements.push(<FieldComponent key={item.id} {...fieldProps} />)\n\n if (ErrorComponent && errors.length > 0)\n elements.push(<ErrorComponent key={`${item.id}-error`} errors={errors} field={item} />)\n }\n }\n\n if (elements.length === 0) return null\n\n return elements\n}\n","import type { FC } from 'react'\n\nimport type { ContentItem, FieldContentItem, FieldValidationError, FormValues } from '@bluprynt/forms-core'\n\nimport { ROOT } from '../constants'\nimport type { EditorArrayItemProps, EditorComponentMap, EditorFieldProps, ViewerComponentMap } from '../types'\nimport { FormItems } from './form-items'\nimport { findSection } from './utils'\n\ntype FormContentBaseProps = {\n items: ContentItem[]\n visibilityMap: Map<number, boolean>\n values: FormValues\n fieldErrors: Map<number, FieldValidationError[]>\n section?: typeof ROOT | number\n showInlineValidation: boolean\n}\n\ntype FormContentViewerProps = FormContentBaseProps & {\n mode: 'viewer'\n components: ViewerComponentMap\n}\n\ntype FormContentEditorProps = FormContentBaseProps & {\n mode: 'editor'\n components: EditorComponentMap\n renderFieldProps: (field: FieldContentItem) => EditorFieldProps\n renderArrayItemProps: (arrayField: FieldContentItem, index: number) => EditorArrayItemProps\n}\n\nexport type FormContentProps = FormContentViewerProps | FormContentEditorProps\n\nexport const FormContent: FC<FormContentProps> = (props) => {\n const { items, visibilityMap, values, fieldErrors, section, showInlineValidation } = props\n\n const sharedProps =\n props.mode === 'editor'\n ? {\n visibilityMap,\n values,\n fieldErrors,\n components: props.components,\n showInlineValidation,\n renderFieldProps: props.renderFieldProps,\n renderArrayItemProps: props.renderArrayItemProps,\n }\n : {\n visibilityMap,\n values,\n fieldErrors,\n components: props.components,\n showInlineValidation,\n }\n\n if (section === undefined) return <FormItems items={items} {...sharedProps} />\n\n if (section === ROOT) {\n const nonSectionItems = items.filter((item) => item.type !== 'section')\n return <FormItems items={nonSectionItems} {...sharedProps} />\n }\n\n const foundSection = findSection(items, section)\n if (!foundSection || !visibilityMap.get(foundSection.id)) return null\n\n const Section = props.components.section\n return (\n <Section key={foundSection.id} section={foundSection}>\n <FormItems items={foundSection.content} {...sharedProps} />\n </Section>\n )\n}\n","import { type FC, useCallback, useRef } from 'react'\n\nimport { FieldContentItem, FormDocument, FormEngine, FormValidationResult } from '@bluprynt/forms-core'\n\nimport { FormContent } from './form'\nimport { useFormContext } from './form-context'\nimport type { EditorArrayItemProps, EditorComponentMap, EditorFieldProps } from './types'\n\ntype FormEditorProps = {\n components: EditorComponentMap\n onChange: (data: FormDocument, validation: FormValidationResult) => void\n}\n\nexport const FormEditor: FC<FormEditorProps> = ({ components, onChange }) => {\n const { definition, data, visibilityMap, fieldErrors, section, engine, showInlineValidation, documentErrors } =\n useFormContext()\n\n const { renderFieldProps, renderArrayItemProps } = useEditorHandlers(engine, data, onChange)\n\n if (!definition || !data || (documentErrors && documentErrors.length > 0)) return null\n\n return (\n <FormContent\n mode=\"editor\"\n items={definition.content}\n visibilityMap={visibilityMap}\n values={data.values}\n fieldErrors={fieldErrors}\n components={components}\n section={section}\n showInlineValidation={showInlineValidation}\n renderFieldProps={renderFieldProps}\n renderArrayItemProps={renderArrayItemProps}\n />\n )\n}\n\nexport const useEditorHandlers = (\n engine: FormEngine | undefined,\n data: FormDocument | undefined,\n onChange: (data: FormDocument, validation: FormValidationResult) => void,\n): {\n renderFieldProps: (field: FieldContentItem) => EditorFieldProps\n renderArrayItemProps: (field: FieldContentItem, index: number) => EditorArrayItemProps\n} => {\n // Latest ref pattern\n const stateRef = useRef({ data, onChange, engine })\n stateRef.current = { data, onChange, engine }\n\n // Per-field onChange handler\n\n const fieldOnChangeMap = useRef(new Map<string, (value: unknown) => void>())\n const getFieldOnChange = useCallback((fieldId: number): ((value: unknown) => void) => {\n const key = String(fieldId)\n\n let handler = fieldOnChangeMap.current.get(key)\n if (!handler) {\n handler = (newValue: unknown) => {\n const { data, onChange, engine } = stateRef.current\n if (!data || !engine) return\n\n const document: FormDocument = { ...data, values: { ...data.values, [key]: newValue } }\n\n onChange(document, engine.validate(document))\n }\n fieldOnChangeMap.current.set(key, handler)\n }\n return handler\n }, [])\n\n // Array mutation handlers\n\n const arrayHandlersMap = useRef(\n new Map<\n string,\n {\n onAddItem: () => void\n onRemoveItem: (index: number) => void\n onMoveItem: (fromIndex: number, toIndex: number) => void\n }\n >(),\n )\n const getArrayHandlers = useCallback((fieldId: number) => {\n const key = String(fieldId)\n\n let handlers = arrayHandlersMap.current.get(key)\n if (!handlers) {\n const fire = (mutate: (arr: unknown[]) => unknown[]) => {\n const { data, onChange, engine } = stateRef.current\n if (!data || !engine) return\n\n const items = (data.values[key] as unknown[] | undefined) ?? []\n const document: FormDocument = { ...data, values: { ...data.values, [key]: mutate([...items]) } }\n\n onChange(document, engine.validate(document))\n }\n\n handlers = {\n onAddItem: () =>\n fire((values) => {\n values.push(undefined)\n return values\n }),\n onRemoveItem: (index: number) =>\n fire((values) => {\n values.splice(index, 1)\n return values\n }),\n onMoveItem: (fromIndex: number, toIndex: number) =>\n fire((values) => {\n const [moved] = values.splice(fromIndex, 1)\n values.splice(toIndex, 0, moved)\n return values\n }),\n }\n arrayHandlersMap.current.set(key, handlers)\n }\n return handlers\n }, [])\n\n // Array item onChange handler\n\n const arrayItemOnChangeMap = useRef(new Map<string, (value: unknown) => void>())\n const getArrayItemOnChange = useCallback((fieldId: number, index: number): ((value: unknown) => void) => {\n const mapKey = `${fieldId}-${index}`\n\n let handler = arrayItemOnChangeMap.current.get(mapKey)\n if (!handler) {\n handler = (newValue: unknown) => {\n const fieldKey = String(fieldId)\n\n const { data, onChange, engine } = stateRef.current\n if (!data || !engine) return\n\n const items = [...((data.values[fieldKey] as unknown[] | undefined) ?? [])]\n items[index] = newValue\n\n const document: FormDocument = { ...data, values: { ...data.values, [fieldKey]: items } }\n onChange(document, engine.validate(document))\n }\n arrayItemOnChangeMap.current.set(mapKey, handler)\n }\n return handler\n }, [])\n\n return {\n renderFieldProps: (field: FieldContentItem): EditorFieldProps => {\n if (field.type === 'array') {\n return {\n onChange: getFieldOnChange(field.id),\n ...getArrayHandlers(field.id),\n }\n }\n return { onChange: getFieldOnChange(field.id) }\n },\n renderArrayItemProps: (field: FieldContentItem, index: number): EditorArrayItemProps => ({\n onChange: getArrayItemOnChange(field.id, index),\n }),\n } as const\n}\n","import { type ComponentType, type FC, type PropsWithChildren, useMemo } from 'react'\n\nimport type { FieldEntry, FieldValidationError } from '@bluprynt/forms-core'\n\nimport { useFormContext } from './form-context'\n\nexport type FieldValidationFieldEntry = {\n field: FieldEntry | undefined\n errors: FieldValidationError[]\n}\n\ntype FormFieldsValidationProps = {\n container: ComponentType<PropsWithChildren>\n field: ComponentType<PropsWithChildren<FieldValidationFieldEntry>>\n error: ComponentType<FieldValidationError>\n}\n\nexport const FormFieldsValidation: FC<FormFieldsValidationProps> = ({\n container: ContainerComponent,\n field: FieldComponent,\n error: ErrorComponent,\n}) => {\n const { engine, data, fieldErrors, visibilityMap } = useFormContext()\n\n const groups = useMemo(() => {\n if (!engine || !data || fieldErrors.size === 0) return []\n\n const result: FieldValidationFieldEntry[] = []\n\n for (const [fieldId, errors] of fieldErrors) {\n if (visibilityMap.get(fieldId) === false) continue\n\n result.push({\n field: engine.getFieldDef(fieldId),\n errors,\n })\n }\n\n return result\n }, [engine, data, fieldErrors, visibilityMap])\n\n if (groups.length === 0) return null\n\n return (\n <ContainerComponent>\n {groups.map((group) => (\n <FieldComponent key={group.field?.id} {...group}>\n {group.errors.map((error) => (\n <ErrorComponent key={`${error.fieldId}-${error.rule}-${error.itemIndex ?? ''}`} {...error} />\n ))}\n </FieldComponent>\n ))}\n </ContainerComponent>\n )\n}\n","import { type ComponentType, type FC, type PropsWithChildren, useMemo } from 'react'\n\nimport type { SectionContentItem } from '@bluprynt/forms-core'\n\nimport { ROOT } from './constants'\nimport { useFormContext } from './form-context'\n\nexport type FormSectionEntry = Omit<SectionContentItem, 'id' | 'type'> & {\n id: typeof ROOT | number\n}\n\nexport type FormSectionItemProps = {\n section: FormSectionEntry\n active: boolean\n select: () => void\n}\n\ntype FormSectionsProps = {\n container: ComponentType<PropsWithChildren>\n item: ComponentType<FormSectionItemProps>\n defaultSectionTitle?: string\n defaultSectionDescription?: string\n onSelect?: (id: typeof ROOT | number) => void\n}\n\nexport const FormSections: FC<FormSectionsProps> = ({\n container: Container,\n item: Item,\n defaultSectionTitle = 'General',\n defaultSectionDescription,\n onSelect,\n}) => {\n const { definition, section, visibilityMap, data, documentErrors } = useFormContext()\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: invalidate section list when data changes\n const entries = useMemo(() => {\n if (!definition) return []\n\n const result: FormSectionEntry[] = []\n\n const rootFields = definition.content.filter((item) => item.type !== 'section')\n if (rootFields.some((item) => visibilityMap.get(item.id)))\n result.push({\n id: ROOT,\n title: defaultSectionTitle,\n description: defaultSectionDescription,\n content: rootFields,\n condition: undefined,\n })\n\n for (const item of definition.content) {\n if (item.type === 'section') {\n if (visibilityMap.get(item.id) === false) continue\n\n result.push(item)\n }\n }\n\n return result\n }, [definition?.content, visibilityMap, data, defaultSectionTitle, defaultSectionDescription])\n\n if (!definition || !data || (documentErrors && documentErrors.length > 0)) return null\n\n return (\n <Container>\n {entries.map((entry) => (\n <Item\n key={entry.id === ROOT ? 'root' : String(entry.id)}\n section={entry}\n active={entry.id === section}\n select={() => onSelect?.(entry.id)}\n />\n ))}\n </Container>\n )\n}\n","import type { FC } from 'react'\n\nimport { FormContent } from './form'\nimport { useFormContext } from './form-context'\nimport type { ViewerComponentMap } from './types'\n\ntype FormViewerProps = {\n components: ViewerComponentMap\n}\n\nexport const FormViewer: FC<FormViewerProps> = ({ components }) => {\n const { definition, data, visibilityMap, fieldErrors, section, showInlineValidation, documentErrors } =\n useFormContext()\n\n if (!definition || !data || (documentErrors && documentErrors.length > 0)) return null\n\n return (\n <FormContent\n mode=\"viewer\"\n items={definition.content}\n visibilityMap={visibilityMap}\n values={data.values}\n fieldErrors={fieldErrors}\n components={components}\n section={section}\n showInlineValidation={showInlineValidation}\n />\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["DocumentError"],"sources":["../src/constants.ts","../src/form-context.tsx","../src/form-document-validation.tsx","../src/form/utils.ts","../src/form/form-items.tsx","../src/form/form-content.tsx","../src/form-editor.tsx","../src/form-fields-validation.tsx","../src/use-form-sections.ts","../src/form-sections.tsx","../src/form-viewer.tsx"],"sourcesContent":["export const ROOT: unique symbol = Symbol('ROOT')\nexport type ROOT = typeof ROOT\n\nexport const DEFAULT: unique symbol = Symbol('DEFAULT')\nexport type DEFAULT = typeof DEFAULT\n","import { createContext, type FC, type ReactNode, useContext, useMemo } from 'react'\n\nimport {\n DocumentError,\n DocumentValidationError,\n FieldValidationError,\n FormDefinition,\n FormDocument,\n FormEngine,\n FormValidationResult,\n} from '@bluprynt/forms-core'\n\nimport type { DEFAULT, ROOT } from './constants'\n\ntype FormContextValue = {\n definition: FormDefinition | undefined\n data: FormDocument | undefined\n engine: FormEngine | undefined\n visibilityMap: Map<number, boolean>\n validation: FormValidationResult | undefined\n documentErrors: readonly DocumentValidationError[] | undefined\n fieldErrors: Map<number, FieldValidationError[]>\n section: typeof ROOT | typeof DEFAULT | number | undefined\n showInlineValidation: boolean\n}\n\nconst FormContext = createContext<FormContextValue | undefined>(undefined)\n\nexport const useFormContext = (): FormContextValue => {\n const context = useContext(FormContext)\n if (!context) throw new Error('useFormContext must be used within a <Form> provider')\n\n return context\n}\n\ntype FormProps = {\n definition?: FormDefinition\n data?: FormDocument\n section?: typeof ROOT | typeof DEFAULT | number\n showInlineValidation?: boolean\n children: ReactNode\n}\n\nexport const Form: FC<FormProps> = ({ definition, data, section, showInlineValidation = true, children }) => {\n const { engine, documentErrors: definitionErrors } = useMemo(() => {\n if (!definition) return {}\n\n try {\n return { engine: new FormEngine(definition) }\n } catch (error) {\n if (error instanceof DocumentError) return { documentErrors: error.errors }\n throw error\n }\n }, [definition])\n\n const { visibilityMap, validation, documentErrors, fieldErrors } = useMemo(() => {\n const visibilityMap = engine && data ? engine.getVisibilityMap(data) : new Map<number, boolean>()\n const validation =\n engine && data\n ? engine.validate(data)\n : ({\n valid: true,\n fieldErrors: new Map<number, FieldValidationError[]>(),\n } satisfies FormValidationResult)\n\n return {\n visibilityMap,\n validation,\n documentErrors: [...(definitionErrors ?? []), ...(validation?.documentErrors ?? [])],\n fieldErrors: validation?.fieldErrors ?? new Map<number, FieldValidationError[]>(),\n } as const\n }, [engine, data, definitionErrors])\n\n const value: FormContextValue = {\n definition,\n data,\n engine,\n visibilityMap,\n validation,\n documentErrors,\n fieldErrors,\n section,\n showInlineValidation,\n } as const\n\n return <FormContext.Provider value={value}>{children}</FormContext.Provider>\n}\n","import type { ComponentType, FC, PropsWithChildren } from 'react'\n\nimport type { DocumentValidationError } from '@bluprynt/forms-core'\n\nimport { useFormContext } from './form-context'\n\ntype FormDocumentValidationProps = {\n container: ComponentType<PropsWithChildren>\n error: ComponentType<DocumentValidationError>\n}\n\nexport const FormDocumentValidation: FC<FormDocumentValidationProps> = ({\n container: ContainerComponent,\n error: ErrorComponent,\n}) => {\n const { documentErrors } = useFormContext()\n\n if (!documentErrors?.length) return null\n\n return (\n <ContainerComponent>\n {documentErrors.map((error, index) => (\n <ErrorComponent\n // biome-ignore lint/suspicious/noArrayIndexKey: index is unique in array\n key={`error-${error.code}-${error.itemId ?? ''}-${index}`}\n {...error}\n />\n ))}\n </ContainerComponent>\n )\n}\n","import type {\n ArrayItemDef,\n ContentItem,\n FieldContentItem,\n FieldType,\n FieldValidationError,\n SectionContentItem,\n} from '@bluprynt/forms-core'\n\n/**\n * Retrieves validation errors for a specific field from the pre-indexed error map.\n *\n * Uses O(1) map lookup by `fieldId`. When `itemIndex` is omitted, returns only\n * **field-level** errors (those without an `itemIndex`). When `itemIndex` is\n * provided, returns only **item-level** errors matching the given array item index.\n *\n * @param fieldErrors - Map from field id to its validation errors.\n * @param fieldId - The numeric ID of the field to retrieve errors for.\n * @param itemIndex - Optional zero-based index of the array item. When omitted, only\n * field-level errors (where `itemIndex` is `null` / `undefined`) are returned.\n * @returns Errors for the given field (and optionally item index). Empty array if none.\n *\n * @example\n * ```ts\n * // Field-level errors only (no itemIndex on the error)\n * getFieldErrors(fieldErrors, 5)\n *\n * // Errors for the third item of array field 5\n * getFieldErrors(fieldErrors, 5, 2)\n * ```\n */\nexport const getFieldErrors = (\n fieldErrors: Map<number, FieldValidationError[]>,\n fieldId: number,\n itemIndex?: number,\n): FieldValidationError[] => {\n const errors = fieldErrors.get(fieldId) ?? []\n if (itemIndex === undefined) return errors.filter((e) => e.itemIndex == null)\n return errors.filter((e) => e.itemIndex === itemIndex)\n}\n\n/**\n * Creates a synthetic {@link FieldContentItem} that represents a single item inside an array field.\n *\n * Array fields store their per-item schema in `arrayField.item` ({@link ArrayItemDef}).\n * Components that render individual array items need a standard `FieldContentItem` shape,\n * so this helper projects the item definition into one, preserving the parent field's `id`\n * while adopting the item's `type`, `label`, `description`, `validation`, and `options`.\n *\n * @param arrayField - The array field definition whose `.item` property describes the item schema.\n * @param _index - The zero-based position of the item in the array (reserved for future use,\n * e.g. per-item overrides).\n * @returns A `FieldContentItem` that can be passed directly to a typed field component.\n *\n * @example\n * ```ts\n * const arrayField: FieldContentItem = {\n * id: 10, type: 'array', label: 'Tags',\n * item: { type: 'string', label: 'Tag' },\n * }\n *\n * const itemDef = getArrayField(arrayField, 0)\n * // → { id: 10, type: 'string', label: 'Tag', ... }\n * ```\n */\nexport const getArrayField = (arrayField: FieldContentItem, _index: number): FieldContentItem => {\n const itemDef = arrayField.item as ArrayItemDef\n return {\n id: arrayField.id,\n type: itemDef.type as FieldType,\n label: itemDef.label,\n description: itemDef.description,\n validation: itemDef.validation as FieldContentItem['validation'],\n options: itemDef.options,\n }\n}\n\n/**\n * Recursively searches content items for a section with the given id.\n *\n * Walks the content tree depth-first, checking sections and their nested\n * content. Returns the first matching {@link SectionContentItem}, or\n * `undefined` if no section with that id exists.\n *\n * @param items - The content items to search through.\n * @param sectionId - The numeric id of the section to find.\n * @returns The matching section, or `undefined` if not found.\n *\n * @example\n * ```ts\n * const section = findSection(definition.content, 42)\n * if (section) {\n * // render section.content\n * }\n * ```\n */\nexport const findSection = (items: ContentItem[], sectionId: number): SectionContentItem | undefined => {\n for (const item of items) {\n if (item.type === 'section') {\n if (item.id === sectionId) return item\n const found = findSection(item.content, sectionId)\n if (found) return found\n }\n }\n return undefined\n}\n","import { type FC, Fragment } from 'react'\n\nimport type {\n ArrayItemDef,\n ContentItem,\n FieldContentItem,\n FieldValidationError,\n FormValues,\n} from '@bluprynt/forms-core'\n\nimport type { EditorArrayItemProps, EditorComponentMap, EditorFieldProps, ViewerComponentMap } from '../types'\nimport { getArrayField, getFieldErrors } from './utils'\n\ntype FormItemsProps = {\n items: ContentItem[]\n visibilityMap: Map<number, boolean>\n values: FormValues\n fieldErrors: Map<number, FieldValidationError[]>\n components: ViewerComponentMap | EditorComponentMap\n showInlineValidation: boolean\n renderFieldProps?: (field: FieldContentItem) => EditorFieldProps\n renderArrayItemProps?: (arrayField: FieldContentItem, index: number) => EditorArrayItemProps\n}\n\nexport const FormItems: FC<FormItemsProps> = ({\n items,\n visibilityMap,\n values,\n fieldErrors,\n components,\n showInlineValidation,\n renderFieldProps,\n renderArrayItemProps,\n}) => {\n const SectionComponent = components.section\n const ErrorComponent = showInlineValidation ? components.error : undefined\n\n const elements: React.ReactNode[] = []\n\n for (const item of items) {\n if (!visibilityMap.get(item.id)) continue\n\n if (item.type === 'section') {\n elements.push(\n <SectionComponent key={item.id} section={item}>\n <FormItems\n items={item.content}\n visibilityMap={visibilityMap}\n values={values}\n fieldErrors={fieldErrors}\n components={components}\n showInlineValidation={showInlineValidation}\n renderFieldProps={renderFieldProps}\n renderArrayItemProps={renderArrayItemProps}\n />\n </SectionComponent>,\n )\n } else if (item.type === 'array') {\n const errors = getFieldErrors(fieldErrors, item.id)\n const modeProps = renderFieldProps?.(item) ?? {}\n\n const ArrayComponent = components.array as React.ComponentType<Record<string, unknown>>\n const arrayValue = (values[String(item.id)] as unknown[] | undefined) ?? []\n const itemDef = item.item as ArrayItemDef\n const ItemComponent = components[\n itemDef.type as keyof Omit<ViewerComponentMap, 'array' | 'section' | 'error'>\n ] as React.ComponentType<Record<string, unknown>> | undefined\n\n elements.push(\n <ArrayComponent\n key={item.id}\n field={item}\n value={values[String(item.id)]}\n itemDef={item.item}\n errors={errors}\n {...modeProps}>\n {ItemComponent\n ? arrayValue.map((itemValue, index) => {\n const itemErrors = getFieldErrors(fieldErrors, item.id, index)\n const synthetic = getArrayField(item, index)\n const itemModeProps = renderArrayItemProps?.(item, index) ?? {}\n\n const baseProps: Record<string, unknown> = {\n field: synthetic,\n value: itemValue,\n errors: itemErrors,\n ...itemModeProps,\n }\n\n if (itemDef.type === 'select') {\n baseProps.options = itemDef.options ?? []\n }\n\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: index is unique in array\n <Fragment key={`${item.id}-${index}`}>\n <ItemComponent {...baseProps} />\n {ErrorComponent && itemErrors.length > 0 && (\n <ErrorComponent errors={itemErrors} field={synthetic} />\n )}\n </Fragment>\n )\n })\n : null}\n </ArrayComponent>,\n )\n\n if (ErrorComponent && errors.length > 0) {\n elements.push(<ErrorComponent key={`${item.id}-error`} errors={errors} field={item} />)\n }\n } else {\n const errors = getFieldErrors(fieldErrors, item.id)\n const modeProps = renderFieldProps?.(item) ?? {}\n\n const fieldProps: Record<string, unknown> = {\n field: item,\n value: values[String(item.id)],\n errors,\n ...modeProps,\n }\n\n if (item.type === 'select') fieldProps.options = (item as FieldContentItem).options ?? []\n\n const fieldType = item.type as keyof Omit<ViewerComponentMap, 'array' | 'section' | 'error'>\n const FieldComponent = components[fieldType] as React.ComponentType<Record<string, unknown>>\n\n elements.push(<FieldComponent key={item.id} {...fieldProps} />)\n\n if (ErrorComponent && errors.length > 0)\n elements.push(<ErrorComponent key={`${item.id}-error`} errors={errors} field={item} />)\n }\n }\n\n if (elements.length === 0) return null\n\n return elements\n}\n","import type { FC } from 'react'\n\nimport type { ContentItem, FieldContentItem, FieldValidationError, FormValues } from '@bluprynt/forms-core'\n\nimport { DEFAULT, ROOT } from '../constants'\nimport type { EditorArrayItemProps, EditorComponentMap, EditorFieldProps, ViewerComponentMap } from '../types'\nimport { FormItems } from './form-items'\nimport { findSection } from './utils'\n\ntype FormContentBaseProps = {\n items: ContentItem[]\n visibilityMap: Map<number, boolean>\n values: FormValues\n fieldErrors: Map<number, FieldValidationError[]>\n section?: typeof ROOT | typeof DEFAULT | number\n showInlineValidation: boolean\n}\n\ntype FormContentViewerProps = FormContentBaseProps & {\n mode: 'viewer'\n components: ViewerComponentMap\n}\n\ntype FormContentEditorProps = FormContentBaseProps & {\n mode: 'editor'\n components: EditorComponentMap\n renderFieldProps: (field: FieldContentItem) => EditorFieldProps\n renderArrayItemProps: (arrayField: FieldContentItem, index: number) => EditorArrayItemProps\n}\n\nexport type FormContentProps = FormContentViewerProps | FormContentEditorProps\n\nexport const FormContent: FC<FormContentProps> = (props) => {\n const { items, visibilityMap, values, fieldErrors, section, showInlineValidation } = props\n\n const sharedProps =\n props.mode === 'editor'\n ? {\n visibilityMap,\n values,\n fieldErrors,\n components: props.components,\n showInlineValidation,\n renderFieldProps: props.renderFieldProps,\n renderArrayItemProps: props.renderArrayItemProps,\n }\n : {\n visibilityMap,\n values,\n fieldErrors,\n components: props.components,\n showInlineValidation,\n }\n\n const selectedSection = section === DEFAULT ? resolveDefaultSection(items, visibilityMap) : section\n\n if (selectedSection === undefined) return <FormItems items={items} {...sharedProps} />\n\n if (selectedSection === ROOT) {\n const nonSectionItems = items.filter((item) => item.type !== 'section')\n return <FormItems items={nonSectionItems} {...sharedProps} />\n }\n\n const foundSection = findSection(items, selectedSection)\n if (!foundSection || !visibilityMap.get(foundSection.id)) return null\n\n const Section = props.components.section\n return (\n <Section key={foundSection.id} section={foundSection}>\n <FormItems items={foundSection.content} {...sharedProps} />\n </Section>\n )\n}\n\nconst resolveDefaultSection = (\n items: ContentItem[],\n visibilityMap: Map<number, boolean>,\n): typeof ROOT | number | undefined => {\n const rootFields = items.filter((item) => item.type !== 'section')\n if (rootFields.some((item) => visibilityMap.get(item.id))) return ROOT\n\n const firstVisibleSection = items.find((item) => item.type === 'section' && visibilityMap.get(item.id) !== false)\n\n return firstVisibleSection?.id\n}\n","import { type FC, useCallback, useRef } from 'react'\n\nimport { FieldContentItem, FormDocument, FormEngine, FormValidationResult } from '@bluprynt/forms-core'\n\nimport { FormContent } from './form'\nimport { useFormContext } from './form-context'\nimport type { EditorArrayItemProps, EditorComponentMap, EditorFieldProps } from './types'\n\ntype FormEditorProps = {\n components: EditorComponentMap\n onChange: (data: FormDocument, validation: FormValidationResult) => void\n}\n\nexport const FormEditor: FC<FormEditorProps> = ({ components, onChange }) => {\n const { definition, data, visibilityMap, fieldErrors, section, engine, showInlineValidation, documentErrors } =\n useFormContext()\n\n const { renderFieldProps, renderArrayItemProps } = useEditorHandlers(engine, data, onChange)\n\n if (!definition || !data || (documentErrors && documentErrors.length > 0)) return null\n\n return (\n <FormContent\n mode=\"editor\"\n items={definition.content}\n visibilityMap={visibilityMap}\n values={data.values}\n fieldErrors={fieldErrors}\n components={components}\n section={section}\n showInlineValidation={showInlineValidation}\n renderFieldProps={renderFieldProps}\n renderArrayItemProps={renderArrayItemProps}\n />\n )\n}\n\nexport const useEditorHandlers = (\n engine: FormEngine | undefined,\n data: FormDocument | undefined,\n onChange: (data: FormDocument, validation: FormValidationResult) => void,\n): {\n renderFieldProps: (field: FieldContentItem) => EditorFieldProps\n renderArrayItemProps: (field: FieldContentItem, index: number) => EditorArrayItemProps\n} => {\n // Latest ref pattern\n const stateRef = useRef({ data, onChange, engine })\n stateRef.current = { data, onChange, engine }\n\n // Per-field onChange handler\n\n const fieldOnChangeMap = useRef(new Map<string, (value: unknown) => void>())\n const getFieldOnChange = useCallback((fieldId: number): ((value: unknown) => void) => {\n const key = String(fieldId)\n\n let handler = fieldOnChangeMap.current.get(key)\n if (!handler) {\n handler = (newValue: unknown) => {\n const { data, onChange, engine } = stateRef.current\n if (!data || !engine) return\n\n const document: FormDocument = { ...data, values: { ...data.values, [key]: newValue } }\n\n onChange(document, engine.validate(document))\n }\n fieldOnChangeMap.current.set(key, handler)\n }\n return handler\n }, [])\n\n // Array mutation handlers\n\n const arrayHandlersMap = useRef(\n new Map<\n string,\n {\n onAddItem: () => void\n onRemoveItem: (index: number) => void\n onMoveItem: (fromIndex: number, toIndex: number) => void\n }\n >(),\n )\n const getArrayHandlers = useCallback((fieldId: number) => {\n const key = String(fieldId)\n\n let handlers = arrayHandlersMap.current.get(key)\n if (!handlers) {\n const fire = (mutate: (arr: unknown[]) => unknown[]) => {\n const { data, onChange, engine } = stateRef.current\n if (!data || !engine) return\n\n const items = (data.values[key] as unknown[] | undefined) ?? []\n const document: FormDocument = { ...data, values: { ...data.values, [key]: mutate([...items]) } }\n\n onChange(document, engine.validate(document))\n }\n\n handlers = {\n onAddItem: () =>\n fire((values) => {\n values.push(undefined)\n return values\n }),\n onRemoveItem: (index: number) =>\n fire((values) => {\n values.splice(index, 1)\n return values\n }),\n onMoveItem: (fromIndex: number, toIndex: number) =>\n fire((values) => {\n const [moved] = values.splice(fromIndex, 1)\n values.splice(toIndex, 0, moved)\n return values\n }),\n }\n arrayHandlersMap.current.set(key, handlers)\n }\n return handlers\n }, [])\n\n // Array item onChange handler\n\n const arrayItemOnChangeMap = useRef(new Map<string, (value: unknown) => void>())\n const getArrayItemOnChange = useCallback((fieldId: number, index: number): ((value: unknown) => void) => {\n const mapKey = `${fieldId}-${index}`\n\n let handler = arrayItemOnChangeMap.current.get(mapKey)\n if (!handler) {\n handler = (newValue: unknown) => {\n const fieldKey = String(fieldId)\n\n const { data, onChange, engine } = stateRef.current\n if (!data || !engine) return\n\n const items = [...((data.values[fieldKey] as unknown[] | undefined) ?? [])]\n items[index] = newValue\n\n const document: FormDocument = { ...data, values: { ...data.values, [fieldKey]: items } }\n onChange(document, engine.validate(document))\n }\n arrayItemOnChangeMap.current.set(mapKey, handler)\n }\n return handler\n }, [])\n\n return {\n renderFieldProps: (field: FieldContentItem): EditorFieldProps => {\n if (field.type === 'array') {\n return {\n onChange: getFieldOnChange(field.id),\n ...getArrayHandlers(field.id),\n }\n }\n return { onChange: getFieldOnChange(field.id) }\n },\n renderArrayItemProps: (field: FieldContentItem, index: number): EditorArrayItemProps => ({\n onChange: getArrayItemOnChange(field.id, index),\n }),\n } as const\n}\n","import { type ComponentType, type FC, type PropsWithChildren, useMemo } from 'react'\n\nimport type { FieldEntry, FieldValidationError } from '@bluprynt/forms-core'\n\nimport { useFormContext } from './form-context'\n\nexport type FieldValidationFieldEntry = {\n field: FieldEntry | undefined\n errors: FieldValidationError[]\n}\n\ntype FormFieldsValidationProps = {\n container: ComponentType<PropsWithChildren>\n field: ComponentType<PropsWithChildren<FieldValidationFieldEntry>>\n error: ComponentType<FieldValidationError>\n}\n\nexport const FormFieldsValidation: FC<FormFieldsValidationProps> = ({\n container: ContainerComponent,\n field: FieldComponent,\n error: ErrorComponent,\n}) => {\n const { engine, data, fieldErrors, visibilityMap } = useFormContext()\n\n const groups = useMemo(() => {\n if (!engine || !data || fieldErrors.size === 0) return []\n\n const result: FieldValidationFieldEntry[] = []\n\n for (const [fieldId, errors] of fieldErrors) {\n if (visibilityMap.get(fieldId) === false) continue\n\n result.push({\n field: engine.getFieldDef(fieldId),\n errors,\n })\n }\n\n return result\n }, [engine, data, fieldErrors, visibilityMap])\n\n if (groups.length === 0) return null\n\n return (\n <ContainerComponent>\n {groups.map((group) => (\n <FieldComponent key={group.field?.id} {...group}>\n {group.errors.map((error) => (\n <ErrorComponent key={`${error.fieldId}-${error.rule}-${error.itemIndex ?? ''}`} {...error} />\n ))}\n </FieldComponent>\n ))}\n </ContainerComponent>\n )\n}\n","import { useMemo } from 'react'\n\nimport type { SectionContentItem } from '@bluprynt/forms-core'\n\nimport { ROOT } from './constants'\nimport { useFormContext } from './form-context'\n\nexport type FormSectionEntry = Omit<SectionContentItem, 'id' | 'type'> & {\n id: typeof ROOT | number\n}\n\nexport const useFormSections = (\n defaultSectionTitle = 'General',\n defaultSectionDescription?: string,\n): FormSectionEntry[] => {\n const { definition, visibilityMap, data } = useFormContext()\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: invalidate section list when data changes\n return useMemo(() => {\n if (!definition) return []\n\n const result: FormSectionEntry[] = []\n\n const rootFields = definition.content.filter((item) => item.type !== 'section')\n if (rootFields.some((item) => visibilityMap.get(item.id)))\n result.push({\n id: ROOT,\n title: defaultSectionTitle,\n description: defaultSectionDescription,\n content: rootFields,\n condition: undefined,\n })\n\n for (const item of definition.content) {\n if (item.type === 'section') {\n if (visibilityMap.get(item.id) === false) continue\n\n result.push(item)\n }\n }\n\n return result\n }, [definition?.content, visibilityMap, data, defaultSectionTitle, defaultSectionDescription])\n}\n","import { type ComponentType, type FC, type PropsWithChildren } from 'react'\n\nimport { DEFAULT, ROOT } from './constants'\nimport { useFormContext } from './form-context'\nimport { type FormSectionEntry, useFormSections } from './use-form-sections'\n\nexport type { FormSectionEntry }\n\nexport type FormSectionItemProps = {\n index: number\n section: FormSectionEntry\n active: boolean\n select: () => void\n}\n\ntype FormSectionsProps = {\n container: ComponentType<PropsWithChildren>\n item: ComponentType<FormSectionItemProps>\n defaultSectionTitle?: string\n defaultSectionDescription?: string\n onSelect?: (id: typeof ROOT | typeof DEFAULT | number) => void\n}\n\nexport const FormSections: FC<FormSectionsProps> = ({\n container: Container,\n item: Item,\n defaultSectionTitle,\n defaultSectionDescription,\n onSelect,\n}) => {\n const { definition, data, documentErrors, section } = useFormContext()\n const entries = useFormSections(defaultSectionTitle, defaultSectionDescription)\n\n if (!definition || !data || (documentErrors && documentErrors.length > 0)) return null\n\n return (\n <Container>\n {entries.map((entry, index) => (\n <Item\n key={entry.id === ROOT ? 'root' : String(entry.id)}\n index={index}\n section={entry}\n active={section === DEFAULT ? index === 0 : entry.id === section}\n select={() => onSelect?.(entry.id)}\n />\n ))}\n </Container>\n )\n}\n","import type { FC } from 'react'\n\nimport { FormContent } from './form'\nimport { useFormContext } from './form-context'\nimport type { ViewerComponentMap } from './types'\n\ntype FormViewerProps = {\n components: ViewerComponentMap\n}\n\nexport const FormViewer: FC<FormViewerProps> = ({ components }) => {\n const { definition, data, visibilityMap, fieldErrors, section, showInlineValidation, documentErrors } =\n useFormContext()\n\n if (!definition || !data || (documentErrors && documentErrors.length > 0)) return null\n\n return (\n <FormContent\n mode=\"viewer\"\n items={definition.content}\n visibilityMap={visibilityMap}\n values={data.values}\n fieldErrors={fieldErrors}\n components={components}\n section={section}\n showInlineValidation={showInlineValidation}\n />\n )\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bluprynt/forms-viewer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/blupryntco/forms-engine.git",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"react": "^18.0.0 || ^19.0.0",
|
|
26
26
|
"react-dom": "^18.0.0 || ^19.0.0",
|
|
27
|
-
"@bluprynt/forms-core": "
|
|
27
|
+
"@bluprynt/forms-core": "3.0.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@testing-library/react": "16.3.2",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"ts-jest": "29.4.6",
|
|
39
39
|
"tsdown": "0.21.1",
|
|
40
40
|
"typescript": "5.9.3",
|
|
41
|
-
"@bluprynt/forms-core": "
|
|
41
|
+
"@bluprynt/forms-core": "3.0.0",
|
|
42
42
|
"@repo/typescript-config": "0.0.0"
|
|
43
43
|
},
|
|
44
44
|
"scripts": {
|