@tcn/ui-time-selector 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/dist/components/date_range_panel/date_range_panel.d.ts +13 -0
- package/dist/components/date_range_panel/date_range_panel.d.ts.map +1 -0
- package/dist/components/date_range_panel/date_range_panel.js +71 -0
- package/dist/components/date_range_panel/date_range_panel.js.map +1 -0
- package/dist/components/date_range_panel/date_range_panel_presenter.d.ts +14 -0
- package/dist/components/date_range_panel/date_range_panel_presenter.d.ts.map +1 -0
- package/dist/components/date_range_panel/date_range_panel_presenter.js +24 -0
- package/dist/components/date_range_panel/date_range_panel_presenter.js.map +1 -0
- package/dist/components/preset_panel/preset_panel.d.ts +11 -0
- package/dist/components/preset_panel/preset_panel.d.ts.map +1 -0
- package/dist/components/preset_panel/preset_panel.js +52 -0
- package/dist/components/preset_panel/preset_panel.js.map +1 -0
- package/dist/components/preset_panel/preset_panel_presenter.d.ts +24 -0
- package/dist/components/preset_panel/preset_panel_presenter.d.ts.map +1 -0
- package/dist/components/preset_panel/preset_panel_presenter.js +39 -0
- package/dist/components/preset_panel/preset_panel_presenter.js.map +1 -0
- package/dist/components/time_selector/time_selector.d.ts +12 -0
- package/dist/components/time_selector/time_selector.d.ts.map +1 -0
- package/dist/components/time_selector/time_selector.js +105 -0
- package/dist/components/time_selector/time_selector.js.map +1 -0
- package/dist/components/time_selector/time_selector_presenter.d.ts +28 -0
- package/dist/components/time_selector/time_selector_presenter.d.ts.map +1 -0
- package/dist/components/time_selector/time_selector_presenter.js +66 -0
- package/dist/components/time_selector/time_selector_presenter.js.map +1 -0
- package/dist/components/timezone_footer/timezone_footer.d.ts +9 -0
- package/dist/components/timezone_footer/timezone_footer.d.ts.map +1 -0
- package/dist/components/timezone_footer/timezone_footer.js +78 -0
- package/dist/components/timezone_footer/timezone_footer.js.map +1 -0
- package/dist/components/timezone_footer/timezone_footer_presenter.d.ts +23 -0
- package/dist/components/timezone_footer/timezone_footer_presenter.d.ts.map +1 -0
- package/dist/components/timezone_footer/timezone_footer_presenter.js +56 -0
- package/dist/components/timezone_footer/timezone_footer_presenter.js.map +1 -0
- package/dist/components/utils.d.ts +32 -0
- package/dist/components/utils.d.ts.map +1 -0
- package/dist/components/utils.js +62 -0
- package/dist/components/utils.js.map +1 -0
- package/dist/date_range_panel.css +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/preset_panel.css +1 -0
- package/dist/time_selector.css +1 -0
- package/dist/timezone_footer.css +1 -0
- package/package.json +72 -0
- package/src/__stories__/time_selector.stories.tsx +99 -0
- package/src/components/date_range_panel/date_range_panel.module.css +31 -0
- package/src/components/date_range_panel/date_range_panel.tsx +87 -0
- package/src/components/date_range_panel/date_range_panel_presenter.ts +35 -0
- package/src/components/preset_panel/preset_panel.module.css +35 -0
- package/src/components/preset_panel/preset_panel.tsx +74 -0
- package/src/components/preset_panel/preset_panel_presenter.ts +68 -0
- package/src/components/time_selector/time_selector.module.css +27 -0
- package/src/components/time_selector/time_selector.tsx +100 -0
- package/src/components/time_selector/time_selector_presenter.ts +116 -0
- package/src/components/timezone_footer/timezone_footer.module.css +28 -0
- package/src/components/timezone_footer/timezone_footer.tsx +109 -0
- package/src/components/timezone_footer/timezone_footer_presenter.ts +83 -0
- package/src/components/utils.ts +95 -0
- package/src/index.ts +5 -0
- package/tsconfig.json +7 -0
- package/types/file_types.d.ts +54 -0
- package/types/react_color.d.ts +61 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DateRangePanelPresenter } from './date_range_panel_presenter.js';
|
|
2
|
+
export interface DateRangePanelOwnProps {
|
|
3
|
+
presenter: DateRangePanelPresenter;
|
|
4
|
+
focused: boolean;
|
|
5
|
+
startDateMin?: Date | null;
|
|
6
|
+
startDateMax?: Date | null;
|
|
7
|
+
endDateMin?: Date | null;
|
|
8
|
+
endDateMax?: Date | null;
|
|
9
|
+
onApply: () => void;
|
|
10
|
+
}
|
|
11
|
+
export type DateRangePanelProps = DateRangePanelOwnProps;
|
|
12
|
+
export declare function DateRangePanel({ presenter, focused, startDateMin, startDateMax, endDateMin, endDateMax, onApply, }: DateRangePanelProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=date_range_panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date_range_panel.d.ts","sourceRoot":"","sources":["../../../src/components/date_range_panel/date_range_panel.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,uBAAuB,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AAEzD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,GACR,EAAE,mBAAmB,2CAwDrB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsxs as i, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { useSignalValue as l } from "@tcn/state";
|
|
3
|
+
import { VStack as r, Spacer as y } from "@tcn/ui/stacks";
|
|
4
|
+
import { BodyText as s } from "@tcn/ui/typography";
|
|
5
|
+
import { DatePickerInput as d } from "@tcn/ui/inputs";
|
|
6
|
+
import { Button as _ } from "@tcn/ui/actions";
|
|
7
|
+
import { useRef as g, useEffect as P } from "react";
|
|
8
|
+
import { IteratorIcon as x } from "@tcn/icons/iterator_icon.js";
|
|
9
|
+
import '../../date_range_panel.css';const N = "_date-picker-panel_1e6c441", v = "_date-picker-panel-title_bc33101", w = "_date-picker-section_90f5c3a", S = "_date-picker-label_113ebb5", T = "_apply_05ed9af", a = { "date-picker-panel": N, "date-picker-panel-title": v, "date-picker-section": w, "date-picker-label": S, apply: T };
|
|
10
|
+
function V({
|
|
11
|
+
presenter: t,
|
|
12
|
+
focused: o,
|
|
13
|
+
startDateMin: p,
|
|
14
|
+
startDateMax: m,
|
|
15
|
+
endDateMin: h,
|
|
16
|
+
endDateMax: k,
|
|
17
|
+
onApply: f
|
|
18
|
+
}) {
|
|
19
|
+
const n = g(null), u = l(t.startDate.broadcast), b = l(t.endDate.broadcast), D = l(t.broadcasts.isApplyDisabled);
|
|
20
|
+
return P(() => {
|
|
21
|
+
o && n.current?.focus();
|
|
22
|
+
}, [o]), /* @__PURE__ */ i(r, { className: a["date-picker-panel"], height: "auto", children: [
|
|
23
|
+
/* @__PURE__ */ e(s, { className: a["date-picker-panel-title"], selectable: !1, children: "Absolute time range" }),
|
|
24
|
+
/* @__PURE__ */ i(r, { className: a["date-picker-section"], height: "auto", width: "auto", children: [
|
|
25
|
+
/* @__PURE__ */ e(s, { className: a["date-picker-label"], selectable: !1, children: "From" }),
|
|
26
|
+
/* @__PURE__ */ e(
|
|
27
|
+
d,
|
|
28
|
+
{
|
|
29
|
+
ref: n,
|
|
30
|
+
showTime: !0,
|
|
31
|
+
value: u,
|
|
32
|
+
onChange: (c) => t.setStartDate(c),
|
|
33
|
+
min: p ?? void 0,
|
|
34
|
+
max: m ?? void 0
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
] }),
|
|
38
|
+
/* @__PURE__ */ i(r, { className: a["date-picker-section"], height: "auto", width: "auto", children: [
|
|
39
|
+
/* @__PURE__ */ e(s, { className: a["date-picker-label"], selectable: !1, children: "To" }),
|
|
40
|
+
/* @__PURE__ */ e(
|
|
41
|
+
d,
|
|
42
|
+
{
|
|
43
|
+
showTime: !0,
|
|
44
|
+
value: b,
|
|
45
|
+
onChange: (c) => t.setEndDate(c),
|
|
46
|
+
min: h ?? void 0,
|
|
47
|
+
max: k ?? void 0
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
] }),
|
|
51
|
+
/* @__PURE__ */ i(
|
|
52
|
+
_,
|
|
53
|
+
{
|
|
54
|
+
size: "sm",
|
|
55
|
+
hierarchy: "primary",
|
|
56
|
+
disabled: D,
|
|
57
|
+
onClick: f,
|
|
58
|
+
className: a.apply,
|
|
59
|
+
children: [
|
|
60
|
+
"Apply time range",
|
|
61
|
+
/* @__PURE__ */ e(y, { width: "8px" }),
|
|
62
|
+
/* @__PURE__ */ e(x, { size: "sm" })
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
] });
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
V as DateRangePanel
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=date_range_panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date_range_panel.js","sources":["../../../src/components/date_range_panel/date_range_panel.tsx"],"sourcesContent":["import { useSignalValue } from '@tcn/state';\nimport { Spacer, VStack } from '@tcn/ui/stacks';\nimport { BodyText } from '@tcn/ui/typography';\nimport { DatePickerInput } from '@tcn/ui/inputs';\nimport { Button } from '@tcn/ui/actions';\nimport { useEffect, useRef } from 'react';\nimport { IteratorIcon } from '@tcn/icons/iterator_icon.js';\nimport { DateRangePanelPresenter } from './date_range_panel_presenter.js';\nimport styles from './date_range_panel.module.css';\n\nexport interface DateRangePanelOwnProps {\n presenter: DateRangePanelPresenter;\n focused: boolean;\n startDateMin?: Date | null;\n startDateMax?: Date | null;\n endDateMin?: Date | null;\n endDateMax?: Date | null;\n onApply: () => void;\n}\n\nexport type DateRangePanelProps = DateRangePanelOwnProps;\n\nexport function DateRangePanel({\n presenter,\n focused,\n startDateMin,\n startDateMax,\n endDateMin,\n endDateMax,\n onApply,\n}: DateRangePanelProps) {\n const startDateRef = useRef<HTMLButtonElement>(null);\n\n const startDate = useSignalValue(presenter.startDate.broadcast);\n const endDate = useSignalValue(presenter.endDate.broadcast);\n const isApplyDisabled = useSignalValue(presenter.broadcasts.isApplyDisabled);\n\n useEffect(() => {\n if (focused) {\n startDateRef.current?.focus();\n }\n }, [focused]);\n\n return (\n <VStack className={styles['date-picker-panel']} height=\"auto\">\n <BodyText className={styles['date-picker-panel-title']} selectable={false}>\n Absolute time range\n </BodyText>\n <VStack className={styles['date-picker-section']} height=\"auto\" width=\"auto\">\n <BodyText className={styles['date-picker-label']} selectable={false}>\n From\n </BodyText>\n <DatePickerInput\n ref={startDateRef}\n showTime\n value={startDate}\n onChange={(date: Date | null) => presenter.setStartDate(date)}\n min={startDateMin ?? undefined}\n max={startDateMax ?? undefined}\n />\n </VStack>\n <VStack className={styles['date-picker-section']} height=\"auto\" width=\"auto\">\n <BodyText className={styles['date-picker-label']} selectable={false}>\n To\n </BodyText>\n <DatePickerInput\n showTime\n value={endDate}\n onChange={(date: Date | null) => presenter.setEndDate(date)}\n min={endDateMin ?? undefined}\n max={endDateMax ?? undefined}\n />\n </VStack>\n <Button\n size=\"sm\"\n hierarchy=\"primary\"\n disabled={isApplyDisabled}\n onClick={onApply}\n className={styles['apply']}\n >\n Apply time range\n <Spacer width=\"8px\" />\n <IteratorIcon size=\"sm\" />\n </Button>\n </VStack>\n );\n}\n"],"names":["DateRangePanel","presenter","focused","startDateMin","startDateMax","endDateMin","endDateMax","onApply","startDateRef","useRef","startDate","useSignalValue","endDate","isApplyDisabled","useEffect","VStack","styles","jsx","BodyText","jsxs","DatePickerInput","date","Button","Spacer","IteratorIcon"],"mappings":";;;;;;;;;AAsBO,SAASA,EAAe;AAAA,EAC7B,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC;AACF,GAAwB;AACtB,QAAMC,IAAeC,EAA0B,IAAI,GAE7CC,IAAYC,EAAeV,EAAU,UAAU,SAAS,GACxDW,IAAUD,EAAeV,EAAU,QAAQ,SAAS,GACpDY,IAAkBF,EAAeV,EAAU,WAAW,eAAe;AAE3E,SAAAa,EAAU,MAAM;AACd,IAAIZ,KACFM,EAAa,SAAS,MAAA;AAAA,EAE1B,GAAG,CAACN,CAAO,CAAC,qBAGTa,GAAA,EAAO,WAAWC,EAAO,mBAAmB,GAAG,QAAO,QACrD,UAAA;AAAA,IAAA,gBAAAC,EAACC,KAAS,WAAWF,EAAO,yBAAyB,GAAG,YAAY,IAAO,UAAA,uBAE3E;AAAA,IACA,gBAAAG,EAACJ,KAAO,WAAWC,EAAO,qBAAqB,GAAG,QAAO,QAAO,OAAM,QACpE,UAAA;AAAA,MAAA,gBAAAC,EAACC,KAAS,WAAWF,EAAO,mBAAmB,GAAG,YAAY,IAAO,UAAA,QAErE;AAAA,MACA,gBAAAC;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,KAAKZ;AAAA,UACL,UAAQ;AAAA,UACR,OAAOE;AAAA,UACP,UAAU,CAACW,MAAsBpB,EAAU,aAAaoB,CAAI;AAAA,UAC5D,KAAKlB,KAAgB;AAAA,UACrB,KAAKC,KAAgB;AAAA,QAAA;AAAA,MAAA;AAAA,IACvB,GACF;AAAA,IACA,gBAAAe,EAACJ,KAAO,WAAWC,EAAO,qBAAqB,GAAG,QAAO,QAAO,OAAM,QACpE,UAAA;AAAA,MAAA,gBAAAC,EAACC,KAAS,WAAWF,EAAO,mBAAmB,GAAG,YAAY,IAAO,UAAA,MAErE;AAAA,MACA,gBAAAC;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,UAAQ;AAAA,UACR,OAAOR;AAAA,UACP,UAAU,CAACS,MAAsBpB,EAAU,WAAWoB,CAAI;AAAA,UAC1D,KAAKhB,KAAc;AAAA,UACnB,KAAKC,KAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IACrB,GACF;AAAA,IACA,gBAAAa;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,UAAUT;AAAA,QACV,SAASN;AAAA,QACT,WAAWS,EAAO;AAAA,QACnB,UAAA;AAAA,UAAA;AAAA,UAEC,gBAAAC,EAACM,GAAA,EAAO,OAAM,MAAA,CAAM;AAAA,UACpB,gBAAAN,EAACO,GAAA,EAAa,MAAK,KAAA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAC1B,GACF;AAEJ;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Signal } from '@tcn/state';
|
|
2
|
+
export declare class DateRangePanelPresenter {
|
|
3
|
+
readonly startDate: Signal<Date | null>;
|
|
4
|
+
readonly endDate: Signal<Date | null>;
|
|
5
|
+
private _isApplyDisabled;
|
|
6
|
+
readonly broadcasts: {
|
|
7
|
+
isApplyDisabled: Signal<boolean>['broadcast'];
|
|
8
|
+
};
|
|
9
|
+
constructor(startDate: Signal<Date | null>, endDate: Signal<Date | null>);
|
|
10
|
+
private _updateApplyDisabled;
|
|
11
|
+
setStartDate(date: Date | null): void;
|
|
12
|
+
setEndDate(date: Date | null): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=date_range_panel_presenter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date_range_panel_presenter.d.ts","sourceRoot":"","sources":["../../../src/components/date_range_panel/date_range_panel_presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,qBAAa,uBAAuB;IAQhC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IARvC,OAAO,CAAC,gBAAgB,CAA8B;IAEtD,QAAQ,CAAC,UAAU,EAAE;QACnB,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;KAC/C,CAAC;gBAGS,SAAS,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,EAC9B,OAAO,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IAQvC,OAAO,CAAC,oBAAoB;IAM5B,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAK9B,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAI7B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Signal as e } from "@tcn/state";
|
|
2
|
+
class l {
|
|
3
|
+
constructor(t, s) {
|
|
4
|
+
this.startDate = t, this.endDate = s, this.broadcasts = {
|
|
5
|
+
isApplyDisabled: this._isApplyDisabled.broadcast
|
|
6
|
+
}, this._updateApplyDisabled();
|
|
7
|
+
}
|
|
8
|
+
_isApplyDisabled = new e(!1);
|
|
9
|
+
broadcasts;
|
|
10
|
+
_updateApplyDisabled() {
|
|
11
|
+
const t = this.startDate.get(), s = this.endDate.get();
|
|
12
|
+
this._isApplyDisabled.set(t == null || s == null || s <= t);
|
|
13
|
+
}
|
|
14
|
+
setStartDate(t) {
|
|
15
|
+
this.startDate.set(t), this._updateApplyDisabled();
|
|
16
|
+
}
|
|
17
|
+
setEndDate(t) {
|
|
18
|
+
this.endDate.set(t), this._updateApplyDisabled();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
l as DateRangePanelPresenter
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=date_range_panel_presenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date_range_panel_presenter.js","sources":["../../../src/components/date_range_panel/date_range_panel_presenter.ts"],"sourcesContent":["import { Signal } from '@tcn/state';\n\nexport class DateRangePanelPresenter {\n private _isApplyDisabled = new Signal<boolean>(false);\n\n readonly broadcasts: {\n isApplyDisabled: Signal<boolean>['broadcast'];\n };\n\n constructor(\n readonly startDate: Signal<Date | null>,\n readonly endDate: Signal<Date | null>\n ) {\n this.broadcasts = {\n isApplyDisabled: this._isApplyDisabled.broadcast,\n };\n this._updateApplyDisabled();\n }\n\n private _updateApplyDisabled() {\n const start = this.startDate.get();\n const end = this.endDate.get();\n this._isApplyDisabled.set(start == null || end == null || end <= start);\n }\n\n setStartDate(date: Date | null) {\n this.startDate.set(date);\n this._updateApplyDisabled();\n }\n\n setEndDate(date: Date | null) {\n this.endDate.set(date);\n this._updateApplyDisabled();\n }\n}\n"],"names":["DateRangePanelPresenter","startDate","endDate","Signal","start","end","date"],"mappings":";AAEO,MAAMA,EAAwB;AAAA,EAOnC,YACWC,GACAC,GACT;AAFS,SAAA,YAAAD,GACA,KAAA,UAAAC,GAET,KAAK,aAAa;AAAA,MAChB,iBAAiB,KAAK,iBAAiB;AAAA,IAAA,GAEzC,KAAK,qBAAA;AAAA,EACP;AAAA,EAdQ,mBAAmB,IAAIC,EAAgB,EAAK;AAAA,EAE3C;AAAA,EAcD,uBAAuB;AAC7B,UAAMC,IAAQ,KAAK,UAAU,IAAA,GACvBC,IAAM,KAAK,QAAQ,IAAA;AACzB,SAAK,iBAAiB,IAAID,KAAS,QAAQC,KAAO,QAAQA,KAAOD,CAAK;AAAA,EACxE;AAAA,EAEA,aAAaE,GAAmB;AAC9B,SAAK,UAAU,IAAIA,CAAI,GACvB,KAAK,qBAAA;AAAA,EACP;AAAA,EAEA,WAAWA,GAAmB;AAC5B,SAAK,QAAQ,IAAIA,CAAI,GACrB,KAAK,qBAAA;AAAA,EACP;AACF;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PresetItem } from '../utils.js';
|
|
2
|
+
import { PresetPanelPresenter } from './preset_panel_presenter.js';
|
|
3
|
+
export interface PresetPanelOwnProps {
|
|
4
|
+
presenter: PresetPanelPresenter;
|
|
5
|
+
selectedPreset: PresetItem | null;
|
|
6
|
+
focused: boolean;
|
|
7
|
+
onSelect: (item: PresetItem) => void;
|
|
8
|
+
}
|
|
9
|
+
export type PresetPanelProps = PresetPanelOwnProps;
|
|
10
|
+
export declare function PresetPanel({ presenter, selectedPreset, focused, onSelect, }: PresetPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=preset_panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset_panel.d.ts","sourceRoot":"","sources":["../../../src/components/preset_panel/preset_panel.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,oBAAoB,CAAC;IAChC,cAAc,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEnD,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,OAAO,EACP,QAAQ,GACT,EAAE,gBAAgB,2CAkDlB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsxs as b, jsx as l } from "react/jsx-runtime";
|
|
2
|
+
import { useSignalValue as c } from "@tcn/state";
|
|
3
|
+
import { VStack as f, HStack as I } from "@tcn/ui/stacks";
|
|
4
|
+
import { BodyText as _ } from "@tcn/ui/typography";
|
|
5
|
+
import { Input as x } from "@tcn/ui/inputs";
|
|
6
|
+
import { useRef as m, useEffect as d } from "react";
|
|
7
|
+
import '../../preset_panel.css';const k = "_presets-panel_7e3238f", y = "_preset-search_113ae3a", S = "_preset-list_191d980", w = "_preset-item_aa39cec", r = { "presets-panel": k, "preset-search": y, "preset-list": S, "preset-item": w };
|
|
8
|
+
function C({
|
|
9
|
+
presenter: s,
|
|
10
|
+
selectedPreset: n,
|
|
11
|
+
focused: o,
|
|
12
|
+
onSelect: i
|
|
13
|
+
}) {
|
|
14
|
+
const h = m(null), p = m(null), u = c(s.broadcasts.search), g = c(s.broadcasts.filteredItems), a = c(s.broadcasts.highlightedIndex);
|
|
15
|
+
return d(() => {
|
|
16
|
+
o && h.current?.focus();
|
|
17
|
+
}, [o]), d(() => {
|
|
18
|
+
const e = p.current;
|
|
19
|
+
if (e == null) return;
|
|
20
|
+
e.children[a]?.scrollIntoView({ block: "nearest" });
|
|
21
|
+
}, [a]), /* @__PURE__ */ b(f, { className: r["presets-panel"], height: "auto", children: [
|
|
22
|
+
/* @__PURE__ */ l(
|
|
23
|
+
x,
|
|
24
|
+
{
|
|
25
|
+
ref: h,
|
|
26
|
+
className: r["preset-search"],
|
|
27
|
+
value: u,
|
|
28
|
+
onChange: (e) => s.setSearch(e),
|
|
29
|
+
placeholder: "Search quick ranges",
|
|
30
|
+
onKeyDown: (e) => {
|
|
31
|
+
const t = s.handleKeyDown(e.key);
|
|
32
|
+
t.preventDefault && e.preventDefault(), t.selectedItem != null && i(t.selectedItem);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ l(f, { ref: p, className: r["preset-list"], height: "290px", width: "100%", children: g.map((e, t) => /* @__PURE__ */ l(
|
|
37
|
+
I,
|
|
38
|
+
{
|
|
39
|
+
className: r["preset-item"],
|
|
40
|
+
"data-selected": n != null && e.label === n.label,
|
|
41
|
+
"data-highlighted": t === a,
|
|
42
|
+
onClick: () => i(e),
|
|
43
|
+
children: /* @__PURE__ */ l(_, { selectable: !1, children: e.label })
|
|
44
|
+
},
|
|
45
|
+
e.label
|
|
46
|
+
)) })
|
|
47
|
+
] });
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
C as PresetPanel
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=preset_panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset_panel.js","sources":["../../../src/components/preset_panel/preset_panel.tsx"],"sourcesContent":["import { useSignalValue } from '@tcn/state';\nimport { HStack, VStack } from '@tcn/ui/stacks';\nimport { BodyText } from '@tcn/ui/typography';\nimport { Input } from '@tcn/ui/inputs';\nimport { useEffect, useRef } from 'react';\nimport { type PresetItem } from '../utils.js';\nimport { PresetPanelPresenter } from './preset_panel_presenter.js';\nimport styles from './preset_panel.module.css';\n\nexport interface PresetPanelOwnProps {\n presenter: PresetPanelPresenter;\n selectedPreset: PresetItem | null;\n focused: boolean;\n onSelect: (item: PresetItem) => void;\n}\n\nexport type PresetPanelProps = PresetPanelOwnProps;\n\nexport function PresetPanel({\n presenter,\n selectedPreset,\n focused,\n onSelect,\n}: PresetPanelProps) {\n const searchRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const search = useSignalValue(presenter.broadcasts.search);\n const filteredItems = useSignalValue(presenter.broadcasts.filteredItems);\n const highlightedIndex = useSignalValue(presenter.broadcasts.highlightedIndex);\n\n useEffect(() => {\n if (focused) {\n searchRef.current?.focus();\n }\n }, [focused]);\n\n useEffect(() => {\n const list = listRef.current;\n if (list == null) return;\n const item = list.children[highlightedIndex] as HTMLElement | undefined;\n item?.scrollIntoView({ block: 'nearest' });\n }, [highlightedIndex]);\n\n return (\n <VStack className={styles['presets-panel']} height=\"auto\">\n <Input\n ref={searchRef}\n className={styles['preset-search']}\n value={search}\n onChange={v => presenter.setSearch(v)}\n placeholder=\"Search quick ranges\"\n onKeyDown={e => {\n const result = presenter.handleKeyDown(e.key);\n if (result.preventDefault) e.preventDefault();\n if (result.selectedItem != null) onSelect(result.selectedItem);\n }}\n />\n <VStack ref={listRef} className={styles['preset-list']} height=\"290px\" width=\"100%\">\n {filteredItems.map((item, index) => (\n <HStack\n key={item.label}\n className={styles['preset-item']}\n data-selected={selectedPreset != null && item.label === selectedPreset.label}\n data-highlighted={index === highlightedIndex}\n onClick={() => onSelect(item)}\n >\n <BodyText selectable={false}>{item.label}</BodyText>\n </HStack>\n ))}\n </VStack>\n </VStack>\n );\n}\n"],"names":["PresetPanel","presenter","selectedPreset","focused","onSelect","searchRef","useRef","listRef","search","useSignalValue","filteredItems","highlightedIndex","useEffect","list","VStack","styles","jsx","Input","v","result","item","index","HStack","BodyText"],"mappings":";;;;;;;AAkBO,SAASA,EAAY;AAAA,EAC1B,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AACF,GAAqB;AACnB,QAAMC,IAAYC,EAAyB,IAAI,GACzCC,IAAUD,EAAuB,IAAI,GAErCE,IAASC,EAAeR,EAAU,WAAW,MAAM,GACnDS,IAAgBD,EAAeR,EAAU,WAAW,aAAa,GACjEU,IAAmBF,EAAeR,EAAU,WAAW,gBAAgB;AAE7E,SAAAW,EAAU,MAAM;AACd,IAAIT,KACFE,EAAU,SAAS,MAAA;AAAA,EAEvB,GAAG,CAACF,CAAO,CAAC,GAEZS,EAAU,MAAM;AACd,UAAMC,IAAON,EAAQ;AACrB,QAAIM,KAAQ,KAAM;AAElB,IADaA,EAAK,SAASF,CAAgB,GACrC,eAAe,EAAE,OAAO,UAAA,CAAW;AAAA,EAC3C,GAAG,CAACA,CAAgB,CAAC,qBAGlBG,GAAA,EAAO,WAAWC,EAAO,eAAe,GAAG,QAAO,QACjD,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAKZ;AAAA,QACL,WAAWU,EAAO,eAAe;AAAA,QACjC,OAAOP;AAAA,QACP,UAAU,CAAAU,MAAKjB,EAAU,UAAUiB,CAAC;AAAA,QACpC,aAAY;AAAA,QACZ,WAAW,CAAA,MAAK;AACd,gBAAMC,IAASlB,EAAU,cAAc,EAAE,GAAG;AAC5C,UAAIkB,EAAO,kBAAgB,EAAE,eAAA,GACzBA,EAAO,gBAAgB,QAAMf,EAASe,EAAO,YAAY;AAAA,QAC/D;AAAA,MAAA;AAAA,IAAA;AAAA,sBAEDL,GAAA,EAAO,KAAKP,GAAS,WAAWQ,EAAO,aAAa,GAAG,QAAO,SAAQ,OAAM,QAC1E,UAAAL,EAAc,IAAI,CAACU,GAAMC,MACxB,gBAAAL;AAAA,MAACM;AAAA,MAAA;AAAA,QAEC,WAAWP,EAAO,aAAa;AAAA,QAC/B,iBAAeb,KAAkB,QAAQkB,EAAK,UAAUlB,EAAe;AAAA,QACvE,oBAAkBmB,MAAUV;AAAA,QAC5B,SAAS,MAAMP,EAASgB,CAAI;AAAA,QAE5B,UAAA,gBAAAJ,EAACO,GAAA,EAAS,YAAY,IAAQ,YAAK,MAAA,CAAM;AAAA,MAAA;AAAA,MANpCH,EAAK;AAAA,IAAA,CAQb,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Signal, derive } from '@tcn/state';
|
|
2
|
+
import { PresetItem } from '../utils.js';
|
|
3
|
+
export declare class PresetPanelPresenter {
|
|
4
|
+
private readonly _items;
|
|
5
|
+
private _search;
|
|
6
|
+
private _highlightedIndex;
|
|
7
|
+
private _filteredItems;
|
|
8
|
+
readonly broadcasts: {
|
|
9
|
+
search: Signal<string>['broadcast'];
|
|
10
|
+
highlightedIndex: Signal<number>['broadcast'];
|
|
11
|
+
filteredItems: ReturnType<typeof derive<string, PresetItem[]>>['broadcast'];
|
|
12
|
+
};
|
|
13
|
+
constructor(_items: PresetItem[]);
|
|
14
|
+
setSearch(query: string): void;
|
|
15
|
+
moveHighlight(direction: 1 | -1): void;
|
|
16
|
+
getHighlightedItem(): PresetItem | null;
|
|
17
|
+
handleKeyDown(key: string): {
|
|
18
|
+
preventDefault: boolean;
|
|
19
|
+
selectedItem?: PresetItem;
|
|
20
|
+
escape?: boolean;
|
|
21
|
+
};
|
|
22
|
+
reset(): void;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=preset_panel_presenter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset_panel_presenter.d.ts","sourceRoot":"","sources":["../../../src/components/preset_panel/preset_panel_presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,qBAAa,oBAAoB;IAWnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVnC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,cAAc,CAAkD;IAExE,QAAQ,CAAC,UAAU,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QACpC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QAC9C,aAAa,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;KAC7E,CAAC;gBAE2B,MAAM,EAAE,UAAU,EAAE;IAYjD,SAAS,CAAC,KAAK,EAAE,MAAM;IAKvB,aAAa,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IAO/B,kBAAkB,IAAI,UAAU,GAAG,IAAI;IAKvC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;QAC1B,cAAc,EAAE,OAAO,CAAC;QACxB,YAAY,CAAC,EAAE,UAAU,CAAC;QAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAgBD,KAAK;CAIN"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { derive as h, Signal as i } from "@tcn/state";
|
|
2
|
+
class n {
|
|
3
|
+
constructor(e) {
|
|
4
|
+
this._items = e, this._filteredItems = h(
|
|
5
|
+
this._search,
|
|
6
|
+
(t) => e.filter((s) => s.label.toLowerCase().includes(t.toLowerCase()))
|
|
7
|
+
), this.broadcasts = {
|
|
8
|
+
search: this._search.broadcast,
|
|
9
|
+
highlightedIndex: this._highlightedIndex.broadcast,
|
|
10
|
+
filteredItems: this._filteredItems.broadcast
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
_search = new i("");
|
|
14
|
+
_highlightedIndex = new i(0);
|
|
15
|
+
_filteredItems;
|
|
16
|
+
broadcasts;
|
|
17
|
+
setSearch(e) {
|
|
18
|
+
this._search.set(e), this._highlightedIndex.set(0);
|
|
19
|
+
}
|
|
20
|
+
moveHighlight(e) {
|
|
21
|
+
const t = this._filteredItems.get().length;
|
|
22
|
+
if (t === 0) return;
|
|
23
|
+
const s = (this._highlightedIndex.get() + e + t) % t;
|
|
24
|
+
this._highlightedIndex.set(s);
|
|
25
|
+
}
|
|
26
|
+
getHighlightedItem() {
|
|
27
|
+
return this._filteredItems.get()[this._highlightedIndex.get()] ?? null;
|
|
28
|
+
}
|
|
29
|
+
handleKeyDown(e) {
|
|
30
|
+
return e === "ArrowDown" ? (this.moveHighlight(1), { preventDefault: !0 }) : e === "ArrowUp" ? (this.moveHighlight(-1), { preventDefault: !0 }) : e === "Enter" ? { preventDefault: !0, selectedItem: this.getHighlightedItem() ?? void 0 } : e === "Escape" ? { preventDefault: !1, escape: !0 } : { preventDefault: !1 };
|
|
31
|
+
}
|
|
32
|
+
reset() {
|
|
33
|
+
this._search.set(""), this._highlightedIndex.set(0);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
n as PresetPanelPresenter
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=preset_panel_presenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset_panel_presenter.js","sources":["../../../src/components/preset_panel/preset_panel_presenter.ts"],"sourcesContent":["import { Signal, derive } from '@tcn/state';\nimport { type PresetItem } from '../utils.js';\n\nexport class PresetPanelPresenter {\n private _search = new Signal<string>('');\n private _highlightedIndex = new Signal<number>(0);\n private _filteredItems: ReturnType<typeof derive<string, PresetItem[]>>;\n\n readonly broadcasts: {\n search: Signal<string>['broadcast'];\n highlightedIndex: Signal<number>['broadcast'];\n filteredItems: ReturnType<typeof derive<string, PresetItem[]>>['broadcast'];\n };\n\n constructor(private readonly _items: PresetItem[]) {\n this._filteredItems = derive(this._search, search =>\n _items.filter(item => item.label.toLowerCase().includes(search.toLowerCase()))\n );\n\n this.broadcasts = {\n search: this._search.broadcast,\n highlightedIndex: this._highlightedIndex.broadcast,\n filteredItems: this._filteredItems.broadcast,\n };\n }\n\n setSearch(query: string) {\n this._search.set(query);\n this._highlightedIndex.set(0);\n }\n\n moveHighlight(direction: 1 | -1) {\n const count = this._filteredItems.get().length;\n if (count === 0) return;\n const next = (this._highlightedIndex.get() + direction + count) % count;\n this._highlightedIndex.set(next);\n }\n\n getHighlightedItem(): PresetItem | null {\n const items = this._filteredItems.get();\n return items[this._highlightedIndex.get()] ?? null;\n }\n\n handleKeyDown(key: string): {\n preventDefault: boolean;\n selectedItem?: PresetItem;\n escape?: boolean;\n } {\n if (key === 'ArrowDown') {\n this.moveHighlight(1);\n return { preventDefault: true };\n } else if (key === 'ArrowUp') {\n this.moveHighlight(-1);\n return { preventDefault: true };\n } else if (key === 'Enter') {\n const item = this.getHighlightedItem();\n return { preventDefault: true, selectedItem: item ?? undefined };\n } else if (key === 'Escape') {\n return { preventDefault: false, escape: true };\n }\n return { preventDefault: false };\n }\n\n reset() {\n this._search.set('');\n this._highlightedIndex.set(0);\n }\n}\n"],"names":["PresetPanelPresenter","_items","derive","search","item","Signal","query","direction","count","next","key"],"mappings":";AAGO,MAAMA,EAAqB;AAAA,EAWhC,YAA6BC,GAAsB;AAAtB,SAAA,SAAAA,GAC3B,KAAK,iBAAiBC;AAAA,MAAO,KAAK;AAAA,MAAS,CAAAC,MACzCF,EAAO,OAAO,CAAAG,MAAQA,EAAK,MAAM,YAAA,EAAc,SAASD,EAAO,YAAA,CAAa,CAAC;AAAA,IAAA,GAG/E,KAAK,aAAa;AAAA,MAChB,QAAQ,KAAK,QAAQ;AAAA,MACrB,kBAAkB,KAAK,kBAAkB;AAAA,MACzC,eAAe,KAAK,eAAe;AAAA,IAAA;AAAA,EAEvC;AAAA,EApBQ,UAAU,IAAIE,EAAe,EAAE;AAAA,EAC/B,oBAAoB,IAAIA,EAAe,CAAC;AAAA,EACxC;AAAA,EAEC;AAAA,EAkBT,UAAUC,GAAe;AACvB,SAAK,QAAQ,IAAIA,CAAK,GACtB,KAAK,kBAAkB,IAAI,CAAC;AAAA,EAC9B;AAAA,EAEA,cAAcC,GAAmB;AAC/B,UAAMC,IAAQ,KAAK,eAAe,IAAA,EAAM;AACxC,QAAIA,MAAU,EAAG;AACjB,UAAMC,KAAQ,KAAK,kBAAkB,QAAQF,IAAYC,KAASA;AAClE,SAAK,kBAAkB,IAAIC,CAAI;AAAA,EACjC;AAAA,EAEA,qBAAwC;AAEtC,WADc,KAAK,eAAe,IAAA,EACrB,KAAK,kBAAkB,IAAA,CAAK,KAAK;AAAA,EAChD;AAAA,EAEA,cAAcC,GAIZ;AACA,WAAIA,MAAQ,eACV,KAAK,cAAc,CAAC,GACb,EAAE,gBAAgB,GAAA,KAChBA,MAAQ,aACjB,KAAK,cAAc,EAAE,GACd,EAAE,gBAAgB,GAAA,KAChBA,MAAQ,UAEV,EAAE,gBAAgB,IAAM,cADlB,KAAK,mBAAA,KACmC,OAAA,IAC5CA,MAAQ,WACV,EAAE,gBAAgB,IAAO,QAAQ,GAAA,IAEnC,EAAE,gBAAgB,GAAA;AAAA,EAC3B;AAAA,EAEA,QAAQ;AACN,SAAK,QAAQ,IAAI,EAAE,GACnB,KAAK,kBAAkB,IAAI,CAAC;AAAA,EAC9B;AACF;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface TimeSelectorOwnProps {
|
|
2
|
+
onChange?: (start: Date, end: Date) => void;
|
|
3
|
+
onTimezoneChange?: (timezone: string) => void;
|
|
4
|
+
startDateMin?: Date | null;
|
|
5
|
+
startDateMax?: Date | null;
|
|
6
|
+
endDateMin?: Date | null;
|
|
7
|
+
endDateMax?: Date | null;
|
|
8
|
+
timezones?: string[];
|
|
9
|
+
}
|
|
10
|
+
export type TimeSelectorProps = TimeSelectorOwnProps;
|
|
11
|
+
export declare function TimeSelector({ onChange, onTimezoneChange, startDateMin, startDateMax, endDateMin, endDateMax, timezones, }: TimeSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=time_selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time_selector.d.ts","sourceRoot":"","sources":["../../../src/components/time_selector/time_selector.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC;IAC5C,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAErD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,iBAAiB,2CAoEnB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { jsxs as r, Fragment as v, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { useSignalValue as o } from "@tcn/state";
|
|
3
|
+
import { ElementPopper as S } from "@tcn/ui/overlay";
|
|
4
|
+
import { HStack as p, VStack as _ } from "@tcn/ui/stacks";
|
|
5
|
+
import { BodyText as m } from "@tcn/ui/typography";
|
|
6
|
+
import { useState as x, useRef as A } from "react";
|
|
7
|
+
import { TimeSelectorPresenter as R } from "./time_selector_presenter.js";
|
|
8
|
+
import { PresetPanel as T } from "../preset_panel/preset_panel.js";
|
|
9
|
+
import { DateRangePanel as k } from "../date_range_panel/date_range_panel.js";
|
|
10
|
+
import { TimezoneFooter as w } from "../timezone_footer/timezone_footer.js";
|
|
11
|
+
import '../../time_selector.css';const z = "_trigger-abbreviation_8e22c20", F = "_trigger_1096f0b", V = "_popper-content_9403264", a = { "trigger-abbreviation": z, trigger: F, "popper-content": V };
|
|
12
|
+
function q({
|
|
13
|
+
onChange: l,
|
|
14
|
+
onTimezoneChange: d,
|
|
15
|
+
startDateMin: g,
|
|
16
|
+
startDateMax: f,
|
|
17
|
+
endDateMin: b,
|
|
18
|
+
endDateMax: h,
|
|
19
|
+
timezones: u
|
|
20
|
+
}) {
|
|
21
|
+
const [e] = x(() => new R()), c = A(null), n = o(e.broadcasts.isOpen), s = o(e.broadcasts.selectedPreset), P = o(e.broadcasts.displayValue), y = o(
|
|
22
|
+
e.timezoneFooterPresenter.broadcasts.timezoneAbbreviation
|
|
23
|
+
);
|
|
24
|
+
return /* @__PURE__ */ r(v, { children: [
|
|
25
|
+
/* @__PURE__ */ t(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
ref: c,
|
|
29
|
+
className: a.trigger,
|
|
30
|
+
onClick: () => e.toggleOpen(),
|
|
31
|
+
children: /* @__PURE__ */ r(p, { height: "auto", width: "auto", gap: "4px", children: [
|
|
32
|
+
/* @__PURE__ */ r(m, { selectable: !1, children: [
|
|
33
|
+
P,
|
|
34
|
+
","
|
|
35
|
+
] }),
|
|
36
|
+
/* @__PURE__ */ t(
|
|
37
|
+
m,
|
|
38
|
+
{
|
|
39
|
+
selectable: !1,
|
|
40
|
+
style: { fontWeight: 700 },
|
|
41
|
+
className: a["trigger-abbreviation"],
|
|
42
|
+
children: y
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
] })
|
|
46
|
+
}
|
|
47
|
+
),
|
|
48
|
+
/* @__PURE__ */ t(
|
|
49
|
+
S,
|
|
50
|
+
{
|
|
51
|
+
anchorElement: c,
|
|
52
|
+
open: n,
|
|
53
|
+
onDismissal: () => e.close(),
|
|
54
|
+
dismissals: [],
|
|
55
|
+
children: /* @__PURE__ */ r(
|
|
56
|
+
_,
|
|
57
|
+
{
|
|
58
|
+
className: a["popper-content"],
|
|
59
|
+
height: "auto",
|
|
60
|
+
onKeyDown: (i) => {
|
|
61
|
+
i.key === "Escape" && e.close();
|
|
62
|
+
},
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ r(p, { height: "auto", width: "100%", vAlign: "start", children: [
|
|
65
|
+
/* @__PURE__ */ t(
|
|
66
|
+
k,
|
|
67
|
+
{
|
|
68
|
+
presenter: e.dateRangePanelPresenter,
|
|
69
|
+
focused: n && s == null,
|
|
70
|
+
startDateMin: g,
|
|
71
|
+
startDateMax: f,
|
|
72
|
+
endDateMin: b,
|
|
73
|
+
endDateMax: h,
|
|
74
|
+
onApply: () => e.applyTimeRange(l)
|
|
75
|
+
}
|
|
76
|
+
),
|
|
77
|
+
/* @__PURE__ */ t(
|
|
78
|
+
T,
|
|
79
|
+
{
|
|
80
|
+
presenter: e.presetPanelPresenter,
|
|
81
|
+
selectedPreset: s,
|
|
82
|
+
focused: n && s != null,
|
|
83
|
+
onSelect: (i) => e.handlePresetSelect(i, l)
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
] }),
|
|
87
|
+
/* @__PURE__ */ t(
|
|
88
|
+
w,
|
|
89
|
+
{
|
|
90
|
+
presenter: e.timezoneFooterPresenter,
|
|
91
|
+
timezones: u,
|
|
92
|
+
onTimezoneChange: d
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
] });
|
|
101
|
+
}
|
|
102
|
+
export {
|
|
103
|
+
q as TimeSelector
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=time_selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time_selector.js","sources":["../../../src/components/time_selector/time_selector.tsx"],"sourcesContent":["import { useSignalValue } from '@tcn/state';\nimport { ElementPopper } from '@tcn/ui/overlay';\nimport { HStack, VStack } from '@tcn/ui/stacks';\nimport { BodyText } from '@tcn/ui/typography';\nimport { useRef, useState } from 'react';\nimport { TimeSelectorPresenter } from './time_selector_presenter.js';\nimport { PresetPanel } from '../preset_panel/preset_panel.js';\nimport { DateRangePanel } from '../date_range_panel/date_range_panel.js';\nimport { TimezoneFooter } from '../timezone_footer/timezone_footer.js';\nimport styles from './time_selector.module.css';\n\nexport interface TimeSelectorOwnProps {\n onChange?: (start: Date, end: Date) => void;\n onTimezoneChange?: (timezone: string) => void;\n startDateMin?: Date | null;\n startDateMax?: Date | null;\n endDateMin?: Date | null;\n endDateMax?: Date | null;\n timezones?: string[];\n}\n\nexport type TimeSelectorProps = TimeSelectorOwnProps;\n\nexport function TimeSelector({\n onChange,\n onTimezoneChange,\n startDateMin,\n startDateMax,\n endDateMin,\n endDateMax,\n timezones,\n}: TimeSelectorProps) {\n const [presenter] = useState(() => new TimeSelectorPresenter());\n const anchorRef = useRef<HTMLDivElement>(null);\n\n const isOpen = useSignalValue(presenter.broadcasts.isOpen);\n const selectedPreset = useSignalValue(presenter.broadcasts.selectedPreset);\n const displayValue = useSignalValue(presenter.broadcasts.displayValue);\n const displayAbbreviation = useSignalValue(\n presenter.timezoneFooterPresenter.broadcasts.timezoneAbbreviation\n );\n\n return (\n <>\n <div\n ref={anchorRef}\n className={styles.trigger}\n onClick={() => presenter.toggleOpen()}\n >\n <HStack height=\"auto\" width=\"auto\" gap=\"4px\">\n <BodyText selectable={false}>{displayValue},</BodyText>\n <BodyText\n selectable={false}\n style={{ fontWeight: 700 }}\n className={styles['trigger-abbreviation']}\n >\n {displayAbbreviation}\n </BodyText>\n </HStack>\n </div>\n <ElementPopper\n anchorElement={anchorRef}\n open={isOpen}\n onDismissal={() => presenter.close()}\n dismissals={[]}\n >\n <VStack\n className={styles['popper-content']}\n height=\"auto\"\n onKeyDown={e => {\n if (e.key === 'Escape') presenter.close();\n }}\n >\n <HStack height=\"auto\" width=\"100%\" vAlign=\"start\">\n <DateRangePanel\n presenter={presenter.dateRangePanelPresenter}\n focused={isOpen && selectedPreset == null}\n startDateMin={startDateMin}\n startDateMax={startDateMax}\n endDateMin={endDateMin}\n endDateMax={endDateMax}\n onApply={() => presenter.applyTimeRange(onChange)}\n />\n <PresetPanel\n presenter={presenter.presetPanelPresenter}\n selectedPreset={selectedPreset}\n focused={isOpen && selectedPreset != null}\n onSelect={item => presenter.handlePresetSelect(item, onChange)}\n />\n </HStack>\n <TimezoneFooter\n presenter={presenter.timezoneFooterPresenter}\n timezones={timezones}\n onTimezoneChange={onTimezoneChange}\n />\n </VStack>\n </ElementPopper>\n </>\n );\n}\n"],"names":["TimeSelector","onChange","onTimezoneChange","startDateMin","startDateMax","endDateMin","endDateMax","timezones","presenter","useState","TimeSelectorPresenter","anchorRef","useRef","isOpen","useSignalValue","selectedPreset","displayValue","displayAbbreviation","jsxs","Fragment","jsx","styles","HStack","BodyText","ElementPopper","VStack","e","DateRangePanel","PresetPanel","item","TimezoneFooter"],"mappings":";;;;;;;;;;;AAuBO,SAASA,EAAa;AAAA,EAC3B,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AACF,GAAsB;AACpB,QAAM,CAACC,CAAS,IAAIC,EAAS,MAAM,IAAIC,GAAuB,GACxDC,IAAYC,EAAuB,IAAI,GAEvCC,IAASC,EAAeN,EAAU,WAAW,MAAM,GACnDO,IAAiBD,EAAeN,EAAU,WAAW,cAAc,GACnEQ,IAAeF,EAAeN,EAAU,WAAW,YAAY,GAC/DS,IAAsBH;AAAA,IAC1BN,EAAU,wBAAwB,WAAW;AAAA,EAAA;AAG/C,SACE,gBAAAU,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKT;AAAA,QACL,WAAWU,EAAO;AAAA,QAClB,SAAS,MAAMb,EAAU,WAAA;AAAA,QAEzB,4BAACc,GAAA,EAAO,QAAO,QAAO,OAAM,QAAO,KAAI,OACrC,UAAA;AAAA,UAAA,gBAAAJ,EAACK,GAAA,EAAS,YAAY,IAAQ,UAAA;AAAA,YAAAP;AAAA,YAAa;AAAA,UAAA,GAAC;AAAA,UAC5C,gBAAAI;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,YAAY;AAAA,cACZ,OAAO,EAAE,YAAY,IAAA;AAAA,cACrB,WAAWF,EAAO,sBAAsB;AAAA,cAEvC,UAAAJ;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,gBAAAG;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,eAAeb;AAAA,QACf,MAAME;AAAA,QACN,aAAa,MAAML,EAAU,MAAA;AAAA,QAC7B,YAAY,CAAA;AAAA,QAEZ,UAAA,gBAAAU;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,WAAWJ,EAAO,gBAAgB;AAAA,YAClC,QAAO;AAAA,YACP,WAAW,CAAAK,MAAK;AACd,cAAIA,EAAE,QAAQ,YAAUlB,EAAU,MAAA;AAAA,YACpC;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAAU,EAACI,KAAO,QAAO,QAAO,OAAM,QAAO,QAAO,SACxC,UAAA;AAAA,gBAAA,gBAAAF;AAAA,kBAACO;AAAA,kBAAA;AAAA,oBACC,WAAWnB,EAAU;AAAA,oBACrB,SAASK,KAAUE,KAAkB;AAAA,oBACrC,cAAAZ;AAAA,oBACA,cAAAC;AAAA,oBACA,YAAAC;AAAA,oBACA,YAAAC;AAAA,oBACA,SAAS,MAAME,EAAU,eAAeP,CAAQ;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAElD,gBAAAmB;AAAA,kBAACQ;AAAA,kBAAA;AAAA,oBACC,WAAWpB,EAAU;AAAA,oBACrB,gBAAAO;AAAA,oBACA,SAASF,KAAUE,KAAkB;AAAA,oBACrC,UAAU,CAAAc,MAAQrB,EAAU,mBAAmBqB,GAAM5B,CAAQ;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAC/D,GACF;AAAA,cACA,gBAAAmB;AAAA,gBAACU;AAAA,gBAAA;AAAA,kBACC,WAAWtB,EAAU;AAAA,kBACrB,WAAAD;AAAA,kBACA,kBAAAL;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Signal } from '@tcn/state';
|
|
2
|
+
import { PresetItem } from '../utils.js';
|
|
3
|
+
import { PresetPanelPresenter } from '../preset_panel/preset_panel_presenter.js';
|
|
4
|
+
import { DateRangePanelPresenter } from '../date_range_panel/date_range_panel_presenter.js';
|
|
5
|
+
import { TimezoneFooterPresenter } from '../timezone_footer/timezone_footer_presenter.js';
|
|
6
|
+
export type { PresetItem };
|
|
7
|
+
export declare const PRESET_ITEMS: PresetItem[];
|
|
8
|
+
export declare class TimeSelectorPresenter {
|
|
9
|
+
private _isOpen;
|
|
10
|
+
private _selectedPreset;
|
|
11
|
+
private _displayValue;
|
|
12
|
+
private _startDate;
|
|
13
|
+
private _endDate;
|
|
14
|
+
readonly presetPanelPresenter: PresetPanelPresenter;
|
|
15
|
+
readonly dateRangePanelPresenter: DateRangePanelPresenter;
|
|
16
|
+
readonly timezoneFooterPresenter: TimezoneFooterPresenter;
|
|
17
|
+
readonly broadcasts: {
|
|
18
|
+
isOpen: Signal<boolean>['broadcast'];
|
|
19
|
+
selectedPreset: Signal<PresetItem | null>['broadcast'];
|
|
20
|
+
displayValue: Signal<string>['broadcast'];
|
|
21
|
+
};
|
|
22
|
+
constructor();
|
|
23
|
+
handlePresetSelect(item: PresetItem, onChange?: (start: Date, end: Date) => void): void;
|
|
24
|
+
applyTimeRange(onChange?: (start: Date, end: Date) => void): void;
|
|
25
|
+
toggleOpen(): void;
|
|
26
|
+
close(): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=time_selector_presenter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time_selector_presenter.d.ts","sourceRoot":"","sources":["../../../src/components/time_selector/time_selector_presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAE1F,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,eAAO,MAAM,YAAY,EAAE,UAAU,EAYpC,CAAC;AAEF,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,QAAQ,CAAsB;IAEtC,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;IACpD,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;IAC1D,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;IAE1D,QAAQ,CAAC,UAAU,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;QACrC,cAAc,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;QACvD,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;KAC3C,CAAC;;IA4BF,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI;IAchF,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI;IAkB1D,UAAU;IAQV,KAAK;CAIN"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Signal as n } from "@tcn/state";
|
|
2
|
+
import { datesFromPreset as o, shiftForDisplay as i, unshiftFromDisplay as h, formatDate as m } from "../utils.js";
|
|
3
|
+
import { PresetPanelPresenter as c } from "../preset_panel/preset_panel_presenter.js";
|
|
4
|
+
import { DateRangePanelPresenter as p } from "../date_range_panel/date_range_panel_presenter.js";
|
|
5
|
+
import { TimezoneFooterPresenter as P } from "../timezone_footer/timezone_footer_presenter.js";
|
|
6
|
+
const l = [
|
|
7
|
+
{ label: "Last 5 mins", minutes: 5 },
|
|
8
|
+
{ label: "Last 15 mins", minutes: 15 },
|
|
9
|
+
{ label: "Last 30 mins", minutes: 30 },
|
|
10
|
+
{ label: "Last 1 hour", minutes: 60 },
|
|
11
|
+
{ label: "Last 3 hours", minutes: 180 },
|
|
12
|
+
{ label: "Last 6 hours", minutes: 360 },
|
|
13
|
+
{ label: "Last 12 hours", minutes: 720 },
|
|
14
|
+
{ label: "Last 24 hours", minutes: 1440 },
|
|
15
|
+
{ label: "Last 2 days", minutes: 2880 },
|
|
16
|
+
{ label: "Last 7 days", minutes: 10080 },
|
|
17
|
+
{ label: "Last 30 days", minutes: 43200 }
|
|
18
|
+
];
|
|
19
|
+
class g {
|
|
20
|
+
_isOpen = new n(!1);
|
|
21
|
+
_selectedPreset = new n(l[0]);
|
|
22
|
+
_displayValue;
|
|
23
|
+
_startDate;
|
|
24
|
+
_endDate;
|
|
25
|
+
presetPanelPresenter;
|
|
26
|
+
dateRangePanelPresenter;
|
|
27
|
+
timezoneFooterPresenter;
|
|
28
|
+
broadcasts;
|
|
29
|
+
constructor() {
|
|
30
|
+
const e = Intl.DateTimeFormat().resolvedOptions().timeZone, { start: s, end: t } = o(l[0]);
|
|
31
|
+
this._startDate = new n(i(s, e)), this._endDate = new n(i(t, e)), this.presetPanelPresenter = new c(l), this.dateRangePanelPresenter = new p(
|
|
32
|
+
this._startDate,
|
|
33
|
+
this._endDate
|
|
34
|
+
), this.timezoneFooterPresenter = new P(
|
|
35
|
+
this._startDate,
|
|
36
|
+
this._endDate
|
|
37
|
+
), this._displayValue = new n(l[0].label), this.broadcasts = {
|
|
38
|
+
isOpen: this._isOpen.broadcast,
|
|
39
|
+
selectedPreset: this._selectedPreset.broadcast,
|
|
40
|
+
displayValue: this._displayValue.broadcast
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
handlePresetSelect(e, s) {
|
|
44
|
+
this._selectedPreset.set(e);
|
|
45
|
+
const { start: t, end: a } = o(e), r = this.timezoneFooterPresenter.getTimezone();
|
|
46
|
+
this._startDate.set(i(t, r)), this._endDate.set(i(a, r)), this._displayValue.set(e.label), s?.(t, a), this.close();
|
|
47
|
+
}
|
|
48
|
+
applyTimeRange(e) {
|
|
49
|
+
const s = this._startDate.get(), t = this._endDate.get();
|
|
50
|
+
if (s != null && t != null) {
|
|
51
|
+
const a = this.timezoneFooterPresenter.getTimezone(), r = h(s, a), d = h(t, a);
|
|
52
|
+
this._selectedPreset.set(null), this._displayValue.set(`${m(s)} to ${m(t)}`), e?.(r, d), this.close();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
toggleOpen() {
|
|
56
|
+
this._isOpen.get() ? this.close() : this._isOpen.set(!0);
|
|
57
|
+
}
|
|
58
|
+
close() {
|
|
59
|
+
this._isOpen.set(!1), this.presetPanelPresenter.reset();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
l as PRESET_ITEMS,
|
|
64
|
+
g as TimeSelectorPresenter
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=time_selector_presenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time_selector_presenter.js","sources":["../../../src/components/time_selector/time_selector_presenter.ts"],"sourcesContent":["import { Signal } from '@tcn/state';\nimport {\n formatDate,\n datesFromPreset,\n shiftForDisplay,\n unshiftFromDisplay,\n type PresetItem,\n} from '../utils.js';\nimport { PresetPanelPresenter } from '../preset_panel/preset_panel_presenter.js';\nimport { DateRangePanelPresenter } from '../date_range_panel/date_range_panel_presenter.js';\nimport { TimezoneFooterPresenter } from '../timezone_footer/timezone_footer_presenter.js';\n\nexport type { PresetItem };\n\nexport const PRESET_ITEMS: PresetItem[] = [\n { label: 'Last 5 mins', minutes: 5 },\n { label: 'Last 15 mins', minutes: 15 },\n { label: 'Last 30 mins', minutes: 30 },\n { label: 'Last 1 hour', minutes: 60 },\n { label: 'Last 3 hours', minutes: 180 },\n { label: 'Last 6 hours', minutes: 360 },\n { label: 'Last 12 hours', minutes: 720 },\n { label: 'Last 24 hours', minutes: 1440 },\n { label: 'Last 2 days', minutes: 2880 },\n { label: 'Last 7 days', minutes: 10080 },\n { label: 'Last 30 days', minutes: 43200 },\n];\n\nexport class TimeSelectorPresenter {\n private _isOpen = new Signal<boolean>(false);\n private _selectedPreset = new Signal<PresetItem | null>(PRESET_ITEMS[0]);\n private _displayValue: Signal<string>;\n private _startDate: Signal<Date | null>;\n private _endDate: Signal<Date | null>;\n\n readonly presetPanelPresenter: PresetPanelPresenter;\n readonly dateRangePanelPresenter: DateRangePanelPresenter;\n readonly timezoneFooterPresenter: TimezoneFooterPresenter;\n\n readonly broadcasts: {\n isOpen: Signal<boolean>['broadcast'];\n selectedPreset: Signal<PresetItem | null>['broadcast'];\n displayValue: Signal<string>['broadcast'];\n };\n\n constructor() {\n const browserTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const { start, end } = datesFromPreset(PRESET_ITEMS[0]);\n\n this._startDate = new Signal<Date | null>(shiftForDisplay(start, browserTz));\n this._endDate = new Signal<Date | null>(shiftForDisplay(end, browserTz));\n\n this.presetPanelPresenter = new PresetPanelPresenter(PRESET_ITEMS);\n this.dateRangePanelPresenter = new DateRangePanelPresenter(\n this._startDate,\n this._endDate\n );\n this.timezoneFooterPresenter = new TimezoneFooterPresenter(\n this._startDate,\n this._endDate\n );\n\n this._displayValue = new Signal<string>(PRESET_ITEMS[0].label);\n\n this.broadcasts = {\n isOpen: this._isOpen.broadcast,\n selectedPreset: this._selectedPreset.broadcast,\n displayValue: this._displayValue.broadcast,\n };\n }\n\n handlePresetSelect(item: PresetItem, onChange?: (start: Date, end: Date) => void) {\n this._selectedPreset.set(item);\n\n const { start, end } = datesFromPreset(item);\n const tz = this.timezoneFooterPresenter.getTimezone();\n\n this._startDate.set(shiftForDisplay(start, tz));\n this._endDate.set(shiftForDisplay(end, tz));\n\n this._displayValue.set(item.label);\n onChange?.(start, end);\n this.close();\n }\n\n applyTimeRange(onChange?: (start: Date, end: Date) => void) {\n const displayStart = this._startDate.get();\n const displayEnd = this._endDate.get();\n\n if (displayStart != null && displayEnd != null) {\n const tz = this.timezoneFooterPresenter.getTimezone();\n const realStart = unshiftFromDisplay(displayStart, tz);\n const realEnd = unshiftFromDisplay(displayEnd, tz);\n\n this._selectedPreset.set(null);\n this._displayValue.set(`${formatDate(displayStart)} to ${formatDate(displayEnd)}`);\n\n onChange?.(realStart, realEnd);\n\n this.close();\n }\n }\n\n toggleOpen() {\n if (this._isOpen.get()) {\n this.close();\n } else {\n this._isOpen.set(true);\n }\n }\n\n close() {\n this._isOpen.set(false);\n this.presetPanelPresenter.reset();\n }\n}\n"],"names":["PRESET_ITEMS","TimeSelectorPresenter","Signal","browserTz","start","end","datesFromPreset","shiftForDisplay","PresetPanelPresenter","DateRangePanelPresenter","TimezoneFooterPresenter","item","onChange","tz","displayStart","displayEnd","realStart","unshiftFromDisplay","realEnd","formatDate"],"mappings":";;;;;AAcO,MAAMA,IAA6B;AAAA,EACxC,EAAE,OAAO,eAAe,SAAS,EAAA;AAAA,EACjC,EAAE,OAAO,gBAAgB,SAAS,GAAA;AAAA,EAClC,EAAE,OAAO,gBAAgB,SAAS,GAAA;AAAA,EAClC,EAAE,OAAO,eAAe,SAAS,GAAA;AAAA,EACjC,EAAE,OAAO,gBAAgB,SAAS,IAAA;AAAA,EAClC,EAAE,OAAO,gBAAgB,SAAS,IAAA;AAAA,EAClC,EAAE,OAAO,iBAAiB,SAAS,IAAA;AAAA,EACnC,EAAE,OAAO,iBAAiB,SAAS,KAAA;AAAA,EACnC,EAAE,OAAO,eAAe,SAAS,KAAA;AAAA,EACjC,EAAE,OAAO,eAAe,SAAS,MAAA;AAAA,EACjC,EAAE,OAAO,gBAAgB,SAAS,MAAA;AACpC;AAEO,MAAMC,EAAsB;AAAA,EACzB,UAAU,IAAIC,EAAgB,EAAK;AAAA,EACnC,kBAAkB,IAAIA,EAA0BF,EAAa,CAAC,CAAC;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAMT,cAAc;AACZ,UAAMG,IAAY,KAAK,eAAA,EAAiB,kBAAkB,UACpD,EAAE,OAAAC,GAAO,KAAAC,EAAA,IAAQC,EAAgBN,EAAa,CAAC,CAAC;AAEtD,SAAK,aAAa,IAAIE,EAAoBK,EAAgBH,GAAOD,CAAS,CAAC,GAC3E,KAAK,WAAW,IAAID,EAAoBK,EAAgBF,GAAKF,CAAS,CAAC,GAEvE,KAAK,uBAAuB,IAAIK,EAAqBR,CAAY,GACjE,KAAK,0BAA0B,IAAIS;AAAA,MACjC,KAAK;AAAA,MACL,KAAK;AAAA,IAAA,GAEP,KAAK,0BAA0B,IAAIC;AAAA,MACjC,KAAK;AAAA,MACL,KAAK;AAAA,IAAA,GAGP,KAAK,gBAAgB,IAAIR,EAAeF,EAAa,CAAC,EAAE,KAAK,GAE7D,KAAK,aAAa;AAAA,MAChB,QAAQ,KAAK,QAAQ;AAAA,MACrB,gBAAgB,KAAK,gBAAgB;AAAA,MACrC,cAAc,KAAK,cAAc;AAAA,IAAA;AAAA,EAErC;AAAA,EAEA,mBAAmBW,GAAkBC,GAA6C;AAChF,SAAK,gBAAgB,IAAID,CAAI;AAE7B,UAAM,EAAE,OAAAP,GAAO,KAAAC,MAAQC,EAAgBK,CAAI,GACrCE,IAAK,KAAK,wBAAwB,YAAA;AAExC,SAAK,WAAW,IAAIN,EAAgBH,GAAOS,CAAE,CAAC,GAC9C,KAAK,SAAS,IAAIN,EAAgBF,GAAKQ,CAAE,CAAC,GAE1C,KAAK,cAAc,IAAIF,EAAK,KAAK,GACjCC,IAAWR,GAAOC,CAAG,GACrB,KAAK,MAAA;AAAA,EACP;AAAA,EAEA,eAAeO,GAA6C;AAC1D,UAAME,IAAe,KAAK,WAAW,IAAA,GAC/BC,IAAa,KAAK,SAAS,IAAA;AAEjC,QAAID,KAAgB,QAAQC,KAAc,MAAM;AAC9C,YAAMF,IAAK,KAAK,wBAAwB,YAAA,GAClCG,IAAYC,EAAmBH,GAAcD,CAAE,GAC/CK,IAAUD,EAAmBF,GAAYF,CAAE;AAEjD,WAAK,gBAAgB,IAAI,IAAI,GAC7B,KAAK,cAAc,IAAI,GAAGM,EAAWL,CAAY,CAAC,OAAOK,EAAWJ,CAAU,CAAC,EAAE,GAEjFH,IAAWI,GAAWE,CAAO,GAE7B,KAAK,MAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEA,aAAa;AACX,IAAI,KAAK,QAAQ,QACf,KAAK,MAAA,IAEL,KAAK,QAAQ,IAAI,EAAI;AAAA,EAEzB;AAAA,EAEA,QAAQ;AACN,SAAK,QAAQ,IAAI,EAAK,GACtB,KAAK,qBAAqB,MAAA;AAAA,EAC5B;AACF;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TimezoneFooterPresenter } from './timezone_footer_presenter.js';
|
|
2
|
+
export interface TimezoneFooterOwnProps {
|
|
3
|
+
presenter: TimezoneFooterPresenter;
|
|
4
|
+
timezones?: string[];
|
|
5
|
+
onTimezoneChange?: (tz: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export type TimezoneFooterProps = TimezoneFooterOwnProps;
|
|
8
|
+
export declare function TimezoneFooter({ presenter, timezones, onTimezoneChange, }: TimezoneFooterProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=timezone_footer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timezone_footer.d.ts","sourceRoot":"","sources":["../../../src/components/timezone_footer/timezone_footer.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAUzE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,uBAAuB,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AAEzD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,SAAS,EACT,gBAAgB,GACjB,EAAE,mBAAmB,2CAyErB"}
|