@hitachivantara/uikit-react-core 5.15.0 → 5.16.0
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.
- package/dist/cjs/components/ActionBar/ActionBar.cjs +8 -7
- package/dist/cjs/components/ActionBar/ActionBar.cjs.map +1 -1
- package/dist/cjs/components/ActionBar/ActionBar.styles.cjs +16 -17
- package/dist/cjs/components/ActionBar/ActionBar.styles.cjs.map +1 -1
- package/dist/cjs/components/TimePicker/Placeholder.cjs +70 -0
- package/dist/cjs/components/TimePicker/Placeholder.cjs.map +1 -0
- package/dist/cjs/components/TimePicker/TimePicker.cjs +222 -0
- package/dist/cjs/components/TimePicker/TimePicker.cjs.map +1 -0
- package/dist/cjs/components/TimePicker/TimePicker.styles.cjs +53 -0
- package/dist/cjs/components/TimePicker/TimePicker.styles.cjs.map +1 -0
- package/dist/cjs/components/TimePicker/Unit/Unit.cjs +72 -0
- package/dist/cjs/components/TimePicker/Unit/Unit.cjs.map +1 -0
- package/dist/cjs/components/TimePicker/Unit/Unit.styles.cjs +56 -0
- package/dist/cjs/components/TimePicker/Unit/Unit.styles.cjs.map +1 -0
- package/dist/cjs/index.cjs +6 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/utils/classes.cjs +4 -3
- package/dist/cjs/utils/classes.cjs.map +1 -1
- package/dist/esm/components/ActionBar/ActionBar.js +11 -9
- package/dist/esm/components/ActionBar/ActionBar.js.map +1 -1
- package/dist/esm/components/ActionBar/ActionBar.styles.js +16 -15
- package/dist/esm/components/ActionBar/ActionBar.styles.js.map +1 -1
- package/dist/esm/components/TimePicker/Placeholder.js +70 -0
- package/dist/esm/components/TimePicker/Placeholder.js.map +1 -0
- package/dist/esm/components/TimePicker/TimePicker.js +223 -0
- package/dist/esm/components/TimePicker/TimePicker.js.map +1 -0
- package/dist/esm/components/TimePicker/TimePicker.styles.js +53 -0
- package/dist/esm/components/TimePicker/TimePicker.styles.js.map +1 -0
- package/dist/esm/components/TimePicker/Unit/Unit.js +72 -0
- package/dist/esm/components/TimePicker/Unit/Unit.js.map +1 -0
- package/dist/esm/components/TimePicker/Unit/Unit.styles.js +56 -0
- package/dist/esm/components/TimePicker/Unit/Unit.styles.js.map +1 -0
- package/dist/esm/index.js +238 -234
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/classes.js +4 -3
- package/dist/esm/utils/classes.js.map +1 -1
- package/dist/types/index.d.ts +134 -13
- package/package.json +5 -5
- package/dist/cjs/components/ActionBar/actionBarClasses.cjs +0 -8
- package/dist/cjs/components/ActionBar/actionBarClasses.cjs.map +0 -1
- package/dist/esm/components/ActionBar/actionBarClasses.js +0 -8
- package/dist/esm/components/ActionBar/actionBarClasses.js.map +0 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -41,7 +41,7 @@ const baseInputClasses = require("./components/BaseInput/baseInputClasses.cjs");
|
|
|
41
41
|
const BaseInput = require("./components/BaseInput/BaseInput.cjs");
|
|
42
42
|
const baseDropdownClasses = require("./components/BaseDropdown/baseDropdownClasses.cjs");
|
|
43
43
|
const BaseDropdown = require("./components/BaseDropdown/BaseDropdown.cjs");
|
|
44
|
-
const
|
|
44
|
+
const ActionBar_styles = require("./components/ActionBar/ActionBar.styles.cjs");
|
|
45
45
|
const ActionBar = require("./components/ActionBar/ActionBar.cjs");
|
|
46
46
|
const accordionClasses = require("./components/Accordion/accordionClasses.cjs");
|
|
47
47
|
const Accordion = require("./components/Accordion/Accordion.cjs");
|
|
@@ -253,6 +253,8 @@ const Carousel_styles = require("./components/Carousel/Carousel.styles.cjs");
|
|
|
253
253
|
const Carousel = require("./components/Carousel/Carousel.cjs");
|
|
254
254
|
const CarouselSlide_styles = require("./components/Carousel/CarouselSlide/CarouselSlide.styles.cjs");
|
|
255
255
|
const CarouselSlide = require("./components/Carousel/CarouselSlide/CarouselSlide.cjs");
|
|
256
|
+
const TimePicker_styles = require("./components/TimePicker/TimePicker.styles.cjs");
|
|
257
|
+
const TimePicker = require("./components/TimePicker/TimePicker.cjs");
|
|
256
258
|
const useUniqueId = require("./hooks/useUniqueId.cjs");
|
|
257
259
|
const useIsMounted = require("./hooks/useIsMounted.cjs");
|
|
258
260
|
const useClickOutside = require("./hooks/useClickOutside.cjs");
|
|
@@ -349,7 +351,7 @@ exports.baseInputClasses = baseInputClasses.default;
|
|
|
349
351
|
exports.HvBaseInput = BaseInput.HvBaseInput;
|
|
350
352
|
exports.baseDropdownClasses = baseDropdownClasses.default;
|
|
351
353
|
exports.HvBaseDropdown = BaseDropdown.HvBaseDropdown;
|
|
352
|
-
exports.actionBarClasses =
|
|
354
|
+
exports.actionBarClasses = ActionBar_styles.staticClasses;
|
|
353
355
|
exports.HvActionBar = ActionBar.HvActionBar;
|
|
354
356
|
exports.accordionClasses = accordionClasses.default;
|
|
355
357
|
exports.HvAccordion = Accordion.HvAccordion;
|
|
@@ -597,6 +599,8 @@ exports.carouselClasses = Carousel_styles.carouselClasses;
|
|
|
597
599
|
exports.HvCarousel = Carousel.HvCarousel;
|
|
598
600
|
exports.cc = CarouselSlide_styles.cc;
|
|
599
601
|
exports.HvCarouselSlide = CarouselSlide.HvCarouselSlide;
|
|
602
|
+
exports.timePickerClasses = TimePicker_styles.staticClasses;
|
|
603
|
+
exports.HvTimePicker = TimePicker.HvTimePicker;
|
|
600
604
|
exports.useUniqueId = useUniqueId.default;
|
|
601
605
|
exports.useIsMounted = useIsMounted.default;
|
|
602
606
|
exports.useClickOutside = useClickOutside.useClickOutside;
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -31,7 +31,7 @@ const replace$ = (stylesObj, name) => {
|
|
|
31
31
|
function createClasses(name, stylesObject) {
|
|
32
32
|
const styles = replace$(stylesObject, name);
|
|
33
33
|
const staticClasses = getClasses(Object.keys(styles), name);
|
|
34
|
-
function useClasses(classesProp) {
|
|
34
|
+
function useClasses(classesProp = {}) {
|
|
35
35
|
const {
|
|
36
36
|
cx,
|
|
37
37
|
css
|
|
@@ -39,8 +39,9 @@ function createClasses(name, stylesObject) {
|
|
|
39
39
|
const mergeClasses = (key) => cx(`${name}-${key}`, css(styles[key]), classesProp == null ? void 0 : classesProp[key]);
|
|
40
40
|
const classes = Object.fromEntries(Object.keys(styles).map((key) => [key, mergeClasses(key)]));
|
|
41
41
|
return {
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
classes,
|
|
43
|
+
css,
|
|
44
|
+
cx
|
|
44
45
|
};
|
|
45
46
|
}
|
|
46
47
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classes.cjs","sources":["../../../src/utils/classes.ts"],"sourcesContent":["import { CSSInterpolation } from \"@emotion/css\";\nimport { useCss } from \"@core/hooks/useCss\";\n\nexport type ExtractNames<\n T extends (...args: any) => { classes: Record<string, any>; cx: any }\n> = ReturnType<T>[\"classes\"];\n\nexport const getClasses = <T extends string, N extends string>(\n keys: T[],\n name: N\n) => {\n const classesObj: Record<string, string> = {};\n keys.forEach((key: string) => {\n classesObj[key] = `${name}-${key}`;\n });\n return classesObj as { [P in T]: `${N}-${P}` };\n};\n\nconst deepRenameKeys = <T extends object>(\n obj: T,\n mapFn: (key: string) => string\n): T => {\n const result: any = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const newKey = mapFn(key);\n const value = obj[key];\n result[newKey] =\n typeof value === \"object\" ? deepRenameKeys(value as any, mapFn) : value;\n }\n }\n return result;\n};\n\n/** Given a `stylesObj`, replaces its keys' `$myClass` with `.{name}-myClass`. */\nexport const replace$ = <T extends object>(stylesObj: T, name: string): T => {\n return deepRenameKeys(stylesObj, (key) => {\n const matches = key.match(/\\$\\w+/g);\n if (!matches?.length) return key;\n const newKey = matches.reduce(\n (acc, match) => acc.replace(match, `.${name}-${match.slice(1)}`),\n key\n );\n return newKey ?? key;\n });\n};\n\n/** Utility function to create classes for a component. */\nexport function createClasses<Name extends string, ClassName extends string>(\n /** Component name in PascalCase (ie. `HvTableCell`). */\n name: Name,\n stylesObject: Record<ClassName, CSSInterpolation>\n) {\n const styles = replace$(stylesObject, name);\n\n const staticClasses = getClasses(Object.keys(styles) as ClassName[], name);\n\n function useClasses(classesProp: Partial<Record<ClassName, string>>) {\n const { cx, css } = useCss();\n\n const mergeClasses = (key: string) =>\n cx(`${name}-${key}`, css(styles[key]), classesProp?.[key]);\n\n const classes = Object.fromEntries(\n Object.keys(styles).map((key) => [key, mergeClasses(key)])\n ) as { [P in ClassName]: string };\n\n return {
|
|
1
|
+
{"version":3,"file":"classes.cjs","sources":["../../../src/utils/classes.ts"],"sourcesContent":["import { CSSInterpolation } from \"@emotion/css\";\nimport { useCss } from \"@core/hooks/useCss\";\n\nexport type ExtractNames<\n T extends (...args: any) => { classes: Record<string, any>; cx: any }\n> = ReturnType<T>[\"classes\"];\n\nexport const getClasses = <T extends string, N extends string>(\n keys: T[],\n name: N\n) => {\n const classesObj: Record<string, string> = {};\n keys.forEach((key: string) => {\n classesObj[key] = `${name}-${key}`;\n });\n return classesObj as { [P in T]: `${N}-${P}` };\n};\n\nconst deepRenameKeys = <T extends object>(\n obj: T,\n mapFn: (key: string) => string\n): T => {\n const result: any = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const newKey = mapFn(key);\n const value = obj[key];\n result[newKey] =\n typeof value === \"object\" ? deepRenameKeys(value as any, mapFn) : value;\n }\n }\n return result;\n};\n\n/** Given a `stylesObj`, replaces its keys' `$myClass` with `.{name}-myClass`. */\nexport const replace$ = <T extends object>(stylesObj: T, name: string): T => {\n return deepRenameKeys(stylesObj, (key) => {\n const matches = key.match(/\\$\\w+/g);\n if (!matches?.length) return key;\n const newKey = matches.reduce(\n (acc, match) => acc.replace(match, `.${name}-${match.slice(1)}`),\n key\n );\n return newKey ?? key;\n });\n};\n\n/** Utility function to create classes for a component. */\nexport function createClasses<Name extends string, ClassName extends string>(\n /** Component name in PascalCase (ie. `HvTableCell`). */\n name: Name,\n stylesObject: Record<ClassName, CSSInterpolation>\n) {\n const styles = replace$(stylesObject, name);\n\n const staticClasses = getClasses(Object.keys(styles) as ClassName[], name);\n\n function useClasses(classesProp: Partial<Record<ClassName, string>> = {}) {\n const { cx, css } = useCss();\n\n const mergeClasses = (key: string) =>\n cx(`${name}-${key}`, css(styles[key]), classesProp?.[key]);\n\n const classes = Object.fromEntries(\n Object.keys(styles).map((key) => [key, mergeClasses(key)])\n ) as { [P in ClassName]: string };\n\n return { classes, css, cx };\n }\n\n return { useClasses, staticClasses };\n}\n"],"names":["getClasses","keys","name","classesObj","forEach","key","deepRenameKeys","obj","mapFn","result","Object","hasOwn","newKey","value","replace$","stylesObj","matches","match","length","reduce","acc","replace","slice","createClasses","stylesObject","styles","staticClasses","useClasses","classesProp","cx","css","useCss","mergeClasses","classes","fromEntries","map"],"mappings":";;;AAOaA,MAAAA,aAAa,CACxBC,MACAC,SACG;AACH,QAAMC,aAAqC,CAAA;AACtCC,OAAAA,QAAQ,CAACC,QAAgB;AACjBA,eAAAA,GAAG,IAAK,GAAEH,QAAQG;AAAAA,EAAAA,CAC9B;AACMF,SAAAA;AACT;AAEA,MAAMG,iBAAiB,CACrBC,KACAC,UACM;AACN,QAAMC,SAAc,CAAA;AACpB,aAAWJ,OAAOE,KAAK;AACrB,QAAIG,OAAOC,OAAOJ,KAAKF,GAAG,GAAG;AACrBO,YAAAA,SAASJ,MAAMH,GAAG;AAClBQ,YAAAA,QAAQN,IAAIF,GAAG;AACdO,aAAAA,MAAM,IACX,OAAOC,UAAU,WAAWP,eAAeO,OAAcL,KAAK,IAAIK;AAAAA,IACtE;AAAA,EACF;AACOJ,SAAAA;AACT;AAGaK,MAAAA,WAAW,CAAmBC,WAAcb,SAAoB;AACpEI,SAAAA,eAAeS,WAAYV,CAAQ,QAAA;AAClCW,UAAAA,UAAUX,IAAIY,MAAM,QAAQ;AAClC,QAAI,EAACD,mCAASE;AAAeb,aAAAA;AAC7B,UAAMO,SAASI,QAAQG,OACrB,CAACC,KAAKH,UAAUG,IAAIC,QAAQJ,OAAQ,IAAGf,QAAQe,MAAMK,MAAM,CAAC,GAAG,GAC/DjB,GACF;AACA,WAAOO,UAAUP;AAAAA,EAAAA,CAClB;AACH;AAGgBkB,SAAAA,cAEdrB,MACAsB,cACA;AACMC,QAAAA,SAASX,SAASU,cAActB,IAAI;AAE1C,QAAMwB,gBAAgB1B,WAAWU,OAAOT,KAAKwB,MAAM,GAAkBvB,IAAI;AAEhEyB,WAAAA,WAAWC,cAAkD,IAAI;AAClE,UAAA;AAAA,MAAEC;AAAAA,MAAIC;AAAAA,QAAQC,OAAO,OAAA;AAE3B,UAAMC,eAAeA,CAAC3B,QACpBwB,GAAI,GAAE3B,QAAQG,OAAOyB,IAAIL,OAAOpB,GAAG,CAAC,GAAGuB,2CAAcvB,IAAI;AAE3D,UAAM4B,UAAUvB,OAAOwB,YACrBxB,OAAOT,KAAKwB,MAAM,EAAEU,IAAK9B,CAAAA,QAAQ,CAACA,KAAK2B,aAAa3B,GAAG,CAAC,CAAC,CAC3D;AAEO,WAAA;AAAA,MAAE4B;AAAAA,MAASH;AAAAA,MAAKD;AAAAA,IAAAA;AAAAA,EACzB;AAEO,SAAA;AAAA,IAAEF;AAAAA,IAAYD;AAAAA,EAAAA;AACvB;;;;"}
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import actionBarClasses from "./actionBarClasses.js";
|
|
1
|
+
import { useClasses } from "./ActionBar.styles.js";
|
|
2
|
+
import { staticClasses } from "./ActionBar.styles.js";
|
|
4
3
|
import { jsx } from "@emotion/react/jsx-runtime";
|
|
5
4
|
const HvActionBar = (props) => {
|
|
6
5
|
const {
|
|
7
|
-
classes,
|
|
6
|
+
classes: classesProp,
|
|
8
7
|
className,
|
|
9
|
-
id,
|
|
10
8
|
children,
|
|
11
9
|
...others
|
|
12
10
|
} = props;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
const {
|
|
12
|
+
classes,
|
|
13
|
+
cx
|
|
14
|
+
} = useClasses(classesProp);
|
|
15
|
+
return /* @__PURE__ */ jsx("div", {
|
|
16
|
+
className: cx(classes.root, className),
|
|
16
17
|
...others,
|
|
17
18
|
children
|
|
18
19
|
});
|
|
19
20
|
};
|
|
20
21
|
export {
|
|
21
|
-
HvActionBar
|
|
22
|
+
HvActionBar,
|
|
23
|
+
staticClasses as actionBarClasses
|
|
22
24
|
};
|
|
23
25
|
//# sourceMappingURL=ActionBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionBar.js","sources":["../../../../src/components/ActionBar/ActionBar.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"ActionBar.js","sources":["../../../../src/components/ActionBar/ActionBar.tsx"],"sourcesContent":["import { HvBaseProps } from \"@core/types\";\nimport { ExtractNames } from \"@core/utils\";\nimport { staticClasses, useClasses } from \"./ActionBar.styles\";\n\nexport { staticClasses as actionBarClasses };\n\nexport type HvActionBarClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvActionBarProps extends HvBaseProps {\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: Partial<HvActionBarClasses>;\n}\n\nexport const HvActionBar = (props: HvActionBarProps) => {\n const { classes: classesProp, className, children, ...others } = props;\n const { classes, cx } = useClasses(classesProp);\n\n return (\n <div className={cx(classes.root, className)} {...others}>\n {children}\n </div>\n );\n};\n"],"names":["HvActionBar","props","classes","classesProp","className","children","others","cx","useClasses","root"],"mappings":";;;AAaaA,MAAAA,cAAcA,CAACC,UAA4B;AAChD,QAAA;AAAA,IAAEC,SAASC;AAAAA,IAAaC;AAAAA,IAAWC;AAAAA,IAAU,GAAGC;AAAAA,EAAWL,IAAAA;AAC3D,QAAA;AAAA,IAAEC;AAAAA,IAASK;AAAAA,EAAAA,IAAOC,WAAWL,WAAW;AAE9C,6BACE,OAAA;AAAA,IAAKC,WAAWG,GAAGL,QAAQO,MAAML,SAAS;AAAA,IAAE,GAAKE;AAAAA,IAAMD;AAAAA,EAAAA,CAElD;AAET;"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import _styled from "@emotion/styled/base";
|
|
2
1
|
import { theme } from "@hitachivantara/uikit-styles";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
2
|
+
import { createClasses } from "../../utils/classes.js";
|
|
3
|
+
const {
|
|
4
|
+
staticClasses,
|
|
5
|
+
useClasses
|
|
6
|
+
} = createClasses("HvActionBar", {
|
|
7
|
+
root: {
|
|
8
|
+
width: "100%",
|
|
9
|
+
padding: theme.space.sm,
|
|
10
|
+
borderTop: theme.actionBar.borderTop,
|
|
11
|
+
display: "flex",
|
|
12
|
+
alignItems: "center",
|
|
13
|
+
justifyContent: "flex-end"
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
16
|
export {
|
|
17
|
-
|
|
17
|
+
staticClasses,
|
|
18
|
+
useClasses
|
|
18
19
|
};
|
|
19
20
|
//# sourceMappingURL=ActionBar.styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionBar.styles.js","sources":["../../../../src/components/ActionBar/ActionBar.styles.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"ActionBar.styles.js","sources":["../../../../src/components/ActionBar/ActionBar.styles.tsx"],"sourcesContent":["import { createClasses } from \"@core/utils\";\nimport { theme } from \"@hitachivantara/uikit-styles\";\n\nexport const { staticClasses, useClasses } = createClasses(\"HvActionBar\", {\n root: {\n width: \"100%\",\n padding: theme.space.sm,\n borderTop: theme.actionBar.borderTop,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n },\n});\n"],"names":["staticClasses","useClasses","createClasses","root","width","padding","theme","space","sm","borderTop","actionBar","display","alignItems","justifyContent"],"mappings":";;AAGa,MAAA;AAAA,EAAEA;AAAAA,EAAeC;AAAW,IAAIC,cAAc,eAAe;AAAA,EACxEC,MAAM;AAAA,IACJC,OAAO;AAAA,IACPC,SAASC,MAAMC,MAAMC;AAAAA,IACrBC,WAAWH,MAAMI,UAAUD;AAAAA,IAC3BE,SAAS;AAAA,IACTC,YAAY;AAAA,IACZC,gBAAgB;AAAA,EAClB;AACF,CAAC;"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { forwardRef, useRef } from "react";
|
|
2
|
+
import { useDateSegment } from "@react-aria/datepicker";
|
|
3
|
+
import { jsx, Fragment, jsxs } from "@emotion/react/jsx-runtime";
|
|
4
|
+
const getDateValue = (date) => {
|
|
5
|
+
if (!date)
|
|
6
|
+
return "";
|
|
7
|
+
const {
|
|
8
|
+
hour,
|
|
9
|
+
minute,
|
|
10
|
+
second
|
|
11
|
+
} = date;
|
|
12
|
+
return [hour, minute, second].map((el) => String(el).padStart(2, "0")).join(":");
|
|
13
|
+
};
|
|
14
|
+
const PlaceholderSegment = ({
|
|
15
|
+
segment,
|
|
16
|
+
state,
|
|
17
|
+
placeholder
|
|
18
|
+
}) => {
|
|
19
|
+
const ref = useRef(null);
|
|
20
|
+
const {
|
|
21
|
+
segmentProps
|
|
22
|
+
} = useDateSegment(segment, state, ref);
|
|
23
|
+
return /* @__PURE__ */ jsx("div", {
|
|
24
|
+
ref,
|
|
25
|
+
...segmentProps,
|
|
26
|
+
children: (() => {
|
|
27
|
+
if (segment.type === "literal")
|
|
28
|
+
return segment.text;
|
|
29
|
+
if (segment.isPlaceholder)
|
|
30
|
+
return placeholder ?? segment.text;
|
|
31
|
+
return segment.text.padStart(2, "0");
|
|
32
|
+
})()
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
const Placeholder = forwardRef((props, ref) => {
|
|
36
|
+
const {
|
|
37
|
+
name,
|
|
38
|
+
state,
|
|
39
|
+
placeholders,
|
|
40
|
+
onKeyDown,
|
|
41
|
+
...others
|
|
42
|
+
} = props;
|
|
43
|
+
const {
|
|
44
|
+
value,
|
|
45
|
+
segments
|
|
46
|
+
} = state;
|
|
47
|
+
return /* @__PURE__ */ jsx(Fragment, {
|
|
48
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
49
|
+
ref,
|
|
50
|
+
onKeyDown: (event) => {
|
|
51
|
+
event.stopPropagation();
|
|
52
|
+
onKeyDown == null ? void 0 : onKeyDown(event);
|
|
53
|
+
},
|
|
54
|
+
...others,
|
|
55
|
+
children: [name && /* @__PURE__ */ jsx("input", {
|
|
56
|
+
type: "hidden",
|
|
57
|
+
name,
|
|
58
|
+
value: getDateValue(value)
|
|
59
|
+
}), segments.map((segment, i) => /* @__PURE__ */ jsx(PlaceholderSegment, {
|
|
60
|
+
segment,
|
|
61
|
+
state,
|
|
62
|
+
placeholder: placeholders[segment.type]
|
|
63
|
+
}, i))]
|
|
64
|
+
})
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
export {
|
|
68
|
+
Placeholder
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=Placeholder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Placeholder.js","sources":["../../../../src/components/TimePicker/Placeholder.tsx"],"sourcesContent":["import { forwardRef, useRef } from \"react\";\nimport { DateFieldState, DateSegment } from \"@react-stately/datepicker\";\nimport { useDateSegment } from \"@react-aria/datepicker\";\nimport { HvBaseProps } from \"@core/types\";\n\n/** Convert `Date` into `hh:mm:ss` format */\nconst getDateValue = (date) => {\n if (!date) return \"\";\n const { hour, minute, second } = date;\n\n return [hour, minute, second]\n .map((el) => String(el).padStart(2, \"0\"))\n .join(\":\");\n};\n\nconst PlaceholderSegment = ({\n segment,\n state,\n placeholder,\n}: {\n segment: DateSegment;\n state: DateFieldState;\n placeholder: string;\n}) => {\n const ref = useRef(null);\n const { segmentProps } = useDateSegment(segment, state, ref);\n\n return (\n <div ref={ref} {...segmentProps}>\n {(() => {\n if (segment.type === \"literal\") return segment.text;\n if (segment.isPlaceholder) return placeholder ?? segment.text;\n return segment.text.padStart(2, \"0\");\n })()}\n </div>\n );\n};\n\ninterface PlaceholderProps extends HvBaseProps<HTMLDivElement> {\n name?: string;\n state: DateFieldState;\n placeholders: { hour?: string; minute?: string; second?: string };\n}\n\nexport const Placeholder = forwardRef<HTMLDivElement, PlaceholderProps>(\n (props, ref) => {\n const { name, state, placeholders, onKeyDown, ...others } = props;\n const { value, segments } = state;\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n ref={ref}\n onKeyDown={(event) => {\n // stop ArrowDown from opening dropdown\n event.stopPropagation();\n onKeyDown?.(event);\n }}\n {...others}\n >\n {name && (\n <input type=\"hidden\" name={name} value={getDateValue(value)} />\n )}\n {segments.map((segment, i) => (\n <PlaceholderSegment\n key={i}\n segment={segment}\n state={state}\n placeholder={placeholders[segment.type]}\n />\n ))}\n </div>\n </>\n );\n }\n);\n"],"names":["getDateValue","date","hour","minute","second","map","el","String","padStart","join","PlaceholderSegment","segment","state","placeholder","ref","useRef","segmentProps","useDateSegment","children","type","text","isPlaceholder","Placeholder","forwardRef","props","name","placeholders","onKeyDown","others","value","segments","_Fragment","event","stopPropagation","_jsx","i"],"mappings":";;;AAMA,MAAMA,eAAgBC,CAAS,SAAA;AAC7B,MAAI,CAACA;AAAa,WAAA;AACZ,QAAA;AAAA,IAAEC;AAAAA,IAAMC;AAAAA,IAAQC;AAAAA,EAAWH,IAAAA;AAEjC,SAAO,CAACC,MAAMC,QAAQC,MAAM,EACzBC,IAAKC,CAAOC,OAAAA,OAAOD,EAAE,EAAEE,SAAS,GAAG,GAAG,CAAC,EACvCC,KAAK,GAAG;AACb;AAEA,MAAMC,qBAAqBA,CAAC;AAAA,EAC1BC;AAAAA,EACAC;AAAAA,EACAC;AAKF,MAAM;AACEC,QAAAA,MAAMC,OAAO,IAAI;AACjB,QAAA;AAAA,IAAEC;AAAAA,EAAiBC,IAAAA,eAAeN,SAASC,OAAOE,GAAG;AAE3D,6BACE,OAAA;AAAA,IAAKA;AAAAA,IAAS,GAAKE;AAAAA,IAAYE,WAC3B,MAAM;AACN,UAAIP,QAAQQ,SAAS;AAAW,eAAOR,QAAQS;AAC/C,UAAIT,QAAQU;AAAe,eAAOR,eAAeF,QAAQS;AACzD,aAAOT,QAAQS,KAAKZ,SAAS,GAAG,GAAG;AAAA,IAAA,GAClC;AAAA,EAAA,CACA;AAET;AAQO,MAAMc,cAAcC,WACzB,CAACC,OAAOV,QAAQ;AACR,QAAA;AAAA,IAAEW;AAAAA,IAAMb;AAAAA,IAAOc;AAAAA,IAAcC;AAAAA,IAAW,GAAGC;AAAAA,EAAWJ,IAAAA;AACtD,QAAA;AAAA,IAAEK;AAAAA,IAAOC;AAAAA,EAAalB,IAAAA;AAE5B,6BACEmB,UAAA;AAAA,IAAAb,+BAEE,OAAA;AAAA,MACEJ;AAAAA,MACAa,WAAYK,CAAU,UAAA;AAEpBA,cAAMC,gBAAgB;AACtBN,+CAAYK;AAAAA,MACd;AAAA,MAAE,GACEJ;AAAAA,MAAMV,UAAA,CAETO,QACCS,oBAAA,SAAA;AAAA,QAAOf,MAAK;AAAA,QAASM;AAAAA,QAAYI,OAAO7B,aAAa6B,KAAK;AAAA,MAAA,CAAI,GAE/DC,SAASzB,IAAI,CAACM,SAASwB,0BACrBzB,oBAAkB;AAAA,QAEjBC;AAAAA,QACAC;AAAAA,QACAC,aAAaa,aAAaf,QAAQQ,IAAI;AAAA,MAAA,GAHjCgB,CAIN,CACF,CAAC;AAAA,IAAA,CACC;AAAA,EAAA,CACL;AAEN,CACF;"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { useRef, useState, useMemo } from "react";
|
|
2
|
+
import { Time as Time$1 } from "@internationalized/date";
|
|
3
|
+
import { useTimeField } from "@react-aria/datepicker";
|
|
4
|
+
import { useTimeFieldState } from "@react-stately/datepicker";
|
|
5
|
+
import { Time } from "@hitachivantara/uikit-react-icons";
|
|
6
|
+
import { useCss } from "../../hooks/useCss.js";
|
|
7
|
+
import "@hitachivantara/uikit-styles";
|
|
8
|
+
import { Placeholder } from "./Placeholder.js";
|
|
9
|
+
import { useClasses } from "./TimePicker.styles.js";
|
|
10
|
+
import { staticClasses } from "./TimePicker.styles.js";
|
|
11
|
+
import { jsxs, jsx } from "@emotion/react/jsx-runtime";
|
|
12
|
+
import useUniqueId from "../../hooks/useUniqueId.js";
|
|
13
|
+
import { Unit } from "./Unit/Unit.js";
|
|
14
|
+
import { useControlled } from "../../hooks/useControlled.js";
|
|
15
|
+
import { setId } from "../../utils/setId.js";
|
|
16
|
+
import { HvFormElement } from "../Forms/FormElement/FormElement.js";
|
|
17
|
+
import { HvLabel } from "../Forms/Label/Label.js";
|
|
18
|
+
import { HvInfoMessage } from "../Forms/InfoMessage/InfoMessage.js";
|
|
19
|
+
import { HvBaseDropdown } from "../BaseDropdown/BaseDropdown.js";
|
|
20
|
+
import { HvWarningText } from "../Forms/WarningText/WarningText.js";
|
|
21
|
+
const toTime = (value) => {
|
|
22
|
+
if (!value)
|
|
23
|
+
return void 0;
|
|
24
|
+
const {
|
|
25
|
+
hours,
|
|
26
|
+
minutes,
|
|
27
|
+
seconds
|
|
28
|
+
} = value;
|
|
29
|
+
return new Time$1(hours, minutes, seconds);
|
|
30
|
+
};
|
|
31
|
+
const getFormat = (timeFormat) => {
|
|
32
|
+
if (timeFormat == null)
|
|
33
|
+
return 24;
|
|
34
|
+
return timeFormat === "12" ? 12 : 24;
|
|
35
|
+
};
|
|
36
|
+
const HvTimePicker = (props) => {
|
|
37
|
+
const {
|
|
38
|
+
classes: classesProp = {},
|
|
39
|
+
className,
|
|
40
|
+
id: idProp,
|
|
41
|
+
name,
|
|
42
|
+
required = false,
|
|
43
|
+
disabled = false,
|
|
44
|
+
readOnly = false,
|
|
45
|
+
label,
|
|
46
|
+
"aria-label": ariaLabel,
|
|
47
|
+
"aria-labelledby": ariaLabelledBy,
|
|
48
|
+
description,
|
|
49
|
+
"aria-describedby": ariaDescribedBy,
|
|
50
|
+
status,
|
|
51
|
+
statusMessage,
|
|
52
|
+
"aria-errormessage": ariaErrorMessage,
|
|
53
|
+
placeholder,
|
|
54
|
+
hoursPlaceholder = "hh",
|
|
55
|
+
minutesPlaceholder = "mm",
|
|
56
|
+
secondsPlaceholder = "ss",
|
|
57
|
+
value: valueProp,
|
|
58
|
+
defaultValue: defaultValueProp,
|
|
59
|
+
timeFormat,
|
|
60
|
+
showSeconds,
|
|
61
|
+
disableExpand,
|
|
62
|
+
locale = "en",
|
|
63
|
+
onToggle,
|
|
64
|
+
onChange,
|
|
65
|
+
// misc properties:
|
|
66
|
+
disablePortal = true,
|
|
67
|
+
escapeWithReference = true,
|
|
68
|
+
dropdownProps,
|
|
69
|
+
...others
|
|
70
|
+
} = props;
|
|
71
|
+
const id = useUniqueId(idProp, "hvtimepicker");
|
|
72
|
+
const ref = useRef(null);
|
|
73
|
+
const {
|
|
74
|
+
css
|
|
75
|
+
} = useCss();
|
|
76
|
+
const {
|
|
77
|
+
classes,
|
|
78
|
+
cx
|
|
79
|
+
} = useClasses(classesProp);
|
|
80
|
+
const stateProps = {
|
|
81
|
+
value: toTime(valueProp),
|
|
82
|
+
defaultValue: toTime(defaultValueProp),
|
|
83
|
+
label,
|
|
84
|
+
locale,
|
|
85
|
+
isRequired: required,
|
|
86
|
+
isReadOnly: readOnly,
|
|
87
|
+
isDisabled: disabled,
|
|
88
|
+
granularity: "second",
|
|
89
|
+
hourCycle: getFormat(timeFormat),
|
|
90
|
+
onChange: (value) => {
|
|
91
|
+
const {
|
|
92
|
+
hour: hours,
|
|
93
|
+
minute: minutes,
|
|
94
|
+
second: seconds
|
|
95
|
+
} = value;
|
|
96
|
+
onChange == null ? void 0 : onChange({
|
|
97
|
+
hours,
|
|
98
|
+
minutes,
|
|
99
|
+
seconds
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const state = useTimeFieldState(stateProps);
|
|
104
|
+
const {
|
|
105
|
+
labelProps,
|
|
106
|
+
fieldProps
|
|
107
|
+
} = useTimeField({
|
|
108
|
+
...stateProps,
|
|
109
|
+
id,
|
|
110
|
+
"aria-label": ariaLabel,
|
|
111
|
+
"aria-labelledby": ariaLabelledBy,
|
|
112
|
+
"aria-describedby": ariaDescribedBy
|
|
113
|
+
}, state, ref);
|
|
114
|
+
const [open, setOpen] = useState(false);
|
|
115
|
+
const [validationMessage] = useControlled(statusMessage, "Required");
|
|
116
|
+
const [validationState] = useControlled(status, "standBy");
|
|
117
|
+
const placeholders = useMemo(() => ({
|
|
118
|
+
hour: hoursPlaceholder,
|
|
119
|
+
minute: minutesPlaceholder,
|
|
120
|
+
second: secondsPlaceholder
|
|
121
|
+
}), [hoursPlaceholder, minutesPlaceholder, secondsPlaceholder]);
|
|
122
|
+
const canShowError = ariaErrorMessage == null && (status !== void 0 && statusMessage !== void 0 || status === void 0 && required);
|
|
123
|
+
const is12HrFormat = state.segments[5] != null;
|
|
124
|
+
const isStateInvalid = validationState === "invalid";
|
|
125
|
+
const errorMessageId = isStateInvalid ? canShowError ? setId(id, "error") : ariaErrorMessage : void 0;
|
|
126
|
+
return /* @__PURE__ */ jsxs(HvFormElement, {
|
|
127
|
+
name,
|
|
128
|
+
required,
|
|
129
|
+
disabled,
|
|
130
|
+
status: validationState,
|
|
131
|
+
className: cx(classes.root, className),
|
|
132
|
+
...others,
|
|
133
|
+
children: [(label || description) && /* @__PURE__ */ jsxs("div", {
|
|
134
|
+
className: classes.labelContainer,
|
|
135
|
+
children: [label && /* @__PURE__ */ jsx(HvLabel, {
|
|
136
|
+
label,
|
|
137
|
+
className: classes.label,
|
|
138
|
+
...labelProps
|
|
139
|
+
}), description && /* @__PURE__ */ jsx(HvInfoMessage, {
|
|
140
|
+
className: classes.description,
|
|
141
|
+
children: description
|
|
142
|
+
})]
|
|
143
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
144
|
+
className: css({
|
|
145
|
+
width: is12HrFormat ? 220 : 200
|
|
146
|
+
}),
|
|
147
|
+
children: /* @__PURE__ */ jsx(HvBaseDropdown, {
|
|
148
|
+
role: "combobox",
|
|
149
|
+
variableWidth: true,
|
|
150
|
+
disabled,
|
|
151
|
+
readOnly,
|
|
152
|
+
placeholder: placeholder && !state.value ? placeholder : /* @__PURE__ */ jsx(Placeholder, {
|
|
153
|
+
ref,
|
|
154
|
+
name,
|
|
155
|
+
state,
|
|
156
|
+
placeholders,
|
|
157
|
+
className: cx(classes.placeholder, {
|
|
158
|
+
[classes.placeholderDisabled]: disabled
|
|
159
|
+
}),
|
|
160
|
+
...fieldProps
|
|
161
|
+
}),
|
|
162
|
+
classes: {
|
|
163
|
+
header: cx(classes.dropdownHeader, {
|
|
164
|
+
[classes.dropdownHeaderInvalid]: isStateInvalid
|
|
165
|
+
}),
|
|
166
|
+
panel: classes.dropdownPanel,
|
|
167
|
+
headerOpen: classes.dropdownHeaderOpen
|
|
168
|
+
},
|
|
169
|
+
placement: "right",
|
|
170
|
+
adornment: /* @__PURE__ */ jsx(Time, {
|
|
171
|
+
color: disabled ? "secondary_60" : void 0,
|
|
172
|
+
className: classes.icon
|
|
173
|
+
}),
|
|
174
|
+
expanded: open,
|
|
175
|
+
onToggle: (evt, newOpen) => {
|
|
176
|
+
if (disableExpand)
|
|
177
|
+
return;
|
|
178
|
+
setOpen(newOpen);
|
|
179
|
+
onToggle == null ? void 0 : onToggle(evt, newOpen);
|
|
180
|
+
},
|
|
181
|
+
onContainerCreation: (containerRef) => {
|
|
182
|
+
var _a;
|
|
183
|
+
(_a = containerRef == null ? void 0 : containerRef.getElementsByTagName("input")[0]) == null ? void 0 : _a.focus();
|
|
184
|
+
},
|
|
185
|
+
"aria-haspopup": "dialog",
|
|
186
|
+
"aria-invalid": isStateInvalid ? true : void 0,
|
|
187
|
+
"aria-errormessage": errorMessageId,
|
|
188
|
+
disablePortal,
|
|
189
|
+
popperProps: {
|
|
190
|
+
modifiers: [{
|
|
191
|
+
name: "preventOverflow",
|
|
192
|
+
enabled: escapeWithReference
|
|
193
|
+
}]
|
|
194
|
+
},
|
|
195
|
+
...dropdownProps,
|
|
196
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
197
|
+
ref,
|
|
198
|
+
className: classes.timePopperContainer,
|
|
199
|
+
children: state.segments.map((segment, i) => /* @__PURE__ */ jsx(Unit, {
|
|
200
|
+
state,
|
|
201
|
+
segment,
|
|
202
|
+
placeholder: placeholders[segment.type],
|
|
203
|
+
onAdd: () => state.increment(segment.type),
|
|
204
|
+
onSub: () => state.decrement(segment.type),
|
|
205
|
+
onChange: (evt, val) => {
|
|
206
|
+
state.setSegment(segment.type, Number(val));
|
|
207
|
+
}
|
|
208
|
+
}, i))
|
|
209
|
+
})
|
|
210
|
+
})
|
|
211
|
+
}), canShowError && /* @__PURE__ */ jsx(HvWarningText, {
|
|
212
|
+
id: setId(id, "error"),
|
|
213
|
+
disableBorder: true,
|
|
214
|
+
className: classes.error,
|
|
215
|
+
children: validationMessage
|
|
216
|
+
})]
|
|
217
|
+
});
|
|
218
|
+
};
|
|
219
|
+
export {
|
|
220
|
+
HvTimePicker,
|
|
221
|
+
staticClasses as timePickerClasses
|
|
222
|
+
};
|
|
223
|
+
//# sourceMappingURL=TimePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.js","sources":["../../../../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["import { useState, useRef, useMemo } from \"react\";\nimport { Time } from \"@internationalized/date\";\nimport { useTimeField } from \"@react-aria/datepicker\";\nimport {\n TimeFieldStateOptions,\n useTimeFieldState,\n} from \"@react-stately/datepicker\";\n\nimport { Time as TimeIcon } from \"@hitachivantara/uikit-react-icons\";\nimport { useCss } from \"@core/hooks/useCss\";\nimport {\n HvFormElement,\n HvBaseDropdown,\n HvLabel,\n HvWarningText,\n HvInfoMessage,\n HvFormElementProps,\n HvBaseDropdownProps,\n useControlled,\n useUniqueId,\n setId,\n ExtractNames,\n} from \"../..\";\n\nimport { Unit } from \"./Unit\";\nimport { Placeholder } from \"./Placeholder\";\nimport { staticClasses, useClasses } from \"./TimePicker.styles\";\n\nconst toTime = (value?: HvTimePickerValue) => {\n if (!value) return undefined;\n const { hours, minutes, seconds } = value;\n return new Time(hours, minutes, seconds);\n};\n\nconst getFormat = (timeFormat?: TimeFormat) => {\n if (timeFormat == null) return 24;\n return timeFormat === \"12\" ? 12 : 24;\n};\n\nexport { staticClasses as timePickerClasses };\n\nexport type TimeFormat = \"12\" | \"24\";\n\nexport type HvTimePickerClasses = ExtractNames<typeof useClasses>;\n\nexport type HvTimePickerClassKey =\n | \"root\"\n | \"input\"\n | \"label\"\n | \"placeholder\"\n | \"timePopperContainer\"\n | \"separator\"\n | \"periodContainer\"\n | \"formElementRoot\"\n | \"dropdownPlaceholder\"\n | \"iconBaseRoot\"\n | \"error\"\n | \"labelContainer\"\n | \"description\"\n | \"dropdownHeaderInvalid\"\n | \"dropdownPlaceholderDisabled\"\n | \"dropdownHeaderOpen\";\n\nexport type HvTimePickerValue = {\n hours: number;\n minutes: number;\n seconds: number;\n};\n\nexport interface HvTimePickerProps\n extends Omit<\n HvFormElementProps,\n \"classes\" | \"value\" | \"defaultValue\" | \"onChange\" | \"onFocus\" | \"onBlur\"\n > {\n /** Id to be applied to the form element root node. */\n id?: string;\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: Partial<HvTimePickerClasses>;\n /** Current value of the element when _controlled_. Follows the 24-hour format. */\n value?: HvTimePickerValue;\n /** Initial value of the element when _uncontrolled_. Follows the 24-hour format. */\n defaultValue?: HvTimePickerValue;\n /** The placeholder value when no time is selected. */\n placeholder?: string;\n /** The placeholder of the hours input. */\n hoursPlaceholder?: string;\n /** The placeholder of the minutes input. */\n minutesPlaceholder?: string;\n /** The placeholder of the seconds input. */\n secondsPlaceholder?: string;\n /**\n * Whether the time picker should show the AM/PM 12-hour clock or the 24-hour one.\n * If undefined, the component will use a format according to the passed locale.\n */\n timeFormat?: TimeFormat;\n /** Whether to show the seconds when using the native time picker */\n showSeconds?: boolean;\n /** Locale that will provide the time format(12 or 24 hour format). It is \"overwritten\" by `showAmPm` */\n locale?: string;\n /** Whether the dropdown is expandable. */\n disableExpand?: boolean;\n\n /**\n * Callback function to be triggered when the input value is changed.\n * It is invoked with a `{hours, minutes, seconds}` object, always in the 24h format\n */\n onChange?: (value: HvTimePickerValue) => void;\n\n /** Callback called when dropdown changes the expanded state. */\n onToggle?: (event: Event, isOpen: boolean) => void;\n\n /** Disable the portal behavior. The children stay within it's parent DOM hierarchy. */\n disablePortal?: boolean;\n\n /** Sets if the calendar container should follow the date picker input out of the screen or stay visible. */\n escapeWithReference?: boolean;\n\n /** Extra properties to be passed to the TimePicker's dropdown. */\n dropdownProps?: Partial<HvBaseDropdownProps>;\n}\n\n/**\n * A Time Picker allows the user to choose a specific time or a time range.\n */\nexport const HvTimePicker = (props: HvTimePickerProps) => {\n const {\n classes: classesProp = {},\n className,\n\n id: idProp,\n name,\n required = false,\n disabled = false,\n readOnly = false,\n label,\n\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n description,\n \"aria-describedby\": ariaDescribedBy,\n status,\n statusMessage,\n \"aria-errormessage\": ariaErrorMessage,\n\n placeholder,\n hoursPlaceholder = \"hh\",\n minutesPlaceholder = \"mm\",\n secondsPlaceholder = \"ss\",\n\n value: valueProp,\n defaultValue: defaultValueProp,\n\n timeFormat,\n showSeconds,\n disableExpand,\n locale = \"en\",\n\n onToggle,\n onChange,\n\n // misc properties:\n disablePortal = true,\n escapeWithReference = true,\n dropdownProps,\n ...others\n } = props;\n const id = useUniqueId(idProp, \"hvtimepicker\");\n const ref = useRef<HTMLDivElement>(null);\n const { css } = useCss();\n const { classes, cx } = useClasses(classesProp);\n\n const stateProps: TimeFieldStateOptions = {\n value: toTime(valueProp),\n defaultValue: toTime(defaultValueProp),\n label,\n locale,\n isRequired: required,\n isReadOnly: readOnly,\n isDisabled: disabled,\n granularity: \"second\",\n hourCycle: getFormat(timeFormat),\n onChange: (value) => {\n const { hour: hours, minute: minutes, second: seconds } = value;\n onChange?.({ hours, minutes, seconds });\n },\n };\n const state = useTimeFieldState(stateProps);\n const { labelProps, fieldProps } = useTimeField(\n {\n ...stateProps,\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n },\n state,\n ref\n );\n\n const [open, setOpen] = useState(false);\n\n const [validationMessage] = useControlled(statusMessage, \"Required\");\n const [validationState] = useControlled(status, \"standBy\");\n\n const placeholders = useMemo(\n () => ({\n hour: hoursPlaceholder,\n minute: minutesPlaceholder,\n second: secondsPlaceholder,\n }),\n [hoursPlaceholder, minutesPlaceholder, secondsPlaceholder]\n );\n\n // the error message area will only be created if:\n // - an external element that provides an error message isn't identified via aria-errormessage AND\n // - both status and statusMessage properties are being controlled OR\n // - status is uncontrolled and required is true\n const canShowError =\n ariaErrorMessage == null &&\n ((status !== undefined && statusMessage !== undefined) ||\n (status === undefined && required));\n\n const is12HrFormat = state.segments[5] != null;\n const isStateInvalid = validationState === \"invalid\";\n const errorMessageId = isStateInvalid\n ? canShowError\n ? setId(id, \"error\")\n : ariaErrorMessage\n : undefined;\n\n return (\n <HvFormElement\n name={name}\n required={required}\n disabled={disabled}\n status={validationState}\n className={cx(classes.root, className)}\n {...others}\n >\n {(label || description) && (\n <div className={classes.labelContainer}>\n {label && (\n <HvLabel label={label} className={classes.label} {...labelProps} />\n )}\n {description && (\n <HvInfoMessage className={classes.description}>\n {description}\n </HvInfoMessage>\n )}\n </div>\n )}\n\n <div className={css({ width: is12HrFormat ? 220 : 200 })}>\n <HvBaseDropdown\n role=\"combobox\"\n variableWidth\n disabled={disabled}\n readOnly={readOnly}\n placeholder={\n placeholder && !state.value ? (\n placeholder\n ) : (\n <Placeholder\n ref={ref}\n name={name}\n state={state}\n placeholders={placeholders}\n className={cx(classes.placeholder, {\n [classes.placeholderDisabled]: disabled,\n })}\n {...fieldProps}\n />\n )\n }\n classes={{\n header: cx(classes.dropdownHeader, {\n [classes.dropdownHeaderInvalid]: isStateInvalid,\n }),\n panel: classes.dropdownPanel,\n headerOpen: classes.dropdownHeaderOpen,\n }}\n placement=\"right\"\n adornment={\n <TimeIcon\n color={disabled ? \"secondary_60\" : undefined}\n className={classes.icon}\n />\n }\n expanded={open}\n onToggle={(evt, newOpen) => {\n if (disableExpand) return;\n setOpen(newOpen);\n onToggle?.(evt, newOpen);\n }}\n onContainerCreation={(containerRef) => {\n containerRef?.getElementsByTagName(\"input\")[0]?.focus();\n }}\n aria-haspopup=\"dialog\"\n aria-invalid={isStateInvalid ? true : undefined}\n aria-errormessage={errorMessageId}\n disablePortal={disablePortal}\n popperProps={{\n modifiers: [\n { name: \"preventOverflow\", enabled: escapeWithReference },\n ],\n }}\n {...dropdownProps}\n >\n <div ref={ref} className={classes.timePopperContainer}>\n {state.segments.map((segment, i) => (\n <Unit\n key={i}\n state={state}\n segment={segment}\n placeholder={placeholders[segment.type]}\n onAdd={() => state.increment(segment.type)}\n onSub={() => state.decrement(segment.type)}\n onChange={(evt, val) => {\n state.setSegment(segment.type, Number(val));\n }}\n />\n ))}\n </div>\n </HvBaseDropdown>\n </div>\n\n {canShowError && (\n <HvWarningText\n id={setId(id, \"error\")}\n disableBorder\n className={classes.error}\n >\n {validationMessage}\n </HvWarningText>\n )}\n </HvFormElement>\n );\n};\n"],"names":["toTime","value","undefined","hours","minutes","seconds","Time","getFormat","timeFormat","HvTimePicker","props","classes","classesProp","className","id","idProp","name","required","disabled","readOnly","label","ariaLabel","ariaLabelledBy","description","ariaDescribedBy","status","statusMessage","ariaErrorMessage","placeholder","hoursPlaceholder","minutesPlaceholder","secondsPlaceholder","valueProp","defaultValue","defaultValueProp","showSeconds","disableExpand","locale","onToggle","onChange","disablePortal","escapeWithReference","dropdownProps","others","useUniqueId","ref","useRef","css","useCss","cx","useClasses","stateProps","isRequired","isReadOnly","isDisabled","granularity","hourCycle","hour","minute","second","state","useTimeFieldState","labelProps","fieldProps","useTimeField","open","setOpen","useState","validationMessage","useControlled","validationState","placeholders","useMemo","canShowError","is12HrFormat","segments","isStateInvalid","errorMessageId","setId","HvFormElement","root","children","labelContainer","_jsx","HvLabel","HvInfoMessage","width","HvBaseDropdown","role","variableWidth","Placeholder","placeholderDisabled","header","dropdownHeader","dropdownHeaderInvalid","panel","dropdownPanel","headerOpen","dropdownHeaderOpen","placement","adornment","TimeIcon","color","icon","expanded","evt","newOpen","onContainerCreation","containerRef","getElementsByTagName","focus","popperProps","modifiers","enabled","timePopperContainer","map","segment","i","Unit","type","onAdd","increment","onSub","decrement","val","setSegment","Number","HvWarningText","disableBorder","error"],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { theme } from "@hitachivantara/uikit-styles";
|
|
2
|
+
import { createClasses } from "../../utils/classes.js";
|
|
3
|
+
const {
|
|
4
|
+
useClasses,
|
|
5
|
+
staticClasses
|
|
6
|
+
} = createClasses("HvTimerPicker", {
|
|
7
|
+
root: {
|
|
8
|
+
position: "relative"
|
|
9
|
+
},
|
|
10
|
+
labelContainer: {
|
|
11
|
+
display: "flex",
|
|
12
|
+
alignItems: "flex-start"
|
|
13
|
+
},
|
|
14
|
+
label: {
|
|
15
|
+
marginBottom: 6,
|
|
16
|
+
display: "block"
|
|
17
|
+
},
|
|
18
|
+
description: {},
|
|
19
|
+
placeholder: {
|
|
20
|
+
display: "flex",
|
|
21
|
+
gap: 1
|
|
22
|
+
},
|
|
23
|
+
placeholderDisabled: {
|
|
24
|
+
color: theme.colors.secondary_60
|
|
25
|
+
},
|
|
26
|
+
dropdownHeader: {},
|
|
27
|
+
dropdownHeaderOpen: {},
|
|
28
|
+
dropdownHeaderInvalid: {
|
|
29
|
+
border: `1px solid ${theme.colors.negative}`,
|
|
30
|
+
"&:hover": {
|
|
31
|
+
border: `1px solid ${theme.colors.negative}`
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
dropdownPanel: {},
|
|
35
|
+
icon: {},
|
|
36
|
+
timePopperContainer: {
|
|
37
|
+
backgroundColor: theme.colors.atmo1,
|
|
38
|
+
zIndex: 10,
|
|
39
|
+
display: "flex",
|
|
40
|
+
flexDirection: "row",
|
|
41
|
+
justifyContent: "center",
|
|
42
|
+
alignItems: "center",
|
|
43
|
+
padding: theme.spacing(["xs", 0]),
|
|
44
|
+
userSelect: "none",
|
|
45
|
+
minWidth: "175px"
|
|
46
|
+
},
|
|
47
|
+
error: {}
|
|
48
|
+
});
|
|
49
|
+
export {
|
|
50
|
+
staticClasses,
|
|
51
|
+
useClasses
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=TimePicker.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.styles.js","sources":["../../../../src/components/TimePicker/TimePicker.styles.ts"],"sourcesContent":["import { theme } from \"@hitachivantara/uikit-styles\";\nimport { createClasses } from \"@core/utils\";\n\nexport const { useClasses, staticClasses } = createClasses(\"HvTimerPicker\", {\n root: {\n position: \"relative\",\n },\n\n labelContainer: {\n display: \"flex\",\n alignItems: \"flex-start\",\n },\n label: {\n marginBottom: 6,\n display: \"block\",\n },\n description: {},\n\n placeholder: {\n display: \"flex\",\n gap: 1,\n },\n placeholderDisabled: {\n color: theme.colors.secondary_60,\n },\n\n dropdownHeader: {},\n dropdownHeaderOpen: {},\n dropdownHeaderInvalid: {\n border: `1px solid ${theme.colors.negative}`,\n \"&:hover\": {\n border: `1px solid ${theme.colors.negative}`,\n },\n },\n dropdownPanel: {},\n\n icon: {},\n\n timePopperContainer: {\n backgroundColor: theme.colors.atmo1,\n zIndex: 10,\n display: \"flex\",\n flexDirection: \"row\",\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: theme.spacing([\"xs\", 0]),\n userSelect: \"none\",\n minWidth: \"175px\",\n },\n\n error: {},\n});\n"],"names":["useClasses","staticClasses","createClasses","root","position","labelContainer","display","alignItems","label","marginBottom","description","placeholder","gap","placeholderDisabled","color","theme","colors","secondary_60","dropdownHeader","dropdownHeaderOpen","dropdownHeaderInvalid","border","negative","dropdownPanel","icon","timePopperContainer","backgroundColor","atmo1","zIndex","flexDirection","justifyContent","padding","spacing","userSelect","minWidth","error"],"mappings":";;AAGa,MAAA;AAAA,EAAEA;AAAAA,EAAYC;AAAc,IAAIC,cAAc,iBAAiB;AAAA,EAC1EC,MAAM;AAAA,IACJC,UAAU;AAAA,EACZ;AAAA,EAEAC,gBAAgB;AAAA,IACdC,SAAS;AAAA,IACTC,YAAY;AAAA,EACd;AAAA,EACAC,OAAO;AAAA,IACLC,cAAc;AAAA,IACdH,SAAS;AAAA,EACX;AAAA,EACAI,aAAa,CAAC;AAAA,EAEdC,aAAa;AAAA,IACXL,SAAS;AAAA,IACTM,KAAK;AAAA,EACP;AAAA,EACAC,qBAAqB;AAAA,IACnBC,OAAOC,MAAMC,OAAOC;AAAAA,EACtB;AAAA,EAEAC,gBAAgB,CAAC;AAAA,EACjBC,oBAAoB,CAAC;AAAA,EACrBC,uBAAuB;AAAA,IACrBC,QAAS,aAAYN,MAAMC,OAAOM;AAAAA,IAClC,WAAW;AAAA,MACTD,QAAS,aAAYN,MAAMC,OAAOM;AAAAA,IACpC;AAAA,EACF;AAAA,EACAC,eAAe,CAAC;AAAA,EAEhBC,MAAM,CAAC;AAAA,EAEPC,qBAAqB;AAAA,IACnBC,iBAAiBX,MAAMC,OAAOW;AAAAA,IAC9BC,QAAQ;AAAA,IACRtB,SAAS;AAAA,IACTuB,eAAe;AAAA,IACfC,gBAAgB;AAAA,IAChBvB,YAAY;AAAA,IACZwB,SAAShB,MAAMiB,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,IAChCC,YAAY;AAAA,IACZC,UAAU;AAAA,EACZ;AAAA,EAEAC,OAAO,CAAC;AACV,CAAC;"}
|