@tap-payments/os-micro-frontend-shared 0.1.391-test.1 → 0.1.391-test.5

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 (57) hide show
  1. package/build/components/FilterDropdown/FilterDropdown.d.ts +11 -4
  2. package/build/components/FilterDropdown/FilterDropdown.js +18 -4
  3. package/build/components/FilterDropdown/style.js +1 -1
  4. package/build/components/MultiDatakeyDonut/MultiDatakeyDonut.d.ts +12 -0
  5. package/build/components/MultiDatakeyDonut/MultiDatakeyDonut.js +19 -0
  6. package/build/components/MultiDatakeyDonut/index.d.ts +1 -0
  7. package/build/components/MultiDatakeyDonut/index.js +1 -0
  8. package/build/components/MultiDatakeyDonut/style.d.ts +10 -0
  9. package/build/components/MultiDatakeyDonut/style.js +23 -0
  10. package/build/components/RangeCalender/RangeCalender.js +4 -2
  11. package/build/components/index.d.ts +1 -2
  12. package/build/components/index.js +1 -2
  13. package/build/constants/assets.d.ts +3 -0
  14. package/build/constants/assets.js +3 -0
  15. package/build/hooks/index.d.ts +0 -1
  16. package/build/hooks/index.js +0 -1
  17. package/build/types/index.d.ts +1 -0
  18. package/build/types/index.js +1 -0
  19. package/build/types/toggleOptions.d.ts +2 -0
  20. package/build/types/toggleOptions.js +1 -0
  21. package/build/utils/date.d.ts +4 -0
  22. package/build/utils/date.js +37 -0
  23. package/package.json +2 -2
  24. package/build/components/TreeDropdown/TreeDropdown.d.ts +0 -4
  25. package/build/components/TreeDropdown/TreeDropdown.js +0 -53
  26. package/build/components/TreeDropdown/TreeNodeItem/SelectionControl.d.ts +0 -8
  27. package/build/components/TreeDropdown/TreeNodeItem/SelectionControl.js +0 -17
  28. package/build/components/TreeDropdown/TreeNodeItem/TreeNodeItem.d.ts +0 -12
  29. package/build/components/TreeDropdown/TreeNodeItem/TreeNodeItem.js +0 -64
  30. package/build/components/TreeDropdown/TreeNodeItem/index.d.ts +0 -2
  31. package/build/components/TreeDropdown/TreeNodeItem/index.js +0 -2
  32. package/build/components/TreeDropdown/TreeNodeItem/style.d.ts +0 -14
  33. package/build/components/TreeDropdown/TreeNodeItem/style.js +0 -46
  34. package/build/components/TreeDropdown/TreeNodeList/List.d.ts +0 -6
  35. package/build/components/TreeDropdown/TreeNodeList/List.js +0 -17
  36. package/build/components/TreeDropdown/TreeNodeList/TreeNodeList.d.ts +0 -17
  37. package/build/components/TreeDropdown/TreeNodeList/TreeNodeList.js +0 -36
  38. package/build/components/TreeDropdown/TreeNodeList/index.d.ts +0 -2
  39. package/build/components/TreeDropdown/TreeNodeList/index.js +0 -2
  40. package/build/components/TreeDropdown/TreeNodeList/style.d.ts +0 -7
  41. package/build/components/TreeDropdown/TreeNodeList/style.js +0 -60
  42. package/build/components/TreeDropdown/context/TreeDropdownProvider.d.ts +0 -15
  43. package/build/components/TreeDropdown/context/TreeDropdownProvider.js +0 -13
  44. package/build/components/TreeDropdown/hooks/useSearch.d.ts +0 -17
  45. package/build/components/TreeDropdown/hooks/useSearch.js +0 -38
  46. package/build/components/TreeDropdown/hooks/useTreeDropdown.d.ts +0 -12
  47. package/build/components/TreeDropdown/hooks/useTreeDropdown.js +0 -10
  48. package/build/components/TreeDropdown/index.d.ts +0 -4
  49. package/build/components/TreeDropdown/index.js +0 -4
  50. package/build/components/TreeDropdown/style.d.ts +0 -9
  51. package/build/components/TreeDropdown/style.js +0 -43
  52. package/build/components/TreeDropdown/type.d.ts +0 -83
  53. package/build/components/TreeDropdown/type.js +0 -6
  54. package/build/components/TreeDropdown/utils.d.ts +0 -21
  55. package/build/components/TreeDropdown/utils.js +0 -161
  56. package/build/hooks/useScrolledTo.d.ts +0 -13
  57. package/build/hooks/useScrolledTo.js +0 -45
