void;
addPattern: (patternType: string) => void;
addPatternToFieldset: (patternType: string, targetPattern: PatternId) => void;
+ addPatternToRepeater: (patternType: string, targetPattern: PatternId) => void;
clearFocus: () => void;
copyPattern: (parentPatternId: PatternId, patternId: PatternId) => void;
deletePattern: (id: PatternId) => void;
@@ -138,6 +139,33 @@ export const createFormEditSlice =
'Element added to fieldset successfully.'
);
},
+ addPatternToRepeater: (patternType, targetPattern) => {
+ const state = get();
+ const builder = new BlueprintBuilder(
+ state.context.config,
+ state.session.form
+ );
+ const newPattern = builder.addPatternToRepeater(
+ patternType,
+ targetPattern
+ );
+
+ console.group('form slices');
+ console.log({
+ session: mergeSession(state.session, { form: builder.form }),
+ focus: { pattern: newPattern },
+ });
+ console.groupEnd();
+
+ set({
+ session: mergeSession(state.session, { form: builder.form }),
+ focus: { pattern: newPattern },
+ });
+ state.addNotification(
+ 'success',
+ 'Element added to fieldset successfully.'
+ );
+ },
clearFocus: () => {
set({ focus: undefined });
},
diff --git a/packages/forms/src/builder/index.ts b/packages/forms/src/builder/index.ts
index b74f8203..0aeeb90c 100644
--- a/packages/forms/src/builder/index.ts
+++ b/packages/forms/src/builder/index.ts
@@ -2,6 +2,7 @@ import { type VoidResult } from '@atj/common';
import {
addPageToPageSet,
addPatternToFieldset,
+ addPatternToRepeater,
addPatternToPage,
copyPattern,
createOnePageBlueprint,
@@ -127,6 +128,16 @@ export class BlueprintBuilder {
return pattern;
}
+ addPatternToRepeater(patternType: string, fieldsetPatternId: PatternId) {
+ const pattern = createDefaultPattern(this.config, patternType);
+ const root = this.form.patterns[fieldsetPatternId] as FieldsetPattern;
+ if (root.type !== 'repeater') {
+ throw new Error('expected pattern to be a fieldset');
+ }
+ this.bp = addPatternToRepeater(this.form, fieldsetPatternId, pattern);
+ return pattern;
+ }
+
removePattern(id: PatternId) {
this.bp = removePatternFromBlueprint(this.config, this.bp, id);
}
diff --git a/packages/forms/src/components.ts b/packages/forms/src/components.ts
index f7b70061..3ba59990 100644
--- a/packages/forms/src/components.ts
+++ b/packages/forms/src/components.ts
@@ -167,6 +167,7 @@ export type GenderIdProps = PatternProps<{
export type RepeaterProps = PatternProps<{
type: 'repeater';
legend?: string;
+ showControls?: boolean;
subHeading?: string;
error?: FormError;
}>;
diff --git a/packages/forms/src/index.ts b/packages/forms/src/index.ts
index 9adfe2cd..526a63bb 100644
--- a/packages/forms/src/index.ts
+++ b/packages/forms/src/index.ts
@@ -29,4 +29,4 @@ export {
type FormRoute,
type RouteData,
getRouteDataFromQueryString,
-} from './route-data.js';
+} from './route-data.js';
\ No newline at end of file
diff --git a/packages/forms/src/patterns/repeater/index.ts b/packages/forms/src/patterns/repeater/index.ts
index e197a62f..4dee4836 100644
--- a/packages/forms/src/patterns/repeater/index.ts
+++ b/packages/forms/src/patterns/repeater/index.ts
@@ -8,6 +8,7 @@ import { createPrompt } from './prompt.js';
export type RepeaterPattern = Pattern<{
legend?: string;
+ showControls?: boolean;
patterns: PatternId[];
}>;
diff --git a/packages/forms/src/patterns/repeater/prompt.ts b/packages/forms/src/patterns/repeater/prompt.ts
index 671ba634..6a998327 100644
--- a/packages/forms/src/patterns/repeater/prompt.ts
+++ b/packages/forms/src/patterns/repeater/prompt.ts
@@ -21,6 +21,7 @@ export const createPrompt: CreatePrompt
= (
_patternId: pattern.id,
type: 'repeater',
legend: pattern.data.legend,
+ showControls: true,
} satisfies RepeaterProps,
children,
};
From 8e5513dd12ed434375c7c94b406225fb99045a47 Mon Sep 17 00:00:00 2001
From: ethangardner
Date: Thu, 26 Sep 2024 17:51:11 -0400
Subject: [PATCH 03/63] formatting
---
.../src/Form/components/Repeater/index.tsx | 26 ++++++++++++-------
.../components/RepeaterPatternEdit.tsx | 2 +-
2 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/packages/design/src/Form/components/Repeater/index.tsx b/packages/design/src/Form/components/Repeater/index.tsx
index 535c1fda..8edad0cb 100644
--- a/packages/design/src/Form/components/Repeater/index.tsx
+++ b/packages/design/src/Form/components/Repeater/index.tsx
@@ -2,9 +2,11 @@ import React, { useState } from 'react';
import { type RepeaterProps } from '@atj/forms';
import { type PatternComponent } from '../../../Form/index.js';
-const Repeater: PatternComponent = (props) => {
+const Repeater: PatternComponent = props => {
// Using state to store and manage children elements
- const [fields, setFields] = useState([React.Children.toArray(props.children)]);
+ const [fields, setFields] = useState([
+ React.Children.toArray(props.children),
+ ]);
// // Load initial state from localStorage if available
// useEffect(() => {
@@ -26,9 +28,9 @@ const Repeater: PatternComponent = (props) => {
// Handler to delete children
const handleDelete = (index: number) => {
- setFields((fields) => [
+ setFields(fields => [
...fields.slice(0, index),
- ...fields.slice(index + 1)
+ ...fields.slice(index + 1),
]);
};
@@ -44,7 +46,10 @@ const Repeater: PatternComponent = (props) => {
{props.showControls !== false ? (
-
+
Add new item
) : null}
>
- ) : null }
-
+ ) : null}
);
};
-export default Repeater;
\ No newline at end of file
+export default Repeater;
diff --git a/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit.tsx
index 2cf7af36..244da381 100644
--- a/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit.tsx
+++ b/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit.tsx
@@ -45,7 +45,7 @@ const RepeaterPreview: PatternComponent = props => {
);
const propsOverride = {
...props,
- showControls: false
+ showControls: false,
};
const pattern = useFormManagerStore(
state => state.session.form.patterns[props._patternId]
From a9fcb81dca257591163b032ce305d28b613ee7b0 Mon Sep 17 00:00:00 2001
From: ethangardner
Date: Fri, 27 Sep 2024 16:22:45 -0400
Subject: [PATCH 04/63] add presentational component for edit view
---
.../src/Form/components/Repeater/edit.tsx | 19 +++++++++
.../src/Form/components/Repeater/index.tsx | 42 +++++++++----------
.../components/RepeaterPatternEdit.tsx | 9 ++--
3 files changed, 41 insertions(+), 29 deletions(-)
create mode 100644 packages/design/src/Form/components/Repeater/edit.tsx
diff --git a/packages/design/src/Form/components/Repeater/edit.tsx b/packages/design/src/Form/components/Repeater/edit.tsx
new file mode 100644
index 00000000..b69e09ef
--- /dev/null
+++ b/packages/design/src/Form/components/Repeater/edit.tsx
@@ -0,0 +1,19 @@
+import React from 'react';
+import { type RepeaterProps } from '@atj/forms';
+import { type PatternComponent } from '../../../Form/index.js';
+
+const RepeaterEditView: PatternComponent = props => {
+ return (
+
+ {props.legend !== '' && props.legend !== undefined && (
+
+ {props.legend}
+
+ )}
+
+ {props.children}
+
+ );
+};
+
+export default RepeaterEditView;
diff --git a/packages/design/src/Form/components/Repeater/index.tsx b/packages/design/src/Form/components/Repeater/index.tsx
index 8edad0cb..ef7cf7e8 100644
--- a/packages/design/src/Form/components/Repeater/index.tsx
+++ b/packages/design/src/Form/components/Repeater/index.tsx
@@ -51,33 +51,29 @@ const Repeater: PatternComponent = props => {
className="padding-bottom-2 border-bottom border-base-lighter"
>
{item}
- {props.showControls !== false ? (
-
- handleDelete(index)}
- disabled={fields.length === 1}
- >
- Delete item
-
-
- ) : null}
+
+ handleDelete(index)}
+ disabled={fields.length === 1}
+ >
+ Delete item
+
+
);
})}
- {props.showControls !== false ? (
-
-
- Add new item
-
-
- ) : null}
+
+
+ Add new item
+
+
>
) : null}
diff --git a/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit.tsx
index 244da381..bc58b5f1 100644
--- a/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit.tsx
+++ b/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit.tsx
@@ -10,6 +10,7 @@ import {
} from '../AddPatternDropdown.js';
import { PatternComponent } from '../../../Form/index.js';
import Repeater from '../../../Form/components/Repeater/index.js';
+import RepeaterEditView from '../../../Form/components/Repeater/edit.js';
import { useFormManagerStore } from '../../store.js';
import { PatternEditComponent } from '../types.js';
@@ -43,16 +44,12 @@ const RepeaterPreview: PatternComponent = props => {
deletePattern: state.deletePattern,
})
);
- const propsOverride = {
- ...props,
- showControls: false,
- };
const pattern = useFormManagerStore(
state => state.session.form.patterns[props._patternId]
);
return (
<>
-
+
{props.children}
{pattern && pattern.data.patterns.length === 0 && (
= props => {
)}
-