bananas-commerce-admin 0.16.1 → 0.17.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 (63) hide show
  1. package/dist/esm/contexts/DashboardFilterContext.js +88 -28
  2. package/dist/esm/contexts/DashboardFilterContext.js.map +1 -1
  3. package/dist/esm/extensions/pos/components/DashboardFilter.js +2 -47
  4. package/dist/esm/extensions/pos/components/DashboardFilter.js.map +1 -1
  5. package/dist/esm/extensions/pos/components/FilterMenu/DateField.js +10 -0
  6. package/dist/esm/extensions/pos/components/FilterMenu/DateField.js.map +1 -0
  7. package/dist/esm/extensions/pos/components/FilterMenu/DateRangePicker.js +173 -0
  8. package/dist/esm/extensions/pos/components/FilterMenu/DateRangePicker.js.map +1 -0
  9. package/dist/esm/extensions/pos/components/FilterMenu/PresetList.js +21 -0
  10. package/dist/esm/extensions/pos/components/FilterMenu/PresetList.js.map +1 -0
  11. package/dist/esm/extensions/pos/components/FilterMenu/Select.js +12 -0
  12. package/dist/esm/extensions/pos/components/FilterMenu/Select.js.map +1 -0
  13. package/dist/esm/extensions/pos/components/FilterMenu/index.js +75 -0
  14. package/dist/esm/extensions/pos/components/FilterMenu/index.js.map +1 -0
  15. package/dist/esm/extensions/pos/components/PresetSelect.js +8 -81
  16. package/dist/esm/extensions/pos/components/PresetSelect.js.map +1 -1
  17. package/dist/esm/extensions/pos/components/SitesAmountsList.js +1 -1
  18. package/dist/esm/extensions/pos/components/SitesAmountsList.js.map +1 -1
  19. package/dist/esm/extensions/pos/contrib/PaymentMethodWidget.js +1 -1
  20. package/dist/esm/extensions/pos/contrib/PaymentMethodWidget.js.map +1 -1
  21. package/dist/esm/extensions/pos/contrib/PurchaseAmountWidget.js +4 -3
  22. package/dist/esm/extensions/pos/contrib/PurchaseAmountWidget.js.map +1 -1
  23. package/dist/esm/extensions/pos/contrib/PurchaseCountWidget.js +7 -8
  24. package/dist/esm/extensions/pos/contrib/PurchaseCountWidget.js.map +1 -1
  25. package/dist/esm/extensions/pos/utils/diffDatesByGranularity.js +1 -1
  26. package/dist/esm/extensions/pos/utils/diffDatesByGranularity.js.map +1 -1
  27. package/dist/esm/extensions/subscription/contrib/RunningSubscriptionCountWidget.js +1 -1
  28. package/dist/esm/extensions/subscription/contrib/RunningSubscriptionCountWidget.js.map +1 -1
  29. package/dist/esm/extensions/subscription/contrib/SubscriptionEventCountWidget.js +2 -2
  30. package/dist/esm/extensions/subscription/contrib/SubscriptionEventCountWidget.js.map +1 -1
  31. package/dist/esm/extensions/subscription/contrib/SubscriptionStateCountWidget.js +1 -1
  32. package/dist/esm/extensions/subscription/contrib/SubscriptionStateCountWidget.js.map +1 -1
  33. package/dist/esm/pages/DashboardPage.js +4 -2
  34. package/dist/esm/pages/DashboardPage.js.map +1 -1
  35. package/dist/types/contexts/DashboardFilterContext.d.ts +13 -9
  36. package/dist/types/extensions/pos/components/FilterMenu/DateField.d.ts +7 -0
  37. package/dist/types/extensions/pos/components/FilterMenu/DateRangePicker.d.ts +22 -0
  38. package/dist/types/extensions/pos/components/FilterMenu/PresetList.d.ts +3 -0
  39. package/dist/types/extensions/pos/components/FilterMenu/Select.d.ts +13 -0
  40. package/dist/types/extensions/pos/components/FilterMenu/index.d.ts +5 -0
  41. package/dist/types/extensions/pos/utils/diffDatesByGranularity.d.ts +1 -3
  42. package/package.json +1 -1
  43. package/src/contexts/DashboardFilterContext.tsx +93 -39
  44. package/src/extensions/pos/components/DashboardFilter.tsx +2 -71
  45. package/src/extensions/pos/components/FilterMenu/DateField.tsx +22 -0
  46. package/src/extensions/pos/components/FilterMenu/DateRangePicker.tsx +245 -0
  47. package/src/extensions/pos/components/FilterMenu/PresetList.tsx +35 -0
  48. package/src/extensions/pos/components/FilterMenu/Select.tsx +37 -0
  49. package/src/extensions/pos/components/FilterMenu/index.tsx +124 -0
  50. package/src/extensions/pos/components/PresetSelect.tsx +10 -82
  51. package/src/extensions/pos/components/SitesAmountsList.tsx +1 -1
  52. package/src/extensions/pos/contrib/PaymentMethodWidget.tsx +1 -1
  53. package/src/extensions/pos/contrib/PurchaseAmountWidget.tsx +7 -5
  54. package/src/extensions/pos/contrib/PurchaseCountWidget.tsx +7 -8
  55. package/src/extensions/pos/utils/diffDatesByGranularity.ts +6 -5
  56. package/src/extensions/subscription/contrib/RunningSubscriptionCountWidget.tsx +1 -1
  57. package/src/extensions/subscription/contrib/SubscriptionEventCountWidget.tsx +2 -2
  58. package/src/extensions/subscription/contrib/SubscriptionStateCountWidget.tsx +1 -1
  59. package/src/pages/DashboardPage.tsx +3 -2
  60. package/dist/esm/extensions/pos/utils/interpolatePurchaseCounts.js +0 -24
  61. package/dist/esm/extensions/pos/utils/interpolatePurchaseCounts.js.map +0 -1
  62. package/dist/types/extensions/pos/utils/interpolatePurchaseCounts.d.ts +0 -3
  63. package/src/extensions/pos/utils/interpolatePurchaseCounts.ts +0 -37
