Skip to content

Commit

Permalink
[frontend] Fix: When opening a filter for the first time, focus is no…
Browse files Browse the repository at this point in the history
…t taken (#5062)

Co-authored-by: Samuel Hassine <samuel.hassine@filigran.io>
  • Loading branch information
jpkha and SamuelHassine committed Dec 4, 2023
1 parent f9f55b9 commit 4b54fdc
Show file tree
Hide file tree
Showing 31 changed files with 101 additions and 122 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { FunctionComponent } from 'react';
import React, { FunctionComponent, useRef } from 'react';
import { ChipOwnProps } from '@mui/material/Chip/Chip';
import { DataColumns } from './list_lines';
import {
Expand Down Expand Up @@ -41,6 +41,10 @@ const FilterIconButton: FunctionComponent<FilterIconButtonProps> = ({
chipColor,
helpers,
}) => {
const hasRenderedRef = useRef(false);
const setHasRenderedRef = () => {
hasRenderedRef.current = true;
};
const displayedFilters = {
...filters,
filters:
Expand Down Expand Up @@ -71,6 +75,8 @@ const FilterIconButton: FunctionComponent<FilterIconButtonProps> = ({
filters={displayedFilters}
filtersRepresentativesQueryRef={filtersRepresentativesQueryRef}
helpers={helpers}
hasRenderedRef={hasRenderedRef.current}
setHasRenderedRef={setHasRenderedRef}
/>
</React.Suspense>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ interface FilterIconButtonContainerProps {
filtersRepresentativesQueryRef: PreloadedQuery<FilterIconButtonContentQuery>;
chipColor?: ChipOwnProps['color'];
helpers?: UseLocalStorageHelpers;
hasRenderedRef: boolean;
setHasRenderedRef: () => void;
}

const FilterIconButtonContainer: FunctionComponent<
Expand All @@ -102,6 +104,8 @@ FilterIconButtonContainerProps
chipColor,
handleRemoveFilter,
helpers,
hasRenderedRef,
setHasRenderedRef,
}) => {
const { t } = useFormatter();
const classes = useStyles();
Expand All @@ -122,7 +126,7 @@ FilterIconButtonContainerProps
}
const latestItemRef = useRef(null);
const nbDisplayFilter = useRef(0);
const hasRenderedRef = useRef(false);

const filtersRepresentativesMap = new Map(
filtersRepresentatives.map((n) => [n.id, n.value]),
);
Expand All @@ -136,17 +140,18 @@ FilterIconButtonContainerProps
// it means that the new filter feature is activated. Will be removed in the next version when we generalize the feature on every filter.
useEffect(() => {
if (
hasRenderedRef.current
hasRenderedRef
&& latestItemRef.current
&& nbDisplayFilter.current < displayedFilters.length
) {
setFilterChipsParams({
filterId: displayedFilters[displayedFilters.length - 1].id,
anchorEl: latestItemRef.current as unknown as HTMLElement,
});
} else {
setHasRenderedRef();
}
nbDisplayFilter.current = displayedFilters.length;
hasRenderedRef.current = true;
}, [displayedFilters]);
}
const handleClose = () => {
Expand Down Expand Up @@ -194,7 +199,6 @@ FilterIconButtonContainerProps
return null;
}
};

const isReadonlyFilter = helpers || handleRemoveFilter;
return (
<Box
Expand All @@ -206,7 +210,7 @@ FilterIconButtonContainerProps
marginRight: '30px',
}
: {
marginTop: '10px',
marginTop: displayedFilters.length === 0 ? 0 : '10px',
gap: '10px',
display: 'flex',
flexWrap: 'wrap',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import Security from '../../utils/Security';
import { KNOWLEDGE_KNGETEXPORT } from '../../utils/hooks/useGranted';
import FilterIconButton from '../FilterIconButton';
import { export_max_size } from '../../utils/utils';
import { isFilterGroupNotEmpty } from '../../utils/filters/filtersUtils';
import GenerateDefaultDirectFilters from '../GenerateDefaultDirectFilters';

const styles = () => ({
Expand Down Expand Up @@ -219,16 +218,14 @@ class ListCards extends Component {
availableFilterKeys={availableFilterKeys}
helpers={helpers}
/>
{isFilterGroupNotEmpty(filters) && (
<FilterIconButton
helpers={helpers}
filters={filters}
handleRemoveFilter={handleRemoveFilter}
handleSwitchGlobalMode={handleSwitchGlobalMode}
handleSwitchLocalMode={handleSwitchLocalMode}
redirection
/>
)}
<FilterIconButton
helpers={helpers}
filters={filters}
handleRemoveFilter={handleRemoveFilter}
handleSwitchGlobalMode={handleSwitchGlobalMode}
handleSwitchLocalMode={handleSwitchLocalMode}
redirection
/>
{typeof handleToggleExports === 'function' && (
<Security needs={[KNOWLEDGE_KNGETEXPORT]}>
<StixDomainObjectsExports
Expand Down Expand Up @@ -268,7 +265,7 @@ ListCards.propTypes = {
paginationOptions: PropTypes.object,
numberOfElements: PropTypes.object,
availableFilterKeys: PropTypes.array,
helpers: PropTypes.func,
helpers: PropTypes.object,
};

export default compose(inject18n, withStyles(styles))(ListCards);
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ import { ExportContext } from '../../utils/ExportContextProvider';
import { export_max_size } from '../../utils/utils';
import Transition from '../Transition';
import GenerateDefaultDirectFilters from '../GenerateDefaultDirectFilters';
import { isFilterGroupNotEmpty } from '../../utils/filters/filtersUtils';

const styles = (theme) => ({
container: {
Expand Down Expand Up @@ -457,17 +456,15 @@ class ListLines extends Component {
availableFilterKeys={availableFilterKeys}
helpers={helpers}
/>
{isFilterGroupNotEmpty(filters) && (
<FilterIconButton
helpers={helpers}
availableFilterKeys={availableFilterKeys}
filters={filters}
handleRemoveFilter={handleRemoveFilter}
handleSwitchGlobalMode={handleSwitchGlobalMode}
handleSwitchLocalMode={handleSwitchLocalMode}
redirection
/>
)}
<FilterIconButton
helpers={helpers}
availableFilterKeys={availableFilterKeys}
filters={filters}
handleRemoveFilter={handleRemoveFilter}
handleSwitchGlobalMode={handleSwitchGlobalMode}
handleSwitchLocalMode={handleSwitchLocalMode}
redirection
/>
{message && (
<div style={{ width: '100%', marginTop: 10 }}>
<Alert
Expand Down Expand Up @@ -711,7 +708,7 @@ ListLines.propTypes = {
inline: PropTypes.bool,
searchContext: PropTypes.object,
handleExportCsv: PropTypes.func,
helpers: PropTypes.func,
helpers: PropTypes.object,
};

export default compose(inject18n, withStyles(styles))(ListLines);
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import { MESSAGING$ } from '../../../../relay/environment';
import Filters from '../lists/Filters';
import FilterIconButton from '../../../../components/FilterIconButton';
import { UserContext } from '../../../../utils/hooks/useAuth';
import { isFilterGroupNotEmpty } from '../../../../utils/filters/filtersUtils';

const useStyles = makeStyles(() => ({
bottomNav: {
Expand Down Expand Up @@ -155,12 +154,12 @@ const ContentKnowledgeTimeLineBar = ({
/>
</div>
<div style={{ paddingTop: 3 }}>
{isFilterGroupNotEmpty(timeLineFilters) && <FilterIconButton
<FilterIconButton
filters={timeLineFilters}
handleRemoveFilter={handleRemoveTimeLineFilter}
classNameNumber={1}
redirection
/>}
/>
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import FilterIconButton from '../../../../components/FilterIconButton';
import { usePaginationLocalStorage } from '../../../../utils/hooks/useLocalStorage';
import {
initialFilterGroup,
isFilterGroupNotEmpty,
} from '../../../../utils/filters/filtersUtils';

const useStyles = makeStyles(() => ({
Expand Down Expand Up @@ -240,15 +239,14 @@ const StixCoreObjectOrStixCoreRelationshipContainers = ({
availableFilterKeys={availableFilterKeys}
handleAddFilter={defaultHandleAddFilter}
/>
{isFilterGroupNotEmpty(filters) && (

<FilterIconButton
helpers={helpers}
filters={filters}
handleRemoveFilter={helpers.handleRemoveFilter}
className={5}
redirection
/>
)}
<div className="clearfix" />
</div>
<QueryRenderer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import DialogActions from '@mui/material/DialogActions';
import Button from '@mui/material/Button';
import { useFormatter } from '../../../../components/i18n';
import FilterIconButton from '../../../../components/FilterIconButton';
import { isFilterGroupNotEmpty } from '../../../../utils/filters/filtersUtils';

const DialogFilters = ({
handleOpenFilters,
Expand Down Expand Up @@ -46,7 +45,7 @@ const DialogFilters = ({
>
<DialogTitle>{t('Advanced search')}</DialogTitle>
<DialogContent style={{ paddingTop: 10 }}>
{isFilterGroupNotEmpty(filters) && (

<FilterIconButton
filters={filters}
handleRemoveFilter={defaultHandleRemoveFilter}
Expand All @@ -56,7 +55,6 @@ const DialogFilters = ({
classNameNumber={4}
styleNumber={2}
/>
)}
{filterElement}
</DialogContent>
<DialogActions>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import StixCoreRelationshipsExports from '../stix_core_relationships/StixCoreRel
import Filters from '../lists/Filters';
import FilterIconButton from '../../../../components/FilterIconButton';
import { export_max_size } from '../../../../utils/utils';
import { isFilterGroupNotEmpty } from '../../../../utils/filters/filtersUtils';

const styles = (theme) => ({
container: {
Expand Down Expand Up @@ -189,13 +188,13 @@ class StixDomainObjectAttackPatternsKillChainComponent extends Component {
handleSwitchLocalMode={handleSwitchLocalMode}
handleSwitchGlobalMode={handleSwitchGlobalMode}
/>
{isFilterGroupNotEmpty(filters) && <FilterIconButton
<FilterIconButton
filters={filters}
handleRemoveFilter={handleRemoveFilter}
classNameNumber={6}
styleNumber={2}
redirection
/>}
/>
<div style={{ float: 'right', margin: 0 }}>
<ToggleButtonGroup size="small" color="secondary" exclusive={true}>
<Tooltip title={t('Matrix view')}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ import { Theme } from '../../../../components/Theme';
import {
findFilterFromKey,
initialFilterGroup,
isFilterGroupNotEmpty,

removeFilter,
} from '../../../../utils/filters/filtersUtils';
import FilterIconButton from '../../../../components/FilterIconButton';
Expand Down Expand Up @@ -442,14 +442,12 @@ const StixDomainObjectThreatKnowledge: FunctionComponent<StixDomainObjectThreatK
>
<SettingsOutlined />
</IconButton>
{isFilterGroupNotEmpty(filters)
&& <FilterIconButton
<FilterIconButton
helpers={helpers}
filters={filters}
handleRemoveFilter={helpers.handleRemoveFilter}
classNameNumber={8}
></FilterIconButton>
}
<Popover
classes={{ paper: classes.container }}
open={openTimeField}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import {
constructHandleAddFilter,
constructHandleRemoveFilter,
filtersAfterSwitchLocalMode,
initialFilterGroup, isFilterGroupNotEmpty,
initialFilterGroup,
serializeFilterGroupForBackend,
} from '../../../../utils/filters/filtersUtils';
import FilterIconButton from '../../../../components/FilterIconButton';
Expand Down Expand Up @@ -522,16 +522,15 @@ const FeedCreation = (props) => {
/>
</div>
<div className="clearfix" />
{isFilterGroupNotEmpty(filters)
&& <FilterIconButton
<FilterIconButton
filters={filters}
handleRemoveFilter={handleRemoveFilter}
handleSwitchLocalMode={handleSwitchLocalMode}
handleSwitchGlobalMode={handleSwitchGlobalMode}
classNameNumber={2}
styleNumber={2}
redirection
/>}
/>
{selectedTypes.length > 0 && (
<div
className={classes.container}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import {
constructHandleAddFilter,
constructHandleRemoveFilter,
deserializeFilterGroupForFrontend,
filtersAfterSwitchLocalMode, isFilterGroupNotEmpty,
filtersAfterSwitchLocalMode,
serializeFilterGroupForBackend,
} from '../../../../utils/filters/filtersUtils';
import FilterIconButton from '../../../../components/FilterIconButton';
Expand Down Expand Up @@ -483,16 +483,15 @@ const FeedEditionContainer = (props) => {
/>
</div>
<div className="clearfix" />
{isFilterGroupNotEmpty(filters)
&& <FilterIconButton
<FilterIconButton
filters={filters}
handleRemoveFilter={handleRemoveFilter}
handleSwitchLocalMode={handleSwitchLocalMode}
handleSwitchGlobalMode={handleSwitchGlobalMode}
classNameNumber={2}
styleNumber={2}
redirection
/>}
/>
{selectedTypes.length > 0 && (
<div className={classes.container} style={{ marginTop: 20 }}>
{Object.keys(feedAttributes).map((i) => (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import Skeleton from '@mui/material/Skeleton';
import FeedPopover from './FeedPopover';
import inject18n from '../../../../components/i18n';
import FilterIconButton from '../../../../components/FilterIconButton';
import { deserializeFilterGroupForFrontend, isFilterGroupNotEmpty } from '../../../../utils/filters/filtersUtils';
import { deserializeFilterGroupForFrontend } from '../../../../utils/filters/filtersUtils';

const Transition = React.forwardRef((props, ref) => (
<Slide direction="up" ref={ref} {...props} />
Expand Down Expand Up @@ -95,12 +95,12 @@ class FeedLineLineComponent extends Component {
>
{node.feed_attributes.map((n) => n.attribute).join(', ')}
</div>
{isFilterGroupNotEmpty(filters) && <FilterIconButton
<FilterIconButton
filters={filters}
classNameNumber={3}
styleNumber={3}
dataColumns={dataColumns}
/>}
/>
</div>
}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { useFormatter } from '../../../../components/i18n';
import { Theme } from '../../../../components/Theme';
import FilterIconButton from '../../../../components/FilterIconButton';
import { copyToClipboard } from '../../../../utils/utils';
import { deserializeFilterGroupForFrontend, isFilterGroupNotEmpty } from '../../../../utils/filters/filtersUtils';
import { deserializeFilterGroupForFrontend } from '../../../../utils/filters/filtersUtils';

const useStyles = makeStyles<Theme>(() => ({
bodyItem: {
Expand Down Expand Up @@ -100,7 +100,7 @@ const dataColumns: DataColumns = {
const nodeFilters = deserializeFilterGroupForFrontend(node.filters);
return (
<>
{nodeFilters && isFilterGroupNotEmpty(nodeFilters) && <FilterIconButton
{nodeFilters && <FilterIconButton
filters={nodeFilters}
dataColumns={this}
classNameNumber={3}
Expand Down

0 comments on commit 4b54fdc

Please sign in to comment.