1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-04-15 01:16:22 +02:00

feat: filter chips icons (#5658)

This commit is contained in:
Mateusz Kwasniewski 2023-12-15 14:42:09 +01:00 committed by GitHub
parent 864ae4530b
commit d429f51cbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 47 additions and 23 deletions

View File

@ -8,7 +8,8 @@ const getDate = (option: string) => screen.getByText(option);
const setup = (initialState: FilterItemParams | null) => {
const recordedChanges: FilterItemParams[] = [];
const mockProps: IFilterDateItemProps = {
label: 'Test Label',
name: 'Test Label',
label: 'irrelevant',
onChange: (value: FilterItemParams) => {
recordedChanges.push(value);
},

View File

@ -1,5 +1,5 @@
import { Box } from '@mui/material';
import React, { FC, useEffect, useRef, useState } from 'react';
import React, { FC, ReactNode, useEffect, useRef, useState } from 'react';
import { StyledPopover } from 'component/filter/FilterItem/FilterItem.styles';
import { FilterItemChip } from 'component/filter/FilterItem/FilterItemChip/FilterItemChip';
import { DateCalendar, LocalizationProvider } from '@mui/x-date-pickers';
@ -10,7 +10,8 @@ import { getLocalizedDateString } from '../util';
import { FilterItemParams } from 'component/filter/FilterItem/FilterItem';
export interface IFilterDateItemProps {
label: string;
name: string;
label: ReactNode;
onChange: (value: FilterItemParams) => void;
onChipClose: () => void;
state: FilterItemParams | null | undefined;
@ -18,6 +19,7 @@ export interface IFilterDateItemProps {
}
export const FilterDateItem: FC<IFilterDateItemProps> = ({
name,
label,
onChange,
onChipClose,
@ -72,6 +74,7 @@ export const FilterDateItem: FC<IFilterDateItemProps> = ({
<Box ref={ref}>
<FilterItemChip
label={label}
name={name}
selectedDisplayOptions={selectedOptions}
onDelete={onDelete}
onClick={open}

View File

@ -8,7 +8,8 @@ const getOption = (option: string) =>
const setup = (initialState: FilterItemParams | null) => {
const recordedChanges: FilterItemParams[] = [];
const mockProps: IFilterItemProps = {
label: 'Test Label',
name: 'Test Label',
label: 'irrelevant',
options: [
{
label: 'Option 1',

View File

@ -1,6 +1,6 @@
import { Search } from '@mui/icons-material';
import { Box, InputAdornment, List, ListItemText } from '@mui/material';
import { FC, useEffect, useRef, useState } from 'react';
import { FC, ReactNode, useEffect, useRef, useState } from 'react';
import {
StyledCheckbox,
StyledDropdown,
@ -11,7 +11,8 @@ import {
import { FilterItemChip } from './FilterItemChip/FilterItemChip';
export interface IFilterItemProps {
label: string;
name: string;
label: ReactNode;
options: Array<{ label: string; value: string }>;
onChange: (value: FilterItemParams) => void;
onChipClose: () => void;
@ -26,6 +27,7 @@ export type FilterItemParams = {
};
export const FilterItem: FC<IFilterItemProps> = ({
name,
label,
options,
onChange,
@ -101,6 +103,7 @@ export const FilterItem: FC<IFilterItemProps> = ({
<>
<Box ref={ref}>
<FilterItemChip
name={name}
label={label}
selectedDisplayOptions={selectedDisplayOptions}
onDelete={onDelete}

View File

@ -1,5 +1,5 @@
import { ComponentProps, FC } from 'react';
import { ArrowDropDown, Close, TopicOutlined } from '@mui/icons-material';
import { ComponentProps, FC, ReactNode } from 'react';
import { ArrowDropDown, Close } from '@mui/icons-material';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { Chip, IconButton, styled } from '@mui/material';
import { FilterItemOperator } from './FilterItemOperator/FilterItemOperator';
@ -32,13 +32,6 @@ const StyledLabel = styled('div')(({ theme }) => ({
fontWeight: theme.typography.fontWeightBold,
}));
const StyledCategoryIconWrapper = styled('div')(({ theme }) => ({
marginRight: theme.spacing(0.5),
display: 'flex',
alignItems: 'center',
fontSize: theme.spacing(2),
}));
const StyledOptions = styled('button')(({ theme }) => ({
color: theme.palette.text.primary,
fontWeight: theme.typography.fontWeightRegular,
@ -75,7 +68,8 @@ const Arrow = () => (
);
interface IFilterItemChipProps {
label: string;
name: string;
label: ReactNode;
selectedDisplayOptions?: string[];
operatorOptions: string[];
operator: string;
@ -85,6 +79,7 @@ interface IFilterItemChipProps {
}
export const FilterItemChip: FC<IFilterItemChipProps> = ({
name,
label,
selectedDisplayOptions = [],
operatorOptions,
@ -104,7 +99,7 @@ export const FilterItemChip: FC<IFilterItemChipProps> = ({
trackEvent('search-filter', {
props: {
label: label,
label: name,
operator: operator,
},
});
@ -115,9 +110,6 @@ export const FilterItemChip: FC<IFilterItemChipProps> = ({
isActive={hasSelectedOptions}
label={
<StyledLabel>
<StyledCategoryIconWrapper>
<TopicOutlined fontSize='inherit' />
</StyledCategoryIconWrapper>
{label}
<ConditionallyRender
condition={!hasSelectedOptions}

View File

@ -1,5 +1,5 @@
import { useEffect, useState, VFC } from 'react';
import { Box, styled } from '@mui/material';
import { Box, Icon, styled } from '@mui/material';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { AddFilterButton } from '../AddFilterButton';
import { FilterDateItem } from 'component/common/FilterDateItem/FilterDateItem';
@ -44,6 +44,19 @@ type IDateFilterItem = IBaseFilterItem & {
export type IFilterItem = ITextFilterItem | IDateFilterItem;
const StyledCategoryIconWrapper = styled('div')(({ theme }) => ({
marginRight: theme.spacing(0.5),
display: 'flex',
alignItems: 'center',
fontSize: theme.spacing(2),
}));
const StyledIcon = styled(Icon)(({ theme }) => ({
'&.material-symbols-outlined': {
fontSize: theme.spacing(2),
},
}));
export const Filters: VFC<IFilterProps> = ({
state,
onChange,
@ -105,10 +118,20 @@ export const Filters: VFC<IFilterProps> = ({
return null;
}
const label = (
<>
<StyledCategoryIconWrapper>
<StyledIcon>{filter.icon}</StyledIcon>
</StyledCategoryIconWrapper>
{filter.label}
</>
);
if ('dateOperators' in filter) {
return (
<FilterDateItem
label={filter.label}
label={label}
name={filter.label}
state={state[filter.filterKey]}
onChange={(value) =>
onChange({ [filter.filterKey]: value })
@ -122,7 +145,8 @@ export const Filters: VFC<IFilterProps> = ({
return (
<FilterItem
key={filter.label}
label={filter.label}
label={label}
name={filter.label}
state={state[filter.filterKey]}
options={filter.options}
onChange={(value) =>