@tap-payments/os-micro-frontend-shared 0.1.313 → 0.1.314
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/build/components/FilterDropdown/components/BrandItem/BrandItem.js +4 -4
- package/build/components/FilterDropdown/components/FlatMerchantsListMenu/FlatMerchantsListMenu.js +1 -1
- package/build/components/FilterDropdown/components/MerchantItem/MerchantItem.js +23 -5
- package/build/components/MerchantsDropdown/MerchantsDropdown.d.ts +1 -1
- package/build/components/MerchantsDropdown/MerchantsDropdown.js +25 -7
- package/build/components/MerchantsDropdown/type.d.ts +1 -0
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ import { getNameText } from '../../../../utils/index.js';
|
|
|
6
6
|
import FlatMerchantsListMenu from '../FlatMerchantsListMenu';
|
|
7
7
|
import { Brand } from './style';
|
|
8
8
|
export default function BrandItem({ brand, merchantsIds, isDisabled, atLeastOneMerchantSelected = false, showSearchInput = false, renderBrandLogo, onChangeMerchant, }) {
|
|
9
|
-
var _a;
|
|
9
|
+
var _a, _b;
|
|
10
10
|
const [anchorEl, setAnchorEl] = useState(null);
|
|
11
11
|
const open = Boolean(anchorEl);
|
|
12
12
|
const onOpen = (e) => {
|
|
@@ -15,8 +15,8 @@ export default function BrandItem({ brand, merchantsIds, isDisabled, atLeastOneM
|
|
|
15
15
|
const onClose = () => {
|
|
16
16
|
setAnchorEl(null);
|
|
17
17
|
};
|
|
18
|
-
const selectedBrandMerchants = useMemo(() => brand.merchants.filter((merchant) => merchantsIds.includes(merchant.legacy_id)), [merchantsIds, brand.merchants]);
|
|
19
|
-
const isAllBrandsSelected = useMemo(() => selectedBrandMerchants.length === brand.merchants.length, [selectedBrandMerchants.length, brand.merchants.length]);
|
|
18
|
+
const selectedBrandMerchants = useMemo(() => { var _a; return (_a = brand.merchants) === null || _a === void 0 ? void 0 : _a.filter((merchant) => merchantsIds.includes(merchant.legacy_id)); }, [merchantsIds, brand.merchants]);
|
|
19
|
+
const isAllBrandsSelected = useMemo(() => { var _a; return (selectedBrandMerchants === null || selectedBrandMerchants === void 0 ? void 0 : selectedBrandMerchants.length) === ((_a = brand.merchants) === null || _a === void 0 ? void 0 : _a.length); }, [selectedBrandMerchants === null || selectedBrandMerchants === void 0 ? void 0 : selectedBrandMerchants.length, (_a = brand.merchants) === null || _a === void 0 ? void 0 : _a.length]);
|
|
20
20
|
const isSomeSelected = useMemo(() => !isAllBrandsSelected && selectedBrandMerchants.length > 0, [isAllBrandsSelected, selectedBrandMerchants]);
|
|
21
21
|
const onClickBrand = (e) => {
|
|
22
22
|
e.stopPropagation();
|
|
@@ -35,5 +35,5 @@ export default function BrandItem({ brand, merchantsIds, isDisabled, atLeastOneM
|
|
|
35
35
|
if (isDisabled)
|
|
36
36
|
return;
|
|
37
37
|
onClickBrand(e);
|
|
38
|
-
}, isDisabled: isDisabled, sx: Object.assign({ maxHeight: 35, minHeight: 35 }, (open && { boxShadow: '0px 0px 16px 0px #00000021' })) }, { children: [_jsxs(Brand, { children: [renderBrandLogo === null || renderBrandLogo === void 0 ? void 0 : renderBrandLogo(brand.logo), _jsx(Text, Object.assign({ sx: { fontSize: '11px' } }, { children: getNameText(brand.name) }))] }), ((
|
|
38
|
+
}, isDisabled: isDisabled, sx: Object.assign({ maxHeight: 35, minHeight: 35 }, (open && { boxShadow: '0px 0px 16px 0px #00000021' })) }, { children: [_jsxs(Brand, { children: [renderBrandLogo === null || renderBrandLogo === void 0 ? void 0 : renderBrandLogo(brand.logo), _jsx(Text, Object.assign({ sx: { fontSize: '11px' } }, { children: getNameText(brand.name) }))] }), ((_b = brand.merchants) === null || _b === void 0 ? void 0 : _b.length) > 0 && _jsx("img", { src: rightArrow, alt: "arrow", style: { height: 12 } }), _jsx(FlatMerchantsListMenu, { anchorEl: anchorEl, brand: brand, merchantsIds: merchantsIds, onChangeMerchant: onChangeMerchant, atLeastOneMerchantSelected: atLeastOneMerchantSelected, showSearchInput: showSearchInput })] })));
|
|
39
39
|
}
|
package/build/components/FilterDropdown/components/FlatMerchantsListMenu/FlatMerchantsListMenu.js
CHANGED
|
@@ -31,7 +31,7 @@ export default function FlatMerchantsListMenu({ brand, merchantsIds, onChangeMer
|
|
|
31
31
|
return merchants === null || merchants === void 0 ? void 0 : merchants.filter((merchant) => { var _a; return ((_a = merchant === null || merchant === void 0 ? void 0 : merchant.display_name) !== null && _a !== void 0 ? _a : '').toLowerCase().includes(searchInputValue.trim().toLowerCase()); });
|
|
32
32
|
}, [searchInputValue, merchants]);
|
|
33
33
|
const displayedMerchants = useMemo(() => (showSearchInput ? filteredMerchants : merchants), [filteredMerchants, merchants, showSearchInput]);
|
|
34
|
-
return (_jsxs(Menu, Object.assign({ open: open, anchorEl: anchorEl, placement: "right-start" }, { children: [showSearchInput && (_jsx(SearchListInput, { placeholder: "Merchants", name: "merchants", value: searchInputValue, onSearchChange: handleSearchInputChange, onSearchReset: handleSearchInputReset, sx: { px: '8px' } })), displayedMerchants === null || displayedMerchants === void 0 ? void 0 : displayedMerchants.map((merchant) => (_jsx(MerchantMenuItemStyled, Object.assign({ isDisabled: isLastMidToBeDisabled(merchant.legacy_id), isSelected: isMerchantSelected(merchant.legacy_id), onClick: (e) => {
|
|
34
|
+
return (_jsxs(Menu, Object.assign({ open: open, anchorEl: anchorEl, placement: "right-start" }, { children: [showSearchInput && merchants.length > 1 && (_jsx(SearchListInput, { placeholder: "Merchants", name: "merchants", value: searchInputValue, onSearchChange: handleSearchInputChange, onSearchReset: handleSearchInputReset, sx: { px: '8px' } })), displayedMerchants === null || displayedMerchants === void 0 ? void 0 : displayedMerchants.map((merchant) => (_jsx(MerchantMenuItemStyled, Object.assign({ isDisabled: isLastMidToBeDisabled(merchant.legacy_id), isSelected: isMerchantSelected(merchant.legacy_id), onClick: (e) => {
|
|
35
35
|
if (isLastMidToBeDisabled(merchant.legacy_id))
|
|
36
36
|
return;
|
|
37
37
|
onClickMerchant(e, merchant.legacy_id);
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useMemo } from 'react';
|
|
3
3
|
import { useTranslation } from 'react-i18next';
|
|
4
|
-
import { Menu, MenuItem, Text } from '../../../index.js';
|
|
4
|
+
import { Menu, MenuItem, SearchListInput, Text } from '../../../index.js';
|
|
5
5
|
import { rightArrow } from '../../../../constants/index.js';
|
|
6
|
+
import { getNameText } from '../../../../utils/index.js';
|
|
6
7
|
import BrandItem from '../BrandItem';
|
|
7
8
|
import FlatMerchantsListMenu from '../FlatMerchantsListMenu';
|
|
8
9
|
export default function MerchantItem({ brands, isLoading, onFilterChange, merchantsIds = [], atLeastOneMerchantSelected = false, showSearchInput = false, hideCheckbox = false, renderBrandLogo, }) {
|
|
9
10
|
const [anchorEl, setAnchorEl] = useState(null);
|
|
11
|
+
const [searchInputValue, setSearchInputValue] = useState('');
|
|
10
12
|
const open = Boolean(anchorEl);
|
|
11
13
|
const { t } = useTranslation();
|
|
12
14
|
const onOpen = (e) => {
|
|
@@ -18,25 +20,41 @@ export default function MerchantItem({ brands, isLoading, onFilterChange, mercha
|
|
|
18
20
|
const isAllSelected = useMemo(() => {
|
|
19
21
|
if (!brands.length)
|
|
20
22
|
return false;
|
|
21
|
-
return brands.every((brand) => brand.merchants.every(({ legacy_id }) => merchantsIds.includes(legacy_id)));
|
|
23
|
+
return brands.every((brand) => { var _a; return (_a = brand.merchants) === null || _a === void 0 ? void 0 : _a.every(({ legacy_id }) => merchantsIds.includes(legacy_id)); });
|
|
22
24
|
}, [merchantsIds, brands, hideCheckbox]);
|
|
23
25
|
const isSomeSelected = useMemo(() => !isAllSelected && merchantsIds.length > 0, [merchantsIds, isAllSelected]);
|
|
24
26
|
// Count the number of brands that have selected merchants
|
|
25
27
|
const brandsWithSelectedMerchants = useMemo(() => {
|
|
26
|
-
return brands.filter((brand) => brand.merchants.some((merchant) => merchantsIds === null || merchantsIds === void 0 ? void 0 : merchantsIds.includes(merchant.legacy_id))).length;
|
|
28
|
+
return brands.filter((brand) => { var _a; return (_a = brand.merchants) === null || _a === void 0 ? void 0 : _a.some((merchant) => merchantsIds === null || merchantsIds === void 0 ? void 0 : merchantsIds.includes(merchant.legacy_id)); }).length;
|
|
27
29
|
}, [brands, merchantsIds]);
|
|
28
30
|
const onClick = () => {
|
|
29
31
|
if (isAllSelected && !atLeastOneMerchantSelected) {
|
|
30
32
|
onFilterChange === null || onFilterChange === void 0 ? void 0 : onFilterChange([]);
|
|
31
33
|
return;
|
|
32
34
|
}
|
|
33
|
-
const allMerchants = brands.flatMap((brand) => brand.merchants.map(({ legacy_id }) => legacy_id));
|
|
35
|
+
const allMerchants = brands.flatMap((brand) => { var _a; return (_a = brand.merchants) === null || _a === void 0 ? void 0 : _a.map(({ legacy_id }) => legacy_id); });
|
|
34
36
|
onFilterChange === null || onFilterChange === void 0 ? void 0 : onFilterChange(allMerchants);
|
|
35
37
|
};
|
|
36
38
|
const isDisabled = isLoading || !(brands === null || brands === void 0 ? void 0 : brands.length);
|
|
39
|
+
const handleSearchInputChange = (value) => {
|
|
40
|
+
setSearchInputValue(value);
|
|
41
|
+
};
|
|
42
|
+
const handleSearchInputReset = () => {
|
|
43
|
+
setSearchInputValue('');
|
|
44
|
+
};
|
|
45
|
+
const filteredBrands = useMemo(() => {
|
|
46
|
+
if (!searchInputValue.trim())
|
|
47
|
+
return brands;
|
|
48
|
+
return brands.filter((brand) => {
|
|
49
|
+
var _a, _b, _c;
|
|
50
|
+
return ((_b = (_a = getNameText(brand.name)) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(searchInputValue.trim().toLowerCase())) ||
|
|
51
|
+
((_c = brand === null || brand === void 0 ? void 0 : brand.id) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes(searchInputValue.trim().toLowerCase()));
|
|
52
|
+
});
|
|
53
|
+
}, [searchInputValue, brands]);
|
|
54
|
+
const displayBrands = useMemo(() => (showSearchInput ? filteredBrands : brands), [brands, filteredBrands, showSearchInput]);
|
|
37
55
|
return (_jsxs(MenuItem, Object.assign({ isDisabled: isDisabled, isSelected: isAllSelected, hideCheckbox: hideCheckbox, isIndeterminate: isSomeSelected, sx: Object.assign(Object.assign({ maxHeight: 36, minHeight: 36, padding: '12px 8px 12px 16px' }, (open && { boxShadow: '0px 0px 16px 0px #00000021' })), (isDisabled && {
|
|
38
56
|
pointerEvents: 'none',
|
|
39
57
|
opacity: 0.5,
|
|
40
58
|
cursor: 'default',
|
|
41
|
-
})), onMouseEnter: onOpen, onMouseLeave: onClose, onClick: onClick }, { children: [_jsx(Text, Object.assign({ sx: { fontSize: '11px', flex: 1 } }, { children: t('merchant') })), brands.length > 0 && _jsx("img", { src: rightArrow, alt: "arrow", style: { height: 12 } }), (brands === null || brands === void 0 ? void 0 : brands.length) === 1 ? (_jsx(FlatMerchantsListMenu, { anchorEl: anchorEl, brand: brands[0], merchantsIds: merchantsIds, onChangeMerchant: onFilterChange, atLeastOneMerchantSelected: atLeastOneMerchantSelected, showSearchInput: showSearchInput })) : (
|
|
59
|
+
})), onMouseEnter: onOpen, onMouseLeave: onClose, onClick: onClick }, { children: [_jsx(Text, Object.assign({ sx: { fontSize: '11px', flex: 1 } }, { children: t('merchant') })), brands.length > 0 && _jsx("img", { src: rightArrow, alt: "arrow", style: { height: 12 } }), (brands === null || brands === void 0 ? void 0 : brands.length) === 1 ? (_jsx(FlatMerchantsListMenu, { anchorEl: anchorEl, brand: brands[0], merchantsIds: merchantsIds, onChangeMerchant: onFilterChange, atLeastOneMerchantSelected: atLeastOneMerchantSelected, showSearchInput: showSearchInput })) : (_jsxs(Menu, Object.assign({ open: open, anchorEl: anchorEl, placement: "right-start" }, { children: [showSearchInput && brands.length > 1 && (_jsx(SearchListInput, { placeholder: "Brands", name: "brands", value: searchInputValue, onSearchChange: handleSearchInputChange, onSearchReset: handleSearchInputReset, sx: { px: '8px' } })), displayBrands === null || displayBrands === void 0 ? void 0 : displayBrands.map((brand) => (_jsx(BrandItem, { isDisabled: brandsWithSelectedMerchants === 1 && atLeastOneMerchantSelected, brand: brand, merchantsIds: merchantsIds, onChangeMerchant: onFilterChange, atLeastOneMerchantSelected: atLeastOneMerchantSelected, showSearchInput: showSearchInput, renderBrandLogo: renderBrandLogo }, brand.id)))] })))] })));
|
|
42
60
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { MerchantsDropdownProps } from './type';
|
|
3
|
-
declare function MerchantsDropdown({ brands, isLoading, label, sx, selectedValue, isDisabled, isFetchingNextPage, renderBrandLogo, onValueChange, }: Readonly<MerchantsDropdownProps>): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
declare function MerchantsDropdown({ brands, isLoading, label, sx, selectedValue, isDisabled, isFetchingNextPage, renderBrandLogo, onValueChange, showSearchInput, }: Readonly<MerchantsDropdownProps>): import("react/jsx-runtime").JSX.Element;
|
|
4
4
|
declare const _default: import("react").MemoExoticComponent<typeof MerchantsDropdown>;
|
|
5
5
|
export default _default;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { memo, useMemo, useCallback, useRef } from 'react';
|
|
2
|
+
import { memo, useMemo, useCallback, useRef, useState } from 'react';
|
|
3
3
|
import ClickAwayListener from '@mui/material/ClickAwayListener';
|
|
4
|
-
import { Loader, LastRowContent } from '../index.js';
|
|
4
|
+
import { Loader, LastRowContent, SearchListInput } from '../index.js';
|
|
5
5
|
import { downArrowIcon } from '../../constants/index.js';
|
|
6
|
+
import { getNameText } from '../../utils/index.js';
|
|
6
7
|
import BrandItem from './BrandItem';
|
|
7
8
|
import { SelectedBrand, Label, CollapseIcon, LoadingRow, StyledMenu } from './style';
|
|
8
9
|
import { useDropdownMenu, useDefaultMerchantSelection, getIsSingleMerchant } from './hooks';
|
|
@@ -18,10 +19,11 @@ const DropdownArrowIcon = ({ isLoading, isSingleMerchant, isOpen }) => {
|
|
|
18
19
|
}
|
|
19
20
|
return null;
|
|
20
21
|
};
|
|
21
|
-
function MerchantsDropdown({ brands, isLoading = true, label, sx, selectedValue, isDisabled, isFetchingNextPage, renderBrandLogo, onValueChange, }) {
|
|
22
|
+
function MerchantsDropdown({ brands, isLoading = true, label, sx, selectedValue, isDisabled, isFetchingNextPage, renderBrandLogo, onValueChange, showSearchInput, }) {
|
|
22
23
|
var _a;
|
|
23
24
|
const { anchorElement, isOpen, openMenu, closeMenu } = useDropdownMenu();
|
|
24
25
|
const controllerRef = useRef(null);
|
|
26
|
+
const [searchInputValue, setSearchInputValue] = useState('');
|
|
25
27
|
useDefaultMerchantSelection(brands, selectedValue, onValueChange);
|
|
26
28
|
const isSingleMerchant = useMemo(() => getIsSingleMerchant(brands), [brands]);
|
|
27
29
|
const shouldDisableInteraction = isSingleMerchant || isDisabled || isLoading;
|
|
@@ -35,15 +37,31 @@ function MerchantsDropdown({ brands, isLoading = true, label, sx, selectedValue,
|
|
|
35
37
|
closeMenu();
|
|
36
38
|
}
|
|
37
39
|
}, [isOpen, closeMenu]);
|
|
40
|
+
const handleSearchInputChange = (value) => {
|
|
41
|
+
setSearchInputValue(value);
|
|
42
|
+
};
|
|
43
|
+
const handleSearchInputReset = () => {
|
|
44
|
+
setSearchInputValue('');
|
|
45
|
+
};
|
|
46
|
+
const filteredBrands = useMemo(() => {
|
|
47
|
+
if (!searchInputValue.trim())
|
|
48
|
+
return brands;
|
|
49
|
+
return brands.filter((brand) => {
|
|
50
|
+
var _a, _b, _c;
|
|
51
|
+
return ((_b = (_a = getNameText(brand.name)) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(searchInputValue.trim().toLowerCase())) ||
|
|
52
|
+
((_c = brand === null || brand === void 0 ? void 0 : brand.id) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes(searchInputValue.trim().toLowerCase()));
|
|
53
|
+
});
|
|
54
|
+
}, [searchInputValue, brands]);
|
|
55
|
+
const displayBrands = useMemo(() => (showSearchInput ? filteredBrands : brands), [brands, filteredBrands, showSearchInput]);
|
|
38
56
|
return (_jsx(ClickAwayListener, Object.assign({ onClickAway: handleClickAway }, { children: _jsxs(SelectedBrand, Object.assign({ isOpen: isOpen, onClick: handleContainerClick, sx: Object.assign(Object.assign({}, (shouldDisableInteraction && {
|
|
39
57
|
pointerEvents: 'none',
|
|
40
58
|
opacity: 0.7,
|
|
41
|
-
})), sx), ref: controllerRef }, { children: [_jsx(Label, Object.assign({ noWrap: true, sx: Object.assign({}, (label.length > 16 && {
|
|
59
|
+
})), sx), ref: controllerRef }, { children: [_jsx(Label, Object.assign({ noWrap: true, sx: Object.assign({}, ((label === null || label === void 0 ? void 0 : label.length) > 16 && {
|
|
42
60
|
width: 100,
|
|
43
61
|
})) }, { children: label })), _jsx(DropdownArrowIcon, { isLoading: isLoading, isSingleMerchant: isSingleMerchant, isOpen: isOpen }), _jsxs(StyledMenu, Object.assign({ open: isOpen, anchorEl: anchorElement, sx: {
|
|
44
|
-
'& .MuiPopper-dropdown': Object.assign({ mt: '5px', overflowY: 'auto', maxHeight: 432 }, (controllerRef.current && {
|
|
62
|
+
'& .MuiPopper-dropdown': Object.assign(Object.assign({ mt: '5px', overflowY: 'auto', maxHeight: 432 }, (controllerRef.current && {
|
|
45
63
|
width: (_a = controllerRef.current.offsetWidth) !== null && _a !== void 0 ? _a : 'auto',
|
|
46
|
-
})),
|
|
47
|
-
} }, { children: [brands === null ||
|
|
64
|
+
})), { minWidth: 180 }),
|
|
65
|
+
} }, { children: [showSearchInput && brands.length > 1 && (_jsx(SearchListInput, { placeholder: "Brands", name: "brands", value: searchInputValue, onSearchChange: handleSearchInputChange, onSearchReset: handleSearchInputReset, sx: { px: '8px' } })), displayBrands === null || displayBrands === void 0 ? void 0 : displayBrands.map((brand) => (_jsx(BrandItem, { brand: brand, selectedValue: selectedValue, onClose: closeMenu, onValueChange: onValueChange, renderBrandLogo: renderBrandLogo }, brand.id))), isFetchingNextPage && (_jsx(LoadingRow, { children: _jsx(LastRowContent, { isLoadingRow: true }) }))] }))] })) })));
|
|
48
66
|
}
|
|
49
67
|
export default memo(MerchantsDropdown);
|
package/package.json
CHANGED