@hh.ru/magritte-ui-date-picker 3.1.2
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/AsyncDataContext.d.ts +11 -0
- package/AsyncDataContext.js +7 -0
- package/AsyncDataContext.js.map +1 -0
- package/AsyncDataLoader.d.ts +7 -0
- package/AsyncDataLoader.js +40 -0
- package/AsyncDataLoader.js.map +1 -0
- package/AsyncDataStore.d.ts +11 -0
- package/AsyncDataStore.js +53 -0
- package/AsyncDataStore.js.map +1 -0
- package/DatePicker.d.ts +4 -0
- package/DatePicker.js +62 -0
- package/DatePicker.js.map +1 -0
- package/DayPicker.d.ts +5 -0
- package/DayPicker.js +116 -0
- package/DayPicker.js.map +1 -0
- package/Header.d.ts +11 -0
- package/Header.js +29 -0
- package/Header.js.map +1 -0
- package/InfiniteScroll.d.ts +13 -0
- package/InfiniteScroll.js +173 -0
- package/InfiniteScroll.js.map +1 -0
- package/InfoDatePicker.d.ts +4 -0
- package/InfoDatePicker.js +49 -0
- package/InfoDatePicker.js.map +1 -0
- package/IntervalDatePicker.d.ts +4 -0
- package/IntervalDatePicker.js +125 -0
- package/IntervalDatePicker.js.map +1 -0
- package/MonthPicker.d.ts +4 -0
- package/MonthPicker.js +54 -0
- package/MonthPicker.js.map +1 -0
- package/Weekdays.d.ts +5 -0
- package/Weekdays.js +11 -0
- package/Weekdays.js.map +1 -0
- package/WithArrowNavigationHOC.d.ts +2 -0
- package/WithArrowNavigationHOC.js +34 -0
- package/WithArrowNavigationHOC.js.map +1 -0
- package/YearPicker.d.ts +4 -0
- package/YearPicker.js +56 -0
- package/YearPicker.js.map +1 -0
- package/date-picker-47a3d918.js +5 -0
- package/date-picker-47a3d918.js.map +1 -0
- package/index.css +542 -0
- package/index.d.ts +5 -0
- package/index.js +40 -0
- package/index.js.map +1 -0
- package/package.json +50 -0
- package/types.d.ts +200 -0
- package/types.js +3 -0
- package/types.js.map +1 -0
- package/useDatePickerControls.d.ts +2 -0
- package/useDatePickerControls.js +59 -0
- package/useDatePickerControls.js.map +1 -0
- package/useDisabledDatesFunc.d.ts +2 -0
- package/useDisabledDatesFunc.js +21 -0
- package/useDisabledDatesFunc.js.map +1 -0
- package/useIntervalPicker.d.ts +2 -0
- package/useIntervalPicker.js +333 -0
- package/useIntervalPicker.js.map +1 -0
- package/utils.d.ts +19 -0
- package/utils.js +56 -0
- package/utils.js.map +1 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { DateType } from './types';
|
|
3
|
+
export interface AsyncDataContextProps {
|
|
4
|
+
disabledDates: DateType[];
|
|
5
|
+
hasData: (startDate: DateType, endDate: DateType) => boolean;
|
|
6
|
+
startAsyncLoading: (startDate: DateType, endDate: DateType) => void;
|
|
7
|
+
awaitAsyncLoading: (startDate: DateType, endDate: DateType) => Promise<void>;
|
|
8
|
+
isLoading: () => boolean;
|
|
9
|
+
isLimitExceeded: () => boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const AsyncDataContext: import("react").Context<AsyncDataContextProps | null>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsyncDataContext.js","sources":["../src/AsyncDataContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport { DateType } from '@hh.ru/magritte-ui-date-picker/types';\n\nexport interface AsyncDataContextProps {\n disabledDates: DateType[];\n hasData: (startDate: DateType, endDate: DateType) => boolean;\n startAsyncLoading: (startDate: DateType, endDate: DateType) => void;\n awaitAsyncLoading: (startDate: DateType, endDate: DateType) => Promise<void>;\n isLoading: () => boolean;\n isLimitExceeded: () => boolean;\n}\n\nexport const AsyncDataContext = createContext<AsyncDataContextProps | null>(null);\n"],"names":[],"mappings":";;MAaa,gBAAgB,GAAG,aAAa,CAA+B,IAAI;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FC, PropsWithChildren } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Отображает лоадер поверх контента во время загрузки асинхронных данных.
|
|
4
|
+
* В multi-лейауте каждый календарь должен быть обернут в свой лоадер,
|
|
5
|
+
* чтобы календари с уже загруженными данными рендерили их, а не анимацию лоадера
|
|
6
|
+
*/
|
|
7
|
+
export declare const AsyncDataLoader: FC<PropsWithChildren>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useContext, useState, useMemo } from 'react';
|
|
4
|
+
import classnames from 'classnames';
|
|
5
|
+
import { AsyncDataContext } from './AsyncDataContext.js';
|
|
6
|
+
import { Loader } from '@hh.ru/magritte-ui-loader';
|
|
7
|
+
import { s as styles } from './date-picker-47a3d918.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Отображает лоадер поверх контента во время загрузки асинхронных данных.
|
|
11
|
+
* В multi-лейауте каждый календарь должен быть обернут в свой лоадер,
|
|
12
|
+
* чтобы календари с уже загруженными данными рендерили их, а не анимацию лоадера
|
|
13
|
+
*/
|
|
14
|
+
const AsyncDataLoader = ({ children }) => {
|
|
15
|
+
const asyncDataContext = useContext(AsyncDataContext);
|
|
16
|
+
const [isLoading, setLoading] = useState(false);
|
|
17
|
+
const value = useMemo(() => {
|
|
18
|
+
if (!asyncDataContext) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
...asyncDataContext,
|
|
23
|
+
startAsyncLoading: (startDate, endDate) => {
|
|
24
|
+
setLoading(true);
|
|
25
|
+
void (async () => {
|
|
26
|
+
try {
|
|
27
|
+
await asyncDataContext.awaitAsyncLoading(startDate, endDate);
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
setLoading(false);
|
|
31
|
+
}
|
|
32
|
+
})();
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}, [asyncDataContext, setLoading]);
|
|
36
|
+
return (jsxs("div", { className: classnames(styles.datePicker, { [styles.datePickerLoading]: isLoading }), children: [isLoading && (jsx("div", { className: styles.loader, children: jsx(Loader, {}) })), jsx("div", { className: classnames({ [styles.loading]: isLoading }), children: jsx(AsyncDataContext.Provider, { value: value, children: children }) })] }));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export { AsyncDataLoader };
|
|
40
|
+
//# sourceMappingURL=AsyncDataLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsyncDataLoader.js","sources":["../src/AsyncDataLoader.tsx"],"sourcesContent":["import { FC, PropsWithChildren, useContext, useMemo, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { AsyncDataContext, AsyncDataContextProps } from '@hh.ru/magritte-ui-date-picker/AsyncDataContext';\nimport { DateType } from '@hh.ru/magritte-ui-date-picker/types';\nimport { Loader } from '@hh.ru/magritte-ui-loader';\n\nimport styles from './date-picker.less';\n\n/**\n * Отображает лоадер поверх контента во время загрузки асинхронных данных.\n * В multi-лейауте каждый календарь должен быть обернут в свой лоадер,\n * чтобы календари с уже загруженными данными рендерили их, а не анимацию лоадера\n */\nexport const AsyncDataLoader: FC<PropsWithChildren> = ({ children }) => {\n const asyncDataContext = useContext(AsyncDataContext);\n const [isLoading, setLoading] = useState(false);\n\n const value = useMemo<AsyncDataContextProps | null>(() => {\n if (!asyncDataContext) {\n return null;\n }\n\n return {\n ...asyncDataContext,\n startAsyncLoading: (startDate: DateType, endDate: DateType) => {\n setLoading(true);\n\n void (async () => {\n try {\n await asyncDataContext.awaitAsyncLoading(startDate, endDate);\n } finally {\n setLoading(false);\n }\n })();\n },\n };\n }, [asyncDataContext, setLoading]);\n\n return (\n <div className={classnames(styles.datePicker, { [styles.datePickerLoading]: isLoading })}>\n {isLoading && (\n <div className={styles.loader}>\n <Loader />\n </div>\n )}\n <div className={classnames({ [styles.loading]: isLoading })}>\n <AsyncDataContext.Provider value={value}>{children}</AsyncDataContext.Provider>\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;AASA;;;;AAIG;MACU,eAAe,GAA0B,CAAC,EAAE,QAAQ,EAAE,KAAI;AACnE,IAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEhD,IAAA,MAAM,KAAK,GAAG,OAAO,CAA+B,MAAK;QACrD,IAAI,CAAC,gBAAgB,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;QAED,OAAO;AACH,YAAA,GAAG,gBAAgB;AACnB,YAAA,iBAAiB,EAAE,CAAC,SAAmB,EAAE,OAAiB,KAAI;gBAC1D,UAAU,CAAC,IAAI,CAAC,CAAC;gBAEjB,KAAK,CAAC,YAAW;oBACb,IAAI;wBACA,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAChE,qBAAA;AAAS,4BAAA;wBACN,UAAU,CAAC,KAAK,CAAC,CAAC;AACrB,qBAAA;iBACJ,GAAG,CAAC;aACR;SACJ,CAAC;AACN,KAAC,EAAE,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;AAEnC,IAAA,QACIA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,GAAG,SAAS,EAAE,CAAC,EAAA,QAAA,EAAA,CACnF,SAAS,KACNC,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,MAAM,YACzBA,GAAC,CAAA,MAAM,EAAG,EAAA,CAAA,EAAA,CACR,CACT,EACDA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,EAAE,CAAC,EAAA,QAAA,EACvDA,GAAC,CAAA,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,EAAA,QAAA,EAAG,QAAQ,EAAA,CAA6B,EAC7E,CAAA,CAAA,EAAA,CACJ,EACR;AACN;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FC, PropsWithChildren } from 'react';
|
|
2
|
+
import { DateType } from './types';
|
|
3
|
+
interface AsyncDataStoreProps {
|
|
4
|
+
disabledDatesFunc?: (startDate: DateType, endDate: DateType) => Promise<DateType[]>;
|
|
5
|
+
parallelLoadersLimit?: number | null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Хранит данные, загруженные всеми вложенными AsyncDataLoader-ами, и предоставляет методы для загрузки данных
|
|
9
|
+
*/
|
|
10
|
+
export declare const AsyncDataStore: FC<PropsWithChildren<AsyncDataStoreProps>>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useRef, useState, useMemo } from 'react';
|
|
4
|
+
import { AsyncDataContext } from './AsyncDataContext.js';
|
|
5
|
+
|
|
6
|
+
const makeKey = (startDate, endDate) => {
|
|
7
|
+
return `${new Date(startDate).getTime()}-${new Date(endDate).getTime()}`;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Хранит данные, загруженные всеми вложенными AsyncDataLoader-ами, и предоставляет методы для загрузки данных
|
|
11
|
+
*/
|
|
12
|
+
const AsyncDataStore = ({ children, disabledDatesFunc, parallelLoadersLimit = null, }) => {
|
|
13
|
+
const asyncDataState = useRef({});
|
|
14
|
+
const [disabledDates, setDisabledDates] = useState([]);
|
|
15
|
+
const value = useMemo(() => {
|
|
16
|
+
if (!disabledDatesFunc) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
disabledDates,
|
|
21
|
+
hasAsyncFunc: true,
|
|
22
|
+
hasData: (startDate, endDate) => makeKey(startDate, endDate) in asyncDataState.current,
|
|
23
|
+
startAsyncLoading: () => void 0,
|
|
24
|
+
awaitAsyncLoading: (startDate, endDate) => {
|
|
25
|
+
const key = makeKey(startDate, endDate);
|
|
26
|
+
if (!(key in asyncDataState.current)) {
|
|
27
|
+
asyncDataState.current[key] = {
|
|
28
|
+
promise: new Promise(async (resolve) => {
|
|
29
|
+
try {
|
|
30
|
+
const _disabledDates = await disabledDatesFunc(startDate, endDate);
|
|
31
|
+
setDisabledDates((disabledDates) => [...disabledDates, ..._disabledDates]);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
asyncDataState.current[key].state = 'done';
|
|
35
|
+
resolve();
|
|
36
|
+
}
|
|
37
|
+
}),
|
|
38
|
+
state: 'loading',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return asyncDataState.current[key].promise;
|
|
42
|
+
},
|
|
43
|
+
isLoading: () => Object.values(asyncDataState.current).some(({ state }) => state === 'loading'),
|
|
44
|
+
isLimitExceeded: () => parallelLoadersLimit !== null &&
|
|
45
|
+
Object.values(asyncDataState.current).filter(({ state }) => state === 'loading').length >=
|
|
46
|
+
parallelLoadersLimit,
|
|
47
|
+
};
|
|
48
|
+
}, [disabledDates, disabledDatesFunc, setDisabledDates, parallelLoadersLimit]);
|
|
49
|
+
return jsx(AsyncDataContext.Provider, { value: value, children: children });
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export { AsyncDataStore };
|
|
53
|
+
//# sourceMappingURL=AsyncDataStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsyncDataStore.js","sources":["../src/AsyncDataStore.tsx"],"sourcesContent":["import { FC, PropsWithChildren, useMemo, useRef, useState } from 'react';\n\nimport { AsyncDataContext, AsyncDataContextProps } from '@hh.ru/magritte-ui-date-picker/AsyncDataContext';\nimport { DateType } from '@hh.ru/magritte-ui-date-picker/types';\n\ninterface AsyncDataStoreProps {\n disabledDatesFunc?: (startDate: DateType, endDate: DateType) => Promise<DateType[]>;\n parallelLoadersLimit?: number | null;\n}\n\nconst makeKey = (startDate: DateType, endDate: DateType) => {\n return `${new Date(startDate).getTime()}-${new Date(endDate).getTime()}`;\n};\n\n/**\n * Хранит данные, загруженные всеми вложенными AsyncDataLoader-ами, и предоставляет методы для загрузки данных\n */\nexport const AsyncDataStore: FC<PropsWithChildren<AsyncDataStoreProps>> = ({\n children,\n disabledDatesFunc,\n parallelLoadersLimit = null,\n}) => {\n const asyncDataState = useRef<Record<string, { promise: Promise<void>; state: 'loading' | 'done' }>>({});\n const [disabledDates, setDisabledDates] = useState<DateType[]>([]);\n\n const value = useMemo<AsyncDataContextProps | null>(() => {\n if (!disabledDatesFunc) {\n return null;\n }\n\n return {\n disabledDates,\n hasAsyncFunc: true,\n hasData: (startDate: DateType, endDate: DateType) => makeKey(startDate, endDate) in asyncDataState.current,\n startAsyncLoading: () => void 0,\n awaitAsyncLoading: (startDate: DateType, endDate: DateType) => {\n const key = makeKey(startDate, endDate);\n if (!(key in asyncDataState.current)) {\n asyncDataState.current[key] = {\n promise: new Promise<void>(async (resolve) => {\n try {\n const _disabledDates = await disabledDatesFunc(startDate, endDate);\n setDisabledDates((disabledDates) => [...disabledDates, ..._disabledDates]);\n } finally {\n asyncDataState.current[key].state = 'done';\n resolve();\n }\n }),\n state: 'loading',\n };\n }\n return asyncDataState.current[key].promise;\n },\n isLoading: () => Object.values(asyncDataState.current).some(({ state }) => state === 'loading'),\n isLimitExceeded: () =>\n parallelLoadersLimit !== null &&\n Object.values(asyncDataState.current).filter(({ state }) => state === 'loading').length >=\n parallelLoadersLimit,\n };\n }, [disabledDates, disabledDatesFunc, setDisabledDates, parallelLoadersLimit]);\n\n return <AsyncDataContext.Provider value={value}>{children}</AsyncDataContext.Provider>;\n};\n"],"names":["_jsx"],"mappings":";;;;AAUA,MAAM,OAAO,GAAG,CAAC,SAAmB,EAAE,OAAiB,KAAI;AACvD,IAAA,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF;;AAEG;AACI,MAAM,cAAc,GAA+C,CAAC,EACvE,QAAQ,EACR,iBAAiB,EACjB,oBAAoB,GAAG,IAAI,GAC9B,KAAI;AACD,IAAA,MAAM,cAAc,GAAG,MAAM,CAAwE,EAAE,CAAC,CAAC;IACzG,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;AAEnE,IAAA,MAAM,KAAK,GAAG,OAAO,CAA+B,MAAK;QACrD,IAAI,CAAC,iBAAiB,EAAE;AACpB,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;QAED,OAAO;YACH,aAAa;AACb,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,OAAO,EAAE,CAAC,SAAmB,EAAE,OAAiB,KAAK,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,cAAc,CAAC,OAAO;AAC1G,YAAA,iBAAiB,EAAE,MAAM,KAAK,CAAC;AAC/B,YAAA,iBAAiB,EAAE,CAAC,SAAmB,EAAE,OAAiB,KAAI;gBAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACxC,IAAI,EAAE,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE;AAClC,oBAAA,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG;wBAC1B,OAAO,EAAE,IAAI,OAAO,CAAO,OAAO,OAAO,KAAI;4BACzC,IAAI;gCACA,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACnE,gCAAA,gBAAgB,CAAC,CAAC,aAAa,KAAK,CAAC,GAAG,aAAa,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;AAC9E,6BAAA;AAAS,oCAAA;gCACN,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC;AAC3C,gCAAA,OAAO,EAAE,CAAC;AACb,6BAAA;AACL,yBAAC,CAAC;AACF,wBAAA,KAAK,EAAE,SAAS;qBACnB,CAAC;AACL,iBAAA;gBACD,OAAO,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;aAC9C;YACD,SAAS,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK,SAAS,CAAC;AAC/F,YAAA,eAAe,EAAE,MACb,oBAAoB,KAAK,IAAI;gBAC7B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC,MAAM;oBACnF,oBAAoB;SAC/B,CAAC;KACL,EAAE,CAAC,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAE/E,OAAOA,GAAA,CAAC,gBAAgB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,KAAK,EAAA,QAAA,EAAG,QAAQ,EAAA,CAA6B,CAAC;AAC3F;;;;"}
|
package/DatePicker.d.ts
ADDED
package/DatePicker.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
import { forwardRef, useState, useCallback } from 'react';
|
|
4
|
+
import { AsyncDataLoader } from './AsyncDataLoader.js';
|
|
5
|
+
import { AsyncDataStore } from './AsyncDataStore.js';
|
|
6
|
+
import { DayPicker } from './DayPicker.js';
|
|
7
|
+
import { Header } from './Header.js';
|
|
8
|
+
import { MonthPicker } from './MonthPicker.js';
|
|
9
|
+
import { Weekdays } from './Weekdays.js';
|
|
10
|
+
import { WithArrowNavigationHOC } from './WithArrowNavigationHOC.js';
|
|
11
|
+
import { YearPicker } from './YearPicker.js';
|
|
12
|
+
import { useDatePickerControls } from './useDatePickerControls.js';
|
|
13
|
+
import { useDisplayDate } from './utils.js';
|
|
14
|
+
import { Divider } from '@hh.ru/magritte-ui-divider';
|
|
15
|
+
import { s as styles } from './date-picker-47a3d918.js';
|
|
16
|
+
import 'classnames';
|
|
17
|
+
import './AsyncDataContext.js';
|
|
18
|
+
import '@hh.ru/magritte-ui-loader';
|
|
19
|
+
import 'date-fns';
|
|
20
|
+
import 'date-fns/constants';
|
|
21
|
+
import '@hh.ru/magritte-common-use-disabled';
|
|
22
|
+
import '@hh.ru/magritte-ui-bottom-sheet';
|
|
23
|
+
import './useDisabledDatesFunc.js';
|
|
24
|
+
import './useIntervalPicker.js';
|
|
25
|
+
import '@hh.ru/magritte-ui-icon/icon';
|
|
26
|
+
import '@hh.ru/magritte-ui-navigation-bar';
|
|
27
|
+
import '@hh.ru/magritte-ui-spacing';
|
|
28
|
+
import '@hh.ru/magritte-ui-tooltip';
|
|
29
|
+
import '@hh.ru/magritte-ui-typography';
|
|
30
|
+
import '@hh.ru/magritte-ui-action';
|
|
31
|
+
import '@hh.ru/magritte-common-keyboard';
|
|
32
|
+
import '@hh.ru/magritte-common-use-multiple-refs';
|
|
33
|
+
|
|
34
|
+
const DatePickerRenderFunc = forwardRef(({
|
|
35
|
+
// настройки функциональности
|
|
36
|
+
disabledDates, disabledDatesFunc, displayDate: _displayDate, enabledCalendars, minDate, maxDate, selectedDate,
|
|
37
|
+
// колбеки
|
|
38
|
+
onDisplayDateChange, onDateSelect,
|
|
39
|
+
// настройки внешнего вида
|
|
40
|
+
activeHeader, alignHeader, headerMonthFormat, locale, showAdjacentDays = true, showControls, showHeader = true, showHeaderDate, showDivider = true, showWeekdays = true, }, ref) => {
|
|
41
|
+
const displayDate = useDisplayDate(_displayDate, selectedDate);
|
|
42
|
+
const { calendar, switchCalendar, zoomIntoMonth, zoomIntoYear, goToNextPeriod, goToPrevPeriod } = useDatePickerControls(enabledCalendars, displayDate, onDisplayDateChange);
|
|
43
|
+
return (jsx("div", { className: styles.layout, ref: ref, children: jsx(AsyncDataStore, { disabledDatesFunc: disabledDatesFunc, children: jsxs(AsyncDataLoader, { children: [showHeader && (jsx(Header, { calendar: calendar, displayDate: displayDate, activeHeader: activeHeader, alignHeader: alignHeader, goToNextPeriod: goToNextPeriod, goToPrevPeriod: goToPrevPeriod, headerMonthFormat: headerMonthFormat, locale: locale, showControls: showControls, showHeaderDate: showHeaderDate, switchCalendar: switchCalendar })), showWeekdays && calendar === 'day' && jsx(Weekdays, { locale: locale }), showDivider && (showHeader || showWeekdays) && jsx(Divider, {}), calendar === 'day' && (jsx(DayPicker, { disabledDates: disabledDates, displayDate: displayDate, selectedDate: selectedDate, onDateSelect: onDateSelect, showAdjacentDays: showAdjacentDays, minDate: minDate, maxDate: maxDate })), calendar === 'month' && (jsx(MonthPicker, { locale: locale, displayDate: displayDate, selectedDate: selectedDate, onDateSelect: enabledCalendars.startsWith('dd') ? zoomIntoMonth : onDateSelect })), calendar === 'year' && (jsx(YearPicker, { displayDate: displayDate, selectedDate: selectedDate, onDateSelect: zoomIntoYear }))] }) }) }));
|
|
44
|
+
});
|
|
45
|
+
DatePickerRenderFunc.displayName = 'DatePickerRenderFunc';
|
|
46
|
+
const DatePicker = WithArrowNavigationHOC(DatePickerRenderFunc);
|
|
47
|
+
const UncontrolledDatePicker = ({ displayDate: initialDisplayDate, selectedDate: initialSelectedDate, onDisplayDateChange, onDateSelect, ...props }) => {
|
|
48
|
+
const [displayDate, setDisplayDate] = useState(useDisplayDate(initialDisplayDate, initialSelectedDate));
|
|
49
|
+
const [selectedDate, setSelectedDate] = useState(initialSelectedDate ?? null);
|
|
50
|
+
const handleDisplayDateChange = useCallback((value) => {
|
|
51
|
+
onDisplayDateChange?.(value);
|
|
52
|
+
setDisplayDate(value);
|
|
53
|
+
}, [onDisplayDateChange, setDisplayDate]);
|
|
54
|
+
const handleDateSelect = useCallback((value) => {
|
|
55
|
+
onDateSelect?.(value);
|
|
56
|
+
setSelectedDate(value);
|
|
57
|
+
}, [onDateSelect, setSelectedDate]);
|
|
58
|
+
return (jsx(DatePicker, { ...props, displayDate: displayDate, selectedDate: selectedDate, onDisplayDateChange: handleDisplayDateChange, onDateSelect: handleDateSelect }));
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { DatePicker, UncontrolledDatePicker };
|
|
62
|
+
//# sourceMappingURL=DatePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../src/DatePicker.tsx"],"sourcesContent":["import { FC, forwardRef, useCallback, useState } from 'react';\n\nimport { AsyncDataLoader } from '@hh.ru/magritte-ui-date-picker/AsyncDataLoader';\nimport { AsyncDataStore } from '@hh.ru/magritte-ui-date-picker/AsyncDataStore';\nimport { DayPicker } from '@hh.ru/magritte-ui-date-picker/DayPicker';\nimport { Header } from '@hh.ru/magritte-ui-date-picker/Header';\nimport { MonthPicker } from '@hh.ru/magritte-ui-date-picker/MonthPicker';\nimport { Weekdays } from '@hh.ru/magritte-ui-date-picker/Weekdays';\nimport { WithArrowNavigationHOC } from '@hh.ru/magritte-ui-date-picker/WithArrowNavigationHOC';\nimport { YearPicker } from '@hh.ru/magritte-ui-date-picker/YearPicker';\nimport { DateType, DatePickerProps } from '@hh.ru/magritte-ui-date-picker/types';\nimport { useDatePickerControls } from '@hh.ru/magritte-ui-date-picker/useDatePickerControls';\nimport { useDisplayDate } from '@hh.ru/magritte-ui-date-picker/utils';\nimport { Divider } from '@hh.ru/magritte-ui-divider';\n\nimport styles from './date-picker.less';\n\nconst DatePickerRenderFunc = forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n // настройки функциональности\n disabledDates,\n disabledDatesFunc,\n displayDate: _displayDate,\n enabledCalendars,\n minDate,\n maxDate,\n selectedDate,\n // колбеки\n onDisplayDateChange,\n onDateSelect,\n // настройки внешнего вида\n activeHeader,\n alignHeader,\n headerMonthFormat,\n locale,\n showAdjacentDays = true,\n showControls,\n showHeader = true,\n showHeaderDate,\n showDivider = true,\n showWeekdays = true,\n },\n ref\n ) => {\n const displayDate = useDisplayDate(_displayDate, selectedDate);\n const { calendar, switchCalendar, zoomIntoMonth, zoomIntoYear, goToNextPeriod, goToPrevPeriod } =\n useDatePickerControls(enabledCalendars, displayDate, onDisplayDateChange);\n\n return (\n <div className={styles.layout} ref={ref}>\n <AsyncDataStore disabledDatesFunc={disabledDatesFunc}>\n <AsyncDataLoader>\n {showHeader && (\n <Header\n calendar={calendar}\n displayDate={displayDate}\n activeHeader={activeHeader}\n alignHeader={alignHeader}\n goToNextPeriod={goToNextPeriod}\n goToPrevPeriod={goToPrevPeriod}\n headerMonthFormat={headerMonthFormat}\n locale={locale}\n showControls={showControls}\n showHeaderDate={showHeaderDate}\n switchCalendar={switchCalendar}\n />\n )}\n {showWeekdays && calendar === 'day' && <Weekdays locale={locale} />}\n {showDivider && (showHeader || showWeekdays) && <Divider />}\n {calendar === 'day' && (\n <DayPicker\n disabledDates={disabledDates}\n displayDate={displayDate}\n selectedDate={selectedDate}\n onDateSelect={onDateSelect}\n showAdjacentDays={showAdjacentDays}\n minDate={minDate}\n maxDate={maxDate}\n />\n )}\n {calendar === 'month' && (\n <MonthPicker\n locale={locale}\n displayDate={displayDate}\n selectedDate={selectedDate}\n onDateSelect={enabledCalendars.startsWith('dd') ? zoomIntoMonth : onDateSelect}\n />\n )}\n {calendar === 'year' && (\n <YearPicker\n displayDate={displayDate}\n selectedDate={selectedDate}\n onDateSelect={zoomIntoYear}\n />\n )}\n </AsyncDataLoader>\n </AsyncDataStore>\n </div>\n );\n }\n);\n\nDatePickerRenderFunc.displayName = 'DatePickerRenderFunc';\n\nexport const DatePicker = WithArrowNavigationHOC(DatePickerRenderFunc);\n\nexport const UncontrolledDatePicker: FC<DatePickerProps> = ({\n displayDate: initialDisplayDate,\n selectedDate: initialSelectedDate,\n onDisplayDateChange,\n onDateSelect,\n ...props\n}) => {\n const [displayDate, setDisplayDate] = useState<DateType>(useDisplayDate(initialDisplayDate, initialSelectedDate));\n const [selectedDate, setSelectedDate] = useState<DateType | null>(initialSelectedDate ?? null);\n\n const handleDisplayDateChange = useCallback(\n (value: DateType) => {\n onDisplayDateChange?.(value);\n setDisplayDate(value);\n },\n [onDisplayDateChange, setDisplayDate]\n );\n\n const handleDateSelect = useCallback(\n (value: DateType) => {\n onDateSelect?.(value);\n setSelectedDate(value);\n },\n [onDateSelect, setSelectedDate]\n );\n\n return (\n <DatePicker\n {...props}\n displayDate={displayDate}\n selectedDate={selectedDate}\n onDisplayDateChange={handleDisplayDateChange}\n onDateSelect={handleDateSelect}\n />\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
package/DayPicker.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { DayPickerProps, IntervalDayPickerProps, InfoDayPickerProps } from './types';
|
|
3
|
+
export declare const DayPicker: FC<DayPickerProps>;
|
|
4
|
+
export declare const IntervalDayPicker: FC<IntervalDayPickerProps>;
|
|
5
|
+
export declare const InfoDayPicker: FC<InfoDayPickerProps>;
|
package/DayPicker.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
|
|
3
|
+
import { useMemo, Fragment, useState, useRef } from 'react';
|
|
4
|
+
import classnames from 'classnames';
|
|
5
|
+
import { isSameMonth, isSameDay, isToday, format, isFirstDayOfMonth, isLastDayOfMonth } from 'date-fns';
|
|
6
|
+
import { daysInWeek } from 'date-fns/constants';
|
|
7
|
+
import { useDisabled } from '@hh.ru/magritte-common-use-disabled';
|
|
8
|
+
import { BottomSheet } from '@hh.ru/magritte-ui-bottom-sheet';
|
|
9
|
+
import { useDisabledDatesFunc } from './useDisabledDatesFunc.js';
|
|
10
|
+
import { useIntervalPicker } from './useIntervalPicker.js';
|
|
11
|
+
import { useDayPickerDates, flatten, getInfoByDateType } from './utils.js';
|
|
12
|
+
import { CrossOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
|
|
13
|
+
import { NavigationBar } from '@hh.ru/magritte-ui-navigation-bar';
|
|
14
|
+
import { VSpacing } from '@hh.ru/magritte-ui-spacing';
|
|
15
|
+
import { TooltipHover } from '@hh.ru/magritte-ui-tooltip';
|
|
16
|
+
import { Text } from '@hh.ru/magritte-ui-typography';
|
|
17
|
+
import { s as styles } from './date-picker-47a3d918.js';
|
|
18
|
+
import './AsyncDataContext.js';
|
|
19
|
+
|
|
20
|
+
const DayPicker = ({ disabledDates, minDate, maxDate, displayDate, selectedDate, showAdjacentDays, onDateSelect, }) => {
|
|
21
|
+
const dates = useDayPickerDates(displayDate);
|
|
22
|
+
const disabledDatesFunc = useDisabledDatesFunc(dates[0], dates[dates.length - 1], disabledDates, minDate, maxDate);
|
|
23
|
+
const forceDisabled = useDisabled();
|
|
24
|
+
const onClickHandlers = useMemo(() => {
|
|
25
|
+
return dates.map((date) => {
|
|
26
|
+
return () => onDateSelect?.(date);
|
|
27
|
+
});
|
|
28
|
+
}, [dates, onDateSelect]);
|
|
29
|
+
return (jsx("div", { className: classnames(styles.calendar, styles.calendarDays), "data-qa": "date-picker-days", children: dates.map((date, index) => {
|
|
30
|
+
const isAdjacent = !isSameMonth(date, displayDate);
|
|
31
|
+
const isDisabled = isAdjacent || forceDisabled || disabledDatesFunc(date);
|
|
32
|
+
const isSelected = !!selectedDate && isSameDay(date, selectedDate);
|
|
33
|
+
const display = !isAdjacent || showAdjacentDays;
|
|
34
|
+
return (jsx("div", { className: styles.item, children: display && (jsx("button", { className: classnames(styles.text, {
|
|
35
|
+
[styles.textDisabled]: isDisabled,
|
|
36
|
+
[styles.textSelected]: isSelected,
|
|
37
|
+
[styles.textToday]: isToday(date),
|
|
38
|
+
[styles.textUnselected]: !isDisabled && !isSelected,
|
|
39
|
+
}), disabled: isDisabled || isSelected, onClick: onClickHandlers[index], children: format(date, 'dd') })) }, `${date}`));
|
|
40
|
+
}) }));
|
|
41
|
+
};
|
|
42
|
+
const IntervalDayPicker = ({ disabledDates, minDate, maxDate, displayDate, selectionStart, selectionEnd, hoveredDate, dragState, onStartSelect, onEndSelect, onDateHover, onDateDrag, showAdjacentDays, }) => {
|
|
43
|
+
const dates = useDayPickerDates(displayDate);
|
|
44
|
+
const disabledDatesFunc = useDisabledDatesFunc(dates[0], dates[dates.length - 1], disabledDates, minDate, maxDate);
|
|
45
|
+
const datesProps = useIntervalPicker({
|
|
46
|
+
dates,
|
|
47
|
+
disabledDatesFunc,
|
|
48
|
+
selectionStart,
|
|
49
|
+
selectionEnd,
|
|
50
|
+
hoveredDate,
|
|
51
|
+
dragState,
|
|
52
|
+
onStartSelect,
|
|
53
|
+
onEndSelect,
|
|
54
|
+
onDateHover,
|
|
55
|
+
onDateDrag,
|
|
56
|
+
isEqual: isSameDay,
|
|
57
|
+
});
|
|
58
|
+
return (jsx("div", { className: classnames(styles.calendar, styles.calendarDays), "data-qa": "date-picker-days", children: dates.map((date, index) => {
|
|
59
|
+
const isAdjacent = !isSameMonth(date, displayDate);
|
|
60
|
+
const { isDisabled: _isDisabled, isIntervalStart, isIntervalEnd, isSelected, isDraggable, isDragSource, isDropTarget, isWithinInterval, mouseHandlers, dragSourceHandlers, dropTargetHandlers, } = datesProps[index];
|
|
61
|
+
const isDisabled = isAdjacent || _isDisabled;
|
|
62
|
+
const isIntervalRowStart = isWithinInterval &&
|
|
63
|
+
!isIntervalStart &&
|
|
64
|
+
(index % daysInWeek === 0 || (!showAdjacentDays && isFirstDayOfMonth(date)));
|
|
65
|
+
const isIntervalRowEnd = isWithinInterval &&
|
|
66
|
+
!isIntervalEnd &&
|
|
67
|
+
(index % daysInWeek === daysInWeek - 1 || (!showAdjacentDays && isLastDayOfMonth(date)));
|
|
68
|
+
const display = !isAdjacent || showAdjacentDays;
|
|
69
|
+
return (jsx("div", { className: classnames(styles.item, {
|
|
70
|
+
[styles.itemInterval]: isWithinInterval,
|
|
71
|
+
[styles.itemIntervalStart]: isIntervalStart,
|
|
72
|
+
[styles.itemIntervalEnd]: isIntervalEnd,
|
|
73
|
+
[styles.itemIntervalRowStart]: isIntervalRowStart,
|
|
74
|
+
[styles.itemIntervalRowEnd]: isIntervalRowEnd,
|
|
75
|
+
}), children: display && (jsxs(Fragment, { children: [jsx("button", { ...mouseHandlers, ...(!isDisabled ? dragSourceHandlers : {}), ...(!isDisabled ? dropTargetHandlers : {}), className: classnames(styles.text, {
|
|
76
|
+
[styles.textDisabled]: isDisabled,
|
|
77
|
+
[styles.textSelected]: isSelected,
|
|
78
|
+
[styles.textDraggable]: !isDisabled && isDraggable,
|
|
79
|
+
[styles.textDragSource]: isDragSource,
|
|
80
|
+
[styles.textDropTarget]: isDropTarget,
|
|
81
|
+
[styles.textToday]: isToday(date),
|
|
82
|
+
[styles.textUnselected]: !isDisabled && !isSelected && !isDragSource && !isDropTarget,
|
|
83
|
+
}), disabled: isDisabled || isSelected || isDragSource, draggable: !isDisabled && isDraggable, children: format(date, 'dd') }), isWithinInterval && jsx("div", { className: styles.substrate })] })) }, `${date}`));
|
|
84
|
+
}) }));
|
|
85
|
+
};
|
|
86
|
+
const InfoDayTooltipWrapper = ({ children, tooltip }) => {
|
|
87
|
+
const activatorRef = useRef(null);
|
|
88
|
+
return (jsxs(Fragment$1, { children: [jsx("div", { className: styles.item, ref: activatorRef, children: children }), tooltip && (jsx(TooltipHover, { alignment: "center", direction: "top", activatorRef: activatorRef, children: tooltip }))] }));
|
|
89
|
+
};
|
|
90
|
+
const InfoDayPicker = ({ displayDate, holidays: _holidays, shortWorkdays: _shortWorkdays, }) => {
|
|
91
|
+
const dates = useDayPickerDates(displayDate);
|
|
92
|
+
const [bottomSheetState, setBottomSheetState] = useState({ show: false, text: '', header: '' });
|
|
93
|
+
const onCloseBottomSheet = () => setBottomSheetState({ show: false, text: '', header: '' });
|
|
94
|
+
const holidays = useMemo(() => _holidays && flatten(_holidays), [_holidays]);
|
|
95
|
+
const shortWorkdays = useMemo(() => _shortWorkdays && flatten(_shortWorkdays), [_shortWorkdays]);
|
|
96
|
+
return (jsxs("div", { className: classnames(styles.calendar, styles.calendarDays), "data-qa": "date-picker-days", children: [dates.map((date) => {
|
|
97
|
+
const isAdjacent = !isSameMonth(date, displayDate);
|
|
98
|
+
const holiday = holidays?.find((holiday) => isSameDay(date, holiday.date));
|
|
99
|
+
const shortWorkday = shortWorkdays?.find((shortWorkday) => isSameDay(date, shortWorkday.date));
|
|
100
|
+
const isWorkDay = !holiday && !shortWorkday;
|
|
101
|
+
const info = getInfoByDateType(holiday, shortWorkday);
|
|
102
|
+
const display = !isAdjacent;
|
|
103
|
+
return (jsx(InfoDayTooltipWrapper, { tooltip: info?.text, children: display && (jsxs(Fragment, { children: [jsx("button", { className: classnames(styles.text, {
|
|
104
|
+
[styles.textHoliday]: holiday,
|
|
105
|
+
[styles.textShortWorkday]: shortWorkday,
|
|
106
|
+
[styles.textWorkday]: isWorkDay,
|
|
107
|
+
}), onClick: () => {
|
|
108
|
+
if (info) {
|
|
109
|
+
setBottomSheetState({ show: true, ...info });
|
|
110
|
+
}
|
|
111
|
+
}, disabled: !info, children: format(date, 'dd') }), jsx("div", { className: styles.substrate })] })) }, `${date}`));
|
|
112
|
+
}), jsxs(BottomSheet, { visible: bottomSheetState.show, header: jsx(NavigationBar, { title: bottomSheetState.header, right: { icon: CrossOutlinedSize24, onClick: onCloseBottomSheet }, showDivider: true }), onClose: onCloseBottomSheet, children: [jsx(Text, { Element: "span", typography: "label-2-regular", children: bottomSheetState.text }), jsx(VSpacing, { default: 48 })] })] }));
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export { DayPicker, InfoDayPicker, IntervalDayPicker };
|
|
116
|
+
//# sourceMappingURL=DayPicker.js.map
|
package/DayPicker.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DayPicker.js","sources":["../src/DayPicker.tsx"],"sourcesContent":["import { Fragment, FC, useMemo, useState, useRef, ReactNode } from 'react';\nimport classnames from 'classnames';\nimport { format, isFirstDayOfMonth, isLastDayOfMonth, isSameDay, isSameMonth, isToday } from 'date-fns';\nimport { daysInWeek as DAYS_IN_WEEK } from 'date-fns/constants';\n\nimport { useDisabled } from '@hh.ru/magritte-common-use-disabled';\nimport { BottomSheet } from '@hh.ru/magritte-ui-bottom-sheet';\nimport { DayPickerProps, IntervalDayPickerProps, InfoDayPickerProps } from '@hh.ru/magritte-ui-date-picker/types';\nimport { useDisabledDatesFunc } from '@hh.ru/magritte-ui-date-picker/useDisabledDatesFunc';\nimport { useIntervalPicker } from '@hh.ru/magritte-ui-date-picker/useIntervalPicker';\nimport { flatten, useDayPickerDates, InfoDay, getInfoByDateType } from '@hh.ru/magritte-ui-date-picker/utils';\nimport { CrossOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { NavigationBar } from '@hh.ru/magritte-ui-navigation-bar';\nimport { VSpacing } from '@hh.ru/magritte-ui-spacing';\nimport { TooltipHover } from '@hh.ru/magritte-ui-tooltip';\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './date-picker.less';\n\nexport const DayPicker: FC<DayPickerProps> = ({\n disabledDates,\n minDate,\n maxDate,\n displayDate,\n selectedDate,\n showAdjacentDays,\n onDateSelect,\n}) => {\n const dates = useDayPickerDates(displayDate);\n const disabledDatesFunc = useDisabledDatesFunc(dates[0], dates[dates.length - 1], disabledDates, minDate, maxDate);\n const forceDisabled = useDisabled();\n\n const onClickHandlers = useMemo(() => {\n return dates.map((date) => {\n return () => onDateSelect?.(date);\n });\n }, [dates, onDateSelect]);\n\n return (\n <div className={classnames(styles.calendar, styles.calendarDays)} data-qa=\"date-picker-days\">\n {dates.map((date, index) => {\n const isAdjacent = !isSameMonth(date, displayDate);\n const isDisabled = isAdjacent || forceDisabled || disabledDatesFunc(date);\n const isSelected = !!selectedDate && isSameDay(date, selectedDate);\n const display = !isAdjacent || showAdjacentDays;\n\n return (\n <div className={styles.item} key={`${date}`}>\n {display && (\n <button\n className={classnames(styles.text, {\n [styles.textDisabled]: isDisabled,\n [styles.textSelected]: isSelected,\n [styles.textToday]: isToday(date),\n [styles.textUnselected]: !isDisabled && !isSelected,\n })}\n disabled={isDisabled || isSelected}\n onClick={onClickHandlers[index]}\n >\n {format(date, 'dd')}\n </button>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\nexport const IntervalDayPicker: FC<IntervalDayPickerProps> = ({\n disabledDates,\n minDate,\n maxDate,\n displayDate,\n selectionStart,\n selectionEnd,\n hoveredDate,\n dragState,\n onStartSelect,\n onEndSelect,\n onDateHover,\n onDateDrag,\n showAdjacentDays,\n}) => {\n const dates = useDayPickerDates(displayDate);\n const disabledDatesFunc = useDisabledDatesFunc(dates[0], dates[dates.length - 1], disabledDates, minDate, maxDate);\n\n const datesProps = useIntervalPicker({\n dates,\n disabledDatesFunc,\n selectionStart,\n selectionEnd,\n hoveredDate,\n dragState,\n onStartSelect,\n onEndSelect,\n onDateHover,\n onDateDrag,\n isEqual: isSameDay,\n });\n\n return (\n <div className={classnames(styles.calendar, styles.calendarDays)} data-qa=\"date-picker-days\">\n {dates.map((date, index) => {\n const isAdjacent = !isSameMonth(date, displayDate);\n const {\n isDisabled: _isDisabled,\n isIntervalStart,\n isIntervalEnd,\n isSelected,\n isDraggable,\n isDragSource,\n isDropTarget,\n isWithinInterval,\n mouseHandlers,\n dragSourceHandlers,\n dropTargetHandlers,\n } = datesProps[index];\n const isDisabled = isAdjacent || _isDisabled;\n const isIntervalRowStart =\n isWithinInterval &&\n !isIntervalStart &&\n (index % DAYS_IN_WEEK === 0 || (!showAdjacentDays && isFirstDayOfMonth(date)));\n const isIntervalRowEnd =\n isWithinInterval &&\n !isIntervalEnd &&\n (index % DAYS_IN_WEEK === DAYS_IN_WEEK - 1 || (!showAdjacentDays && isLastDayOfMonth(date)));\n const display = !isAdjacent || showAdjacentDays;\n\n return (\n <div\n className={classnames(styles.item, {\n [styles.itemInterval]: isWithinInterval,\n [styles.itemIntervalStart]: isIntervalStart,\n [styles.itemIntervalEnd]: isIntervalEnd,\n [styles.itemIntervalRowStart]: isIntervalRowStart,\n [styles.itemIntervalRowEnd]: isIntervalRowEnd,\n })}\n key={`${date}`}\n >\n {display && (\n <Fragment>\n <button\n {...mouseHandlers}\n {...(!isDisabled ? dragSourceHandlers : {})}\n {...(!isDisabled ? dropTargetHandlers : {})}\n className={classnames(styles.text, {\n [styles.textDisabled]: isDisabled,\n [styles.textSelected]: isSelected,\n [styles.textDraggable]: !isDisabled && isDraggable,\n [styles.textDragSource]: isDragSource,\n [styles.textDropTarget]: isDropTarget,\n [styles.textToday]: isToday(date),\n [styles.textUnselected]:\n !isDisabled && !isSelected && !isDragSource && !isDropTarget,\n })}\n disabled={isDisabled || isSelected || isDragSource}\n draggable={!isDisabled && isDraggable}\n >\n {format(date, 'dd')}\n </button>\n {isWithinInterval && <div className={styles.substrate} />}\n </Fragment>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\ninterface BottomSheetState extends InfoDay {\n show: boolean;\n}\n\nconst InfoDayTooltipWrapper: FC<{ children: ReactNode; tooltip: ReactNode }> = ({ children, tooltip }) => {\n const activatorRef = useRef<HTMLDivElement | null>(null);\n\n return (\n <>\n <div className={styles.item} ref={activatorRef}>\n {children}\n </div>\n {tooltip && (\n <TooltipHover alignment=\"center\" direction=\"top\" activatorRef={activatorRef}>\n {tooltip}\n </TooltipHover>\n )}\n </>\n );\n};\n\nexport const InfoDayPicker: FC<InfoDayPickerProps> = ({\n displayDate,\n holidays: _holidays,\n shortWorkdays: _shortWorkdays,\n}) => {\n const dates = useDayPickerDates(displayDate);\n const [bottomSheetState, setBottomSheetState] = useState<BottomSheetState>({ show: false, text: '', header: '' });\n const onCloseBottomSheet = () => setBottomSheetState({ show: false, text: '', header: '' });\n\n const holidays = useMemo(() => _holidays && flatten(_holidays), [_holidays]);\n const shortWorkdays = useMemo(() => _shortWorkdays && flatten(_shortWorkdays), [_shortWorkdays]);\n\n return (\n <div className={classnames(styles.calendar, styles.calendarDays)} data-qa=\"date-picker-days\">\n {dates.map((date) => {\n const isAdjacent = !isSameMonth(date, displayDate);\n const holiday = holidays?.find((holiday) => isSameDay(date, holiday.date));\n const shortWorkday = shortWorkdays?.find((shortWorkday) => isSameDay(date, shortWorkday.date));\n const isWorkDay = !holiday && !shortWorkday;\n const info = getInfoByDateType(holiday, shortWorkday);\n const display = !isAdjacent;\n\n return (\n <InfoDayTooltipWrapper key={`${date}`} tooltip={info?.text}>\n {display && (\n <Fragment>\n <button\n className={classnames(styles.text, {\n [styles.textHoliday]: holiday,\n [styles.textShortWorkday]: shortWorkday,\n [styles.textWorkday]: isWorkDay,\n })}\n onClick={() => {\n if (info) {\n setBottomSheetState({ show: true, ...info });\n }\n }}\n disabled={!info}\n >\n {format(date, 'dd')}\n </button>\n <div className={styles.substrate} />\n </Fragment>\n )}\n </InfoDayTooltipWrapper>\n );\n })}\n\n <BottomSheet\n visible={bottomSheetState.show}\n header={\n <NavigationBar\n title={bottomSheetState.header}\n right={{ icon: CrossOutlinedSize24, onClick: onCloseBottomSheet }}\n showDivider\n />\n }\n onClose={onCloseBottomSheet}\n >\n <Text Element=\"span\" typography=\"label-2-regular\">\n {bottomSheetState.text}\n </Text>\n <VSpacing default={48} />\n </BottomSheet>\n </div>\n );\n};\n"],"names":["_jsx","DAYS_IN_WEEK","_jsxs","_Fragment"],"mappings":"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"}
|
package/Header.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { DateType, Calendar, BaseDatePickerProps } from './types';
|
|
3
|
+
export declare const Header: FC<Pick<BaseDatePickerProps, 'activeHeader' | 'alignHeader' | 'headerMonthFormat' | 'locale' | 'showControls' | 'showHeaderDate'> & {
|
|
4
|
+
calendar: Calendar;
|
|
5
|
+
displayDate: DateType;
|
|
6
|
+
goToNextPeriod?: VoidFunction;
|
|
7
|
+
goToPrevPeriod?: VoidFunction;
|
|
8
|
+
showNextControl?: boolean;
|
|
9
|
+
showPrevControl?: boolean;
|
|
10
|
+
switchCalendar?: VoidFunction;
|
|
11
|
+
}>;
|
package/Header.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
import { Fragment } from 'react';
|
|
4
|
+
import classnames from 'classnames';
|
|
5
|
+
import { format } from 'date-fns';
|
|
6
|
+
import { useDisabled } from '@hh.ru/magritte-common-use-disabled';
|
|
7
|
+
import { Action } from '@hh.ru/magritte-ui-action';
|
|
8
|
+
import { makeYearsInterval } from './utils.js';
|
|
9
|
+
import { ChevronLeftOutlinedSize24, ChevronDownOutlinedSize16, ChevronRightOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
|
|
10
|
+
import { s as styles } from './date-picker-47a3d918.js';
|
|
11
|
+
import 'date-fns/constants';
|
|
12
|
+
|
|
13
|
+
const Header = ({ calendar, displayDate, activeHeader: _activeHeader = true, alignHeader = 'center', goToNextPeriod, goToPrevPeriod, headerMonthFormat = 'mm', locale, showControls = true, showHeaderDate = true, showNextControl = true, showPrevControl = true, switchCalendar, }) => {
|
|
14
|
+
const forceDisabled = useDisabled();
|
|
15
|
+
const activeHeader = _activeHeader && !forceDisabled;
|
|
16
|
+
if (!showControls && !showHeaderDate) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return (jsx("div", { className: styles.headerWrapper, children: jsxs("div", { className: styles.header, "data-qa": "date-picker-header", children: [showControls && (jsx("div", { className: styles.control, children: showPrevControl && goToPrevPeriod && (jsx(Action, { icon: ChevronLeftOutlinedSize24, mode: "secondary", style: "neutral", onClick: goToPrevPeriod, "data-qa": "date-picker-prev-control" })) })), jsx("div", { className: classnames({
|
|
20
|
+
[styles.headerDateWrapperCenter]: alignHeader === 'center',
|
|
21
|
+
[styles.headerDateWrapperLeft]: alignHeader === 'left',
|
|
22
|
+
}), children: showHeaderDate && (jsxs("button", { className: classnames(styles.headerDate, { [styles.headerDateActive]: activeHeader }), "data-qa": "date-picker-header-date", disabled: !activeHeader, onClick: switchCalendar, children: [calendar === 'day' &&
|
|
23
|
+
format(displayDate, headerMonthFormat.endsWith('yyyy') ? 'LLLL yyyy' : 'LLLL', {
|
|
24
|
+
locale,
|
|
25
|
+
}), calendar === 'month' && format(displayDate, 'yyyy', { locale }), calendar === 'year' && (jsxs(Fragment, { children: [format(makeYearsInterval(displayDate).start, 'yyyy', { locale }), ` – `, format(makeYearsInterval(displayDate).end, 'yyyy', { locale })] })), activeHeader && jsx(ChevronDownOutlinedSize16, { initial: "secondary", mode: "neutral" })] })) }), showControls && (jsx("div", { className: styles.control, children: showNextControl && goToNextPeriod && (jsx(Action, { icon: ChevronRightOutlinedSize24, mode: "secondary", style: "neutral", onClick: goToNextPeriod, "data-qa": "date-picker-next-control" })) }))] }) }));
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export { Header };
|
|
29
|
+
//# sourceMappingURL=Header.js.map
|
package/Header.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sources":["../src/Header.tsx"],"sourcesContent":["import { FC, Fragment } from 'react';\nimport classnames from 'classnames';\nimport { format } from 'date-fns';\n\nimport { useDisabled } from '@hh.ru/magritte-common-use-disabled';\nimport { Action } from '@hh.ru/magritte-ui-action';\nimport { DateType, Calendar, BaseDatePickerProps } from '@hh.ru/magritte-ui-date-picker/types';\nimport { makeYearsInterval } from '@hh.ru/magritte-ui-date-picker/utils';\nimport {\n ChevronLeftOutlinedSize24,\n ChevronRightOutlinedSize24,\n ChevronDownOutlinedSize16,\n} from '@hh.ru/magritte-ui-icon/icon';\n\nimport styles from './date-picker.less';\n\nexport const Header: FC<\n Pick<\n BaseDatePickerProps,\n 'activeHeader' | 'alignHeader' | 'headerMonthFormat' | 'locale' | 'showControls' | 'showHeaderDate'\n > & {\n calendar: Calendar;\n displayDate: DateType;\n goToNextPeriod?: VoidFunction;\n goToPrevPeriod?: VoidFunction;\n showNextControl?: boolean;\n showPrevControl?: boolean;\n switchCalendar?: VoidFunction;\n }\n> = ({\n calendar,\n displayDate,\n activeHeader: _activeHeader = true,\n alignHeader = 'center',\n goToNextPeriod,\n goToPrevPeriod,\n headerMonthFormat = 'mm',\n locale,\n showControls = true,\n showHeaderDate = true,\n showNextControl = true,\n showPrevControl = true,\n switchCalendar,\n}) => {\n const forceDisabled = useDisabled();\n const activeHeader = _activeHeader && !forceDisabled;\n\n if (!showControls && !showHeaderDate) {\n return null;\n }\n\n return (\n <div className={styles.headerWrapper}>\n <div className={styles.header} data-qa=\"date-picker-header\">\n {showControls && (\n <div className={styles.control}>\n {showPrevControl && goToPrevPeriod && (\n <Action\n icon={ChevronLeftOutlinedSize24}\n mode=\"secondary\"\n style=\"neutral\"\n onClick={goToPrevPeriod}\n data-qa=\"date-picker-prev-control\"\n />\n )}\n </div>\n )}\n <div\n className={classnames({\n [styles.headerDateWrapperCenter]: alignHeader === 'center',\n [styles.headerDateWrapperLeft]: alignHeader === 'left',\n })}\n >\n {showHeaderDate && (\n <button\n className={classnames(styles.headerDate, { [styles.headerDateActive]: activeHeader })}\n data-qa=\"date-picker-header-date\"\n disabled={!activeHeader}\n onClick={switchCalendar}\n >\n {calendar === 'day' &&\n format(displayDate, headerMonthFormat.endsWith('yyyy') ? 'LLLL yyyy' : 'LLLL', {\n locale,\n })}\n {calendar === 'month' && format(displayDate, 'yyyy', { locale })}\n {calendar === 'year' && (\n <Fragment>\n {format(makeYearsInterval(displayDate).start, 'yyyy', { locale })}\n {` – `}\n {format(makeYearsInterval(displayDate).end, 'yyyy', { locale })}\n </Fragment>\n )}\n {activeHeader && <ChevronDownOutlinedSize16 initial=\"secondary\" mode=\"neutral\" />}\n </button>\n )}\n </div>\n {showControls && (\n <div className={styles.control}>\n {showNextControl && goToNextPeriod && (\n <Action\n icon={ChevronRightOutlinedSize24}\n mode=\"secondary\"\n style=\"neutral\"\n onClick={goToNextPeriod}\n data-qa=\"date-picker-next-control\"\n />\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
interface InfiniteScrollProps<ItemType> {
|
|
3
|
+
initialRenderedItems: number;
|
|
4
|
+
/** Высота невидимой части айтема, при достижении которой нужно рендерить еще один айтем за ним */
|
|
5
|
+
invisibleThreshold: number;
|
|
6
|
+
/** Высота видимой части айтема, при достижении которой вызывается колбек onVisibleItemChange с этим айтемом в параметрах */
|
|
7
|
+
visibleThreshold: number;
|
|
8
|
+
makeItemFunc: (key: number) => ItemType;
|
|
9
|
+
renderItemFunc: (item: ItemType) => ReactElement;
|
|
10
|
+
onVisibleItemChange: (item: ItemType, key: number) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare const InfiniteScroll: <ItemType>({ initialRenderedItems, invisibleThreshold, visibleThreshold, makeItemFunc, renderItemFunc, onVisibleItemChange, }: InfiniteScrollProps<ItemType>) => ReactElement;
|
|
13
|
+
export {};
|