{"version":3,"file":"FormDialog.mocks.jsx","sourceRoot":"","sources":["../../../src/core/Dialog/FormDialog.mocks.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useReducer, useState } from 'react';\nimport type { ChangeEvent, FocusEvent } from 'react';\n\nimport {\n  ComboBox,\n  createUID,\n  Flex,\n  FormDialog,\n  Input,\n  SummaryList,\n  Text\n} from '@pega/cosmos-react-core';\nimport type { FormDialogProps, SummaryListItem } from '@pega/cosmos-react-core';\n\nimport { loadingTimeoutMS } from '../Progress/Progress.mocks';\n\nexport type MockCategory = `Category ${number}`;\n\nexport interface MockItem {\n  readonly id: string;\n  name: string;\n  category: MockCategory;\n}\n\nexport type MockReducerPayload =\n  | {\n      type: 'add';\n      item: Pick<MockItem, 'name' | 'category'>;\n    }\n  | {\n      type: 'edit';\n      item: MockItem;\n    }\n  | {\n      type: 'remove';\n      item: Pick<MockItem, 'id'>;\n    };\n\nexport interface MockItemDialogProps extends Pick<FormDialogProps, 'target'> {\n  item: MockItem | null;\n  dispatch: (fieldValues: Pick<MockItem, 'name' | 'category'>) => void;\n  onComplete: () => void;\n}\n\nconst errorText = 'Cannot be blank';\n\nconst categories = Array.from({ length: 5 }, (_, i): MockCategory => `Category ${i + 1}`);\n\nconst initialItems: MockItem[] = Array.from({ length: 3 }, (_, i) => {\n  return {\n    id: createUID(),\n    name: `Editable item ${i + 1}`,\n    category: categories[i]\n  };\n});\n\nconst itemReducer = (items: MockItem[], payload: MockReducerPayload) => {\n  switch (payload.type) {\n    case 'add': {\n      return [...items, { ...payload.item, id: createUID() }];\n    }\n\n    case 'edit': {\n      return items.map(item => {\n        return item.id === payload.item.id\n          ? { ...item, name: payload.item.name, category: payload.item.category }\n          : item;\n      });\n    }\n\n    case 'remove': {\n      const itemIndex = items.findIndex(item => item.id === payload.item.id);\n      if (itemIndex === -1) return items;\n      items.splice(itemIndex, 1);\n      return [...items];\n    }\n\n    default: {\n      return items;\n    }\n  }\n};\n\nconst progressStates = {\n  loading: 'Loading...',\n  submitting: 'Submitting...'\n} as const;\n\nexport const useMockItems = () => {\n  return useReducer(itemReducer, undefined, () => initialItems);\n};\n\nexport const ItemDialog = ({\n  target,\n  item: itemProp,\n  dispatch,\n  onComplete\n}: MockItemDialogProps) => {\n  const [nameField, setNameField] = useState<{\n    value: string | null;\n    error: typeof errorText | null;\n    errorOnPriorBlur: boolean;\n  }>(() => {\n    return {\n      value: itemProp?.name ?? null,\n      error: null,\n      errorOnPriorBlur: false\n    };\n  });\n\n  const [categoryField, setCategoryField] = useState<{\n    value: MockCategory | null;\n    error: typeof errorText | null;\n  }>(() => {\n    return {\n      value: itemProp?.category ?? null,\n      error: null\n    };\n  });\n\n  const [progress, setProgress] = useState<\n    (typeof progressStates)[keyof typeof progressStates] | false\n  >(progressStates.loading);\n\n  useEffect(() => {\n    let timerId: number;\n\n    if (progress === progressStates.loading) {\n      timerId = window.setTimeout(() => {\n        setProgress(false);\n      }, loadingTimeoutMS);\n    } else if (progress === progressStates.submitting) {\n      timerId = window.setTimeout(() => {\n        setProgress(false);\n        dispatch({ name: nameField.value!, category: categoryField.value! });\n        onComplete();\n      }, loadingTimeoutMS);\n    }\n\n    return () => {\n      window.clearTimeout(timerId);\n    };\n  }, [progress]);\n\n  return (\n    <FormDialog\n      target={target}\n      heading={`${itemProp ? 'Edit' : 'Add'} item`}\n      progress={progress}\n      onCancel={{\n        disabled: progress === progressStates.submitting,\n        handler: () => {\n          setProgress(false);\n          onComplete();\n        }\n      }}\n      onSubmit={{\n        disabled:\n          !!progress || [nameField, categoryField].some(field => !field.value || field.error),\n        handler: () => {\n          setProgress(progressStates.submitting);\n        }\n      }}\n    >\n      {(!progress || progress !== progressStates.loading) && (\n        <Flex container={{ direction: 'column', gap: 2 }}>\n          <Input\n            required\n            label='Name'\n            value={nameField.value ?? ''}\n            onChange={(e: ChangeEvent<HTMLInputElement>) => {\n              setNameField(cur => ({\n                ...cur,\n                value: e.target.value,\n                error: !e.target.value && cur.errorOnPriorBlur ? errorText : null\n              }));\n            }}\n            onBlur={(e: FocusEvent<HTMLInputElement>) => {\n              if (!e.target.value) {\n                setNameField(cur => ({\n                  ...cur,\n                  error: errorText,\n                  errorOnPriorBlur: true\n                }));\n              } else if (nameField.errorOnPriorBlur) {\n                setNameField(cur => ({ ...cur, errorOnPriorBlur: false }));\n              }\n            }}\n            status={nameField.error ? 'error' : undefined}\n            info={nameField.error}\n          />\n          <ComboBox\n            required\n            label='Category'\n            selected={\n              categoryField.value\n                ? {\n                    items: {\n                      id: categoryField.value,\n                      text: categoryField.value\n                    }\n                  }\n                : undefined\n            }\n            menu={{\n              mode: 'single-select',\n              onItemClick: category => {\n                setCategoryField({\n                  value: category as MockCategory,\n                  error: null\n                });\n              },\n              items: categories.map(category => {\n                return {\n                  id: category,\n                  primary: category,\n                  selected: category === categoryField.value\n                };\n              })\n            }}\n            onBlur={selected => {\n              if (!selected) {\n                setCategoryField(cur => ({ ...cur, error: errorText }));\n              }\n            }}\n            status={categoryField.error ? 'error' : undefined}\n            info={categoryField.error}\n          />\n        </Flex>\n      )}\n    </FormDialog>\n  );\n};\n\nexport const FormDialogMock = () => {\n  const [dialogTarget, setDialogTarget] = useState<MockItemDialogProps['target'] | null>(null);\n  const [editItem, setEditItem] = useState<MockItem | null>(null);\n  const [items, dispatch] = useMockItems();\n\n  return (\n    <>\n      <SummaryList\n        name='Editable items'\n        icon='list'\n        count={items.length}\n        actions={[\n          {\n            id: 'Add',\n            text: 'Add',\n            icon: 'plus',\n            onClick: (_, e) => {\n              setDialogTarget(e.currentTarget);\n            }\n          }\n        ]}\n        items={items.map<SummaryListItem>(({ id, name, category }) => {\n          return {\n            id,\n            primary: name,\n            secondary: <Text variant='secondary'>{category}</Text>,\n            actions: [\n              {\n                id: 'Edit',\n                text: 'Edit',\n                icon: 'pencil',\n                onClick: (_, e, menuButton) => {\n                  if (menuButton) setDialogTarget(menuButton);\n\n                  setEditItem({\n                    id,\n                    name,\n                    category\n                  });\n                }\n              },\n              {\n                id: 'Remove',\n                text: 'Remove',\n                icon: 'trash',\n                onClick: () => {\n                  dispatch({ type: 'remove', item: { id } });\n                }\n              }\n            ]\n          };\n        })}\n      />\n\n      {dialogTarget && (\n        <ItemDialog\n          target={dialogTarget}\n          item={editItem}\n          // Wrap dispatch so the dialog can only affect the item it creates or updates.\n          dispatch={fields => {\n            dispatch(\n              editItem\n                ? { type: 'edit', item: { id: editItem.id, ...fields } }\n                : { type: 'add', item: { ...fields } }\n            );\n          }}\n          onComplete={() => {\n            setDialogTarget(null);\n            setEditItem(null);\n          }}\n        />\n      )}\n    </>\n  );\n};\n"]}