Projects STRLCPY opencti Commits 19873350
🤬
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■ ■
    opencti-platform/opencti-front/src/private/components/common/containers/ContainerStixCyberObservables.js
    1  -import React, { Component } from 'react';
    2  -import * as PropTypes from 'prop-types';
    3  -import { append, compose, filter, propOr } from 'ramda';
    4  -import { graphql, createFragmentContainer } from 'react-relay';
    5  -import withStyles from '@mui/styles/withStyles';
    6  -import * as R from 'ramda';
    7  -import { QueryRenderer } from '../../../../relay/environment';
    8  -import ListLines from '../../../../components/list_lines/ListLines';
    9  -import ContainerStixCyberObservablesLines, {
    10  - containerStixCyberObservablesLinesQuery,
    11  -} from './ContainerStixCyberObservablesLines';
    12  -import {
    13  - buildViewParamsFromUrlAndStorage,
    14  - convertFilters,
    15  - saveViewParameters,
    16  -} from '../../../../utils/ListParameters';
    17  -import inject18n from '../../../../components/i18n';
    18  -import StixCyberObservablesRightBar from '../../observations/stix_cyber_observables/StixCyberObservablesRightBar';
    19  -import ToolBar from '../../data/ToolBar';
    20  -import { defaultValue } from '../../../../utils/Graph';
    21  -import { UserContext } from '../../../../utils/Security';
    22  -import { isUniqFilter } from '../lists/Filters';
    23  - 
    24  -const styles = () => ({
    25  - container: {
    26  - margin: '20px 0 0 0',
    27  - padding: '0 260px 90px 0',
    28  - },
    29  -});
    30  - 
    31  -class ContainerStixCyberObservablesComponent extends Component {
    32  - constructor(props) {
    33  - super(props);
    34  - const params = buildViewParamsFromUrlAndStorage(
    35  - props.history,
    36  - props.location,
    37  - `view-container-${props.container.id}-stix-observables`,
    38  - );
    39  - this.state = {
    40  - sortBy: propOr('created_at', 'sortBy', params),
    41  - orderAsc: propOr(false, 'orderAsc', params),
    42  - searchTerm: propOr('', 'searchTerm', params),
    43  - filters: R.propOr({}, 'filters', params),
    44  - types: propOr([], 'types', params),
    45  - openExports: false,
    46  - numberOfElements: { number: 0, symbol: '' },
    47  - selectedElements: null,
    48  - deSelectedElements: null,
    49  - selectAll: false,
    50  - };
    51  - }
    52  - 
    53  - saveView() {
    54  - saveViewParameters(
    55  - this.props.history,
    56  - this.props.location,
    57  - `view-container-${this.props.container.id}-stix-observables`,
    58  - this.state,
    59  - );
    60  - }
    61  - 
    62  - handleSearch(value) {
    63  - this.setState({ searchTerm: value }, () => this.saveView());
    64  - }
    65  - 
    66  - handleSort(field, orderAsc) {
    67  - this.setState({ sortBy: field, orderAsc }, () => this.saveView());
    68  - }
    69  - 
    70  - handleToggleExports() {
    71  - this.setState({ openExports: !this.state.openExports });
    72  - }
    73  - 
    74  - handleToggle(type) {
    75  - if (this.state.types.includes(type)) {
    76  - this.setState(
    77  - { types: filter((t) => t !== type, this.state.types) },
    78  - () => this.saveView(),
    79  - );
    80  - } else {
    81  - this.setState({ types: append(type, this.state.types) }, () => this.saveView());
    82  - }
    83  - }
    84  - 
    85  - handleClear() {
    86  - this.setState({ types: [] }, () => this.saveView());
    87  - }
    88  - 
    89  - handleToggleSelectEntity(entity, event) {
    90  - event.stopPropagation();
    91  - event.preventDefault();
    92  - const { selectedElements, deSelectedElements, selectAll } = this.state;
    93  - if (entity.id in (selectedElements || {})) {
    94  - const newSelectedElements = R.omit([entity.id], selectedElements);
    95  - this.setState({
    96  - selectAll: false,
    97  - selectedElements: newSelectedElements,
    98  - });
    99  - } else if (selectAll && entity.id in (deSelectedElements || {})) {
    100  - const newDeSelectedElements = R.omit([entity.id], deSelectedElements);
    101  - this.setState({
    102  - deSelectedElements: newDeSelectedElements,
    103  - });
    104  - } else if (selectAll) {
    105  - const newDeSelectedElements = R.assoc(
    106  - entity.id,
    107  - entity,
    108  - deSelectedElements || {},
    109  - );
    110  - this.setState({
    111  - deSelectedElements: newDeSelectedElements,
    112  - });
    113  - } else {
    114  - const newSelectedElements = R.assoc(
    115  - entity.id,
    116  - entity,
    117  - selectedElements || {},
    118  - );
    119  - this.setState({
    120  - selectAll: false,
    121  - selectedElements: newSelectedElements,
    122  - });
    123  - }
    124  - }
    125  - 
    126  - handleToggleSelectAll() {
    127  - this.setState({
    128  - selectAll: !this.state.selectAll,
    129  - selectedElements: null,
    130  - deSelectedElements: null,
    131  - });
    132  - }
    133  - 
    134  - handleClearSelectedElements() {
    135  - this.setState({
    136  - selectAll: false,
    137  - selectedElements: null,
    138  - deSelectedElements: null,
    139  - });
    140  - }
    141  - 
    142  - handleAddFilter(key, id, value, event = null) {
    143  - if (event) {
    144  - event.stopPropagation();
    145  - event.preventDefault();
    146  - }
    147  - if (this.state.filters[key] && this.state.filters[key].length > 0) {
    148  - this.setState(
    149  - {
    150  - filters: R.assoc(
    151  - key,
    152  - isUniqFilter(key)
    153  - ? [{ id, value }]
    154  - : R.uniqBy(R.prop('id'), [
    155  - { id, value },
    156  - ...this.state.filters[key],
    157  - ]),
    158  - this.state.filters,
    159  - ),
    160  - },
    161  - () => this.saveView(),
    162  - );
    163  - } else {
    164  - this.setState(
    165  - {
    166  - filters: R.assoc(key, [{ id, value }], this.state.filters),
    167  - },
    168  - () => this.saveView(),
    169  - );
    170  - }
    171  - }
    172  - 
    173  - handleRemoveFilter(key) {
    174  - this.setState({ filters: R.dissoc(key, this.state.filters) }, () => this.saveView());
    175  - }
    176  - 
    177  - setNumberOfElements(numberOfElements) {
    178  - this.setState({ numberOfElements });
    179  - }
    180  - 
    181  - // eslint-disable-next-line class-methods-use-this
    182  - buildColumns(helper) {
    183  - const isRuntimeSort = helper.isRuntimeFieldEnable();
    184  - return {
    185  - entity_type: {
    186  - label: 'Type',
    187  - width: '15%',
    188  - isSortable: true,
    189  - },
    190  - observable_value: {
    191  - label: 'Value',
    192  - width: '30%',
    193  - isSortable: isRuntimeSort,
    194  - },
    195  - objectLabel: {
    196  - label: 'Labels',
    197  - width: '20%',
    198  - isSortable: false,
    199  - },
    200  - createdBy: {
    201  - label: 'Creator',
    202  - width: '15%',
    203  - isSortable: isRuntimeSort,
    204  - },
    205  - created_at: {
    206  - label: 'Creation date',
    207  - width: '10%',
    208  - isSortable: true,
    209  - },
    210  - objectMarking: {
    211  - label: 'Marking',
    212  - isSortable: isRuntimeSort,
    213  - },
    214  - };
    215  - }
    216  - 
    217  - render() {
    218  - const { container, classes } = this.props;
    219  - const {
    220  - sortBy,
    221  - orderAsc,
    222  - searchTerm,
    223  - openExports,
    224  - numberOfElements,
    225  - selectedElements,
    226  - deSelectedElements,
    227  - selectAll,
    228  - types,
    229  - filters,
    230  - } = this.state;
    231  - const finalFilters = convertFilters(filters);
    232  - const paginationOptions = {
    233  - types: types.length > 0 ? types : ['Stix-Cyber-Observable'],
    234  - search: searchTerm,
    235  - filters: finalFilters,
    236  - orderBy: sortBy,
    237  - orderMode: orderAsc ? 'asc' : 'desc',
    238  - };
    239  - const exportFilters = {
    240  - containedBy: [{ id: container.id, value: defaultValue(container) }],
    241  - entity_type:
    242  - types.length > 0 ? R.map((n) => ({ id: n, value: n }), types) : [],
    243  - ...filters,
    244  - };
    245  - const exportFinalFilters = convertFilters(exportFilters);
    246  - const exportPaginationOptions = {
    247  - filters: exportFinalFilters,
    248  - orderBy: sortBy,
    249  - orderMode: orderAsc ? 'asc' : 'desc',
    250  - search: searchTerm,
    251  - };
    252  - let numberOfSelectedElements = Object.keys(selectedElements || {}).length;
    253  - if (selectAll) {
    254  - numberOfSelectedElements = numberOfElements.original;
    255  - }
    256  - const backgroundTaskFilters = {
    257  - containedBy: [{ id: container.id, value: defaultValue(container) }],
    258  - entity_type:
    259  - types.length > 0
    260  - ? R.map((n) => ({ id: n, value: n }), types)
    261  - : [{ id: 'Stix-Cyber-Observable', value: 'Stix-Cyber-Observable' }],
    262  - ...filters,
    263  - };
    264  - return (
    265  - <UserContext.Consumer>
    266  - {({ helper }) => (
    267  - <div className={classes.container}>
    268  - <ListLines
    269  - sortBy={sortBy}
    270  - orderAsc={orderAsc}
    271  - dataColumns={this.buildColumns(helper)}
    272  - handleSort={this.handleSort.bind(this)}
    273  - handleSearch={this.handleSearch.bind(this)}
    274  - secondaryAction={true}
    275  - numberOfElements={numberOfElements}
    276  - handleAddFilter={this.handleAddFilter.bind(this)}
    277  - handleRemoveFilter={this.handleRemoveFilter.bind(this)}
    278  - handleToggleSelectAll={this.handleToggleSelectAll.bind(this)}
    279  - selectAll={selectAll}
    280  - iconExtension={true}
    281  - handleToggleExports={this.handleToggleExports.bind(this)}
    282  - exportEntityType="Stix-Cyber-Observable"
    283  - openExports={openExports}
    284  - exportContext={`of-container-${container.id}`}
    285  - filters={filters}
    286  - availableFilterKeys={[
    287  - 'labelledBy',
    288  - 'markedBy',
    289  - 'created_at_start_date',
    290  - 'created_at_end_date',
    291  - 'x_opencti_score',
    292  - 'createdBy',
    293  - 'sightedBy',
    294  - ]}
    295  - paginationOptions={exportPaginationOptions}
    296  - >
    297  - <QueryRenderer
    298  - query={containerStixCyberObservablesLinesQuery}
    299  - variables={{
    300  - id: container.id,
    301  - count: 25,
    302  - ...paginationOptions,
    303  - }}
    304  - render={({ props }) => (
    305  - <ContainerStixCyberObservablesLines
    306  - container={props ? props.container : null}
    307  - paginationOptions={paginationOptions}
    308  - dataColumns={this.buildColumns(helper)}
    309  - initialLoading={props === null}
    310  - setNumberOfElements={this.setNumberOfElements.bind(this)}
    311  - onTypesChange={this.handleToggle.bind(this)}
    312  - openExports={openExports}
    313  - selectedElements={selectedElements}
    314  - deSelectedElements={deSelectedElements}
    315  - onToggleEntity={this.handleToggleSelectEntity.bind(this)}
    316  - selectAll={selectAll}
    317  - />
    318  - )}
    319  - />
    320  - </ListLines>
    321  - <ToolBar
    322  - selectedElements={selectedElements}
    323  - deSelectedElements={deSelectedElements}
    324  - numberOfSelectedElements={numberOfSelectedElements}
    325  - selectAll={selectAll}
    326  - search={searchTerm}
    327  - filters={backgroundTaskFilters}
    328  - handleClearSelectedElements={this.handleClearSelectedElements.bind(
    329  - this,
    330  - )}
    331  - variant="large"
    332  - container={container}
    333  - />
    334  - <StixCyberObservablesRightBar
    335  - types={types}
    336  - handleToggle={this.handleToggle.bind(this)}
    337  - handleClear={this.handleClear.bind(this)}
    338  - openExports={openExports}
    339  - />
    340  - </div>
    341  - )}
    342  - </UserContext.Consumer>
    343  - );
    344  - }
    345  -}
    346  - 
    347  -ContainerStixCyberObservablesComponent.propTypes = {
    348  - container: PropTypes.object,
    349  - classes: PropTypes.object,
    350  - t: PropTypes.func,
    351  - fd: PropTypes.func,
    352  - history: PropTypes.object,
    353  -};
    354  - 
    355  -const ContainerStixCyberObservables = createFragmentContainer(
    356  - ContainerStixCyberObservablesComponent,
    357  - {
    358  - container: graphql`
    359  - fragment ContainerStixCyberObservables_container on Container {
    360  - id
    361  - ... on Report {
    362  - name
    363  - }
    364  - ... on Grouping {
    365  - name
    366  - }
    367  - ... on Note {
    368  - attribute_abstract
    369  - content
    370  - }
    371  - ... on Opinion {
    372  - opinion
    373  - }
    374  - ... on ObservedData {
    375  - name
    376  - first_observed
    377  - last_observed
    378  - }
    379  - ...ContainerHeader_container
    380  - }
    381  - `,
    382  - },
    383  -);
    384  - 
    385  -export default compose(
    386  - inject18n,
    387  - withStyles(styles),
    388  -)(ContainerStixCyberObservables);
    389  - 
  • ■ ■ ■ ■ ■ ■
    opencti-platform/opencti-front/src/private/components/common/containers/ContainerStixCyberObservables.tsx
     1 +import React, { FunctionComponent, useState } from 'react';
     2 +import { append, filter, propOr } from 'ramda';
     3 +import { graphql, createFragmentContainer } from 'react-relay';
     4 +import * as R from 'ramda';
     5 +import makeStyles from '@mui/styles/makeStyles';
     6 +import { QueryRenderer } from '../../../../relay/environment';
     7 +import ListLines from '../../../../components/list_lines/ListLines';
     8 +import ContainerStixCyberObservablesLines, {
     9 + containerStixCyberObservablesLinesQuery,
     10 +} from './ContainerStixCyberObservablesLines';
     11 +import {
     12 + buildViewParamsFromUrlAndStorage,
     13 + convertFilters, saveViewParameters,
     14 +} from '../../../../utils/ListParameters';
     15 +import StixCyberObservablesRightBar from '../../observations/stix_cyber_observables/StixCyberObservablesRightBar';
     16 +import ToolBar from '../../data/ToolBar';
     17 +import { defaultValue } from '../../../../utils/Graph';
     18 +import { UserContext } from '../../../../utils/Security';
     19 +import useLocalStorage from '../../../../utils/hooks/useLocalStorage';
     20 +import { isUniqFilter } from '../lists/Filters';
     21 +import { Theme } from '../../../../components/Theme';
     22 +import { Filters } from '../../../../components/list_lines';
     23 +import { ModuleHelper } from '../../../../utils/platformModulesHelper';
     24 +import {
     25 + ContainerStixCyberObservablesLinesQuery$data,
     26 +} from './__generated__/ContainerStixCyberObservablesLinesQuery.graphql';
     27 +import {
     28 + StixCyberObservableLine_node$data,
     29 +} from '../../observations/stix_cyber_observables/__generated__/StixCyberObservableLine_node.graphql';
     30 + 
     31 +const useStyles = makeStyles<Theme>(() => ({
     32 + container: {
     33 + margin: '20px 0 0 0',
     34 + padding: '0 260px 90px 0',
     35 + },
     36 +}));
     37 + 
     38 +interface ContainerStixCyberObservablesComponentProps {
     39 + container: HTMLElement,
     40 + history: History,
     41 + location: Location,
     42 +}
     43 + 
     44 +const LOCAL_STORAGE_KEY = 'view-container-stix-cyber-observables';
     45 + 
     46 +const ContainerStixCyberObservablesComponent: FunctionComponent<ContainerStixCyberObservablesComponentProps> = ({ container, history, location }) => {
     47 + const classes = useStyles();
     48 + 
     49 + const params = buildViewParamsFromUrlAndStorage(
     50 + history,
     51 + location,
     52 + `view-container-${container.id}-stix-observables`,
     53 + );
     54 + 
     55 + const [viewStorage, setViewStorage] = useLocalStorage(LOCAL_STORAGE_KEY, {
     56 + numberOfElements: { number: 0, symbol: '', original: 0 },
     57 + filters: R.propOr({}, 'filters', params) as Filters,
     58 + searchTerm: propOr('', 'searchTerm', params),
     59 + sortBy: propOr('created_at', 'sortBy', params),
     60 + orderAsc: propOr(false, 'orderAsc', params),
     61 + openExports: false,
     62 + });
     63 + const [types, setTypes] = useState<string[]>(propOr([], 'types', params));
     64 + const [selectedElements, setSelectedElements] = useState<Record<string, StixCyberObservableLine_node$data>>({});
     65 + const [deSelectedElements, setDeSelectedElements] = useState<Record<string, StixCyberObservableLine_node$data>>({});
     66 + const [selectAll, setSelectAll] = useState<boolean>(false);
     67 + 
     68 + const { numberOfElements, filters, searchTerm, sortBy, orderAsc, openExports } = viewStorage;
     69 + 
     70 + const finalFilters = convertFilters(filters);
     71 + const paginationOptions = {
     72 + types: types.length > 0 ? types : ['Stix-Cyber-Observable'],
     73 + search: searchTerm,
     74 + filters: finalFilters,
     75 + orderBy: sortBy,
     76 + orderMode: orderAsc ? 'asc' : 'desc',
     77 + };
     78 + const exportFilters = {
     79 + containedBy: [{ id: container.id, value: defaultValue(container) }],
     80 + entity_type:
     81 + types.length > 0 ? R.map((n) => ({ id: n, value: n }), types) : [],
     82 + ...filters,
     83 + };
     84 + const exportFinalFilters = convertFilters(exportFilters);
     85 + const exportPaginationOptions = {
     86 + filters: exportFinalFilters,
     87 + orderBy: sortBy,
     88 + orderMode: orderAsc ? 'asc' : 'desc',
     89 + search: searchTerm,
     90 + };
     91 + let numberOfSelectedElements = Object.keys(selectedElements || {}).length;
     92 + if (selectAll) {
     93 + numberOfSelectedElements = numberOfElements.original;
     94 + }
     95 + const backgroundTaskFilters = {
     96 + containedBy: [{ id: container.id, value: defaultValue(container) }],
     97 + entity_type:
     98 + types.length > 0
     99 + ? R.map((n) => ({ id: n, value: n }), types)
     100 + : [{ id: 'Stix-Cyber-Observable', value: 'Stix-Cyber-Observable' }],
     101 + ...filters,
     102 + };
     103 + 
     104 + const saveView = () => {
     105 + saveViewParameters(
     106 + history,
     107 + location,
     108 + `view-container-${container.id}-stix-observables`,
     109 + viewStorage,
     110 + );
     111 + };
     112 + 
     113 + const handleSearch = (value: string) => {
     114 + setViewStorage((c) => ({ ...c, searchTerm: value }));
     115 + saveView();
     116 + };
     117 + 
     118 + const handleSort = (field: string, ordA: boolean) => {
     119 + setViewStorage((c) => ({ ...c, sortBy: field, orderAsc: ordA }));
     120 + saveView();
     121 + };
     122 + 
     123 + const handleToggleExports = () => {
     124 + setViewStorage((c) => ({ ...c, openExports: !openExports }));
     125 + };
     126 + 
     127 + const handleToggle = (type: string) => {
     128 + if (types.includes(type)) {
     129 + setTypes(filter((x) => x !== type, types));
     130 + saveView();
     131 + } else {
     132 + setTypes(append(type, types));
     133 + saveView();
     134 + }
     135 + };
     136 + 
     137 + const handleClear = () => {
     138 + setTypes([]);
     139 + saveView();
     140 + };
     141 + 
     142 + const handleToggleSelectEntity = (entity: StixCyberObservableLine_node$data, event: React.SyntheticEvent) => {
     143 + event.stopPropagation();
     144 + event.preventDefault();
     145 + if (entity.id in (selectedElements)) {
     146 + const newSelectedElements = R.omit([entity.id], selectedElements);
     147 + setSelectAll(false);
     148 + setSelectedElements(newSelectedElements);
     149 + } else if (selectAll && entity.id in (deSelectedElements)) {
     150 + const newDeSelectedElements = R.omit([entity.id], deSelectedElements);
     151 + setDeSelectedElements(newDeSelectedElements);
     152 + } else if (selectAll) {
     153 + const newDeSelectedElements = R.assoc(
     154 + entity.id,
     155 + entity,
     156 + deSelectedElements,
     157 + );
     158 + setDeSelectedElements(newDeSelectedElements);
     159 + } else {
     160 + const newSelectedElements = R.assoc(
     161 + entity.id,
     162 + entity,
     163 + selectedElements,
     164 + );
     165 + setSelectAll(false);
     166 + setSelectedElements(newSelectedElements);
     167 + }
     168 + };
     169 + 
     170 + const handleToggleSelectAll = () => {
     171 + setSelectAll(!selectAll);
     172 + setSelectedElements({});
     173 + setDeSelectedElements({});
     174 + };
     175 + 
     176 + const handleClearSelectedElements = () => {
     177 + setSelectAll(false);
     178 + setSelectedElements({});
     179 + setDeSelectedElements({});
     180 + };
     181 + 
     182 + const handleAddFilter = (key: string, id: string, value: string, event: React.SyntheticEvent | null = null) => {
     183 + if (event) {
     184 + event.stopPropagation();
     185 + event.preventDefault();
     186 + }
     187 + if (filters[key] && filters[key].length > 0) {
     188 + setViewStorage((c) => ({ ...c,
     189 + filters: R.assoc(
     190 + key,
     191 + isUniqFilter(key)
     192 + ? [{ id, value }]
     193 + : R.uniqBy(R.prop('id'), [
     194 + { id, value },
     195 + ...filters[key],
     196 + ]),
     197 + filters,
     198 + ),
     199 + }));
     200 + saveView();
     201 + } else {
     202 + setViewStorage((c) => ({ ...c,
     203 + filters: R.assoc(key, [{ id, value }], filters),
     204 + }));
     205 + saveView();
     206 + }
     207 + };
     208 + 
     209 + const handleRemoveFilter = (key: string) => {
     210 + setViewStorage((c) => ({ ...c,
     211 + filters: R.dissoc(key, filters),
     212 + }));
     213 + saveView();
     214 + };
     215 + 
     216 + const setNumberOfElements = (num: number) => {
     217 + setNumberOfElements(num);
     218 + };
     219 + 
     220 + // eslint-disable-next-line class-methods-use-this
     221 + const buildColumns = (helper: ModuleHelper | undefined) => {
     222 + const isRuntimeSort = helper?.isRuntimeFieldEnable('RUNTIME_SORTING');
     223 + return {
     224 + entity_type: {
     225 + label: 'Type',
     226 + width: '15%',
     227 + isSortable: true,
     228 + },
     229 + observable_value: {
     230 + label: 'Value',
     231 + width: '30%',
     232 + isSortable: isRuntimeSort,
     233 + },
     234 + objectLabel: {
     235 + label: 'Labels',
     236 + width: '20%',
     237 + isSortable: false,
     238 + },
     239 + createdBy: {
     240 + label: 'Creator',
     241 + width: '15%',
     242 + isSortable: isRuntimeSort,
     243 + },
     244 + created_at: {
     245 + label: 'Creation date',
     246 + width: '10%',
     247 + isSortable: true,
     248 + },
     249 + objectMarking: {
     250 + label: 'Marking',
     251 + isSortable: isRuntimeSort,
     252 + },
     253 + };
     254 + };
     255 + 
     256 + return (
     257 + <UserContext.Consumer>
     258 + {({ helper }) => (
     259 + <div className={classes.container}>
     260 + <ListLines
     261 + sortBy={sortBy}
     262 + orderAsc={orderAsc}
     263 + dataColumns={buildColumns(helper)}
     264 + handleSort={handleSort}
     265 + handleSearch={handleSearch.bind}
     266 + secondaryAction={true}
     267 + numberOfElements={numberOfElements}
     268 + handleAddFilter={handleAddFilter}
     269 + handleRemoveFilter={handleRemoveFilter}
     270 + handleToggleSelectAll={handleToggleSelectAll}
     271 + selectAll={selectAll}
     272 + iconExtension={true}
     273 + handleToggleExports={handleToggleExports}
     274 + exportEntityType="Stix-Cyber-Observable"
     275 + openExports={openExports}
     276 + exportContext={`of-container-${container.id}`}
     277 + filters={filters}
     278 + availableFilterKeys={[
     279 + 'labelledBy',
     280 + 'markedBy',
     281 + 'created_at_start_date',
     282 + 'created_at_end_date',
     283 + 'x_opencti_score',
     284 + 'createdBy',
     285 + 'sightedBy',
     286 + ]}
     287 + paginationOptions={exportPaginationOptions}
     288 + >
     289 + <QueryRenderer
     290 + query={containerStixCyberObservablesLinesQuery}
     291 + variables={{
     292 + id: container.id,
     293 + count: 25,
     294 + ...paginationOptions,
     295 + }}
     296 + render={({ props }: { props: ContainerStixCyberObservablesLinesQuery$data }) => (
     297 + <ContainerStixCyberObservablesLines
     298 + container={props ? props.container : null}
     299 + paginationOptions={paginationOptions}
     300 + dataColumns={buildColumns(helper)}
     301 + initialLoading={props === null}
     302 + setNumberOfElements={setNumberOfElements}
     303 + onTypesChange={handleToggle}
     304 + openExports={openExports}
     305 + selectedElements={selectedElements}
     306 + deSelectedElements={deSelectedElements}
     307 + onToggleEntity={handleToggleSelectEntity}
     308 + selectAll={selectAll}
     309 + />
     310 + )}
     311 + />
     312 + </ListLines>
     313 + <ToolBar
     314 + selectedElements={selectedElements}
     315 + deSelectedElements={deSelectedElements}
     316 + numberOfSelectedElements={numberOfSelectedElements}
     317 + selectAll={selectAll}
     318 + search={searchTerm}
     319 + filters={backgroundTaskFilters}
     320 + handleClearSelectedElements={handleClearSelectedElements}
     321 + variant="large"
     322 + container={container}
     323 + />
     324 + <StixCyberObservablesRightBar
     325 + types={types}
     326 + handleToggle={handleToggle}
     327 + handleClear={handleClear}
     328 + openExports={openExports}
     329 + />
     330 + </div>
     331 + )}
     332 + </UserContext.Consumer>
     333 + );
     334 +};
     335 + 
     336 +const ContainerStixCyberObservables = createFragmentContainer(
     337 + ContainerStixCyberObservablesComponent,
     338 + {
     339 + container: graphql`
     340 + fragment ContainerStixCyberObservables_container on Container {
     341 + id
     342 + ... on Report {
     343 + name
     344 + }
     345 + ... on Grouping {
     346 + name
     347 + }
     348 + ... on Note {
     349 + attribute_abstract
     350 + content
     351 + }
     352 + ... on Opinion {
     353 + opinion
     354 + }
     355 + ... on ObservedData {
     356 + name
     357 + first_observed
     358 + last_observed
     359 + }
     360 + ...ContainerHeader_container
     361 + }
     362 + `,
     363 + },
     364 +);
     365 + 
     366 +export default ContainerStixCyberObservables;
     367 + 
  • ■ ■ ■ ■
    opencti-platform/opencti-front/src/utils/hooks/useLocalStorage.ts
    skipped 2 lines
    3 3  import { Filters, OrderMode, PaginationOptions } from '../../components/list_lines';
    4 4   
    5 5  export interface LocalStorage {
    6  - numberOfElements?: { number: number, symbol: string },
     6 + numberOfElements?: { number: number, symbol: string, original?: number },
    7 7   filters?: Filters,
    8 8   searchTerm?: string,
    9 9   sortBy?: string,
    skipped 64 lines
Please wait...
Page is in error, reload to recover