{"version":3,"file":"DynamicInput.stories.jsx","sourceRoot":"","sources":["../../../src/build/DynamicInput/DynamicInput.stories.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useMemo, useCallback, useEffect } from 'react';\nimport type { Meta, StoryFn } from '@storybook/react';\n\nimport type DateTimeProps from '@pega/cosmos-react-core/lib/components/DateTime/DateTime.types';\nimport type { DateTimeCallbackParameter } from '@pega/cosmos-react-core/lib/components/DateTime/DateTime.types';\nimport { BuildTheme, ThemeOverride, Flex, FormDialog, Input } from '@pega/cosmos-react-core';\nimport { CodeEditor, DynamicInput } from '@pega/cosmos-react-build';\nimport type {\n  RuleSelectProps,\n  SourceConfig,\n  ConstantControlConfig,\n  Source,\n  RuleSelectItem\n} from '@pega/cosmos-react-build';\n\nimport { useFieldReferenceMock } from '../FieldReference/FieldReference.mocks';\n\nimport { baseRuleTypes, defaultRuleState, fetchRules } from './DynamicInput.mocks';\n\nexport default {\n  title: 'Build/DynamicInput',\n  component: DynamicInput,\n  args: {\n    constantFormat: 'Text',\n    defaultSource: 'Rule',\n    required: true\n  },\n  argTypes: {\n    constantFormat: {\n      control: { type: 'select' },\n      options: [\n        'Text',\n        'Text (paragraph)',\n        'Boolean',\n        'Currency',\n        'Percentage',\n        'Integer',\n        'Decimal',\n        'Phone',\n        'DateTime',\n        'Date',\n        'Time'\n      ]\n    },\n    defaultSource: {\n      control: { type: 'select' },\n      options: ['Rule', 'Constant', 'FieldReference', 'Expression']\n    },\n    required: {\n      control: { type: 'boolean' }\n    }\n  }\n} as Meta;\n\ntype RuleType = 'Automation' | 'Decision' | 'Field' | 'Paragraph';\n\ninterface DynamicInputStoryProps {\n  constantFormat?: ConstantControlConfig['format'];\n  required?: boolean;\n  defaultSource?: Source;\n  timeout?: boolean;\n}\n\nexport const DynamicInputDemo: StoryFn<DynamicInputStoryProps> = (args: DynamicInputStoryProps) => {\n  const defaultSource = args.defaultSource || 'Rule';\n  const constantFormat = args.constantFormat || 'Text';\n  const timeout = args.timeout || true;\n\n  const [sources, setSources] = useState<SourceConfig[]>([\n    {\n      type: 'Constant',\n      selected: defaultSource === 'Constant'\n    },\n    {\n      type: 'Rule',\n      selected: defaultSource === 'Rule'\n    },\n    {\n      type: 'FieldReference',\n      selected: defaultSource === 'FieldReference'\n    },\n    {\n      type: 'Expression',\n      selected: defaultSource === 'Expression'\n    }\n  ]);\n\n  useEffect(() => {\n    setSources([\n      {\n        type: 'Constant',\n        selected: defaultSource === 'Constant'\n      },\n      {\n        type: 'Rule',\n        selected: defaultSource === 'Rule'\n      },\n      {\n        type: 'FieldReference',\n        selected: defaultSource === 'FieldReference'\n      },\n      {\n        type: 'Expression',\n        selected: defaultSource === 'Expression'\n      }\n    ]);\n  }, [defaultSource]);\n\n  /**\n   * Constant Input\n   */\n  const [constantValue, setConstantValue] = useState<ConstantControlConfig['props']['value']>('');\n  const constant = useMemo<ConstantControlConfig>(() => {\n    if (constantFormat === 'Boolean') {\n      return {\n        format: 'Boolean',\n        props: {\n          value: constantValue === true,\n          onChange: value => {\n            setConstantValue(value);\n          }\n        }\n      };\n    }\n    if (constantFormat === 'Date' || constantFormat === 'DateTime' || constantFormat === 'Time') {\n      return {\n        format: constantFormat,\n        props: {\n          value: constantValue as DateTimeProps['value'],\n          onChange: (value: DateTimeCallbackParameter) => {\n            setConstantValue(value.valueAsISOString);\n          }\n        }\n      };\n    }\n    return {\n      format: constantFormat,\n      props: {\n        value: String(constantValue),\n        onChange: (value: ConstantControlConfig['props']['value']) => {\n          setConstantValue(value);\n        }\n      }\n    };\n  }, [constantValue, constantFormat]);\n\n  /**\n   * Rule input\n   */\n  const [ruleState, setRuleState] = useState<{\n    props: typeof defaultRuleState;\n    pendingFetch?: ReturnType<typeof fetchRules>;\n  }>({\n    props: defaultRuleState\n  });\n  const [ruleConfigDialogTarget, setRuleConfigDialogTarget] = useState<HTMLElement>();\n\n  const onRuleExpand = useCallback(\n    (itemId: string) => {\n      const expandedItem = ruleState.props.ruleTypes?.find(item => item.id === itemId);\n\n      // Demos lazy loading rules.\n      if (expandedItem?.rules.length === 0) {\n        const { promise } = fetchRules({ ruleType: expandedItem.type, delay: timeout ? 1000 : 0 });\n\n        promise\n          .then(res => {\n            const newItems = ruleState.props.ruleTypes?.map(item => {\n              if (item.id === expandedItem.id) {\n                return { ...item, rules: res.results };\n              }\n\n              return item;\n            });\n\n            setRuleState({\n              ...ruleState,\n              props: { ...ruleState.props, loading: false, ruleTypes: newItems }\n            });\n          })\n          .catch(() => {});\n\n        // Set loading while rules are fetched initially.\n        setRuleState({\n          ...ruleState,\n          props: { ...ruleState.props, loading: true }\n        });\n      }\n    },\n    [ruleState]\n  );\n\n  const onRuleFilter = useCallback(\n    (filterValue: string) => {\n      // Abort requests before reissuing if necessary.\n      if (ruleState.pendingFetch) {\n        ruleState.pendingFetch.abort();\n      }\n\n      // If the filterValue is an empty string from backspace both remove any selection and reset the menu to its default.\n      if (!filterValue) {\n        setRuleState({\n          ...ruleState,\n          props: {\n            ...defaultRuleState\n          }\n        });\n        return;\n      }\n\n      const fetch = fetchRules({ filter: filterValue, delay: timeout ? 1000 : 0 });\n\n      fetch.promise.then(fetchedRules => {\n        if (!ruleState.props) {\n          return undefined;\n        }\n\n        setRuleState({\n          pendingFetch: undefined,\n          props: {\n            ...ruleState.props,\n            filterValue,\n            loading: false,\n            items: fetchedRules.results\n          }\n        });\n      });\n\n      // Place the menu into a loading state while rules are fetched.\n      // Additionally, set a reference to the pending fetch to conditionally abort if onFilter is retriggered before fetch resolves.\n      setRuleState({\n        pendingFetch: fetch,\n        props: {\n          ...ruleState.props,\n          loading: true,\n          filterValue,\n          ruleTypes: [],\n          items: undefined\n        }\n      });\n    },\n    [ruleState]\n  );\n\n  const ruleLoadMore = useCallback(\n    (itemId: string | undefined) => {\n      const ruleStateProps = ruleState.props as RuleSelectProps;\n      const ruleItems = ruleStateProps.items;\n\n      const directList = !!ruleState.props.items;\n\n      // No rule type expanded and no items provided directly.\n      if (!itemId && !directList) {\n        return ruleStateProps;\n      }\n\n      const expandedItem = ruleState.props.ruleTypes?.find(item => item.id === itemId);\n\n      // Apply based on if an expanded rule or a list of items provided directly.\n      let fetchParams = {};\n\n      // Expanded rule type's list.\n      if (!directList && expandedItem) {\n        const currentLength = expandedItem?.rules.length;\n\n        // The demo is assuming a total count in known upfront.\n        // (If that is not the case an empty response can be used to determine all rules are fetched)\n        const totalCount = baseRuleTypes.find(item => item.id === itemId)!.count!;\n\n        if (currentLength >= totalCount) {\n          return ruleStateProps;\n        }\n\n        fetchParams = {\n          ruleType: itemId as RuleType,\n          start: currentLength,\n          delay: timeout ? 1000 : 0\n        };\n      }\n\n      // Abort requests before reissuing if necessary.\n      if (ruleState.pendingFetch) {\n        ruleState.pendingFetch.abort();\n      }\n\n      const fetch = fetchRules(fetchParams);\n\n      fetch.promise.then(res => {\n        setRuleState({\n          pendingFetch: undefined,\n          props: {\n            ...ruleState.props,\n            loading: false,\n            items: ruleItems\n              ? {\n                  ...ruleItems,\n                  ...res.results\n                }\n              : undefined,\n            ruleTypes: expandedItem\n              ? ruleState.props.ruleTypes?.map(item => {\n                  if (item.id === expandedItem.id) {\n                    return {\n                      ...item,\n                      rules: [...item.rules, ...res.results]\n                    };\n                  }\n\n                  return item;\n                })\n              : defaultRuleState.ruleTypes\n          }\n        });\n      });\n\n      setRuleState({\n        pendingFetch: fetch,\n        props: {\n          ...ruleState.props,\n          loading: true\n        }\n      });\n    },\n    [ruleState]\n  );\n\n  const onRuleSelect = useCallback(\n    (selectedRule: RuleSelectItem) => {\n      setRuleState({\n        ...ruleState,\n        props: {\n          ...ruleState.props,\n          filterValue: undefined,\n          selectedRule: {\n            ...selectedRule,\n            href: `/rules/${selectedRule.id}`,\n            onPreview: () => {\n              // eslint-disable-next-line no-alert\n              alert('Link previewed');\n            },\n            onLinkClick: () => {\n              // eslint-disable-next-line no-alert\n              alert('Link clicked');\n            },\n            onConfig: configTarget => {\n              setRuleConfigDialogTarget(configTarget);\n            },\n            onClear: () => {\n              setRuleConfigDialogTarget(undefined);\n              setRuleState({\n                props: defaultRuleState\n              });\n            }\n          }\n        }\n      });\n    },\n    [ruleState]\n  );\n\n  /**\n   * Field reference input\n   */\n  const fieldReferenceMock = useFieldReferenceMock('static');\n\n  return (\n    <ThemeOverride theme={BuildTheme}>\n      <DynamicInput\n        required={args.required}\n        sources={sources}\n        onSourceChange={selectedSource => {\n          const updatedSources = sources.map(source => ({\n            ...source,\n            selected: source.type === selectedSource\n          }));\n          setSources(updatedSources);\n        }}\n        controls={{\n          constant,\n          rule: {\n            props: {\n              ...ruleState.props,\n              onExpand: onRuleExpand,\n              onFilter: onRuleFilter,\n              loadMore: ruleLoadMore,\n              onSelect: onRuleSelect,\n              onCreateNew: () => {}\n            }\n          },\n          fieldReference: {\n            props: {\n              placeholder: 'Choose a field...',\n              onSelectedChange: fieldReferenceMock.handleSelectedChange,\n              menu: {\n                items: fieldReferenceMock.itemsToRender,\n                altContexts: fieldReferenceMock.altContexts,\n                currentContext: fieldReferenceMock.currentContext,\n                parentItem: fieldReferenceMock.parentItem,\n                loading: fieldReferenceMock.menuLoading\n              },\n              selected: fieldReferenceMock.selected,\n              filterValue: fieldReferenceMock.filterValue,\n              onFilterChange: fieldReferenceMock.setFilterValue,\n              onBlur: () => {\n                fieldReferenceMock.setFilterValue('');\n              }\n            }\n          },\n          expression: {\n            component: CodeEditor,\n            props: {\n              list: {\n                onItemAdd: () => {},\n                details: {}\n              },\n              search: {\n                filters: [],\n                onFilterChange: () => {},\n                onSearchChange: () => {},\n                value: ''\n              },\n              codeEditorHandle: {\n                current: {\n                  getValue: () => {\n                    return undefined;\n                  },\n                  insertText: (text: string) => {\n                    // eslint-disable-next-line no-console\n                    console.log(text);\n                  }\n                }\n              }\n            }\n          }\n        }}\n      />\n\n      {/* Mock demoing rule config by way of a dialog but, any pattern could be used: modal, panel, etc... */}\n      {ruleConfigDialogTarget && ruleState && ruleState.props?.selectedRule && (\n        <FormDialog\n          target={ruleConfigDialogTarget}\n          heading={ruleState.props?.selectedRule.name}\n          onCancel={() => {\n            setRuleConfigDialogTarget(undefined);\n          }}\n          onSubmit={() => {\n            setRuleConfigDialogTarget(undefined);\n          }}\n        >\n          <Flex container={{ direction: 'column', gap: 2 }}>\n            <Input label='Config field 1' />\n            <Input label='Config field 2' />\n            <Input label='Config field 3' />\n          </Flex>\n        </FormDialog>\n      )}\n    </ThemeOverride>\n  );\n};\n"]}