@norges-domstoler/dds-page-generator
Version:
Page Generator
1 lines • 69.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/components/PageGenerator/PageGenerator.tsx","../src/tokens/PageGeneratorTokens.tsx","../src/components/PageGenerator/PageGeneratorContext.tsx","../src/components/PageGenerator/PageGeneratorProvider.tsx","../src/helpers/isFieldWithValidations.tsx","../src/helpers/isMultiValue.tsx","../src/helpers/isPageGeneratorRow.tsx","../src/helpers/isSectionGeneratorRow.tsx","../src/helpers/PageGeneratorFields.tsx","../src/types/PageGeneratorSupportedFields.tsx","../src/helpers/Validators.tsx","../src/components/Generate/GenerateGridChildren.tsx","../src/components/Generate/GenerateGridChild.tsx","../src/components/Generate/GenerateComponent.tsx","../src/components/Generate/GenerateRow.tsx","../src/components/SectionGenerator/SectionGenerator.tsx"],"sourcesContent":["import { getBaseHTMLProps, Grid } from '@norges-domstoler/dds-components';\nimport { PageGeneratorProps } from '../../types';\nimport { PageGeneratorTokens } from '../../tokens';\nimport { PageGeneratorProvider } from './PageGeneratorProvider';\nimport { GenerateGridChildren } from '../Generate/GenerateGridChildren';\nimport { FormEvent } from 'react';\n\n/**\n * Generer komponenter fra @norges-domstoler/dds-components i et Grid view, basert på `fields` propertien. PageGenerator bruker Grid-komponenten fra @norges-domstoler/dds-components, slik at den håndterer alt av riktige marginer, mellomrom og responsivt design.\n * @param props - `fields` inneholder felter eller rader med felter. `errorsOnChange` er callback for errorhåndtering. `as` setter HTML-element rundt hele PageGenerator.\n */\nexport const PageGenerator = (props: PageGeneratorProps) => {\n const {\n id,\n className,\n htmlProps,\n fields = [],\n formDataOnChange,\n state,\n setState,\n as,\n onSubmit,\n ...rest\n } = props;\n\n const children = (validateAllFields: (next: () => void) => void) => {\n return (\n <Grid\n {...getBaseHTMLProps(id, className, htmlProps, rest)}\n as={as}\n rowGap={PageGeneratorTokens.rowGaps}\n htmlProps={{\n ...htmlProps,\n ...(onSubmit\n ? {\n onSubmit: (event: FormEvent) => {\n event.preventDefault();\n if (onSubmit) {\n validateAllFields(onSubmit);\n }\n },\n }\n : {}),\n }}\n >\n <GenerateGridChildren />\n </Grid>\n );\n };\n\n return (\n <PageGeneratorProvider\n fields={fields}\n formDataOnChange={formDataOnChange}\n state={state}\n setState={setState}\n children={children}\n />\n );\n};\n\nPageGenerator.displayName = 'PageGenerator';\n","import { ScreenSize } from '@norges-domstoler/dds-components';\nimport { ddsTokens } from '@norges-domstoler/dds-design-tokens';\nimport { PageGeneratorTokens as PageGeneratorTokensType } from '../types';\n\nexport const PageGeneratorTokens: PageGeneratorTokensType = {\n Stack: {\n [ScreenSize.XSmall]: 'x1',\n [ScreenSize.Small]: 'x1',\n [ScreenSize.Medium]: 'x1',\n [ScreenSize.Large]: 'x1',\n [ScreenSize.XLarge]: 'x1.5',\n },\n rowGaps: {\n xs: ddsTokens.core.ddsSpacingX1,\n sm: ddsTokens.core.ddsSpacingX1,\n md: ddsTokens.core.ddsSpacingX1,\n lg: ddsTokens.core.ddsSpacingX1,\n xl: ddsTokens.core.ddsSpacingX15,\n },\n};\n","import { ChangeEvent, FocusEvent, createContext } from 'react';\nimport { PageGeneratorProps } from '../../types/PageGeneratorProps';\nimport { SelectOption } from '@norges-domstoler/dds-components';\nimport { SingleValue, MultiValue } from 'react-select';\nimport { CalendarDate } from '@internationalized/date';\nimport { PageGeneratorFormData } from '../../types';\n\nexport interface PageGeneratorContextModel {\n fields: PageGeneratorProps['fields'];\n state?: PageGeneratorProps['state'];\n fieldOnChange: <T extends HTMLInputElement | HTMLTextAreaElement>(\n event: ChangeEvent<T>,\n ) => void;\n selectOnChange: (\n chosen:\n | SingleValue<SelectOption<unknown>>\n | MultiValue<SelectOption<unknown>>,\n name: string,\n ) => void;\n datePickerOnChange: (value: CalendarDate | null, name: string) => void;\n onBlur: <T extends HTMLInputElement | HTMLTextAreaElement>(\n event: FocusEvent<T>,\n ) => void;\n onBlurSelect: (name: string) => void;\n formData: PageGeneratorFormData;\n validateAllFields: (next: () => void) => void;\n}\n\nexport const PageGeneratorContext = createContext<PageGeneratorContextModel>({\n fields: [],\n state: {},\n fieldOnChange: () => {},\n selectOnChange: () => {},\n datePickerOnChange: () => {},\n onBlur: () => {},\n onBlurSelect: () => {},\n formData: {\n errors: null,\n errorMessages: null,\n submitted: false,\n touched: false,\n valid: false,\n },\n validateAllFields: (next: () => void) => {},\n});\n","import { PageGeneratorContext } from './PageGeneratorContext';\nimport {\n PageGeneratorErrors,\n PageGeneratorField,\n PageGeneratorFormData,\n PageGeneratorProps,\n PageGeneratorRow,\n PageGeneratorSelectOption,\n PageGeneratorValidation,\n PageGeneratorValidationValue,\n} from '../../types';\nimport { ChangeEvent, FocusEvent, JSX, useEffect, useState } from 'react';\nimport { CalendarDate } from '@internationalized/date';\nimport {\n isPageGeneratorRow,\n isFieldWithValidations,\n isMultiValue,\n} from '../../helpers';\n\ninterface PageGeneratorProviderProps {\n fields: PageGeneratorProps['fields'];\n formDataOnChange: PageGeneratorProps['formDataOnChange'];\n children: (validateAllFields: (next: () => void) => void) => JSX.Element;\n state?: PageGeneratorProps['state'];\n setState?: PageGeneratorProps['setState'];\n}\n\nexport const PageGeneratorProvider = ({\n children,\n fields,\n formDataOnChange,\n state,\n setState,\n}: PageGeneratorProviderProps) => {\n const [formData, setFormData] = useState<PageGeneratorFormData>({\n errors: null,\n errorMessages: null,\n submitted: false,\n touched: false,\n valid: false,\n });\n\n useEffect(() => {\n setFormData({\n ...formData,\n submitted: false,\n });\n }, [state]);\n\n useEffect(() => {\n let newErrorMessages = { ...formData.errorMessages };\n if (formData.errors && Object.keys(formData.errors).length > 0) {\n Object.keys(formData.errors).forEach((key: string) => {\n if (formData.errors) {\n const error = formData.errors[key];\n if (error && error.errors.length > 0) {\n newErrorMessages = {\n ...newErrorMessages,\n [key]: error.errors[0].message,\n };\n } else {\n newErrorMessages = {\n ...newErrorMessages,\n [key]: '',\n };\n }\n }\n });\n let valid = true;\n Object.keys(formData.errors).forEach(key => {\n if (formData.errors && formData.errors[key].errors.length > 0) {\n valid = false;\n return;\n }\n });\n\n let newFormData = { ...formData, valid };\n\n if (newErrorMessages && (formData.touched || formData.submitted)) {\n newFormData = {\n ...newFormData,\n errorMessages: newErrorMessages,\n };\n }\n setFormData(newFormData);\n if (formDataOnChange) {\n formDataOnChange(newFormData);\n }\n }\n }, [formData.errors]);\n\n const findFieldByNameInternal = (\n name: string,\n fieldsToSearch: (PageGeneratorField | PageGeneratorRow)[],\n ): PageGeneratorField | PageGeneratorRow | null => {\n for (const f of fieldsToSearch) {\n // Search for fields with validation named name\n if (isFieldWithValidations(f) && f.props && f.props.name === name) {\n return f;\n }\n // If it's a row, search through it's fields recursively\n if (isPageGeneratorRow(f) && f.fields && Array.isArray(f.fields)) {\n const result = findFieldByNameInternal(name, f.fields);\n if (result) {\n return result;\n }\n }\n }\n return null;\n };\n\n const getFieldErrors = (\n name: string,\n value: PageGeneratorValidationValue,\n ) => {\n const field = findFieldByNameInternal(name, fields);\n if (field && isFieldWithValidations(field)) {\n const fieldErrors =\n field.validations?.filter(\n (v: PageGeneratorValidation) => !v.rule(value),\n ) ?? [];\n return fieldErrors;\n }\n return [];\n };\n\n const validateField = (name: string, value: PageGeneratorValidationValue) => {\n const field = findFieldByNameInternal(name, fields);\n if (field && isFieldWithValidations(field)) {\n const fieldErrors =\n field.validations?.filter(\n (v: PageGeneratorValidation) => !v.rule(value),\n ) ?? [];\n const newErrors = {\n ...formData.errors,\n [name]: {\n value,\n errors: fieldErrors,\n },\n };\n setFormData({\n ...formData,\n errors: newErrors,\n touched: true,\n });\n }\n };\n\n const validateAllFields = (next: () => void) => {\n let newErrors: PageGeneratorErrors = {};\n fields.forEach(field => {\n if (isFieldWithValidations(field) && state && field.props?.name) {\n const value = state[field.props.name] as PageGeneratorValidationValue;\n const name = field.props.name;\n const fieldErrors = getFieldErrors(name, value);\n newErrors = {\n ...newErrors,\n [name]: {\n value,\n errors: fieldErrors,\n },\n };\n }\n });\n\n let valid = true;\n Object.keys(newErrors).forEach(key => {\n if (newErrors[key].errors.length > 0) {\n valid = false;\n return;\n }\n });\n setFormData({\n ...formData,\n submitted: true,\n errors: newErrors,\n valid,\n });\n if (valid) {\n next();\n }\n };\n\n const onBlur = <\n T extends HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n >(\n event: FocusEvent<T>,\n ) => {\n const { name, value } = event.target;\n validateField(name, value as PageGeneratorValidationValue);\n };\n\n const onBlurSelect = (name: string) => {\n if (state) {\n validateField(name, state[name] as PageGeneratorValidationValue);\n }\n };\n\n const fieldOnChange = <T extends HTMLInputElement | HTMLTextAreaElement>(\n event: ChangeEvent<T>,\n ) => {\n const { id, name, value } = event.target;\n const checked = (event as ChangeEvent<HTMLInputElement>).target?.checked;\n setFormData({\n ...formData,\n touched: true,\n errorMessages: {\n ...formData.errorMessages,\n [name]: '',\n },\n });\n const newState = {\n ...state,\n [name || id]: event.target.type === 'checkbox' ? checked : value,\n };\n if (setState) {\n setState(newState);\n }\n };\n\n const selectOnChange = (chosen: PageGeneratorSelectOption, name: string) => {\n let value = null;\n if (isMultiValue(chosen)) {\n value = Array.isArray(chosen) ? chosen : null;\n } else {\n value = chosen ?? null;\n }\n setFormData({\n ...formData,\n touched: true,\n submitted: false,\n errorMessages: {\n ...formData.errorMessages,\n [name]: '',\n },\n });\n const newState = {\n ...state,\n [name]: value,\n };\n validateField(name, chosen as PageGeneratorValidationValue);\n if (setState) {\n setState(newState);\n }\n };\n\n const datePickerOnChange = (value: CalendarDate | null, name: string) => {\n const newState = {\n ...state,\n [name]: value,\n };\n setFormData({\n ...formData,\n touched: true,\n submitted: false,\n errorMessages: {\n ...formData.errorMessages,\n [name]: '',\n },\n });\n validateField(name, value as PageGeneratorValidationValue);\n if (setState) {\n setState(newState);\n }\n };\n\n return (\n <PageGeneratorContext.Provider\n value={{\n fields,\n state,\n fieldOnChange,\n selectOnChange,\n datePickerOnChange,\n onBlur,\n onBlurSelect,\n formData,\n validateAllFields,\n }}\n >\n {children(validateAllFields)}\n </PageGeneratorContext.Provider>\n );\n};\n","import {\n PageGeneratorField,\n PageGeneratorRow,\n FieldWithValidations,\n} from '../types';\n\nexport const isFieldWithValidations = (\n obj: PageGeneratorField | PageGeneratorRow,\n): obj is FieldWithValidations => {\n return obj && (obj as FieldWithValidations).validations !== undefined;\n};\n","import { SelectOption } from '@norges-domstoler/dds-components';\nimport { MultiValue, SingleValue } from 'react-select';\n\nexport const isMultiValue = (\n obj: SingleValue<SelectOption<unknown>> | MultiValue<SelectOption<unknown>>,\n): obj is MultiValue<SelectOption<unknown>> => {\n return (obj as MultiValue<SelectOption<unknown>>)?.values !== undefined;\n};\n","import { PageGeneratorField, PageGeneratorRow } from '../types';\n\nexport const isPageGeneratorRow = (\n obj: PageGeneratorField | PageGeneratorRow,\n): obj is PageGeneratorRow => {\n return (obj as PageGeneratorRow).fields !== undefined;\n};\n","import { PageGeneratorField, SectionGeneratorRow } from '../types';\n\nexport const isSectionGeneratorRow = (\n obj: PageGeneratorField | SectionGeneratorRow,\n): obj is SectionGeneratorRow => {\n return (obj as SectionGeneratorRow).fields !== undefined;\n};\n","import {\n TextInputProps,\n DatePickerProps,\n useScreenSize,\n ScreenSize,\n} from '@norges-domstoler/dds-components';\nimport {\n DetailListField,\n PageGeneratorField,\n PageGeneratorRow,\n PageGeneratorSupportedFields,\n TextInputField,\n} from '../types';\nimport { RequiredDatePickerValidator } from './Validators';\n\ninterface TextInputAndFieldProps {\n props?: TextInputProps;\n fieldProps?: Pick<TextInputField, 'validations' | 'hide'>;\n}\n\n/** COMMON FIELDS **/\n\nexport const NinInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'Fødselsnummer',\n type: 'text',\n name: 'nin',\n ...props,\n },\n ...fieldProps,\n };\n};\n\nexport const FirstNameInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'Fornavn',\n type: 'text',\n name: 'firstName',\n ...props,\n },\n ...fieldProps,\n };\n};\n\nexport const LastNameInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'Etternavn',\n type: 'text',\n name: 'lastName',\n ...props,\n },\n ...fieldProps,\n };\n};\n\nexport const DateOfBirthDatepicker = (\n props?: DatePickerProps,\n): PageGeneratorField => {\n return {\n component: PageGeneratorSupportedFields.DatePicker,\n props: {\n label: 'Fødselsdato',\n name: 'dateOfBirth',\n ...props,\n },\n name: 'dateOfBirth',\n };\n};\n\nexport const EmailInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'E-post',\n name: 'email',\n ...props,\n },\n ...fieldProps,\n };\n};\n\nexport const StreetNameInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'Gatenavn',\n type: 'text',\n name: 'streetName',\n ...props,\n },\n ...fieldProps,\n };\n};\n\nexport const HouseNumberInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'Husnummer',\n width: '90px',\n type: 'text',\n name: 'houseNumber',\n ...props,\n },\n ...fieldProps,\n };\n};\n\nexport const CountryCodeInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'Landkode',\n width: '90px',\n name: 'countryCode',\n tip: 'Husk + foran landkoden',\n ...props,\n },\n ...fieldProps,\n };\n};\n\nexport const PhoneNumberInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n const actualScreenSize = useScreenSize();\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'Telefon',\n width: actualScreenSize >= ScreenSize.XLarge ? '206px' : '214px',\n name: 'phoneNumber',\n ...props,\n },\n ...fieldProps,\n };\n};\n\nexport const PostalNumberInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'Postnummer',\n width: '90px',\n name: 'postalNumber',\n ...props,\n },\n ...fieldProps,\n };\n};\n\nexport const PostalCodeInput = ({\n props,\n fieldProps,\n}: TextInputAndFieldProps): PageGeneratorField => {\n const actualScreenSize = useScreenSize();\n return {\n component: PageGeneratorSupportedFields.TextInput,\n props: {\n label: 'Poststed',\n type: 'text',\n width: actualScreenSize >= ScreenSize.XLarge ? '206px' : '214px',\n name: 'postalCode',\n ...props,\n },\n ...fieldProps,\n };\n};\n\n/** COMBINED FIELDS (into Rows) **/\n\nexport const NameRow = (\n firstNameProps?: TextInputAndFieldProps,\n lastNameProps?: TextInputAndFieldProps,\n rowProps?: Pick<PageGeneratorRow, 'hide'>,\n) => {\n return {\n fields: [\n FirstNameInput(firstNameProps || {}),\n LastNameInput(lastNameProps || {}),\n ],\n ...rowProps,\n };\n};\n\nexport const StreetAddressRow = (\n streetNameProps?: TextInputAndFieldProps,\n houseNumberProps?: TextInputAndFieldProps,\n rowProps?: Pick<PageGeneratorRow, 'hide'>,\n) => {\n return {\n fields: [\n StreetNameInput(streetNameProps || {}),\n HouseNumberInput(houseNumberProps || {}),\n ],\n ...rowProps,\n };\n};\n\nexport const PhoneNumberRow = (\n countryCodeProps?: TextInputAndFieldProps,\n phoneNumberProps?: TextInputAndFieldProps,\n rowProps?: PageGeneratorRow,\n) => {\n return {\n fields: [\n CountryCodeInput(countryCodeProps || {}),\n PhoneNumberInput(phoneNumberProps || {}),\n ],\n ...rowProps,\n };\n};\n\nexport const PostalRow = (\n postalNumberProps?: TextInputAndFieldProps,\n postalCodeProps?: TextInputAndFieldProps,\n rowProps?: Pick<PageGeneratorRow, 'hide'>,\n) => {\n return {\n fields: [\n PostalNumberInput(postalNumberProps || {}),\n PostalCodeInput(postalCodeProps || {}),\n ],\n ...rowProps,\n };\n};\n\n/* DetailList */\n\nexport const DetailList = (\n rows: { term: string; desc: string }[],\n): DetailListField => {\n return {\n component: PageGeneratorSupportedFields.DetailList,\n props: {\n striped: false,\n size: 'small',\n },\n children: rows.map(row => {\n return {\n component: PageGeneratorSupportedFields.DetailListRow,\n props: {},\n children: [\n {\n component: PageGeneratorSupportedFields.DetailListTerm,\n props: {},\n innerHTML: row.term,\n },\n {\n component: PageGeneratorSupportedFields.DetailListDesc,\n props: {\n style: {\n textAlign: 'right',\n },\n },\n innerHTML: row.desc,\n },\n ],\n };\n }),\n };\n};\n\nexport const DetailListRow = (term: string, desc?: string | null) => {\n return {\n term,\n desc: desc || '-',\n };\n};\n","export enum PageGeneratorSupportedFields {\n Button = 'Button',\n Card = 'Card',\n Checkbox = 'Checkbox',\n CheckboxGroup = 'CheckboxGroup',\n DatePicker = 'DatePicker',\n DescriptionList = 'DescriptionList',\n DescriptionListGroup = 'DescriptionListGroup',\n DescriptionListDesc = 'DescriptionListDesc',\n DescriptionListTerm = 'DescriptionListTerm',\n DetailList = 'DetailList',\n DetailListRow = 'DetailListRow',\n DetailListTerm = 'DetailListTerm',\n DetailListDesc = 'DetailListDesc',\n Divider = 'Divider',\n Drawer = 'Drawer',\n DrawerGroup = 'DrawerGroup',\n Fieldset = 'Fieldset',\n GlobalMessage = 'GlobalMessage',\n Heading = 'Heading',\n HStack = 'HStack',\n InputMessage = 'InputMessage',\n Label = 'Label',\n Legend = 'Legend',\n Link = 'Link',\n List = 'List',\n ListItem = 'ListItem',\n LocalMessage = 'LocalMessage',\n Paragraph = 'Paragraph',\n RadioButton = 'RadioButton',\n RadioButtonGroup = 'RadioButtonGroup',\n Select = 'Select',\n Spinner = 'Spinner',\n TextArea = 'TextArea',\n TextInput = 'TextInput',\n ToggleBar = 'ToggleBar',\n ToggleRadio = 'ToggleRadio',\n ToggleButton = 'ToggleButton',\n ToggleButtonGroup = 'ToggleButtonGroup',\n Typography = 'Typography',\n VisuallyHidden = 'VisuallyHidden',\n VStack = 'VStack',\n}\n","import { idnr } from '@navikt/fnrvalidator';\nimport {\n PageGeneratorErrors,\n PageGeneratorSelectOption,\n PageGeneratorValidation,\n} from '../types';\nimport { Paragraph, List, ListItem } from '@norges-domstoler/dds-components';\nimport { CalendarDate } from '@internationalized/date';\nimport { JSX } from 'react';\n\nexport const RequiredValidator = (\n message?: string,\n formMessage?: string,\n): PageGeneratorValidation => {\n return {\n message: message || 'Feltet er påkrevd',\n formMessage: formMessage || 'Feltet er påkrevd',\n rule: (value: string) => !!value && value.length > 0,\n };\n};\n\nexport const RequiredSelectValidator = (\n message?: string,\n formMessage?: string,\n): PageGeneratorValidation => {\n return {\n message: message || 'Feltet er påkrevd',\n formMessage: formMessage || 'Feltet er påkrevd',\n rule: (value: PageGeneratorSelectOption) => {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return !!value;\n },\n };\n};\n\nexport const RequiredDatePickerValidator = (\n message?: string,\n formMessage?: string,\n): PageGeneratorValidation => {\n return {\n message: message || 'Feltet er påkrevd',\n formMessage: formMessage || 'Feltet er påkrevd',\n rule: (value: CalendarDate) => !!value,\n };\n};\n\nexport const NumbersOnlyValidator = (\n message?: string,\n formMessage?: string,\n): PageGeneratorValidation => {\n return {\n message: message || 'Feltet kan bare inneholde tall',\n formMessage: formMessage || 'Feltet kan bare inneholde tall',\n rule: (value: string) =>\n value.length > 0 ? value.match(/^\\d+$/) !== null : true,\n };\n};\n\nexport const NinValidator: PageGeneratorValidation = {\n message: 'Fødselsnummer er ugyldig',\n formMessage: 'Fødselsnummer er ugyldig',\n rule: (value: string) => {\n if (value.length > 0) {\n const result = idnr(value);\n return result.status === 'valid';\n }\n return true;\n },\n};\n\nexport const PhoneNumberValidator: PageGeneratorValidation = {\n message: 'Kan bare inneholde tall',\n formMessage: 'Telefonnummer kan bare inneholde tall',\n rule: (value: string) =>\n value.length > 0 ? value.match(/^\\d+$/) !== null : true,\n};\n\nexport const EmailValidator: PageGeneratorValidation = {\n message: 'E-post er ugyldig',\n formMessage: 'E-post er ugyldig',\n rule: (value: string) =>\n value.length > 0\n ? value.match(/^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$/) !== null\n : true,\n};\n\nexport const getFormErrorMessage = (\n errors: PageGeneratorErrors,\n leadText?: string,\n): JSX.Element => {\n const actualErrors = Object.keys(errors).filter(\n key => errors[key].errors.length > 0,\n );\n const formMessages = actualErrors.map(e => {\n const obj = errors[e];\n return obj.errors[0].formMessage || obj.errors[0].message;\n });\n\n return (\n <>\n <Paragraph>\n {leadText || 'Disse feilene må rettes før du kan lagre:'}\n </Paragraph>\n <List>\n {formMessages.map((formMessage, index) => {\n return <ListItem key={index}>{formMessage}</ListItem>;\n })}\n </List>\n </>\n );\n};\n","import { useContext } from 'react';\nimport { PageGeneratorContext } from '../PageGenerator/PageGeneratorContext';\nimport { GenerateGridChild } from './GenerateGridChild';\nimport { PageGeneratorRow } from '../../types/PageGeneratorRow';\nimport { PageGeneratorField } from '../../types';\n\nexport const GenerateGridChildren = () => {\n const { fields } = useContext(PageGeneratorContext);\n return (\n <>\n {fields.map((obj: PageGeneratorField | PageGeneratorRow, index) => (\n <GenerateGridChild key={index} obj={obj} index={index} />\n ))}\n </>\n );\n};\n","import {\n GridChild,\n ScreenSize,\n useScreenSize,\n} from '@norges-domstoler/dds-components';\nimport { isFieldWithValidations, isPageGeneratorRow } from '../../helpers';\nimport { PageGeneratorField, PageGeneratorRow } from '../../types';\nimport { GenerateComponent } from './GenerateComponent';\nimport { GenerateRow } from './GenerateRow';\nimport { useContext } from 'react';\nimport {\n PageGeneratorContext,\n PageGeneratorContextModel,\n} from '../PageGenerator/PageGeneratorContext';\n\nexport interface GenerateGridChildProperties {\n fieldOnChange: PageGeneratorContextModel['fieldOnChange'];\n selectOnChange: PageGeneratorContextModel['selectOnChange'];\n datePickerOnChange: PageGeneratorContextModel['datePickerOnChange'];\n onBlur: PageGeneratorContextModel['onBlur'];\n onBlurSelect: PageGeneratorContextModel['onBlurSelect'];\n screenSize: ScreenSize;\n}\n\ninterface GenerateGridChildProps {\n obj: PageGeneratorField | PageGeneratorRow;\n index: number;\n}\n\nexport const GenerateGridChild = (props: GenerateGridChildProps) => {\n const isRow = isPageGeneratorRow(props.obj);\n const {\n fieldOnChange,\n selectOnChange,\n datePickerOnChange,\n onBlur,\n onBlurSelect,\n formData,\n } = useContext(PageGeneratorContext);\n const screenSize = useScreenSize();\n const { obj, index } = props;\n\n const gridChildProps: GenerateGridChildProperties = {\n fieldOnChange,\n selectOnChange,\n datePickerOnChange,\n onBlur,\n onBlurSelect,\n screenSize,\n };\n if (isFieldWithValidations(obj) && obj.props.name && formData.errorMessages) {\n obj.props = {\n ...obj.props,\n errorMessage: formData.errorMessages[obj.props.name],\n };\n }\n return (\n !obj.hide && (\n <GridChild columnsOccupied=\"all\" key={index}>\n {isRow && (\n <GenerateRow\n index={index}\n fields={(obj as PageGeneratorRow).fields}\n gridChildProps={gridChildProps}\n />\n )}\n {!isRow && (\n <GenerateComponent\n index={index}\n field={obj as PageGeneratorField}\n gridChildProps={gridChildProps}\n />\n )}\n </GridChild>\n )\n );\n};\n","import {\n Button,\n Card,\n Checkbox,\n CheckboxGroup,\n DatePicker,\n DescriptionList,\n DescriptionListGroup,\n DescriptionListDesc,\n DescriptionListTerm,\n Divider,\n Drawer,\n DrawerGroup,\n Fieldset,\n GlobalMessage,\n InputMessage,\n Legend,\n List,\n ListItem,\n LocalMessage,\n RadioButton,\n ScreenSize,\n RadioButtonGroup,\n Select,\n Spinner,\n TextArea,\n TextInput,\n ToggleButton,\n ToggleButtonGroup,\n VisuallyHidden,\n HStack,\n VStack,\n Heading,\n Label,\n Link,\n Paragraph,\n Typography,\n ToggleBar,\n ToggleRadio,\n DetailList,\n DetailListRow,\n DetailListDesc,\n DetailListTerm,\n} from '@norges-domstoler/dds-components';\nimport { PageGeneratorField, PageGeneratorSupportedFields } from '../../types';\nimport { ChangeEvent } from 'react';\nimport { SectionGenerator } from '../../components';\nimport {\n GenerateGridChild,\n GenerateGridChildProperties,\n} from './GenerateGridChild';\nimport '../../styles/page-generator-fieldset.css';\n\ninterface GenerateComponentProps {\n index: number;\n field: PageGeneratorField;\n gridChildProps: GenerateGridChildProperties;\n}\n\nexport const GenerateComponent = (props: GenerateComponentProps) => {\n const { index, field, gridChildProps } = props;\n const {\n fieldOnChange,\n selectOnChange,\n datePickerOnChange,\n onBlur,\n onBlurSelect,\n screenSize,\n } = gridChildProps;\n\n const inputFieldOnChange = (\n event: ChangeEvent<HTMLInputElement & Record<string, never>>,\n ) => fieldOnChange(event);\n const textAreaFieldOnChange = (\n event: ChangeEvent<HTMLTextAreaElement & Record<string, never>>,\n ) => fieldOnChange(event);\n\n const GridStyling = {\n marginLeft: undefined,\n marginRight: undefined,\n };\n\n switch (field.component) {\n case PageGeneratorSupportedFields.Button:\n return (\n <Button {...field.props} key={index}>\n {field.innerHTML}\n </Button>\n );\n case PageGeneratorSupportedFields.Card:\n if (field.innerHTML) {\n return (\n <Card {...field.props} key={index}>\n {field.innerHTML}\n </Card>\n );\n } else if (field.children) {\n <Card {...field.props} key={index}>\n <SectionGenerator as=\"fragment\" fields={field.children} />\n </Card>;\n }\n return <></>;\n case PageGeneratorSupportedFields.Checkbox:\n return (\n <Checkbox {...field.props} key={index} onChange={inputFieldOnChange} />\n );\n case PageGeneratorSupportedFields.CheckboxGroup:\n return (\n <CheckboxGroup {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </CheckboxGroup>\n );\n case PageGeneratorSupportedFields.DatePicker:\n return (\n <DatePicker\n {...field.props}\n key={index}\n onChange={value => datePickerOnChange(value, field.name)}\n onBlur={_event => {\n onBlurSelect(field.name);\n }}\n />\n );\n case PageGeneratorSupportedFields.DescriptionList:\n return (\n <DescriptionList {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </DescriptionList>\n );\n case PageGeneratorSupportedFields.DescriptionListGroup:\n return (\n <DescriptionListGroup {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </DescriptionListGroup>\n );\n case PageGeneratorSupportedFields.DescriptionListDesc:\n return (\n <DescriptionListDesc {...field.props} key={index}>\n {field.innerHTML}\n </DescriptionListDesc>\n );\n case PageGeneratorSupportedFields.DescriptionListTerm:\n return (\n <DescriptionListTerm {...field.props} key={index}>\n {field.innerHTML}\n </DescriptionListTerm>\n );\n case PageGeneratorSupportedFields.DetailList:\n return (\n <DetailList {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </DetailList>\n );\n case PageGeneratorSupportedFields.DetailListRow:\n return (\n <DetailListRow {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </DetailListRow>\n );\n case PageGeneratorSupportedFields.DetailListDesc:\n return (\n <DetailListDesc {...field.props} key={index}>\n {field.innerHTML}\n </DetailListDesc>\n );\n case PageGeneratorSupportedFields.DetailListTerm:\n return (\n <DetailListTerm {...field.props} key={index}>\n {field.innerHTML}\n </DetailListTerm>\n );\n case PageGeneratorSupportedFields.Divider:\n return <Divider {...field.props} key={index} />;\n case PageGeneratorSupportedFields.Drawer:\n return (\n <Drawer {...field.props} key={index}>\n {field.innerHTML}\n </Drawer>\n );\n case PageGeneratorSupportedFields.DrawerGroup:\n return (\n <DrawerGroup {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </DrawerGroup>\n );\n case PageGeneratorSupportedFields.Fieldset:\n return (\n <Fieldset\n {...field.props}\n htmlProps={{\n ...field.props.htmlProps,\n className: 'page-generator-fieldset',\n style: {\n ...GridStyling,\n },\n }}\n key={index}\n >\n {field.children.map((child, childIndex) => {\n if ((child as PageGeneratorField).component === 'Legend') {\n return (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child as PageGeneratorField}\n gridChildProps={props.gridChildProps}\n />\n );\n } else {\n return (\n <GenerateGridChild\n key={childIndex}\n obj={child}\n index={childIndex}\n />\n );\n }\n })}\n </Fieldset>\n );\n case PageGeneratorSupportedFields.GlobalMessage:\n return (\n <GlobalMessage {...field.props} key={index}>\n {field.innerHTML}\n </GlobalMessage>\n );\n case PageGeneratorSupportedFields.Heading:\n return (\n <Heading {...field.props} key={index}>\n {field.innerHTML}\n </Heading>\n );\n case PageGeneratorSupportedFields.HStack:\n return (\n <HStack {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </HStack>\n );\n case PageGeneratorSupportedFields.InputMessage:\n return <InputMessage {...field.props} key={index} />;\n case PageGeneratorSupportedFields.Label:\n return (\n <Label {...field.props} key={index}>\n {field.innerHTML}\n </Label>\n );\n case PageGeneratorSupportedFields.Legend:\n return (\n <Legend {...field.props} key={index}>\n {field.innerHTML}\n </Legend>\n );\n case PageGeneratorSupportedFields.Link:\n return (\n <Link {...field.props} key={index}>\n {field.innerHTML}\n </Link>\n );\n case PageGeneratorSupportedFields.List:\n return (\n <List {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </List>\n );\n case PageGeneratorSupportedFields.ListItem:\n return (\n <ListItem {...field.props} key={index}>\n {field.innerHTML}\n </ListItem>\n );\n case PageGeneratorSupportedFields.LocalMessage:\n return (\n <LocalMessage {...field.props} key={index}>\n {field.innerHTML}\n </LocalMessage>\n );\n case PageGeneratorSupportedFields.Paragraph:\n return (\n <Paragraph {...field.props} key={index}>\n {field.innerHTML}\n </Paragraph>\n );\n case PageGeneratorSupportedFields.RadioButton:\n return (\n <RadioButton\n {...field.props}\n key={index}\n onChange={inputFieldOnChange}\n />\n );\n case PageGeneratorSupportedFields.RadioButtonGroup:\n field.props.direction = screenSize > ScreenSize.XSmall ? 'row' : 'column';\n return (\n <RadioButtonGroup {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </RadioButtonGroup>\n );\n case PageGeneratorSupportedFields.Select:\n return (\n <Select\n {...field.props}\n key={index}\n onChange={option => selectOnChange(option, field.name)}\n onBlur={_event => {\n onBlurSelect(field.name);\n }}\n />\n );\n case PageGeneratorSupportedFields.Spinner:\n return <Spinner {...field.props} key={index} />;\n case PageGeneratorSupportedFields.TextArea:\n return (\n <TextArea\n {...field.props}\n key={index}\n onChange={textAreaFieldOnChange}\n onBlur={onBlur}\n />\n );\n case PageGeneratorSupportedFields.TextInput:\n return (\n <TextInput\n {...field.props}\n key={index}\n onChange={inputFieldOnChange}\n onBlur={onBlur}\n />\n );\n case PageGeneratorSupportedFields.ToggleBar:\n return (\n <ToggleBar {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </ToggleBar>\n );\n case PageGeneratorSupportedFields.ToggleButton:\n return (\n <ToggleButton\n {...field.props}\n key={index}\n onChange={inputFieldOnChange}\n />\n );\n case PageGeneratorSupportedFields.ToggleButtonGroup:\n return (\n <ToggleButtonGroup {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </ToggleButtonGroup>\n );\n case PageGeneratorSupportedFields.ToggleRadio:\n return (\n <ToggleRadio\n {...field.props}\n key={index}\n onChange={inputFieldOnChange}\n />\n );\n case PageGeneratorSupportedFields.Typography:\n return (\n <Typography {...field.props} key={index}>\n {field.innerHTML}\n </Typography>\n );\n case PageGeneratorSupportedFields.VisuallyHidden:\n return (\n <VisuallyHidden {...field.props} key={index}>\n {field.innerHTML}\n </VisuallyHidden>\n );\n case PageGeneratorSupportedFields.VStack:\n return (\n <VStack {...field.props} key={index}>\n {field.children.map((child, childIndex) => {\n return (\n !child.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={child}\n gridChildProps={props.gridChildProps}\n />\n )\n );\n })}\n </VStack>\n );\n default:\n return <></>;\n }\n};\n","import { HStack } from '@norges-domstoler/dds-components';\nimport { PageGeneratorField } from '../../types';\nimport { PageGeneratorTokens } from '../../tokens';\nimport { GenerateComponent } from './GenerateComponent';\nimport { GenerateGridChildProperties } from './GenerateGridChild';\nimport { isFieldWithValidations } from '../../helpers';\nimport { useContext } from 'react';\nimport { PageGeneratorContext } from '../PageGenerator/PageGeneratorContext';\n\ninterface GenerateRowProps {\n index: number;\n fields: PageGeneratorField[];\n gridChildProps: GenerateGridChildProperties;\n}\n\nexport const GenerateRow = (props: GenerateRowProps) => {\n const { index, fields, gridChildProps } = props;\n const { formData } = useContext(PageGeneratorContext);\n return (\n <HStack\n gap={PageGeneratorTokens.Stack[gridChildProps.screenSize] || 0}\n align=\"flex-start\"\n htmlProps={{ style: { flexWrap: 'wrap' } }}\n key={index}\n >\n {fields.map((field, childIndex) => {\n if (\n isFieldWithValidations(field) &&\n field.props.name &&\n formData.errorMessages\n ) {\n field.props = {\n ...field.props,\n errorMessage: formData.errorMessages[field.props.name],\n };\n }\n return (\n !field.hide && (\n <GenerateComponent\n key={childIndex}\n index={childIndex}\n field={field}\n gridChildProps={gridChildProps}\n />\n )\n );\n })}\n </HStack>\n );\n};\n","import {\n getBaseHTMLProps,\n useScreenSize,\n} from '@norges-domstoler/dds-components';\nimport {\n PageGeneratorField,\n PageGeneratorRow,\n SectionGeneratorProps,\n} from '../../types';\nimport React, { JSX, useContext } from 'react';\nimport { isSectionGeneratorRow } from '../../helpers';\nimport { GenerateRow } from '../Generate/GenerateRow';\nimport { GenerateComponent } from '../Generate/GenerateComponent';\nimport { PageGeneratorProvider } from '../PageGenerator/PageGeneratorProvider';\nimport { PageGeneratorContext } from '../PageGenerator/PageGeneratorContext';\nimport { GenerateGridChildProperties } from '../Generate/GenerateGridChild';\n\n/**\n * Generer komponenter fra @norges-domstoler/dds-components, basert på `fields` propertien. SectionGenerator legger på en wrapper, basert på `as` propertien.\n * @param props - `fields` inneholder felter eller rader med felter. `errorsOnChange` er callback for statehåndtering. `as` setter HTML-element rundt hele SectionGenerator.\n */\nexport const SectionGenerator = (props: SectionGeneratorProps) => {\n const {\n fields = [],\n formDataOnChange,\n state,\n setState,\n as,\n id,\n className,\n htmlProps,\n ...rest\n } = props;\n const {\n fieldOnChange,\n selectOnChange,\n datePickerOnChange,\n onBlur,\n onBlurSelect,\n validateAllFields,\n } = useContext(PageGeneratorContext);\n const screenSize = useScreenSize();\n const generateGridChildProps: GenerateGridChildProperties = {\n fieldOnChange,\n selectOnChange,\n datePickerOnChange,\n onBlur,\n onBlurSelect,\n screenSize,\n };\n\n const Parent = (props: { children: (false | JSX.Element)[] }) => {\n if (as === 'div') {\n return (\n <div {...getBaseHTMLProps(id, className, htmlProps, rest)}>\n {props.children}\n </div>\n );\n } else if (as === 'form') {\n return (\n <form {...getBaseHTMLProps(id, className, htmlProps, rest)}>\n {props.children}\n </form>\n );\n } else if (as === 'fragment') {\n return <React.Fragment>{props.children}</React.Fragment>;\n } else {\n return <></>;\n }\n };\n\n const children = (validateAllFields: (next: () => void) => void) => {\n return (\n <Parent>\n {fields.map((obj, index) => {\n const isRow = isSectionGeneratorRow(obj);\n return (\n !obj.hide && (\n <React.Fragment key={index}>\n {isRow && (\n <GenerateRow\n index={index}\n fields={(obj as PageGeneratorRow).fields}\n gridChildProps={generateGridChildProps}\n />\n )}\n {!isRow && (\n <GenerateComponent\n index={index}\n field={obj as PageGeneratorField}\n gridChildProps={generateGridChildProps}\n />\n )}\n </React.Fragment>\n )\n );\n })}\n </Parent>\n );\n };\n\n return (\n <PageGeneratorProvider\n fields={fields}\n formDataOnChange={formDataOnChange}\n state={state}\n setState={setState}\n children={children}\n />\n );\n};\n\nSectionGenerator.displayName = 'SectionGenerator';\n"],"mappings":"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