@digigov/form 2.0.9 → 2.0.10

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.
Files changed (32) hide show
  1. package/CHANGELOG.md +11 -2
  2. package/FieldArray/BaseFieldArray.d.ts +3 -2
  3. package/FieldArray/BaseFieldArray.js +26 -4
  4. package/FieldArray/DeleteConfirmationModal.d.ts +8 -0
  5. package/FieldArray/DeleteConfirmationModal.js +29 -0
  6. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.js +3 -1
  7. package/FieldArray/FormDialog/ArrayDisplay/index.d.ts +2 -1
  8. package/FieldArray/FormDialog/ArrayDisplay/index.js +39 -6
  9. package/FieldArray/FormDialog/index.d.ts +1 -0
  10. package/FieldArray/FormDialog/index.js +3 -2
  11. package/FieldArray/index.js +2 -0
  12. package/index.js +1 -1
  13. package/lazy.d.ts +5 -35
  14. package/lazy.js +6 -3
  15. package/package.json +4 -4
  16. package/registry.d.ts +4 -3
  17. package/registry.js +8 -6
  18. package/src/FieldArray/BaseFieldArray.tsx +34 -3
  19. package/src/FieldArray/DeleteConfirmationModal.tsx +57 -0
  20. package/src/FieldArray/FieldArray.stories.js +1 -0
  21. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayDisplay.stories.js +1 -0
  22. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.tsx +3 -1
  23. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/WithDeleteConfirmation.tsx +94 -0
  24. package/src/FieldArray/FormDialog/ArrayDisplay/index.test.tsx +30 -26
  25. package/src/FieldArray/FormDialog/ArrayDisplay/index.tsx +70 -36
  26. package/src/FieldArray/FormDialog/index.tsx +3 -0
  27. package/src/FieldArray/__stories__/WithDeleteConfirmation.tsx +190 -0
  28. package/src/FieldArray/index.spec.tsx +42 -0
  29. package/src/FieldArray/index.test.tsx +27 -23
  30. package/src/FieldArray/index.tsx +2 -1
  31. package/src/lazy.ts +2 -1
  32. package/src/registry.ts +8 -6
package/CHANGELOG.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # Change Log - @digigov/form
2
2
 
3
- This log was last generated on Wed, 11 Feb 2026 14:46:37 GMT and should not be manually modified.
3
+ <!-- This log was last generated on Thu, 05 Mar 2026 17:08:26 GMT and should not be manually modified. -->
4
+
5
+ <!-- Start content -->
6
+
7
+ ## 2.0.10
8
+
9
+ Thu, 05 Mar 2026 17:08:26 GMT
10
+
11
+ ### Patches
12
+
13
+ - refactor ArrayDisplay and ArrayItemDisplay add deleteConfirmation prop (gpapadakis@admin.grnet.gr)
4
14
 
5
15
  ## 2.0.8
6
16
  Wed, 11 Feb 2026 14:46:37 GMT
@@ -726,4 +736,3 @@ _Version update only_
726
736
  Thu, 22 Apr 2021 12:56:25 GMT
727
737
 
728
738
  _Initial release_
729
-
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { FieldArrayProps } from './index.js';
3
- type BaseFieldArrayProps = Omit<FieldArrayProps, 'registerFieldFocus' | 'trigger' | 'clearErrors' | 'setValue' | 'reset' | 'resetField'>;
4
- export declare const BaseFieldArray: React.ForwardRefExoticComponent<BaseFieldArrayProps & React.RefAttributes<HTMLButtonElement>>;
3
+ export declare const BaseFieldArray: React.ForwardRefExoticComponent<Omit<FieldArrayProps, "reset" | "resetField" | "setValue" | "clearErrors" | "trigger" | "registerFieldFocus"> & {
4
+ deleteConfirmation?: boolean;
5
+ } & React.RefAttributes<HTMLButtonElement>>;
5
6
  export default BaseFieldArray;
@@ -1,15 +1,31 @@
1
- import react from "react";
1
+ import react, { useId, useRef } from "react";
2
2
  import { useFieldArray } from "react-hook-form";
3
+ import DeleteConfirmationModal from "./DeleteConfirmationModal.js";
3
4
  import { FieldObject } from "../FieldObject/index.js";
4
5
  import { Fieldset, FieldsetLabel } from "../Fieldset/index.js";
6
+ import { useModal } from "@digigov/ui/index.js";
5
7
  import { Card } from "@digigov/ui/content/Card/index.js";
6
8
  import { Button } from "@digigov/ui/form/Button/index.js";