@@ -1,4 +1,5 @@
1
- import React, { useEffect, useState } from "react";
1
+ import React, { useCallback, useState } from "react";
2
+ import { useSearchParams } from "react-router-dom";
2
3
  import { DateTime } from "luxon";
3
4
  import { isGranularity } from "../types/dashboard";
4
5
  import { useRouter } from "./RouterContext";
@@ -6,62 +7,121 @@ import { useRouter } from "./RouterContext";
6
7
  * The default filter for the dashboard,used when the filter is not present in the URL.
7
8
  * Might as well be a function to avoid stale dates.
8
9
  */
9
- const defaultFilter = () => ({
10
- preset: "last_week",
11
- granularity: "day",
12
- startDate: DateTime.now().minus({ weeks: 1 }).startOf("week"),
13
- endDate: DateTime.now().minus({ weeks: 1 }).endOf("week"),
14
- endDateInclusive: DateTime.now().minus({ weeks: 1 }).endOf("week"),
15
- });
10
+ export function defaultFilter() {
11
+ return dashboardFilterFromPreset("last_week");
12
+ }
13
+ export function dashboardFilterFromPreset(preset) {
14
+ switch (preset) {
15
+ case "today":
16
+ return {
17
+ preset: "today",
18
+ granularity: "day",
19
+ startDate: DateTime.now().startOf("day"),
20
+ endDate: DateTime.now().endOf("day"),
21
+ };
22
+ case "yesterday":
23
+ return {
24
+ preset: "yesterday",
25
+ granularity: "day",
26
+ startDate: DateTime.now().minus({ days: 1 }).startOf("day"),
27
+ endDate: DateTime.now().minus({ days: 1 }).endOf("day"),
28
+ };
29
+ case "this_week":
30
+ return {
31
+ preset: "this_week",
32
+ granularity: "day",
33
+ startDate: DateTime.now().startOf("week"),
34
+ endDate: DateTime.now().endOf("day"),
35
+ };
36
+ case "last_week":
37
+ return {
38
+ preset: "last_week",
39
+ granularity: "day",
40
+ startDate: DateTime.now().minus({ weeks: 1 }).startOf("week"),
41
+ endDate: DateTime.now().minus({ weeks: 1 }).endOf("week"),
42
+ };
43
+ case "this_month":
44
+ return {
45
+ preset: "this_month",
46
+ granularity: "week",
47
+ startDate: DateTime.now().startOf("month"),
48
+ endDate: DateTime.now().endOf("day"),
49
+ };
50
+ case "last_month":
51
+ return {
52
+ preset: "last_month",
53
+ granularity: "week",
54
+ startDate: DateTime.now().minus({ months: 1 }).startOf("month"),
55
+ endDate: DateTime.now().minus({ months: 1 }).endOf("month"),
56
+ };
57
+ case "this_year":
58
+ return {
59
+ preset: "this_year",
60
+ granularity: "month",
61
+ startDate: DateTime.now().startOf("year"),
62
+ endDate: DateTime.now().endOf("day"),
63
+ };
64
+ case "last_year":
65
+ return {
66
+ preset: "last_year",
67
+ granularity: "month",
68
+ startDate: DateTime.now().minus({ years: 1 }).startOf("year"),
69
+ endDate: DateTime.now().minus({ years: 1 }).endOf("year"),
70
+ };
71
+ }
72
+ throw new TypeError(`Unknown filter preset: ${preset}`);
73
+ }
16
74
  /**
17
75
  * Load the initial filter from session storage.
18
76
  * If the filter is not present or invalid, return `defaultFilter`.
19
77
  */
20
- const loadInitialFilter = () => {
21
- // try to get a filter from the URL
22
- const url = new URL(window.location.href);
78
+ export function dashboardFilterFromSearchParams(searchParams) {
23
79
  // The URL always has to store the inclusive date since the backend expects it.
24
- const end_date_inclusive = url.searchParams.get("end_date");
25
- const start_date = url.searchParams.get("start_date");
26
- const granularity = url.searchParams.get("granularity");
27
- if (start_date == null || end_date_inclusive == null)
80
+ const searchEndDate = searchParams.get("end_date");
81
+ const searchStartDate = searchParams.get("start_date");
82
+ const granularity = searchParams.get("granularity");
83
+ if (searchStartDate == null || searchEndDate == null)
28
84
  return defaultFilter();
29
85
  if (!isGranularity(granularity))
30
86
  return defaultFilter();
31
- const startDate = DateTime.fromISO(start_date);
32
- const endDateInclusive = DateTime.fromISO(end_date_inclusive);
87
+ const startDate = DateTime.fromISO(searchStartDate);
88
+ const endDate = DateTime.fromISO(searchEndDate).minus({ days: 1 }).endOf("day");
33
89
  return {
34
90
  startDate,
35
- endDateInclusive,
36
- endDate: endDateInclusive.minus({ days: 1 }),
91
+ endDate,
37
92
  granularity,
38
93
  preset: "custom",
39
94
  };
40
- };
95
+ }
41
96
  export const DashboardFilterContext = React.createContext(undefined);
42
97
  export const useDashboardFilter = () => React.useContext(DashboardFilterContext);
43
98
  /**
44
99
  * Convert `DashboardFilter` to a query string that can be used in the URL.
45
100
  * Uses the inclusive `end_date` to make sure the backend always get the correct date.
46
101
  */
