@kwiz/fluentui 1.0.51 → 1.0.53

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,12 @@
1
1
  import { DatePickerProps } from '@fluentui/react-datepicker-compat';
2
+ import { TimePickerProps } from '@fluentui/react-timepicker-compat';
2
3
  import * as React from 'react';
3
- interface IProps extends DatePickerProps {
4
- onOK?: () => void;
5
- onCancel?: () => void;
4
+ interface IProps {
5
+ onDateChange: (newDateObject: Date) => void;
6
+ value: Date;
7
+ showTime?: boolean;
8
+ datePickerProps?: DatePickerProps;
9
+ timePickerProps?: TimePickerProps;
6
10
  }
7
11
  export declare const DatePickerEx: React.FunctionComponent<React.PropsWithChildren<IProps>>;
8
12
  export {};
@@ -1,32 +1,49 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { DatePicker } from '@fluentui/react-datepicker-compat';
3
+ import { TimePicker } from '@fluentui/react-timepicker-compat';
3
4
  import { CalendarCancelRegular } from '@fluentui/react-icons';
4
- import { isDate, isFunction, isNullOrEmptyString } from '@kwiz/common';
5
+ import { isDate } from '@kwiz/common';
5
6
  import * as React from 'react';
6
7
  import { useKWIZFluentContext } from '../helpers/context';
8
+ import { useStateEX } from '../helpers/hooks';
9
+ import { Horizontal } from './horizontal';
7
10
  export const DatePickerEx = (props) => {
8
11
  const ctx = useKWIZFluentContext();
9
- const [showClear, setShowClear] = React.useState(isDate(props.value));
10
- const reset = React.useCallback(() => {
11
- setShowClear(false);
12
- if (isFunction(props.onSelectDate))
13
- props.onSelectDate(undefined);
14
- }, [showClear]);
15
- return (_jsx(DatePicker, Object.assign({ appearance: ctx.inputAppearance, mountNode: ctx.mountNode }, props, { onSelectDate: (date) => {
16
- setShowClear(isDate(date));
17
- if (isFunction(props.onSelectDate))
18
- props.onSelectDate(date);
19
- }, onChange: (e, data) => {
20
- setShowClear(!isNullOrEmptyString(data.value));
21
- if (isFunction(props.onChange))
22
- props.onChange(e, data);
23
- }, onKeyDown: isFunction(props.onOK) || isFunction(props.onCancel)
24
- ? e => {
25
- if (isFunction(props.onOK) && e.key === "Enter")
26
- props.onOK();
27
- else if (isFunction(props.onCancel) && e.key === "Escape")
28
- props.onCancel();
29
- }
30
- : undefined, contentBefore: showClear && _jsx(CalendarCancelRegular, { title: 'Clear', onClick: () => reset() }) })));
12
+ //time value will always have a value even when clearing the date
13
+ const [timeValue, setTimeValue] = useStateEX(isDate(props.value) ? props.value : new Date());
14
+ const { showClear, dateValue } = React.useMemo(() => {
15
+ const showClear = isDate(props.value);
16
+ const dateValue = props.value;
17
+ return { showClear, dateValue };
18
+ }, [props.value]);
19
+ function reset() {
20
+ props.onDateChange(null);
21
+ }
22
+ const changeDateHandler = React.useCallback((newDateValue) => {
23
+ const newDate = new Date(newDateValue);
24
+ // Use the old time values.
25
+ newDate.setHours(timeValue ? timeValue.getHours() : 0, timeValue ? timeValue.getMinutes() : 0, 0, 0);
26
+ props.onDateChange(newDate);
27
+ }, [timeValue]);
28
+ const changeTimeHandler = React.useCallback((newTimeValue) => {
29
+ //update our state
30
+ setTimeValue(newTimeValue);
31
+ // Use the old date value.
32
+ const newDate = isDate(dateValue) ? new Date(dateValue) : new Date();
33
+ newDate.setHours(newTimeValue.getHours(), newTimeValue.getMinutes(), 0, 0);
34
+ props.onDateChange(newDate);
35
+ }, [dateValue]);
36
+ const DatePickerControl = _jsx(DatePicker, Object.assign({}, (props.datePickerProps || {}), { appearance: ctx.inputAppearance, mountNode: ctx.mountNode, value: isDate(dateValue) ? dateValue : null, onSelectDate: (newDate) => {
37
+ changeDateHandler(newDate);
38
+ }, contentBefore: showClear && _jsx(CalendarCancelRegular, { title: 'Clear', onClick: () => reset() }) }));
39
+ const TimePickerControl = _jsx(TimePicker, Object.assign({ appearance: ctx.inputAppearance, mountNode: ctx.mountNode }, props.timePickerProps, {
40
+ //only show time value when there is a selected date. timeValue will never be null.
41
+ value: isDate(dateValue) ? timeValue.toLocaleTimeString("en", { hour: "2-digit", minute: "2-digit", hour12: true }) : "", onTimeChange: (e, date) => {
42
+ const newDate = date.selectedTime;
43
+ changeTimeHandler(newDate);
44
+ } }));
45
+ return (props.showTime
46
+ ? _jsxs(Horizontal, { children: [DatePickerControl, TimePickerControl] })
47
+ : DatePickerControl);
31
48
  };
32
49
  //# sourceMappingURL=date.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/controls/date.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAmB,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAO1D,MAAM,CAAC,MAAM,YAAY,GAA6D,CAAC,KAAK,EAAE,EAAE;IAC5F,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACjC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC;YAAE,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,CACH,KAAC,UAAU,kBAAC,UAAU,EAAE,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,IAAM,KAAK,IAC5E,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3B,IAAI,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC;gBAAE,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;YAClB,YAAY,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC,EACD,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC3D,CAAC,CAAC,CAAC,CAAC,EAAE;gBACF,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;oBAAE,KAAK,CAAC,IAAI,EAAE,CAAC;qBACzD,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;oBAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChF,CAAC;YACD,CAAC,CAAC,SAAS,EAEf,aAAa,EAAE,SAAS,IAAI,KAAC,qBAAqB,IAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,GAAI,IAC7F,CACL,CAAC;AACN,CAAC,CAAA"}
1
+ {"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/controls/date.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kwiz/fluentui",
3
- "version": "1.0.51",
3
+ "version": "1.0.53",
4
4
  "description": "KWIZ common controls for FluentUI",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -57,6 +57,7 @@
57
57
  "typescript": "^5.3.3"
58
58
  },
59
59
  "dependencies": {
60
+ "@fluentui/react-timepicker-compat": "^0.2.42",
60
61
  "@kwiz/common": "^1.0.103",
61
62
  "esbuild": "^0.19.12",
62
63
  "get-tsconfig": "^4.7.2",
@@ -1,40 +1,86 @@
1
1
  import { DatePicker, DatePickerProps } from '@fluentui/react-datepicker-compat';
2
+ import { TimePicker, TimePickerProps } from '@fluentui/react-timepicker-compat';
3
+
2
4
  import { CalendarCancelRegular } from '@fluentui/react-icons';
3
- import { isDate, isFunction, isNullOrEmptyString } from '@kwiz/common';
5
+ import { isDate } from '@kwiz/common';
4
6
  import * as React from 'react';
5
7
  import { useKWIZFluentContext } from '../helpers/context';
8
+ import { useStateEX } from '../helpers/hooks';
9
+ import { Horizontal } from './horizontal';
6
10
 
7
-
8
- interface IProps extends DatePickerProps {
9
- onOK?: () => void;
10
- onCancel?: () => void;
11
+ interface IProps {
12
+ onDateChange: (newDateObject: Date) => void;
13
+ value: Date;
14
+ showTime?: boolean;
15
+ datePickerProps?: DatePickerProps;
16
+ timePickerProps?: TimePickerProps;
11
17
  }
12
18
  export const DatePickerEx: React.FunctionComponent<React.PropsWithChildren<IProps>> = (props) => {
13
19
  const ctx = useKWIZFluentContext();
14
- const [showClear, setShowClear] = React.useState(isDate(props.value));
15
- const reset = React.useCallback(() => {
16
- setShowClear(false);
17
- if (isFunction(props.onSelectDate)) props.onSelectDate(undefined);
18
- }, [showClear]);
20
+
21
+ //time value will always have a value even when clearing the date
22
+ const [timeValue, setTimeValue] = useStateEX<Date>(isDate(props.value) ? props.value : new Date());
23
+ const { showClear, dateValue } = React.useMemo(() => {
24
+ const showClear = isDate(props.value);
25
+ const dateValue = props.value;
26
+ return { showClear, dateValue };
27
+ }, [props.value]);
28
+
29
+ function reset() {
30
+ props.onDateChange(null);
31
+ }
32
+
33
+ const changeDateHandler = React.useCallback((newDateValue: Date): void => {
34
+ const newDate = new Date(newDateValue);
35
+ // Use the old time values.
36
+ newDate.setHours(
37
+ timeValue ? timeValue.getHours() : 0,
38
+ timeValue ? timeValue.getMinutes() : 0, 0, 0
39
+ );
40
+ props.onDateChange(newDate);
41
+ }, [timeValue]);
42
+
43
+ const changeTimeHandler = React.useCallback((newTimeValue: Date): void => {
44
+ //update our state
45
+ setTimeValue(newTimeValue);
46
+ // Use the old date value.
47
+ const newDate = isDate(dateValue) ? new Date(dateValue) : new Date();
48
+ newDate.setHours(
49
+ newTimeValue.getHours(),
50
+ newTimeValue.getMinutes(), 0, 0
51
+ );
52
+ props.onDateChange(newDate);
53
+ }, [dateValue]);
54
+
55
+ const DatePickerControl = <DatePicker
56
+ {...(props.datePickerProps || {})}
57
+ appearance={ctx.inputAppearance}
58
+ mountNode={ctx.mountNode}
59
+ value={isDate(dateValue) ? dateValue : null}
60
+ onSelectDate={(newDate) => {
61
+ changeDateHandler(newDate);
62
+ }}
63
+ contentBefore={showClear && <CalendarCancelRegular title='Clear' onClick={() => reset()} />}
64
+ />
65
+
66
+ const TimePickerControl = <TimePicker
67
+ appearance={ctx.inputAppearance}
68
+ mountNode={ctx.mountNode}
69
+ {...props.timePickerProps}
70
+ //only show time value when there is a selected date. timeValue will never be null.
71
+ value={isDate(dateValue) ? timeValue.toLocaleTimeString("en", { hour: "2-digit", minute: "2-digit", hour12: true }) : ""}
72
+ onTimeChange={(e, date) => {
73
+ const newDate = date.selectedTime;
74
+ changeTimeHandler(newDate);
75
+ }}
76
+ />
19
77
 
20
78
  return (
21
- <DatePicker appearance={ctx.inputAppearance} mountNode={ctx.mountNode} {...props}
22
- onSelectDate={(date) => {
23
- setShowClear(isDate(date));
24
- if (isFunction(props.onSelectDate)) props.onSelectDate(date);
25
- }}
26
- onChange={(e, data) => {
27
- setShowClear(!isNullOrEmptyString(data.value));
28
- if (isFunction(props.onChange)) props.onChange(e, data);
29
- }}
30
- onKeyDown={isFunction(props.onOK) || isFunction(props.onCancel)
31
- ? e => {
32
- if (isFunction(props.onOK) && e.key === "Enter") props.onOK();
33
- else if (isFunction(props.onCancel) && e.key === "Escape") props.onCancel();
34
- }
35
- : undefined
36
- }
37
- contentBefore={showClear && <CalendarCancelRegular title='Clear' onClick={() => reset()} />}
38
- />
79
+ props.showTime
80
+ ? <Horizontal>
81
+ {DatePickerControl}
82
+ {TimePickerControl}
83
+ </Horizontal>
84
+ : DatePickerControl
39
85
  );
40
86
  }