impact-nova 2.1.0-alpha.9 → 2.2.1

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.
Files changed (75) hide show
  1. package/README.md +6 -0
  2. package/dist/components/data/ag-grid-react/cell-renderers/editors/split-cell-editor.js +73 -94
  3. package/dist/components/data/ag-grid-react/cell-renderers/editors/split-cell-focus.d.ts +53 -0
  4. package/dist/components/data/ag-grid-react/cell-renderers/editors/split-cell-focus.js +98 -0
  5. package/dist/components/data/ag-grid-react/headers/column-menu/column-settings-menu.js +15 -13
  6. package/dist/components/data/ag-grid-react/headers/custom-header.js +56 -58
  7. package/dist/components/data/ag-grid-react/headers/custom-inner-header-group.d.ts +12 -0
  8. package/dist/components/data/ag-grid-react/headers/custom-inner-header-group.js +31 -0
  9. package/dist/components/data/ag-grid-react/headers/header-search-active-state.d.ts +10 -0
  10. package/dist/components/data/ag-grid-react/headers/header-search-active-state.js +38 -0
  11. package/dist/components/data/ag-grid-react/index.js +166 -163
  12. package/dist/components/data/ag-grid-react/notify-column-indicator-sync.d.ts +3 -4
  13. package/dist/components/data/ag-grid-react/theme.js +0 -2
  14. package/dist/components/data/data-table/data-table-column-list.js +1 -1
  15. package/dist/components/data/data-table/data-table-saved-views.js +1 -1
  16. package/dist/components/data/expandable-list-item/expandable-list-item-attributes.js +7 -6
  17. package/dist/components/data/nested-list/components/SortableItem.d.ts +3 -1
  18. package/dist/components/data/nested-list/components/SortableItem.js +111 -109
  19. package/dist/components/data-display/calendar/calendar-footer-emphasis.d.ts +28 -0
  20. package/dist/components/data-display/calendar/calendar-footer-emphasis.js +8 -0
  21. package/dist/components/data-display/calendar/calendar-footer.d.ts +4 -1
  22. package/dist/components/data-display/calendar/calendar-footer.js +60 -38
  23. package/dist/components/data-display/calendar/calendar.js +86 -82
  24. package/dist/components/data-display/calendar/calendar.types.d.ts +2 -0
  25. package/dist/components/data-display/calendar/use-calendar-state.d.ts +3 -0
  26. package/dist/components/feedback/tooltip/tab-tooltip-render.js +3 -2
  27. package/dist/components/flows/filter-strip/filter-strip.js +36 -29
  28. package/dist/components/flows/filter-strip/filter-summary.js +2 -2
  29. package/dist/components/forms/date-picker/date-input-behavior.d.ts +118 -0
  30. package/dist/components/forms/date-picker/date-input-behavior.js +164 -0
  31. package/dist/components/forms/date-picker/date-picker.js +202 -138
  32. package/dist/components/forms/date-picker/date-range-picker.js +302 -215
  33. package/dist/components/forms/date-picker/month-picker.js +160 -119
  34. package/dist/components/forms/date-picker/month-range-picker.js +302 -245
  35. package/dist/components/forms/date-picker/multi-date-picker.js +94 -80
  36. package/dist/components/forms/date-picker/multi-month-picker.js +97 -83
  37. package/dist/components/forms/date-picker/multi-week-picker.js +107 -93
  38. package/dist/components/forms/date-picker/week-picker.js +230 -140
  39. package/dist/components/forms/date-picker/week-range-picker.js +332 -226
  40. package/dist/components/forms/file-upload/file-upload.js +312 -174
  41. package/dist/components/forms/file-upload/file-upload.types.d.ts +17 -2
  42. package/dist/components/layout/dynamic-layout/dynamic-layout.variants.d.ts +1 -1
  43. package/dist/components/layout/header/header.js +45 -38
  44. package/dist/components/layout/horizontal-scroller/index.d.ts +1 -0
  45. package/dist/components/layout/horizontal-scroller/index.js +3 -2
  46. package/dist/components/ui/local-raster-icons/assets/excel-error-icon.webp.js +4 -0
  47. package/dist/components/ui/local-raster-icons/assets/file-upload-error.webp.js +4 -0
  48. package/dist/components/ui/local-raster-icons/rasterIcons.d.ts +2 -0
  49. package/dist/components/ui/local-raster-icons/rasterIcons.js +32 -22
  50. package/dist/components/ui/show.d.ts +10 -0
  51. package/dist/components/ui/show.js +7 -0
  52. package/dist/components/ui/show.types.d.ts +5 -0
  53. package/dist/i18n/defaultMessages.d.ts +17 -0
  54. package/dist/i18n/defaultMessages.js +29 -17
  55. package/dist/i18n/index.d.ts +1 -1
  56. package/dist/i18n/locales/de.js +12 -0
  57. package/dist/i18n/locales/es.js +12 -0
  58. package/dist/i18n/locales/hi.js +12 -0
  59. package/dist/i18n/locales/kn.js +12 -0
  60. package/dist/impact-nova-base.scss +6 -2
  61. package/dist/impact-nova-components.css +141 -16
  62. package/dist/impact-nova-tokens.scss +12 -0
  63. package/dist/impact-nova.css +1 -1
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.js +273 -271
  66. package/dist/lib/utils.js +40 -24
  67. package/dist/llms/rules/ag-grid.js +1 -1
  68. package/dist/llms/rules/installation.js +1 -1
  69. package/dist/llms/rules/requirements.js +1 -1
  70. package/dist/tailwind.config.js +36 -4
  71. package/dist/theme/tailwind-colors.js +3 -1
  72. package/package.json +15 -6
  73. package/tailwind.config.d.ts +3 -0
  74. package/dist/components/data/ag-grid-react/headers/custom-header-group.d.ts +0 -10
  75. package/dist/components/data/ag-grid-react/headers/custom-header-group.js +0 -58
