{"version":3,"file":"AltDateWidget.mjs","sources":["../../src/widgets/AltDateWidget.tsx"],"sourcesContent":["import { MouseEvent, useCallback, useEffect, useReducer, useState } from 'react';\nimport {\n  ariaDescribedByIds,\n  parseDateString,\n  toDateString,\n  pad,\n  DateObject,\n  type DateElementFormat,\n  FormContextType,\n  RJSFSchema,\n  StrictRJSFSchema,\n  TranslatableString,\n  WidgetProps,\n  getDateElementProps,\n} from '@rjsf/utils';\nimport { Button, Grid, Group, Stack } from '@mantine/core';\n\nfunction rangeOptions(start: number, stop: number) {\n  const options = [];\n  for (let i = start; i <= stop; i++) {\n    options.push({ value: i, label: pad(i, 2) });\n  }\n  return options;\n}\n\nfunction readyForChange(state: DateObject) {\n  return Object.values(state).every((value) => value !== -1);\n}\n\ntype DateElementProps<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any> = Pick<\n  WidgetProps<T, S, F>,\n  'value' | 'name' | 'disabled' | 'readonly' | 'autofocus' | 'registry' | 'onBlur' | 'onFocus'\n> & {\n  rootId: string;\n  select: (property: keyof DateObject, value: any) => void;\n  type: string;\n  range: [number, number];\n};\n\nfunction DateElement<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>({\n  type,\n  range,\n  value,\n  select,\n  rootId,\n  name,\n  disabled,\n  readonly,\n  autofocus,\n  registry,\n  onBlur,\n  onFocus,\n}: DateElementProps<T, S, F>) {\n  const id = rootId + '_' + type;\n  const { SelectWidget } = registry.widgets;\n  return (\n    <SelectWidget\n      schema={{ type: 'integer' } as S}\n      id={id}\n      name={name}\n      className='form-control'\n      options={{ enumOptions: rangeOptions(range[0], range[1]) }}\n      placeholder={type}\n      value={value}\n      disabled={disabled}\n      readonly={readonly}\n      autofocus={autofocus}\n      onChange={(value: any) => select(type as keyof DateObject, value)}\n      onBlur={onBlur}\n      onFocus={onFocus}\n      registry={registry}\n      label=''\n      aria-describedby={ariaDescribedByIds<T>(rootId)}\n    />\n  );\n}\n\n/** The `AltDateWidget` is an alternative widget for rendering date properties.\n * @param props - The `WidgetProps` for this component\n */\nfunction AltDateWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>({\n  time = false,\n  disabled = false,\n  readonly = false,\n  autofocus = false,\n  options,\n  id,\n  name,\n  registry,\n  onBlur,\n  onFocus,\n  onChange,\n  value,\n  className,\n}: WidgetProps<T, S, F>) {\n  const { translateString } = registry;\n  const [lastValue, setLastValue] = useState(value);\n  const [state, setState] = useReducer(\n    (state: DateObject, action: Partial<DateObject>) => {\n      return { ...state, ...action };\n    },\n    parseDateString(value, time),\n  );\n\n  useEffect(() => {\n    const stateValue = toDateString(state, time);\n    if (readyForChange(state) && stateValue !== value) {\n      // The user changed the date to a new valid data via the comboboxes, so call onChange\n      onChange(stateValue);\n    } else if (lastValue !== value) {\n      // We got a new value in the props\n      setLastValue(value);\n      setState(parseDateString(value, time));\n    }\n  }, [time, value, onChange, state, lastValue]);\n\n  const handleChange = useCallback((property: keyof DateObject, value: string) => {\n    setState({ [property]: value });\n  }, []);\n\n  const handleSetNow = useCallback(\n    (event: MouseEvent<HTMLButtonElement>) => {\n      event.preventDefault();\n      if (disabled || readonly) {\n        return;\n      }\n      const nextState = parseDateString(new Date().toJSON(), time);\n      onChange(toDateString(nextState, time));\n    },\n    [disabled, onChange, readonly, time],\n  );\n\n  const handleClear = useCallback(\n    (event: MouseEvent<HTMLButtonElement>) => {\n      event.preventDefault();\n      if (disabled || readonly) {\n        return;\n      }\n      onChange(undefined);\n    },\n    [disabled, readonly, onChange],\n  );\n\n  return (\n    <Stack className={`armt-widget-altdate ${className ?? ''}`} spacing='xs'>\n      <Grid>\n        {getDateElementProps(\n          state,\n          time,\n          options.yearsRange as [number, number] | undefined,\n          options.format as DateElementFormat | undefined,\n        ).map((elemProps, i) => (\n          <Grid.Col span={4} key={i}>\n            <DateElement\n              rootId={id}\n              name={name}\n              select={handleChange}\n              {...elemProps}\n              disabled={disabled}\n              readonly={readonly}\n              registry={registry}\n              onBlur={onBlur}\n              onFocus={onFocus}\n              autofocus={autofocus && i === 0}\n            />\n          </Grid.Col>\n        ))}\n      </Grid>\n      <Group>\n        {(options.hideNowButton !== 'undefined' ? !options.hideNowButton : true) && (\n          <Button variant='filled' onClick={handleSetNow}>\n            {translateString(TranslatableString.NowLabel)}\n          </Button>\n        )}\n        {(options.hideClearButton !== 'undefined' ? !options.hideClearButton : true) && (\n          <Button variant='outline' onClick={handleClear}>\n            {translateString(TranslatableString.ClearLabel)}\n          </Button>\n        )}\n      </Group>\n    </Stack>\n  );\n}\n\nexport default AltDateWidget;\n"],"names":[],"mappings":"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"}