@cccsaurora/howler-ui 2.17.0-dev.600 → 2.17.1-dev.627

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 (191) hide show
  1. package/api/index.d.ts +0 -2
  2. package/api/index.js +2 -4
  3. package/api/search/index.d.ts +1 -2
  4. package/api/search/index.js +1 -2
  5. package/commons/components/leftnav/LeftNavDrawer.js +1 -1
  6. package/components/app/App.js +0 -14
  7. package/components/app/providers/FavouritesProvider.js +2 -2
  8. package/components/app/providers/HitSearchProvider.d.ts +1 -0
  9. package/components/app/providers/HitSearchProvider.js +11 -6
  10. package/components/app/providers/HitSearchProvider.test.js +32 -11
  11. package/components/app/providers/LocalStorageProvider.js +1 -1
  12. package/components/app/providers/ParameterProvider.d.ts +2 -9
  13. package/components/app/providers/ParameterProvider.js +240 -165
  14. package/components/app/providers/ParameterProvider.test.js +14 -307
  15. package/components/elements/EditRow.d.ts +4 -1
  16. package/components/elements/EditRow.js +4 -4
  17. package/components/elements/PluginTypography.d.ts +1 -2
  18. package/components/elements/PluginTypography.js +2 -3
  19. package/components/elements/UserList.d.ts +2 -5
  20. package/components/elements/UserList.js +5 -14
  21. package/components/elements/addons/search/phrase/Phrase.js +1 -1
  22. package/components/elements/display/ChipPopper.d.ts +1 -1
  23. package/components/elements/display/ChipPopper.js +1 -1
  24. package/components/elements/display/HowlerCard.js +1 -1
  25. package/components/elements/display/Modal.js +0 -1
  26. package/components/elements/display/icons/BundleButton.d.ts +6 -0
  27. package/components/elements/display/icons/BundleButton.js +32 -0
  28. package/components/elements/hit/HitBanner.js +48 -28
  29. package/components/elements/hit/HitCard.js +1 -1
  30. package/components/elements/{ObjectDetails.js → hit/HitDetails.js} +17 -17
  31. package/components/elements/hit/HitOutline.js +7 -3
  32. package/components/elements/hit/{HitPreview.d.ts → HitQuickSearch.d.ts} +3 -3
  33. package/components/elements/hit/{HitPreview.js → HitQuickSearch.js} +4 -10
  34. package/components/elements/hit/HitRelated.d.ts +1 -1
  35. package/components/elements/hit/HitRelated.js +3 -30
  36. package/components/elements/hit/outlines/DefaultOutline.js +1 -1
  37. package/components/elements/hit/related/PivotLink.js +1 -1
  38. package/components/elements/hit/related/RelatedLink.d.ts +1 -0
  39. package/components/elements/hit/related/RelatedLink.js +2 -2
  40. package/components/elements/view/ViewTitle.js +1 -1
  41. package/components/hooks/useHitActions.d.ts +1 -1
  42. package/components/hooks/useHitActions.js +2 -2
  43. package/components/hooks/useHitSelection.js +24 -3
  44. package/components/hooks/useLocalStorage.d.ts +13 -0
  45. package/components/hooks/useLocalStorage.js +53 -0
  46. package/components/hooks/useLocalStorageItem.d.ts +18 -0
  47. package/components/hooks/useLocalStorageItem.js +78 -0
  48. package/components/hooks/useLocalStorageItem.test.d.ts +1 -0
  49. package/components/hooks/useLocalStorageItem.test.js +144 -0
  50. package/components/hooks/useMyLocalStorage.js +2 -2
  51. package/components/hooks/useMyPreferences.js +1 -10
  52. package/components/hooks/useMySearch.js +2 -2
  53. package/components/hooks/useMySitemap.js +1 -4
  54. package/components/hooks/useMyTheme.js +2 -9
  55. package/components/routes/action/view/ActionSearch.js +1 -1
  56. package/components/routes/advanced/QueryBuilder.js +1 -1
  57. package/components/routes/analytics/AnalyticDetails.js +2 -2
  58. package/components/routes/analytics/AnalyticSearch.js +1 -1
  59. package/components/routes/help/ApiDocumentation.js +1 -1
  60. package/components/routes/help/BundleDocumentation.d.ts +3 -0
  61. package/components/routes/help/BundleDocumentation.js +12 -0
  62. package/components/routes/help/HitDocumentation.js +3 -1
  63. package/components/routes/help/markdown/en/bundles.md.js +1 -0
  64. package/components/routes/help/markdown/fr/bundles.md.js +1 -0
  65. package/components/routes/hits/search/BundleParentMenu.d.ts +6 -0
  66. package/components/routes/hits/search/BundleParentMenu.js +32 -0
  67. package/components/routes/hits/search/HitContextMenu.js +2 -3
  68. package/components/routes/hits/search/InformationPane.d.ts +0 -1
  69. package/components/routes/hits/search/InformationPane.js +28 -6
  70. package/components/routes/hits/search/LayoutSettings.d.ts +3 -0
  71. package/components/routes/hits/search/LayoutSettings.js +18 -0
  72. package/components/routes/hits/search/QuerySettings.js +1 -2
  73. package/components/routes/hits/search/QuerySettings.test.js +9 -14
  74. package/components/routes/hits/search/SearchPane.js +37 -13
  75. package/components/routes/hits/search/ViewLink.js +1 -1
  76. package/components/routes/hits/search/grid/EnhancedCell.js +1 -1
  77. package/components/routes/hits/view/HitViewer.js +4 -3
  78. package/components/routes/home/AnalyticCard.d.ts +2 -3
  79. package/components/routes/home/AnalyticCard.js +2 -2
  80. package/components/routes/home/ViewCard.js +1 -1
  81. package/components/routes/home/ViewRefresh.d.ts +23 -0
  82. package/components/routes/home/ViewRefresh.js +67 -0
  83. package/components/routes/home/index.js +9 -46
  84. package/components/{elements/MarkdownEditor.js → routes/overviews/OverviewEditor.js} +3 -3
  85. package/components/routes/overviews/OverviewViewer.js +2 -2
  86. package/components/routes/settings/LocalSection.js +2 -1
  87. package/locales/en/translation.json +6 -42
  88. package/locales/fr/translation.json +4 -35
  89. package/models/WithMetadata.d.ts +1 -2
  90. package/models/entities/generated/{ThreatEnrichment.d.ts → Enrichment.d.ts} +1 -1
  91. package/models/entities/generated/Howler.d.ts +4 -0
  92. package/models/entities/generated/Rule.d.ts +10 -2
  93. package/models/entities/generated/Threat.d.ts +2 -2
  94. package/package.json +1 -16
  95. package/plugins/clue/components/ClueTypography.js +2 -2
  96. package/plugins/clue/utils.d.ts +1 -2
  97. package/utils/constants.d.ts +4 -3
  98. package/utils/constants.js +1 -0
  99. package/api/search/case.d.ts +0 -4
  100. package/api/search/case.js +0 -8
  101. package/api/v2/case/index.d.ts +0 -6
  102. package/api/v2/case/index.js +0 -18
  103. package/api/v2/index.d.ts +0 -4
  104. package/api/v2/index.js +0 -6
  105. package/api/v2/search/facet.d.ts +0 -3
  106. package/api/v2/search/facet.js +0 -12
  107. package/api/v2/search/index.d.ts +0 -5
  108. package/api/v2/search/index.js +0 -24
  109. package/components/elements/ObjectDetails.d.ts +0 -6
  110. package/components/elements/case/CaseCard.d.ts +0 -8
  111. package/components/elements/case/CaseCard.js +0 -39
  112. package/components/elements/case/CasePreview.d.ts +0 -6
  113. package/components/elements/case/CasePreview.js +0 -17
  114. package/components/elements/case/StatusIcon.d.ts +0 -5
  115. package/components/elements/case/StatusIcon.js +0 -13
  116. package/components/elements/hit/elements/AnalyticLink.d.ts +0 -8
  117. package/components/elements/hit/elements/AnalyticLink.js +0 -22
  118. package/components/elements/hit/related/RelatedRecords.js +0 -63
  119. package/components/elements/observable/ObservableCard.d.ts +0 -5
  120. package/components/elements/observable/ObservableCard.js +0 -7
  121. package/components/elements/observable/ObservablePreview.d.ts +0 -6
  122. package/components/elements/observable/ObservablePreview.js +0 -12
  123. package/components/hooks/useRelatedRecords.d.ts +0 -13
  124. package/components/hooks/useRelatedRecords.js +0 -32
  125. package/components/routes/cases/CaseViewer.d.ts +0 -2
  126. package/components/routes/cases/CaseViewer.js +0 -24
  127. package/components/routes/cases/Cases.d.ts +0 -2
  128. package/components/routes/cases/Cases.js +0 -101
  129. package/components/routes/cases/constants.d.ts +0 -5
  130. package/components/routes/cases/constants.js +0 -5
  131. package/components/routes/cases/detail/AlertPanel.d.ts +0 -6
  132. package/components/routes/cases/detail/AlertPanel.js +0 -32
  133. package/components/routes/cases/detail/CaseDashboard.d.ts +0 -7
  134. package/components/routes/cases/detail/CaseDashboard.js +0 -49
  135. package/components/routes/cases/detail/CaseDetails.d.ts +0 -6
  136. package/components/routes/cases/detail/CaseDetails.js +0 -61
  137. package/components/routes/cases/detail/CaseOverview.d.ts +0 -7
  138. package/components/routes/cases/detail/CaseOverview.js +0 -43
  139. package/components/routes/cases/detail/CaseSidebar.d.ts +0 -6
  140. package/components/routes/cases/detail/CaseSidebar.js +0 -36
  141. package/components/routes/cases/detail/CaseTask.d.ts +0 -11
  142. package/components/routes/cases/detail/CaseTask.js +0 -57
  143. package/components/routes/cases/detail/ItemPage.d.ts +0 -6
  144. package/components/routes/cases/detail/ItemPage.js +0 -93
  145. package/components/routes/cases/detail/RelatedCasePanel.d.ts +0 -6
  146. package/components/routes/cases/detail/RelatedCasePanel.js +0 -31
  147. package/components/routes/cases/detail/TaskPanel.d.ts +0 -7
  148. package/components/routes/cases/detail/TaskPanel.js +0 -52
  149. package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +0 -12
  150. package/components/routes/cases/detail/aggregates/CaseAggregate.js +0 -19
  151. package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +0 -6
  152. package/components/routes/cases/detail/aggregates/SourceAggregate.js +0 -27
  153. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +0 -12
  154. package/components/routes/cases/detail/sidebar/CaseFolder.js +0 -179
  155. package/components/routes/cases/detail/sidebar/types.d.ts +0 -3
  156. package/components/routes/cases/hooks/useCase.d.ts +0 -13
  157. package/components/routes/cases/hooks/useCase.js +0 -38
  158. package/components/routes/cases/modals/ResolveModal.d.ts +0 -7
  159. package/components/routes/cases/modals/ResolveModal.js +0 -59
  160. package/components/routes/hits/search/shared/IndexPicker.d.ts +0 -2
  161. package/components/routes/hits/search/shared/IndexPicker.js +0 -20
  162. package/components/routes/observables/ObservableViewer.d.ts +0 -7
  163. package/components/routes/observables/ObservableViewer.js +0 -27
  164. package/models/entities/generated/AttachmentsFile.d.ts +0 -12
  165. package/models/entities/generated/Case.d.ts +0 -28
  166. package/models/entities/generated/DestinationOriginal.d.ts +0 -19
  167. package/models/entities/generated/EmailAttachment.d.ts +0 -8
  168. package/models/entities/generated/EmailParent.d.ts +0 -19
  169. package/models/entities/generated/Enrichments.d.ts +0 -7
  170. package/models/entities/generated/EnrichmentsIndicator.d.ts +0 -21
  171. package/models/entities/generated/HttpResponse.d.ts +0 -11
  172. package/models/entities/generated/Item.d.ts +0 -9
  173. package/models/entities/generated/Observable.d.ts +0 -84
  174. package/models/entities/generated/ObservableCloud.d.ts +0 -20
  175. package/models/entities/generated/ObservableDestination.d.ts +0 -23
  176. package/models/entities/generated/ObservableEmail.d.ts +0 -30
  177. package/models/entities/generated/ObservableFile.d.ts +0 -36
  178. package/models/entities/generated/ObservableHowler.d.ts +0 -44
  179. package/models/entities/generated/ObservableHttp.d.ts +0 -11
  180. package/models/entities/generated/ObservableObserver.d.ts +0 -21
  181. package/models/entities/generated/ObservableOrganization.d.ts +0 -7
  182. package/models/entities/generated/ObservableProcess.d.ts +0 -34
  183. package/models/entities/generated/ObservableSource.d.ts +0 -23
  184. package/models/entities/generated/ObservableThreat.d.ts +0 -21
  185. package/models/entities/generated/ObservableTls.d.ts +0 -12
  186. package/models/entities/generated/ObserverIngress.d.ts +0 -9
  187. package/models/entities/generated/Task.d.ts +0 -10
  188. package/utils/typeUtils.d.ts +0 -7
  189. package/utils/typeUtils.js +0 -18
  190. /package/components/elements/hit/{related/RelatedRecords.d.ts → HitDetails.d.ts} +0 -0
  191. /package/components/{elements/MarkdownEditor.d.ts → routes/overviews/OverviewEditor.d.ts} +0 -0
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { DndContext, KeyboardSensor, PointerSensor, closestCenter, useSensor, useSensors } from '@dnd-kit/core';
3
3
  import { SortableContext, arrayMove, sortableKeyboardCoordinates } from '@dnd-kit/sortable';