@@ -1,158 +1,248 @@
1
- import { jsxs as y, jsx as o } from "react/jsx-runtime";
2
- import * as i from "react";
3
- import { Cross as te, CalendarMonth as re } from "impact-nova-icons";
4
- import { isValid as x, parse as S, format as z } from "date-fns";
5
- import { cn as oe, padValidDateString as ce, maskDate as ie } from "../../../lib/utils.js";
6
- import { Input as se } from "../input/input.js";
7
- import { Popover as le, PopoverAnchor as ae, PopoverContent as pe } from "../../feedback/popover/popover.js";
8
- import { Calendar as de } from "../../data-display/calendar/calendar.js";
9
- import { Tooltip as E, TooltipTrigger as O, TooltipContent as $ } from "../../feedback/tooltip/tooltip.js";
10
- import { resolveWeekSelection as fe } from "../../../lib/fiscal-calendar.js";
11
- import { useImpactNovaI18n as he } from "../../../i18n/use-impact-nova-i18n.js";
12
- import { getDateFnsLocale as ue } from "../../../i18n/getDateFnsLocale.js";
13
- import { coerceSingleWeekApply as ke, coerceSingleWeek as me } from "./calendar-selection-adapters.js";
14
- import { buildDateBoundsMatcher as ge } from "../../../lib/date-bounds-matcher.js";
15
- const d = (e, s = "MM/dd/yyyy", n) => {
16
- const W = z(e.startDate, s, n ? { locale: n } : {}), D = z(e.endDate, s, n ? { locale: n } : {});
17
- return `${W} - ${D}`;
18
- }, ye = i.forwardRef(
1
+ import { jsxs as C, jsx as a } from "react/jsx-runtime";
2
+ import * as s from "react";
3
+ import { Cross as ve, CalendarMonth as Ce } from "impact-nova-icons";
4
+ import { format as O } from "date-fns";
5
+ import { cn as We } from "../../../lib/utils.js";
6
+ import { usePickerDismissActionsRef as Re, usePickerFooterDismissNudge as Pe, isDateInputInvalid as be, resolveDateInputOnBlur as xe, maskDateInput as Ee, parseDateInput as Ae, resolveDateInputOnEnter as Ne } from "./date-input-behavior.js";
7
+ import { Input as Se } from "../input/input.js";
8
+ import { Popover as Te, PopoverAnchor as we, PopoverContent as Ve } from "../../feedback/popover/popover.js";
9
+ import { Calendar as Le } from "../../data-display/calendar/calendar.js";
10
+ import { Tooltip as X, TooltipTrigger as Z, TooltipContent as _ } from "../../feedback/tooltip/tooltip.js";
11
+ import { resolveWeekSelection as Oe } from "../../../lib/fiscal-calendar.js";
12
+ import { useImpactNovaI18n as je } from "../../../i18n/use-impact-nova-i18n.js";
13
+ import { getDateFnsLocale as Be } from "../../../i18n/getDateFnsLocale.js";
14
+ import { coerceSingleWeekApply as Ke, coerceSingleWeek as Me } from "./calendar-selection-adapters.js";
15
+ import { buildDateBoundsMatcher as ze } from "../../../lib/date-bounds-matcher.js";
16
+ const Y = (t, c = "MM/dd/yyyy", n) => {
17
+ const W = O(t.startDate, c, n ? { locale: n } : {}), R = O(t.endDate, c, n ? { locale: n } : {});
18
+ return `${W} - ${R}`;
19
+ }, h = (t, c, n) => t ? O(t.startDate, c, n ? { locale: n } : {}) : "", He = s.forwardRef(
19
20
  ({
20
- value: e,
21
- onChange: s,
21
+ value: t,
22
+ onChange: c,
22
23
  format: n = "MM/dd/yyyy",
23
24
  placeholder: W,
24
- minDate: D,
25
- maxDate: H,
26
- startMonth: q,
27
- endMonth: G,
28
- showFooter: f = !0,
25
+ minDate: R,
26
+ maxDate: F,
27
+ startMonth: ee,
28
+ endMonth: te,
29
+ showFooter: l = !0,
29
30
  calendarType: P = "calendar",
30
- fiscalMode: I = "basic",
31
- selectionMode: N = "week",
32
- fiscalMonthPattern: b,
33
- fiscalYearStartMonth: M = 1,
34
- weekStartsOn: V = 1,
35
- disabled: g,
36
- className: J,
37
- ...K
38
- }, Q) => {
39
- const { locale: A, t: m } = he(), r = i.useMemo(() => ue(A), [A]), U = W ?? m("datePicker.selectWeek"), L = i.useRef(null);
40
- i.useImperativeHandle(Q, () => L.current);
41
- const [l, h] = i.useState(!1), [T, a] = i.useState(e), [u, p] = i.useState(e ? d(e, n, r) : ""), [X, C] = i.useState(e?.startDate || /* @__PURE__ */ new Date());
42
- i.useEffect(() => {
43
- l || (p(e ? d(e, n, r) : ""), a(e));
44
- }, [l, e, n, r]), i.useEffect(() => {
45
- l && (a(e), C(e?.startDate || /* @__PURE__ */ new Date()), p(e ? d(e, n, r) : ""));
46
- }, [l, e, n, r]);
47
- const Z = (t) => {
48
- const c = me(t);
49
- a(c), c && p(d(c, n, r)), f || (s?.(c), h(!1));
50
- }, _ = (t) => {
51
- const c = ke(t, T);
52
- s?.(c), h(!1);
53
- }, Y = () => {
54
- a(e), p(e ? d(e, n, r) : ""), h(!1);
55
- }, R = () => {
56
- a(void 0), p(""), s?.(void 0), f || h(!1);
57
- }, j = (t) => fe(t, {
58
- calendarType: P,
59
- fiscalMode: I,
60
- selectionMode: N,
61
- fiscalMonthPattern: b,
62
- fiscalYearStartMonth: M,
63
- weekStartsOn: V
64
- }), F = (t) => {
65
- const c = t.target.value, k = ie(c, n, u);
66
- if (p(k), k === "") {
67
- a(void 0), f || s?.(void 0);
31
+ fiscalMode: b = "basic",
32
+ selectionMode: x = "week",
33
+ fiscalMonthPattern: E,
34
+ fiscalYearStartMonth: A = 1,
35
+ weekStartsOn: N = 1,
36
+ disabled: u,
37
+ className: ne,
38
+ ...re
39
+ }, se) => {
40
+ const { locale: j, t: k } = je(), o = s.useMemo(() => Be(j), [j]), ie = W ?? k("datePicker.selectWeek"), B = s.useRef(null), K = s.useRef(null), I = s.useRef(!1);
41
+ s.useImperativeHandle(se, () => B.current);
42
+ const [i, M] = s.useState(!1), z = Re(), { footerFlashKey: oe, footerFlashTarget: ce, popoverHandlers: ae } = Pe(l, i, z, K), [le, S] = s.useState(!1), [p, f] = s.useState(t), [y, m] = s.useState(""), [pe, D] = s.useState(t?.startDate || /* @__PURE__ */ new Date()), ue = t ? Y(t, n, o) : "", H = p ? Y(p, n, o) : "", T = i || le, fe = T ? y : H, $ = s.useCallback(() => {
43
+ f(t), m(h(t, n, o)), D(t?.startDate || /* @__PURE__ */ new Date());
44
+ }, [t, n, o]), v = s.useCallback(() => {
45
+ m(h(p ?? t, n, o)), D((p ?? t)?.startDate || /* @__PURE__ */ new Date());
46
+ }, [p, t, n, o]);
47
+ s.useEffect(() => {
48
+ i || f(t);
49
+ }, [i, t]);
50
+ const q = s.useRef(!1);
51
+ s.useEffect(() => {
52
+ i && !q.current && v(), q.current = i;
53
+ }, [i, v]);
54
+ const d = () => {
55
+ S(!1), M(!1);
56
+ }, g = (e) => {
57
+ if (!u) {
58
+ if (e) {
59
+ v(), M(!0);
60
+ return;
61
+ }
62
+ l || d();
63
+ }
64
+ }, w = s.useCallback(
65
+ (e) => Oe(e, {
66
+ calendarType: P,
67
+ fiscalMode: b,
68
+ selectionMode: x,
69
+ fiscalMonthPattern: E,
70
+ fiscalYearStartMonth: A,
71
+ weekStartsOn: N
72
+ }),
73
+ [
74
+ P,
75
+ b,
76
+ x,
77
+ E,
78
+ A,
79
+ N
80
+ ]
81
+ ), de = (e) => {
82
+ const r = Me(e);
83
+ f(r), r && (m(h(r, n, o)), D(r.startDate)), l || (c?.(r), d());
84
+ }, G = (e) => {
85
+ const r = Ke(e, p);
86
+ c?.(r), d();
87
+ }, V = () => {
88
+ $(), d();
89
+ }, J = () => {
90
+ f(void 0), m(""), c?.(void 0), l || d();
91
+ }, me = (e) => {
92
+ const r = w(e);
93
+ f(r), m(h(r, n, o)), D(e), c?.(r), d();
94
+ }, ke = (e) => {
95
+ const r = Ee(e.target.value, n, y);
96
+ if (m(r), r === "") {
97
+ f(void 0), l || c?.(void 0);
98
+ return;
99
+ }
100
+ const { parsed: L, isValid: Ie } = Ae(r, n, o);
101
+ if (Ie && L) {
102
+ const U = w(L);
103
+ f(U), D(L), l || c?.(U);
104
+ }
105
+ }, ye = () => {
106
+ if (S(!1), i) return;
107
+ const e = xe(
108
+ y,
109
+ n,
110
+ h(p ?? t, n, o),
111
+ o
112
+ );
113
+ if (e.resetToCommitted) {
114
+ $();
115
+ return;
116
+ }
117
+ if (e.parsed) {
118
+ const r = w(e.parsed);
119
+ f(r), m(h(r, n, o)), l || c?.(r);
68
120
  return;
69
121
  }
70
- const w = S(k, n, /* @__PURE__ */ new Date(), { locale: r });
71
- if (x(w) && k.length === n.length) {
72
- const v = j(w);
73
- a(v), C(w), f || s?.(v);
122
+ y || (f(void 0), l || c?.(void 0));
123
+ }, De = () => {
124
+ if (i && l) {
125
+ G();
126
+ return;
74
127
  }
75
- }, ee = () => {
76
- if (l) return;
77
- const t = ce(u, n), c = S(t, n, /* @__PURE__ */ new Date(), { locale: r });
78
- if (!x(c) || t.length !== n.length)
79
- p(e ? d(e, n, r) : ""), a(e);
80
- else if (p(t), !f) {
81
- const k = j(c);
82
- s?.(k);
128
+ const e = Ne(y, n, o);
129
+ if (e.parsed) {
130
+ l && me(e.parsed);
131
+ return;
83
132
  }
84
- }, B = (e ? d(e, n, r) : "") !== u, ne = u.length === n.length && !x(S(u, n, /* @__PURE__ */ new Date(), { locale: r }));
85
- return /* @__PURE__ */ y(le, { open: l, onOpenChange: (t) => !g && h(t), children: [
86
- /* @__PURE__ */ o(ae, { asChild: !0, children: /* @__PURE__ */ o("div", { "data-component": "week-picker", "data-state": l ? "open" : "closed", "data-pending": B || void 0, children: /* @__PURE__ */ o(
87
- se,
133
+ i || (I.current = !0, g(!0));
134
+ }, Q = ue !== H, ge = T && be(y, n, o), he = s.useCallback(() => p && (!t || p.startDate.getTime() !== t.startDate.getTime()) ? "apply" : "cancel", [p, t]);
135
+ return s.useLayoutEffect(() => {
136
+ z.current = {
137
+ onDismiss: V,
138
+ resolveFlash: he
139
+ };
140
+ }), /* @__PURE__ */ C(Te, { open: u ? !1 : i, onOpenChange: g, children: [
141
+ /* @__PURE__ */ a(we, { asChild: !0, children: /* @__PURE__ */ a(
142
+ "div",
88
143
  {
89
- ref: L,
90
- value: u,
91
- onChange: F,
92
- onBlur: ee,
93
- onClick: () => !g && h(!0),
94
- placeholder: l ? n : U,
95
- disabled: g,
96
- "data-form-control": "input",
97
- className: oe(
98
- "cursor-pointer",
99
- ne ? "text-destructive" : B ? "text-content-placeholder" : "",
100
- J
101
- ),
102
- suffix: /* @__PURE__ */ y("div", { className: "flex items-center gap-1", children: [
103
- e && !g && /* @__PURE__ */ y(E, { children: [
104
- /* @__PURE__ */ o(O, { asChild: !0, children: /* @__PURE__ */ o(
105
- "button",
106
- {
107
- type: "button",
108
- tabIndex: 0,
109
- "aria-label": m("calendar.clear"),
110
- onClick: (t) => {
111
- t.stopPropagation(), R();
112
- },
113
- className: "inline-flex size-4 items-center justify-center bg-transparent border-none p-0 cursor-pointer",
114
- children: /* @__PURE__ */ o(te, { className: "size-3 hover:text-content" })
115
- }
116
- ) }),
117
- /* @__PURE__ */ o($, { variant: "tertiary", side: "top", children: m("calendar.clear") })
118
- ] }),
119
- /* @__PURE__ */ y(E, { children: [
120
- /* @__PURE__ */ o(O, { asChild: !0, children: /* @__PURE__ */ o(re, { className: "h-4 w-4 text-secondary-foreground" }) }),
121
- /* @__PURE__ */ o($, { variant: "tertiary", side: "top", children: m("datePicker.selectWeek") })
122
- ] })
123
- ] }),
124
- ...K
144
+ ref: K,
145
+ "data-component": "week-picker",
146
+ "data-state": i ? "open" : "closed",
147
+ "data-pending": Q || void 0,
148
+ children: /* @__PURE__ */ a(
149
+ Se,
150
+ {
151
+ ref: B,
152
+ value: fe,
153
+ onChange: ke,
154
+ onFocus: () => {
155
+ u || (S(!0), v());
156
+ },
157
+ onBlur: ye,
158
+ onClick: () => !u && g(!0),
159
+ onKeyDown: (e) => {
160
+ e.key === "Enter" && !u && (e.preventDefault(), De()), e.key === "ArrowDown" && !i && !u && (e.preventDefault(), I.current = !0, g(!0)), e.key === "Escape" && i && (e.preventDefault(), V());
161
+ },
162
+ placeholder: T ? n : ie,
163
+ disabled: u,
164
+ "data-form-control": "input",
165
+ className: We(
166
+ "cursor-pointer",
167
+ ge ? "text-destructive" : Q ? "text-content-placeholder" : "",
168
+ ne
169
+ ),
170
+ suffix: /* @__PURE__ */ C("div", { className: "flex items-center gap-1", children: [
171
+ t && !u && /* @__PURE__ */ C(X, { children: [
172
+ /* @__PURE__ */ a(Z, { asChild: !0, children: /* @__PURE__ */ a(
173
+ "button",
174
+ {
175
+ type: "button",
176
+ tabIndex: 0,
177
+ "aria-label": k("calendar.clear"),
178
+ onClick: (e) => {
179
+ e.stopPropagation(), J();
180
+ },
181
+ className: "inline-flex size-4 items-center justify-center bg-transparent border-none p-0 cursor-pointer",
182
+ children: /* @__PURE__ */ a(ve, { className: "size-3 hover:text-content" })
183
+ }
184
+ ) }),
185
+ /* @__PURE__ */ a(_, { variant: "tertiary", side: "top", children: k("calendar.clear") })
186
+ ] }),
187
+ /* @__PURE__ */ C(X, { children: [
188
+ /* @__PURE__ */ a(Z, { asChild: !0, children: /* @__PURE__ */ a(
189
+ "button",
190
+ {
191
+ type: "button",
192
+ tabIndex: 0,
193
+ "aria-label": k("datePicker.selectWeek"),
194
+ onClick: (e) => {
195
+ e.stopPropagation(), u || (i ? d() : g(!0));
196
+ },
197
+ onKeyDown: (e) => {
198
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), e.stopPropagation(), u || (I.current = !0, i ? d() : g(!0)));
199
+ },
200
+ className: "inline-flex items-center justify-center bg-transparent border-none p-0 cursor-pointer",
201
+ children: /* @__PURE__ */ a(Ce, { className: "h-4 w-4 text-secondary-foreground" })
202
+ }
203
+ ) }),
204
+ /* @__PURE__ */ a(_, { variant: "tertiary", side: "top", children: k("datePicker.selectWeek") })
205
+ ] })
206
+ ] }),
207
+ ...re
208
+ }
209
+ )
125
210
  }
126
- ) }) }),
127
- /* @__PURE__ */ o(
128
- pe,
211
+ ) }),
212
+ /* @__PURE__ */ a(
213
+ Ve,
129
214
  {
130
215
  className: "w-auto p-0",
131
216
  align: "start",
132
- "aria-label": m("datePicker.selectWeek"),
133
- onOpenAutoFocus: (t) => t.preventDefault(),
134
- children: /* @__PURE__ */ o(
135
- de,
217
+ "aria-label": k("datePicker.selectWeek"),
218
+ onOpenAutoFocus: (e) => {
219
+ I.current || e.preventDefault(), I.current = !1;
220
+ },
221
+ ...ae,
222
+ children: /* @__PURE__ */ a(
223
+ Le,
136
224
  {
137
225
  pickerType: "week",
138
226
  weekMode: "single",
139
- selectedWeeks: T,
140
- onWeekSelect: Z,
141
- month: X,
142
- onMonthChange: C,
143
- disabled: ge(D, H),
144
- startMonth: q,
145
- endMonth: G,
146
- showFooter: f,
227
+ selectedWeeks: p,
228
+ footerFlashKey: oe,
229
+ footerFlashTarget: ce,
230
+ onWeekSelect: de,
231
+ month: pe,
232
+ onMonthChange: D,
233
+ disabled: ze(R, F),
234
+ startMonth: ee,
235
+ endMonth: te,
236
+ showFooter: l,
147
237
  calendarType: P,
148
- fiscalMode: I,
149
- selectionMode: N,
150
- fiscalMonthPattern: b,
151
- fiscalYearStartMonth: M,
152
- weekStartsOn: V,
153
- onApply: _,
154
- onCancel: Y,
155
- onClear: R,
238
+ fiscalMode: b,
239
+ selectionMode: x,
240
+ fiscalMonthPattern: E,
241
+ fiscalYearStartMonth: A,
242
+ weekStartsOn: N,
243
+ onApply: G,
244
+ onCancel: V,
245
+ onClear: J,
156
246
  captionLayout: "dropdown"
157
247
  }
158
248
  )
@@ -161,7 +251,7 @@ const d = (e, s = "MM/dd/yyyy", n) => {
161
251
  ] });
162
252
  }
163
253
  );
164
- ye.displayName = "WeekPicker";
254
+ He.displayName = "WeekPicker";
165
255
  export {
166
- ye as WeekPicker
256
+ He as WeekPicker
167
257
  };