@cccsaurora/howler-ui 2.17.0-dev.501 → 2.17.0-dev.508

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/api/index.d.ts +2 -0
  2. package/api/index.js +4 -2
  3. package/api/search/case.d.ts +4 -0
  4. package/api/search/case.js +8 -0
  5. package/api/search/index.d.ts +2 -1
  6. package/api/search/index.js +2 -1
  7. package/api/v2/case/index.d.ts +6 -0
  8. package/api/v2/case/index.js +18 -0
  9. package/api/v2/index.d.ts +4 -0
  10. package/api/v2/index.js +6 -0
  11. package/api/v2/search/index.d.ts +4 -0
  12. package/api/v2/search/index.js +16 -0
  13. package/commons/components/leftnav/LeftNavDrawer.js +1 -1
  14. package/components/app/App.js +14 -0
  15. package/components/app/providers/FavouritesProvider.js +2 -2
  16. package/components/elements/{hit/HitDetails.d.ts → ObjectDetails.d.ts} +2 -1
  17. package/components/elements/{hit/HitDetails.js → ObjectDetails.js} +14 -14
  18. package/components/elements/PluginTypography.d.ts +2 -1
  19. package/components/elements/PluginTypography.js +3 -2
  20. package/components/elements/UserList.d.ts +1 -0
  21. package/components/elements/UserList.js +2 -2
  22. package/components/elements/addons/search/phrase/Phrase.js +1 -1
  23. package/components/elements/display/HowlerCard.js +1 -1
  24. package/components/elements/hit/HitBanner.js +19 -31
  25. package/components/elements/hit/outlines/DefaultOutline.js +1 -1
  26. package/components/elements/view/ViewTitle.js +1 -1
  27. package/components/hooks/useHitSelection.js +1 -35
  28. package/components/hooks/useMyPreferences.js +10 -1
  29. package/components/hooks/useMySitemap.js +3 -1
  30. package/components/hooks/useMyTheme.js +9 -2
  31. package/components/routes/action/view/ActionSearch.js +1 -1
  32. package/components/routes/action/view/Integrations.js +1 -9
  33. package/components/routes/advanced/QueryBuilder.js +1 -1
  34. package/components/routes/analytics/AnalyticSearch.js +1 -1
  35. package/components/routes/cases/CaseCard.d.ts +8 -0
  36. package/components/routes/cases/CaseCard.js +34 -0
  37. package/components/routes/cases/CaseViewer.d.ts +2 -0
  38. package/components/routes/cases/CaseViewer.js +38 -0
  39. package/components/routes/cases/Cases.d.ts +2 -0
  40. package/components/routes/cases/Cases.js +101 -0
  41. package/components/routes/cases/constants.d.ts +5 -0
  42. package/components/routes/cases/constants.js +5 -0
  43. package/components/routes/cases/detail/AlertPanel.d.ts +6 -0
  44. package/components/routes/cases/detail/AlertPanel.js +29 -0
  45. package/components/routes/cases/detail/CaseAggregate.d.ts +10 -0
  46. package/components/routes/cases/detail/CaseAggregate.js +30 -0
  47. package/components/routes/cases/detail/CaseDashboard.d.ts +7 -0
  48. package/components/routes/cases/detail/CaseDashboard.js +49 -0
  49. package/components/routes/cases/detail/CaseSidebar.d.ts +6 -0
  50. package/components/routes/cases/detail/CaseSidebar.js +35 -0
  51. package/components/routes/cases/detail/CaseTask.d.ts +9 -0
  52. package/components/routes/cases/detail/CaseTask.js +38 -0
  53. package/components/routes/cases/detail/ItemPage.d.ts +6 -0
  54. package/components/routes/cases/detail/ItemPage.js +93 -0
  55. package/components/routes/cases/detail/RelatedCasePanel.d.ts +6 -0
  56. package/components/routes/cases/detail/RelatedCasePanel.js +28 -0
  57. package/components/routes/cases/detail/TaskPanel.d.ts +7 -0
  58. package/components/routes/cases/detail/TaskPanel.js +20 -0
  59. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +12 -0
  60. package/components/routes/cases/detail/sidebar/CaseFolder.js +114 -0
  61. package/components/routes/cases/detail/sidebar/types.d.ts +3 -0
  62. package/components/routes/help/ApiDocumentation.js +1 -1
  63. package/components/routes/help/HitDocumentation.js +1 -3
  64. package/components/routes/hits/search/HitContextMenu.js +4 -27
  65. package/components/routes/hits/search/HitContextMenu.test.js +0 -140
  66. package/components/routes/hits/search/InformationPane.d.ts +1 -0
  67. package/components/routes/hits/search/InformationPane.js +6 -29
  68. package/components/routes/hits/search/SearchPane.js +3 -5
  69. package/components/routes/hits/search/ViewLink.js +1 -1
  70. package/components/routes/hits/search/grid/EnhancedCell.js +1 -1
  71. package/components/routes/hits/view/HitViewer.js +3 -4
  72. package/components/routes/home/ViewCard.js +1 -1
  73. package/components/routes/observables/ObservableViewer.d.ts +7 -0
  74. package/components/routes/observables/ObservableViewer.js +27 -0
  75. package/locales/en/translation.json +413 -397
  76. package/locales/fr/translation.json +420 -406
  77. package/models/entities/generated/AttachmentsFile.d.ts +12 -0
  78. package/models/entities/generated/Case.d.ts +27 -0
  79. package/models/entities/generated/DestinationOriginal.d.ts +19 -0
  80. package/models/entities/generated/EmailAttachment.d.ts +8 -0
  81. package/models/entities/generated/EmailParent.d.ts +19 -0
  82. package/models/entities/generated/Enrichments.d.ts +7 -0
  83. package/models/entities/generated/EnrichmentsIndicator.d.ts +21 -0
  84. package/models/entities/generated/Howler.d.ts +0 -4
  85. package/models/entities/generated/HttpResponse.d.ts +11 -0
  86. package/models/entities/generated/Item.d.ts +9 -0
  87. package/models/entities/generated/Observable.d.ts +84 -0
  88. package/models/entities/generated/ObservableCloud.d.ts +20 -0
  89. package/models/entities/generated/ObservableDestination.d.ts +23 -0
  90. package/models/entities/generated/ObservableEmail.d.ts +30 -0
  91. package/models/entities/generated/ObservableFile.d.ts +36 -0
  92. package/models/entities/generated/ObservableHowler.d.ts +44 -0
  93. package/models/entities/generated/ObservableHttp.d.ts +11 -0
  94. package/models/entities/generated/ObservableObserver.d.ts +21 -0
  95. package/models/entities/generated/ObservableOrganization.d.ts +7 -0
  96. package/models/entities/generated/ObservableProcess.d.ts +34 -0
  97. package/models/entities/generated/ObservableSource.d.ts +23 -0
  98. package/models/entities/generated/ObservableThreat.d.ts +21 -0
  99. package/models/entities/generated/ObservableTls.d.ts +12 -0
  100. package/models/entities/generated/ObserverIngress.d.ts +9 -0
  101. package/models/entities/generated/Rule.d.ts +2 -10
  102. package/models/entities/generated/Task.d.ts +10 -0
  103. package/models/entities/generated/Threat.d.ts +2 -2
  104. package/models/entities/generated/{Enrichment.d.ts → ThreatEnrichment.d.ts} +1 -1
  105. package/package.json +11 -2
  106. package/plugins/clue/components/ClueTypography.js +2 -2
  107. package/plugins/clue/utils.d.ts +2 -1
  108. package/components/elements/display/icons/BundleButton.d.ts +0 -6
  109. package/components/elements/display/icons/BundleButton.js +0 -32
  110. package/components/routes/action/view/markdown/integrations.en.md.js +0 -1
  111. package/components/routes/action/view/markdown/integrations.fr.md.js +0 -1
  112. package/components/routes/help/BundleDocumentation.d.ts +0 -3
  113. package/components/routes/help/BundleDocumentation.js +0 -12
  114. package/components/routes/help/markdown/en/bundles.md.js +0 -1
  115. package/components/routes/help/markdown/fr/bundles.md.js +0 -1
  116. package/components/routes/hits/search/BundleParentMenu.d.ts +0 -6
  117. package/components/routes/hits/search/BundleParentMenu.js +0 -32