4
- import { Cancel, Check, Close, Edit, MoreVert, OpenInNew, Refresh } from '@mui/icons-material';
5
- import { Alert, AlertTitle, Box, CircularProgress, FormControl, FormLabel, Grid, IconButton, ListItemIcon, Menu, MenuItem, Slider, Stack, Tooltip, Typography } from '@mui/material';
4
+ import { Cancel, Check, Close, Edit, MoreVert, OpenInNew } from '@mui/icons-material';
5
+ import { Alert, AlertTitle, CircularProgress, FormControl, FormLabel, Grid, IconButton, ListItemIcon, Menu, MenuItem, Slider, Stack, Typography } from '@mui/material';
6
6
  import api from '@cccsaurora/howler-ui/api';
7
7
  import { AppBrand } from '@cccsaurora/howler-ui/branding/AppBrand';
8
8
  import { useAppUser } from '@cccsaurora/howler-ui/commons/components/app/hooks';
@@ -21,6 +21,7 @@ import AddNewCard from './AddNewCard';
21
21
  import AnalyticCard, {} from './AnalyticCard';
22
22
  import EntryWrapper from './EntryWrapper';
23
23
  import ViewCard, {} from './ViewCard';
24
+ import ViewRefresh, {} from './ViewRefresh';
24
25
  const LUCENE_DATE_FMT = 'YYYY-MM-DD[T]HH:mm:ss';
25
26
  const REFRESH_RATES = [15, 30, 60, 300];
