@cccsaurora/howler-ui 2.19.0-dev.921 → 2.19.0-dev.931
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.
- package/components/app/App.d.ts +1 -0
- package/components/app/App.js +10 -1
- package/components/app/providers/FavouritesProvider.js +0 -4
- package/components/elements/display/HowlerAvatar.js +2 -1
- package/components/elements/hit/HitSummary.js +3 -2
- package/components/hooks/useMyPreferences.js +2 -1
- package/components/routes/action/view/ActionDetails.js +1 -1
- package/components/routes/analytics/AnalyticDetails.js +1 -1
- package/components/routes/settings/LocalSection.js +2 -1
- package/locales/en/translation.json +18 -6
- package/locales/fr/translation.json +18 -8
- package/package.json +1 -1
- package/utils/constants.d.ts +1 -0
- package/utils/constants.js +1 -0
package/components/app/App.d.ts
CHANGED
package/components/app/App.js
CHANGED
|
@@ -51,6 +51,7 @@ import Templates from '@cccsaurora/howler-ui/components/routes/templates/Templat
|
|
|
51
51
|
import ViewComposer from '@cccsaurora/howler-ui/components/routes/views/ViewComposer';
|
|
52
52
|
import Views from '@cccsaurora/howler-ui/components/routes/views/Views';
|
|
53
53
|
import dayjs from 'dayjs';
|
|
54
|
+
import 'dayjs/locale/fr-ca';
|
|
54
55
|
import duration from 'dayjs/plugin/duration';
|
|
55
56
|
import localizedFormat from 'dayjs/plugin/localizedFormat';
|
|
56
57
|
import relativeTime from 'dayjs/plugin/relativeTime';
|
|
@@ -58,7 +59,7 @@ import utc from 'dayjs/plugin/utc';
|
|
|
58
59
|
import i18n from '@cccsaurora/howler-ui/i18n';
|
|
59
60
|
import * as monaco from 'monaco-editor';
|
|
60
61
|
import howlerPluginStore from '@cccsaurora/howler-ui/plugins/store';
|
|
61
|
-
import { useContext, useEffect, useMemo } from 'react';
|
|
62
|
+
import { useCallback, useContext, useEffect, useMemo } from 'react';
|
|
62
63
|
import { I18nextProvider } from 'react-i18next';
|
|
63
64
|
import { PluginProvider, usePluginStore } from 'react-pluggable';
|
|
64
65
|
import { createBrowserRouter, Outlet, RouterProvider, useLocation, useNavigate } from 'react-router-dom';
|
|
@@ -84,6 +85,7 @@ dayjs.extend(utc);
|
|
|
84
85
|
dayjs.extend(duration);
|
|
85
86
|
dayjs.extend(relativeTime);
|
|
86
87
|
dayjs.extend(localizedFormat);
|
|
88
|
+
dayjs.locale(i18n.language === 'en' ? 'en' : 'fr-ca');
|
|
87
89
|
loader.config({ monaco });
|
|
88
90
|
const RoleRoute = ({ roles }) => {
|
|
89
91
|
const appUser = useAppUser();
|
|
@@ -105,6 +107,13 @@ const MyApp = () => {
|
|
|
105
107
|
const { setItems } = useAppSwitcher();
|
|
106
108
|
const { get, set, remove } = useMyLocalStorage();
|
|
107
109
|
const pluginStore = usePluginStore();
|
|
110
|
+
const onLanguageChange = useCallback((language) => dayjs.locale(language === 'en' ? 'en' : 'fr-ca'), []);
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
i18n.on('languageChanged', onLanguageChange);
|
|
113
|
+
return () => {
|
|
114
|
+
i18n.off('languageChanged', onLanguageChange);
|
|
115
|
+
};
|
|
116
|
+
}, [onLanguageChange]);
|
|
108
117
|
// Simulate app loading time...
|
|
109
118
|
// e.g. fetching initial app data, etc.
|
|
110
119
|
useEffect(() => {
|
|
@@ -26,10 +26,6 @@ const FavouriteProvider = ({ children }) => {
|
|
|
26
26
|
if (favourites.length < 1) {
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
29
|
-
// The favourite list is fully represented, skip
|
|
30
|
-
if (favourites.length === viewElement?.element?.items?.length) {
|
|
31
|
-
return viewElement;
|
|
32
|
-
}
|
|
33
29
|
const savedViews = await fetchViews(favourites);
|
|
34
30
|
const items = sortBy(savedViews, 'title')
|
|
35
31
|
.filter(view => !!view)
|
|
@@ -10,6 +10,7 @@ const HowlerAvatar = ({ userId, ...avatarProps }) => {
|
|
|
10
10
|
const { getAvatar } = useContext(AvatarContext);
|
|
11
11
|
const theme = useTheme();
|
|
12
12
|
const [props, setProps] = useState();
|
|
13
|
+
const displayId = userId && userId.toLowerCase() !== 'unassigned' ? userId : t('app.drawer.hit.assignment.unassigned.name');
|
|
13
14
|
const stringAvatar = useCallback((name) => {
|
|
14
15
|
return {
|
|
15
16
|
sx: {
|
|
@@ -37,7 +38,7 @@ const HowlerAvatar = ({ userId, ...avatarProps }) => {
|
|
|
37
38
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
38
39
|
}, [userId]);
|
|
39
40
|
if (userId) {
|
|
40
|
-
return (_jsx(Tooltip, { title:
|
|
41
|
+
return (_jsx(Tooltip, { title: displayId, children: _jsx(Avatar, { "aria-label": displayId, ...avatarProps, ...props, sx: { ...(avatarProps?.sx || {}), ...(props?.sx || {}) } }) }));
|
|
41
42
|
}
|
|
42
43
|
else {
|
|
43
44
|
return (_jsx(Avatar, { "aria-label": t('unknown'), ...avatarProps, ...props, sx: { ...(avatarProps?.sx || {}), ...(props?.sx || {}) } }));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Analytics, InfoOutlined } from '@mui/icons-material';
|
|
3
3
|
import { Alert, AlertTitle, Autocomplete, Box, Button, Chip, CircularProgress, Divider, Fade, Grid, LinearProgress, Stack, TextField, Tooltip, Typography } from '@mui/material';
|
|
4
4
|
import api from '@cccsaurora/howler-ui/api';
|
|
@@ -23,6 +23,7 @@ const HitSummary = ({ response, onStart, onComplete }) => {
|
|
|
23
23
|
const { hitFields } = useContext(FieldContext);
|
|
24
24
|
const { showErrorMessage } = useMySnackbar();
|
|
25
25
|
const pageCount = useMyLocalStorageItem(StorageKey.PAGE_COUNT, 25)[0];
|
|
26
|
+
const [showHitSummaryGraph] = useMyLocalStorageItem(StorageKey.SHOW_HIT_SUMMARY_GRAPH, true);
|
|
26
27
|
const { getMatchingTemplate } = useMatchers();
|
|
27
28
|
const searching = useContextSelector(HitSearchContext, ctx => ctx.searching);
|
|
28
29
|
const error = useContextSelector(HitSearchContext, ctx => ctx.error);
|
|
@@ -130,7 +131,7 @@ const HitSummary = ({ response, onStart, onComplete }) => {
|
|
|
130
131
|
performAggregation();
|
|
131
132
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
132
133
|
}, [query, views, searching, error]);
|
|
133
|
-
return (_jsxs(Stack, { sx: { mx: 2, height: '100%' }, spacing: 1, children: [_jsx(Typography, { variant: "h6", children: t('hit.summary.aggregate.title') }), _jsx(Divider, { flexItem: true }), _jsx(HitGraph, {}), _jsx(Divider, { flexItem: true }), _jsxs(Stack, { sx: { overflow: 'auto', marginTop: '0 !important' }, pt: 1, spacing: 1, children: [_jsxs(Stack, { direction: "row", spacing: 2, mb: 2, alignItems: "stretch", children: [_jsx(Autocomplete, { fullWidth: true, multiple: true, sx: { minWidth: '175px' }, size: "small", value: customKeys, options: hitFields.map(_field => _field.key), renderInput: _params => _jsx(TextField, { ..._params, label: t('hit.summary.adhoc') }), onChange: (_, value) => setCustomKeys(value) }), _jsx(Button, { variant: "outlined", startIcon: loading ? _jsx(CircularProgress, { size: 20, sx: { ml: 1 } }) : _jsx(Analytics, { sx: { ml: 1 } }), disabled: loading, onClick: () => performAggregation(), children: t('button.aggregate') })] }), isEmpty(aggregateResults) && (_jsxs(Alert, { severity: "info", variant: "outlined", children: [_jsx(AlertTitle, { children: t('hit.summary.aggregate.nokeys.title') }), t('hit.summary.aggregate.nokeys.description')] })), loading && _jsx(LinearProgress, { sx: { minHeight: '4px' } }), Object.keys(aggregateResults)
|
|
134
|
+
return (_jsxs(Stack, { sx: { mx: 2, height: '100%' }, spacing: 1, children: [_jsx(Typography, { variant: "h6", children: t('hit.summary.aggregate.title') }), _jsx(Divider, { flexItem: true }), showHitSummaryGraph && (_jsxs(_Fragment, { children: [_jsx(HitGraph, {}), _jsx(Divider, { flexItem: true })] })), _jsxs(Stack, { sx: { overflow: 'auto', marginTop: '0 !important' }, pt: 1, spacing: 1, children: [_jsxs(Stack, { direction: "row", spacing: 2, mb: 2, alignItems: "stretch", children: [_jsx(Autocomplete, { fullWidth: true, multiple: true, sx: { minWidth: '175px' }, size: "small", value: customKeys, options: hitFields.map(_field => _field.key), renderInput: _params => _jsx(TextField, { ..._params, label: t('hit.summary.adhoc') }), onChange: (_, value) => setCustomKeys(value) }), _jsx(Button, { variant: "outlined", startIcon: loading ? _jsx(CircularProgress, { size: 20, sx: { ml: 1 } }) : _jsx(Analytics, { sx: { ml: 1 } }), disabled: loading, onClick: () => performAggregation(), children: t('button.aggregate') })] }), isEmpty(aggregateResults) && (_jsxs(Alert, { severity: "info", variant: "outlined", children: [_jsx(AlertTitle, { children: t('hit.summary.aggregate.nokeys.title') }), t('hit.summary.aggregate.nokeys.description')] })), loading && _jsx(LinearProgress, { sx: { minHeight: '4px' } }), Object.keys(aggregateResults)
|
|
134
135
|
.filter(key => !isEmpty(aggregateResults[key]))
|
|
135
136
|
.flatMap(key => [
|
|
136
137
|
_jsx(Fade, { in: true, children: _jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, children: [_jsx(Typography, { variant: "body1", children: key }, key + '-title'), keyCounts[key]?.count < 0 ? (_jsxs(Typography, { variant: "caption", color: "text.secondary", children: ["(", t('hit.summary.adhoc.custom'), ")"] })) : (_jsxs(Typography, { variant: "caption", color: "text.secondary", children: ["(", keyCounts[key]?.count ?? '?', " ", t('references'), ")"] })), _jsx(Tooltip, { title: _jsxs(Stack, { children: [_jsx(Typography, { variant: "caption", children: t('hit.summary.aggregate.sources') }), keyCounts[key]?.sources.map(source => (_jsx(Typography, { variant: "caption", children: source }, source))) ?? '?'] }), children: _jsx(InfoOutlined, { fontSize: "inherit" }) })] }) }, key + '-refs'),
|
|
@@ -276,7 +276,8 @@ const useMyPreferences = () => {
|
|
|
276
276
|
rightBeforeSearch: (_jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", pr: 1, children: [rightItems.map(item => (_jsx(Fragment, { children: item.component }, item.id))), _jsx(Classification, {})] }))
|
|
277
277
|
},
|
|
278
278
|
leftnav: {
|
|
279
|
-
elements: MENU_ITEMS
|
|
279
|
+
elements: MENU_ITEMS,
|
|
280
|
+
width: 280
|
|
280
281
|
}
|
|
281
282
|
}), [USER_MENU_ITEMS, ADMIN_MENU_ITEMS, MENU_ITEMS, leftItems, rightItems]);
|
|
282
283
|
};
|
|
@@ -63,7 +63,7 @@ const ActionDetails = () => {
|
|
|
63
63
|
user.roles.includes('admin') ||
|
|
64
64
|
user.roles.includes('actionrunner_basic') ||
|
|
65
65
|
user.roles.includes('actionrunner_advanced');
|
|
66
|
-
return (_jsx(PageCenter, { maxWidth: "1500px", textAlign: "left", height: "100%", children: _jsxs(Stack, { spacing: 1, children: [_jsxs(Stack, { direction: "row", justifyContent: "space-between", children: [_jsx(Typography, { variant: "h5", children: action?.name }), action?.owner_id && _jsx(HowlerAvatar, { sx: { width: 32, height: 32 }, userId: action.owner_id })] }), _jsx(Phrase, { fullWidth: true, value: action?.query, disabled: true, size: "small", onChange: () => { }, startAdornment: _jsx(IconButton, { onClick: () => onSearch(action?.query), children: _jsx(Search, { fontSize: "small" }) }) }), _jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, children: [response && _jsx(QueryResultText, { count: response.total, query: action?.query }), _jsx(FlexOne, {}), ((action?.owner_id === user.username && editRoles) || user.roles?.includes('admin')) && (_jsx(Button, { startIcon: _jsx(Delete, {}), size: "small", variant: "outlined", color: "error", onClick: () => deleteAction(action?.action_id), children: t('delete') })), execRoles && (_jsx(Button, { startIcon: _jsx(PlayCircleOutline, {}), size: "small", variant: "outlined", color: "success", onClick: () => executeAction(action?.action_id), children: t('route.actions.execute') })), ((action?.owner_id === user.username && editRoles) || user.roles?.includes('admin')) && (_jsx(Button, { startIcon: _jsx(Edit, {}), size: "small", variant: "outlined", component: Link, to: `/action/${params.id}/edit`, children: t('route.actions.edit') }))] }), user.roles.includes('automation_advanced') && (_jsx(FormGroup, { children: _jsx(Stack, { direction: "row", spacing: 1, children: action?.operations
|
|
66
|
+
return (_jsx(PageCenter, { maxWidth: "1500px", textAlign: "left", height: "100%", children: _jsxs(Stack, { spacing: 1, children: [_jsxs(Stack, { direction: "row", justifyContent: "space-between", children: [_jsx(Typography, { variant: "h5", children: action?.name }), action?.owner_id && _jsx(HowlerAvatar, { sx: { width: 32, height: 32 }, userId: action.owner_id })] }), _jsx(Phrase, { fullWidth: true, value: action?.query, disabled: true, size: "small", onChange: () => { }, startAdornment: _jsx(IconButton, { onClick: () => onSearch(action?.query), children: _jsx(Search, { fontSize: "small" }) }) }), _jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, children: [response && _jsx(QueryResultText, { count: response.total, query: action?.query }), _jsx(FlexOne, {}), ((action?.owner_id === user.username && editRoles) || user.roles?.includes('admin')) && (_jsx(Button, { startIcon: _jsx(Delete, {}), size: "small", variant: "outlined", color: "error", onClick: () => deleteAction(action?.action_id), children: t('button.delete') })), execRoles && (_jsx(Button, { startIcon: _jsx(PlayCircleOutline, {}), size: "small", variant: "outlined", color: "success", onClick: () => executeAction(action?.action_id), children: t('route.actions.execute') })), ((action?.owner_id === user.username && editRoles) || user.roles?.includes('admin')) && (_jsx(Button, { startIcon: _jsx(Edit, {}), size: "small", variant: "outlined", component: Link, to: `/action/${params.id}/edit`, children: t('route.actions.edit') }))] }), user.roles.includes('automation_advanced') && (_jsx(FormGroup, { children: _jsx(Stack, { direction: "row", spacing: 1, children: action?.operations
|
|
67
67
|
?.map(a => (operations ?? []).find(_action => _action.id === a.operation_id)?.triggers ?? [])
|
|
68
68
|
.reduce((acc, triggers) => acc.filter(_t => triggers.includes(_t)))
|
|
69
69
|
.map(trigger => (_jsx(FormControlLabel, { control: _jsx(Checkbox, { name: trigger, onChange: onTriggerChange, checked: action?.triggers?.includes(trigger) ?? false }), label: t(`route.actions.trigger.${trigger}`) }, trigger))) }) })), loading &&
|
|
@@ -115,7 +115,7 @@ const AnalyticDetails = () => {
|
|
|
115
115
|
borderRadius: theme.shape.borderRadius,
|
|
116
116
|
border: `thin solid ${theme.palette.divider}`,
|
|
117
117
|
width: '100%'
|
|
118
|
-
}, children: analytic.rule_crontab }))] }), (analytic?.owner === user.username || user.roles.includes('admin')) && (_jsx(Tooltip, { title: editingInterval ? t('rule.interval.save') : t('rule.interval.edit'), children: _jsx(IconButton, { disabled: intervalLoading, sx: { alignSelf: 'end' }, onClick: onEdit, children: intervalLoading ? _jsx(CircularProgress, { size: 20 }) : editingInterval ? _jsx(Check, {}) : _jsx(Edit, {}) }) }))] }))] }), _jsxs(Grid, { container: true, children: [_jsx(Grid, { item: true, xs: 12, md: 9, children: _jsxs(Tabs, { value: tab, onChange: (_, _tab) => setTab(_tab), children: [_jsx(Tab, { label: t('route.analytics.tab.overview'), value: "overview" }), _jsx(Tab, { label: t('route.analytics.tab.comments'), value: "comments" }), _jsx(Tab, { label: t('route.analytics.tab.hit_comments'), value: "hit_comments" }), _jsx(Tab, { label: t('route.analytics.tab.templates'), value: "templates" }), _jsx(Tab, { label: t('route.analytics.tab.overviews'), value: "overviews" }), analytic?.rule && _jsx(Tab, { label: t('route.analytics.tab.rule'), value: "rule" }), config?.configuration.features.notebook && (_jsx(Tab, { label: t('route.analytics.tab.notebooks'), value: "notebooks" })), _jsx(Tab, { label: t('route.analytics.tab.triage'), value: "triage" })] }) }), ['comments', 'hit_comments'].includes(tab) && (_jsx(Grid, { item: true, xs: 12, md: 3, children: _jsx(Autocomplete, { options: analytic?.detections ?? [], renderInput: param => _jsx(TextField, { ...param, label:
|
|
118
|
+
}, children: analytic.rule_crontab }))] }), (analytic?.owner === user.username || user.roles.includes('admin')) && (_jsx(Tooltip, { title: editingInterval ? t('rule.interval.save') : t('rule.interval.edit'), children: _jsx(IconButton, { disabled: intervalLoading, sx: { alignSelf: 'end' }, onClick: onEdit, children: intervalLoading ? _jsx(CircularProgress, { size: 20 }) : editingInterval ? _jsx(Check, {}) : _jsx(Edit, {}) }) }))] }))] }), _jsxs(Grid, { container: true, children: [_jsx(Grid, { item: true, xs: 12, md: 9, children: _jsxs(Tabs, { value: tab, onChange: (_, _tab) => setTab(_tab), children: [_jsx(Tab, { label: t('route.analytics.tab.overview'), value: "overview" }), _jsx(Tab, { label: t('route.analytics.tab.comments'), value: "comments" }), _jsx(Tab, { label: t('route.analytics.tab.hit_comments'), value: "hit_comments" }), _jsx(Tab, { label: t('route.analytics.tab.templates'), value: "templates" }), _jsx(Tab, { label: t('route.analytics.tab.overviews'), value: "overviews" }), analytic?.rule && _jsx(Tab, { label: t('route.analytics.tab.rule'), value: "rule" }), config?.configuration.features.notebook && (_jsx(Tab, { label: t('route.analytics.tab.notebooks'), value: "notebooks" })), _jsx(Tab, { label: t('route.analytics.tab.triage'), value: "triage" })] }) }), ['comments', 'hit_comments'].includes(tab) && (_jsx(Grid, { item: true, xs: 12, md: 3, children: _jsx(Autocomplete, { options: analytic?.detections ?? [], renderInput: param => _jsx(TextField, { ...param, label: t('route.analytics.dropdown.detection') }), value: filter, onChange: (_, v) => setFilter(v) }) }))] }), {
|
|
119
119
|
comments: _jsx(AnalyticComments, { analytic: analytic, setAnalytic: setAnalytic }),
|
|
120
120
|
hit_comments: _jsx(AnalyticHitComments, { analytic: analytic }),
|
|
121
121
|
overview: _jsx(AnalyticOverview, { analytic: analytic, setAnalytic: setAnalytic }),
|
|
@@ -17,11 +17,12 @@ const LocalSection = () => {
|
|
|
17
17
|
const [compactJson, setCompactJson] = useMyLocalStorageItem(StorageKey.COMPACT_JSON, true);
|
|
18
18
|
const [flattenJson, setFlattenJson] = useMyLocalStorageItem(StorageKey.FLATTEN_JSON, false);
|
|
19
19
|
const [forceDrawer, setForceDrawer] = useMyLocalStorageItem(StorageKey.FORCE_DRAWER, false);
|
|
20
|
+
const [showHitSummaryGraph, setShowHitSummaryGraph] = useMyLocalStorageItem(StorageKey.SHOW_HIT_SUMMARY_GRAPH, true);
|
|
20
21
|
const [hitLayout, setHitLayout] = useMyLocalStorageItem(StorageKey.HIT_LAYOUT, false);
|
|
21
22
|
const [displayType, setDisplayType] = useMyLocalStorageItem(StorageKey.DISPLAY_TYPE, 'list');
|
|
22
23
|
const [pageCount, setPageCount] = useMyLocalStorageItem(StorageKey.PAGE_COUNT, 25);
|
|
23
24
|
const [searchWidth, setSearchWidth] = useMyLocalStorageItem(StorageKey.SEARCH_PANE_WIDTH, null);
|
|
24
25
|
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'))] }));
|
|
26
|
+
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.show.hit.summary.graph", descriptionKey: "page.settings.local.show.hit.summary.graph.description", value: showHitSummaryGraph, type: "checkbox", onEdit: async (value) => setShowHitSummaryGraph(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'))] }));
|
|
26
27
|
};
|
|
27
28
|
export default LocalSection;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"*": "All values",
|
|
3
|
+
"Protected B": "Protected B",
|
|
4
|
+
"Unclassified//Official Use Only": "Unclassified//Official Use Only",
|
|
5
|
+
"actions.error": "Action \"{{action}}\" had error(s): {{messages}}",
|
|
3
6
|
"actions.running": "Action \"{{action}}\" is executing.",
|
|
4
|
-
"actions.succeeded": "Action \"{{action}}\" completed successfully.",
|
|
5
7
|
"actions.skipped": "Action \"{{action}}\" was skipped: {{messages}}",
|
|
6
|
-
"actions.
|
|
8
|
+
"actions.succeeded": "Action \"{{action}}\" completed successfully.",
|
|
7
9
|
"add": "Add",
|
|
8
10
|
"adminmenu": "Admin menu",
|
|
9
11
|
"adminmenu.config": "Configuration",
|
|
@@ -190,6 +192,7 @@
|
|
|
190
192
|
"hit.label.edit.add.error.duplicate": "Duplicated label not allowed",
|
|
191
193
|
"hit.label.edit.add.error.empty": "Can't add an empty label",
|
|
192
194
|
"hit.label.edit.add.label": "New label value",
|
|
195
|
+
"hit.label.edit.desc": "Add or remove labels",
|
|
193
196
|
"hit.notebook.confirm.dialog": "A notebook with that name already exists in your environment, do you wish to overwrite it?",
|
|
194
197
|
"hit.notebook.confirm.title": "Overwrite existing notebook?",
|
|
195
198
|
"hit.notebook.error.failToPost": "Failed to send notebook to Jupyterhub, make sure your user environment is running.",
|
|
@@ -259,6 +262,7 @@
|
|
|
259
262
|
"hit.summary.subtitle": "Limited to a maximum of 10 000 hits.",
|
|
260
263
|
"hit.summary.title": "Summary of Hits Over Time",
|
|
261
264
|
"hit.summary.zoom.reset": "Reset Zoom",
|
|
265
|
+
"hit.view.overview": "Overview",
|
|
262
266
|
"hit.viewer.aggregate": "Summary",
|
|
263
267
|
"hit.viewer.comments": "Comments",
|
|
264
268
|
"hit.viewer.data": "Raw Data",
|
|
@@ -386,6 +390,8 @@
|
|
|
386
390
|
"page.settings.local.results.count.description": "How many results should we show per page when showing search results?",
|
|
387
391
|
"page.settings.local.search.width": "Maximum Results Width",
|
|
388
392
|
"page.settings.local.search.width.description": "The maximum size (in pixels) the results column in the search page.",
|
|
393
|
+
"page.settings.local.show.hit.summary.graph": "Show the Hit Summary Graph in Hit Search",
|
|
394
|
+
"page.settings.local.show.hit.summary.graph.description": "Shows the Hit Summary Graph in the Hit Search",
|
|
389
395
|
"page.settings.local.title": "UI Preferences",
|
|
390
396
|
"page.settings.profile.table.email": "Email",
|
|
391
397
|
"page.settings.profile.table.groups": "Groups",
|
|
@@ -419,6 +425,7 @@
|
|
|
419
425
|
"personalization.showbreadcrumbs": "Show Breadcrumbs",
|
|
420
426
|
"personalization.sticky": "Sticky Topbar",
|
|
421
427
|
"query": "Query",
|
|
428
|
+
"query.invalid": "Invalid query",
|
|
422
429
|
"quicksearch.aria": "search",
|
|
423
430
|
"quicksearch.placeholder": "Search ...",
|
|
424
431
|
"rationale.default": "Hit assessed as {{assessment}}",
|
|
@@ -498,9 +505,11 @@
|
|
|
498
505
|
"route.analytics.deleted": "Deleted Rule!",
|
|
499
506
|
"route.analytics.detection.title": "Hits Ingested in the Last Three Months by Detection",
|
|
500
507
|
"route.analytics.detections": "Detections:",
|
|
508
|
+
"route.analytics.dropdown.detection": "Detection",
|
|
501
509
|
"route.analytics.escalation.title": "Escalation of Created Hits",
|
|
502
510
|
"route.analytics.filter.rule": "Filter on Rules",
|
|
503
511
|
"route.analytics.ingestion.title": "Number of Hits Created",
|
|
512
|
+
"route.analytics.manager.search": "Search Analytics",
|
|
504
513
|
"route.analytics.overview.description": "Description",
|
|
505
514
|
"route.analytics.overview.empty.description": "There are no existing hits for this analytic. Statistics cannot be shown.",
|
|
506
515
|
"route.analytics.overview.empty.title": "No Statistics to Show",
|
|
@@ -596,8 +605,10 @@
|
|
|
596
605
|
"route.help.actions": "Action Documentation",
|
|
597
606
|
"route.help.api": "API Documentation",
|
|
598
607
|
"route.help.auth": "Authentication",
|
|
608
|
+
"route.help.bundles": "Hit Bundles",
|
|
599
609
|
"route.help.client": "Howler Client",
|
|
600
610
|
"route.help.hit": "Hit Documentation",
|
|
611
|
+
"route.help.hit.banner": "Hit Banner Documentation",
|
|
601
612
|
"route.help.main": "Dashboard",
|
|
602
613
|
"route.help.notebook": "Notebook Documentation",
|
|
603
614
|
"route.help.overviews": "Overviews",
|
|
@@ -665,15 +676,15 @@
|
|
|
665
676
|
"route.templates.default": "Default",
|
|
666
677
|
"route.templates.detection": "Choose Detection",
|
|
667
678
|
"route.templates.global": "Global",
|
|
679
|
+
"route.templates.manager.error.action": "Click to open quick fix options",
|
|
680
|
+
"route.templates.manager.error.message": "Invalid Detection",
|
|
681
|
+
"route.templates.manager.error.modal.description": "The template fields are read only and will not be used. Do you want to remove the template?",
|
|
682
|
+
"route.templates.manager.error.modal.title": "Template detection no longer exists",
|
|
668
683
|
"route.templates.manager.global": "Global",
|
|
669
684
|
"route.templates.manager.open": "Open View",
|
|
670
685
|
"route.templates.manager.personal": "Personal",
|
|
671
686
|
"route.templates.manager.readonly": "Built-in",
|
|
672
687
|
"route.templates.manager.search": "Search Templates",
|
|
673
|
-
"route.templates.manager.error.message": "Invalid Detection",
|
|
674
|
-
"route.templates.manager.error.action": "Click to open quick fix options",
|
|
675
|
-
"route.templates.manager.error.modal.title": "Template detection no longer exists",
|
|
676
|
-
"route.templates.manager.error.modal.description": "The template fields are read only and will not be used. Do you want to remove the template?",
|
|
677
688
|
"route.templates.personal": "Personal",
|
|
678
689
|
"route.templates.prompt": "Activate autocomplete using [ctrl + space].",
|
|
679
690
|
"route.templates.readonly.warning": "This is a built-in template, and cannot be edited. To make changes to it, contact",
|
|
@@ -710,6 +721,7 @@
|
|
|
710
721
|
"rule.interval.thirty.minutes": "Every thirty minutes",
|
|
711
722
|
"rule.interval.three.hours": "Every three hours",
|
|
712
723
|
"save": "Save",
|
|
724
|
+
"search.layout.settings": "Edit search result layout",
|
|
713
725
|
"search.open": "Open Search",
|
|
714
726
|
"search.result.showing": "Showing {{offset}} to {{length}} of {{total}} results",
|
|
715
727
|
"search.result.showing.single": "No results",
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"*": "Toutes les valeurs",
|
|
3
3
|
"Protected B": "Protégé B",
|
|
4
4
|
"Unclassified//Official Use Only": "Non classé//Réservé à des fins officielles",
|
|
5
|
+
"actions.error": "Action \"{{action}}\" a rencontré une ou des erreur(s): {{messages}}",
|
|
5
6
|
"actions.running": "Action \"{{action}}\" s'exécute.",
|
|
6
|
-
"actions.succeeded": "Action \"{{action}}\" achevé avec succès.",
|
|
7
7
|
"actions.skipped": "Action \"{{action}}\" a été ignorée: {{messages}}",
|
|
8
|
-
"actions.
|
|
8
|
+
"actions.succeeded": "Action \"{{action}}\" achevé avec succès.",
|
|
9
9
|
"add": "Ajouter",
|
|
10
10
|
"adminmenu": "Menu d'administration",
|
|
11
11
|
"adminmenu.config": "Configuration",
|
|
@@ -364,7 +364,6 @@
|
|
|
364
364
|
"page.help": "Aide",
|
|
365
365
|
"page.help.title": "Tableau de bord de l'aide",
|
|
366
366
|
"page.login.button": "Se connecter",
|
|
367
|
-
"page.login.error": "Tapez simplement n'importe quoi dans les champs du nom d'utilisateur et du mot de passe ...",
|
|
368
367
|
"page.login.password": "Mot de passe",
|
|
369
368
|
"page.login.username": "Nom d'utilisateur",
|
|
370
369
|
"page.logout": "Déconnexion de l'utilisateur actuel ... ",
|
|
@@ -391,6 +390,8 @@
|
|
|
391
390
|
"page.settings.local.results.count.description": "Combien de résultats devons-nous afficher par page lors de l'affichage des résultats de recherche ?",
|
|
392
391
|
"page.settings.local.search.width": "Largeur maximale des résultats",
|
|
393
392
|
"page.settings.local.search.width.description": "Taille maximale (en pixels) de la colonne des résultats dans la page de recherche.",
|
|
393
|
+
"page.settings.local.show.hit.summary.graph": "Afficher le graphique du résumé des résultats dans le volet Résumé des résultats",
|
|
394
|
+
"page.settings.local.show.hit.summary.graph.description": "Affiche le graphique du résumé des résultats dans le volet Résumé des résultats",
|
|
394
395
|
"page.settings.local.title": "Préférences de l'interface utilisateur",
|
|
395
396
|
"page.settings.profile.table.email": "Courriel",
|
|
396
397
|
"page.settings.profile.table.groups": "Groupes",
|
|
@@ -443,6 +444,7 @@
|
|
|
443
444
|
"route.actions.create": "Nouveau action",
|
|
444
445
|
"route.actions.edit": "Modifier",
|
|
445
446
|
"route.actions.execute": "Exécuter",
|
|
447
|
+
"route.actions.manager": "Gestion des actions",
|
|
446
448
|
"route.actions.name": "Nom de l'action",
|
|
447
449
|
"route.actions.open": "Ouvrir la requête",
|
|
448
450
|
"route.actions.operation.add": "Ajouter une nouvelle opération",
|
|
@@ -503,9 +505,11 @@
|
|
|
503
505
|
"route.analytics.deleted": "Règle supprimée!",
|
|
504
506
|
"route.analytics.detection.title": "Hits ingérés au cours des trois derniers mois par détection",
|
|
505
507
|
"route.analytics.detections": "Détections:",
|
|
508
|
+
"route.analytics.dropdown.detection": "Détection",
|
|
506
509
|
"route.analytics.escalation.title": "Escalade des hits créés",
|
|
507
510
|
"route.analytics.filter.rule": "Filtre sur les règles",
|
|
508
511
|
"route.analytics.ingestion.title": "Nombre de hits créés",
|
|
512
|
+
"route.analytics.manager.search": "Rechercher les analyses",
|
|
509
513
|
"route.analytics.overview.description": "Description",
|
|
510
514
|
"route.analytics.overview.empty.description": "Il n'y a pas de résultats existants pour cette analyse. Les statistiques ne peuvent pas être affichées.",
|
|
511
515
|
"route.analytics.overview.empty.title": "Pas de statistiques à montrer",
|
|
@@ -598,6 +602,7 @@
|
|
|
598
602
|
"route.dossiers.search.prompt": "Recherche par titre, requête ou propriétaire.",
|
|
599
603
|
"route.dossiers.view": "Voir le dossier",
|
|
600
604
|
"route.help": "Aide",
|
|
605
|
+
"route.help.actions": "Documentation sur les actions",
|
|
601
606
|
"route.help.api": "Documentation de l'API",
|
|
602
607
|
"route.help.auth": "Authentification",
|
|
603
608
|
"route.help.bundles": "Groupes des hits",
|
|
@@ -661,6 +666,7 @@
|
|
|
661
666
|
"route.overviews.theme.dark": "Prévoyez en mode sombre",
|
|
662
667
|
"route.overviews.theme.light": "Prévoyez en mode clair",
|
|
663
668
|
"route.overviews.view": "Voir la vue d'ensemble",
|
|
669
|
+
"route.search": "Rechercher",
|
|
664
670
|
"route.templates": "Modèles",
|
|
665
671
|
"route.templates.analytic": "Choisir une analyse",
|
|
666
672
|
"route.templates.builtin": "Intégré",
|
|
@@ -669,15 +675,16 @@
|
|
|
669
675
|
"route.templates.create": "Nouvelle modèle",
|
|
670
676
|
"route.templates.default": "Défaut",
|
|
671
677
|
"route.templates.detection": "Choisir une détection",
|
|
672
|
-
"route.templates.global": "
|
|
678
|
+
"route.templates.global": "Global",
|
|
679
|
+
"route.templates.manager.error.action": "Cliquez ici pour afficher les options de correction rapide",
|
|
680
|
+
"route.templates.manager.error.message": "Détection non valide",
|
|
681
|
+
"route.templates.manager.error.modal.description": "Les clés du modèle sont en lecture seule et ne seront pas utilisées. Voulez-vous supprimer le modèle ?",
|
|
682
|
+
"route.templates.manager.error.modal.title": "La détection du modèle n'existe plus",
|
|
673
683
|
"route.templates.manager.global": "Global",
|
|
684
|
+
"route.templates.manager.open": "Ouvrir la vue",
|
|
674
685
|
"route.templates.manager.personal": "Personnel",
|
|
675
686
|
"route.templates.manager.readonly": "Intégré",
|
|
676
687
|
"route.templates.manager.search": "Rechercher les modèles",
|
|
677
|
-
"route.templates.manager.error.message": "Détection non valide",
|
|
678
|
-
"route.templates.manager.error.action": "Cliquez ici pour afficher les options de correction rapide",
|
|
679
|
-
"route.templates.manager.error.modal.title": "La détection du modèle n'existe plus",
|
|
680
|
-
"route.templates.manager.error.modal.description": "Les clés du modèle sont en lecture seule et ne seront pas utilisées. Voulez-vous supprimer le modèle ?",
|
|
681
688
|
"route.templates.personal": "Personnel",
|
|
682
689
|
"route.templates.prompt": "Activer l'autocomplétion en utilisant [ctrl + espace].",
|
|
683
690
|
"route.templates.readonly.warning": "Il s'agit d'un modèle intégré qui ne peut pas être modifié. Pour le modifier, veuillez contacter",
|
|
@@ -698,8 +705,10 @@
|
|
|
698
705
|
"route.views.manager.personal": "Personnel",
|
|
699
706
|
"route.views.manager.readonly": "Intégré",
|
|
700
707
|
"route.views.manager.search": "Rechercher les vues",
|
|
708
|
+
"route.views.name": "Nom de la vue",
|
|
701
709
|
"route.views.save": "Enregistrer cette requête comme vue",
|
|
702
710
|
"route.views.saved": "Vues épinglées",
|
|
711
|
+
"route.views.search.prompt": "Rechercher par nom, requête ou propriétaire.",
|
|
703
712
|
"route.views.show": "Voir les vues",
|
|
704
713
|
"route.views.update.success": "Vue actualisée.",
|
|
705
714
|
"rule.interval": "Intervalle d'exécution de la règle",
|
|
@@ -712,6 +721,7 @@
|
|
|
712
721
|
"rule.interval.thirty.minutes": "Toutes les trente minutes",
|
|
713
722
|
"rule.interval.three.hours": "Toutes les trois heures",
|
|
714
723
|
"save": "Sauvegarder",
|
|
724
|
+
"search.layout.settings": "Modifier la présentation des résultats de recherche",
|
|
715
725
|
"search.open": "Ouvrir la recherche",
|
|
716
726
|
"search.result.showing": "Affichage de {{offset}} à {{length}} sur {{total}} articles",
|
|
717
727
|
"search.result.showing.single": "Aucun articles",
|
package/package.json
CHANGED
package/utils/constants.d.ts
CHANGED
|
@@ -49,6 +49,7 @@ export declare enum StorageKey {
|
|
|
49
49
|
COMPACT_JSON = "compact_json_view",
|
|
50
50
|
FLATTEN_JSON = "flatten_json_view",
|
|
51
51
|
FORCE_DRAWER = "force_drawer",
|
|
52
|
+
SHOW_HIT_SUMMARY_GRAPH = "show_hit_summary_graph",
|
|
52
53
|
LAST_VIEW = "last_view",
|
|
53
54
|
ONLY_RULES = "only_rules",
|
|
54
55
|
PAGE_COUNT = "page_count",
|
package/utils/constants.js
CHANGED
|
@@ -54,6 +54,7 @@ export var StorageKey;
|
|
|
54
54
|
StorageKey["COMPACT_JSON"] = "compact_json_view";
|
|
55
55
|
StorageKey["FLATTEN_JSON"] = "flatten_json_view";
|
|
56
56
|
StorageKey["FORCE_DRAWER"] = "force_drawer";
|
|
57
|
+
StorageKey["SHOW_HIT_SUMMARY_GRAPH"] = "show_hit_summary_graph";
|
|
57
58
|
StorageKey["LAST_VIEW"] = "last_view";
|
|
58
59
|
StorageKey["ONLY_RULES"] = "only_rules";
|
|
59
60
|
StorageKey["PAGE_COUNT"] = "page_count";
|