@dbcdk/react-components 0.0.23 → 0.0.24

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.
@@ -43,6 +43,7 @@ type BaseProps = {
43
43
  locale: string;
44
44
  enableTime: boolean;
45
45
  }) => string;
46
+ onOpenChange?: (open: boolean) => void;
46
47
  };
47
48
  export type DateTimePickerProps = (BaseProps & {
48
49
  mode?: 'single';
@@ -52,7 +52,7 @@ function defaultFormatRange(s, e, opts) {
52
52
  return '';
53
53
  }
54
54
  const cx = (...classes) => classes.filter(Boolean).join(' ');
55
- export const DateTimePicker = forwardRef(function DateTimePicker({ mode = 'single', value, onChange, enableTime = false, timeStep = 15, min, max, locale = typeof navigator !== 'undefined' ? navigator.language : 'da-DK', weekStartsOn = 1, presets, inputProps, formatDate = defaultFormatDate, formatRange = defaultFormatRange, }, _ref) {
55
+ export const DateTimePicker = forwardRef(function DateTimePicker({ mode = 'single', value, onChange, enableTime = false, timeStep = 15, min, max, locale = typeof navigator !== 'undefined' ? navigator.language : 'da-DK', weekStartsOn = 1, presets, inputProps, formatDate = defaultFormatDate, formatRange = defaultFormatRange, onOpenChange, }, _ref) {
56
56
  void formatDate;
57
57
  void formatRange;
58
58
  const popRef = useRef(null);
@@ -314,6 +314,19 @@ export const DateTimePicker = forwardRef(function DateTimePicker({ mode = 'singl
314
314
  setDirty(false);
315
315
  }
316
316
  }, [text, mode, enableTime, onChangeDateOnly, onChangeIso, onChangeRange]);
317
+ const emitTimeChange = useCallback((nextHH, nextMM) => {
318
+ if (mode !== 'single' || !enableTime)
319
+ return;
320
+ if (typeof value !== 'string')
321
+ return;
322
+ const current = localDateFromIso(value);
323
+ if (!current)
324
+ return;
325
+ const iso = isoFromLocalParts(current.getFullYear(), current.getMonth(), current.getDate(), nextHH, nextMM);
326
+ if (!iso)
327
+ return;
328
+ onChangeIso(iso);
329
+ }, [mode, enableTime, value, onChangeIso]);
317
330
  const clear = useCallback(() => {
318
331
  if (mode === 'single') {
319
332
  if (enableTime)
@@ -328,7 +341,7 @@ export const DateTimePicker = forwardRef(function DateTimePicker({ mode = 'singl
328
341
  setText('');
329
342
  }, [mode, enableTime, onChangeDateOnly, onChangeIso, onChangeRange]);
330
343
  const fallbackPlaceholder = mode === 'single' ? 'Vælg dato' : 'Vælg interval';
331
- return (_jsx(Popover, { matchTriggerWidth: false, ref: popRef, trigger: toggle => {
344
+ return (_jsx(Popover, { matchTriggerWidth: false, ref: popRef, onOpenChange: onOpenChange, trigger: toggle => {
332
345
  var _a, _b;
333
346
  return (_jsx("div", { onClick: toggle, className: styles.triggerWrap, children: _jsx(Input, { ...inputProps, autoComplete: "off", autoCorrect: "off", autoCapitalize: "off", spellCheck: "false", placeholder: (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.placeholder) !== null && _a !== void 0 ? _a : fallbackPlaceholder, value: dirty ? text : formatted, onInput: e => {
334
347
  setDirty(true);
@@ -374,6 +387,14 @@ export const DateTimePicker = forwardRef(function DateTimePicker({ mode = 'singl
374
387
  }
375
388
  const dayNum = utcDay.getUTCDate();
376
389
  return (_jsx("button", { role: "gridcell", "aria-selected": selected, "aria-disabled": disabledDay, onMouseEnter: () => setHoverUTC(utcDay), onClick: () => selectDay(utcDay), disabled: disabledDay, className: cx(styles.dayCell, inThisMonth ? styles.dayInMonth : styles.dayOutside, selected && styles.daySelected, inRange && styles.dayInRange, isToday && !selected && styles.dayToday, disabledDay && styles.dayDisabled), title: new Date(utcDay).toLocaleDateString(locale), children: dayNum }, idx));
377
- }) }), enableTime && mode === 'single' && (_jsxs("div", { className: styles.timeRow, children: [_jsxs("div", { className: styles.timeLabel, children: [_jsx(Clock, { size: 14 }), " Tid"] }), _jsx("select", { value: timeHH, onChange: e => setTimeHH(parseInt(e.target.value, 10)), className: styles.timeSelect, children: hours.map(h => (_jsx("option", { value: h, children: String(h).padStart(2, '0') }, h))) }), _jsx("select", { value: timeMM, onChange: e => setTimeMM(parseInt(e.target.value, 10)), className: styles.timeSelect, children: minutes.map(m => (_jsx("option", { value: m, children: String(m).padStart(2, '0') }, m))) })] })), mode === 'range' && (_jsxs("div", { className: styles.footer, children: [_jsx(Button, { variant: "outlined", size: "sm", onClick: clear, icon: _jsx(X, { size: 14 }), children: "Ryd" }), _jsx(Button, { variant: "primary", size: "sm", onClick: () => { var _a; return (_a = popRef.current) === null || _a === void 0 ? void 0 : _a.close(); }, children: "OK" })] }))] })] }) }));
390
+ }) }), enableTime && mode === 'single' && (_jsxs("div", { className: styles.timeRow, children: [_jsxs("div", { className: styles.timeLabel, children: [_jsx(Clock, { size: 14 }), " Tid"] }), _jsx("select", { value: timeHH, onChange: e => {
391
+ const nextHH = parseInt(e.target.value, 10);
392
+ setTimeHH(nextHH);
393
+ emitTimeChange(nextHH, timeMM);
394
+ }, className: styles.timeSelect, children: hours.map(h => (_jsx("option", { value: h, children: String(h).padStart(2, '0') }, h))) }), _jsx("select", { value: timeMM, onChange: e => {
395
+ const nextMM = parseInt(e.target.value, 10);
396
+ setTimeMM(nextMM);
397
+ emitTimeChange(timeHH, nextMM);
398
+ }, className: styles.timeSelect, children: minutes.map(m => (_jsx("option", { value: m, children: String(m).padStart(2, '0') }, m))) })] })), mode === 'range' && (_jsxs("div", { className: styles.footer, children: [_jsx(Button, { variant: "outlined", size: "sm", onClick: clear, icon: _jsx(X, { size: 14 }), children: "Ryd" }), _jsx(Button, { variant: "primary", size: "sm", onClick: () => { var _a; return (_a = popRef.current) === null || _a === void 0 ? void 0 : _a.close(); }, children: "OK" })] }))] })] }) }));
378
399
  });
379
400
  DateTimePicker.displayName = 'DateTimePicker';
@@ -56,7 +56,7 @@ function OperatorDropdown({ value, onChange, operators, size = 'sm', disabled, }
56
56
  setActiveIndex(operators.indexOf(op));
57
57
  (_a = popRef.current) === null || _a === void 0 ? void 0 : _a.close();
58
58
  };
59
- return (_jsx(Popover, { ref: popRef, minWidth: "220px", trigger: (toggle, icon) => (_jsxs("button", { type: "button", onClick: toggle, disabled: disabled, "aria-label": "Change operator", className: `${styles.operatorTrigger} ${styles[size]}`, children: [_jsx("span", { className: styles.operatorText, children: LABELS[value] }), icon] })), children: _jsx(Menu, { children: operators.map(op => {
59
+ return (_jsx(Popover, { ref: popRef, minWidth: "220px", trigger: (toggle, icon) => (_jsxs("button", { type: "button", onClick: toggle, disabled: disabled, "aria-label": "Skift operator", className: `${styles.operatorTrigger} ${styles[size]}`, children: [_jsx("span", { className: styles.operatorText, children: LABELS[value] }), icon] })), children: _jsx(Menu, { children: operators.map(op => {
60
60
  const selected = op === value;
61
61
  return (_jsx(Menu.Item, { active: selected, children: _jsxs("button", { type: "button", onClick: () => handleSelect(op), disabled: disabled, children: [_jsx("span", { style: { width: 16, display: 'inline-flex', justifyContent: 'center' }, children: selected ? _jsx(Check, { size: 16 }) : null }), LABELS[op]] }) }, op));
62
62
  }) }) }));
@@ -15,6 +15,7 @@
15
15
  border-color var(--transition-fast) var(--ease-standard),
16
16
  box-shadow var(--transition-fast) var(--ease-standard),
17
17
  color var(--transition-fast) var(--ease-standard);
18
+ line-height: 20px;
18
19
  }
19
20
 
20
21
  /* =========================
@@ -264,6 +265,10 @@
264
265
  );
265
266
  }
266
267
 
268
+ .operatorTrigger svg {
269
+ height: var(--component-size-xxs);
270
+ width: var(--component-size-xxs);
271
+ }
267
272
  /* =========================
268
273
  VALUE WRAPPER
269
274
  ========================= */
@@ -302,6 +307,8 @@
302
307
 
303
308
  .filterField .operatorText {
304
309
  white-space: nowrap;
310
+ font-family: var(--font-family-mono);
311
+ font-size: var(--font-size-xs);
305
312
  }
306
313
 
307
314
  .filterField input::placeholder {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dbcdk/react-components",
3
- "version": "0.0.23",
3
+ "version": "0.0.24",
4
4
  "description": "Reusable React components for DBC projects",
5
5
  "license": "ISC",
6
6
  "author": "",