@medplum/react 2.0.12 → 2.0.13

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.
@@ -1,4 +1,4 @@
1
- import { Group, Button, Modal, TextInput, NativeSelect, Checkbox } from '@mantine/core';
1
+ import { Group, Button, Modal, Stack, Switch, TextInput, NativeSelect, Chip } from '@mantine/core';
2
2
  import { formatTiming } from '@medplum/core';
3
3
  import React, { useState, useRef } from 'react';
4
4
  import { DateTimeInput } from '../DateTimeInput/DateTimeInput.mjs';
@@ -6,7 +6,7 @@ import { FormSection } from '../FormSection/FormSection.mjs';
6
6
 
7
7
  const daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
8
8
  function TimingInput(props) {
9
- const [value, setValue] = useState(props.defaultValue || {});
9
+ const [value, setValue] = useState(props.defaultValue);
10
10
  const [open, setOpen] = useState(false);
11
11
  const valueRef = useRef();
12
12
  valueRef.current = value;
@@ -22,8 +22,14 @@ function TimingInput(props) {
22
22
  setOpen(false);
23
23
  }, onCancel: () => setOpen(false) })));
24
24
  }
25
+ const defaultValue = {
26
+ repeat: {
27
+ period: 1,
28
+ periodUnit: 'd',
29
+ },
30
+ };
25
31
  function TimingEditorDialog(props) {
26
- const [value, setValue] = useState(props.defaultValue || {});
32
+ const [value, setValue] = useState(props.defaultValue || defaultValue);
27
33
  const valueRef = useRef();
28
34
  valueRef.current = value;
29
35
  function setStart(newStart) {
@@ -38,44 +44,32 @@ function TimingEditorDialog(props) {
38
44
  function setPeriodUnit(newPeriodUnit) {
39
45
  setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });
40
46
  }
41
- function setDayOfWeek(day, enabled) {
42
- if (enabled) {
43
- addDayOfWeek(day);
44
- }
45
- else {
46
- removeDayOfWeek(day);
47
- }
48
- }
49
- function addDayOfWeek(day) {
50
- const existing = valueRef.current?.repeat?.dayOfWeek || [];
51
- if (!existing.includes(day)) {
52
- setRepeat({ ...valueRef.current?.repeat, dayOfWeek: [...existing, day] });
53
- }
54
- }
55
- function removeDayOfWeek(day) {
56
- const existing = valueRef.current?.repeat?.dayOfWeek || [];
57
- if (existing.includes(day)) {
58
- setRepeat({ ...valueRef.current?.repeat, dayOfWeek: existing.filter((d) => d !== day) });
59
- }
47
+ function setDaysOfWeek(newDaysOfWeek) {
48
+ setRepeat({ ...valueRef.current?.repeat, dayOfWeek: newDaysOfWeek });
60
49
  }
61
50
  return (React.createElement(Modal, { title: "Timing", closeButtonProps: { 'aria-label': 'Close' }, opened: props.visible, onClose: () => props.onCancel() },
62
- React.createElement("div", { style: { padding: '5px 20px', textAlign: 'left' } },
51
+ React.createElement(Stack, null,
63
52
  React.createElement(FormSection, { title: "Starts on", htmlFor: 'timing-dialog-start' },
64
53
  React.createElement(DateTimeInput, { name: 'timing-dialog-start', onChange: (newValue) => setStart(newValue) })),
65
- React.createElement(FormSection, { title: "Repeat every", htmlFor: 'timing-dialog-period' },
66
- React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
67
- React.createElement(TextInput, { type: "number", step: 1, id: "timing-dialog-period", name: "timing-dialog-period", defaultValue: value?.repeat?.period, onChange: (e) => setPeriod(parseInt(e.currentTarget.value)) }),
68
- React.createElement(NativeSelect, { id: "timing-dialog-periodUnit", name: "timing-dialog-periodUnit", defaultValue: value?.repeat?.periodUnit, onChange: (e) => setPeriodUnit(e.currentTarget.value), data: [
69
- { label: 'day', value: 'd' },
70
- { label: 'week', value: 'wk' },
71
- { label: 'month', value: 'mo' },
72
- { label: 'year', value: 'a' },
73
- ] }))),
74
- React.createElement(FormSection, { title: "Repeat on" },
75
- React.createElement(Group, { spacing: "xs", grow: true, noWrap: true }, daysOfWeek.map((day) => (React.createElement(React.Fragment, { key: day },
76
- React.createElement("label", { htmlFor: 'timing-dialog-repeat-' + day }, day.charAt(0).toUpperCase()),
77
- React.createElement(Checkbox, { id: 'timing-dialog-repeat-' + day, name: 'timing-dialog-repeat-' + day, onChange: (e) => setDayOfWeek(day, e.currentTarget.checked) }))))))),
78
- React.createElement(Button, { onClick: () => props.onOk(value) }, "OK")));
54
+ React.createElement(Switch, { label: "Repeat", checked: !!value.repeat, onChange: (e) => setRepeat(e.currentTarget.checked ? defaultValue.repeat : undefined) }),
55
+ value.repeat && (React.createElement(React.Fragment, null,
56
+ React.createElement(FormSection, { title: "Repeat every", htmlFor: 'timing-dialog-period' },
57
+ React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
58
+ React.createElement(TextInput, { type: "number", step: 1, id: "timing-dialog-period", name: "timing-dialog-period", defaultValue: value?.repeat?.period || 1, onChange: (e) => setPeriod(parseInt(e.currentTarget.value) || 1) }),
59
+ React.createElement(NativeSelect, { id: "timing-dialog-periodUnit", name: "timing-dialog-periodUnit", defaultValue: value?.repeat?.periodUnit, onChange: (e) => setPeriodUnit(e.currentTarget.value), data: [
60
+ { label: 'second', value: 's' },
61
+ { label: 'minute', value: 'min' },
62
+ { label: 'hour', value: 'h' },
63
+ { label: 'day', value: 'd' },
64
+ { label: 'week', value: 'wk' },
65
+ { label: 'month', value: 'mo' },
66
+ { label: 'year', value: 'a' },
67
+ ] }))),
68
+ value.repeat?.periodUnit === 'wk' && (React.createElement(FormSection, { title: "Repeat on" },
69
+ React.createElement(Chip.Group, { multiple: true, onChange: setDaysOfWeek },
70
+ React.createElement(Group, { position: "apart", mt: "md", spacing: "xs" }, daysOfWeek.map((day) => (React.createElement(Chip, { key: day, value: day, size: "xs", radius: "xl" }, day.charAt(0).toUpperCase()))))))))),
71
+ React.createElement(Group, { position: "right" },
72
+ React.createElement(Button, { onClick: () => props.onOk(value) }, "OK")))));
79
73
  }