47
- export function filterToQueryParams({ startDate, endDateInclusive, granularity, }) {
48
- const start_date = startDate.toISO();
49
- const end_date = endDateInclusive.toISO();
102
+ export function dashboardFilterToSearchParams({ startDate, endDate, granularity, }) {
103
+ const start_date = startDate.toISO({ suppressSeconds: true, suppressMilliseconds: true });
104
+ const end_date = endDate
105
+ .plus({ days: 1 })
106
+ .startOf("day")
107
+ .toISO({ suppressSeconds: true, suppressMilliseconds: true });
50
108
  if (start_date == null || end_date == null)
51
109
  return null;
52
110
  return { start_date, end_date, granularity };
53
111
  }
54
112
  const DashboardFilterContextProvider = ({ children, }) => {
55
113
  const { navigate } = useRouter();
56
- const [filter, setFilter] = useState(loadInitialFilter());
57
- useEffect(() => {
58
- const query = filterToQueryParams(filter);
114
+ const [searchParams] = useSearchParams();
115
+ const [filter, setFilterState] = useState(dashboardFilterFromSearchParams(searchParams));
116
+ const setFilter = useCallback((newFilter) => {
117
+ setFilterState(newFilter);
118
+ const query = dashboardFilterToSearchParams(newFilter);
59
119
  if (query == null) {
60
- console.error("[DASHBOARD_FILTER_CONTEXT] filter", filter);
120
+ console.error("[DASHBOARD_FILTER_CONTEXT] filter", newFilter);
61
121
  return;
62
122
  }
63
123
  navigate(undefined, { query, replace: true });
64
- }, [filter]);
124
+ }, []);
65
125
  return (React.createElement(DashboardFilterContext.Provider, { value: { filter, setFilter } }, children));
66
126
  };
67
127
  export default DashboardFilterContextProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardFilterContext.js","sourceRoot":"","sources":["../../../src/contexts/DashboardFilterContext.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DashboardFilterContext.js","sourceRoot":"","sources":["../../../src/contexts/DashboardFilterContext.tsx"],"names":[],"mappings":"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"}
@@ -1,54 +1,9 @@
1
1
  import React from "react";
2
2
  import { Stack } from "@mui/material";
3
- import { DateTime } from "luxon";
4
- import { useDashboardFilter } from "../../../contexts/DashboardFilterContext";
5
- import { useI18n } from "../../../contexts/I18nContext";
6
- import { isGranularity } from "../../../types/dashboard";
7
- import DatePicker from "./DatePicker";
8
- import FilterSelect from "./FilterSelect";
9
- import PresetSelect from "./PresetSelect";
3
+ import FilterMenu from "./FilterMenu";
10
4
  const DashboardFilter = () => {
11
- const { t } = useI18n();
12
- const { filter, setFilter } = useDashboardFilter();
13
- const granularities = [
14
- { label: "Day", value: "day", minSelectedDays: 0 },
15
- { label: "Week", value: "week", minSelectedDays: 7 },
16
- { label: "Month", value: "month", minSelectedDays: 31 },
17
- { label: "Quarter", value: "quarter", minSelectedDays: 90 },
18
- { label: "Year", value: "year", minSelectedDays: 365 },
19
- ].filter((granularity) => granularity.minSelectedDays <= filter.endDate.diff(filter.startDate, "days").days);
20
5
  return (React.createElement(Stack, { alignItems: "center", direction: "row", gap: 1.5, ml: "auto" },
21
- React.createElement(DatePicker, { label: "Start date", maxDate: filter.endDate, value: filter.startDate, onChange: (startDate) => {
22
- if (startDate != null) {
23
- setFilter({ ...filter, preset: "custom", startDate });
24
- }
25
- else {
26
- console.error("Invalid startDate from picker.");
27
- }
28
- } }),
29
- React.createElement(DatePicker, { label: "End date", maxDate: DateTime.now(), minDate: filter.startDate, value: filter.endDate, onChange: (endDate) => {
30
- if (endDate != null) {
31
- setFilter({
32
- ...filter,
33
- preset: "custom",
34
- endDate,
35
- endDateInclusive: endDate.plus({ days: 1 }),
36
- });
37
- }
38
- else {
39
- console.error("Invalid endDate from picker.");
40
- }
41
- } }),
42
- React.createElement(PresetSelect, null),
43
- React.createElement(FilterSelect, { items: granularities, label: t("Granularity"), value: filter.granularity, width: 130, onChange: (event) => {
44
- const granularity = event.target.value;
45
- if (isGranularity(granularity)) {
46
- setFilter({ ...filter, preset: "custom", granularity });
47
- }
48
- else {
49
- console.error("Invalid granularity");
50
- }
51
- } })));
6
+ React.createElement(FilterMenu, null)));
52
7
  };
53
8
  export default DashboardFilter;
54
9
  //# sourceMappingURL=DashboardFilter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardFilter.js","sourceRoot":"","sources":["../../../../../src/extensions/pos/components/DashboardFilter.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DashboardFilter.js","sourceRoot":"","sources":["../../../../../src/extensions/pos/components/DashboardFilter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,eAAe,GAAa,GAAG,EAAE;IACrC,OAAO,CACL,oBAAC,KAAK,IAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,KAAK,EAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAC,MAAM;QAC5D,oBAAC,UAAU,OAAG,CACR,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { AdapterLuxon } from "@mui/x-date-pickers/AdapterLuxon";
