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.
- package/dist/esm/contexts/DashboardFilterContext.js +88 -28
- package/dist/esm/contexts/DashboardFilterContext.js.map +1 -1
- package/dist/esm/extensions/pos/components/DashboardFilter.js +2 -47
- package/dist/esm/extensions/pos/components/DashboardFilter.js.map +1 -1
- package/dist/esm/extensions/pos/components/FilterMenu/DateField.js +10 -0
- package/dist/esm/extensions/pos/components/FilterMenu/DateField.js.map +1 -0
- package/dist/esm/extensions/pos/components/FilterMenu/DateRangePicker.js +173 -0
- package/dist/esm/extensions/pos/components/FilterMenu/DateRangePicker.js.map +1 -0
- package/dist/esm/extensions/pos/components/FilterMenu/PresetList.js +21 -0
- package/dist/esm/extensions/pos/components/FilterMenu/PresetList.js.map +1 -0
- package/dist/esm/extensions/pos/components/FilterMenu/Select.js +12 -0
- package/dist/esm/extensions/pos/components/FilterMenu/Select.js.map +1 -0
- package/dist/esm/extensions/pos/components/FilterMenu/index.js +75 -0
- package/dist/esm/extensions/pos/components/FilterMenu/index.js.map +1 -0
- package/dist/esm/extensions/pos/components/PresetSelect.js +8 -81
- package/dist/esm/extensions/pos/components/PresetSelect.js.map +1 -1
- package/dist/esm/extensions/pos/components/SitesAmountsList.js +1 -1
- package/dist/esm/extensions/pos/components/SitesAmountsList.js.map +1 -1
- package/dist/esm/extensions/pos/contrib/PaymentMethodWidget.js +1 -1
- package/dist/esm/extensions/pos/contrib/PaymentMethodWidget.js.map +1 -1
- package/dist/esm/extensions/pos/contrib/PurchaseAmountWidget.js +4 -3
- package/dist/esm/extensions/pos/contrib/PurchaseAmountWidget.js.map +1 -1
- package/dist/esm/extensions/pos/contrib/PurchaseCountWidget.js +7 -8
- package/dist/esm/extensions/pos/contrib/PurchaseCountWidget.js.map +1 -1
- package/dist/esm/extensions/pos/utils/diffDatesByGranularity.js +1 -1
- package/dist/esm/extensions/pos/utils/diffDatesByGranularity.js.map +1 -1
- package/dist/esm/extensions/subscription/contrib/RunningSubscriptionCountWidget.js +1 -1
- package/dist/esm/extensions/subscription/contrib/RunningSubscriptionCountWidget.js.map +1 -1
- package/dist/esm/extensions/subscription/contrib/SubscriptionEventCountWidget.js +2 -2
- package/dist/esm/extensions/subscription/contrib/SubscriptionEventCountWidget.js.map +1 -1
- package/dist/esm/extensions/subscription/contrib/SubscriptionStateCountWidget.js +1 -1
- package/dist/esm/extensions/subscription/contrib/SubscriptionStateCountWidget.js.map +1 -1
- package/dist/esm/pages/DashboardPage.js +4 -2
- package/dist/esm/pages/DashboardPage.js.map +1 -1
- package/dist/types/contexts/DashboardFilterContext.d.ts +13 -9
- package/dist/types/extensions/pos/components/FilterMenu/DateField.d.ts +7 -0
- package/dist/types/extensions/pos/components/FilterMenu/DateRangePicker.d.ts +22 -0
- package/dist/types/extensions/pos/components/FilterMenu/PresetList.d.ts +3 -0
- package/dist/types/extensions/pos/components/FilterMenu/Select.d.ts +13 -0
- package/dist/types/extensions/pos/components/FilterMenu/index.d.ts +5 -0
- package/dist/types/extensions/pos/utils/diffDatesByGranularity.d.ts +1 -3
- package/package.json +1 -1
- package/src/contexts/DashboardFilterContext.tsx +93 -39
- package/src/extensions/pos/components/DashboardFilter.tsx +2 -71
- package/src/extensions/pos/components/FilterMenu/DateField.tsx +22 -0
- package/src/extensions/pos/components/FilterMenu/DateRangePicker.tsx +245 -0
- package/src/extensions/pos/components/FilterMenu/PresetList.tsx +35 -0
- package/src/extensions/pos/components/FilterMenu/Select.tsx +37 -0
- package/src/extensions/pos/components/FilterMenu/index.tsx +124 -0
- package/src/extensions/pos/components/PresetSelect.tsx +10 -82
- package/src/extensions/pos/components/SitesAmountsList.tsx +1 -1
- package/src/extensions/pos/contrib/PaymentMethodWidget.tsx +1 -1
- package/src/extensions/pos/contrib/PurchaseAmountWidget.tsx +7 -5
- package/src/extensions/pos/contrib/PurchaseCountWidget.tsx +7 -8
- package/src/extensions/pos/utils/diffDatesByGranularity.ts +6 -5
- package/src/extensions/subscription/contrib/RunningSubscriptionCountWidget.tsx +1 -1
- package/src/extensions/subscription/contrib/SubscriptionEventCountWidget.tsx +2 -2
- package/src/extensions/subscription/contrib/SubscriptionStateCountWidget.tsx +1 -1
- package/src/pages/DashboardPage.tsx +3 -2
- package/dist/esm/extensions/pos/utils/interpolatePurchaseCounts.js +0 -24
- package/dist/esm/extensions/pos/utils/interpolatePurchaseCounts.js.map +0 -1
- package/dist/types/extensions/pos/utils/interpolatePurchaseCounts.d.ts +0 -3
- package/src/extensions/pos/utils/interpolatePurchaseCounts.ts +0 -37
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import 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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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
|
|
25
|
-
const
|
|
26
|
-
const granularity =
|
|
27
|
-
if (
|
|
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(
|
|
32
|
-
const
|
|
87
|
+
const startDate = DateTime.fromISO(searchStartDate);
|
|
88
|
+
const endDate = DateTime.fromISO(searchEndDate).minus({ days: 1 }).endOf("day");
|
|
33
89
|
return {
|
|
34
90
|
startDate,
|
|
35
|
-
|
|
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
|
|
48
|
-
const start_date = startDate.toISO();
|
|
49
|
-
const end_date =
|
|
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 [
|
|
57
|
-
|
|
58
|
-
|
|
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",
|
|
120
|
+
console.error("[DASHBOARD_FILTER_CONTEXT] filter", newFilter);
|
|
61
121
|
return;
|
|
62
122
|
}
|
|
63
123
|
navigate(undefined, { query, replace: true });
|
|
64
|
-
}, [
|
|
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":"AAAA,OAAO,KAAK,EAAE,EAAE,
|
|
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
|
|
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(
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,
|
|
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":"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"}
|