@automattic/date-range-picker 1.0.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/README.md +80 -0
- package/dist/cjs/button-stack.js +9 -0
- package/dist/cjs/button-stack.js.map +1 -0
- package/dist/cjs/date-inputs.js +37 -0
- package/dist/cjs/date-inputs.js.map +1 -0
- package/dist/cjs/date-range-content.js +194 -0
- package/dist/cjs/date-range-content.js.map +1 -0
- package/dist/cjs/date-range-picker.js +48 -0
- package/dist/cjs/date-range-picker.js.map +1 -0
- package/dist/cjs/datetime.js +56 -0
- package/dist/cjs/datetime.js.map +1 -0
- package/dist/cjs/index.js +16 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/presets-listbox.js +18 -0
- package/dist/cjs/presets-listbox.js.map +1 -0
- package/dist/cjs/utils.js +137 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/button-stack.js +6 -0
- package/dist/esm/button-stack.js.map +1 -0
- package/dist/esm/date-inputs.js +34 -0
- package/dist/esm/date-inputs.js.map +1 -0
- package/dist/esm/date-range-content.js +191 -0
- package/dist/esm/date-range-content.js.map +1 -0
- package/dist/esm/date-range-picker.js +45 -0
- package/dist/esm/date-range-picker.js.map +1 -0
- package/dist/esm/datetime.js +50 -0
- package/dist/esm/datetime.js.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/presets-listbox.js +15 -0
- package/dist/esm/presets-listbox.js.map +1 -0
- package/dist/esm/utils.js +130 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/tsconfig-cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/button-stack.d.ts +8 -0
- package/dist/types/button-stack.d.ts.map +1 -0
- package/dist/types/date-inputs.d.ts +21 -0
- package/dist/types/date-inputs.d.ts.map +1 -0
- package/dist/types/date-range-content.d.ts +39 -0
- package/dist/types/date-range-content.d.ts.map +1 -0
- package/dist/types/date-range-picker.d.ts +25 -0
- package/dist/types/date-range-picker.d.ts.map +1 -0
- package/dist/types/datetime.d.ts +15 -0
- package/dist/types/datetime.d.ts.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/presets-listbox.d.ts +12 -0
- package/dist/types/presets-listbox.d.ts.map +1 -0
- package/dist/types/utils.d.ts +40 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +71 -0
- package/src/button-stack.tsx +17 -0
- package/src/date-inputs.tsx +142 -0
- package/src/date-range-content.tsx +379 -0
- package/src/date-range-picker.tsx +197 -0
- package/src/datetime.ts +58 -0
- package/src/index.ts +11 -0
- package/src/presets-listbox.tsx +65 -0
- package/src/style.scss +72 -0
- package/src/test/date-range-picker.test.tsx +334 -0
- package/src/test/utils.test.ts +58 -0
- package/src/types.d.ts +1 -0
- package/src/utils.ts +174 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { __experimentalHStack as HStack } from '@wordpress/components';
|
|
2
|
+
import type { ComponentProps, ReactNode } from 'react';
|
|
3
|
+
type ButtonStackProps = {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
};
|
|
6
|
+
export declare function ButtonStack({ children, ...hStackProps }: ButtonStackProps & Omit<ComponentProps<typeof HStack>, 'spacing'>): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=button-stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-stack.d.ts","sourceRoot":"","sources":["../../src/button-stack.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,KAAK,gBAAgB,GAAG;IACvB,QAAQ,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,wBAAgB,WAAW,CAAE,EAC5B,QAAQ,EACR,GAAG,WAAW,EACd,EAAE,gBAAgB,GAAG,IAAI,CAAE,cAAc,CAAE,OAAO,MAAM,CAAE,EAAE,SAAS,CAAE,2CAMvE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FocusEvent } from 'react';
|
|
2
|
+
type DateInputsProps = {
|
|
3
|
+
fromStr: string;
|
|
4
|
+
toStr: string;
|
|
5
|
+
onFromChange: (v: string) => void;
|
|
6
|
+
onToChange: (v: string) => void;
|
|
7
|
+
todayStr: string;
|
|
8
|
+
minStr?: string;
|
|
9
|
+
fromStyle?: React.CSSProperties;
|
|
10
|
+
toStyle?: React.CSSProperties;
|
|
11
|
+
stack?: boolean;
|
|
12
|
+
justify?: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly';
|
|
13
|
+
containerStyle?: React.CSSProperties;
|
|
14
|
+
onFromFocus?: (e: FocusEvent<HTMLInputElement>) => void;
|
|
15
|
+
onToFocus?: (e: FocusEvent<HTMLInputElement>) => void;
|
|
16
|
+
onFromBlur?: (e: FocusEvent<HTMLInputElement>) => void;
|
|
17
|
+
onToBlur?: (e: FocusEvent<HTMLInputElement>) => void;
|
|
18
|
+
};
|
|
19
|
+
export declare function DateInputs({ fromStr, toStr, onFromChange, onToChange, todayStr, minStr, fromStyle, toStyle, stack, justify, containerStyle, onFromFocus, onToFocus, onFromBlur, onToBlur, }: DateInputsProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=date-inputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-inputs.d.ts","sourceRoot":"","sources":["../../src/date-inputs.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,KAAK,eAAe,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAE,CAAC,EAAE,MAAM,KAAM,IAAI,CAAC;IACpC,UAAU,EAAE,CAAE,CAAC,EAAE,MAAM,KAAM,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAChC,OAAO,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EACL,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,eAAe,GACf,cAAc,GACd,cAAc,CAAC;IAClB,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACrC,WAAW,CAAC,EAAE,CAAE,CAAC,EAAE,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;IAC5D,SAAS,CAAC,EAAE,CAAE,CAAC,EAAE,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;IAC1D,UAAU,CAAC,EAAE,CAAE,CAAC,EAAE,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;IAC3D,QAAQ,CAAC,EAAE,CAAE,CAAC,EAAE,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;CACzD,CAAC;AAEF,wBAAgB,UAAU,CAAE,EAC3B,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAAa,EACb,OAAsB,EACtB,cAAc,EACd,WAAW,EACX,SAAS,EACT,UAAU,EACV,QAAQ,GACR,EAAE,eAAe,2CA6FjB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { PresetId } from './utils';
|
|
2
|
+
type DateRangeContentProps = {
|
|
3
|
+
isSmall: boolean;
|
|
4
|
+
showTwoMonths?: boolean;
|
|
5
|
+
fromDraft?: Date;
|
|
6
|
+
toDraft?: Date;
|
|
7
|
+
fromStr: string;
|
|
8
|
+
toStr: string;
|
|
9
|
+
setFromDraft: (date?: Date) => void;
|
|
10
|
+
setToDraft: (date?: Date) => void;
|
|
11
|
+
setFromStr: (string: string) => void;
|
|
12
|
+
setToStr: (string: string) => void;
|
|
13
|
+
timezoneString?: string;
|
|
14
|
+
gmtOffset?: number;
|
|
15
|
+
onChange: (next: {
|
|
16
|
+
start: Date;
|
|
17
|
+
end: Date;
|
|
18
|
+
}) => void;
|
|
19
|
+
onClose?: () => void;
|
|
20
|
+
compositeActiveId: string | null;
|
|
21
|
+
setCompositeActiveId: (id: string | null) => void;
|
|
22
|
+
today: Date;
|
|
23
|
+
todayStr: string;
|
|
24
|
+
mobileLabelId: string;
|
|
25
|
+
desktopLabelId: string;
|
|
26
|
+
disableFuture?: boolean;
|
|
27
|
+
disabledBefore?: Date;
|
|
28
|
+
defaultFallbackPreset?: PresetId;
|
|
29
|
+
hiddenPresets?: PresetId[];
|
|
30
|
+
inputsProps?: {
|
|
31
|
+
onStartFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
32
|
+
onEndFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
33
|
+
onStartBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
34
|
+
onEndBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export declare function DateRangeContent(props: DateRangeContentProps): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=date-range-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-range-content.d.ts","sourceRoot":"","sources":["../../src/date-range-content.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAyC,QAAQ,EAAc,MAAM,SAAS,CAAC;AAEtF,KAAK,qBAAqB,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAE,IAAI,CAAC,EAAE,IAAI,KAAM,IAAI,CAAC;IACtC,UAAU,EAAE,CAAE,IAAI,CAAC,EAAE,IAAI,KAAM,IAAI,CAAC;IACpC,UAAU,EAAE,CAAE,MAAM,EAAE,MAAM,KAAM,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAE,MAAM,EAAE,MAAM,KAAM,IAAI,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,CAAE,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,KAAM,IAAI,CAAC;IACvD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,CAAE,EAAE,EAAE,MAAM,GAAG,IAAI,KAAM,IAAI,CAAC;IACpD,KAAK,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,qBAAqB,CAAC,EAAE,QAAQ,CAAC;IACjC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE;QACb,YAAY,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QACnE,UAAU,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QACjE,WAAW,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QAClE,SAAS,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;KAChE,CAAC;CACF,CAAC;AAEF,wBAAgB,gBAAgB,CAAE,KAAK,EAAE,qBAAqB,2CAyU7D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { PresetId } from './utils';
|
|
2
|
+
import './style.scss';
|
|
3
|
+
export type DateRangePickerProps = {
|
|
4
|
+
start: Date;
|
|
5
|
+
end: Date;
|
|
6
|
+
onChange: (next: {
|
|
7
|
+
start: Date;
|
|
8
|
+
end: Date;
|
|
9
|
+
}) => void;
|
|
10
|
+
timezoneString?: string;
|
|
11
|
+
gmtOffset?: number;
|
|
12
|
+
locale: string;
|
|
13
|
+
disableFuture?: boolean;
|
|
14
|
+
disabledBefore?: Date;
|
|
15
|
+
defaultFallbackPreset?: PresetId;
|
|
16
|
+
hiddenPresets?: PresetId[];
|
|
17
|
+
inputsProps?: {
|
|
18
|
+
onStartFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
19
|
+
onEndFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
20
|
+
onStartBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
21
|
+
onEndBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export declare function DateRangePicker({ start, end, onChange, gmtOffset, timezoneString, locale, disableFuture, disabledBefore, defaultFallbackPreset, hiddenPresets, inputsProps, }: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=date-range-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../src/date-range-picker.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAAG;IAClC,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;IACV,QAAQ,EAAE,CAAE,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,KAAM,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,qBAAqB,CAAC,EAAE,QAAQ,CAAC;IACjC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE;QACb,YAAY,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QACnE,UAAU,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QACjE,WAAW,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QAClE,SAAS,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;KAChE,CAAC;CACF,CAAC;AAEF,wBAAgB,eAAe,CAAE,EAChC,KAAK,EACL,GAAG,EACH,QAAQ,EACR,SAAS,EACT,cAAc,EACd,MAAM,EACN,aAAoB,EACpB,cAAc,EACd,qBAAqC,EACrC,aAAa,EACb,WAAW,GACX,EAAE,oBAAoB,2CAoEtB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function formatDate(date: Date, locale: string, formatOptions?: Intl.DateTimeFormatOptions): string;
|
|
2
|
+
/**
|
|
3
|
+
* Parse a date string in the format "YYYY-MM-DD" (local time).
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseYmdLocal(value: string): Date | null;
|
|
6
|
+
/**
|
|
7
|
+
* Format a date as a site calendar day (YYYY-MM-DD).
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatYmd(date: Date, timezoneString?: string, gmtOffset?: number): string;
|
|
10
|
+
/**
|
|
11
|
+
* Format a Date that already represents a site calendar day.
|
|
12
|
+
* This avoids reapplying timezone math to dates coming from the picker or URL.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatSiteYmd(date: Date): string;
|
|
15
|
+
//# sourceMappingURL=datetime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datetime.d.ts","sourceRoot":"","sources":["../../src/datetime.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,CACzB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,IAAI,CAAC,qBAA+C,UAMnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAE,KAAK,EAAE,MAAM,GAAI,IAAI,GAAG,IAAI,CAU1D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,UAYjF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAE,IAAI,EAAE,IAAI,UAKxC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { DateRangePicker } from './date-range-picker';
|
|
2
|
+
export type { DateRangePickerProps } from './date-range-picker';
|
|
3
|
+
export { computePresetRange, formatLabel, getActivePresetId, isLast7Days, presetDefs, } from './utils';
|
|
4
|
+
export type { PresetId } from './utils';
|
|
5
|
+
export { formatYmd, formatSiteYmd, parseYmdLocal } from './datetime';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EACN,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,UAAU,GACV,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PresetId } from './utils';
|
|
2
|
+
type PresetsListboxProps = {
|
|
3
|
+
labelId: string;
|
|
4
|
+
activePresetId?: PresetId;
|
|
5
|
+
onSelect: (id: PresetId) => void;
|
|
6
|
+
compositeActiveId: string | null;
|
|
7
|
+
setCompositeActiveId: (id: string | null) => void;
|
|
8
|
+
hiddenPresets?: PresetId[];
|
|
9
|
+
};
|
|
10
|
+
export declare function PresetsListbox({ labelId, activePresetId, onSelect, compositeActiveId, setCompositeActiveId, hiddenPresets, }: PresetsListboxProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=presets-listbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets-listbox.d.ts","sourceRoot":"","sources":["../../src/presets-listbox.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,KAAK,mBAAmB,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,QAAQ,CAAC;IAC1B,QAAQ,EAAE,CAAE,EAAE,EAAE,QAAQ,KAAM,IAAI,CAAC;IACnC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,CAAE,EAAE,EAAE,MAAM,GAAG,IAAI,KAAM,IAAI,CAAC;IACpD,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,cAAc,CAAE,EAC/B,OAAO,EACP,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,GACb,EAAE,mBAAmB,2CAsCrB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type PresetId = 'today' | 'yesterday' | 'last-7-days' | 'last-30-days' | 'last-90-days' | 'month-to-date' | 'last-12-months' | 'year-to-date' | 'last-3-years' | 'custom';
|
|
2
|
+
export declare const presetDefs: readonly [{
|
|
3
|
+
readonly id: "today";
|
|
4
|
+
readonly label: string;
|
|
5
|
+
}, {
|
|
6
|
+
readonly id: "yesterday";
|
|
7
|
+
readonly label: string;
|
|
8
|
+
}, {
|
|
9
|
+
readonly id: "last-7-days";
|
|
10
|
+
readonly label: string;
|
|
11
|
+
}, {
|
|
12
|
+
readonly id: "last-30-days";
|
|
13
|
+
readonly label: string;
|
|
14
|
+
}, {
|
|
15
|
+
readonly id: "last-90-days";
|
|
16
|
+
readonly label: string;
|
|
17
|
+
}, {
|
|
18
|
+
readonly id: "month-to-date";
|
|
19
|
+
readonly label: string;
|
|
20
|
+
}, {
|
|
21
|
+
readonly id: "last-12-months";
|
|
22
|
+
readonly label: string;
|
|
23
|
+
}, {
|
|
24
|
+
readonly id: "year-to-date";
|
|
25
|
+
readonly label: string;
|
|
26
|
+
}, {
|
|
27
|
+
readonly id: "last-3-years";
|
|
28
|
+
readonly label: string;
|
|
29
|
+
}];
|
|
30
|
+
export declare function computePresetRange(preset: PresetId, baseDate: Date): {
|
|
31
|
+
from: Date;
|
|
32
|
+
to: Date;
|
|
33
|
+
} | undefined;
|
|
34
|
+
export declare function getActivePresetId(from?: Date, to?: Date, baseDate?: Date): PresetId | undefined;
|
|
35
|
+
export declare function formatLabel(start: Date, end: Date, locale: string): string;
|
|
36
|
+
export declare function isLast7Days(range: {
|
|
37
|
+
start: Date;
|
|
38
|
+
end: Date;
|
|
39
|
+
}, timezoneString?: string, gmtOffset?: number): boolean;
|
|
40
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,QAAQ,GACjB,OAAO,GACP,WAAW,GACX,aAAa,GACb,cAAc,GACd,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,cAAc,GACd,cAAc,GACd,QAAQ,CAAC;AAEZ,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUmE,CAAC;AAE3F,wBAAgB,kBAAkB,CAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI;;;cA0BnE;AAED,wBAAgB,iBAAiB,CAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,GAAI,QAAQ,GAAG,SAAS,CAiEjG;AAGD,wBAAgB,WAAW,CAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAOlE;AAGD,wBAAgB,WAAW,CAC1B,KAAK,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,EACjC,cAAc,CAAC,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAKT"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@automattic/date-range-picker",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A date-range picker built on top of @automattic/ui's DateRangeCalendar, with timezone-aware site-day handling, preset shortcuts, and accessible inputs.",
|
|
5
|
+
"homepage": "https://github.com/Automattic/wp-calypso",
|
|
6
|
+
"license": "GPL-2.0-or-later",
|
|
7
|
+
"author": "Automattic Inc.",
|
|
8
|
+
"main": "dist/cjs/index.js",
|
|
9
|
+
"module": "dist/esm/index.js",
|
|
10
|
+
"calypso:src": "src/index.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"calypso:src": "./src/index.ts",
|
|
14
|
+
"types": "./dist/types/index.d.ts",
|
|
15
|
+
"import": "./dist/esm/index.js",
|
|
16
|
+
"require": "./dist/cjs/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./src/*": {
|
|
19
|
+
"calypso:src": "./src/*"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"sideEffects": [
|
|
23
|
+
"*.css",
|
|
24
|
+
"*.scss"
|
|
25
|
+
],
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "git+https://github.com/Automattic/wp-calypso.git",
|
|
29
|
+
"directory": "packages/date-range-picker"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"bugs": "https://github.com/Automattic/wp-calypso/issues",
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"src"
|
|
38
|
+
],
|
|
39
|
+
"types": "dist/types",
|
|
40
|
+
"scripts": {
|
|
41
|
+
"clean": "tsc --build ./tsconfig.json ./tsconfig-cjs.json --clean && rm -rf dist",
|
|
42
|
+
"build": "tsc --build ./tsconfig.json ./tsconfig-cjs.json",
|
|
43
|
+
"prepack": "yarn run clean && yarn run build"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@automattic/ui": "^1.0.2",
|
|
47
|
+
"@wordpress/base-styles": "^5.23.0",
|
|
48
|
+
"@wordpress/components": "^32.1.0",
|
|
49
|
+
"@wordpress/compose": "7.23.0",
|
|
50
|
+
"@wordpress/date": "5.23.0",
|
|
51
|
+
"@wordpress/i18n": "^5.23.0",
|
|
52
|
+
"@wordpress/icons": "^10.23.0",
|
|
53
|
+
"date-fns": "^4.1.0",
|
|
54
|
+
"tslib": "^2.8.1"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"react": "^18.3.1",
|
|
58
|
+
"react-dom": "^18.3.1"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@automattic/calypso-typescript-config": "^1.0.0",
|
|
62
|
+
"@testing-library/dom": "^10.4.1",
|
|
63
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
64
|
+
"@testing-library/react": "^16.3.0",
|
|
65
|
+
"@testing-library/user-event": "^14.6.1",
|
|
66
|
+
"@types/react": "^18.3.18",
|
|
67
|
+
"jest": "^29.7.0",
|
|
68
|
+
"mockdate": "^2.0.5",
|
|
69
|
+
"typescript": "^5.8.3"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { __experimentalHStack as HStack } from '@wordpress/components';
|
|
2
|
+
import type { ComponentProps, ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
type ButtonStackProps = {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export function ButtonStack( {
|
|
9
|
+
children,
|
|
10
|
+
...hStackProps
|
|
11
|
+
}: ButtonStackProps & Omit< ComponentProps< typeof HStack >, 'spacing' > ) {
|
|
12
|
+
return (
|
|
13
|
+
<HStack { ...hStackProps } spacing={ 3 }>
|
|
14
|
+
{ children }
|
|
15
|
+
</HStack>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__experimentalHStack as HStack,
|
|
3
|
+
__experimentalVStack as VStack,
|
|
4
|
+
__experimentalInputControl as InputControl,
|
|
5
|
+
} from '@wordpress/components';
|
|
6
|
+
import { __ } from '@wordpress/i18n';
|
|
7
|
+
import type { FocusEvent } from 'react';
|
|
8
|
+
|
|
9
|
+
type DateInputsProps = {
|
|
10
|
+
fromStr: string;
|
|
11
|
+
toStr: string;
|
|
12
|
+
onFromChange: ( v: string ) => void;
|
|
13
|
+
onToChange: ( v: string ) => void;
|
|
14
|
+
todayStr: string;
|
|
15
|
+
minStr?: string;
|
|
16
|
+
fromStyle?: React.CSSProperties;
|
|
17
|
+
toStyle?: React.CSSProperties;
|
|
18
|
+
stack?: boolean;
|
|
19
|
+
justify?:
|
|
20
|
+
| 'flex-start'
|
|
21
|
+
| 'flex-end'
|
|
22
|
+
| 'center'
|
|
23
|
+
| 'space-between'
|
|
24
|
+
| 'space-around'
|
|
25
|
+
| 'space-evenly';
|
|
26
|
+
containerStyle?: React.CSSProperties;
|
|
27
|
+
onFromFocus?: ( e: FocusEvent< HTMLInputElement > ) => void;
|
|
28
|
+
onToFocus?: ( e: FocusEvent< HTMLInputElement > ) => void;
|
|
29
|
+
onFromBlur?: ( e: FocusEvent< HTMLInputElement > ) => void;
|
|
30
|
+
onToBlur?: ( e: FocusEvent< HTMLInputElement > ) => void;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export function DateInputs( {
|
|
34
|
+
fromStr,
|
|
35
|
+
toStr,
|
|
36
|
+
onFromChange,
|
|
37
|
+
onToChange,
|
|
38
|
+
todayStr,
|
|
39
|
+
minStr,
|
|
40
|
+
fromStyle,
|
|
41
|
+
toStyle,
|
|
42
|
+
stack = false,
|
|
43
|
+
justify = 'flex-start',
|
|
44
|
+
containerStyle,
|
|
45
|
+
onFromFocus,
|
|
46
|
+
onToFocus,
|
|
47
|
+
onFromBlur,
|
|
48
|
+
onToBlur,
|
|
49
|
+
}: DateInputsProps ) {
|
|
50
|
+
if ( stack ) {
|
|
51
|
+
return (
|
|
52
|
+
<VStack as="div" spacing={ 2 } className="daterange-inputs" style={ containerStyle }>
|
|
53
|
+
<InputControl
|
|
54
|
+
type="date"
|
|
55
|
+
label={ __( 'Start date' ) }
|
|
56
|
+
value={ fromStr }
|
|
57
|
+
onFocus={ ( e: FocusEvent< HTMLInputElement > ) => {
|
|
58
|
+
onFromFocus?.( e );
|
|
59
|
+
} }
|
|
60
|
+
onBlur={ ( e: FocusEvent< HTMLInputElement > ) => {
|
|
61
|
+
onFromBlur?.( e );
|
|
62
|
+
} }
|
|
63
|
+
onChange={ ( value?: string ) => {
|
|
64
|
+
onFromChange( value ?? '' );
|
|
65
|
+
} }
|
|
66
|
+
autoComplete="off"
|
|
67
|
+
min={ minStr }
|
|
68
|
+
max={ toStr || todayStr }
|
|
69
|
+
style={ { width: '100%', ...( fromStyle || {} ) } }
|
|
70
|
+
__next40pxDefaultSize
|
|
71
|
+
/>
|
|
72
|
+
<InputControl
|
|
73
|
+
type="date"
|
|
74
|
+
label={ __( 'End date' ) }
|
|
75
|
+
value={ toStr }
|
|
76
|
+
onFocus={ ( e: FocusEvent< HTMLInputElement > ) => {
|
|
77
|
+
onToFocus?.( e );
|
|
78
|
+
} }
|
|
79
|
+
onBlur={ ( e: FocusEvent< HTMLInputElement > ) => {
|
|
80
|
+
onToBlur?.( e );
|
|
81
|
+
} }
|
|
82
|
+
onChange={ ( value?: string ) => {
|
|
83
|
+
onToChange( value ?? '' );
|
|
84
|
+
} }
|
|
85
|
+
autoComplete="off"
|
|
86
|
+
min={ fromStr || minStr }
|
|
87
|
+
style={ { width: '100%', ...( toStyle || {} ) } }
|
|
88
|
+
__next40pxDefaultSize
|
|
89
|
+
/>
|
|
90
|
+
</VStack>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<HStack
|
|
96
|
+
as="div"
|
|
97
|
+
spacing={ 8 }
|
|
98
|
+
justify={ justify }
|
|
99
|
+
className="daterange-inputs"
|
|
100
|
+
wrap={ false }
|
|
101
|
+
style={ containerStyle }
|
|
102
|
+
>
|
|
103
|
+
<InputControl
|
|
104
|
+
type="date"
|
|
105
|
+
label={ __( 'Start date' ) }
|
|
106
|
+
value={ fromStr }
|
|
107
|
+
onFocus={ ( e: FocusEvent< HTMLInputElement > ) => {
|
|
108
|
+
onFromFocus?.( e );
|
|
109
|
+
} }
|
|
110
|
+
onBlur={ ( e: FocusEvent< HTMLInputElement > ) => {
|
|
111
|
+
onFromBlur?.( e );
|
|
112
|
+
} }
|
|
113
|
+
onChange={ ( value?: string ) => {
|
|
114
|
+
onFromChange( value ?? '' );
|
|
115
|
+
} }
|
|
116
|
+
autoComplete="off"
|
|
117
|
+
min={ minStr }
|
|
118
|
+
max={ toStr || todayStr }
|
|
119
|
+
style={ fromStyle }
|
|
120
|
+
__next40pxDefaultSize
|
|
121
|
+
/>
|
|
122
|
+
<InputControl
|
|
123
|
+
type="date"
|
|
124
|
+
label={ __( 'End date' ) }
|
|
125
|
+
value={ toStr }
|
|
126
|
+
onFocus={ ( e: FocusEvent< HTMLInputElement > ) => {
|
|
127
|
+
onToFocus?.( e );
|
|
128
|
+
} }
|
|
129
|
+
onBlur={ ( e: FocusEvent< HTMLInputElement > ) => {
|
|
130
|
+
onToBlur?.( e );
|
|
131
|
+
} }
|
|
132
|
+
onChange={ ( value?: string ) => {
|
|
133
|
+
onToChange( value ?? '' );
|
|
134
|
+
} }
|
|
135
|
+
autoComplete="off"
|
|
136
|
+
min={ fromStr || minStr }
|
|
137
|
+
style={ toStyle }
|
|
138
|
+
__next40pxDefaultSize
|
|
139
|
+
/>
|
|
140
|
+
</HStack>
|
|
141
|
+
);
|
|
142
|
+
}
|