@@ -1,10 +1,17 @@
1
- /// <reference types="react" />
2
- interface FilterDropdownProps {
3
- children?: React.ReactNode;
1
+ import { ReactNode } from 'react';
2
+ import { BoxProps } from '@mui/material/Box';
3
+ import { SxProps } from '@mui/material';
4
+ interface FilterDropdownProps extends BoxProps {
4
5
  onConfirm: () => void;
5
6
  onCancel: () => void;
6
7
  isOkayButDisabled?: boolean;
7
8
  isDisabled?: boolean;
9
+ icon?: string;
10
+ title?: string;
11
+ menuStyle?: SxProps;
12
+ hideTitle?: boolean;
13
+ renderButton?: ReactNode;
14
+ onOpenChange?: (isOpen: boolean) => void;
8
15
  }
9
- export default function FilterDropdown({ onConfirm, onCancel, isOkayButDisabled, children, isDisabled }: Readonly<FilterDropdownProps>): import("react/jsx-runtime").JSX.Element;
16
+ export default function FilterDropdown({ onConfirm, onCancel, isOkayButDisabled, children, isDisabled, icon, title, menuStyle, hideTitle, renderButton, onOpenChange, ...props }: Readonly<FilterDropdownProps>): import("react/jsx-runtime").JSX.Element;
10
17
  export {};
@@ -1,12 +1,24 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
1
12
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useState, useEffect } from 'react';
2
14
  import Box from '@mui/material/Box';
15
+ import ClickAwayListener from '@mui/material/ClickAwayListener';
3
16
  import { useTranslation } from 'react-i18next';
4
- import { useState, useEffect } from 'react';
5
- import { ClickAwayListener } from '@mui/material';
6
17
  import { darkFilterIcon } from '../../constants/index.js';
7
18
  import { Menu, CustomBackdrop } from '../index.js';
8
19
  import { CancelButton, FilterButton, Footer, OkayButton, TitleStyled } from './style';
9
- export default function FilterDropdown({ onConfirm, onCancel, isOkayButDisabled, children, isDisabled }) {
20
+ export default function FilterDropdown(_a) {
21
+ var { onConfirm, onCancel, isOkayButDisabled, children, isDisabled, icon, title, menuStyle, hideTitle = false, renderButton, onOpenChange } = _a, props = __rest(_a, ["onConfirm", "onCancel", "isOkayButDisabled", "children", "isDisabled", "icon", "title", "menuStyle", "hideTitle", "renderButton", "onOpenChange"]);
10
22
  const [anchorEl, setAnchorEl] = useState(null);
11
23
  const open = Boolean(anchorEl);
12
24
  const { t } = useTranslation();
@@ -32,12 +44,14 @@ export default function FilterDropdown({ onConfirm, onCancel, isOkayButDisabled,
32
44
  return;
33
45
  if (!open) {
34
46
  setAnchorEl(e.currentTarget);
47
+ onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(true);
35
48
  return;
36
49
  }
37
50
  onClose();
38
51
  };
39
52
  const onClose = () => {
40
53
  setAnchorEl(null);
54
+ onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(false);
41
55
  onCancel();
42
56
  };
43
57
  const handleCancel = () => {
@@ -50,5 +64,5 @@ export default function FilterDropdown({ onConfirm, onCancel, isOkayButDisabled,
50
64
  onConfirm();
51
65
  onClose();
52
66
  };
53
- return (_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCancel }, { children: _jsxs(Box, { children: [_jsx(FilterButton, Object.assign({ isActive: open, onClick: onOpen, sx: Object.assign({}, (isDisabled && { pointerEvents: 'none', opacity: 0.5 })) }, { children: _jsx(Box, { component: "img", src: darkFilterIcon, alt: "filter" }) })), _jsxs(Menu, Object.assign({ anchorEl: anchorEl, open: open, sx: { marginTop: '8px', marginBottom: '8px', width: 193 }, placement: "bottom-end" }, { children: [_jsx(TitleStyled, Object.assign({ component: "span" }, { children: t('filterBy') })), children, _jsxs(Footer, { children: [_jsx(CancelButton, Object.assign({ onClick: handleCancel }, { children: t('cancel') })), _jsx(OkayButton, Object.assign({ disabled: isOkayButDisabled, onClick: handleConfirm }, { children: t('okay') }))] })] })), open && _jsx(CustomBackdrop, { onClick: onClose })] }) })));
67
+ return (_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCancel }, { children: _jsxs(Box, Object.assign({}, props, { children: [_jsx(FilterButton, Object.assign({ className: "filter-button", isActive: open, onClick: onOpen, sx: Object.assign({}, (isDisabled && Object.assign({ pointerEvents: 'none', opacity: 0.5 }, props.sx))) }, { children: renderButton !== null && renderButton !== void 0 ? renderButton : _jsx(Box, { component: "img", src: icon !== null && icon !== void 0 ? icon : darkFilterIcon, alt: "filter" }) })), _jsxs(Menu, Object.assign({ anchorEl: anchorEl, open: open, sx: Object.assign({ marginTop: '8px', marginBottom: '8px', width: 193 }, menuStyle), placement: "bottom-end" }, { children: [!hideTitle && _jsx(TitleStyled, Object.assign({ component: "span" }, { children: title !== null && title !== void 0 ? title : t('filterBy') })), children, _jsxs(Footer, { children: [_jsx(CancelButton, Object.assign({ onClick: handleCancel }, { children: t('cancel') })), _jsx(OkayButton, Object.assign({ disabled: isOkayButDisabled, onClick: handleConfirm }, { children: t('okay') }))] })] })), open && _jsx(CustomBackdrop, { onClick: onClose })] })) })));
54
68
  }
@@ -2,7 +2,7 @@ import Box from '@mui/material/Box';
2
2
  import { styled } from '@mui/material/styles';
3
3
  import Button from '@mui/material/Button';
4
4
  import { Text } from '../index.js';