3
+ import { DateField as MuiDateField, } from "@mui/x-date-pickers/DateField";
4
+ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
5
+ export const DateField = ({ size = "small", ...props }) => {
6
+ return (React.createElement(LocalizationProvider, { dateAdapter: AdapterLuxon },
7
+ React.createElement(MuiDateField, { size: size, ...props })));
8
+ };
9
+ export default DateField;
10
+ //# sourceMappingURL=DateField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateField.js","sourceRoot":"","sources":["../../../../../../src/extensions/pos/components/FilterMenu/DateField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EACL,SAAS,IAAI,YAAY,GAE1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAMhF,MAAM,CAAC,MAAM,SAAS,GAA6B,CAAC,EAAE,IAAI,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IAClF,OAAO,CACL,oBAAC,oBAAoB,IAAC,WAAW,EAAE,YAAY;QAC7C,oBAAC,YAAY,IAAC,IAAI,EAAE,IAAI,KAAM,KAAK,GAAI,CAClB,CACxB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,173 @@
1
+ import * as React from "react";
2
+ import { useState } from "react";
3
+ import { blue } from "@mui/material/colors";
4
+ import { styled } from "@mui/material/styles";
5
+ import { AdapterLuxon } from "@mui/x-date-pickers/AdapterLuxon";
6
+ import { DateCalendar } from "@mui/x-date-pickers/DateCalendar";
7
+ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
8
+ import { PickersDay as MuiPickersDay, } from "@mui/x-date-pickers/PickersDay";
9
+ import { DateTime } from "luxon";
10
+ import { useDashboardFilter } from "../../../../contexts/DashboardFilterContext";
11
+ // TODO Clean up
12
+ // TODO Use theme colors instead of blue
13
+ export const PickersDay = styled(MuiPickersDay, {
14
+ shouldForwardProp: (prop) => prop !== "isSelected" && prop !== "isHovered" && prop !== "isStart" && prop !== "isEnd",
15
+ })(({ theme, isSelected, isHovered, isStart, isEnd, day, selecting }) => ({
16
+ borderRadius: 0,
17
+ boxSizing: "border-box",
18
+ border: "2px solid transparent",
19
+ width: 40,
20
+ height: 40,
21
+ "&.MuiPickersDay-today": {
22
+ borderColor: "transparent",
23
+ "& .content": {
24
+ border: `1px solid ${theme.palette.grey[500]}`,
25
+ borderRadius: "50%",
26
+ width: 40,
27
+ height: 40,
28
+ },
29
+ },
30
+ "& .content": {
31
+ boxSizing: "border-box",
32
+ display: "flex",
33
+ alignItems: "center",
34
+ justifyContent: "center",
35
+ zIndex: 1,
36
+ position: "absolute",
37
+ borderRadius: "50%",
38
+ },
39
+ "&:hover .content": {
40
+ border: `1px solid ${theme.palette.grey[800]}`,
41
+ boxSizing: "border-box",
42
+ width: 40,
43
+ height: 40,
44
+ },
45
+ ...(isSelected && {
46
+ backgroundColor: blue[50],
47
+ "&:hover, &:focus": {
48
+ backgroundColor: blue[50],
49
+ },
50
+ "&:hover .content": {
51
+ backgroundColor: blue[100],
52
+ width: 40,
53
+ height: 40,
54
+ },
55
+ }),
56
+ ...((isStart || isEnd) && {
57
+ "& .content": {
58
+ display: "flex",
59
+ alignItems: "center",
60
+ justifyContent: "center",
61
+ color: theme.palette.primary.contrastText,
62
+ zIndex: 0,
63
+ position: "absolute",
64
+ width: 40,
65
+ height: 40,
66
+ backgroundColor: (isStart && selecting === "end") || (isEnd && selecting === "start")
67
+ ? blue[500]
68
+ : blue[300],
69
+ borderRadius: "50%",
70
+ },
71
+ }),
72
+ ...(isStart && {
73
+ backgroundColor: blue[50],
74
+ color: theme.palette.primary.contrastText,
75
+ borderTopLeftRadius: "50%",
76
+ borderBottomLeftRadius: "50%",
77
+ position: "relative",
78
+ "&:hover, &:focus": {
79
+ backgroundColor: blue[50],
80
+ },
81
+ }),
82
+ ...(isEnd && {
83
+ backgroundColor: blue[50],
84
+ color: theme.palette.primary.contrastText,
85
+ borderTopRightRadius: "50%",
86
+ borderBottomRightRadius: "50%",
87
+ "&:hover, &:focus": {
88
+ backgroundColor: blue[50],
89
+ },
90
+ }),
91
+ ...(isHovered && {
92
+ boxSizing: "border-box",
93
+ borderTop: `2px dashed ${theme.palette.grey[300]}`,
94
+ borderBottom: `2px dashed ${theme.palette.grey[300]}`,
95
+ "& *": {
96
+ boxSizing: "border-box",
97
+ },
98
+ }),
99
+ ...(day.weekday === 1 && {
100
+ borderTopLeftRadius: "50%",
101
+ borderBottomLeftRadius: "50%",
102
+ }),
103
+ ...(day.weekday === 7 && {
104
+ borderTopRightRadius: "50%",
105
+ borderBottomRightRadius: "50%",
106
+ }),
107
+ }));
108
+ const isInRange = (day, startDate, endDate) => {
109
+ if (day.startOf("day") >= startDate.startOf("day") && day.endOf("day") <= endDate.endOf("day")) {
110
+ return true;
111
+ }
112
+ return false;
113
+ };
114
+ const getHovered = (day, hoveredDay, startDate, endDate, selecting) => {
115
+ if (selecting === "start") {
116
+ return (day.startOf("day") < startDate.startOf("day") && day.endOf("day") > hoveredDay?.startOf("day"));
117
+ }
118
+ else {
119
+ return (day.startOf("day") > endDate.startOf("day") && day.endOf("day") < hoveredDay?.startOf("day"));
120
+ }
121
+ };
122
+ export const Day = ({ day, selectedDay, hoveredDay, startDate, endDate, selecting, ...props }) => {
123
+ const isStart = startDate?.hasSame(day, "day") ?? false;
124
+ const isEnd = endDate?.hasSame(day, "day") ?? false;
125
+ return (React.createElement(PickersDay, { ...props, disableMargin: true, day: day, isEnd: isEnd, isHovered: getHovered(day, hoveredDay, startDate, endDate, selecting), isSelected: isInRange(day, startDate, endDate) && !isStart && !isEnd, isStart: isStart, selected: false, selecting: selecting },
126
+ React.createElement("span", { className: "content" }, day.toFormat("d"))));
127
+ };
128
+ export const DateRangePicker = () => {
129
+ const { filter, setFilter } = useDashboardFilter();
130
+ const [hoveredDay, setHoveredDay] = useState(null);
131
+ const [value, setValue] = useState(DateTime.now());
132
+ const [selecting, setSelecting] = useState("start");
133
+ /**
134
+ * Decide whether to set start or end date,
135
+ * trying to match Mui X DateRange behavior
136
+ */
137
+ const handleChange = (date) => {
138
+ setValue(date);
139
+ if (selecting === "start") {
140
+ if (date >= filter.endDate) {
141
+ setFilter({ ...filter, startDate: date, endDate: date });
142
+ }
143
+ else {
144
+ setFilter({ ...filter, startDate: date });
145
+ }
146
+ setSelecting("end");
147
+ }
148
+ else {
149
+ if (date < filter.startDate) {
150
+ setFilter({ ...filter, startDate: date, endDate: date });
151
+ setSelecting("end");
152
+ }
153
+ else {
154
+ setFilter({ ...filter, endDate: date });
155
+ setSelecting("start");
156
+ }
157
+ }
158
+ };
159
+ return (React.createElement(LocalizationProvider, { dateAdapter: AdapterLuxon },
160
+ React.createElement(DateCalendar, { showDaysOutsideCurrentMonth: true, slotProps: {
161
+ day: (ownerState) => ({
162
+ selecting,
163
+ endDate: filter.endDate,
164
+ startDate: filter.startDate,
165
+ selectedDay: value,
166
+ hoveredDay,
167
+ onPointerEnter: () => setHoveredDay(ownerState.day),
168
+ onPointerLeave: () => setHoveredDay(null),
169
+ }),
170
+ }, slots: { day: Day }, value: value, onChange: handleChange })));
171
+ };
172
+ export default DateRangePicker;
173
+ //# sourceMappingURL=DateRangePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateRangePicker.js","sourceRoot":"","sources":["../../../../../../src/extensions/pos/components/FilterMenu/DateRangePicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { List, ListItem, ListItemButton, ListItemText } from "@mui/material";
3
+ import { dashboardFilterFromPreset, useDashboardFilter, } from "../../../../contexts/DashboardFilterContext";
4
+ import { filterPresets } from "../../../../types/dashboard";
5
+ const PresetList = () => {
6
+ const { setFilter } = useDashboardFilter();
7
+ const handleFilterChange = (value) => {
8
+ try {
9
+ setFilter(dashboardFilterFromPreset(value));
10
+ }
11
+ catch {
12
+ console.warn("Invalid filter preset");
13
+ setFilter(dashboardFilterFromPreset("last_week"));
14
+ }
15
+ };
16
+ return (React.createElement(List, null, filterPresets.map((preset) => (React.createElement(ListItem, { key: preset.value, disablePadding: true },
17
+ React.createElement(ListItemButton, { onClick: () => handleFilterChange(preset.value) },
18
+ React.createElement(ListItemText, { primary: preset.label })))))));
19
+ };
20
+ export default PresetList;
21
+ //# sourceMappingURL=PresetList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PresetList.js","sourceRoot":"","sources":["../../../../../../src/extensions/pos/components/FilterMenu/PresetList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,EACL,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAgB,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC1E,MAAM,UAAU,GAAa,GAAG,EAAE;IAChC,MAAM,EAAE,SAAS,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,MAAM,kBAAkB,GAAG,CAAC,KAAmB,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,SAAS,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,SAAS,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,IAAI,QACF,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC7B,oBAAC,QAAQ,IAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,cAAc;QACzC,oBAAC,cAAc,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,oBAAC,YAAY,IAAC,OAAO,EAAE,MAAM,CAAC,KAAK,GAAI,CACxB,CACR,CACZ,CAAC,CACG,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import FormControl from "@mui/material/FormControl";
3
+ import InputLabel from "@mui/material/InputLabel";
4
+ import MenuItem from "@mui/material/MenuItem";
5
+ import MuiSelect from "@mui/material/Select";
6
+ export const Select = ({ label, value, onChange, items, size = "small", ...props }) => {
7
+ return (React.createElement(FormControl, { size: size },
8
+ React.createElement(InputLabel, null, label),
9
+ React.createElement(MuiSelect, { label: label, value: value, onChange: onChange, ...props }, items.map(({ label, value }) => (React.createElement(MenuItem, { key: value, value: value }, label))))));
10
+ };
11
+ export default Select;
12
+ //# sourceMappingURL=Select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../../../../src/extensions/pos/components/FilterMenu/Select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,SAA6C,MAAM,sBAAsB,CAAC;AASjF,MAAM,CAAC,MAAM,MAAM,GAAgC,CAAC,EAClD,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAK,EACL,IAAI,GAAG,OAAO,EACd,GAAG,KAAK,EACT,EAAE,EAAE;IACH,OAAO,CACL,oBAAC,WAAW,IAAC,IAAI,EAAE,IAAI;QACrB,oBAAC,UAAU,QAAE,KAAK,CAAc;QAChC,oBAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,KAAM,KAAK,IACjE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAC/B,oBAAC,QAAQ,IAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,IAC/B,KAAK,CACG,CACZ,CAAC,CACQ,CACA,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,75 @@
1
+ import React, { useRef, useState } from "react";
2
+ import { Button, Chip, Popover, Stack, Typography } from "@mui/material";
3
+ import { ArrowDropDownIcon } from "@mui/x-date-pickers";
4
+ import { useDashboardFilter } from "../../../../contexts/DashboardFilterContext";
5
+ import { useI18n } from "../../../../contexts/I18nContext";
6
+ import { filterPresets, isGranularity } from "../../../../types/dashboard";
7
+ // import { filterPresets, isGranularity } from "../../types/contrib";
8
+ import DateField from "./DateField";
9
+ import DateRangePicker from "./DateRangePicker";
10
+ import PresetList from "./PresetList";
11
+ import Select from "./Select";
12
+ const FilterMenu = ({}) => {
13
+ const { filter, setFilter } = useDashboardFilter();
14
+ const anchorRef = useRef(null);
15
+ const [isOpen, setIsOpen] = useState(false);
16
+ const { t } = useI18n();
17
+ const handleClose = () => {
18
+ setIsOpen(false);
19
+ };
20
+ const id = isOpen ? "simple-popover" : undefined;
21
+ const granularities = [
22
+ { label: "Day", value: "day", minSelectedDays: 0 },
23
+ { label: "Week", value: "week", minSelectedDays: 7 },
24
+ { label: "Month", value: "month", minSelectedDays: 31 },
25
+ { label: "Quarter", value: "quarter", minSelectedDays: 90 },
26
+ { label: "Year", value: "year", minSelectedDays: 365 },
27
+ ].filter((granularity) => granularity.minSelectedDays <= filter.endDate.diff(filter.startDate, "days").days);
28
+ const setEndDate = (date) => {
29
+ setFilter({
30
+ ...filter,
31
+ preset: "custom",
32
+ endDate: date ?? filter.endDate,
33
+ });
34
+ };
35
+ return (React.createElement("div", null,
36
+ React.createElement(Button, { ref: anchorRef, "aria-describedby": id, sx: {
37
+ display: "flex",
38
+ alignItems: "center",
39
+ gap: 1,
40
+ color: "text.primary",
41
+ fontWeight: 500,
42
+ }, variant: "text", onClick: () => setIsOpen(!isOpen) },
43
+ React.createElement(Chip, { label: filterPresets.find((preset) => preset.value === filter.preset)?.label, size: "small", sx: { borderRadius: 1 } }),
44
+ React.createElement(Typography, { variant: "body2" },
45
+ filter.startDate.year === filter.endDate.year
46
+ ? filter.startDate.toFormat("dd LLL")
47
+ : filter.startDate.toFormat("dd LLL, yyyy"),
48
+ " - ",
49
+ filter.endDate.toFormat("dd LLL, yyyy")),
50
+ React.createElement(ArrowDropDownIcon, null)),
51
+ React.createElement(Popover, { anchorEl: anchorRef.current, anchorOrigin: {
52
+ vertical: "bottom",
53
+ horizontal: "left",
54
+ }, id: id, open: isOpen, onClose: handleClose },
55
+ React.createElement(Stack, { direction: "row", gap: 2 },
56
+ React.createElement(Stack, { sx: { width: 250, borderRight: "1px solid", borderColor: "divider" } },
57
+ React.createElement(PresetList, null)),
58
+ React.createElement(Stack, { direction: "column", gap: 2, p: 2, width: 350 },
59
+ React.createElement(Stack, { alignItems: "center", direction: "row", gap: 2 },
60
+ React.createElement(DateField, { label: "Start date", value: filter.startDate, onChange: (date) => setFilter({ ...filter, startDate: date ?? filter.startDate }) }),
61
+ React.createElement(Typography, { variant: "body2" }, " - "),
62
+ React.createElement(DateField, { label: "End date", value: filter.endDate, onChange: setEndDate })),
63
+ React.createElement(DateRangePicker, null),
64
+ React.createElement(Select, { items: granularities, label: t("Granularity"), size: "small", value: filter.granularity, onChange: (event) => {
65
+ const granularity = event.target.value;
66
+ if (isGranularity(granularity)) {
67
+ setFilter({ ...filter, preset: "custom", granularity });
68
+ }
69
+ else {
70
+ console.error("Invalid granularity");
71
+ }
72
+ } }))))));
73
+ };
74
+ export default FilterMenu;
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/extensions/pos/components/FilterMenu/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE3E,sEAAsE;AACtE,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,MAAM,MAAM,UAAU,CAAC;AAI9B,MAAM,UAAU,GAA8B,CAAC,EAAE,EAAE,EAAE;IACnD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,kBAAkB,EAAE,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IACjD,MAAM,aAAa,GAAG;QACpB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE;QAClD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE;QACpD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE;QACvD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE;QAC3D,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE;KACvD,CAAC,MAAM,CACN,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CACpF,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,IAAqB,EAAE,EAAE;QAC3C,SAAS,CAAC;YACR,GAAG,MAAM;YACT,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,OAAO;SAChC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CACL;QACE,oBAAC,MAAM,IACL,GAAG,EAAE,SAAS,sBACI,EAAE,EACpB,EAAE,EAAE;gBACF,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,GAAG,EAAE,CAAC;gBACN,KAAK,EAAE,cAAc;gBACrB,UAAU,EAAE,GAAG;aAChB,EACD,OAAO,EAAC,MAAM,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;YAEjC,oBAAC,IAAI,IACH,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAC5E,IAAI,EAAC,OAAO,EACZ,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,GACvB;YACF,oBAAC,UAAU,IAAC,OAAO,EAAC,OAAO;gBACxB,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI;oBAC5C,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBACrC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAC5C,KAAK;gBACL,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAC7B;YACb,oBAAC,iBAAiB,OAAG,CACd;QACT,oBAAC,OAAO,IACN,QAAQ,EAAE,SAAS,CAAC,OAAO,EAC3B,YAAY,EAAE;gBACZ,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,MAAM;aACnB,EACD,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW;YAEpB,oBAAC,KAAK,IAAC,SAAS,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC;gBAC3B,oBAAC,KAAK,IAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE;oBACzE,oBAAC,UAAU,OAAG,CACR;gBACR,oBAAC,KAAK,IAAC,SAAS,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG;oBAChD,oBAAC,KAAK,IAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC;wBAC/C,oBAAC,SAAS,IACR,KAAK,EAAC,YAAY,EAClB,KAAK,EAAE,MAAM,CAAC,SAAS,EACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,GACjF;wBACF,oBAAC,UAAU,IAAC,OAAO,EAAC,OAAO,UAAiB;wBAC5C,oBAAC,SAAS,IAAC,KAAK,EAAC,UAAU,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,GAAI,CACrE;oBACR,oBAAC,eAAe,OAAG;oBACnB,oBAAC,MAAM,IACL,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,CAAC,CAAC,aAAa,CAAC,EACvB,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,MAAM,CAAC,WAAW,EACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;4BACvC,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;gCAC/B,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;4BAC1D,CAAC;iCAAM,CAAC;gCACN,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;4BACvC,CAAC;wBACH,CAAC,GACD,CACI,CACF,CACA,CACN,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}