7
- const BaseFieldArray_BaseFieldArray = /*#__PURE__*/ react.forwardRef(({ name, register, control, formState, error, getValues, Field, ...customField }, ref)=>{
9
+ const BaseFieldArray_BaseFieldArray = /*#__PURE__*/ react.forwardRef(({ name, register, control, formState, error, getValues, Field, deleteConfirmation, ...customField }, ref)=>{
8
10
  const { append, remove } = useFieldArray({
9
11
  control,
10
12
  name
11
13
  });
12
14
  const fields = getValues(name) || [];
15
+ const { registerModal, open, ...modalProps } = useModal();
16
+ const confirmationModalId = useId();
17
+ const indexOfItemToDelete = useRef(null);
18
+ const handleRemoveClick = react.useCallback((index)=>{
19
+ if (deleteConfirmation) {
20
+ indexOfItemToDelete.current = index;
21
+ open(confirmationModalId);
22
+ } else remove(index);
23
+ }, [
24
+ deleteConfirmation,
25
+ open,
26
+ remove,
27
+ confirmationModalId
28
+ ]);
13
29
  return /*#__PURE__*/ react.createElement(react.Fragment, null, fields.map((field, index)=>/*#__PURE__*/ react.createElement(Card, {
14
30
  variant: customField.extra?.border ? 'border' : 'divider',
15
31
  key: field.id || index
@@ -26,7 +42,9 @@ const BaseFieldArray_BaseFieldArray = /*#__PURE__*/ react.forwardRef(({ name, re
26
42
  variant: customField.extra?.label.object?.deleteButtonVariant,
27
43
  type: "button",
28
44
  color: "warning",
29
- onClick: ()=>remove(index),
45
+ onClick: ()=>{
46
+ handleRemoveClick(index);
47
+ },
30
48
  disabled: !customField?.editable
31
49
  }, customField.extra?.label.object?.delete)))), customField.editable && /*#__PURE__*/ react.createElement(Button, {
32
50
  ref: ref,
@@ -39,7 +57,11 @@ const BaseFieldArray_BaseFieldArray = /*#__PURE__*/ react.forwardRef(({ name, re
39
57
  append({});
40
58
  },
41
59
  disabled: !customField?.editable
42
- }, customField.extra?.label.object?.add));
60
+ }, customField.extra?.label.object?.add), /*#__PURE__*/ react.createElement(DeleteConfirmationModal, {
61
+ ...modalProps,
62
+ ...registerModal(confirmationModalId),
63
+ remove: ()=>null !== indexOfItemToDelete.current ? remove(indexOfItemToDelete.current) : ()=>{}
64
+ }));
43
65
  });
44
66
  BaseFieldArray_BaseFieldArray.displayName = 'BaseFieldArray';
45
67
  const BaseFieldArray = BaseFieldArray_BaseFieldArray;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { ModalProps } from '@digigov/ui';
3
+ export interface DeleteConfirmationModalProps extends ModalProps {
4
+ remove: () => void;
5
+ close: () => void;
6
+ }
7
+ export declare const DeleteConfirmationModal: ({ remove, close, ...props }: DeleteConfirmationModalProps) => React.JSX.Element;
8
+ export default DeleteConfirmationModal;
@@ -0,0 +1,29 @@
1
+ import react, { useId } from "react";
2
+ import { Button, Modal, ModalAction, ModalContent, ModalHeading, Paragraph } from "@digigov/ui/index.js";
3
+ const DeleteConfirmationModal_DeleteConfirmationModal = ({ remove, close, ...props })=>{
4
+ const headingId = useId();
5
+ return /*#__PURE__*/ react.createElement(Modal, {
6
+ ...props,
7
+ "aria-labelledby": headingId
8
+ }, /*#__PURE__*/ react.createElement(ModalHeading, {
9
+ id: headingId
10
+ }, "Επιβεβαίωση διαγραφής"), /*#__PURE__*/ react.createElement(ModalContent, null, /*#__PURE__*/ react.createElement(Paragraph, {
11
+ margin: 0
12
+ }, "Είστε σίγουροι ότι θέλετε να διαγράψετε την εγγραφή;")), /*#__PURE__*/ react.createElement(ModalAction, null, /*#__PURE__*/ react.createElement(Button, {
13
+ color: "warning",
14
+ onClick: (e)=>{
15
+ e.preventDefault();
16
+ remove();
17
+ close();
18
+ }
19
+ }, "Διαγραφή"), /*#__PURE__*/ react.createElement(Button, {
20
+ variant: "link",
21
+ type: "button",
22
+ onClick: (e)=>{
23
+ e.preventDefault();
24
+ close();
25
+ }
26
+ }, "Ακύρωση")));
27
+ };
28
+ const DeleteConfirmationModal = DeleteConfirmationModal_DeleteConfirmationModal;
29
+ export { DeleteConfirmationModal_DeleteConfirmationModal as DeleteConfirmationModal, DeleteConfirmationModal as default };
@@ -72,7 +72,9 @@ const ArrayItemDisplay = ({ name, data, edit, remove, disabledEdit, disabledDele
72
72
  }, "Επεξεργασία"), true !== disabledDelete && /*#__PURE__*/ react.createElement(Button, {
73
73
  variant: "link",
74
74
  type: "button",
75
- onClick: ()=>remove(name)
75
+ onClick: ()=>{
76
+ remove(name);
77
+ }
76
78
  }, "Διαγραφή")), sortable && /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(SectionBreak, null), sortable && !disabled && !(isFirst && isLast) && /*#__PURE__*/ react.createElement(NormalText, {
77
79
  mb: 0
78
80
  }, "Μετακίνηση", ' ', !isFirst && /*#__PURE__*/ react.createElement(react.Fragment, null, "προς τα", ' ', /*#__PURE__*/ react.createElement(Button, {
@@ -9,7 +9,8 @@ export interface ArrayDisplayProps {
9
9
  onRemove: (index: number) => void;
10
10
  move: UseFieldArrayMove;
11
11
  sortable: boolean;
12
+ deleteConfirmation?: boolean;
12
13
  error?: any;
13
14
  }
14
- export declare const ArrayDisplay: ({ fieldArrayName, fieldArrayValues, ofField, customField, onEdit, onRemove, move, sortable, error, }: ArrayDisplayProps) => React.JSX.Element;
15
+ export declare const ArrayDisplay: ({ fieldArrayName, fieldArrayValues, ofField, customField, onEdit, onRemove, move, sortable, deleteConfirmation, error, }: ArrayDisplayProps) => React.JSX.Element;
15
16
  export default ArrayDisplay;
@@ -1,7 +1,27 @@
1
- import react from "react";
1
+ import react, { useId, useState } from "react";
2
+ import DeleteConfirmationModal from "../../DeleteConfirmationModal.js";
2
3
  import { ArrayContainerDisplay } from "./ArrayContainerDisplay.js";
3
4
  import { ArrayItemDisplay } from "./ArrayItemDisplay.js";
4
- const ArrayDisplay = ({ fieldArrayName, fieldArrayValues, ofField, customField, onEdit, onRemove, move, sortable, error })=>/*#__PURE__*/ react.createElement(ArrayContainerDisplay, {
5
+ import { omit } from "../../../utils.js";
6
+ import { useModal } from "@digigov/ui/index.js";
7
+ const ArrayDisplay_ArrayDisplay = ({ fieldArrayName, fieldArrayValues, ofField, customField, onEdit, onRemove, move, sortable, deleteConfirmation, error })=>{
8
+ const confirmationModalId = useId();
9
+ const [removeCurrentModal, setRemoveCurrentModal] = useState(-1);
10
+ const { registerModal, open, ...modalProps } = useModal();
11
+ const handleRemoveClick = react.useCallback((index)=>{
12
+ const needsConfirmation = deleteConfirmation || customField.extra?.deleteConfirmation;
13
+ if (needsConfirmation) {
14
+ setRemoveCurrentModal(index);
15
+ open(confirmationModalId);
16
+ } else onRemove(index);
17
+ }, [
18
+ deleteConfirmation,
19
+ customField.extra,
20
+ open,
21
+ onRemove,
22
+ confirmationModalId
23
+ ]);
24
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(ArrayContainerDisplay, {
5
25
  fieldArrayValues: fieldArrayValues,
6
26
  ofField: ofField,
7
27
  customField: customField
@@ -17,7 +37,7 @@ const ArrayDisplay = ({ fieldArrayName, fieldArrayValues, ofField, customField,
17
37
  stackProps: customField?.extra?.stackProps,
18
38
  wordBreak: customField?.extra?.wordBreak,
19
39
  valueDisplay: customField?.extra?.valueDisplay,
20
- remove: ()=>onRemove(index),
40
+ remove: ()=>handleRemoveClick(index),
21
41
  border: customField.extra?.border,
22
42
  move: move,
23
43
  sortable: sortable,
@@ -27,6 +47,19 @@ const ArrayDisplay = ({ fieldArrayName, fieldArrayValues, ofField, customField,
27
47
  fieldArrayValues: fieldArrayValues,
28
48
  ofField: ofField,
29
49
  customField: customField
30
- })));
31
- const FormDialog_ArrayDisplay = ArrayDisplay;
32
- export { ArrayDisplay, FormDialog_ArrayDisplay as default };
50
+ }))), /*#__PURE__*/ react.createElement(DeleteConfirmationModal, {
51
+ ...omit(modalProps, [
52
+ 'registerAction',
53
+ 'currentOpen'
54
+ ]),
55
+ ...registerModal(confirmationModalId),
56
+ remove: ()=>{
57
+ if (-1 !== removeCurrentModal) {
58
+ onRemove(removeCurrentModal);
59
+ setRemoveCurrentModal(-1);
60
+ }
61
+ }
62
+ }));
63
+ };
64
+ const ArrayDisplay = ArrayDisplay_ArrayDisplay;
65
+ export { ArrayDisplay_ArrayDisplay as ArrayDisplay, ArrayDisplay as default };
@@ -14,6 +14,7 @@ export interface FormDialogProps extends FieldProps {
14
14
  resetField?: UseFormReturn['resetField'];
15
15
  sortable: boolean;
16
16
  Field: React.FC<FieldProps>;
17
+ deleteConfirmation?: boolean;
17
18
  }
18
19
  export declare const FormDialog: React.ForwardRefExoticComponent<FormDialogProps & React.RefAttributes<HTMLButtonElement>>;
19
20
  export default FormDialog;
@@ -6,7 +6,7 @@ import { useFormContext } from "../../FormContext.js";
6
6
  import { useModal } from "@digigov/ui/app/Modal/index.js";
7
7
  import { Button } from "@digigov/ui/form/Button/index.js";
8
8
  import { Hint } from "@digigov/ui/typography/Hint/index.js";
9
- const FormDialog = /*#__PURE__*/ react.forwardRef(({ name: fieldArrayName, control, error, getValues, Field, sortable, ...customField }, ref)=>{
9
+ const FormDialog = /*#__PURE__*/ react.forwardRef(({ name: fieldArrayName, control, error, getValues, Field, sortable, deleteConfirmation = false, ...customField }, ref)=>{
10
10
  const [isAppending, setIsAppending] = useState(false);
11
11
  const [editingIndex, setEditingIndex] = useState(0);
12
12
  const { fields, append, remove, update, move } = useFieldArray({
@@ -181,7 +181,8 @@ const FormDialog = /*#__PURE__*/ react.forwardRef(({ name: fieldArrayName, contr
181
181
  onRemove: handleRemove,
182
182
  move: handleMove,
183
183
  sortable: sortable,
184
- error: error
184
+ error: error,
185
+ deleteConfirmation: deleteConfirmation
185
186
  }), customField.extra?.editVariant !== 'display' && !customField.extra?.noAdd && /*#__PURE__*/ react.createElement("div", {
186
187
  className: customField.extra?.label.object?.addButtonVariant === 'link' ? 'px-2 py-2 bg-gray-200 border-t border-b border-gray-400' : '',
187
188
  ...customField?.extra?.label.object?.buttonGroup
@@ -49,6 +49,7 @@ const FieldArray = ({ name, trigger, register, clearErrors, control, formState,
49
49
  reset: reset,
50
50
  resetField: resetField,
51
51
  sortable: customField.extra.sortable,
52
+ deleteConfirmation: customField.extra?.deleteConfirmation,
52
53
  ...customField
53
54
  }) : /*#__PURE__*/ react.createElement(BaseFieldArray, {
54
55
  ref: buttonRef,
@@ -59,6 +60,7 @@ const FieldArray = ({ name, trigger, register, clearErrors, control, formState,
59
60
  error: error,
60
61
  getValues: getValues,
61
62
  Field: Field,
63
+ deleteConfirmation: customField.extra?.deleteConfirmation,
62
64
  ...customField
63
65
  }));
64
66
  };
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license Digigov v2.0.9
1
+ /** @license Digigov v2.0.10
2
2
  *
3
3
  * This source code is licensed under the BSD-2-Clause license found in the
4
4
  * LICENSE file in the root directory of this source tree.
package/lazy.d.ts CHANGED
@@ -8,42 +8,12 @@ declare const _default: {
8
8
  FieldBase: import("react").LazyExoticComponent<import("react").FC<import("./internal.js").FieldBaseProps>>;
9
9
  FieldBaseContainer: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("./internal.js").FieldContainerProps & import("react").RefAttributes<HTMLFieldSetElement>>>;
10
10
  FieldConditional: import("react").LazyExoticComponent<import("react").FC<import("./internal.js").FieldConditionalProps>>;
11
- BaseFieldArray: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<{
12
- label?: import("./internal.js").FieldLabelProps | undefined;
13
- trim?: boolean | undefined;
14
- children?: React.ReactNode;
15
- key: string;
16
- disabled?: boolean | undefined;
17
- autoComplete?: string | undefined;
18
- maxLength?: number | undefined;
19
- error?: import("react-hook-form").ErrorOption | undefined;
20
- width?: string | undefined;
21
- max?: number | undefined;
22
- min?: number | undefined;
23
- name: string;
24
- placeholder?: string | undefined;
25
- required?: boolean | undefined;
26
- type?: ("int" | "string" | "text" | "boolean" | "email" | "uuid4" | "choice:multiple" | "choice:single" | "mobile_phone" | "date" | "datetime" | "otp" | "afm" | "amka" | "iban" | "file" | "rate" | "image" | "postal_code" | "phone_number" | "array" | "object") | undefined;
27
- variant?: ("inline" | "dialog") | undefined;
28
- layout?: Record<string, import("@digigov/ui/src/index.js").GridProps["xs"] | import("@digigov/ui/src/index.js").GridProps["sm"] | import("@digigov/ui/src/index.js").GridProps["md"] | import("@digigov/ui/src/index.js").GridProps["lg"] | import("@digigov/ui/src/index.js").GridProps["xl"]> | undefined;
29
- Field: React.FC<import("./internal.js").FieldProps>;
30
- extra?: Record<string, any> | undefined;
31
- maxWidth?: string | undefined;
32
- register: import("react-hook-form").UseFormReturn["register"];
33
- control: import("react-hook-form").UseFormReturn["control"];
34
- getValues: import("react-hook-form").UseFormReturn["getValues"];
35
- component?: any;
36
- condition?: Record<string, import("./internal.js").FieldCondition> | undefined;
37
- controlled?: boolean | undefined;
38
- editable?: boolean | undefined;
39
- enabled?: boolean | undefined;
40
- validators?: import("./validators/types.js").ValidatorSchema[] | undefined;
41
- wrapper?: ("label" | "fieldset") | undefined;
42
- maxHeight?: string | undefined;
43
- formState: import("react-hook-form").UseFormReturn["formState"];
11
+ FieldObject: import("react").LazyExoticComponent<import("react").FC<import("./FieldObject/index.js").FieldObjectProps>>;
12
+ BaseFieldArray: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<Omit<import("./FieldArray/index.js").FieldArrayProps, "reset" | "resetField" | "setValue" | "clearErrors" | "trigger" | "registerFieldFocus"> & {
13
+ deleteConfirmation?: boolean;
44
14
  } & import("react").RefAttributes<HTMLButtonElement>>>;
15
+ DeleteConfirmationModal: import("react").LazyExoticComponent<({ remove, close, ...props }: import("./FieldArray/DeleteConfirmationModal.js").DeleteConfirmationModalProps) => import("react").JSX.Element>;
45
16
  FieldArray: import("react").LazyExoticComponent<import("react").FC<import("./FieldArray/index.js").FieldArrayProps>>;
46
- FieldObject: import("react").LazyExoticComponent<import("react").FC<import("./FieldObject/index.js").FieldObjectProps>>;
47
17
  FieldsetWithContext: import("react").LazyExoticComponent<import("react").FC<{
48
18
  name: string;
49
19
  }>>;
@@ -92,6 +62,6 @@ declare const _default: {
92
62
  labels: any;
93
63
  disabled: any;
94
64
  }) => import("react").JSX.Element>;
95
- ArrayDisplay: import("react").LazyExoticComponent<({ fieldArrayName, fieldArrayValues, ofField, customField, onEdit, onRemove, move, sortable, error, }: import("./FieldArray/FormDialog/ArrayDisplay/index.js").ArrayDisplayProps) => import("react").JSX.Element>;
65
+ ArrayDisplay: import("react").LazyExoticComponent<({ fieldArrayName, fieldArrayValues, ofField, customField, onEdit, onRemove, move, sortable, deleteConfirmation, error, }: import("./FieldArray/FormDialog/ArrayDisplay/index.js").ArrayDisplayProps) => import("react").JSX.Element>;
96
66
  };
97
67
  export default _default;
package/lazy.js CHANGED
@@ -27,15 +27,18 @@ const src_lazy = {
27
27
  FieldConditional: lazy(()=>import("./Field/FieldConditional.js").then((module)=>({
28
28
  default: module['FieldConditional']
29
29
  }))),
30
+ FieldObject: lazy(()=>import("./FieldObject/index.js").then((module)=>({
31
+ default: module['FieldObject']
32
+ }))),
30
33
  BaseFieldArray: lazy(()=>import("./FieldArray/BaseFieldArray.js").then((module)=>({
31
34
  default: module['BaseFieldArray']
32
35
  }))),
36
+ DeleteConfirmationModal: lazy(()=>import("./FieldArray/DeleteConfirmationModal.js").then((module)=>({
37
+ default: module['DeleteConfirmationModal']
38
+ }))),
33
39
  FieldArray: lazy(()=>import("./FieldArray/index.js").then((module)=>({
34
40
  default: module['FieldArray']
35
41
  }))),
36
- FieldObject: lazy(()=>import("./FieldObject/index.js").then((module)=>({
37
- default: module['FieldObject']
38
- }))),
39
42
  FieldsetWithContext: lazy(()=>import("./Fieldset/FieldsetWithContext.js").then((module)=>({
40
43
  default: module['FieldsetWithContext']
41
44
  }))),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digigov/form",
3
- "version": "2.0.9",
3
+ "version": "2.0.10",
4
4
  "description": "@digigov form builder",
5
5
  "author": "GRNET Developers <devs@lists.grnet.gr>",
6
6
  "license": "BSD-2-Clause",
@@ -15,14 +15,14 @@
15
15
  "yup": "0.32.11",
16
16
  "dayjs": "1.10.4",
17
17
  "@hookform/resolvers": "5.0.1",
18
- "@digigov/react-icons": "2.0.9"
18
+ "@digigov/react-icons": "2.0.10"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "clsx": "2.1.1",
22
22
  "react": "^18.3.0 || ^19.1.0",
23
23
  "react-dom": "^18.3.0 || ^19.1.0",
24
- "@digigov/ui": "2.0.9",
25
- "@digigov/react-core": "2.0.9"
24
+ "@digigov/ui": "2.0.10",
25
+ "@digigov/react-core": "2.0.10"
26
26
  },
27
27
  "gitHead": "c903a46306f77f55ad7fc4d2e274006f39a6c871",
28
28
  "private": false,
package/registry.d.ts CHANGED
@@ -10,9 +10,10 @@ declare const _default: {
10
10
  '@digigov/form/Field/FieldConditional': {};
11
11
  '@digigov/form/Field': {};
12
12
  '@digigov/form/Field/types': {};
13
+ '@digigov/form/FieldObject': {};
13
14
  '@digigov/form/FieldArray/BaseFieldArray': {};
15
+ '@digigov/form/FieldArray/DeleteConfirmationModal': {};
14
16
  '@digigov/form/FieldArray': {};
15
- '@digigov/form/FieldObject': {};
16
17
  '@digigov/form/Fieldset/FieldsetWithContext': {};
17
18
  '@digigov/form/Fieldset': {};
18
19
  '@digigov/form/Fieldset/types': {};
@@ -49,13 +50,13 @@ declare const _default: {
49
50
  '@digigov/form/Questions/Step/types': {};
50
51
  '@digigov/form/inputs/AutoCompleteInput': {};
51
52
  '@digigov/form/inputs/Checkboxes': {};
52
- '@digigov/form/inputs/DateTimeInput': {};
53
53
  '@digigov/form/inputs/DateInput': {};
54
+ '@digigov/form/inputs/DateTimeInput': {};
54
55
  '@digigov/form/inputs/FileInput': {};
55
56
  '@digigov/form/inputs/ImageInput': {};
56
57
  '@digigov/form/inputs/Input': {};
57
- '@digigov/form/inputs/OtpInput': {};
58
58
  '@digigov/form/inputs/Label': {};
59
+ '@digigov/form/inputs/OtpInput': {};
59
60
  '@digigov/form/inputs/Radio': {};
60
61
  '@digigov/form/inputs/Select': {};
61
62
  '@digigov/form/validators/utils/afm': {};
package/registry.js CHANGED
@@ -11,9 +11,10 @@ import * as __WEBPACK_EXTERNAL_MODULE__Field_FieldBase_js_c624a2e3__ from "./Fie
11
11
  import * as __WEBPACK_EXTERNAL_MODULE__Field_FieldBaseContainer_js_01a670a9__ from "./Field/FieldBaseContainer.js";
12
12
  import * as __WEBPACK_EXTERNAL_MODULE__Field_FieldConditional_js_198c9ee9__ from "./Field/FieldConditional.js";
13
13
  import * as __WEBPACK_EXTERNAL_MODULE__Field_types_js_6ef04275__ from "./Field/types.js";
14
+ import * as __WEBPACK_EXTERNAL_MODULE__FieldObject_index_js_3053c0b3__ from "./FieldObject/index.js";
14
15
  import * as __WEBPACK_EXTERNAL_MODULE__FieldArray_BaseFieldArray_js_51879b3c__ from "./FieldArray/BaseFieldArray.js";
16
+ import * as __WEBPACK_EXTERNAL_MODULE__FieldArray_DeleteConfirmationModal_js_c12845d4__ from "./FieldArray/DeleteConfirmationModal.js";
15
17
  import * as __WEBPACK_EXTERNAL_MODULE__FieldArray_index_js_f6888d1e__ from "./FieldArray/index.js";
16
- import * as __WEBPACK_EXTERNAL_MODULE__FieldObject_index_js_3053c0b3__ from "./FieldObject/index.js";
17
18
  import * as __WEBPACK_EXTERNAL_MODULE__Fieldset_FieldsetWithContext_js_aa40ade4__ from "./Fieldset/FieldsetWithContext.js";
18
19
  import * as __WEBPACK_EXTERNAL_MODULE__Fieldset_types_js_45030319__ from "./Fieldset/types.js";
19
20
  import * as __WEBPACK_EXTERNAL_MODULE__MultiplicityField_add_objects_js_bc5e12f3__ from "./MultiplicityField/add-objects.js";
@@ -48,13 +49,13 @@ import * as __WEBPACK_EXTERNAL_MODULE__Questions_Step_index_js_a5d00e0e__ from "
48
49
  import * as __WEBPACK_EXTERNAL_MODULE__Questions_Step_types_js_adca4924__ from "./Questions/Step/types.js";
49
50
  import * as __WEBPACK_EXTERNAL_MODULE__inputs_AutoCompleteInput_index_js_64b911d2__ from "./inputs/AutoCompleteInput/index.js";
50
51
  import * as __WEBPACK_EXTERNAL_MODULE__inputs_Checkboxes_index_js_794dd192__ from "./inputs/Checkboxes/index.js";
51
- import * as __WEBPACK_EXTERNAL_MODULE__inputs_DateTimeInput_index_js_c8900e1c__ from "./inputs/DateTimeInput/index.js";
52
52
  import * as __WEBPACK_EXTERNAL_MODULE__inputs_DateInput_index_js_4dd00af8__ from "./inputs/DateInput/index.js";
53
+ import * as __WEBPACK_EXTERNAL_MODULE__inputs_DateTimeInput_index_js_c8900e1c__ from "./inputs/DateTimeInput/index.js";
53
54
  import * as __WEBPACK_EXTERNAL_MODULE__inputs_FileInput_index_js_a3efab43__ from "./inputs/FileInput/index.js";
54
55
  import * as __WEBPACK_EXTERNAL_MODULE__inputs_ImageInput_index_js_db0d371d__ from "./inputs/ImageInput/index.js";
55
56
  import * as __WEBPACK_EXTERNAL_MODULE__inputs_Input_index_js_a3d24895__ from "./inputs/Input/index.js";
56
- import * as __WEBPACK_EXTERNAL_MODULE__inputs_OtpInput_index_js_cf892bf0__ from "./inputs/OtpInput/index.js";
57
57
  import * as __WEBPACK_EXTERNAL_MODULE__inputs_Label_index_js_fd36dbbf__ from "./inputs/Label/index.js";
58
+ import * as __WEBPACK_EXTERNAL_MODULE__inputs_OtpInput_index_js_cf892bf0__ from "./inputs/OtpInput/index.js";
58
59
  import * as __WEBPACK_EXTERNAL_MODULE__inputs_Radio_index_js_dd4e4535__ from "./inputs/Radio/index.js";
59
60
  import * as __WEBPACK_EXTERNAL_MODULE__inputs_Select_index_js_96a2f597__ from "./inputs/Select/index.js";
60
61
  import * as __WEBPACK_EXTERNAL_MODULE__validators_utils_afm_js_d3ce9cd4__ from "./validators/utils/afm.js";
@@ -98,9 +99,10 @@ const registry = {
98
99
  '@digigov/form/Field/FieldConditional': lazyImport(__WEBPACK_EXTERNAL_MODULE__Field_FieldConditional_js_198c9ee9__),
99
100
  '@digigov/form/Field': lazyImport(__WEBPACK_EXTERNAL_MODULE__Field_index_js_29296f3b__),
100
101
  '@digigov/form/Field/types': lazyImport(__WEBPACK_EXTERNAL_MODULE__Field_types_js_6ef04275__),
102
+ '@digigov/form/FieldObject': lazyImport(__WEBPACK_EXTERNAL_MODULE__FieldObject_index_js_3053c0b3__),
101
103
  '@digigov/form/FieldArray/BaseFieldArray': lazyImport(__WEBPACK_EXTERNAL_MODULE__FieldArray_BaseFieldArray_js_51879b3c__),
104
+ '@digigov/form/FieldArray/DeleteConfirmationModal': lazyImport(__WEBPACK_EXTERNAL_MODULE__FieldArray_DeleteConfirmationModal_js_c12845d4__),
102
105
  '@digigov/form/FieldArray': lazyImport(__WEBPACK_EXTERNAL_MODULE__FieldArray_index_js_f6888d1e__),
103
- '@digigov/form/FieldObject': lazyImport(__WEBPACK_EXTERNAL_MODULE__FieldObject_index_js_3053c0b3__),
104
106
  '@digigov/form/Fieldset/FieldsetWithContext': lazyImport(__WEBPACK_EXTERNAL_MODULE__Fieldset_FieldsetWithContext_js_aa40ade4__),
105
107
  '@digigov/form/Fieldset': lazyImport(__WEBPACK_EXTERNAL_MODULE__Fieldset_index_js_3b7183e3__),
106
108
  '@digigov/form/Fieldset/types': lazyImport(__WEBPACK_EXTERNAL_MODULE__Fieldset_types_js_45030319__),
@@ -137,13 +139,13 @@ const registry = {
137
139
  '@digigov/form/Questions/Step/types': lazyImport(__WEBPACK_EXTERNAL_MODULE__Questions_Step_types_js_adca4924__),
138
140
  '@digigov/form/inputs/AutoCompleteInput': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_AutoCompleteInput_index_js_64b911d2__),
139
141
  '@digigov/form/inputs/Checkboxes': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_Checkboxes_index_js_794dd192__),
140
- '@digigov/form/inputs/DateTimeInput': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_DateTimeInput_index_js_c8900e1c__),
141
142
  '@digigov/form/inputs/DateInput': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_DateInput_index_js_4dd00af8__),
143
+ '@digigov/form/inputs/DateTimeInput': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_DateTimeInput_index_js_c8900e1c__),
142
144
  '@digigov/form/inputs/FileInput': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_FileInput_index_js_a3efab43__),
143
145
  '@digigov/form/inputs/ImageInput': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_ImageInput_index_js_db0d371d__),
144
146
  '@digigov/form/inputs/Input': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_Input_index_js_a3d24895__),
145
- '@digigov/form/inputs/OtpInput': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_OtpInput_index_js_cf892bf0__),
146
147
  '@digigov/form/inputs/Label': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_Label_index_js_fd36dbbf__),
148
+ '@digigov/form/inputs/OtpInput': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_OtpInput_index_js_cf892bf0__),
147
149
  '@digigov/form/inputs/Radio': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_Radio_index_js_dd4e4535__),
148
150
  '@digigov/form/inputs/Select': lazyImport(__WEBPACK_EXTERNAL_MODULE__inputs_Select_index_js_96a2f597__),
149
151
  '@digigov/form/validators/utils/afm': lazyImport(__WEBPACK_EXTERNAL_MODULE__validators_utils_afm_js_d3ce9cd4__),
@@ -1,8 +1,10 @@
1
- import React from 'react';
1
+ import React, { useRef, useId } from 'react';
2
2
  import { useFieldArray } from 'react-hook-form';
3
3
  import type { FieldArrayProps } from '@digigov/form/FieldArray';
4
+ import DeleteConfirmationModal from '@digigov/form/FieldArray/DeleteConfirmationModal';
4
5
  import { FieldObject } from '@digigov/form/FieldObject';
5
6
  import { FieldsetLabel, Fieldset } from '@digigov/form/Fieldset';
7
+ import { useModal } from '@digigov/ui';
6
8
  import { Card } from '@digigov/ui/content/Card';
7
9
  import { Button } from '@digigov/ui/form/Button';
8
10
 
@@ -14,7 +16,9 @@ type BaseFieldArrayProps = Omit<
14
16
  | 'setValue'
15
17
  | 'reset'
16
18
  | 'resetField'
17
- >;
19
+ > & {
20
+ deleteConfirmation?: boolean;
21
+ };
18
22
  export const BaseFieldArray = React.forwardRef<
19
23
  HTMLButtonElement,
20
24
  BaseFieldArrayProps
@@ -28,6 +32,7 @@ export const BaseFieldArray = React.forwardRef<
28
32
  error,
29
33
  getValues,
30
34
  Field,
35
+ deleteConfirmation,
31
36
  ...customField
32
37
  },
33
38
  ref
@@ -37,6 +42,21 @@ export const BaseFieldArray = React.forwardRef<
37
42
  name,
38
43
  });
39
44
  const fields = getValues(name) || [];
45
+ const { registerModal, open, ...modalProps } = useModal();
46
+ const confirmationModalId = useId();
47
+ const indexOfItemToDelete = useRef<number | null>(null);
48
+
49
+ const handleRemoveClick = React.useCallback(
50
+ (index: number) => {
51
+ if (deleteConfirmation) {
52
+ indexOfItemToDelete.current = index;
53
+ open(confirmationModalId);
54
+ } else {
55
+ remove(index);
56
+ }
57
+ },
58
+ [deleteConfirmation, open, remove, confirmationModalId]
59
+ );
40
60
 
41
61
  return (
42
62
  <>
@@ -63,7 +83,9 @@ export const BaseFieldArray = React.forwardRef<
63
83
  variant={customField.extra?.label.object?.deleteButtonVariant}
64
84
  type="button"
65
85
  color="warning"
66
- onClick={() => remove(index)}
86
+ onClick={() => {
87
+ handleRemoveClick(index);
88
+ }}
67
89
  disabled={!customField?.editable}
68
90
  >
69
91
  {customField.extra?.label.object?.delete}
@@ -87,6 +109,15 @@ export const BaseFieldArray = React.forwardRef<
87
109
  {customField.extra?.label.object?.add}
88
110
  </Button>
89
111
  )}
112
+ <DeleteConfirmationModal
113
+ {...modalProps}
114
+ {...registerModal(confirmationModalId)}
115
+ remove={() =>
116
+ indexOfItemToDelete.current !== null
117
+ ? remove(indexOfItemToDelete.current)
118
+ : () => {}
119
+ }
120
+ />
90
121
  </>
91
122
  );
92
123
  }
@@ -0,0 +1,57 @@
1
+ import React, { useId } from 'react';
2
+ import type { ModalProps } from '@digigov/ui';
3
+ import {
4
+ Button,
5
+ Modal,
6
+ ModalAction,
7
+ ModalContent,
8
+ ModalHeading,
9
+ Paragraph,
10
+ } from '@digigov/ui';
11
+
12
+ export interface DeleteConfirmationModalProps extends ModalProps {
13
+ remove: () => void;
14
+ close: () => void;
15
+ }
16
+
17
+ export const DeleteConfirmationModal = ({
18
+ remove,
19
+ close,
20
+ ...props
21
+ }: DeleteConfirmationModalProps) => {
22
+ const headingId = useId();
23
+ return (
24
+ <Modal {...props} aria-labelledby={headingId}>
25
+ <ModalHeading id={headingId}>Επιβεβαίωση διαγραφής</ModalHeading>
26
+ <ModalContent>
27
+ <Paragraph margin={0}>
28
+ Είστε σίγουροι ότι θέλετε να διαγράψετε την εγγραφή;
29
+ </Paragraph>
30
+ </ModalContent>
31
+ <ModalAction>
32
+ <Button
33
+ color="warning"
34
+ onClick={(e) => {
35
+ e.preventDefault();
36
+ remove();
37
+ close();
38
+ }}
39
+ >
40
+ Διαγραφή
41
+ </Button>
42
+ <Button
43
+ variant="link"
44
+ type="button"
45
+ onClick={(e) => {
46
+ e.preventDefault();
47
+ close();
48
+ }}
49
+ >
50
+ Ακύρωση
51
+ </Button>
52
+ </ModalAction>
53
+ </Modal>
54
+ );
55
+ };
56
+
57
+ export default DeleteConfirmationModal;
@@ -7,4 +7,5 @@ export default {
7
7
  export { Default } from '@digigov/form/FieldArray/__stories__/Default';
8
8
  export { WithModal } from '@digigov/form/FieldArray/__stories__/WithModal';
9
9
  export { WithExactLength } from '@digigov/form/FieldArray/__stories__/WithExactLength';
10
+ export { WithDeleteConfirmation } from '@digigov/form/FieldArray/__stories__/WithDeleteConfirmation';
10
11
  export { CardsWithError } from '@digigov/form/FieldArray/__stories__/CardsWithError';
@@ -12,3 +12,4 @@ export { ReadOnly } from '@digigov/form/FieldArray/FormDialog/ArrayDisplay/__sto
12
12
  export { Cards } from '@digigov/form/FieldArray/FormDialog/ArrayDisplay/__stories__/Cards';
13
13
  export { SortableCards } from '@digigov/form/FieldArray/FormDialog/ArrayDisplay/__stories__/SortableCards';
14
14
  export { ReadOnlyCards } from '@digigov/form/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnlyCards';
15
+ export { WithDeleteConfirmation } from '@digigov/form/FieldArray/FormDialog/ArrayDisplay/__stories__/WithDeleteConfirmation';
@@ -209,7 +209,9 @@ export const ArrayItemDisplay = ({
209
209
  <Button
210
210
  variant="link"
211
211
  type="button"
212
- onClick={() => remove(name)}
212
+ onClick={() => {
213
+ remove(name);
214
+ }}
213
215
  >
214
216
  Διαγραφή
215
217
  </Button>