@@ -47,7 +47,7 @@ const ViewLink = ({ id, viewId }) => {
47
47
  }, [query, sort, span, view]);
48
48
  const options = useMemo(() => Object.values(views).filter(_view => !!_view && !currentViews?.includes(_view.view_id)), [currentViews, views]);
49
49
  if (loading) {
50
- return _jsx(Chip, { size: "small", icon: _jsx(CircularProgress, { size: 12 }) });
50
+ return _jsx(Chip, { icon: _jsx(CircularProgress, { size: 12 }) });
51
51
  }
52
52
  if (viewId === '') {
53
53
  return (_jsx(ChipPopper, { icon: _jsx(SelectAll, {}), label: t('hit.search.view.select'), deleteIcon: _jsx(ArrowDropDown, {}), toggleOnDelete: true, slotProps: { chip: { size: 'small', color: 'warning' } }, children: _jsxs(Stack, { spacing: 1, direction: "row", children: [_jsx(Autocomplete, { fullWidth: true, size: "small", options: options, getOptionLabel: _view => t(_view.title), renderOption: ({ key, ...props }, o) => (_createElement("li", { ...props, key: key },
@@ -13,6 +13,6 @@ const EnhancedCell = ({ hit, value: rawValue, sx = {}, className, field }) => {
13
13
  return (_jsx(TableCell, { sx: { borderBottom: 'none', borderRight: 'thin solid', borderRightColor: 'divider', fontSize: '0.8rem' }, children: _jsx(Stack, { direction: "row", className: className, spacing: 0.5, sx: [
14
14
  { display: 'flex', justifyContent: 'start', width: '100%', overflow: 'hidden' },
15
15
  ...(Array.isArray(sx) ? sx : [sx])
16
- ], children: values.map((value, index) => (_jsx(PluginTypography, { context: "table", sx: { fontSize: 'inherit', textOverflow: 'ellipsis' }, value: value, field: field, hit: hit, children: value }, value + index))) }) }));
16
+ ], children: values.map((value, index) => (_jsx(PluginTypography, { context: "table", sx: { fontSize: 'inherit', textOverflow: 'ellipsis' }, value: value, field: field, obj: hit, children: value }, value + index))) }) }));
17
17
  };
18
18
  export default memo(EnhancedCell);
@@ -7,13 +7,11 @@ import useMatchers from '@cccsaurora/howler-ui/components/app/hooks/useMatchers'
7
7
  import { HitContext } from '@cccsaurora/howler-ui/components/app/providers/HitProvider';
8
8
  import FlexOne from '@cccsaurora/howler-ui/components/elements/addons/layout/FlexOne';
9
9
  import HowlerCard from '@cccsaurora/howler-ui/components/elements/display/HowlerCard';
10
- import BundleButton from '@cccsaurora/howler-ui/components/elements/display/icons/BundleButton';
11
10
  import SocketBadge from '@cccsaurora/howler-ui/components/elements/display/icons/SocketBadge';
12
11
  import JSONViewer from '@cccsaurora/howler-ui/components/elements/display/json/JSONViewer';
13
12
  import HitActions from '@cccsaurora/howler-ui/components/elements/hit/HitActions';
14
13
  import HitBanner from '@cccsaurora/howler-ui/components/elements/hit/HitBanner';
15
14
  import HitComments from '@cccsaurora/howler-ui/components/elements/hit/HitComments';
16
- import HitDetails from '@cccsaurora/howler-ui/components/elements/hit/HitDetails';
17
15
  import HitLabels from '@cccsaurora/howler-ui/components/elements/hit/HitLabels';
18
16
  import { HitLayout } from '@cccsaurora/howler-ui/components/elements/hit/HitLayout';
19
17
  import HitNotebooks from '@cccsaurora/howler-ui/components/elements/hit/HitNotebooks';
@@ -23,6 +21,7 @@ import HitRelated from '@cccsaurora/howler-ui/components/elements/hit/HitRelated
23
21
  import HitWorklog from '@cccsaurora/howler-ui/components/elements/hit/HitWorklog';
24
22
  import PivotLink from '@cccsaurora/howler-ui/components/elements/hit/related/PivotLink';
25
23
  import RelatedLink from '@cccsaurora/howler-ui/components/elements/hit/related/RelatedLink';
24
+ import ObjectDetails from '@cccsaurora/howler-ui/components/elements/ObjectDetails';
26
25
  import { useMyLocalStorageItem } from '@cccsaurora/howler-ui/components/hooks/useMyLocalStorage';
27
26
  import useMyUserList from '@cccsaurora/howler-ui/components/hooks/useMyUserList';
28
27
  import uniqBy from 'lodash-es/uniqBy';
@@ -97,7 +96,7 @@ const HitViewer = () => {
97
96
  }
98
97
  return {
99
98
  overview: () => _jsx(HitOverview, { hit: hit }),
100
- details: () => _jsx(HitDetails, { hit: hit }),
99
+ details: () => _jsx(ObjectDetails, { obj: hit }),
101
100
  hit_comments: () => _jsx(HitComments, { hit: hit, users: users }),
102
101
  hit_raw: () => _jsx(JSONViewer, { data: hit }),
103
102
  hit_data: () => _jsx(JSONViewer, { data: hit?.howler?.data?.map(entry => tryParse(entry)), collapse: false }),
@@ -142,7 +141,7 @@ const HitViewer = () => {
142
141
  position: 'absolute',
143
142
  top: theme.spacing(2),
144
143
  right: theme.spacing(-6)
145
- }, children: [_jsx(Tooltip, { title: t('page.hits.view.layout'), children: _jsx(IconButton, { onClick: onOrientationChange, children: _jsx(ViewAgenda, { sx: { transition: 'rotate 250ms', rotate: orientation === 'vertical' ? '90deg' : '0deg' } }) }) }), _jsx(SocketBadge, { size: "medium" }), analytic && (_jsx(Tooltip, { title: t('hit.panel.analytic.open'), children: _jsx(IconButton, { onClick: () => navigate(`/analytics/${analytic.analytic_id}`), children: _jsx(QueryStats, {}) }) })), hit?.howler.bundles?.length > 0 && _jsx(BundleButton, { ids: hit.howler.bundles })] }))] }), _jsx(HowlerCard, { sx: [orientation === 'horizontal' && { height: '0px' }], children: _jsx(CardContent, { sx: { padding: 1, position: 'relative' }, children: _jsx(HitActions, { hit: hit, orientation: "vertical" }) }) }), _jsx(Box, { sx: { gridColumn: '1 / span 2', mb: 1 }, children: _jsxs(Tabs, { value: tab === 'overview' && !hasOverview ? 'details' : tab, sx: { display: 'flex', flexDirection: 'row', pr: 2, alignItems: 'center' }, children: [hit?.howler?.is_bundle && (_jsx(Tab, { label: t('hit.viewer.aggregate'), value: "hit_aggregate", onClick: () => setTab('hit_aggregate') })), hasOverview && (_jsx(Tab, { label: t('hit.viewer.overview'), value: "overview", onClick: () => setTab('overview') })), _jsx(Tab, { label: t('hit.viewer.details'), value: "details", onClick: () => setTab('details') }), hit?.howler.dossier?.map((lead, index) => (_jsx(Tab
144
+ }, children: [_jsx(Tooltip, { title: t('page.hits.view.layout'), children: _jsx(IconButton, { onClick: onOrientationChange, children: _jsx(ViewAgenda, { sx: { transition: 'rotate 250ms', rotate: orientation === 'vertical' ? '90deg' : '0deg' } }) }) }), _jsx(SocketBadge, { size: "medium" }), analytic && (_jsx(Tooltip, { title: t('hit.panel.analytic.open'), children: _jsx(IconButton, { onClick: () => navigate(`/analytics/${analytic.analytic_id}`), children: _jsx(QueryStats, {}) }) }))] }))] }), _jsx(HowlerCard, { sx: [orientation === 'horizontal' && { height: '0px' }], children: _jsx(CardContent, { sx: { padding: 1, position: 'relative' }, children: _jsx(HitActions, { hit: hit, orientation: "vertical" }) }) }), _jsx(Box, { sx: { gridColumn: '1 / span 2', mb: 1 }, children: _jsxs(Tabs, { value: tab === 'overview' && !hasOverview ? 'details' : tab, sx: { display: 'flex', flexDirection: 'row', pr: 2, alignItems: 'center' }, children: [hasOverview && (_jsx(Tab, { label: t('hit.viewer.overview'), value: "overview", onClick: () => setTab('overview') })), _jsx(Tab, { label: t('hit.viewer.details'), value: "details", onClick: () => setTab('details') }), hit?.howler.dossier?.map((lead, index) => (_jsx(Tab
146
145
  // eslint-disable-next-line react/no-array-index-key
147
146
  , { label: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [lead.icon && _jsx(Icon, { icon: lead.icon }), _jsx("span", { children: i18n.language === 'en' ? lead.label.en : lead.label.fr })] }), value: 'lead:' + index, onClick: () => setTab('lead:' + index) }, 'lead:' + index))), dossiers.flatMap((_dossier, dossierIndex) => (_dossier.leads ?? []).map((_lead, leadIndex) => (_jsx(Tab
148
147
  // eslint-disable-next-line react/no-array-index-key
@@ -39,6 +39,6 @@ const ViewCard = ({ viewId, limit }) => {
39
39
  });
40
40
  }, [dispatchApi, limit, view?.query]);
41
41
  const onClick = useCallback((query) => navigate('/hits?query=' + query), [navigate]);
42
- return (_jsx(Card, { variant: "outlined", sx: { height: '100%' }, children: _jsxs(Stack, { spacing: 1, sx: { p: 1, minHeight: 100 }, children: [_jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", children: [_jsx(Typography, { variant: "h6", children: t(view?.title) || _jsx(Skeleton, { variant: "text", height: "2em", width: "100px" }) }), _jsx(IconButton, { size: "small", onClick: () => onClick(view.query), children: _jsx(OpenInNew, { fontSize: "small" }) })] }), loading ? (_jsxs(_Fragment, { children: [_jsx(Skeleton, { height: 150, width: "100%", variant: "rounded" }), _jsx(Skeleton, { height: 160, width: "100%", variant: "rounded" }), _jsx(Skeleton, { height: 140, width: "100%", variant: "rounded" })] })) : hits.length > 0 ? (hits.map(h => (_jsx(Card, { variant: "outlined", sx: { cursor: 'pointer' }, onClick: () => navigate((h.howler.is_bundle ? '/bundles/' : '/hits/') + h.howler.id), children: _jsx(CardContent, { children: _jsx(HitBanner, { layout: HitLayout.DENSE, hit: h }) }) }, h.howler.id)))) : (_jsx(AppListEmpty, {}))] }) }));
42
+ return (_jsx(Card, { variant: "outlined", sx: { height: '100%' }, children: _jsxs(Stack, { spacing: 1, sx: { p: 1, minHeight: 100 }, children: [_jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", children: [_jsx(Typography, { variant: "h6", children: t(view?.title) || _jsx(Skeleton, { variant: "text", height: "2em", width: "100px" }) }), _jsx(IconButton, { size: "small", onClick: () => onClick(view.query), children: _jsx(OpenInNew, { fontSize: "small" }) })] }), loading ? (_jsxs(_Fragment, { children: [_jsx(Skeleton, { height: 150, width: "100%", variant: "rounded" }), _jsx(Skeleton, { height: 160, width: "100%", variant: "rounded" }), _jsx(Skeleton, { height: 140, width: "100%", variant: "rounded" })] })) : hits.length > 0 ? (hits.map(h => (_jsx(Card, { variant: "outlined", sx: { cursor: 'pointer' }, onClick: () => navigate(`/hits/${h.howler.id}`), children: _jsx(CardContent, { children: _jsx(HitBanner, { layout: HitLayout.DENSE, hit: h }) }) }, h.howler.id)))) : (_jsx(AppListEmpty, {}))] }) }));
43
43
  };
44
44
  export default ViewCard;
@@ -0,0 +1,7 @@
1
+ import type { Observable } from '@cccsaurora/howler-ui/models/entities/generated/Observable';
2
+ import { type FC } from 'react';
3
+ declare const ObservableViewer: FC<{
4
+ observable?: Observable;
5
+ observableId?: string;
6
+ }>;
7
+ export default ObservableViewer;
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Skeleton } from '@mui/material';
3
+ import api from '@cccsaurora/howler-ui/api';
4
+ import ObjectDetails from '@cccsaurora/howler-ui/components/elements/ObjectDetails';
5
+ import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
6
+ import { useEffect, useState } from 'react';
7
+ const ObservableViewer = ({ observable: provided, observableId }) => {
8
+ const { dispatchApi } = useMyApi();
9
+ const [observable, setObservable] = useState(null);
10
+ useEffect(() => {
11
+ if (provided) {
12
+ setObservable(provided);
13
+ }
14
+ }, [provided]);
15
+ useEffect(() => {
16
+ if (observableId) {
17
+ dispatchApi(api.v2.search.post('observable', { query: `howler.id:${observableId}`, rows: 1 }), {
18
+ throwError: false
19
+ }).then(res => setObservable(res.items[0]));
20
+ }
21
+ }, [dispatchApi, observableId]);
22
+ if (!observable) {
23
+ return;
24
+ }
25
+ return _jsx(Box, { p: 1, children: observable ? _jsx(ObjectDetails, { obj: observable }) : _jsx(Skeleton, { height: 120 }) });
26
+ };
27
+ export default ObservableViewer;