80
74
 
81
75
  export { TimingInput };
@@ -1 +1 @@
1
- {"version":3,"file":"TimingInput.mjs","sources":["../../../src/TimingInput/TimingInput.tsx"],"sourcesContent":["import { Button, Checkbox, Group, Modal, NativeSelect, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo' | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDayOfWeek(day: DayOfWeek, enabled: boolean): void {\n if (enabled) {\n addDayOfWeek(day);\n } else {\n removeDayOfWeek(day);\n }\n }\n\n function addDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (!existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: [...existing, day] });\n }\n }\n\n function removeDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: existing.filter((d) => d !== day) });\n }\n }\n\n return (\n <Modal\n title=\"Timing\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={() => props.onCancel()}\n >\n <div style={{ padding: '5px 20px', textAlign: 'left' }}>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value?.repeat?.period}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value))}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value?.repeat?.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as 'a' | 'd' | 'wk' | 'mo' | undefined)}\n data={[\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n <FormSection title=\"Repeat on\">\n <Group spacing=\"xs\" grow noWrap>\n {daysOfWeek.map((day) => (\n <React.Fragment key={day}>\n <label htmlFor={'timing-dialog-repeat-' + day}>{day.charAt(0).toUpperCase()}</label>\n <Checkbox\n id={'timing-dialog-repeat-' + day}\n name={'timing-dialog-repeat-' + day}\n onChange={(e) => setDayOfWeek(day as DayOfWeek, e.currentTarget.checked)}\n />\n </React.Fragment>\n ))}\n </Group>\n </FormSection>\n </div>\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Modal>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TimingInput.mjs","sources":["../../../src/TimingInput/TimingInput.tsx"],"sourcesContent":["import { Button, Chip, Group, Modal, NativeSelect, Stack, Switch, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\ntype PeriodUnit = 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing | undefined>(props.defaultValue);\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nconst defaultValue: Timing = {\n repeat: {\n period: 1,\n periodUnit: 'd',\n },\n};\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || defaultValue);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat | undefined): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: PeriodUnit | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDaysOfWeek(newDaysOfWeek: DayOfWeek[] | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: newDaysOfWeek });\n }\n\n return (\n <Modal\n title=\"Timing\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={() => props.onCancel()}\n >\n <Stack>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <Switch\n label=\"Repeat\"\n checked={!!value.repeat}\n onChange={(e) => setRepeat(e.currentTarget.checked ? defaultValue.repeat : undefined)}\n />\n {value.repeat && (\n <>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value?.repeat?.period || 1}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value) || 1)}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value?.repeat?.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as PeriodUnit | undefined)}\n data={[\n { label: 'second', value: 's' },\n { label: 'minute', value: 'min' },\n { label: 'hour', value: 'h' },\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n {value.repeat?.periodUnit === 'wk' && (\n <FormSection title=\"Repeat on\">\n <Chip.Group multiple onChange={setDaysOfWeek as (v: string[] | undefined) => void}>\n <Group position=\"apart\" mt=\"md\" spacing=\"xs\">\n {daysOfWeek.map((day) => (\n <Chip key={day} value={day} size=\"xs\" radius=\"xl\">\n {day.charAt(0).toUpperCase()}\n </Chip>\n ))}\n </Group>\n </Chip.Group>\n </FormSection>\n )}\n </>\n )}\n <Group position=\"right\">\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Group>\n </Stack>\n </Modal>\n );\n}\n"],"names":[],"mappings":"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"}