26
27
  const Home = () => {
@@ -33,13 +34,10 @@ const Home = () => {
33
34
  const [isEditing, setIsEditing] = useState(false);
34
35
  const [updatedHitTotal, setUpdatedHitTotal] = useState(0);
35
36
  const [dashboard, setStateDashboard] = useState(user.dashboard ?? []);
36
- const [progress, setProgress] = useState(0);
37
- const [isRefreshing, setIsRefreshing] = useState(false);
38
37
  const [openSettings, setOpenSettings] = useState(null);
39
38
  const [refreshRate, setRefreshRate] = useState(user.refresh_rate ?? 15);
40
39
  const [refreshTick, setRefreshTick] = useState(null);
41
- const pendingRefreshes = useRef(0);
42
- const timerRef = useRef(null);
40
+ const viewRefreshRef = useRef(null);
43
41
  const debounceTimerRef = useRef(null);
44
42
  const updateQuery = useMemo(() => `(howler.log.user:${user.username} OR howler.assignment:${user.username}) AND howler.log.timestamp:{${lastViewed} TO now} AND -howler.status:resolved`, [lastViewed, user.username]);
45
43
  const getIdFromEntry = useCallback((entry) => {
@@ -58,11 +56,7 @@ const Home = () => {
58
56
  setStateDashboard(_dashboard);
59
57
  }, []);
60
58
  const handleRefreshComplete = useCallback(() => {
61
- pendingRefreshes.current -= 1;
62
- if (pendingRefreshes.current <= 0) {
63
- setIsRefreshing(false);
64
- setProgress(0);
65
- }
59
+ viewRefreshRef.current?.handleRefreshComplete();
66
60
  }, []);
67
61
  const handleRefreshRateChange = useCallback((newRate) => {
68
62
  setRefreshRate(newRate);
@@ -78,17 +72,9 @@ const Home = () => {
78
72
  setRefreshRateBackend(newRate);
79
73
  }, 500);
80
74
  }, [setRefreshRateBackend, setUser]);
81
- const refreshViews = useCallback(() => {
82
- const viewCardCount = (dashboard ?? []).filter(e => e.type === 'view').length;
83
- setIsRefreshing(true);
84
- pendingRefreshes.current = viewCardCount;
85
- if (viewCardCount === 0) {
86
- setIsRefreshing(false);
87
- setProgress(0);
88
- return;
89
- }
75
+ const handleRefresh = useCallback(() => {
90
76
  setRefreshTick(Symbol());
91
- }, [dashboard]);
77
+ }, []);
92
78
  const handleOpenSettings = (event) => {
93
79
  setOpenSettings(event.currentTarget);
94
80
  };
@@ -126,37 +112,14 @@ const Home = () => {
126
112
  })
127
113
  .then(result => setUpdatedHitTotal(result.total));
128
114
  }, [updateQuery]);
129
- useEffect(() => {
130
- if (isRefreshing)
131
- return;
132
- if (progress >= 100) {
133
- refreshViews();
134
- return;
135
- }
136
- timerRef.current = setTimeout(() => {
137
- setProgress(prev => prev + 1);
138
- }, refreshRate * 10);
139
- return () => {
140
- if (timerRef.current)
141
- clearTimeout(timerRef.current);
142
- };
143
- }, [progress, isRefreshing, refreshRate, refreshViews]);
144
115
  useEffect(() => {
145
116
  return () => {
146
117
  if (debounceTimerRef.current)
147
118
  clearTimeout(debounceTimerRef.current);
148
119
  };
149
120
  }, []);
150
- return (_jsx(PageCenter, { maxWidth: "100%", textAlign: "left", height: "100%", children: _jsx(ErrorBoundary, { children: _jsxs(Stack, { direction: "column", spacing: 1, sx: { height: '100%' }, children: [_jsxs(Stack, { direction: "row", justifyContent: "end", spacing: 1, children: [isEditing && (_jsx(CustomButton, { variant: "outlined", size: "small", color: "error", startIcon: _jsx(Cancel, {}), onClick: discardChanges, children: t('cancel') })), isEditing && (_jsx(CustomButton, { variant: "outlined", size: "small", disabled: isEqual(dashboard, user.dashboard), color: 'success', startIcon: loading ? _jsx(CircularProgress, { size: 20 }) : _jsx(Check, {}), onClick: saveChanges, children: t('save') })), _jsxs(Box, { sx: { position: 'relative', display: 'inline-flex' }, children: [isRefreshing ? (_jsx(CircularProgress, { variant: "indeterminate" })) : (_jsx(CircularProgress, { variant: "determinate", value: progress })), _jsx(Box, { sx: {
151
- top: 0,
152
- left: 0,
153
- bottom: 0,
154
- right: 0,
155
- position: 'absolute',
156
- display: 'flex',
157
- alignItems: 'center',
158
- justifyContent: 'center'
159
- }, children: _jsx(Tooltip, { title: t('refresh'), children: _jsx(IconButton, { onClick: refreshViews, disabled: isRefreshing, color: "primary", children: _jsx(Refresh, {}) }) }) })] }), _jsx(IconButton, { onClick: handleOpenSettings, children: _jsx(MoreVert, {}) }), _jsxs(Menu, { id: "settings-menu", anchorEl: openSettings, open: !!openSettings, onClose: () => setOpenSettings(null), children: [_jsxs(MenuItem, { disabled: isEditing, onClick: () => {
121
+ const viewCardCount = useMemo(() => (dashboard ?? []).filter(e => e.type === 'view').length, [dashboard]);
122
+ return (_jsx(PageCenter, { maxWidth: "100%", textAlign: "left", height: "100%", children: _jsx(ErrorBoundary, { children: _jsxs(Stack, { direction: "column", spacing: 1, sx: { height: '100%' }, children: [_jsxs(Stack, { direction: "row", justifyContent: "end", spacing: 1, children: [isEditing && (_jsx(CustomButton, { variant: "outlined", size: "small", color: "error", startIcon: _jsx(Cancel, {}), onClick: discardChanges, children: t('cancel') })), isEditing && (_jsx(CustomButton, { variant: "outlined", size: "small", disabled: isEqual(dashboard, user.dashboard), color: 'success', startIcon: loading ? _jsx(CircularProgress, { size: 20 }) : _jsx(Check, {}), onClick: saveChanges, children: t('save') })), _jsx(ViewRefresh, { ref: viewRefreshRef, refreshRate: refreshRate, viewCardCount: viewCardCount, onRefresh: handleRefresh }), _jsx(IconButton, { onClick: handleOpenSettings, children: _jsx(MoreVert, {}) }), _jsxs(Menu, { id: "settings-menu", anchorEl: openSettings, open: !!openSettings, onClose: () => setOpenSettings(null), children: [_jsxs(MenuItem, { disabled: isEditing, onClick: () => {
160
123
  setOpenSettings(null);
161
124
  setIsEditing(true);
162
125
  }, children: [_jsx(ListItemIcon, { children: _jsx(Edit, {}) }), t('page.dashboard.settings.edit')] }), _jsx(MenuItem, { disableRipple: true, disableTouchRipple: true, sx: { '&:hover': { bgcolor: 'transparent' }, cursor: 'default' }, children: _jsxs(FormControl, { sx: { px: 2, py: 1, minWidth: 250, pointerEvents: 'auto' }, children: [_jsx(FormLabel, { id: "refresh-rate-label", sx: { mb: 2 }, children: t('page.dashboard.settings.refreshRate') }), _jsx(Slider, { "aria-labelledby": "refresh-rate-label", value: REFRESH_RATES.indexOf(refreshRate), onChange: (_, value) => handleRefreshRateChange(REFRESH_RATES[value]), step: 1, marks: [
@@ -4,8 +4,8 @@ import { useTheme } from '@mui/material';
4
4
  import { ApiConfigContext } from '@cccsaurora/howler-ui/components/app/providers/ApiConfigProvider';
5
5
  import ThemedEditor from '@cccsaurora/howler-ui/components/elements/ThemedEditor';
6
6
  import { memo, useCallback, useContext, useEffect, useMemo } from 'react';
7
- import { conf, language } from '../routes/overviews/markdownExtendedTokenProvider';
8
- const MarkdownEditor = ({ content, setContent, onMount, fontSize = 16, height = '100%', width = '100%', editorOptions = {} }) => {
7
+ import { conf, language } from './markdownExtendedTokenProvider';
8
+ const OverviewEditor = ({ content, setContent, onMount, fontSize = 16, height = '100%', width = '100%', editorOptions = {} }) => {
9
9
  const theme = useTheme();
10
10
  const monaco = useMonaco();
11
11
  const { config } = useContext(ApiConfigContext);
@@ -53,4 +53,4 @@ const MarkdownEditor = ({ content, setContent, onMount, fontSize = 16, height =
53
53
  }), [fontSize, editorOptions]);
54
54
  return (_jsx(ThemedEditor, { height: height, width: width, theme: theme.palette.mode === 'light' ? 'howler' : 'howler-dark', value: content, onChange: value => setContent(value), beforeMount: beforeEditorMount, onMount: onMount, options: options }));
55
55
  };
56
- export default memo(MarkdownEditor);
56
+ export default memo(OverviewEditor);
@@ -15,7 +15,7 @@ import useMyTheme from '@cccsaurora/howler-ui/components/hooks/useMyTheme';
15
15
  import { useSearchParams } from 'react-router-dom';
16
16
  import hitsData from '@cccsaurora/howler-ui/utils/hit.json';
17
17
  import { sanitizeLuceneQuery } from '@cccsaurora/howler-ui/utils/stringUtils';
18
- import MarkdownEditor from '../../elements/MarkdownEditor';
18
+ import OverviewEditor from './OverviewEditor';
19
19
  import { useStartingTemplate } from './startingTemplate';
20
20
  const OverviewViewer = () => {
21
21
  const theme = useTheme();
@@ -188,7 +188,7 @@ const OverviewViewer = () => {
188
188
  right: `calc(50% + 7px - ${x}px)`,
189
189
  mr: -2.4,
190
190
  pr: 1.5
191
- }, children: _jsx(MarkdownEditor, { height: "100%", content: content, setContent: setContent }) }) }), _jsx(Box, { sx: {
191
+ }, children: _jsx(OverviewEditor, { height: "100%", content: content, setContent: setContent }) }) }), _jsx(Box, { sx: {
192
192
  position: 'absolute',
193
193
  top: 0,
194
194
  bottom: 0,
@@ -21,6 +21,7 @@ const LocalSection = () => {
21
21
  const [displayType, setDisplayType] = useMyLocalStorageItem(StorageKey.DISPLAY_TYPE, 'list');
22
22
  const [pageCount, setPageCount] = useMyLocalStorageItem(StorageKey.PAGE_COUNT, 25);
23
23
  const [searchWidth, setSearchWidth] = useMyLocalStorageItem(StorageKey.SEARCH_PANE_WIDTH, null);
24
- return (_jsxs(SettingsSection, { title: t('page.settings.local.title'), colSpan: 3, children: [_jsx(EditRow, { titleKey: "page.settings.local.compact.json", descriptionKey: "page.settings.local.compact.json.description", value: compactJson, type: "checkbox", onEdit: async (value) => setCompactJson(JSON.parse(value)) }), _jsx(EditRow, { titleKey: "page.settings.local.flatten.json", descriptionKey: "page.settings.local.flatten.json.description", value: flattenJson, type: "checkbox", onEdit: async (value) => setFlattenJson(JSON.parse(value)) }), _jsx(EditRow, { titleKey: "page.settings.local.details.drawer", descriptionKey: "page.settings.local.details.drawer.description", value: forceDrawer, type: "checkbox", onEdit: async (value) => setForceDrawer(JSON.parse(value)) }), _jsx(EditRow, { titleKey: "page.settings.local.search.width", descriptionKey: "page.settings.local.search.width.description", value: searchWidth, type: "range", min: 400, max: Math.floor(window.innerWidth / 100) * 100, optional: true, onEdit: async (value) => setSearchWidth(value ? parseInt(value) : null) }), _jsxs(TableRow, { children: [_jsx(TableCell, { sx: CELL_SX, style: { whiteSpace: 'nowrap' }, children: t('page.settings.local.hits.layout') }), _jsx(TableCell, { sx: CELL_SX, colSpan: 2, align: "right", children: _jsxs(ToggleButtonGroup, { size: "small", value: hitLayout, exclusive: true, onChange: (_, value) => setHitLayout(value), children: [_jsx(ToggleButton, { value: HitLayout.DENSE, children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(ViewCompact, {}), _jsx("span", { children: t('page.settings.local.hits.layout.dense') })] }) }), _jsx(ToggleButton, { value: HitLayout.NORMAL, children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(ViewModule, {}), _jsx("span", { children: t('page.settings.local.hits.layout.normal') })] }) }), _jsx(ToggleButton, { value: HitLayout.COMFY, children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(ViewComfy, {}), _jsx("span", { children: t('page.settings.local.hits.layout.comfy') })] }) })] }) })] }), _jsx(TableRow, { children: _jsx(TableCell, { colSpan: 3, sx: { paddingTop: '0 !important' }, children: _jsx(Typography, { variant: "caption", color: "text.secondary", children: t('page.settings.local.hits.layout.description') }) }) }), _jsxs(TableRow, { children: [_jsx(TableCell, { sx: CELL_SX, style: { whiteSpace: 'nowrap' }, children: t('page.settings.local.hits.display_type') }), _jsx(TableCell, { sx: CELL_SX, colSpan: 2, align: "right", children: _jsxs(ToggleButtonGroup, { size: "small", value: displayType, exclusive: true, onChange: (_, value) => setDisplayType(value), children: [_jsx(ToggleButton, { value: "list", children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(List, {}), _jsx("span", { children: t('page.settings.local.hits.display_type.list') })] }) }), _jsx(ToggleButton, { value: "grid", children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(TableChart, {}), _jsx("span", { children: t('page.settings.local.hits.display_type.grid') })] }) })] }) })] }), _jsx(TableRow, { children: _jsx(TableCell, { colSpan: 3, sx: { paddingTop: '0 !important' }, children: _jsx(Typography, { variant: "caption", color: "text.secondary", children: t('page.settings.local.hits.display_type.description') }) }) }), _jsxs(TableRow, { children: [_jsx(TableCell, { sx: CELL_SX, style: { whiteSpace: 'nowrap' }, children: t('page.settings.local.results.count') }), _jsx(TableCell, { sx: CELL_SX, colSpan: 2, align: "right", children: _jsxs(Select, { size: "small", sx: { minWidth: '75px', textAlign: 'left' }, value: pageCount, onChange: event => setPageCount(typeof event.target.value === 'string' ? parseInt(event.target.value) : event.target.value), children: [_jsx(MenuItem, { value: 5, children: "5" }), _jsx(MenuItem, { value: 10, children: "10" }), _jsx(MenuItem, { value: 25, children: "25" }), _jsx(MenuItem, { value: 50, children: "50" }), _jsx(MenuItem, { value: 75, children: "75" }), _jsx(MenuItem, { value: 100, children: "100" }), _jsx(MenuItem, { value: 150, children: "150" }), _jsx(MenuItem, { value: 250, children: "250" })] }) })] }), _jsx(TableRow, { children: _jsx(TableCell, { colSpan: 3, sx: { paddingTop: '0 !important' }, children: _jsx(Typography, { variant: "caption", color: "text.secondary", children: t('page.settings.local.results.count.description') }) }) }), howlerPluginStore.plugins.map(plugin => pluginStore.executeFunction(`${plugin}.settings`, 'local'))] }));
24
+ const [templateFieldCount, setTemplateFieldCount] = useMyLocalStorageItem(StorageKey.TEMPLATE_FIELD_COUNT, null);
25
+ return (_jsxs(SettingsSection, { title: t('page.settings.local.title'), colSpan: 3, children: [_jsx(EditRow, { titleKey: "page.settings.local.compact.json", descriptionKey: "page.settings.local.compact.json.description", value: compactJson, type: "checkbox", onEdit: async (value) => setCompactJson(JSON.parse(value)) }), _jsx(EditRow, { titleKey: "page.settings.local.flatten.json", descriptionKey: "page.settings.local.flatten.json.description", value: flattenJson, type: "checkbox", onEdit: async (value) => setFlattenJson(JSON.parse(value)) }), _jsx(EditRow, { titleKey: "page.settings.local.details.drawer", descriptionKey: "page.settings.local.details.drawer.description", value: forceDrawer, type: "checkbox", onEdit: async (value) => setForceDrawer(JSON.parse(value)) }), _jsx(EditRow, { titleKey: "page.settings.local.search.width", descriptionKey: "page.settings.local.search.width.description", value: searchWidth, type: "range", min: 400, max: Math.floor(window.innerWidth / 100) * 100, optional: true, onEdit: async (value) => setSearchWidth(value ? parseInt(value) : null) }), _jsxs(TableRow, { children: [_jsx(TableCell, { sx: CELL_SX, style: { whiteSpace: 'nowrap' }, children: t('page.settings.local.hits.layout') }), _jsx(TableCell, { sx: CELL_SX, colSpan: 2, align: "right", children: _jsxs(ToggleButtonGroup, { size: "small", value: hitLayout, exclusive: true, onChange: (_, value) => setHitLayout(value), children: [_jsx(ToggleButton, { value: HitLayout.DENSE, children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(ViewCompact, {}), _jsx("span", { children: t('page.settings.local.hits.layout.dense') })] }) }), _jsx(ToggleButton, { value: HitLayout.NORMAL, children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(ViewModule, {}), _jsx("span", { children: t('page.settings.local.hits.layout.normal') })] }) }), _jsx(ToggleButton, { value: HitLayout.COMFY, children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(ViewComfy, {}), _jsx("span", { children: t('page.settings.local.hits.layout.comfy') })] }) })] }) })] }), _jsx(TableRow, { children: _jsx(TableCell, { colSpan: 3, sx: { paddingTop: '0 !important' }, children: _jsx(Typography, { variant: "caption", color: "text.secondary", children: t('page.settings.local.hits.layout.description') }) }) }), _jsx(EditRow, { titleKey: "page.settings.local.hits.field_count", descriptionKey: "page.settings.local.hits.field_count.description", value: templateFieldCount, type: "range", min: 0, step: 1, max: 15, optional: true, onEdit: async (value) => setTemplateFieldCount(value ? parseInt(value) : null), valueLabelFormat: val => val.toString() }), _jsxs(TableRow, { children: [_jsx(TableCell, { sx: CELL_SX, style: { whiteSpace: 'nowrap' }, children: t('page.settings.local.hits.display_type') }), _jsx(TableCell, { sx: CELL_SX, colSpan: 2, align: "right", children: _jsxs(ToggleButtonGroup, { size: "small", value: displayType, exclusive: true, onChange: (_, value) => setDisplayType(value), children: [_jsx(ToggleButton, { value: "list", children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(List, {}), _jsx("span", { children: t('page.settings.local.hits.display_type.list') })] }) }), _jsx(ToggleButton, { value: "grid", children: _jsxs(Stack, { direction: "row", spacing: 0.5, children: [_jsx(TableChart, {}), _jsx("span", { children: t('page.settings.local.hits.display_type.grid') })] }) })] }) })] }), _jsx(TableRow, { children: _jsx(TableCell, { colSpan: 3, sx: { paddingTop: '0 !important' }, children: _jsx(Typography, { variant: "caption", color: "text.secondary", children: t('page.settings.local.hits.display_type.description') }) }) }), _jsxs(TableRow, { children: [_jsx(TableCell, { sx: CELL_SX, style: { whiteSpace: 'nowrap' }, children: t('page.settings.local.results.count') }), _jsx(TableCell, { sx: CELL_SX, colSpan: 2, align: "right", children: _jsxs(Select, { size: "small", sx: { minWidth: '75px', textAlign: 'left' }, value: pageCount, onChange: event => setPageCount(typeof event.target.value === 'string' ? parseInt(event.target.value) : event.target.value), children: [_jsx(MenuItem, { value: 5, children: "5" }), _jsx(MenuItem, { value: 10, children: "10" }), _jsx(MenuItem, { value: 25, children: "25" }), _jsx(MenuItem, { value: 50, children: "50" }), _jsx(MenuItem, { value: 75, children: "75" }), _jsx(MenuItem, { value: 100, children: "100" }), _jsx(MenuItem, { value: 150, children: "150" }), _jsx(MenuItem, { value: 250, children: "250" })] }) })] }), _jsx(TableRow, { children: _jsx(TableCell, { colSpan: 3, sx: { paddingTop: '0 !important' }, children: _jsx(Typography, { variant: "caption", color: "text.secondary", children: t('page.settings.local.results.count.description') }) }) }), howlerPluginStore.plugins.map(plugin => pluginStore.executeFunction(`${plugin}.settings`, 'local'))] }));
25
26
  };
26
27
  export default LocalSection;
@@ -79,8 +79,6 @@
79
79
  "comments.edit.stop": "Stop Editing",
80
80
  "comments.edited": "Edited",
81
81
  "comments.quote": "Quote Reply",
82
- "complete": "Complete",
83
- "crisis": "Crisis",
84
82
  "custom": "Custom",
85
83
  "date.range.1.day": "The last day",
86
84
  "date.range.1.month": "The last month",
@@ -106,16 +104,14 @@
106
104
  "drawer.expand": "Expand Menu",
107
105
  "duplicates.omitted": "Some duplicate entries have been omitted.",
108
106
  "edit": "Edit",
109
- "event.module": "Event Module",
110
- "event.type": "Event Type",
111
107
  "features.warning.description": "This feature is undergoing active development, and is not yet in a finished state. You may encounter bugs or instability.",
112
108
  "features.warning.title": "Feature In Active Development",
113
- "focus": "Main focus",
114
109
  "global": "Global",
115
110
  "help.actions.introduction": "Introduction to Actions",
116
111
  "help.hit.banner.description": "See the below hit banner example for the hit keys necessary to properly populate it. If you have any additional questions, ask in the HOWLER support channel.",
117
112
  "help.hit.banner.json": "Here is the hit data used to populate this banner:",
118
113
  "help.hit.banner.title": "Populating the Hit Banner",
114
+ "help.hit.bundle.title": "Hit Bundles",
119
115
  "help.hit.labels.title": "Hit Labels",
120
116
  "help.hit.links.title": "Hit Links",
121
117
  "help.hit.schema.description.missing": "No description provided.",
@@ -166,20 +162,16 @@
166
162
  "hit.header.assignment": "Assignment: {{user}}",
167
163
  "hit.header.assignment.add": "Assign to a user",
168
164
  "hit.header.assignment.change": "Change assignment",
165
+ "hit.header.bundlesize": "{{hits}} hits",
169
166
  "hit.header.escalation": "Escalation Level: ",
170
167
  "hit.header.indicators": "Indicators",
171
168
  "hit.header.rationale": "Rationale",
172
- "hit.header.related": "{{count}} related records",
173
169
  "hit.header.scrutiny": "Scrutiny: ",
174
170
  "hit.header.status": "Status: ",
175
171
  "hit.header.summary": "Summary",
176
172
  "hit.header.target": "Target",
177
173
  "hit.header.threat": "Threat",
178
- "hit.header.view.case": "View case {{id}}",
179
- "hit.header.view.hit": "View hit {{id}}",
180
- "hit.header.view.observable": "View observable {{id}}",
181
174
  "hit.header.votes": "Votes: ",
182
- "hit.howler.related": "{{count}} related records",
183
175
  "hit.label": "Labels",
184
176
  "hit.label.category.assignments": "Category: Assignments - Specifies what analyst or team of analysts is assigned to triaging this hit.",
185
177
  "hit.label.category.campaign": "Catergory: Campaign - Identifies ongoing campaigns from specific malware families or phishing initiatives. They should only be considered correct attributions if the hit is promoted to evidence.",
@@ -219,10 +211,6 @@
219
211
  "hit.panel.open": "Open Hit Viewer",
220
212
  "hit.panel.view.layout": "Change View Panel",
221
213
  "hit.quicksearch": "Search by assignment, analytic, detection or status",
222
- "hit.related.tab.case": "Cases",
223
- "hit.related.tab.hit": "Hits",
224
- "hit.related.tab.links": "Links",
225
- "hit.related.tab.observable": "Observables",
226
214
  "hit.search.aggregate.button": "Create Summary",
227
215
  "hit.search.button": "Perform search",
228
216
  "hit.search.custom": "Custom Sort",
@@ -231,8 +219,6 @@
231
219
  "hit.search.filter.fields": "Fields",
232
220
  "hit.search.filter.label": "Lookup Filters",
233
221
  "hit.search.filter.values": "Values",
234
- "hit.search.index.hit": "Hits",
235
- "hit.search.index.observable": "Observables",
236
222
  "hit.search.invalid": "Invalid Query",
237
223
  "hit.search.keyboard": "Keyboard shortcuts",
238
224
  "hit.search.keyboard.no_shortcuts": "No shortcuts",
@@ -305,8 +291,6 @@
305
291
  "modal.action.empty": "Action Name cannot be empty.",
306
292
  "modal.action.label": "Action Name",
307
293
  "modal.action.title": "Save Action",
308
- "modal.cases.resolve": "Resolve Case",
309
- "modal.cases.resolve.description": "When resolving a case, you must either assess all open alerts, or add an assessment to the alerts.",
310
294
  "modal.confirm.delete.description": "Are you sure you want to delete this item?",
311
295
  "modal.confirm.delete.title": "Confirm Deletion",
312
296
  "modal.rationale.description": "Provide a rationale that succinctly explains to other analysts why you are confident in this assessment.",
@@ -328,7 +312,6 @@
328
312
  "modal.rule.title": "Create a New Rule",
329
313
  "no.data": "No Data",
330
314
  "none": "None",
331
- "normal": "Normal Priority",
332
315
  "on": "on",
333
316
  "open": "Open",
334
317
  "operations.add_label": "Add Label",
@@ -348,21 +331,6 @@
348
331
  "owner": "Owner",
349
332
  "page.404.description": "The page you are looking for cannot be found...",
350
333
  "page.404.title": "404: Not found",
351
- "page.cases.created": "Created",
352
- "page.cases.dashboard": "Dashboard",
353
- "page.cases.dashboard.alerts": "Alerts",
354
- "page.cases.dashboard.cases": "Related Cases",
355
- "page.cases.dashboard.duration": "Duration",
356
- "page.cases.dashboard.indicators": "Indicators",
357
- "page.cases.dashboard.target": "Targets",
358
- "page.cases.dashboard.tasks": "Tasks",
359
- "page.cases.dashboard.threat": "Threats",
360
- "page.cases.detail.participants": "Participants",
361
- "page.cases.detail.properties": "Properties",
362
- "page.cases.detail.status": "Status",
363
- "page.cases.escalation": "Escalation",
364
- "page.cases.sources": "Sources",
365
- "page.cases.updated": "Updated",
366
334
  "page.dashboard.settings.edit": "Edit Dashboard",
367
335
  "page.dashboard.settings.refreshRate": "Refresh Rate",
368
336
  "page.dashboard.title": "Dashboard",
@@ -402,6 +370,8 @@
402
370
  "page.settings.local.hits.display_type.description": "This setting allows you to decide whether to use the list or grid view by default when searching.",
403
371
  "page.settings.local.hits.display_type.grid": "Grid",
404
372
  "page.settings.local.hits.display_type.list": "List",
373
+ "page.settings.local.hits.field_count": "Template Field Count",
374
+ "page.settings.local.hits.field_count.description": "What is the maximum number of fields we should show from a given template?",
405
375
  "page.settings.local.hits.layout": "Change Layout",
406
376
  "page.settings.local.hits.layout.comfy": "Comfy",
407
377
  "page.settings.local.hits.layout.dense": "Dense",
@@ -431,8 +401,6 @@
431
401
  "page.user.search.column.groups": "Groups",
432
402
  "page.user.search.column.username": "Username",
433
403
  "page.user.search.prompt": "Search by username, fullname, email or group",
434
- "pages.cases.detail.participants": "Participants",
435
- "pages.cases.detail.status": "Status",
436
404
  "password": "New Password",
437
405
  "password.confirm": "Confirm Password",
438
406
  "password.match": "Password and Confirm Password must match",
@@ -450,6 +418,7 @@
450
418
  "quicksearch.placeholder": "Search ...",
451
419
  "rationale.default": "Hit assessed as {{assessment}}",
452
420
  "references": "references",
421
+ "refresh": "Refresh",
453
422
  "retention.error": "This hit is {{ duration }} from automatic deletion. You will soon lose access to this hit in Howler - consider retaining the hit if you want to avoid data loss.",
454
423
  "retention.imminent": "moments away",
455
424
  "retention.safe": "This hit is {{ duration }} from automatic deletion.",
@@ -560,11 +529,6 @@
560
529
  "route.analytics.triage.title": "Triage Settings",
561
530
  "route.analytics.updated": "Analytic Updated!",
562
531
  "route.analytics.view": "View Analytic",
563
- "route.cases": "Cases",
564
- "route.cases.create": "Create Case",
565
- "route.cases.manager.search": "Search Cases",
566
- "route.cases.search.prompt": "Search Cases via title, summary or indicators",
567
- "route.cases.view": "View Case",
568
532
  "route.clear": "Clear query",
569
533
  "route.dossiers": "Dossiers",
570
534
  "route.dossiers.create": "New Dossier",
@@ -636,6 +600,7 @@
636
600
  "route.help.views": "Views",
637
601
  "route.history": "History mode: See all previous queries",
638
602
  "route.hits": "Alerts",
603
+ "route.hits.bundle": "View Bundle",
639
604
  "route.hits.view": "View Hit",
640
605
  "route.home": "User Dashboard",
641
606
  "route.home.add": "Add New Panel",
@@ -738,7 +703,6 @@
738
703
  "search.result.showing": "Showing {{offset}} to {{length}} of {{total}} results",
739
704
  "search.result.showing.single": "No results",
740
705
  "search.total": "There are a total of {{count}} hits matching this query.",
741
- "started": "Started",
742
706
  "templates.edit.analytic": "Edit analytic template",
743
707
  "templates.edit.detection": "Edit detection template",
744
708
  "to": "to",
@@ -81,8 +81,6 @@
81
81
  "comments.edit.stop": "Arrêter Modification",
82
82
  "comments.edited": "Modifié",
83
83
  "comments.quote": "Citation Réponse",
84
- "complete": "Terminé",
85
- "crisis": "Crise",
86
84
  "custom": "Personnalisé",
87
85
  "date.range.1.day": "Dernier jour",
88
86
  "date.range.1.month": "Le dernier mois",
@@ -108,11 +106,8 @@
108
106
  "drawer.expand": "Ouvrir le Menu",
109
107
  "duplicates.omitted": "Certains doublons ont été omis.",
110
108
  "edit": "Modifier",
111
- "event.module": "Module d'événement",
112
- "event.type": "Type d'événement",
113
109
  "features.warning.description": "Cette fonctionnalité fait l'objet d'un développement actif et n'est pas encore achevée. Il est possible que vous rencontriez des problèmes ou de l'instabilité.",
114
110
  "features.warning.title": "Fonctionnalité en développement actif",
115
- "focus": "Focus principal",
116
111
  "global": "Global",
117
112
  "help.actions.introduction": "Introduction aux actions",
118
113
  "help.hit.banner.description": "Voir l'exemple d'en-tête de résultat ci-dessous pour connaître les clés de résultat nécessaires pour le remplir correctement. Si vous avez d'autres questions, posez-les dans le réseau d'assistance HOWLER.",
@@ -169,18 +164,15 @@
169
164
  "hit.header.assignment": "Affectation: {{user}}",
170
165
  "hit.header.assignment.add": "Attribuer à un utilisateur",
171
166
  "hit.header.assignment.change": "Changer l'affectation",
167
+ "hit.header.bundlesize": "{{hits}} hits",
172
168
  "hit.header.escalation": "Niveau d'escalade: ",
173
169
  "hit.header.indicators": "Indicateurs",
174
170
  "hit.header.rationale": "Justification",
175
- "hit.header.related": "{{count}} documrents associés",
176
171
  "hit.header.scrutiny": "Examen minutieux: ",
177
172
  "hit.header.status": "Statut: ",
178
173
  "hit.header.summary": "Résumé",
179
174
  "hit.header.target": "Cible",
180
175
  "hit.header.threat": "Menace",
181
- "hit.header.view.case": "Voir le cas {{id}}",
182
- "hit.header.view.hit": "Voir l'alerte {{id}}",
183
- "hit.header.view.observable": "Voir l'observable {{id}}",
184
176
  "hit.header.votes": "Votes: ",
185
177
  "hit.label": "Étiquettes",
186
178
  "hit.label.category.assignments": "Catégorie : Affectation - Indique quel analyste ou quelle équipe d'analystes est chargé(e) de trier cette réponse positive.",
@@ -222,10 +214,6 @@
222
214
  "hit.panel.open": "Ouvrir hit",
223
215
  "hit.panel.view.layout": "Modifier le panneau d'affichage",
224
216
  "hit.quicksearch": "Recherche par affectation, analytique, détection ou état",
225
- "hit.related.tab.case": "Cas",
226
- "hit.related.tab.hit": "Alertes",
227
- "hit.related.tab.links": "Liens",
228
- "hit.related.tab.observable": "Observables",
229
217
  "hit.search.aggregate.button": "Créer un sommaire",
230
218
  "hit.search.button": "Effectuer une recherche",
231
219
  "hit.search.custom": "Triage personnalisé",
@@ -328,7 +316,6 @@
328
316
  "modal.rule.title": "Créer une nouvelle règle",
329
317
  "no.data": "Aucune donnée",
330
318
  "none": "Rien",
331
- "normal": "Priorité normale",
332
319
  "on": "sur",
333
320
  "open": "Ouvert",
334
321
  "operations.add_label": "Ajouter un label",
@@ -348,21 +335,6 @@
348
335
  "owner": "Propriétaire",
349
336
  "page.404.description": "La page que vous recherchez est introuvable ...",
350
337
  "page.404.title": "404: Introuvable",
351
- "page.cases.created": "Créé",
352
- "page.cases.dashboard": "Tableau de bord",
353
- "page.cases.dashboard.alerts": "Alertes",
354
- "page.cases.dashboard.cases": "Cas connexes",
355
- "page.cases.dashboard.duration": "Durée",
356
- "page.cases.dashboard.indicators": "Indicateurs",
357
- "page.cases.dashboard.target": "Cibles",
358
- "page.cases.dashboard.tasks": "Tâches",
359
- "page.cases.dashboard.threat": "Menaces",
360
- "page.cases.detail.participants": "Participants",
361
- "page.cases.detail.properties": "Propriétés",
362
- "page.cases.detail.status": "Statut",
363
- "page.cases.escalation": "Escalade",
364
- "page.cases.sources": "Sources",
365
- "page.cases.updated": "Mis à jour",
366
338
  "page.dashboard.settings.edit": "Modifier le tableau de bord",
367
339
  "page.dashboard.settings.refreshRate": "Fréquence de rafraîchissement",
368
340
  "page.dashboard.title": "Tableau de bord",
@@ -403,6 +375,8 @@
403
375
  "page.settings.local.hits.display_type.description": "Ce paramètre vous permet de choisir entre l'affichage sous forme de liste ou de grille par défaut lors d'une recherche.",
404
376
  "page.settings.local.hits.display_type.grid": "Grille",
405
377
  "page.settings.local.hits.display_type.list": "Liste",
378
+ "page.settings.local.hits.field_count": "Nombre de champs du modèle",
379
+ "page.settings.local.hits.field_count.description": "Quel est le nombre maximal de champs que nous devons afficher à partir d'un modèle donné?",
406
380
  "page.settings.local.hits.layout": "Change Layout",
407
381
  "page.settings.local.hits.layout.comfy": "Confortable",
408
382
  "page.settings.local.hits.layout.dense": "Dense",
@@ -432,8 +406,6 @@
432
406
  "page.user.search.column.groups": "Groupes",
433
407
  "page.user.search.column.username": "Nom d'utilisateur",
434
408
  "page.user.search.prompt": "Rechercher par nom d'utilisateur, nom complet, e-mail ou groupe",
435
- "pages.cases.detail.participants": "Participants",
436
- "pages.cases.detail.status": "Statut",
437
409
  "password": "Nouveau mot de passe",
438
410
  "password.confirm": "Confirmer le mot de passe",
439
411
  "password.match": "Le mot de passe et le mot de passe de confirmation doivent correspondre",
@@ -452,6 +424,7 @@
452
424
  "quicksearch.placeholder": "Recherche ...",
453
425
  "rationale.default": "Hit évaluée comme {{assessment}}",
454
426
  "references": "références",
427
+ "refresh": "Rafraîchir",
455
428
  "retention.error": "Ce résultat est {{ duration }} de la suppression automatique. Vous n'aurez bientôt plus accès à ce résultat dans Howler. Pensez à conserver ce résultat si vous voulez éviter toute perte de données.",
456
429
  "retention.imminent": "à quelques instants",
457
430
  "retention.safe": "Ce résultat est {{ duration }} de la suppression automatique.",
@@ -561,9 +534,6 @@
561
534
  "route.analytics.triage.title": "Paramètres de triage",
562
535
  "route.analytics.updated": "Analytic mis a jour!",
563
536
  "route.analytics.view": "Voir l'analyse",
564
- "route.cases.create": "Créer un cas",
565
- "route.cases.manager.search": "Rechercher des cas",
566
- "route.cases.search.prompt": "Rechercher des cas par titre, résumé ou indicateurs",
567
537
  "route.clear": "Effacer la requête",
568
538
  "route.dossiers": "Dossiers",
569
539
  "route.dossiers.create": "Nouveau dossier",
@@ -735,7 +705,6 @@
735
705
  "search.result.showing": "Affichage de {{offset}} à {{length}} sur {{total}} articles",
736
706
  "search.result.showing.single": "Aucun articles",
737
707
  "search.total": "Il y a un total de {{count}} résultats correspondant à cette requête.",
738
- "started": "Démarré",
739
708
  "templates.edit.analytic": "Modifier modèle pour cette analyse",
740
709
  "templates.edit.detection": "Modifier modèle pour cette détection",
741
710
  "to": "à",
@@ -4,10 +4,9 @@ import type { Overview } from './entities/generated/Overview';
4
4
  import type { Template } from './entities/generated/Template';
5
5
 
6
6
  export type WithMetadata<T> = T & {
7
- __index?: string;
8
-
9
7
  __analytic?: Analytic;
10
8
  __overview?: Overview;
11
9
  __template?: Template;
10
+
12
11
  __dossiers?: Dossier[];
13
12
  };
@@ -4,7 +4,7 @@ import type { Matched } from './Matched';
4
4
  /**
5
5
  * NOTE: This is an auto-generated file. Don't edit this manually.
6
6
  */
7
- export interface ThreatEnrichment {
7
+ export interface Enrichment {
8
8
  indicator?: Indicator;
9
9
  matched?: Matched;
10
10
  }
@@ -14,6 +14,8 @@ export interface Howler {
14
14
  analytic: string;
15
15
  assessment?: string;
16
16
  assignment: string;
17
+ bundle_size?: number;
18
+ bundles?: string[];
17
19
  comment?: HowlerComment[];
18
20
  confidence?: number;
19
21
  data?: string[];
@@ -22,8 +24,10 @@ export interface Howler {
22
24
  escalation?: string;
23
25
  expiry?: string;
24
26
  hash: string;
27
+ hits?: string[];
25
28
  id: string;
26
29
  incidents?: Incident[];
30
+ is_bundle?: boolean;
27
31
  labels?: Labels;
28
32
  links?: Link[];
29
33
  log?: Log[];
@@ -2,6 +2,14 @@
2
2
  * NOTE: This is an auto-generated file. Don't edit this manually.
3
3
  */
4
4
  export interface Rule {
5
- destination?: string;
6
- query?: string;
5
+ author?: string;
6
+ category?: string;
7
+ description?: string;
8
+ id?: string;
9
+ license?: string;
10
+ name?: string;
11
+ reference?: string;
12
+ ruleset?: string;
13
+ uuid?: string;
14
+ version?: string;
7
15
  }
@@ -1,6 +1,6 @@
1
+ import type { Enrichment } from './Enrichment';
1
2
  import type { Feed } from './Feed';
2
3
  import type { Software } from './Software';
3
- import type { ThreatEnrichment } from './ThreatEnrichment';
4
4
  import type { ThreatGroup } from './ThreatGroup';
5
5
  import type { ThreatIndicator } from './ThreatIndicator';
6
6
  import type { ThreatTactic } from './ThreatTactic';
@@ -10,7 +10,7 @@ import type { ThreatTechnique } from './ThreatTechnique';
10
10
  * NOTE: This is an auto-generated file. Don't edit this manually.
11
11
  */
12
12
  export interface Threat {
13
- enrichments?: ThreatEnrichment[];
13
+ enrichments?: Enrichment[];
14
14
  feed?: Feed;
15
15
  framework?: string;
16
16
  group?: ThreatGroup;
package/package.json CHANGED
@@ -101,7 +101,7 @@
101
101
  "internal-slot": "1.0.7"
102
102
  },
103
103
  "type": "module",
104
- "version": "2.17.0-dev.600",
104
+ "version": "2.17.1-dev.627",
105
105
  "exports": {
106
106
  "./i18n": "./i18n.js",
107
107
  "./index.css": "./index.css",
@@ -129,10 +129,8 @@
129
129
  "./components/app/providers/*": "./components/app/providers/*.js",
130
130
  "./components/app/hooks/*": "./components/app/hooks/*.js",
131
131
  "./components/elements/display/*": "./components/elements/display/*.js",
132
- "./components/elements/observable/*": "./components/elements/observable/*.js",
133
132
  "./components/elements/hit/*": "./components/elements/hit/*.js",
134
133
  "./components/elements/view/*": "./components/elements/view/*.js",
135
- "./components/elements/case/*": "./components/elements/case/*.js",
136
134
  "./components/elements/addons/*": "./components/elements/addons/*.js",
137
135
  "./components/elements/display/handlebars/*": "./components/elements/display/handlebars/*.js",
138
136
  "./components/elements/display/modals/*": "./components/elements/display/modals/*.js",
@@ -174,8 +172,6 @@
174
172
  "./components/routes/help/*": "./components/routes/help/*.js",
175
173
  "./components/routes/admin/*": "./components/routes/admin/*.js",
176
174
  "./components/routes/settings/*": "./components/routes/settings/*.js",
177
- "./components/routes/observables/*": "./components/routes/observables/*.js",
178
- "./components/routes/cases/*": "./components/routes/cases/*.js",
179
175
  "./components/routes/action/edit/*": "./components/routes/action/edit/*.js",
180
176
  "./components/routes/action/view/*": "./components/routes/action/view/*.js",
181
177
  "./components/routes/action/shared/*": "./components/routes/action/shared/*.js",
@@ -191,11 +187,6 @@
191
187
  "./components/routes/help/markdown/fr/*.md": "./components/routes/help/markdown/fr/*.md.js",
192
188
  "./components/routes/help/markdown/en/*.md": "./components/routes/help/markdown/en/*.md.js",
193
189
  "./components/routes/admin/users/*": "./components/routes/admin/users/*.js",
194
- "./components/routes/cases/modals/*": "./components/routes/cases/modals/*.js",
195
- "./components/routes/cases/hooks/*": "./components/routes/cases/hooks/*.js",
196
- "./components/routes/cases/detail/*": "./components/routes/cases/detail/*.js",
197
- "./components/routes/cases/detail/sidebar/*": "./components/routes/cases/detail/sidebar/*.js",
198
- "./components/routes/cases/detail/aggregates/*": "./components/routes/cases/detail/aggregates/*.js",
199
190
  "./commons/components/*": "./commons/components/*.js",
200
191
  "./commons/components/breadcrumbs/*": "./commons/components/breadcrumbs/*.js",
201
192
  "./commons/components/app/*": "./commons/components/app/*.js",
@@ -221,8 +212,6 @@
221
212
  "./locales/en/help/*.json": "./locales/en/help/*.json",
222
213
  "./api/overview/*": "./api/overview/*.js",
223
214
  "./api/overview": "./api/overview/index.js",
224
- "./api/v2/*": "./api/v2/*.js",
225
- "./api/v2": "./api/v2/index.js",
226
215
  "./api/action/*": "./api/action/*.js",
227
216
  "./api/action": "./api/action/index.js",
228
217
  "./api/auth/*": "./api/auth/*.js",
@@ -245,10 +234,6 @@
245
234
  "./api/hit": "./api/hit/index.js",
246
235
  "./api/view/*": "./api/view/*.js",
247
236
  "./api/view": "./api/view/index.js",
248
- "./api/v2/search/*": "./api/v2/search/*.js",
249
- "./api/v2/search": "./api/v2/search/index.js",
250
- "./api/v2/case/*": "./api/v2/case/*.js",
251
- "./api/v2/case": "./api/v2/case/index.js",
252
237
  "./api/analytic/comments/*": "./api/analytic/comments/*.js",
253
238
  "./api/analytic/comments": "./api/analytic/comments/index.js",
254
239
  "./api/analytic/notebooks/*": "./api/analytic/notebooks/*.js",
@@ -3,8 +3,8 @@ import EnrichedTypography from '@cccsaurora/clue-ui/components/EnrichedTypograph
3
3
  import { Typography } from '@mui/material';
4
4
  import { memo } from 'react';
5
5
  import { useType } from '../utils';
6
- const ClueTypography = ({ children, value, context, field, obj, ...props }) => {
7
- const type = useType(obj, field, value);
6
+ const ClueTypography = ({ children, value, context, field, hit, ...props }) => {
7
+ const type = useType(hit, field, value);
8
8
  if (!type) {
9
9
  return _jsx(Typography, { ...props, children: children ?? value });
10
10
  }
@@ -1,3 +1,2 @@
1
1
  import type { Hit } from '@cccsaurora/howler-ui/models/entities/generated/Hit';
2
- import type { Observable } from '@cccsaurora/howler-ui/models/entities/generated/Observable';
3
- export declare const useType: (hit?: Hit | Observable, field?: string, value?: string) => any;
2
+ export declare const useType: (hit?: Hit, field?: string, value?: string) => any;