diff --git a/opencti-platform/opencti-front/src/components/ItemStatus.jsx b/opencti-platform/opencti-front/src/components/ItemStatus.jsx index 1b2c44921fc68..d74fb1c03617a 100644 --- a/opencti-platform/opencti-front/src/components/ItemStatus.jsx +++ b/opencti-platform/opencti-front/src/components/ItemStatus.jsx @@ -28,13 +28,14 @@ const styles = () => ({ }); const ItemStatus = (props) => { - const { classes, t, status, variant, disabled } = props; + const { classes, t, status, variant, disabled, onClick } = props; const style = variant === 'inList' ? classes.chipInList : classes.chip; if (status && status.template) { return ( { ItemStatus.propTypes = { classes: PropTypes.object.isRequired, + onClick: PropTypes.func, status: PropTypes.object, variant: PropTypes.string, t: PropTypes.func, diff --git a/opencti-platform/opencti-front/src/components/dataGrid/DataTable.tsx b/opencti-platform/opencti-front/src/components/dataGrid/DataTable.tsx index 080bdb26ff7df..bc9f84d304fba 100644 --- a/opencti-platform/opencti-front/src/components/dataGrid/DataTable.tsx +++ b/opencti-platform/opencti-front/src/components/dataGrid/DataTable.tsx @@ -13,6 +13,7 @@ import useLocalStorage, { usePaginationLocalStorage } from '../../utils/hooks/us const DataTable = ({ dataColumns, filterExportContext, + lineFragment, resolvePath, storageKey, initialValues, @@ -24,6 +25,7 @@ const DataTable = ({ availableRelationFilterTypes, preloadedPaginationProps, parametersWithPadding = false, + redirectionModeEnabled = false, }: DataTableProps) => { const memoizedHeaders = useRef(null); const setMemoizedHeaders = useCallback((headers: ReactNode) => { @@ -76,6 +78,8 @@ const DataTable = ({ availableFilterKeys, paginationOptions, filterExportContext, + lineFragment, + redirectionModeEnabled, } as DataTableContextProps} >
diff --git a/opencti-platform/opencti-front/src/components/dataGrid/DataTableBody.tsx b/opencti-platform/opencti-front/src/components/dataGrid/DataTableBody.tsx index dce5570374002..7828c89a18a55 100644 --- a/opencti-platform/opencti-front/src/components/dataGrid/DataTableBody.tsx +++ b/opencti-platform/opencti-front/src/components/dataGrid/DataTableBody.tsx @@ -3,12 +3,12 @@ import makeStyles from '@mui/styles/makeStyles'; import { createStyles } from '@mui/styles'; import usePreloadedPaginationFragment from '../../utils/hooks/usePreloadedPaginationFragment'; import DataTableHeaders, { MemoizedTableHeaders } from './DataTableHeaders'; -import DataTableLines from './DataTableLines'; import { DataTableContext } from './dataTableUtils'; import { ColumnSizeVars, DataTableBodyProps } from './dataTableTypes'; import type { Theme } from '../Theme'; import useLocalStorage from '../../utils/hooks/useLocalStorage'; import { isNotEmptyField } from '../../utils/utils'; +import DataTableLine, { DataTableLineDummy } from './DataTableLine'; const SELECT_COLUMN_SIZE = 42; @@ -109,10 +109,15 @@ const DataTableBody = ({ style={{ ...columnSizeVars }} > {/* If we have perf issues we should find a way to memoize this */} - + {resolvedData.map((row: never) => { + return ( + + ); + })} + {isLoading && Array(10).fill(0).map((_, idx) => ())}
); diff --git a/opencti-platform/opencti-front/src/components/dataGrid/DataTableFilters.tsx b/opencti-platform/opencti-front/src/components/dataGrid/DataTableFilters.tsx index 69b8a81d45671..ab15d00022906 100644 --- a/opencti-platform/opencti-front/src/components/dataGrid/DataTableFilters.tsx +++ b/opencti-platform/opencti-front/src/components/dataGrid/DataTableFilters.tsx @@ -1,14 +1,23 @@ import Filters from '@components/common/lists/Filters'; -import React, { useContext } from 'react'; +import React, { useContext, useState } from 'react'; import makeStyles from '@mui/styles/makeStyles'; import Tooltip from '@mui/material/Tooltip'; -import { FileDownloadOutlined } from '@mui/icons-material'; +import { FileDownloadOutlined, SettingsOutlined } from '@mui/icons-material'; import ToggleButton from '@mui/material/ToggleButton'; import StixDomainObjectsExports from '@components/common/stix_domain_objects/StixDomainObjectsExports'; import StixCoreRelationshipsExports from '@components/common/stix_core_relationships/StixCoreRelationshipsExports'; import StixCoreObjectsExports from '@components/common/stix_core_objects/StixCoreObjectsExports'; import StixCyberObservablesExports from '@components/observations/stix_cyber_observables/StixCyberObservablesExports'; import { ToggleButtonGroup } from '@mui/material'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Select from '@mui/material/Select'; +import MenuItem from '@mui/material/MenuItem'; +import DialogActions from '@mui/material/DialogActions'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; import FilterIconButton from '../FilterIconButton'; import { useFormatter } from '../i18n'; import { DataTableDisplayFiltersProps, DataTableFiltersProps } from './dataTableTypes'; @@ -19,6 +28,7 @@ import useEntityToggle from '../../utils/hooks/useEntityToggle'; import Security from '../../utils/Security'; import { KNOWLEDGE_KNGETEXPORT } from '../../utils/hooks/useGranted'; import { ExportContext } from '../../utils/ExportContextProvider'; +import Transition from '../Transition'; const useStyles = makeStyles(() => ({ filterContainer: { @@ -75,15 +85,18 @@ const DataTableFilters = ({ }: DataTableFiltersProps) => { const { t_i18n } = useFormatter(); + const [openSettings, setOpenSettings] = useState(false); + const { paginationOptions, parametersWithPadding, storageKey, initialValues, currentView, + redirectionModeEnabled, filterExportContext: exportContext, } = useContext(DataTableContext); - const { helpers, viewStorage: { numberOfElements, openExports } } = usePaginationLocalStorage(storageKey, initialValues); + const { helpers, viewStorage: { numberOfElements, openExports, redirectionMode } } = usePaginationLocalStorage(storageKey, initialValues); const { selectedElements } = useEntityToggle(storageKey); @@ -136,13 +149,24 @@ const DataTableFilters = ({ if (value && value === 'export') { helpers.handleToggleExports(); } else if (value && value === 'settings') { - // this.handleOpenSettings(); + setOpenSettings(true); } else if (value && value !== 'export-csv') { helpers.handleChangeView(value); } }} style={{ margin: '0 0 0 5px' }} > + {redirectionModeEnabled && ( + + + + + + )} {!exportDisabled && ( @@ -203,6 +227,45 @@ const DataTableFilters = ({ /> )} + {redirectionModeEnabled && ( + setOpenSettings(false)} + maxWidth="xs" + fullWidth + > + {t_i18n('List settings')} + + + + {t_i18n('Redirection mode')} + + + + + + + + + )} ); }; diff --git a/opencti-platform/opencti-front/src/components/dataGrid/DataTableLine.tsx b/opencti-platform/opencti-front/src/components/dataGrid/DataTableLine.tsx index 379e9aa9ac38f..f3940b000b87f 100644 --- a/opencti-platform/opencti-front/src/components/dataGrid/DataTableLine.tsx +++ b/opencti-platform/opencti-front/src/components/dataGrid/DataTableLine.tsx @@ -1,6 +1,5 @@ import React, { useContext, useMemo } from 'react'; import { useFragment } from 'react-relay'; -import { entitiesFragment } from '@components/data/entities/EntitiesStixDomainObjectLine'; import Skeleton from '@mui/material/Skeleton'; import Checkbox from '@mui/material/Checkbox'; import IconButton from '@mui/material/IconButton'; @@ -70,17 +69,25 @@ const DataTableCell = ({ const DataTableLine = ({ row }: DataTableLineProps) => { const classes = useStyles({}); - const { effectiveColumns, storageKey } = useContext(DataTableContext); - const data = useFragment(entitiesFragment, row); + + const { effectiveColumns, storageKey, lineFragment, initialValues } = useContext(DataTableContext); const { selectAll, deSelectedElements, selectedElements, onToggleEntity, } = useEntityToggle(storageKey); + const { viewStorage: { redirectionMode } } = usePaginationLocalStorage(storageKey, initialValues); + + const data = useFragment(lineFragment, row); const navigate = useNavigate(); + let link = `${resolveLink(data.entity_type)}/${data.id}`; + if (redirectionMode && redirectionMode !== 'overview') { + link = `${link}/${redirectionMode}`; + } + return (
{ }} > {effectiveColumns.at(-1)?.id === 'navigate' && ( - navigate(`${resolveLink(data.entity_type)}/${data.id}`)}> + navigate(link)}> )} @@ -131,6 +138,8 @@ const DataTableLine = ({ row }: DataTableLineProps) => { export const DataTableLineDummy = () => { const classes = useStyles({}); const { effectiveColumns } = useContext(DataTableContext); + + const defaultWidth = (window.innerWidth - 200) / effectiveColumns.length; const lines = useMemo(() => ( <> {effectiveColumns.map((column) => ( @@ -138,7 +147,7 @@ export const DataTableLineDummy = () => { key={column.id} variant="text" height={50} - width={column?.size ? column.size - 20 : 100} + width={column?.size ? column.size - 20 : defaultWidth} /> ))} diff --git a/opencti-platform/opencti-front/src/components/dataGrid/DataTableLines.tsx b/opencti-platform/opencti-front/src/components/dataGrid/DataTableLines.tsx deleted file mode 100644 index b8125bafd3512..0000000000000 --- a/opencti-platform/opencti-front/src/components/dataGrid/DataTableLines.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import DataTableLine, { DataTableLineDummy } from './DataTableLine'; -import { DataTableLinesProps } from './dataTableTypes'; - -const DataTableLines = ({ - rows, - isLoading, -}: DataTableLinesProps) => { - return ( -
- {rows.map((row) => { - return ( - - ); - })} - {isLoading && Array(20).map((_, idx) => ())} -
- ); -}; - -export default DataTableLines; diff --git a/opencti-platform/opencti-front/src/components/dataGrid/dataTableTypes.ts b/opencti-platform/opencti-front/src/components/dataGrid/dataTableTypes.ts index 8ec3709628d41..866a8f15df12e 100644 --- a/opencti-platform/opencti-front/src/components/dataGrid/dataTableTypes.ts +++ b/opencti-platform/opencti-front/src/components/dataGrid/dataTableTypes.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { Dispatch, ReactNode, SetStateAction } from 'react'; +import { GraphQLTaggedNode } from 'react-relay'; import type { LocalStorage } from '../../utils/hooks/useLocalStorageModel'; import { UseLocalStorageHelpers } from '../../utils/hooks/useLocalStorage'; import { FilterGroup } from '../../utils/filters/filtersUtils'; @@ -44,6 +45,8 @@ export interface DataTableContextProps { currentView?: string filterExportContext?: { entity_type?: string, entity_id?: string } paginationOptions: PaginationOptions + redirectionModeEnabled?: boolean + lineFragment: GraphQLTaggedNode | null } export interface DataTableProps { @@ -56,10 +59,12 @@ export interface DataTableProps { searchContextFinal?: any availableFilterKeys: FilterIconButtonProps['availableFilterKeys'] availableRelationFilterTypes?: FilterIconButtonProps['availableRelationFilterTypes'] - availableEntityTypes: string[] + availableEntityTypes?: string[] availableRelationshipTypes?: string[] preloadedPaginationProps: UsePreloadedPaginationFragment filterExportContext?: { entity_type?: string, entity_id?: string } + redirectionModeEnabled?: boolean + lineFragment: GraphQLTaggedNode } export interface DataTableBodyProps { @@ -77,8 +82,6 @@ export type DataTableFiltersProps = Pick; -export type DataTableLinesProps = { rows: any[], isLoading: boolean }; - export interface DataTableLineProps { row: any } diff --git a/opencti-platform/opencti-front/src/components/dataGrid/dataTableUtils.tsx b/opencti-platform/opencti-front/src/components/dataGrid/dataTableUtils.tsx index 47e6717fed0d4..357deda9aaf03 100644 --- a/opencti-platform/opencti-front/src/components/dataGrid/dataTableUtils.tsx +++ b/opencti-platform/opencti-front/src/components/dataGrid/dataTableUtils.tsx @@ -2,12 +2,14 @@ import React from 'react'; import Chip from '@mui/material/Chip'; import makeStyles from '@mui/styles/makeStyles'; import StixCoreObjectLabels from '@components/common/stix_core_objects/StixCoreObjectLabels'; +import { graphql } from 'react-relay'; import type { DataTableColumn, DataTableContextProps } from './dataTableTypes'; import { DataTableProps } from './dataTableTypes'; import ItemIcon from '../ItemIcon'; import { hexToRGB, itemColor } from '../../utils/Colors'; import { defaultValue } from '../../utils/Graph'; import ItemMarkings from '../ItemMarkings'; +import ItemStatus from '../ItemStatus'; export const DataTableContext = React.createContext({ entityToggle: { @@ -15,6 +17,7 @@ export const DataTableContext = React.createContext({ onToggleEntity: () => {}, }, paginationOptions: {}, + lineFragment: null, parametersWithPadding: false, storageKey: '', initialValues: {}, @@ -80,7 +83,7 @@ const defaultColumns: DataTableProps['dataColumns'] = { id: 'creator', label: 'Creators', flexSize: 12, - render: ({ creators }) => (creators ?? []).map((c) => c?.name).join(', ') ?? '-', + render: ({ creators }) => (creators ?? []).map((c: { name: string }) => c.name).join(', ') ?? '-', }, objectLabel: { id: 'objectLabel', @@ -115,6 +118,42 @@ const defaultColumns: DataTableProps['dataColumns'] = { /> ), }, + report_types: { + label: 'Type', + flexSize: 8, + isSortable: true, + render: ({ report_types }, { storageHelpers, t_i18n }) => { + const classes = useStyles(); + return ( + storageHelpers.handleAddFilter('report_types', report_types?.at(0))} + color="primary" + variant="outlined" + label={report_types?.at(0) ?? t_i18n('Unknown')} + /> + ); + }, + }, + published: { + label: 'Date', + flexSize: 10, + isSortable: true, + render: ({ published }, { fd }) => fd(published), + }, + x_opencti_workflow_id: { + label: 'Status', + flexSize: 8, + isSortable: true, + render: ({ status, workflowEnabled }, { storageHelpers }) => ( + storageHelpers.handleAddFilter('workflow_id', status.template.id)} + status={status} + variant="inList" + disabled={!workflowEnabled} + /> + ), + }, }; export const defaultColumnsMap = new Map>(Object.entries(defaultColumns)); diff --git a/opencti-platform/opencti-front/src/private/components/analyses/Reports.tsx b/opencti-platform/opencti-front/src/private/components/analyses/Reports.tsx index 4c91faae51c2c..b86e280f54892 100644 --- a/opencti-platform/opencti-front/src/private/components/analyses/Reports.tsx +++ b/opencti-platform/opencti-front/src/private/components/analyses/Reports.tsx @@ -1,19 +1,156 @@ import React, { FunctionComponent } from 'react'; -import ListLines from '../../../components/list_lines/ListLines'; -import ReportsLines, { reportsLinesQuery } from './reports/ReportsLines'; +import { ReportsLines_data$data } from '@components/analyses/reports/__generated__/ReportsLines_data.graphql'; +import { graphql, useMutation } from 'react-relay'; +import { TextField } from '@mui/material'; import ReportCreation from './reports/ReportCreation'; -import ToolBar from '../data/ToolBar'; import Security from '../../../utils/Security'; import { KNOWLEDGE_KNUPDATE } from '../../../utils/hooks/useGranted'; import useAuth from '../../../utils/hooks/useAuth'; import { usePaginationLocalStorage } from '../../../utils/hooks/useLocalStorage'; import { ReportsLinesPaginationQuery, ReportsLinesPaginationQuery$variables } from './reports/__generated__/ReportsLinesPaginationQuery.graphql'; -import { ReportLine_node$data } from './reports/__generated__/ReportLine_node.graphql'; -import useEntityToggle from '../../../utils/hooks/useEntityToggle'; import useQueryLoading from '../../../utils/hooks/useQueryLoading'; -import { ReportLineDummy } from './reports/ReportLine'; -import ExportContextProvider from '../../../utils/ExportContextProvider'; import { buildEntityTypeBasedFilterContext, emptyFilterGroup } from '../../../utils/filters/filtersUtils'; +import DataTable from '../../../components/dataGrid/DataTable'; +import { UsePreloadedPaginationFragment } from '../../../utils/hooks/usePreloadedPaginationFragment'; +import { DataTableProps } from '../../../components/dataGrid/dataTableTypes'; + +const reportLineFragment = graphql` + fragment ReportsLine_node on Report { + id + entity_type + name + description + published + report_types + createdBy { + ... on Identity { + id + name + entity_type + } + } + objectMarking { + edges { + node { + id + definition_type + definition + x_opencti_order + x_opencti_color + } + } + } + objectLabel { + edges { + node { + id + value + color + } + } + } + creators { + id + name + } + status { + id + order + template { + id + name + color + } + } + workflowEnabled + created_at + } +`; + +const reportsLinesQuery = graphql` + query ReportsLinesPaginationQuery( + $search: String + $count: Int! + $cursor: ID + $orderBy: ReportsOrdering + $orderMode: OrderingMode + $filters: FilterGroup + ) { + ...ReportsLines_data + @arguments( + search: $search + count: $count + cursor: $cursor + orderBy: $orderBy + orderMode: $orderMode + filters: $filters + ) + } +`; + +const reportsLineFragment = graphql` + fragment ReportsLines_data on Query + @argumentDefinitions( + search: { type: "String" } + count: { type: "Int", defaultValue: 25 } + cursor: { type: "ID" } + orderBy: { type: "ReportsOrdering", defaultValue: name } + orderMode: { type: "OrderingMode", defaultValue: asc } + filters: { type: "FilterGroup" } + ) + @refetchable(queryName: "ReportsLinesRefetchQuery") { + reports( + search: $search + first: $count + after: $cursor + orderBy: $orderBy + orderMode: $orderMode + filters: $filters + ) @connection(key: "Pagination_reports") { + edges { + node { + id + name + published + createdBy { + ... on Identity { + id + name + entity_type + } + } + objectMarking { + edges { + node { + id + definition_type + definition + x_opencti_order + x_opencti_color + } + } + } + ...ReportsLine_node + } + } + pageInfo { + endCursor + hasNextPage + globalCount + } + } + } +`; + +const fieldPatch = graphql` + mutation ReportsEditMutation($id: ID!, $input: [EditInput]!) { + reportEdit(id: $id) { + fieldPatch(input: $input) { + ...ReportsLine_node + } + } + } +`; const LOCAL_STORAGE_KEY = 'reports'; @@ -22,39 +159,22 @@ const Reports: FunctionComponent = () => { platformModuleHelpers: { isRuntimeFieldEnable }, } = useAuth(); + const initialValues = { + filters: emptyFilterGroup, + searchTerm: '', + sortBy: 'published', + orderAsc: false, + openExports: false, + redirectionMode: 'overview', + }; const { viewStorage, paginationOptions, helpers: storageHelpers, - } = usePaginationLocalStorage( - LOCAL_STORAGE_KEY, - { - filters: emptyFilterGroup, - searchTerm: '', - sortBy: 'published', - orderAsc: false, - openExports: false, - redirectionMode: 'overview', - }, - ); + } = usePaginationLocalStorage(LOCAL_STORAGE_KEY, initialValues); const { - numberOfElements, filters, - searchTerm, - sortBy, - orderAsc, - openExports, - redirectionMode, } = viewStorage; - const { - selectedElements, - deSelectedElements, - selectAll, - handleClearSelectedElements, - handleToggleSelectAll, - onToggleEntity, - numberOfSelectedElements, - } = useEntityToggle(LOCAL_STORAGE_KEY); const contextFilters = buildEntityTypeBasedFilterContext('Report', filters); const queryPaginationOptions = { @@ -66,75 +186,64 @@ const Reports: FunctionComponent = () => { queryPaginationOptions, ); - const renderLines = () => { - const isRuntimeSort = isRuntimeFieldEnable() ?? false; - const dataColumns = { - name: { - label: 'Title', - width: '25%', - isSortable: true, - }, - report_types: { - label: 'Type', - width: '8%', - isSortable: true, - }, - createdBy: { - label: 'Author', - width: '12%', - isSortable: isRuntimeSort, - }, - creator: { - label: 'Creators', - width: '12%', - isSortable: isRuntimeSort, - }, - objectLabel: { - label: 'Labels', - width: '15%', - isSortable: false, - }, - published: { - label: 'Date', - width: '10%', - isSortable: true, - }, - x_opencti_workflow_id: { - label: 'Status', - width: '8%', - isSortable: true, - }, - objectMarking: { - label: 'Marking', - isSortable: isRuntimeSort, - width: '8%', - }, - }; - return ( - <> - ; + + const [commit] = useMutation(fieldPatch); + + const isRuntimeSort = isRuntimeFieldEnable() ?? false; + const dataColumns: DataTableProps['dataColumns'] = { + name: { + label: 'Title', + flexSize: 25, + isSortable: true, + render: (data) => ( + { + if (e.currentTarget.value !== data.name) { + commit({ variables: { id: data.id, input: [{ key: 'name', value: [e.currentTarget.value] }] } }); + } + }} + /> + ), + }, + report_types: {}, + createdBy: { + flexSize: 12, + isSortable: isRuntimeSort, + }, + creator: { + flexSize: 12, + isSortable: isRuntimeSort, + }, + objectLabel: { flexSize: 15 }, + published: {}, + x_opencti_workflow_id: { flexSize: 8 }, + objectMarking: { + isSortable: isRuntimeSort, + flexSize: 8, + }, + }; + return ( + <> + {queryRef && ( + storageHelpers.handleAddProperty('redirectionMode', value)} - filters={filters} - paginationOptions={queryPaginationOptions} - numberOfElements={numberOfElements} - iconExtension={true} + resolvePath={(data: ReportsLines_data$data) => data.reports?.edges?.map((n) => n?.node)} + storageKey={LOCAL_STORAGE_KEY} + initialValues={initialValues} + toolbarFilters={contextFilters} + preloadedPaginationProps={preloadedPaginationProps} + lineFragment={reportLineFragment} + filterExportContext={{ entity_type: 'Report' }} + redirectionModeEnabled availableFilterKeys={[ 'workflow_id', 'objectLabel', @@ -151,54 +260,12 @@ const Reports: FunctionComponent = () => { 'objects', 'name', ]} - > - {queryRef && ( - - {Array(20) - .fill(0) - .map((_, idx) => ( - - ))} - - } - > - - - - )} - - - ); - }; - return ( - - {renderLines()} + /> + )} - + ); }; diff --git a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportCreation.tsx b/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportCreation.tsx index 97c5a3423c485..77da2a6754c06 100644 --- a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportCreation.tsx +++ b/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportCreation.tsx @@ -51,7 +51,7 @@ export const reportCreationMutation = graphql` description entity_type parent_types - ...ReportLine_node + ...ReportsLine_node } } `; diff --git a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportLine.tsx b/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportLine.tsx deleted file mode 100644 index 42cb41c7bd1fc..0000000000000 --- a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportLine.tsx +++ /dev/null @@ -1,376 +0,0 @@ -import React, { FunctionComponent } from 'react'; -import { Link } from 'react-router-dom'; -import { createFragmentContainer, graphql } from 'react-relay'; -import ListItem from '@mui/material/ListItem'; -import ListItemIcon from '@mui/material/ListItemIcon'; -import ListItemText from '@mui/material/ListItemText'; -import { KeyboardArrowRightOutlined } from '@mui/icons-material'; -import Checkbox from '@mui/material/Checkbox'; -import Skeleton from '@mui/material/Skeleton'; -import Tooltip from '@mui/material/Tooltip'; -import makeStyles from '@mui/styles/makeStyles'; -import Chip from '@mui/material/Chip'; -import { useFormatter } from '../../../../components/i18n'; -import ItemStatus from '../../../../components/ItemStatus'; -import StixCoreObjectLabels from '../../common/stix_core_objects/StixCoreObjectLabels'; -import ItemMarkings from '../../../../components/ItemMarkings'; -import ItemIcon from '../../../../components/ItemIcon'; -import type { Theme } from '../../../../components/Theme'; -import { DataColumns } from '../../../../components/list_lines'; -import { ReportLine_node$data } from './__generated__/ReportLine_node.graphql'; -import { emptyFilled } from '../../../../utils/String'; -import { HandleAddFilter } from '../../../../utils/hooks/useLocalStorage'; - -const useStyles = makeStyles((theme) => ({ - item: { - paddingLeft: 10, - height: 50, - }, - itemIcon: { - color: theme.palette.primary.main, - }, - bodyItem: { - height: 20, - fontSize: 13, - float: 'left', - whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', - paddingRight: 10, - }, - goIcon: { - position: 'absolute', - right: -10, - }, - itemIconDisabled: { - color: theme.palette.grey?.[700], - }, - chipInList: { - fontSize: 12, - height: 20, - float: 'left', - width: 120, - }, -})); - -interface ReportLineComponentProps { - node: ReportLine_node$data; - dataColumns: DataColumns; - onLabelClick: HandleAddFilter; - selectedElements: Record; - deSelectedElements: Record; - onToggleEntity: ( - entity: ReportLine_node$data, - event?: React.SyntheticEvent - ) => void; - selectAll: boolean; - onToggleShiftEntity: ( - index: number, - entity: ReportLine_node$data, - event?: React.SyntheticEvent - ) => void; - index: number; - redirectionMode: string; -} - -const ReportLineComponent: FunctionComponent = ({ - node, - dataColumns, - onLabelClick, - onToggleEntity, - selectedElements, - deSelectedElements, - selectAll, - onToggleShiftEntity, - index, - redirectionMode, -}) => { - const classes = useStyles(); - const { fd, t_i18n } = useFormatter(); - return ( - - (event.shiftKey - ? onToggleShiftEntity(index, node, event) - : onToggleEntity(node, event)) - } - > - - - - - - - -
- {node.name} -
-
-
- -
-
- {emptyFilled(node.createdBy?.name)} -
-
- {emptyFilled( - (node.creators ?? []).map((c) => c?.name).join(', '), - )} -
-
- -
-
- {fd(node.published)} -
-
- -
-
- -
-
- } - /> - - - - - ); -}; - -export const ReportLine = createFragmentContainer(ReportLineComponent, { - node: graphql` - fragment ReportLine_node on Report { - id - entity_type - name - description - published - report_types - createdBy { - ... on Identity { - id - name - entity_type - } - } - objectMarking { - edges { - node { - id - definition_type - definition - x_opencti_order - x_opencti_color - } - } - } - objectLabel { - edges { - node { - id - value - color - } - } - } - creators { - id - name - } - status { - id - order - template { - name - color - } - } - workflowEnabled - created_at - } - `, -}); - -interface ReportLineDummyProps { - dataColumns: DataColumns; -} - -export const ReportLineDummy: FunctionComponent = ({ - dataColumns, -}) => { - const classes = useStyles(); - return ( - - - - - - - - -
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
- - } - /> - - - -
- ); -}; diff --git a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportsLines.tsx b/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportsLines.tsx deleted file mode 100644 index 5762609876b4d..0000000000000 --- a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportsLines.tsx +++ /dev/null @@ -1,151 +0,0 @@ -import React, { FunctionComponent } from 'react'; -import { graphql, PreloadedQuery } from 'react-relay'; -import ListLinesContent from '../../../../components/list_lines/ListLinesContent'; -import { ReportLine, ReportLineDummy } from './ReportLine'; -import usePreloadedPaginationFragment from '../../../../utils/hooks/usePreloadedPaginationFragment'; -import { ReportsLinesPaginationQuery, ReportsLinesPaginationQuery$variables } from './__generated__/ReportsLinesPaginationQuery.graphql'; -import { HandleAddFilter, UseLocalStorageHelpers } from '../../../../utils/hooks/useLocalStorage'; -import { DataColumns } from '../../../../components/list_lines'; -import { ReportsLines_data$key } from './__generated__/ReportsLines_data.graphql'; -import { ReportLine_node$data } from './__generated__/ReportLine_node.graphql'; - -const nbOfRowsToLoad = 50; - -export const reportsLinesQuery = graphql` - query ReportsLinesPaginationQuery( - $search: String - $count: Int! - $cursor: ID - $orderBy: ReportsOrdering - $orderMode: OrderingMode - $filters: FilterGroup - ) { - ...ReportsLines_data - @arguments( - search: $search - count: $count - cursor: $cursor - orderBy: $orderBy - orderMode: $orderMode - filters: $filters - ) - } -`; - -const reportsLineFragment = graphql` - fragment ReportsLines_data on Query - @argumentDefinitions( - search: { type: "String" } - count: { type: "Int", defaultValue: 25 } - cursor: { type: "ID" } - orderBy: { type: "ReportsOrdering", defaultValue: name } - orderMode: { type: "OrderingMode", defaultValue: asc } - filters: { type: "FilterGroup" } - ) - @refetchable(queryName: "ReportsLinesRefetchQuery") { - reports( - search: $search - first: $count - after: $cursor - orderBy: $orderBy - orderMode: $orderMode - filters: $filters - ) @connection(key: "Pagination_reports") { - edges { - node { - id - name - published - createdBy { - ... on Identity { - id - name - entity_type - } - } - objectMarking { - edges { - node { - id - definition_type - definition - x_opencti_order - x_opencti_color - } - } - } - ...ReportLine_node - } - } - pageInfo { - endCursor - hasNextPage - globalCount - } - } - } -`; - -interface ReportsLinesProps { - setNumberOfElements: UseLocalStorageHelpers['handleSetNumberOfElements']; - dataColumns: DataColumns; - paginationOptions: ReportsLinesPaginationQuery$variables; - queryRef: PreloadedQuery; - selectedElements: Record; - deSelectedElements: Record; - onToggleEntity: ( - entity: ReportLine_node$data, - event: React.SyntheticEvent - ) => void; - selectAll: boolean; - onLabelClick?: HandleAddFilter; - redirectionMode?: string; -} - -const ReportsLines: FunctionComponent = ({ - dataColumns, - onLabelClick, - onToggleEntity, - selectedElements, - deSelectedElements, - selectAll, - paginationOptions, - setNumberOfElements, - queryRef, - redirectionMode, -}) => { - const { data, hasMore, loadMore, isLoadingMore } = usePreloadedPaginationFragment< - ReportsLinesPaginationQuery, - ReportsLines_data$key - >({ - linesQuery: reportsLinesQuery, - linesFragment: reportsLineFragment, - queryRef, - nodePath: ['reports', 'pageInfo', 'globalCount'], - setNumberOfElements, - }); - - return ( - - ); -}; - -export default ReportsLines; diff --git a/opencti-platform/opencti-front/src/private/components/data/Entities.tsx b/opencti-platform/opencti-front/src/private/components/data/Entities.tsx index a4d5631bfbe5b..b04b907d2fb6e 100644 --- a/opencti-platform/opencti-front/src/private/components/data/Entities.tsx +++ b/opencti-platform/opencti-front/src/private/components/data/Entities.tsx @@ -3,9 +3,8 @@ import { EntitiesStixDomainObjectsLinesPaginationQuery, EntitiesStixDomainObjectsLinesPaginationQuery$variables, } from '@components/data/entities/__generated__/EntitiesStixDomainObjectsLinesPaginationQuery.graphql'; -import { graphql, useMutation } from 'react-relay'; -import { TextField } from '@mui/material'; import { EntitiesStixDomainObjectsLines_data$data } from '@components/data/entities/__generated__/EntitiesStixDomainObjectsLines_data.graphql'; +import { entitiesFragment } from '@components/data/entities/EntitiesStixDomainObjectLine'; import { entitiesStixDomainObjectsLinesFragment, entitiesStixDomainObjectsLinesQuery } from './entities/EntitiesStixDomainObjectsLines'; import useAuth from '../../../utils/hooks/useAuth'; import { usePaginationLocalStorage } from '../../../utils/hooks/useLocalStorage'; @@ -17,16 +16,6 @@ import { DataTableProps } from '../../../components/dataGrid/dataTableTypes'; const LOCAL_STORAGE_KEY = 'entities'; -const fieldPatch = graphql` - mutation EntitiesEditMutation($id: ID!, $input: [EditInput]!) { - stixDomainObjectEdit(id: $id) { - fieldPatch(input: $input) { - ...EntitiesStixDomainObjectLine_node - } - } - } -`; - const Entities = () => { const { platformModuleHelpers: { isRuntimeFieldEnable }, @@ -57,25 +46,11 @@ const Entities = () => { queryPaginationOptions, ); - const [commit] = useMutation(fieldPatch); - const isRuntimeSort = isRuntimeFieldEnable() ?? false; const dataColumns: DataTableProps['dataColumns'] = { entity_type: { flexSize: 12 }, - name: { - render: (data) => ( - { - if (e.currentTarget.value !== data.name) { - commit({ variables: { id: data.id, input: [{ key: 'name', value: [e.currentTarget.value] }] } }); - } - }} - /> - ), - }, + name: {}, createdBy: { isSortable: isRuntimeSort }, creator: { isSortable: isRuntimeSort }, objectLabel: {}, @@ -100,6 +75,7 @@ const Entities = () => { preloadedPaginationProps={preloadedPaginationProps} resolvePath={(data: EntitiesStixDomainObjectsLines_data$data) => data.stixDomainObjects?.edges?.map((n) => n?.node)} dataColumns={dataColumns} + lineFragment={entitiesFragment} toolbarFilters={contextFilters} filterExportContext={{ entity_type: 'Stix-Domain-Object' }} availableEntityTypes={['Stix-Domain-Object']} diff --git a/opencti-platform/opencti-front/src/utils/hooks/useLocalStorage.ts b/opencti-platform/opencti-front/src/utils/hooks/useLocalStorage.ts index 6ba31fe6db9b3..47ffca95236b5 100644 --- a/opencti-platform/opencti-front/src/utils/hooks/useLocalStorage.ts +++ b/opencti-platform/opencti-front/src/utils/hooks/useLocalStorage.ts @@ -65,7 +65,6 @@ const localStorageToPaginationOptions = ( ): PaginationOptions => { // Remove only display options, not query linked const localOptions = { ...props }; - delete localOptions.redirectionMode; delete localOptions.openExports; delete localOptions.selectAll; delete localOptions.redirectionMode; @@ -112,6 +111,7 @@ const buildParamsFromHistory = (params: LocalStorage) => { orderAsc: params.orderAsc, timeField: params.timeField, dashboard: params.dashboard, + redirectionMode: params.redirectionMode, types: params.types && params.types.length > 0 ? params.types.join(',') diff --git a/opencti-platform/opencti-front/yarn.lock b/opencti-platform/opencti-front/yarn.lock index 409a5c4c7131e..29045c8eef4d4 100644 --- a/opencti-platform/opencti-front/yarn.lock +++ b/opencti-platform/opencti-front/yarn.lock @@ -1686,7 +1686,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.6, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.23.8 resolution: "@babel/runtime@npm:7.23.8" dependencies: @@ -2204,66 +2204,33 @@ __metadata: languageName: node linkType: hard -"@date-io/core@npm:^2.15.0, @date-io/core@npm:^2.17.0": - version: 2.17.0 - resolution: "@date-io/core@npm:2.17.0" - checksum: 008dfc79eb54256805113d76feca82fe0b08a245ecbfb2d53809e6a129dc201f9dbd053c8ad63512203ab1a13ff7f76de0edc31829588ef507d53307974c29a8 - languageName: node - linkType: hard - -"@date-io/date-fns@npm:2.17.0, @date-io/date-fns@npm:^2.15.0": - version: 2.17.0 - resolution: "@date-io/date-fns@npm:2.17.0" - dependencies: - "@date-io/core": ^2.17.0 - peerDependencies: - date-fns: ^2.0.0 - peerDependenciesMeta: - date-fns: - optional: true - checksum: bfab634c985a98dd44fdfc5f982b0348da2886c9ad79a8d71fd7bfa05b740af7f5cf340508cd7ce51d67c141fb8766998c8efdf50653252c68ec078471cd76e6 - languageName: node - linkType: hard - -"@date-io/dayjs@npm:^2.15.0": - version: 2.17.0 - resolution: "@date-io/dayjs@npm:2.17.0" +"@date-fns/upgrade@npm:1.0.3": + version: 1.0.3 + resolution: "@date-fns/upgrade@npm:1.0.3" dependencies: - "@date-io/core": ^2.17.0 - peerDependencies: - dayjs: ^1.8.17 - peerDependenciesMeta: - dayjs: - optional: true - checksum: daf2b690362ba37d53dab9db01a554364bf90c2be177e1a4a0cb631ef1763e41459a18f99bc8ac2a2f3015aeaa9c016a3905829fa55593270b2ed83c2c4741f1 + date-fns: ^2.1 + checksum: 0e36ad6d90ce2db86087682a69ad8f3a5079402d3a1e4ed2e72ad7b6c7e5e03d3c1f165e9805610d049d9c2e879cdcb7131d53b1ab5a31e201e1bcdf3022e669 languageName: node linkType: hard -"@date-io/luxon@npm:^2.15.0": - version: 2.17.0 - resolution: "@date-io/luxon@npm:2.17.0" - dependencies: - "@date-io/core": ^2.17.0 - peerDependencies: - luxon: ^1.21.3 || ^2.x || ^3.x - peerDependenciesMeta: - luxon: - optional: true - checksum: 26a23640a15f0628f4d020a9ee78d3b73b774226b9d68afd5022a1e8ee041475dde86b13051aca8d290ad264bcbdefb811d0e68054d8153aa15fd0cd70ab77d4 +"@date-io/core@npm:^3.0.0": + version: 3.0.0 + resolution: "@date-io/core@npm:3.0.0" + checksum: 5fdecfb1c6bfe30864096c3ce3f9e73a359a6a12f34a5829504eea7a0327122e361a95d9501ad0eaaf02b2e45322913985d9f47e1c667f3c0a4f7d792c116884 languageName: node linkType: hard -"@date-io/moment@npm:^2.15.0": - version: 2.17.0 - resolution: "@date-io/moment@npm:2.17.0" +"@date-io/date-fns@npm:3.0.0": + version: 3.0.0 + resolution: "@date-io/date-fns@npm:3.0.0" dependencies: - "@date-io/core": ^2.17.0 + "@date-io/core": ^3.0.0 peerDependencies: - moment: ^2.24.0 + date-fns: ^3.2.0 peerDependenciesMeta: - moment: + date-fns: optional: true - checksum: 3009825c5c5fe78f2939b9de52a55272767c824e442afa3fd1897336636593cd5147b59263d778c0dad860d869f9abdfd51a25ccbd47e6f551c922b5cc4593ef + checksum: bf9c3bbcd5466d4e4d1847921c5b2e4e3b6166c0e27d601be292384ab7ba26fc0fa3934382b71a7c70d42e781955ac47280b2834d6a70d242618a044c4f098fb languageName: node linkType: hard @@ -2812,7 +2779,7 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.0.4, @floating-ui/react-dom@npm:^2.0.5": +"@floating-ui/react-dom@npm:^2.0.5": version: 2.0.6 resolution: "@floating-ui/react-dom@npm:2.0.6" dependencies: @@ -3275,29 +3242,7 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.30": - version: 5.0.0-beta.30 - resolution: "@mui/base@npm:5.0.0-beta.30" - dependencies: - "@babel/runtime": ^7.23.6 - "@floating-ui/react-dom": ^2.0.4 - "@mui/types": ^7.2.12 - "@mui/utils": ^5.15.3 - "@popperjs/core": ^2.11.8 - clsx: ^2.0.0 - prop-types: ^15.8.1 - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 2e2a42f47f1996469c2dd1f5301eba7c8532cf6d91b2ba53271da287cab1f18a44f23f00b552838691bc763f09f9820399bbbf4a89b5f7bc5ae55e61fd2b73c8 - languageName: node - linkType: hard - -"@mui/base@npm:5.0.0-beta.32": +"@mui/base@npm:5.0.0-beta.32, @mui/base@npm:^5.0.0-beta.22": version: 5.0.0-beta.32 resolution: "@mui/base@npm:5.0.0-beta.32" dependencies: @@ -3319,30 +3264,14 @@ __metadata: languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.15.3, @mui/core-downloads-tracker@npm:^5.15.5": +"@mui/core-downloads-tracker@npm:^5.15.5": version: 5.15.5 resolution: "@mui/core-downloads-tracker@npm:5.15.5" checksum: 4c9b1281ebe8d17d402e22f7f50c347c0b3918b1ed17af721f4de5ce282d90bc6d90fe9730595998b2bbb2f7ebe57fc55d4c858f31754fccdb606af472a59dc8 languageName: node linkType: hard -"@mui/icons-material@npm:5.15.3": - version: 5.15.3 - resolution: "@mui/icons-material@npm:5.15.3" - dependencies: - "@babel/runtime": ^7.23.6 - peerDependencies: - "@mui/material": ^5.0.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 8b6084e2ac285d13cbb1711a2577ba1f0493b12beb0f5d45da01a0fd2c99b5b69b9990ae2daf2d5bd3c751cd43815b573c51bae09397a496b5ba4aa074d9a91c - languageName: node - linkType: hard - -"@mui/icons-material@npm:^5.4.1": +"@mui/icons-material@npm:5.15.5, @mui/icons-material@npm:^5.4.1": version: 5.15.5 resolution: "@mui/icons-material@npm:5.15.5" dependencies: @@ -3387,40 +3316,7 @@ __metadata: languageName: node linkType: hard -"@mui/material@npm:5.15.3": - version: 5.15.3 - resolution: "@mui/material@npm:5.15.3" - dependencies: - "@babel/runtime": ^7.23.6 - "@mui/base": 5.0.0-beta.30 - "@mui/core-downloads-tracker": ^5.15.3 - "@mui/system": ^5.15.3 - "@mui/types": ^7.2.12 - "@mui/utils": ^5.15.3 - "@types/react-transition-group": ^4.4.10 - clsx: ^2.0.0 - csstype: ^3.1.2 - prop-types: ^15.8.1 - react-is: ^18.2.0 - react-transition-group: ^4.4.5 - peerDependencies: - "@emotion/react": ^11.5.0 - "@emotion/styled": ^11.3.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - "@types/react": - optional: true - checksum: 21a442341bc781318e6d539a88367e2f2be8d188aa91d68bc6505d1b3764fb0a1019458b91a62c850bc1547a52260ef37f071e7551865fd14b7630e124182410 - languageName: node - linkType: hard - -"@mui/material@npm:^5.4.1": +"@mui/material@npm:5.15.5, @mui/material@npm:^5.4.1": version: 5.15.5 resolution: "@mui/material@npm:5.15.5" dependencies: @@ -3453,7 +3349,7 @@ __metadata: languageName: node linkType: hard -"@mui/private-theming@npm:^5.15.3, @mui/private-theming@npm:^5.15.5": +"@mui/private-theming@npm:^5.15.5": version: 5.15.5 resolution: "@mui/private-theming@npm:5.15.5" dependencies: @@ -3491,16 +3387,16 @@ __metadata: languageName: node linkType: hard -"@mui/styles@npm:5.15.3": - version: 5.15.3 - resolution: "@mui/styles@npm:5.15.3" +"@mui/styles@npm:5.15.5": + version: 5.15.5 + resolution: "@mui/styles@npm:5.15.5" dependencies: - "@babel/runtime": ^7.23.6 + "@babel/runtime": ^7.23.8 "@emotion/hash": ^0.9.1 - "@mui/private-theming": ^5.15.3 - "@mui/types": ^7.2.12 - "@mui/utils": ^5.15.3 - clsx: ^2.0.0 + "@mui/private-theming": ^5.15.5 + "@mui/types": ^7.2.13 + "@mui/utils": ^5.15.5 + clsx: ^2.1.0 csstype: ^3.1.2 hoist-non-react-statics: ^3.3.2 jss: ^10.10.0 @@ -3518,11 +3414,11 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: d78766a9a8c57fc9883897f34cfd4e1f263fb0dac51c31545bb39bcef6327d7a83aa49e1e1a6a0af4b12876a9c4f1c7bff78df21abc3430688c4e7502a1cb49f + checksum: dc131c0e7763f7ac4fd96a1db3dd85abf59de5429a73f7cf9ed15d423fb9bb5883835c1951d36e8804da9ab2ed13d603ed349f12e7cd15885f8279d90d13511b languageName: node linkType: hard -"@mui/system@npm:^5.15.3, @mui/system@npm:^5.15.5, @mui/system@npm:^5.4.1": +"@mui/system@npm:^5.15.5, @mui/system@npm:^5.4.1": version: 5.15.5 resolution: "@mui/system@npm:5.15.5" dependencies: @@ -3550,7 +3446,7 @@ __metadata: languageName: node linkType: hard -"@mui/types@npm:^7.2.12, @mui/types@npm:^7.2.13": +"@mui/types@npm:^7.2.13": version: 7.2.13 resolution: "@mui/types@npm:7.2.13" peerDependencies: @@ -3562,25 +3458,7 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:5.15.3": - version: 5.15.3 - resolution: "@mui/utils@npm:5.15.3" - dependencies: - "@babel/runtime": ^7.23.6 - "@types/prop-types": ^15.7.11 - prop-types: ^15.8.1 - react-is: ^18.2.0 - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 2a5efd0fd9508c3dff9261b0a6f2801b47cc19dac04e9a79a55449162606a79a86e7e23e7d282f68843b1f8f860341549c893024c57f3380e2315de211e14e2a - languageName: node - linkType: hard - -"@mui/utils@npm:^5.10.3, @mui/utils@npm:^5.15.3, @mui/utils@npm:^5.15.5": +"@mui/utils@npm:5.15.5, @mui/utils@npm:^5.14.16, @mui/utils@npm:^5.15.5": version: 5.15.5 resolution: "@mui/utils@npm:5.15.5" dependencies: @@ -3598,33 +3476,31 @@ __metadata: languageName: node linkType: hard -"@mui/x-date-pickers@npm:5.0.20": - version: 5.0.20 - resolution: "@mui/x-date-pickers@npm:5.0.20" +"@mui/x-date-pickers@npm:6.19.0": + version: 6.19.0 + resolution: "@mui/x-date-pickers@npm:6.19.0" dependencies: - "@babel/runtime": ^7.18.9 - "@date-io/core": ^2.15.0 - "@date-io/date-fns": ^2.15.0 - "@date-io/dayjs": ^2.15.0 - "@date-io/luxon": ^2.15.0 - "@date-io/moment": ^2.15.0 - "@mui/utils": ^5.10.3 - "@types/react-transition-group": ^4.4.5 - clsx: ^1.2.1 - prop-types: ^15.7.2 + "@babel/runtime": ^7.23.2 + "@mui/base": ^5.0.0-beta.22 + "@mui/utils": ^5.14.16 + "@types/react-transition-group": ^4.4.8 + clsx: ^2.0.0 + prop-types: ^15.8.1 react-transition-group: ^4.4.5 - rifm: ^0.12.1 peerDependencies: "@emotion/react": ^11.9.0 "@emotion/styled": ^11.8.1 - "@mui/material": ^5.4.1 - "@mui/system": ^5.4.1 - date-fns: ^2.25.0 + "@mui/material": ^5.8.6 + "@mui/system": ^5.8.0 + date-fns: ^2.25.0 || ^3.2.0 + date-fns-jalali: ^2.13.0-0 dayjs: ^1.10.7 - luxon: ^1.28.0 || ^2.0.0 || ^3.0.0 - moment: ^2.29.1 - react: ^17.0.2 || ^18.0.0 - react-dom: ^17.0.2 || ^18.0.0 + luxon: ^3.0.2 + moment: ^2.29.4 + moment-hijri: ^2.1.2 + moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@emotion/react": optional: true @@ -3632,13 +3508,19 @@ __metadata: optional: true date-fns: optional: true + date-fns-jalali: + optional: true dayjs: optional: true luxon: optional: true moment: optional: true - checksum: c8537e6c0cee2659494c9f7250eb0ad35fb84bcd09f9cc0ae5c0ba2d4faaa3a87c598c97f0aa065aadb540384e4d7ac0cf1107f8ca94d7bf7a2d7f393adfd011 + moment-hijri: + optional: true + moment-jalaali: + optional: true + checksum: 65da961de3012c1453ce7589c836fac0808fdfe00aa90311d5e11b2a2197c2aa61930200fded61598e5ec86f6fef1c683951078a623e18ee5f4c129b5a760545 languageName: node linkType: hard @@ -5198,7 +5080,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": +"@types/node@npm:*, @types/node@npm:20.11.5, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": version: 20.11.5 resolution: "@types/node@npm:20.11.5" dependencies: @@ -5207,15 +5089,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:20.11.2": - version: 20.11.2 - resolution: "@types/node@npm:20.11.2" - dependencies: - undici-types: ~5.26.4 - checksum: 28ce6425cd1cc93aac12309c81b986a9fe1be8da6a877bc51ee890ea46174a104177d74c9b7a86907e54cc66917fdb57259b0c8456ec4cabb07faf174e790556 - languageName: node - linkType: hard - "@types/node@npm:^18.14.6": version: 18.19.8 resolution: "@types/node@npm:18.19.8" @@ -5352,7 +5225,7 @@ __metadata: languageName: node linkType: hard -"@types/react-transition-group@npm:^4.4.10, @types/react-transition-group@npm:^4.4.5": +"@types/react-transition-group@npm:^4.4.10, @types/react-transition-group@npm:^4.4.8": version: 4.4.10 resolution: "@types/react-transition-group@npm:4.4.10" dependencies: @@ -7558,7 +7431,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.0.4, clsx@npm:^1.1.1, clsx@npm:^1.2.1": +"clsx@npm:^1.0.4, clsx@npm:^1.1.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 @@ -15031,21 +14904,22 @@ __metadata: dependencies: "@analytics/google-analytics": 1.0.7 "@ckeditor/ckeditor5-react": 6.1.0 - "@date-io/date-fns": 2.17.0 + "@date-fns/upgrade": 1.0.3 + "@date-io/date-fns": 3.0.0 "@emotion/react": 11.11.3 "@emotion/styled": 11.11.0 - "@mui/icons-material": 5.15.3 + "@mui/icons-material": 5.15.5 "@mui/lab": 5.0.0-alpha.161 - "@mui/material": 5.15.3 - "@mui/styles": 5.15.3 - "@mui/utils": 5.15.3 - "@mui/x-date-pickers": 5.0.20 + "@mui/material": 5.15.5 + "@mui/styles": 5.15.5 + "@mui/utils": 5.15.5 + "@mui/x-date-pickers": 6.19.0 "@rjsf/core": 5.16.1 "@rjsf/mui": 5.16.1 "@rjsf/utils": 5.16.1 "@rollup/plugin-graphql": 2.0.4 "@testing-library/react": 14.1.2 - "@types/node": 20.11.2 + "@types/node": 20.11.5 "@types/qrcode": 1.5.5 "@types/ramda": 0.29.9 "@types/react": 18.2.48 @@ -15131,7 +15005,7 @@ __metadata: react-relay: 16.1.0 react-relay-network-modern: 6.2.2 react-router-dom: 5.3.4 - react-router-dom-v5-compat: 6.21.2 + react-router-dom-v5-compat: 6.21.3 react-syntax-highlighter: 15.5.0 react-test-renderer: 18.2.0 react-timeline-range-slider: 1.4.1 @@ -15154,7 +15028,7 @@ __metadata: unified: 11.0.4 use-analytics: 1.1.0 uuid: 9.0.1 - vite: 5.0.11 + vite: 5.0.12 vite-plugin-relay: 2.0.0 vite-plugin-static-copy: 1.0.0 vitest: 1.2.1 @@ -16870,17 +16744,17 @@ __metadata: languageName: node linkType: hard -"react-router-dom-v5-compat@npm:6.21.2": - version: 6.21.2 - resolution: "react-router-dom-v5-compat@npm:6.21.2" +"react-router-dom-v5-compat@npm:6.21.3": + version: 6.21.3 + resolution: "react-router-dom-v5-compat@npm:6.21.3" dependencies: history: ^5.3.0 - react-router: 6.21.2 + react-router: 6.21.3 peerDependencies: react: ">=16.8" react-dom: ">=16.8" react-router-dom: 4 || 5 - checksum: 02f3159e60a8a34db7a8eeab32677d55d295bc5814abd475dd5186a558d3e0ce275c5dbb7ea910e6e873db4376e4d48c520142e4d63f71319a4a96f99e4834c4 + checksum: f93084c3d421b1dbdd1e15ec9baacd51b58cfd9dc2cd38646b0d4cac856cb7beb8e7651259fbbb7aaa1f1c5f1013b1863a2ad366bb79031a1e382a53a4afc240 languageName: node linkType: hard @@ -16920,14 +16794,14 @@ __metadata: languageName: node linkType: hard -"react-router@npm:6.21.2": - version: 6.21.2 - resolution: "react-router@npm:6.21.2" +"react-router@npm:6.21.3": + version: 6.21.3 + resolution: "react-router@npm:6.21.3" dependencies: "@remix-run/router": 1.14.2 peerDependencies: react: ">=16.8" - checksum: 8c38a4914892d5b8052bc5c244af95109affd8b74bffa16f9ea7856dc0e992dd8539b19d2618721cd7ef091a585f394fac9d05ab7a98cf3ca6aeb7519b7bce0e + checksum: 7e6297d5b67ae07d2e8564e036dbb15ebd706b41c22238940f47eee9b21ffb76d41336803c3b33435f1ebe210226577e32df3838bcbf2cd7c813fa357c0a4fac languageName: node linkType: hard @@ -17706,15 +17580,6 @@ __metadata: languageName: node linkType: hard -"rifm@npm:^0.12.1": - version: 0.12.1 - resolution: "rifm@npm:0.12.1" - peerDependencies: - react: ">=16.8" - checksum: 7f11621b6a14885bdee0b49c21174627272a5f683f74aaf8444570dae319f86de38d2af55c17e08af1ebb837bf956894971cceadeaca890e4c9cd1d46f02a385 - languageName: node - linkType: hard - "rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -20362,7 +20227,47 @@ __metadata: languageName: node linkType: hard -"vite@npm:5.0.11, vite@npm:^5.0.0": +"vite@npm:5.0.12": + version: 5.0.12 + resolution: "vite@npm:5.0.12" + dependencies: + esbuild: ^0.19.3 + fsevents: ~2.3.3 + postcss: ^8.4.32 + rollup: ^4.2.0 + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: b97b6f1c204d9091d0973626827a6e9d8e8b1959ebd0877b6f76e7068e1e7adf9ecd3b1cc382cbab9d421e3eeca5e1a95f27f9c1734439b229f5a58ef2052fa4 + languageName: node + linkType: hard + +"vite@npm:^5.0.0": version: 5.0.11 resolution: "vite@npm:5.0.11" dependencies: