@servicetitan/design-system 13.5.0 → 13.7.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/components/ActionMenu/ActionMenu.d.ts +7 -2
- package/dist/components/ActionMenu/ActionMenu.js +23 -3
- package/dist/components/ActionMenu/ActionMenu.js.map +1 -1
- package/dist/components/BackLink/BackLink.test.js +2 -2
- package/dist/components/BackLink/BackLink.test.js.map +1 -1
- package/dist/components/Button/Button.test.js +2 -2
- package/dist/components/Button/Button.test.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.js +3 -1
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/Link/Link.test.js +2 -2
- package/dist/components/Link/Link.test.js.map +1 -1
- package/dist/global/index.css +1 -1
- package/dist/global/version.css +1 -1
- package/dist/system-light.css +1 -1
- package/dist/system-light.min.css +1 -1
- package/dist/system.css +1 -1
- package/dist/system.min.css +1 -1
- package/package.json +8 -8
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import { FC } from 'react';
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
2
|
import { PopoverProps } from '../Popover';
|
|
3
3
|
import { ActionMenuGroup } from './ActionMenuGroup';
|
|
4
4
|
import { ActionMenuItem } from './ActionMenuItem';
|
|
5
5
|
/**
|
|
6
6
|
* ActionMenu properties
|
|
7
7
|
*/
|
|
8
|
-
export declare type ActionMenuProps = PopoverProps
|
|
8
|
+
export declare type ActionMenuProps = Omit<PopoverProps, 'trigger'> & {
|
|
9
|
+
trigger?: PopoverProps['trigger'] | ((params: {
|
|
10
|
+
toggle: (newValue?: boolean) => void;
|
|
11
|
+
isOpen: boolean;
|
|
12
|
+
}) => ReactNode);
|
|
13
|
+
};
|
|
9
14
|
export interface ActionMenu extends FC<ActionMenuProps> {
|
|
10
15
|
/** Subcomponents */
|
|
11
16
|
Group: typeof ActionMenuGroup;
|
|
@@ -9,15 +9,35 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
9
9
|
}
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
|
-
import React from 'react';
|
|
13
12
|
import classnames from 'classnames';
|
|
13
|
+
import React from 'react';
|
|
14
14
|
import { Popover } from '../Popover';
|
|
15
15
|
import { ActionMenuGroup } from './ActionMenuGroup';
|
|
16
16
|
import { ActionMenuItem } from './ActionMenuItem';
|
|
17
17
|
export const ActionMenu = (_a) => {
|
|
18
18
|
var { children, className, direction = 'br', padding = null, // Disable Popover's default padding
|
|
19
|
-
wrapperClassName, width = 's' } = _a, props = __rest(_a, ["children", "className", "direction", "padding", "wrapperClassName", "width"]);
|
|
20
|
-
|
|
19
|
+
wrapperClassName, width = 's', open: openProp, trigger: triggerProp, onClickOutside } = _a, props = __rest(_a, ["children", "className", "direction", "padding", "wrapperClassName", "width", "open", "trigger", "onClickOutside"]);
|
|
20
|
+
const isControlled = typeof openProp !== 'undefined';
|
|
21
|
+
const [internalOpen, setInternalOpen] = React.useState(false);
|
|
22
|
+
const open = isControlled ? openProp : internalOpen;
|
|
23
|
+
const handleOpenToggle = (newValue) => {
|
|
24
|
+
if (!isControlled) {
|
|
25
|
+
setInternalOpen(typeof newValue === 'boolean' ? newValue : (prev) => !prev);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const handleClickOutside = () => {
|
|
29
|
+
if (!isControlled) {
|
|
30
|
+
setInternalOpen(false);
|
|
31
|
+
}
|
|
32
|
+
onClickOutside === null || onClickOutside === void 0 ? void 0 : onClickOutside();
|
|
33
|
+
};
|
|
34
|
+
const trigger = typeof triggerProp === 'function'
|
|
35
|
+
? triggerProp({
|
|
36
|
+
isOpen: open,
|
|
37
|
+
toggle: handleOpenToggle,
|
|
38
|
+
})
|
|
39
|
+
: triggerProp;
|
|
40
|
+
return (React.createElement(Popover, Object.assign({ className: classnames(className, 'ActionMenu__OverlayWrapper'), wrapperClassName: classnames(wrapperClassName, 'ActionMenu__TriggerWrapper'), popoverContentClassName: "ActionMenu", direction: direction, padding: padding, portal: true, width: width, "data-anvil-component": "ActionMenu", trigger: trigger, open: open, onClickOutside: handleClickOutside }, props), children));
|
|
21
41
|
};
|
|
22
42
|
ActionMenu.Group = ActionMenuGroup;
|
|
23
43
|
ActionMenu.Item = ActionMenuItem;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionMenu.js","sourceRoot":"","sources":["../../../src/components/ActionMenu/ActionMenu.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ActionMenu.js","sourceRoot":"","sources":["../../../src/components/ActionMenu/ActionMenu.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAwB,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAgB,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAoBlD,MAAM,CAAC,MAAM,UAAU,GAAe,CAAC,EAWtC,EAAE,EAAE;QAXkC,EACtC,QAAQ,EACR,SAAS,EACT,SAAS,GAAG,IAAI,EAChB,OAAO,GAAG,IAAI,EAAE,oCAAoC;IACpD,gBAAgB,EAChB,KAAK,GAAG,GAAG,EACX,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,WAAW,EACpB,cAAc,OAEd,EADG,KAAK,cAV8B,mHAWtC,CADQ;IAER,MAAM,YAAY,GAAG,OAAO,QAAQ,KAAK,WAAW,CAAC;IACrD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;IAEpD,MAAM,gBAAgB,GAAG,CAAC,QAAkB,EAAE,EAAE;QAC/C,IAAI,CAAC,YAAY,EAAE;YAClB,eAAe,CACd,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAC1D,CAAC;SACF;IACF,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC/B,IAAI,CAAC,YAAY,EAAE;YAClB,eAAe,CAAC,KAAK,CAAC,CAAC;SACvB;QACD,cAAc,aAAd,cAAc,uBAAd,cAAc,EAAI,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,OAAO,GACZ,OAAO,WAAW,KAAK,UAAU;QAChC,CAAC,CAAC,WAAW,CAAC;YACZ,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,gBAAgB;SACvB,CAAC;QACJ,CAAC,CAAC,WAAW,CAAC;IAEhB,OAAO,CACN,oBAAC,OAAO,kBACP,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,4BAA4B,CAAC,EAC9D,gBAAgB,EAAE,UAAU,CAC3B,gBAAgB,EAChB,4BAA4B,CAC5B,EACD,uBAAuB,EAAC,YAAY,EACpC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,QACN,KAAK,EAAE,KAAK,0BACS,YAAY,EACjC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,kBAAkB,IAC9B,KAAK,GAER,QAAQ,CACA,CACV,CAAC;AACH,CAAC,CAAC;AAEF,UAAU,CAAC,KAAK,GAAG,eAAe,CAAC;AACnC,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC","sourcesContent":["import classnames from 'classnames';\nimport React, { FC, ReactNode } from 'react';\n\nimport { Popover, PopoverProps } from '../Popover';\nimport { ActionMenuGroup } from './ActionMenuGroup';\nimport { ActionMenuItem } from './ActionMenuItem';\n\n/**\n * ActionMenu properties\n */\nexport type ActionMenuProps = Omit<PopoverProps, 'trigger'> & {\n\ttrigger?:\n\t\t| PopoverProps['trigger']\n\t\t| ((params: {\n\t\t\t\ttoggle: (newValue?: boolean) => void;\n\t\t\t\tisOpen: boolean;\n\t\t }) => ReactNode);\n};\n\nexport interface ActionMenu extends FC<ActionMenuProps> {\n\t/** Subcomponents */\n\tGroup: typeof ActionMenuGroup;\n\tItem: typeof ActionMenuItem;\n}\n\nexport const ActionMenu: ActionMenu = ({\n\tchildren,\n\tclassName,\n\tdirection = 'br',\n\tpadding = null, // Disable Popover's default padding\n\twrapperClassName,\n\twidth = 's',\n\topen: openProp,\n\ttrigger: triggerProp,\n\tonClickOutside,\n\t...props\n}) => {\n\tconst isControlled = typeof openProp !== 'undefined';\n\tconst [internalOpen, setInternalOpen] = React.useState(false);\n\tconst open = isControlled ? openProp : internalOpen;\n\n\tconst handleOpenToggle = (newValue?: boolean) => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalOpen(\n\t\t\t\ttypeof newValue === 'boolean' ? newValue : (prev) => !prev\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleClickOutside = () => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalOpen(false);\n\t\t}\n\t\tonClickOutside?.();\n\t};\n\n\tconst trigger =\n\t\ttypeof triggerProp === 'function'\n\t\t\t? triggerProp({\n\t\t\t\t\tisOpen: open,\n\t\t\t\t\ttoggle: handleOpenToggle,\n\t\t\t })\n\t\t\t: triggerProp;\n\n\treturn (\n\t\t<Popover\n\t\t\tclassName={classnames(className, 'ActionMenu__OverlayWrapper')}\n\t\t\twrapperClassName={classnames(\n\t\t\t\twrapperClassName,\n\t\t\t\t'ActionMenu__TriggerWrapper'\n\t\t\t)}\n\t\t\tpopoverContentClassName=\"ActionMenu\"\n\t\t\tdirection={direction}\n\t\t\tpadding={padding}\n\t\t\tportal\n\t\t\twidth={width}\n\t\t\tdata-anvil-component=\"ActionMenu\"\n\t\t\ttrigger={trigger}\n\t\t\topen={open}\n\t\t\tonClickOutside={handleClickOutside}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</Popover>\n\t);\n};\n\nActionMenu.Group = ActionMenuGroup;\nActionMenu.Item = ActionMenuItem;\n"]}
|
|
@@ -4,7 +4,7 @@ import { BackLink } from './BackLink';
|
|
|
4
4
|
describe('BackLink', () => {
|
|
5
5
|
beforeEach(() => jest.spyOn(console, 'error'));
|
|
6
6
|
it('should be an anchor element if href attribute exists', () => {
|
|
7
|
-
const { getByRole } = render(React.createElement(BackLink, { href: "https://anvil.servicetitan.com" }, "Website"));
|
|
7
|
+
const { getByRole } = render(React.createElement(BackLink, { href: "https://v1.anvil.servicetitan.com" }, "Website"));
|
|
8
8
|
const link = getByRole('link');
|
|
9
9
|
expect(link).not.toHaveAttribute('type');
|
|
10
10
|
expect(link.tagName).toBe('A');
|
|
@@ -16,7 +16,7 @@ describe('BackLink', () => {
|
|
|
16
16
|
expect(link.tagName).toBe('BUTTON');
|
|
17
17
|
});
|
|
18
18
|
it('should pass through data automation attributes', () => {
|
|
19
|
-
const { container } = render(React.createElement(BackLink, { href: "https://anvil.servicetitan.com", "data-auto-sel": "automation-selector" }, "Website"));
|
|
19
|
+
const { container } = render(React.createElement(BackLink, { href: "https://v1.anvil.servicetitan.com", "data-auto-sel": "automation-selector" }, "Website"));
|
|
20
20
|
const element = container.querySelector('[data-auto-sel="automation-selector"]');
|
|
21
21
|
expect(element).not.toBeNull();
|
|
22
22
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackLink.test.js","sourceRoot":"","sources":["../../../src/components/BackLink/BackLink.test.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/C,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,QAAQ,IAAC,IAAI,EAAC,
|
|
1
|
+
{"version":3,"file":"BackLink.test.js","sourceRoot":"","sources":["../../../src/components/BackLink/BackLink.test.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/C,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,QAAQ,IAAC,IAAI,EAAC,mCAAmC,cAAmB,CACrE,CAAC;QAEF,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAE/B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,QAAQ,IAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,cAAoB,CAC/C,CAAC;QAEF,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEjC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,QAAQ,IACR,IAAI,EAAC,mCAAmC,mBAC1B,qBAAqB,cAGzB,CACX,CAAC;QAEF,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CACtC,uCAAuC,CACvC,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\nimport { BackLink } from './BackLink';\n\ndescribe('BackLink', () => {\n\tbeforeEach(() => jest.spyOn(console, 'error'));\n\n\tit('should be an anchor element if href attribute exists', () => {\n\t\tconst { getByRole } = render(\n\t\t\t<BackLink href=\"https://v1.anvil.servicetitan.com\">Website</BackLink>\n\t\t);\n\n\t\tconst link = getByRole('link');\n\n\t\texpect(link).not.toHaveAttribute('type');\n\t\texpect(link.tagName).toBe('A');\n\t});\n\n\tit('should be a button element if no href attribute exists', () => {\n\t\tconst { getByRole } = render(\n\t\t\t<BackLink onClick={() => {}}>Website</BackLink>\n\t\t);\n\n\t\tconst link = getByRole('button');\n\n\t\texpect(link).not.toHaveAttribute('type', 'button');\n\t\texpect(link.tagName).toBe('BUTTON');\n\t});\n\n\tit('should pass through data automation attributes', () => {\n\t\tconst { container } = render(\n\t\t\t<BackLink\n\t\t\t\thref=\"https://v1.anvil.servicetitan.com\"\n\t\t\t\tdata-auto-sel=\"automation-selector\"\n\t\t\t>\n\t\t\t\tWebsite\n\t\t\t</BackLink>\n\t\t);\n\n\t\tconst element = container.querySelector(\n\t\t\t'[data-auto-sel=\"automation-selector\"]'\n\t\t);\n\n\t\texpect(element).not.toBeNull();\n\t});\n});\n"]}
|
|
@@ -10,7 +10,7 @@ describe('Button', () => {
|
|
|
10
10
|
expect(button.tagName).toBe('BUTTON');
|
|
11
11
|
});
|
|
12
12
|
it('should be an anchor element if href attribute exists', () => {
|
|
13
|
-
const { getByRole } = render(React.createElement(Button, { href: "https://anvil.servicetitan.com" }, "Label"));
|
|
13
|
+
const { getByRole } = render(React.createElement(Button, { href: "https://v1.anvil.servicetitan.com" }, "Label"));
|
|
14
14
|
const button = getByRole('button');
|
|
15
15
|
expect(button).not.toHaveAttribute('type');
|
|
16
16
|
expect(button.tagName).toBe('A');
|
|
@@ -30,7 +30,7 @@ describe('Button', () => {
|
|
|
30
30
|
it('should throw error if attributes and props are mismatched', () => {
|
|
31
31
|
expect(() => {
|
|
32
32
|
console.error = jest.fn(); // Prevent actual console.error from showing up in command line
|
|
33
|
-
render(React.createElement(Button, { el: "span", href: "https://anvil.servicetitan.com" }, "Label"));
|
|
33
|
+
render(React.createElement(Button, { el: "span", href: "https://v1.anvil.servicetitan.com" }, "Label"));
|
|
34
34
|
}).toThrowError();
|
|
35
35
|
});
|
|
36
36
|
it('should pass through data automation attributes', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.test.js","sourceRoot":"","sources":["../../../src/components/Button/Button.test.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACvB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,MAAM,gBAAe,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEnC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,MAAM,IAAC,IAAI,EAAC,
|
|
1
|
+
{"version":3,"file":"Button.test.js","sourceRoot":"","sources":["../../../src/components/Button/Button.test.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACvB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,MAAM,gBAAe,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEnC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,MAAM,IAAC,IAAI,EAAC,mCAAmC,YAAe,CAC/D,CAAC;QAEF,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEnC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,MAAM,IAAC,EAAE,EAAC,MAAM,YAAe,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEnC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,GAAG,EAAE;YACX,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,+DAA+D;YAC1F,MAAM,CACL,oBAAC,MAAM,IAAC,EAAE,EAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,YAEtB,CACT,CAAC;QACH,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,GAAG,EAAE;YACX,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,+DAA+D;YAC1F,MAAM,CACL,oBAAC,MAAM,IAAC,EAAE,EAAC,MAAM,EAAC,IAAI,EAAC,mCAAmC,YAEjD,CACT,CAAC;QACH,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,MAAM,qBAAe,qBAAqB,YAAe,CAC1D,CAAC;QAEF,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CACtC,uCAAuC,CACvC,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\nimport { Button } from './Button';\n\ndescribe('Button', () => {\n\tbeforeEach(() => jest.spyOn(console, 'error'));\n\n\tit('should be a button element with type by default', () => {\n\t\tconst { getByRole } = render(<Button>Label</Button>);\n\n\t\tconst button = getByRole('button');\n\n\t\texpect(button).toHaveAttribute('type', 'button');\n\t\texpect(button.tagName).toBe('BUTTON');\n\t});\n\n\tit('should be an anchor element if href attribute exists', () => {\n\t\tconst { getByRole } = render(\n\t\t\t<Button href=\"https://v1.anvil.servicetitan.com\">Label</Button>\n\t\t);\n\n\t\tconst button = getByRole('button');\n\n\t\texpect(button).not.toHaveAttribute('type');\n\t\texpect(button.tagName).toBe('A');\n\t});\n\n\tit('should be a span element if el prop was set', () => {\n\t\tconst { getByRole } = render(<Button el=\"span\">Label</Button>);\n\n\t\tconst button = getByRole('button');\n\n\t\texpect(button).not.toHaveAttribute('type');\n\t\texpect(button.tagName).toBe('SPAN');\n\t});\n\n\tit('should throw error if attributes and props are mismatched', () => {\n\t\texpect(() => {\n\t\t\tconsole.error = jest.fn(); // Prevent actual console.error from showing up in command line\n\t\t\trender(\n\t\t\t\t<Button el=\"span\" type=\"button\">\n\t\t\t\t\tLabel\n\t\t\t\t</Button>\n\t\t\t);\n\t\t}).toThrowError();\n\t});\n\n\tit('should throw error if attributes and props are mismatched', () => {\n\t\texpect(() => {\n\t\t\tconsole.error = jest.fn(); // Prevent actual console.error from showing up in command line\n\t\t\trender(\n\t\t\t\t<Button el=\"span\" href=\"https://v1.anvil.servicetitan.com\">\n\t\t\t\t\tLabel\n\t\t\t\t</Button>\n\t\t\t);\n\t\t}).toThrowError();\n\t});\n\n\tit('should pass through data automation attributes', () => {\n\t\tconst { container } = render(\n\t\t\t<Button data-auto-sel=\"automation-selector\">Label</Button>\n\t\t);\n\n\t\tconst element = container.querySelector(\n\t\t\t'[data-auto-sel=\"automation-selector\"]'\n\t\t);\n\n\t\texpect(element).not.toBeNull();\n\t});\n});\n"]}
|
|
@@ -32,7 +32,9 @@ export const DatePicker = React.forwardRef((props, ref) => {
|
|
|
32
32
|
const calendarRef = useRef(null);
|
|
33
33
|
const inputRef = useRef(null);
|
|
34
34
|
// Effects
|
|
35
|
-
useEffect(() =>
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
open && openCalendar();
|
|
37
|
+
}, [open]); // eslint-disable-line
|
|
36
38
|
useEffect(() => {
|
|
37
39
|
const next = toDateObj({ date: value, tz });
|
|
38
40
|
if (date.isEqualDate(next))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAM,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EACN,QAAQ,EAGR,YAAY,GAEZ,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAgB,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,aAAa,EAAsB,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAEN,SAAS,EACT,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,WAAW,EACX,WAAW,GACX,MAAM,eAAe,CAAC;AAiGvB,MAAM,CAAC,MAAM,UAAU,GAAwB,KAAK,CAAC,UAAU,CAC9D,CAAC,KAAK,EAAE,GAAyB,EAAE,EAAE;IACpC,MAAM,EACL,QAAQ,EACR,QAAQ,EAAE,cAAc,EACxB,SAAS,GAAG,IAAI,EAChB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,OAAO,EACP,OAAO,EACP,SAAS,EACT,KAAK,EAAE,UAAU,EACjB,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,KAAK,EACL,oBAAoB,KAEjB,KAAK,EADL,IAAI,UACJ,KAAK,EAtBH,gPAsBL,CAAQ,CAAC;IACV,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,2BAA2B;IAClE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,2BAA2B;IAClE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,2BAA2B;IAE7F,QAAQ;IACR,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CACrC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAC9B,CAAC;IACF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7D,oBAAoB;IACpB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE9B,UAAU;IACV,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,sBAAsB;IACvE,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5C,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAAE,OAAO;QAEnC,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,cAAc,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB;IAE9D,WAAW;IACX,MAAM,YAAY,GAAG,GAAG,EAAE;QACzB,CAAC,YAAY,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC,YAAY,KAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAG,IAAI,CAAC,CAAA,CAAC;IACvC,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,GAAG,EAAE;QAC1B,YAAY,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,YAAY,KAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAG,KAAK,CAAC,CAAA,CAAC;IACvC,CAAC,CAAC;IACF,MAAM,cAAc,GAAG,GAAG,EAAE,CAC3B,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IAEjD,MAAM,aAAa,GAAG,CAAC,CAAsB,EAAE,EAAE;;QAChD,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAElB,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE;YACrB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,aAAa,EAAE,CAAC;YAChB,CAAC,OAAO,KAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,CAAC;SACtC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC1C,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,YAAY,EAAE,CAAC;YACf,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,0CAAE,KAAK,EAAE,CAAC;SAC9B;QAED,IAAI,YAAY,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG;YAAE,aAAa,EAAE,CAAC;IACvD,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,CAAC,CAAsB,EAAE,EAAE;;QACvD,IAAI,YAAY,GAAG,YAAY,CAAC,MAAA,CAAC,CAAC,MAAM,0CAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB;QAEvE,IAAI,CAAA,MAAA,MAAA,CAAC,CAAC,WAAW,0CAAE,MAAM,0CAAE,SAAS,MAAK,aAAa;YACrD,YAAY,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB;QAE5D,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,CAAC,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,+CAA+C;YACnF,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,cAAc,CAAC,IAAI,CAAC,CAAC;SACrB;QAED,aAAa,EAAE,CAAC;QAChB,CAAC,OAAO,KAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,CAAC,CAAC,uDAAuD;IAC/F,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,GAAqB,EAAE,IAAU,EAAE,EAAE;QAC9D,MAAM,IAAI,GAAG,SAAS,CAAC;YACtB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG;YACvC,EAAE;YACF,aAAa,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,cAAc,CAAC,IAAI,CAAC,CAAC;SACrB;IACF,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,GAAwB,EAAE,EAAE,CACnD,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAErC,MAAM,aAAa,GAAG,CAAC,GAAwB,EAAE,EAAE;;QAClD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC,CAAC,cAAc;QAC3D,IAAI,CAAC,GAAG,CAAC,OAAO;YACf,OAAO,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,eAAe;QACzE,OAAO,SAAS,CAAC,CAAC,CAAC,MAAA,GAAG,CAAC,KAAK,+CAAT,GAAG,CAAU,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa;IACjE,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,GAAqB,EAAE,IAAU,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG;YACvC,EAAE;YACF,aAAa,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa;SAClC,CAAC,CAAC;QAEH,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,sBAAsB;IACtB,MAAM,SAAS,GAAG,GAAG,EAAE;QACtB,IAAI,OAAO,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,CAAA,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC,CAAC,mBAAmB;QAChF,oCAAoC;QACpC,IAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO;YAAE,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,2BAA2B;QACtF,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAA,KAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa,CAAA;YAAE,OAAO,WAAW,CAAC,CAAC,4CAA4C;QAC3G,OAAO,CAAC,IAAI,CACX,iFAAiF,EACjF,IAAI,CACJ,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,cAAc,mBACnB,QAAQ;QACR,KAAK;QACL,QAAQ,EACR,OAAO,EAAE,KAAK,EACd,OAAO,EAAE,KAAK,EACd,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,WAAW;QACX,QAAQ;QACR,IAAI,EACJ,KAAK,EAAE,SAAS,EAAE,EAClB,KAAK,EAAE,UAAU,IACd,SAAS,CACZ,CAAC;IAEF,sEAAsE;IACtE,MAAM,UAAU,GAAG,CAAC,KAAwB,EAAE,EAAE;QAC/C,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,EAAE;YAChD,OAAO,oBAAC,YAAY,oBAAK,KAAK,IAAE,OAAO,UAAG,CAAC;SAC3C;QACD,OAAO,oBAAC,YAAY,oBAAK,KAAK,IAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpD,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG;QACrB,KAAK,EAAE,IAAI,CAAC,OAAO;YAClB,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,iBAAiB;YACnC,CAAC,CAAC,IAAI;QACP,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC/C,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC/C,QAAQ,EAAE,oBAAoB;QAC9B,GAAG,EAAE,WAAW;QAChB,IAAI,EAAE,UAAU;KAChB,CAAC;IAEF,MAAM,aAAa,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG;QAC/B,KAAK,EAAE,IAAI,CAAC,OAAO;YAClB,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,iBAAiB;YACnC,CAAC,CAAC,IAAI;QACP,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,YAAY;QAClB,KAAK;KACL,CAAC,CAAC;IAEH,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,CACjB,oBAAC,aAAa,oBACT,cAAc,IAClB,EAAE,EAAE,OAAO,EACX,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAC,mBAAmB,EAC7B,OAAO,EAAE,YAAY,EACrB,UAAU,EACT,oBAAC,IAAI,IACJ,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,cAAc,gBACZ,iBAAiB,GAC3B,EAEH,KAAK,gCACgB,YAAY,IAChC,CACF,CAAC;IAEF,MAAM,iBAAiB,GAAG,UAAU,CAAC,YAAY,EAAE;QAClD,sBAAsB,EAAE,QAAQ;QAChC,kBAAkB,EAAE,YAAY;QAChC,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,IAAI;KAC7B,CAAC,CAAC;IAEH,OAAO,CACN,oBAAC,OAAO,kBACP,MAAM,QACN,gBAAgB,EAAE,iBAAiB,EACnC,IAAI,EAAE,YAAY,EAClB,uBAAuB,EAAC,sBAAsB,EAC9C,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,IAAI,EACb,KAAK,EAAC,MAAM,EACZ,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,aAAa,EAC7B,OAAO,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,SAAS,EACnC,oBAAoB,EAAE,oBAAoB,IACtC,IAAI,GAEP,cAAc,CAAC,CAAC,CAAC,CACjB,oBAAC,cAAc,oBAAK,aAAa,EAAI,CACrC,CAAC,CAAC,CAAC,CACH,oBAAC,QAAQ,oBAAK,aAAa,EAAI,CAC/B,CACQ,CACV,CAAC;AACH,CAAC,CACD,CAAC","sourcesContent":["import React, { FC, useContext, useEffect, useRef } from 'react';\nimport classnames from 'classnames';\nimport {\n\tCalendar,\n\tCalendarProps,\n\tCalendarChangeEvent,\n\tCalendarCell,\n\tCalendarCellProps,\n} from '@progress/kendo-react-dateinputs';\nimport { Popover, PopoverProps } from '../Popover';\nimport { Icon } from '../Icon';\nimport { keys } from '../../utilities/keyCodes';\nimport { InputDateMask, InputDateMaskProps } from './InputDateMask';\nimport { InputPropsStrict } from '../Input';\nimport { TimezoneContext } from '../../utilities/TimezoneProvider';\nimport { FormFieldContext } from '../../components/FormField';\n\nimport {\n\tDateObj,\n\ttoDateObj,\n\ttoTimeZone,\n\tfromTimeZone,\n\ttoFormat,\n\tcompareObj,\n\tinvalidDate,\n\tisValidDate,\n} from './utils/utils';\nimport { PopperProps } from '../../internal';\n\nexport interface DatePickerPropsStrict\n\textends Pick<\n\t\tPopoverProps,\n\t\t'autoFlipVertically' | 'autoFlipHorizontally' | 'direction'\n\t> {\n\t/** Use custom component as a Calendar */\n\tcalendar?: React.ComponentType<CalendarProps>;\n\n\t/** Disabled state */\n\tdisabled?: InputDateMaskProps['disabled'];\n\n\t/** Error state */\n\terror?: InputDateMaskProps['error'];\n\n\t/** Character to use with partially complete dates. Default is '_' */\n\tmaskChar?: InputDateMaskProps['maskChar'];\n\n\t/** Object of InputDateMask props */\n\tmaskProps?: Omit<\n\t\tInputDateMaskProps,\n\t\t| 'onChange'\n\t\t| 'value'\n\t\t| 'minDate'\n\t\t| 'maxDate'\n\t\t| 'size'\n\t\t| 'maskChar'\n\t\t| 'placeholder'\n\t\t| 'error'\n\t>;\n\n\t/** Maximum date allowed */\n\tmaxDate?: InputDateMaskProps['maxDate'];\n\n\t/** Minimum date allowed */\n\tminDate?: InputDateMaskProps['minDate'];\n\n\t/** Input size */\n\tsize?: InputDateMaskProps['size'];\n\n\t/** Placeholder value */\n\tplaceholder?: InputDateMaskProps['placeholder'];\n\n\t/** Currently selected date */\n\tvalue?: Calendar['value'] | string;\n\n\t/** Opens calendar */\n\topen?: boolean;\n\n\t/** Returns ISO string instead of JS Date object */\n\tisoFormat?: boolean;\n\n\tinput?: {\n\t\t/** Called on every change of input text */\n\t\tonChange?: InputPropsStrict['onChange'];\n\n\t\t/** Called on blur of the input */\n\t\tonBlur?: (event: React.FocusEvent<HTMLElement>) => void;\n\t};\n\n\t/** Props to be passed to the portaled div */\n\tportalDataAttributes?: PopperProps['portalDataAttributes'];\n\n\t/** Called on DatePicker's blur event */\n\tonBlur?: (value: Date | string | undefined, data?: DateObj) => void;\n\n\t/** Called on every meaningful date change */\n\tonChange?: (value: Date | string | undefined, data?: DateObj) => void;\n\n\t/** Called on every open and close action */\n\tonOpenChange?: (open: boolean) => void;\n\n\t/** This will override default trigger component */\n\ttrigger?: (props: CustomTriggerProps) => React.ReactNode;\n}\n\ninterface CustomTriggerProps {\n\t/** Returns internal trigger value */\n\tvalue: DatePickerProps['value'] | any;\n\n\t/** Returns internal trigger prop */\n\tonClick?: () => void;\n\n\t/** Returns internal open state */\n\topen: DatePickerProps['open'];\n\n\t/** Returns interal error state */\n\terror: DatePickerProps['error'];\n}\n\nexport interface DatePickerProps extends DatePickerPropsStrict {\n\t/** Unstrict Props */\n\t[propName: string]: any;\n}\n\nexport const DatePicker: FC<DatePickerProps> = React.forwardRef(\n\t(props, ref: React.RefObject<any>) => {\n\t\tconst {\n\t\t\tdisabled,\n\t\t\tcalendar: CustomCalendar,\n\t\t\tdirection = 'br',\n\t\t\terror,\n\t\t\tmaskChar,\n\t\t\tmaskProps,\n\t\t\tmaxDate,\n\t\t\tminDate,\n\t\t\tisoFormat,\n\t\t\tinput: inputProps,\n\t\t\tonBlur,\n\t\t\tonChange,\n\t\t\tonOpenChange,\n\t\t\topen,\n\t\t\tplaceholder,\n\t\t\trequired,\n\t\t\tsize,\n\t\t\ttrigger,\n\t\t\tvalue,\n\t\t\tportalDataAttributes,\n\t\t\t...rest\n\t\t} = props;\n\t\tconst tz = useContext(TimezoneContext);\n\t\tconst minTZ = toTimeZone(minDate, tz); // In timezone (with shift)\n\t\tconst maxTZ = toTimeZone(maxDate, tz); // In timezone (with shift)\n\t\tconst todayTZ = toTimeZone(new Date(), tz, { startOfDay: true }); // In timezone (with shift)\n\n\t\t// State\n\t\tconst [date, setDate] = React.useState<DateObj>(\n\t\t\ttoDateObj({ date: value, tz })\n\t\t);\n\t\tconst [showCalendar, setShowCalendar] = React.useState(open);\n\n\t\t// Refs for focusing\n\t\tconst calendarRef = useRef(null);\n\t\tconst inputRef = useRef(null);\n\n\t\t// Effects\n\t\tuseEffect(() => open && openCalendar(), [open]); // eslint-disable-line\n\t\tuseEffect(() => {\n\t\t\tconst next = toDateObj({ date: value, tz });\n\n\t\t\tif (date.isEqualDate(next)) return;\n\n\t\t\tsetDate(next);\n\t\t\tonChangeReturn(next);\n\t\t}, [compareObj(value), isoFormat, tz]); // eslint-disable-line\n\n\t\t// Handlers\n\t\tconst openCalendar = () => {\n\t\t\t!showCalendar && setShowCalendar(true);\n\t\t\t!showCalendar && onOpenChange?.(true);\n\t\t};\n\t\tconst closeCalendar = () => {\n\t\t\tshowCalendar && setShowCalendar(false);\n\t\t\tshowCalendar && onOpenChange?.(false);\n\t\t};\n\t\tconst toggleCalendar = () =>\n\t\t\tshowCalendar ? closeCalendar() : openCalendar();\n\n\t\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\t\tconst { key } = e;\n\n\t\t\tif (key === keys.esc) {\n\t\t\t\te.preventDefault();\n\t\t\t\tcloseCalendar();\n\t\t\t\t!trigger && inputRef.current?.focus();\n\t\t\t}\n\n\t\t\tif ([keys.space, keys.down].includes(key)) {\n\t\t\t\te.preventDefault();\n\t\t\t\topenCalendar();\n\t\t\t\tcalendarRef?.current?.focus();\n\t\t\t}\n\n\t\t\tif (showCalendar && key === keys.tab) closeCalendar();\n\t\t};\n\n\t\tconst handleCalendarChange = (e: CalendarChangeEvent) => {\n\t\t\tlet calendarDate = fromTimeZone(e.target?.value, tz); // Local timezone\n\n\t\t\tif (e.nativeEvent?.target?.className === 'k-nav-today')\n\t\t\t\tcalendarDate = fromTimeZone(todayTZ, tz); // Local timezone\n\n\t\t\tconst next = toDateObj({ date: calendarDate, tz });\n\n\t\t\tif (!date.isEqual(next)) {\n\t\t\t\te.syntheticEvent.stopPropagation(); // Keeps focus on input after click on calendar\n\t\t\t\tsetDate(next);\n\t\t\t\tonChangeReturn(next);\n\t\t\t}\n\n\t\t\tcloseCalendar();\n\t\t\t!trigger && inputRef.current?.focus(); // Sets focus back on enter keypress on calendar's date\n\t\t};\n\n\t\tconst handleMaskChange = (val: Date | undefined, data?: any) => {\n\t\t\tconst next = toDateObj({\n\t\t\t\tdate: val ? fromTimeZone(val, tz) : val, // As mask val is already in tz, sending it back to local tz\n\t\t\t\ttz,\n\t\t\t\tinvalidReason: data?.invalidReason,\n\t\t\t});\n\n\t\t\tif (!date.isEqual(next)) {\n\t\t\t\tsetDate(next);\n\t\t\t\tonChangeReturn(next);\n\t\t\t}\n\t\t};\n\n\t\tconst onChangeReturn = (val: DateObj | undefined) =>\n\t\t\tonChange?.(getReturnDate(val), val);\n\n\t\tconst getReturnDate = (val: DateObj | undefined) => {\n\t\t\tif (!val || !val.dateTime) return undefined; // Empty input\n\t\t\tif (!val.isValid)\n\t\t\t\treturn isoFormat ? invalidDate.toString() : invalidDate; // Invalid Date\n\t\t\treturn isoFormat ? val.toISO?.() : val.toJSDate(); // Good value\n\t\t};\n\n\t\tconst handleMaskBlur = (val: Date | undefined, data?: any) => {\n\t\t\tconst current = toDateObj({\n\t\t\t\tdate: val ? fromTimeZone(val, tz) : val, // As mask val is already in tz, sending it back to local tz\n\t\t\t\ttz,\n\t\t\t\tinvalidReason: data?.invalidReason,\n\t\t\t});\n\n\t\t\tonBlur?.(getReturnDate(current), current);\n\t\t};\n\n\t\t// Internal components\n\t\tconst maskValue = () => {\n\t\t\tif (typeof date?.dateTime === 'undefined') return undefined; // No entry (empty)\n\t\t\t// Entry is valid and within min-max\n\t\t\tif (date?.isValid) return toTimeZone(date.toJSDate(), tz); // In timezone (with shift)\n\t\t\tif (!date?.isValid || date?.invalidReason) return invalidDate; // Entry is not full or out of min-max range\n\t\t\tconsole.warn(\n\t\t\t\t'@servicetitan/design-system: Something wrong with DatePicker, dateObj received:',\n\t\t\t\tdate\n\t\t\t);\n\t\t\treturn undefined;\n\t\t};\n\n\t\tconst inputMaskProps = {\n\t\t\tdisabled,\n\t\t\terror,\n\t\t\tmaskChar,\n\t\t\tmaxDate: maxTZ, // In timezone (with shift)\n\t\t\tminDate: minTZ, // In timezone (with shift)\n\t\t\tonBlur: handleMaskBlur,\n\t\t\tonChange: handleMaskChange,\n\t\t\tplaceholder,\n\t\t\trequired,\n\t\t\tsize,\n\t\t\tvalue: maskValue(),\n\t\t\tinput: inputProps,\n\t\t\t...maskProps,\n\t\t};\n\n\t\t// custom cell to override the today highlight to match timezone today\n\t\tconst customCell = (props: CalendarCellProps) => {\n\t\t\tif (toFormat(props.value) === toFormat(todayTZ)) {\n\t\t\t\treturn <CalendarCell {...props} isToday />;\n\t\t\t}\n\t\t\treturn <CalendarCell {...props} isToday={false} />;\n\t\t};\n\n\t\tconst calendarProps = {\n\t\t\tvalue: date.isValid\n\t\t\t\t? date.toJSDate() // Local timezone\n\t\t\t\t: null,\n\t\t\tmax: isValidDate(maxDate) ? maxDate : undefined, // Local timezone\n\t\t\tmin: isValidDate(minDate) ? minDate : undefined, // Local timezone\n\t\t\tonChange: handleCalendarChange,\n\t\t\tref: calendarRef,\n\t\t\tcell: customCell,\n\t\t};\n\n\t\tconst customTrigger = trigger?.({\n\t\t\tvalue: date.isValid\n\t\t\t\t? date.toJSDate() // Local timezone\n\t\t\t\t: null,\n\t\t\tonClick: toggleCalendar,\n\t\t\topen: showCalendar,\n\t\t\terror,\n\t\t});\n\n\t\tconst { labelFor: inputId } = React.useContext(FormFieldContext);\n\t\tconst inputMask = (\n\t\t\t<InputDateMask\n\t\t\t\t{...inputMaskProps}\n\t\t\t\tid={inputId}\n\t\t\t\tinputRef={inputRef}\n\t\t\t\tcalendarRef={calendarRef}\n\t\t\t\tclassName=\"DatePicker__input\"\n\t\t\t\tonClick={openCalendar}\n\t\t\t\tshortLabel={\n\t\t\t\t\t<Icon\n\t\t\t\t\t\tname=\"event\"\n\t\t\t\t\t\tclassName=\"DatePicker__icon\"\n\t\t\t\t\t\tonClick={toggleCalendar}\n\t\t\t\t\t\taria-label=\"toggle calendar\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\tfluid\n\t\t\t\tdata-anvil-component=\"DatePicker\"\n\t\t\t/>\n\t\t);\n\n\t\tconst DatePickerClasses = classnames('DatePicker', {\n\t\t\t'DatePicker--disabled': disabled,\n\t\t\t'DatePicker--open': showCalendar,\n\t\t\t[`DatePicker--${size}`]: size,\n\t\t});\n\n\t\treturn (\n\t\t\t<Popover\n\t\t\t\tportal\n\t\t\t\twrapperClassName={DatePickerClasses}\n\t\t\t\topen={showCalendar}\n\t\t\t\tpopoverContentClassName=\"DatePicker__calendar\"\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tdirection={direction}\n\t\t\t\tpadding={null}\n\t\t\t\twidth=\"auto\"\n\t\t\t\tref={ref}\n\t\t\t\tonClickOutside={closeCalendar}\n\t\t\t\ttrigger={customTrigger ?? inputMask}\n\t\t\t\tportalDataAttributes={portalDataAttributes}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{CustomCalendar ? (\n\t\t\t\t\t<CustomCalendar {...calendarProps} />\n\t\t\t\t) : (\n\t\t\t\t\t<Calendar {...calendarProps} />\n\t\t\t\t)}\n\t\t\t</Popover>\n\t\t);\n\t}\n);\n"]}
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { FC, useContext, useEffect, useRef } from 'react';\nimport classnames from 'classnames';\nimport {\n\tCalendar,\n\tCalendarProps,\n\tCalendarChangeEvent,\n\tCalendarCell,\n\tCalendarCellProps,\n} from '@progress/kendo-react-dateinputs';\nimport { Popover, PopoverProps } from '../Popover';\nimport { Icon } from '../Icon';\nimport { keys } from '../../utilities/keyCodes';\nimport { InputDateMask, InputDateMaskProps } from './InputDateMask';\nimport { InputPropsStrict } from '../Input';\nimport { TimezoneContext } from '../../utilities/TimezoneProvider';\nimport { FormFieldContext } from '../../components/FormField';\n\nimport {\n\tDateObj,\n\ttoDateObj,\n\ttoTimeZone,\n\tfromTimeZone,\n\ttoFormat,\n\tcompareObj,\n\tinvalidDate,\n\tisValidDate,\n} from './utils/utils';\nimport { PopperProps } from '../../internal';\n\nexport interface DatePickerPropsStrict\n\textends Pick<\n\t\tPopoverProps,\n\t\t'autoFlipVertically' | 'autoFlipHorizontally' | 'direction'\n\t> {\n\t/** Use custom component as a Calendar */\n\tcalendar?: React.ComponentType<CalendarProps>;\n\n\t/** Disabled state */\n\tdisabled?: InputDateMaskProps['disabled'];\n\n\t/** Error state */\n\terror?: InputDateMaskProps['error'];\n\n\t/** Character to use with partially complete dates. Default is '_' */\n\tmaskChar?: InputDateMaskProps['maskChar'];\n\n\t/** Object of InputDateMask props */\n\tmaskProps?: Omit<\n\t\tInputDateMaskProps,\n\t\t| 'onChange'\n\t\t| 'value'\n\t\t| 'minDate'\n\t\t| 'maxDate'\n\t\t| 'size'\n\t\t| 'maskChar'\n\t\t| 'placeholder'\n\t\t| 'error'\n\t>;\n\n\t/** Maximum date allowed */\n\tmaxDate?: InputDateMaskProps['maxDate'];\n\n\t/** Minimum date allowed */\n\tminDate?: InputDateMaskProps['minDate'];\n\n\t/** Input size */\n\tsize?: InputDateMaskProps['size'];\n\n\t/** Placeholder value */\n\tplaceholder?: InputDateMaskProps['placeholder'];\n\n\t/** Currently selected date */\n\tvalue?: Calendar['value'] | string;\n\n\t/** Opens calendar */\n\topen?: boolean;\n\n\t/** Returns ISO string instead of JS Date object */\n\tisoFormat?: boolean;\n\n\tinput?: {\n\t\t/** Called on every change of input text */\n\t\tonChange?: InputPropsStrict['onChange'];\n\n\t\t/** Called on blur of the input */\n\t\tonBlur?: (event: React.FocusEvent<HTMLElement>) => void;\n\t};\n\n\t/** Props to be passed to the portaled div */\n\tportalDataAttributes?: PopperProps['portalDataAttributes'];\n\n\t/** Called on DatePicker's blur event */\n\tonBlur?: (value: Date | string | undefined, data?: DateObj) => void;\n\n\t/** Called on every meaningful date change */\n\tonChange?: (value: Date | string | undefined, data?: DateObj) => void;\n\n\t/** Called on every open and close action */\n\tonOpenChange?: (open: boolean) => void;\n\n\t/** This will override default trigger component */\n\ttrigger?: (props: CustomTriggerProps) => React.ReactNode;\n}\n\ninterface CustomTriggerProps {\n\t/** Returns internal trigger value */\n\tvalue: DatePickerProps['value'] | any;\n\n\t/** Returns internal trigger prop */\n\tonClick?: () => void;\n\n\t/** Returns internal open state */\n\topen: DatePickerProps['open'];\n\n\t/** Returns interal error state */\n\terror: DatePickerProps['error'];\n}\n\nexport interface DatePickerProps extends DatePickerPropsStrict {\n\t/** Unstrict Props */\n\t[propName: string]: any;\n}\n\nexport const DatePicker: FC<DatePickerProps> = React.forwardRef(\n\t(props, ref: React.RefObject<any>) => {\n\t\tconst {\n\t\t\tdisabled,\n\t\t\tcalendar: CustomCalendar,\n\t\t\tdirection = 'br',\n\t\t\terror,\n\t\t\tmaskChar,\n\t\t\tmaskProps,\n\t\t\tmaxDate,\n\t\t\tminDate,\n\t\t\tisoFormat,\n\t\t\tinput: inputProps,\n\t\t\tonBlur,\n\t\t\tonChange,\n\t\t\tonOpenChange,\n\t\t\topen,\n\t\t\tplaceholder,\n\t\t\trequired,\n\t\t\tsize,\n\t\t\ttrigger,\n\t\t\tvalue,\n\t\t\tportalDataAttributes,\n\t\t\t...rest\n\t\t} = props;\n\t\tconst tz = useContext(TimezoneContext);\n\t\tconst minTZ = toTimeZone(minDate, tz); // In timezone (with shift)\n\t\tconst maxTZ = toTimeZone(maxDate, tz); // In timezone (with shift)\n\t\tconst todayTZ = toTimeZone(new Date(), tz, { startOfDay: true }); // In timezone (with shift)\n\n\t\t// State\n\t\tconst [date, setDate] = React.useState<DateObj>(\n\t\t\ttoDateObj({ date: value, tz })\n\t\t);\n\t\tconst [showCalendar, setShowCalendar] = React.useState(open);\n\n\t\t// Refs for focusing\n\t\tconst calendarRef = useRef(null);\n\t\tconst inputRef = useRef(null);\n\n\t\t// Effects\n\t\tuseEffect(() => {\n\t\t\topen && openCalendar();\n\t\t}, [open]); // eslint-disable-line\n\n\t\tuseEffect(() => {\n\t\t\tconst next = toDateObj({ date: value, tz });\n\n\t\t\tif (date.isEqualDate(next)) return;\n\n\t\t\tsetDate(next);\n\t\t\tonChangeReturn(next);\n\t\t}, [compareObj(value), isoFormat, tz]); // eslint-disable-line\n\n\t\t// Handlers\n\t\tconst openCalendar = () => {\n\t\t\t!showCalendar && setShowCalendar(true);\n\t\t\t!showCalendar && onOpenChange?.(true);\n\t\t};\n\t\tconst closeCalendar = () => {\n\t\t\tshowCalendar && setShowCalendar(false);\n\t\t\tshowCalendar && onOpenChange?.(false);\n\t\t};\n\t\tconst toggleCalendar = () =>\n\t\t\tshowCalendar ? closeCalendar() : openCalendar();\n\n\t\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\t\tconst { key } = e;\n\n\t\t\tif (key === keys.esc) {\n\t\t\t\te.preventDefault();\n\t\t\t\tcloseCalendar();\n\t\t\t\t!trigger && inputRef.current?.focus();\n\t\t\t}\n\n\t\t\tif ([keys.space, keys.down].includes(key)) {\n\t\t\t\te.preventDefault();\n\t\t\t\topenCalendar();\n\t\t\t\tcalendarRef?.current?.focus();\n\t\t\t}\n\n\t\t\tif (showCalendar && key === keys.tab) closeCalendar();\n\t\t};\n\n\t\tconst handleCalendarChange = (e: CalendarChangeEvent) => {\n\t\t\tlet calendarDate = fromTimeZone(e.target?.value, tz); // Local timezone\n\n\t\t\tif (e.nativeEvent?.target?.className === 'k-nav-today')\n\t\t\t\tcalendarDate = fromTimeZone(todayTZ, tz); // Local timezone\n\n\t\t\tconst next = toDateObj({ date: calendarDate, tz });\n\n\t\t\tif (!date.isEqual(next)) {\n\t\t\t\te.syntheticEvent.stopPropagation(); // Keeps focus on input after click on calendar\n\t\t\t\tsetDate(next);\n\t\t\t\tonChangeReturn(next);\n\t\t\t}\n\n\t\t\tcloseCalendar();\n\t\t\t!trigger && inputRef.current?.focus(); // Sets focus back on enter keypress on calendar's date\n\t\t};\n\n\t\tconst handleMaskChange = (val: Date | undefined, data?: any) => {\n\t\t\tconst next = toDateObj({\n\t\t\t\tdate: val ? fromTimeZone(val, tz) : val, // As mask val is already in tz, sending it back to local tz\n\t\t\t\ttz,\n\t\t\t\tinvalidReason: data?.invalidReason,\n\t\t\t});\n\n\t\t\tif (!date.isEqual(next)) {\n\t\t\t\tsetDate(next);\n\t\t\t\tonChangeReturn(next);\n\t\t\t}\n\t\t};\n\n\t\tconst onChangeReturn = (val: DateObj | undefined) =>\n\t\t\tonChange?.(getReturnDate(val), val);\n\n\t\tconst getReturnDate = (val: DateObj | undefined) => {\n\t\t\tif (!val || !val.dateTime) return undefined; // Empty input\n\t\t\tif (!val.isValid)\n\t\t\t\treturn isoFormat ? invalidDate.toString() : invalidDate; // Invalid Date\n\t\t\treturn isoFormat ? val.toISO?.() : val.toJSDate(); // Good value\n\t\t};\n\n\t\tconst handleMaskBlur = (val: Date | undefined, data?: any) => {\n\t\t\tconst current = toDateObj({\n\t\t\t\tdate: val ? fromTimeZone(val, tz) : val, // As mask val is already in tz, sending it back to local tz\n\t\t\t\ttz,\n\t\t\t\tinvalidReason: data?.invalidReason,\n\t\t\t});\n\n\t\t\tonBlur?.(getReturnDate(current), current);\n\t\t};\n\n\t\t// Internal components\n\t\tconst maskValue = () => {\n\t\t\tif (typeof date?.dateTime === 'undefined') return undefined; // No entry (empty)\n\t\t\t// Entry is valid and within min-max\n\t\t\tif (date?.isValid) return toTimeZone(date.toJSDate(), tz); // In timezone (with shift)\n\t\t\tif (!date?.isValid || date?.invalidReason) return invalidDate; // Entry is not full or out of min-max range\n\t\t\tconsole.warn(\n\t\t\t\t'@servicetitan/design-system: Something wrong with DatePicker, dateObj received:',\n\t\t\t\tdate\n\t\t\t);\n\t\t\treturn undefined;\n\t\t};\n\n\t\tconst inputMaskProps = {\n\t\t\tdisabled,\n\t\t\terror,\n\t\t\tmaskChar,\n\t\t\tmaxDate: maxTZ, // In timezone (with shift)\n\t\t\tminDate: minTZ, // In timezone (with shift)\n\t\t\tonBlur: handleMaskBlur,\n\t\t\tonChange: handleMaskChange,\n\t\t\tplaceholder,\n\t\t\trequired,\n\t\t\tsize,\n\t\t\tvalue: maskValue(),\n\t\t\tinput: inputProps,\n\t\t\t...maskProps,\n\t\t};\n\n\t\t// custom cell to override the today highlight to match timezone today\n\t\tconst customCell = (props: CalendarCellProps) => {\n\t\t\tif (toFormat(props.value) === toFormat(todayTZ)) {\n\t\t\t\treturn <CalendarCell {...props} isToday />;\n\t\t\t}\n\t\t\treturn <CalendarCell {...props} isToday={false} />;\n\t\t};\n\n\t\tconst calendarProps = {\n\t\t\tvalue: date.isValid\n\t\t\t\t? date.toJSDate() // Local timezone\n\t\t\t\t: null,\n\t\t\tmax: isValidDate(maxDate) ? maxDate : undefined, // Local timezone\n\t\t\tmin: isValidDate(minDate) ? minDate : undefined, // Local timezone\n\t\t\tonChange: handleCalendarChange,\n\t\t\tref: calendarRef,\n\t\t\tcell: customCell,\n\t\t};\n\n\t\tconst customTrigger = trigger?.({\n\t\t\tvalue: date.isValid\n\t\t\t\t? date.toJSDate() // Local timezone\n\t\t\t\t: null,\n\t\t\tonClick: toggleCalendar,\n\t\t\topen: showCalendar,\n\t\t\terror,\n\t\t});\n\n\t\tconst { labelFor: inputId } = React.useContext(FormFieldContext);\n\t\tconst inputMask = (\n\t\t\t<InputDateMask\n\t\t\t\t{...inputMaskProps}\n\t\t\t\tid={inputId}\n\t\t\t\tinputRef={inputRef}\n\t\t\t\tcalendarRef={calendarRef}\n\t\t\t\tclassName=\"DatePicker__input\"\n\t\t\t\tonClick={openCalendar}\n\t\t\t\tshortLabel={\n\t\t\t\t\t<Icon\n\t\t\t\t\t\tname=\"event\"\n\t\t\t\t\t\tclassName=\"DatePicker__icon\"\n\t\t\t\t\t\tonClick={toggleCalendar}\n\t\t\t\t\t\taria-label=\"toggle calendar\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\tfluid\n\t\t\t\tdata-anvil-component=\"DatePicker\"\n\t\t\t/>\n\t\t);\n\n\t\tconst DatePickerClasses = classnames('DatePicker', {\n\t\t\t'DatePicker--disabled': disabled,\n\t\t\t'DatePicker--open': showCalendar,\n\t\t\t[`DatePicker--${size}`]: size,\n\t\t});\n\n\t\treturn (\n\t\t\t<Popover\n\t\t\t\tportal\n\t\t\t\twrapperClassName={DatePickerClasses}\n\t\t\t\topen={showCalendar}\n\t\t\t\tpopoverContentClassName=\"DatePicker__calendar\"\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tdirection={direction}\n\t\t\t\tpadding={null}\n\t\t\t\twidth=\"auto\"\n\t\t\t\tref={ref}\n\t\t\t\tonClickOutside={closeCalendar}\n\t\t\t\ttrigger={customTrigger ?? inputMask}\n\t\t\t\tportalDataAttributes={portalDataAttributes}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{CustomCalendar ? (\n\t\t\t\t\t<CustomCalendar {...calendarProps} />\n\t\t\t\t) : (\n\t\t\t\t\t<Calendar {...calendarProps} />\n\t\t\t\t)}\n\t\t\t</Popover>\n\t\t);\n\t}\n);\n"]}
|
|
@@ -4,7 +4,7 @@ import { Link } from './Link';
|
|
|
4
4
|
describe('Link', () => {
|
|
5
5
|
beforeEach(() => jest.spyOn(console, 'error'));
|
|
6
6
|
it('should be an anchor element if href attribute exists', () => {
|
|
7
|
-
const { getByRole } = render(React.createElement(Link, { href: "https://anvil.servicetitan.com" }, "Website"));
|
|
7
|
+
const { getByRole } = render(React.createElement(Link, { href: "https://v1.anvil.servicetitan.com" }, "Website"));
|
|
8
8
|
const link = getByRole('link');
|
|
9
9
|
expect(link).not.toHaveAttribute('type');
|
|
10
10
|
expect(link.tagName).toBe('A');
|
|
@@ -16,7 +16,7 @@ describe('Link', () => {
|
|
|
16
16
|
expect(link.tagName).toBe('BUTTON');
|
|
17
17
|
});
|
|
18
18
|
it('should pass through data automation attributes', () => {
|
|
19
|
-
const { container } = render(React.createElement(Link, { href: "https://anvil.servicetitan.com", "data-auto-sel": "automation-selector" }, "Website"));
|
|
19
|
+
const { container } = render(React.createElement(Link, { href: "https://v1.anvil.servicetitan.com", "data-auto-sel": "automation-selector" }, "Website"));
|
|
20
20
|
const element = container.querySelector('[data-auto-sel="automation-selector"]');
|
|
21
21
|
expect(element).not.toBeNull();
|
|
22
22
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Link.test.js","sourceRoot":"","sources":["../../../src/components/Link/Link.test.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACrB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/C,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,IAAI,IAAC,IAAI,EAAC,
|
|
1
|
+
{"version":3,"file":"Link.test.js","sourceRoot":"","sources":["../../../src/components/Link/Link.test.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACrB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/C,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,IAAI,IAAC,IAAI,EAAC,mCAAmC,cAAe,CAC7D,CAAC;QAEF,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAE/B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,IAAI,IAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,cAAgB,CAAC,CAAC;QAEtE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAE/B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,oBAAC,IAAI,IACJ,IAAI,EAAC,mCAAmC,mBAC1B,qBAAqB,cAG7B,CACP,CAAC;QAEF,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CACtC,uCAAuC,CACvC,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\nimport { Link } from './Link';\n\ndescribe('Link', () => {\n\tbeforeEach(() => jest.spyOn(console, 'error'));\n\n\tit('should be an anchor element if href attribute exists', () => {\n\t\tconst { getByRole } = render(\n\t\t\t<Link href=\"https://v1.anvil.servicetitan.com\">Website</Link>\n\t\t);\n\n\t\tconst link = getByRole('link');\n\n\t\texpect(link).not.toHaveAttribute('type');\n\t\texpect(link.tagName).toBe('A');\n\t});\n\n\tit('should be a button element if no href attribute exists', () => {\n\t\tconst { getByRole } = render(<Link onClick={() => {}}>Website</Link>);\n\n\t\tconst link = getByRole('link');\n\n\t\texpect(link).not.toHaveAttribute('type', 'button');\n\t\texpect(link.tagName).toBe('BUTTON');\n\t});\n\n\tit('should pass through data automation attributes', () => {\n\t\tconst { container } = render(\n\t\t\t<Link\n\t\t\t\thref=\"https://v1.anvil.servicetitan.com\"\n\t\t\t\tdata-auto-sel=\"automation-selector\"\n\t\t\t>\n\t\t\t\tWebsite\n\t\t\t</Link>\n\t\t);\n\n\t\tconst element = container.querySelector(\n\t\t\t'[data-auto-sel=\"automation-selector\"]'\n\t\t);\n\n\t\texpect(element).not.toBeNull();\n\t});\n});\n"]}
|
package/dist/global/index.css
CHANGED
package/dist/global/version.css
CHANGED