5
- export const FilterButton = styled(Box, { shouldForwardProp: (props) => props !== 'isActive' })(({ theme, isActive }) => (Object.assign({ borderRadius: '4px', border: `1px solid ${theme.palette.divider}`, height: 32, width: 30, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', backgroundColor: theme.palette.common.white, ':hover': {
5
+ export const FilterButton = styled(Box, { shouldForwardProp: (props) => props !== 'isActive' })(({ theme, isActive }) => (Object.assign({ borderRadius: '4px', border: `1px solid ${theme.palette.divider}`, minHeight: 32, minWidth: 30, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', backgroundColor: theme.palette.common.white, ':hover': {
6
6
  opacity: 0.7,
7
7
  } }, (isActive && {
8
8
  boxShadow: `0px 0px 4px 0px ${theme.palette.info.dark}80`,
@@ -0,0 +1,12 @@
1
+ import { ReactNode } from 'react';
2
+ interface DonutProps {
3
+ size?: number;
4
+ chartData: Array<{
5
+ name: string;
6
+ value: number;
7
+ color: string;
8
+ }>;
9
+ chartInfo?: ReactNode;
10
+ }
11
+ export declare const MultiDatakeyDonut: ({ chartData, size, chartInfo }: DonutProps) => import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { ResponsiveContainer, PieChart, Pie, Cell } from 'recharts';
4
+ import { DonutWrapper, CenterOverlay, Empty } from './style';
5
+ export const MultiDatakeyDonut = ({ chartData, size = 170, chartInfo }) => {
6
+ const pieSegments = useMemo(() => {
7
+ const total = chartData.reduce((sum, d) => sum + d.value, 0) || 1;
8
+ let cumulative = 0;
9
+ return chartData.map((d) => {
10
+ const start = (cumulative / total) * 360;
11
+ const end = ((cumulative + d.value) / total) * 360;
12
+ cumulative += d.value;
13
+ return Object.assign(Object.assign({}, d), { startAngle: start, endAngle: end });
14
+ });
15
+ }, [chartData]);
16
+ const isEmpty = chartData.every((d) => d.value === 0);
17
+ return (_jsxs(DonutWrapper, Object.assign({ sx: { width: size, height: size } }, { children: [_jsx(ResponsiveContainer, { children: _jsxs(PieChart, { children: [_jsx(Pie, { data: [{ value: 100 }], dataKey: "value", cx: "50%", cy: "50%", innerRadius: "70%", outerRadius: "100%", fill: "#E5E7EB", stroke: "none", isAnimationActive: false }), !isEmpty &&
18
+ pieSegments.map((segment) => (_jsx(Pie, Object.assign({ data: [segment], dataKey: "value", cx: "50%", cy: "50%", innerRadius: "70%", outerRadius: "100%", startAngle: 90 - segment.startAngle, endAngle: 90 - segment.endAngle, cornerRadius: 0, stroke: "none", isAnimationActive: true, animationDuration: 800, style: { outline: 'none' } }, { children: _jsx(Cell, { fill: segment.color, tabIndex: -1 }, segment.name) }), segment.name)))] }) }), _jsx(CenterOverlay, { children: !chartInfo ? _jsx(Empty, { children: "----" }) : chartInfo })] })));
19
+ };
@@ -0,0 +1 @@
1
+ export * from './MultiDatakeyDonut';
@@ -0,0 +1 @@
1
+ export * from './MultiDatakeyDonut';
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ export declare const DonutWrapper: import("@emotion/styled").StyledComponent<import("@mui/system").BoxOwnProps<import("@mui/material").Theme> & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
3
+ ref?: ((instance: HTMLDivElement | null) => void) | import("react").RefObject<HTMLDivElement> | null | undefined;
4
+ }, keyof import("@mui/system").BoxOwnProps<import("@mui/material").Theme>> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
5
+ export declare const CenterOverlay: import("@emotion/styled").StyledComponent<import("@mui/system").BoxOwnProps<import("@mui/material").Theme> & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
6
+ ref?: ((instance: HTMLDivElement | null) => void) | import("react").RefObject<HTMLDivElement> | null | undefined;
7
+ }, keyof import("@mui/system").BoxOwnProps<import("@mui/material").Theme>> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
8
+ export declare const Empty: import("@emotion/styled").StyledComponent<import("@mui/system").BoxOwnProps<import("@mui/material").Theme> & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
9
+ ref?: ((instance: HTMLDivElement | null) => void) | import("react").RefObject<HTMLDivElement> | null | undefined;
10
+ }, keyof import("@mui/system").BoxOwnProps<import("@mui/material").Theme>> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
@@ -0,0 +1,23 @@
1
+ import { Box } from '@mui/material';
2
+ import { styled } from '@mui/material/styles';
3
+ export const DonutWrapper = styled(Box)(() => ({
4
+ width: '100%',
5
+ maxWidth: 500,
6
+ aspectRatio: '1',
7
+ position: 'relative',
8
+ }));
9
+ export const CenterOverlay = styled(Box)(({ theme }) => ({
10
+ position: 'absolute',
11
+ inset: 0,
12
+ display: 'flex',
13
+ flexDirection: 'column',
14
+ justifyContent: 'center',
15
+ alignItems: 'center',
16
+ pointerEvents: 'none',
17
+ gap: theme.spacing(1),
18
+ }));
19
+ export const Empty = styled(Box)(({ theme }) => ({
20
+ fontSize: 17,
21
+ fontWeight: 700,
22
+ color: '#CFD0D2',
23
+ }));
@@ -58,8 +58,10 @@ function RangeCalender({ defaultDate, onDateChange, mode = 'gregorian', onCalend
58
58
  onChangeTimezone === null || onChangeTimezone === void 0 ? void 0 : onChangeTimezone(selectedTimezone);
59
59
  };
60
60
  const getSelectedDate = () => {
61
- const startSelectedTime = dates[0].format('MMM D');
62
- const endSelectedTime = dates[1] ? dates[1].format('MMM D') : dates[0].format('MMM D');
61
+ const nowYear = dayjs().year();
62
+ const formatDate = (date) => (date.year === nowYear ? date.format('MMM D') : date.format('MMM D YYYY'));
63
+ const startSelectedTime = formatDate(dates[0]);
64
+ const endSelectedTime = dates[1] ? formatDate(dates[1]) : formatDate(dates[0]);
63
65
  return startSelectedTime === endSelectedTime && !noTimezone ? startSelectedTime : `${startSelectedTime} - ${endSelectedTime}`;
64
66
  };
65
67
  const onChange = (newDate) => {
@@ -153,5 +153,4 @@ export * from './SalesChannelFilter';
153
153
  export * from './ReferenceTypeFilter';
154
154
  export * from './ListColumnFilter';
155
155
  export * from './VerificationIcon';
156
- export { default as TreeDropdown } from './TreeDropdown';
157
- export * from './TreeDropdown';
156
+ export * from './MultiDatakeyDonut';
@@ -153,5 +153,4 @@ export * from './SalesChannelFilter';
153
153
  export * from './ReferenceTypeFilter';
154
154
  export * from './ListColumnFilter';
155
155
  export * from './VerificationIcon';
156
- export { default as TreeDropdown } from './TreeDropdown';
157
- export * from './TreeDropdown';
156
+ export * from './MultiDatakeyDonut';
@@ -46,6 +46,7 @@ export declare const storedValueWalletIcon: string;
46
46
  export declare const buyNowPayLaterIcon: string;
47
47
  export declare const openBankingIcon: string;
48
48
  export declare const visaIcon: string;
49
+ export declare const redArrowDownIcon: string;
49
50
  export declare const completedIcon: string;
50
51
  export declare const chargeBackRequestedIcon: string;
51
52
  export declare const chargeBackIcon: string;
@@ -80,12 +81,14 @@ export declare const dashedCheckIcon: string;
80
81
  export declare const outstandingIcon: string;
81
82
  export declare const deactivatedIcon: string;
82
83
  export declare const topUpIcon: string;
84
+ export declare const AIOverviewIcon: string;
83
85
  export declare const deMaximizeIcon: string;
84
86
  export declare const pendingFlag: string;
85
87
  export declare const ibanIcon: string;
86
88
  export declare const payoutIcon: string;
87
89
  export declare const releasedFlag: string;
88
90
  export declare const acceptedFlag: string;
91
+ export declare const clearIcon: string;
89
92
  export declare const unCapturedIcon: string;
90
93
  export declare const newWindowIcon: string;
91
94
  export declare const viewAllIcon: string;
@@ -51,6 +51,7 @@ export const storedValueWalletIcon = `${lightUrl}/storedValueWallet.svg`;
51
51
  export const buyNowPayLaterIcon = `${lightUrl}/buyNowPayLater.svg`;
52
52
  export const openBankingIcon = `${lightUrl}/openBanking.svg`;
53
53
  export const visaIcon = `${lightUrl}/visa.svg`;
54
+ export const redArrowDownIcon = `${lightUrl}/redArrowDownIcon.svg`;
54
55
  export const completedIcon = `${lightUrl}/completed.svg`;
55
56
  export const chargeBackRequestedIcon = `${lightUrl}/chargebackRequested.svg`;
56
57
  export const chargeBackIcon = `${lightUrl}/chargeback.svg`;
@@ -85,12 +86,14 @@ export const dashedCheckIcon = `${lightUrl}/dashedCheckIcon.svg`;
85
86
  export const outstandingIcon = `${lightUrl}/outstandingIcon.svg`;
86
87
  export const deactivatedIcon = `${lightUrl}/deactivatedIcon.svg`;
87
88
  export const topUpIcon = `${lightUrl}/topup.svg`;
89
+ export const AIOverviewIcon = `${lightUrl}/AIOverviewIcon.svg`;
88
90
  export const deMaximizeIcon = `${appBaseUrl}/demaximize.svg`;
89
91
  export const pendingFlag = `${lightUrl}/pendingFlag.svg`;
90
92
  export const ibanIcon = `${lightUrl}/ibanIcon.svg`;
91
93
  export const payoutIcon = `${lightUrl}/payoutIcon.svg`;
92
94
  export const releasedFlag = `${lightUrl}/releasedFlag.svg`;
93
95
  export const acceptedFlag = `${lightUrl}/acceptedFlag.svg`;
96
+ export const clearIcon = `${lightUrl}/clearIcon.svg`;
94
97
  export const unCapturedIcon = `${lightUrl}/status/unCaptured.svg`;
95
98
  export const newWindowIcon = `${appBaseUrl}/newWindow.svg`;
96
99
  export const viewAllIcon = `${appBaseUrl}/viewAll.svg`;
@@ -14,4 +14,3 @@ export * from './useAppEventPublisher';
14
14
  export * from './useAppEventListener';
15
15
  export * from './useSelectedMerchantDetails';
16
16
  export * from './useToast';
17
- export * from './useScrolledTo';
@@ -14,4 +14,3 @@ export * from './useAppEventPublisher';
14
14
  export * from './useAppEventListener';
15
15
  export * from './useSelectedMerchantDetails';
16
16
  export * from './useToast';
17
- export * from './useScrolledTo';
@@ -32,5 +32,6 @@ export * from './filter';
32
32
  export * from './utilities';
33
33
  export * from './reports';
34
34
  export * from './document';
35
+ export * from './toggleOptions';
35
36
  export * from './toast';
36
37
  export * from './flag';
@@ -32,5 +32,6 @@ export * from './filter';
32
32
  export * from './utilities';
33
33
  export * from './reports';
34
34
  export * from './document';
35
+ export * from './toggleOptions';
35
36
  export * from './toast';
36
37
  export * from './flag';
@@ -0,0 +1,2 @@
1
+ import { DATA_KEY } from '../constants/index.js';
2
+ export type DataKey = (typeof DATA_KEY)[keyof typeof DATA_KEY];
@@ -0,0 +1 @@
1
+ export {};
@@ -43,5 +43,9 @@ export declare function isWithinTimeAgo(timestampMs: number, amount: number, uni
43
43
  export declare const formatRelativeTimeWithinHour: (timestampMs: number) => string;
44
44
  export declare const isTodayDate: (date: string | Date) => boolean;
45
45
  export declare const isYesterdayDate: (date: string | Date) => boolean;
46
+ export declare const getDateLabel: (from: Date, to: Date) => {
47
+ label: string;
48
+ isCustom: boolean;
49
+ };
46
50
  export declare const isValidDate: (date?: Date | string | number) => boolean;
47
51
  export {};
@@ -245,6 +245,43 @@ export const formatRelativeTimeWithinHour = (timestampMs) => {
245
245
  };
246
246
  export const isTodayDate = (date) => dayjs(date).isToday();
247
247
  export const isYesterdayDate = (date) => dayjs(date).isYesterday();
248
+ export const getDateLabel = (from, to) => {
249
+ const start = dayjs(from).startOf('day');
250
+ const end = dayjs(to).endOf('day');
251
+ const today = dayjs().startOf('day');
252
+ const currentYear = today.year();
253
+ const diffDays = end.diff(start, 'day') + 1;
254
+ // Today / Yesterday
255
+ if (start.isToday() && end.isToday())
256
+ return { label: 'Today', isCustom: false };
257
+ if (start.isYesterday() && end.isYesterday())
258
+ return { label: 'Yesterday', isCustom: false };
259
+ // Last 7 days
260
+ if (diffDays === 7 && end.isSame(today, 'day'))
261
+ return { label: 'Last 7 days', isCustom: false };
262
+ // Last 30 days (inclusive)
263
+ if (diffDays === 31 && end.isSame(today, 'day'))
264
+ return { label: 'Last 30 days', isCustom: false };
265
+ // Full month
266
+ if (start.date() === 1 && end.date() === end.daysInMonth() && start.month() === end.month()) {
267
+ const monthLabel = start.year() === currentYear ? start.format('MMMM') : start.format('MMMM YYYY');
268
+ return { label: monthLabel, isCustom: false };
269
+ }
270
+ // Same day: show Month + Day
271
+ if (start.isSame(end, 'day')) {
272
+ const label = start.format(start.year() === currentYear ? 'MMM D' : 'MMM D YYYY');
273
+ return { label, isCustom: false };
274
+ }
275
+ // Custom range
276
+ const showStartYear = start.year() !== currentYear;
277
+ const showEndYear = end.year() !== currentYear;
278
+ const startLabel = start.format(`MMM D${showStartYear ? ' YYYY' : ''}`);
279
+ const endLabel = end.format(`MMM D${showEndYear ? ' YYYY' : ''}`);
280
+ return {
281
+ label: `${startLabel} – ${endLabel}`,
282
+ isCustom: true,
283
+ };
284
+ };
248
285
  export const isValidDate = (date) => {
249
286
  return dayjs(date).isValid();
250
287
  };
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@tap-payments/os-micro-frontend-shared",
3
3
  "description": "Shared components and utilities for Tap Payments micro frontends",
4
- "version": "0.1.391-test.1",
5
- "testVersion": 1,
4
+ "version": "0.1.391-test.5",
5
+ "testVersion": 5,
6
6
  "type": "module",
7
7
  "main": "build/index.js",
8
8
  "module": "build/index.js",
@@ -1,4 +0,0 @@
1
- /// <reference types="react" />
2
- import { TreeDropdownProps, TreeDropdownRef } from './type';
3
- declare const TreeDropdown: import("react").ForwardRefExoticComponent<Readonly<TreeDropdownProps> & import("react").RefAttributes<TreeDropdownRef>>;
4
- export default TreeDropdown;
@@ -1,53 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { forwardRef, useCallback, useImperativeHandle, useMemo, useState } from 'react';
3
- import { SelectedState } from './type';
4
- import TreeNodeList from './TreeNodeList/TreeNodeList';
5
- import { initializeTreeMapper, promoteSingleChild, TreeManager, updateSelection } from './utils';
6
- import TreeDropdownProvider from './context/TreeDropdownProvider';
7
- const TreeDropdown = forwardRef((props, ref) => {
8
- const { anchorEl, placement = 'bottom-start', treeDefinition, sx, onChange, multiple = true, exposeOnlySelectedTree = false, IconComponent } = props;
9
- const { header, footer, children: menuItems = [], searchProps, levelKey } = treeDefinition;
10
- const [internalMapper, setInternalMapper] = useState(() => initializeTreeMapper(menuItems || [], multiple));
11
- const formattedMenuItems = useMemo(() => promoteSingleChild(menuItems || []), [menuItems]);
12
- const getFullTree = useCallback(() => TreeManager.denormalizeTree(menuItems, internalMapper), [menuItems, internalMapper]);
13
- const getSelectedTree = useCallback(() => TreeManager.extractSelectedBranches(getFullTree()), [getFullTree]);
14
- const handleSelect = useCallback((isChecked, targetNode) => {
15
- const nextInternal = updateSelection(internalMapper, targetNode.id, isChecked, multiple);
16
- setInternalMapper(nextInternal);
17
- if (onChange) {
18
- if (exposeOnlySelectedTree) {
19
- onChange(TreeManager.extractSelectedBranches(TreeManager.denormalizeTree(menuItems, nextInternal)));
20
- }
21
- else {
22
- onChange(TreeManager.denormalizeTree(menuItems, nextInternal));
23
- }
24
- }
25
- }, [onChange, menuItems, internalMapper, multiple, exposeOnlySelectedTree]);
26
- const toggleAll = useCallback((selected) => {
27
- const setStatus = (tree, isChecked) => {
28
- const next = Object.assign({}, tree);
29
- Object.keys(next).forEach((nodeId) => {
30
- next[nodeId] = Object.assign(Object.assign({}, next[nodeId]), { status: isChecked ? SelectedState.CHECKED : SelectedState.UNCHECKED });
31
- });
32
- return next;
33
- };
34
- const nextInternal = setStatus(internalMapper, selected);
35
- setInternalMapper(nextInternal);
36
- if (onChange) {
37
- if (exposeOnlySelectedTree) {
38
- onChange(TreeManager.extractSelectedBranches(TreeManager.denormalizeTree(menuItems, nextInternal)));
39
- }
40
- else {
41
- onChange(TreeManager.denormalizeTree(menuItems, nextInternal));
42
- }
43
- }
44
- }, [internalMapper, onChange, menuItems, exposeOnlySelectedTree]);
45
- useImperativeHandle(ref, () => ({
46
- state: internalMapper,
47
- getFullTree,
48
- getSelectedTree,
49
- toggleAll,
50
- }), [internalMapper, getFullTree, getSelectedTree, toggleAll]);
51
- return (_jsx(TreeDropdownProvider, Object.assign({ internalMapper: internalMapper, IconComponent: IconComponent, handleSelect: handleSelect, multiple: multiple }, { children: _jsx(TreeNodeList, { anchorEl: anchorEl, sx: sx, header: header, footer: footer, menuItems: formattedMenuItems, levelKey: levelKey, searchProps: searchProps, placement: placement }) })));
52
- });
53
- export default TreeDropdown;
@@ -1,8 +0,0 @@
1
- /// <reference types="react" />
2
- type SelectionControlProps = {
3
- checked: boolean;
4
- indeterminate: boolean;
5
- onSelect: (e: React.ChangeEvent<HTMLInputElement>) => void;
6
- };
7
- declare const SelectionControl: (props: SelectionControlProps) => import("react/jsx-runtime").JSX.Element;
8
- export default SelectionControl;
@@ -1,17 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import useTreeDropdown from '../hooks/useTreeDropdown';
3
- import { StyledCheckbox as Checkbox, StyledRadioButton as RadioButton } from './style';
4
- import { useCallback } from 'react';
5
- const SelectionControl = (props) => {
6
- const { checked, indeterminate, onSelect } = props;
7
- const { multiple } = useTreeDropdown();
8
- const handleSelect = useCallback((e) => {
9
- e.stopPropagation();
10
- onSelect(e);
11
- }, [onSelect]);
12
- if (multiple) {
13
- return _jsx(Checkbox, { size: "small", checked: checked, indeterminate: indeterminate, onChange: handleSelect });
14
- }
15
- return _jsx(RadioButton, { size: "small", checked: checked, onChange: handleSelect });
16
- };
17
- export default SelectionControl;
@@ -1,12 +0,0 @@
1
- import { SxProps, Theme } from '@mui/material';
2
- import { TreeNode } from '../type';
3
- type InternalTreeNodeItemProps = {
4
- levelIndex?: number;
5
- nestedMenuSx?: SxProps<Theme>;
6
- parentMenuFlipped?: boolean;
7
- subLevelKey?: string;
8
- disableHovering?: boolean;
9
- };
10
- type TreeNodeItemProps = TreeNode & InternalTreeNodeItemProps;
11
- declare const TreeNodeItem: (props: TreeNodeItemProps) => import("react/jsx-runtime").JSX.Element;
12
- export default TreeNodeItem;
@@ -1,64 +0,0 @@
1
- var __rest = (this && this.__rest) || function (s, e) {
2
- var t = {};
3
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
- t[p] = s[p];
5
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
- t[p[i]] = s[p[i]];
9
- }
10
- return t;
11
- };
12
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
- import { useCallback, useEffect, useMemo, useState } from 'react';
14
- import { Stack } from '@mui/material';
15
- import { blackRightArrowIcon } from '../../../constants/index.js';
16
- import { StyledMenuItem as Root } from '../style';
17
- import { SelectedState } from '../type';
18
- import TreeNodeList from '../TreeNodeList/TreeNodeList';
19
- import useTreeDropdown from '../hooks/useTreeDropdown';
20
- import SelectionControl from './SelectionControl';
21
- import { ArrowIcon, ChildrenCount, Content, HintText, Label } from './style';
22
- const TreeNodeItem = (props) => {
23
- var _a, _b;
24
- const { renderItem, header, footer } = props, nodeProps = __rest(props, ["renderItem", "header", "footer"]);
25
- const { internalMapper, handleSelect, multiple, IconComponent } = useTreeDropdown();
26
- const { label, icon, iconComponent, levelIndex = 0, children, nestedMenuSx, hintText, disableHovering, itemProps, searchProps, subLevelKey, } = nodeProps;
27
- const [anchorEl, setAnchorEl] = useState(null);
28
- const hasChildren = !!children;
29
- const childrenCount = children === null || children === void 0 ? void 0 : children.length;
30
- const handleMouseEnter = useCallback((event) => {
31
- if (disableHovering)
32
- return;
33
- setAnchorEl(event.currentTarget);
34
- }, [disableHovering]);
35
- const handleMouseLeave = useCallback(() => {
36
- if (disableHovering)
37
- return;
38
- setAnchorEl(null);
39
- }, [disableHovering]);
40
- useEffect(() => {
41
- if (disableHovering) {
42
- setAnchorEl(null);
43
- }
44
- }, [disableHovering]);
45
- const renderedIcon = useMemo(() => {
46
- var _a, _b;
47
- if (iconComponent)
48
- return iconComponent;
49
- if (!icon)
50
- return null;
51
- return IconComponent ? _jsx(IconComponent, { fileId: icon.fileId, width: (_a = icon.width) !== null && _a !== void 0 ? _a : 20, height: (_b = icon.height) !== null && _b !== void 0 ? _b : 20 }) : null;
52
- }, [iconComponent, icon, IconComponent]);
53
- const checked = ((_a = internalMapper[nodeProps.id]) === null || _a === void 0 ? void 0 : _a.status) === SelectedState.CHECKED;
54
- const indeterminate = multiple ? ((_b = internalMapper[nodeProps.id]) === null || _b === void 0 ? void 0 : _b.status) === SelectedState.INDETERMINATE : false;
55
- const showSelectionControl = multiple || !hasChildren;
56
- const handleSelectInternal = useCallback((e) => {
57
- e.stopPropagation();
58
- handleSelect(e.target.checked, nodeProps);
59
- }, [handleSelect, nodeProps]);
60
- return (_jsxs(Root, Object.assign({ hideCheckbox: true, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, "data-testid": nodeProps.id, onClick: () => {
61
- handleSelect(!checked, nodeProps);
62
- } }, itemProps, { children: [renderItem ? (renderItem({ nodeProps, checked, indeterminate, onSelect: handleSelectInternal })) : (_jsxs(Content, Object.assign({ width: "100%", "data-testid": "Content" }, { children: [showSelectionControl && _jsx(SelectionControl, { checked: checked, indeterminate: indeterminate, onSelect: handleSelectInternal }), renderedIcon, _jsxs(Stack, Object.assign({ flex: 1, width: "100%", minWidth: 0 }, { children: [_jsx(Label, Object.assign({ title: typeof label === 'string' ? label : undefined }, { children: label })), hintText && _jsx(HintText, Object.assign({ title: typeof hintText === 'string' ? hintText : undefined }, { children: hintText }))] })), _jsxs(Stack, Object.assign({ direction: "row", alignItems: "center", spacing: 0.5 }, { children: [childrenCount && _jsx(ChildrenCount, Object.assign({ isOneDigit: Math.floor(childrenCount / 10) === 0 }, { children: childrenCount })), hasChildren && _jsx(ArrowIcon, { src: blackRightArrowIcon, alt: "Expand" })] }))] }))), !!children && (_jsx(TreeNodeList, { anchorEl: anchorEl, menuItems: children, levelIndex: levelIndex + 1, sx: nestedMenuSx, header: header, levelKey: subLevelKey, footer: footer, searchProps: searchProps }))] })));
63
- };
64
- export default TreeNodeItem;
@@ -1,2 +0,0 @@
1
- import TreeNodeItem from './TreeNodeItem';
2
- export default TreeNodeItem;
@@ -1,2 +0,0 @@
1
- import TreeNodeItem from './TreeNodeItem';
2
- export default TreeNodeItem;
@@ -1,14 +0,0 @@
1
- /// <reference types="react" />
2
- export declare const StyledCheckbox: import("@emotion/styled").StyledComponent<import("@mui/material").CheckboxProps & import("@mui/system").MUIStyledCommonProps<import("@mui/material/styles").Theme>, {}, {}>;
3
- export declare const StyledRadioButton: import("@emotion/styled").StyledComponent<import("../../index.js").RadioButtonProps & import("@mui/system").MUIStyledCommonProps<import("@mui/material/styles").Theme>, {}, {}>;
4
- export declare const Content: import("@emotion/styled").StyledComponent<import("@mui/system").BoxOwnProps<import("@mui/material/styles").Theme> & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
5
- ref?: ((instance: HTMLDivElement | null) => void) | import("react").RefObject<HTMLDivElement> | null | undefined;
6
- }, keyof import("@mui/system").BoxOwnProps<import("@mui/material/styles").Theme>> & import("@mui/system").MUIStyledCommonProps<import("@mui/material/styles").Theme>, {}, {}>;
7
- export declare const Label: import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material/Typography").TypographyTypeMap<{}, "span">>;
8
- export declare const HintText: import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material/Typography").TypographyTypeMap<{}, "span">>;
9
- export declare const ChildrenCount: import("@emotion/styled").StyledComponent<import("@mui/system").BoxOwnProps<import("@mui/material/styles").Theme> & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
10
- ref?: ((instance: HTMLDivElement | null) => void) | import("react").RefObject<HTMLDivElement> | null | undefined;
11
- }, keyof import("@mui/system").BoxOwnProps<import("@mui/material/styles").Theme>> & import("@mui/system").MUIStyledCommonProps<import("@mui/material/styles").Theme> & {
12
- isOneDigit?: boolean | undefined;
13
- }, {}, {}>;
14
- export declare const ArrowIcon: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<import("@mui/material/styles").Theme>, import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, {}>;
@@ -1,46 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { alpha, styled } from '@mui/material/styles';
3
- import Typography from '@mui/material/Typography';
4
- import Box from '@mui/material/Box';
5
- import { Checkbox, RadioButton } from '../../index.js';
6
- export const StyledCheckbox = styled(Checkbox)(({ theme }) => ({
7
- padding: 0,
8
- paddingRight: '4px',
9
- width: '14px !important',
10
- svg: {
11
- width: '12px !important',
12
- height: '12px !important',
13
- },
14
- '&.Mui-disabled': {
15
- '[data-testid="IndeterminateCheckBoxIcon"]': {
16
- fill: alpha(theme.palette.common.black, 0.26),
17
- },
18
- },
19
- }));
20
- export const StyledRadioButton = styled(RadioButton)({
21
- padding: 0,
22
- });
23
- export const Content = styled(Box)(() => ({
24
- display: 'flex',
25
- gap: '8px',
26
- justifyContent: 'space-between',
27
- flexGrow: 1,
28
- width: '100%',
29
- alignItems: 'center',
30
- minWidth: 0,
31
- }));
32
- export const Label = styled((props) => _jsx(Typography, Object.assign({ noWrap: true, component: "span" }, props)))(({ theme }) => ({
33
- flex: 1,
34
- fontSize: 'inherit',
35
- width: '100%',
36
- display: 'inline-block',
37
- color: theme.palette.text.primary,
38
- }));
39
- export const HintText = styled((props) => _jsx(Typography, Object.assign({ noWrap: true }, props)))(({ theme }) => ({
40
- color: alpha(theme.palette.text.primary, 0.5),
41
- fontSize: 8,
42
- }));
43
- export const ChildrenCount = styled(Box, { shouldForwardProp: (prop) => prop !== 'isOneDigit' })(({ theme, isOneDigit = true }) => (Object.assign({ borderRadius: isOneDigit ? '50%' : '4px', background: theme.palette.divider, width: isOneDigit ? 13 : 'auto', height: 14, fontSize: '8px', fontWeight: 700, display: 'flex', alignItems: 'center', justifyContent: 'center', lineHeight: '10px' }, (!isOneDigit && { padding: '0 3px' }))));
44
- export const ArrowIcon = styled('img')(() => ({
45
- height: 12,
46
- }));
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- declare const List: ({ children, onScroll }: {
3
- children: React.ReactNode;
4
- onScroll: (e: React.UIEvent<HTMLElement, UIEvent>) => void;
5
- }) => import("react/jsx-runtime").JSX.Element;
6
- export default List;
@@ -1,17 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useScrolledTo } from '../../../hooks/index.js';
3
- import { useCallback, useMemo, useRef } from 'react';
4
- import { ListOuterContainer, ListInnerContainer } from './style';
5
- const List = ({ children, onScroll }) => {
6
- const containerRef = useRef(null);
7
- const { scrolledToBottom, scrolledToTop, scrollable, handleScroll: handleScrolling } = useScrolledTo({ containerRef });
8
- const classes = useMemo(() => {
9
- return [scrolledToBottom && 'scrolled-to-bottom', scrolledToTop && 'scrolled-to-top', scrollable && 'scrollable'].filter(Boolean).join(' ');
10
- }, [scrolledToBottom, scrolledToTop, scrollable]);
11
- const handleScroll = useCallback((e) => {
12
- onScroll(e);
13
- handleScrolling(e);
14
- }, [onScroll, handleScrolling]);
15
- return (_jsx(ListOuterContainer, Object.assign({ sx: { position: 'relative' }, className: classes }, { children: _jsx(ListInnerContainer, Object.assign({ ref: containerRef, onScroll: handleScroll }, { children: children })) })));
16
- };
17
- export default List;