From 34f52cb46a2fefe428618b5e9f7063f0d2e365c2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 22:08:48 +0000 Subject: [PATCH 01/14] Update eslint monorepo to v9 --- openbas-front/package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openbas-front/package.json b/openbas-front/package.json index cd3b681b93..8222b1a38c 100644 --- a/openbas-front/package.json +++ b/openbas-front/package.json @@ -80,8 +80,7 @@ }, "devDependencies": { "@babel/plugin-transform-modules-commonjs": "7.25.7", - "@eslint/eslintrc": "3.1.0", - "@eslint/js": "8.57.1", + "@eslint/js": "9.11.0", "@playwright/test": "1.48.2", "@stylistic/eslint-plugin": "1.8.1", "@testing-library/react": "14.3.1", @@ -101,7 +100,7 @@ "chokidar": "4.0.1", "cross-env": "7.0.3", "esbuild": "0.24.0", - "eslint": "8.57.1", + "eslint": "9.11.0", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-base": "15.0.0", "eslint-config-airbnb-typescript": "18.0.0", From ba7017f40cfe24e8e6fd1e99e39426e90b30f906 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Sun, 27 Oct 2024 22:04:47 +0100 Subject: [PATCH 02/14] [frontend] pass to flat config --- openbas-front/.eslintignore | 12 -- openbas-front/.eslintrc.cjs | 108 ----------------- openbas-front/eslint.config.js | 165 ++++++++++++++++++++++++++ openbas-front/package.json | 33 +++--- openbas-front/tests_e2e/.eslintrc.cjs | 15 --- 5 files changed, 181 insertions(+), 152 deletions(-) delete mode 100644 openbas-front/.eslintignore delete mode 100644 openbas-front/.eslintrc.cjs create mode 100644 openbas-front/eslint.config.js delete mode 100644 openbas-front/tests_e2e/.eslintrc.cjs diff --git a/openbas-front/.eslintignore b/openbas-front/.eslintignore deleted file mode 100644 index 75a5edbb49..0000000000 --- a/openbas-front/.eslintignore +++ /dev/null @@ -1,12 +0,0 @@ -/node_modules -/coverage -/packages -/public -/builder/dev/build -/builder/prod/build -/src/static/ext/* -__generated__ -/test-results/ -/playwright-report/ -/blob-report/ -/playwright/.cache/ \ No newline at end of file diff --git a/openbas-front/.eslintrc.cjs b/openbas-front/.eslintrc.cjs deleted file mode 100644 index 3565a12028..0000000000 --- a/openbas-front/.eslintrc.cjs +++ /dev/null @@ -1,108 +0,0 @@ -module.exports = { - root: true, - extends: [ - 'airbnb-base', - 'airbnb-typescript/base', - 'plugin:import/typescript', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react/recommended', - 'plugin:i18next/recommended', - ], - settings: { - react: { - version: 'detect', - }, - }, - parserOptions: { - ecmaVersion: 2020, - project: ['./tsconfig.json', './tsconfig.node.json'], - tsconfigRootDir: __dirname, - parser: '@typescript-eslint/parser', - }, - env: { - browser: true, - }, - overrides: [ - { - files: ['*.jsx', '*.js', '*.ts', '*.tsx'], - }, - ], - ignorePatterns: [ - '**/builder/**', - '**/coverage/**', - '**/node_module/**', - '**/packages/**', - '**/src/generated/**', - '**/__generated__/**', - '**/src/static/ext/**', - ], - plugins: ['import-newlines', 'i18next', 'custom-rules'], - rules: { - 'custom-rules/classes-rule': 1, - 'no-restricted-syntax': 0, - 'react/no-unused-prop-types': 0, - 'react/prop-types': 0, - 'max-classes-per-file': ['error', 2], - 'object-curly-newline': 'off', - 'arrow-body-style': 'off', - 'max-len': [ - 'error', 180, 2, { - ignoreUrls: true, - ignoreComments: false, - ignoreRegExpLiterals: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - }, - ], - 'no-restricted-imports': [ - 'error', { - patterns: [ - { - group: ['@mui/material/*', '!@mui/material/locale', '!@mui/material/styles', '!@mui/material/colors', '!@mui/material/transitions'], - message: 'Please use named import from @mui/material instead.', - }, - { - group: ['@mui/styles/*'], - message: 'Please use named import from @mui/styles instead.', - }, - ], - }, - ], - '@typescript-eslint/naming-convention': ['error', { - selector: 'variable', - format: ['camelCase', 'UPPER_CASE'], - leadingUnderscore: 'allow', - trailingUnderscore: 'allow', - filter: { - regex: '/([^_]*)/', - match: true, - }, - }], - 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': [ - 'error', - { - argsIgnorePattern: '^_', - varsIgnorePattern: '^_', - caughtErrorsIgnorePattern: '^_', - }, - ], - 'import-newlines/enforce': ['error', { items: 20, 'max-len': 180 }], - 'react/jsx-indent': [2, 2], - 'react/jsx-indent-props': [2, 2], - 'react/jsx-closing-bracket-location': 'error', - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: [ - '**/*.test.tsx', - '**/*.test.ts', - 'vite.config.ts', - 'vitest.config.ts', - 'playwright.config.ts', - ], - }, - ], - }, -}; diff --git a/openbas-front/eslint.config.js b/openbas-front/eslint.config.js new file mode 100644 index 0000000000..fe84fe2473 --- /dev/null +++ b/openbas-front/eslint.config.js @@ -0,0 +1,165 @@ +// imports to not let tools report them as unused +import 'eslint-import-resolver-oxc'; + +import js from '@eslint/js'; +import stylistic from '@stylistic/eslint-plugin'; +import i18next from 'eslint-plugin-i18next'; +import importPlugin from 'eslint-plugin-import'; +import playwright from 'eslint-plugin-playwright'; +import react from 'eslint-plugin-react'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import simpleImportSort from 'eslint-plugin-simple-import-sort'; +import globals from 'globals'; +import ts from 'typescript-eslint'; + +import customRules from './packages/eslint-plugin-custom-rules/lib/index.js'; + +export default [ + // rules recommended by @eslint/js + js.configs.recommended, + + // rules recommended by typescript-eslint + ...ts.configs.recommended, + + // rules recommended by eslint-plugin-react + react.configs.flat.recommended, + react.configs.flat['jsx-runtime'], + { + settings: { + react: { + version: 'detect', + }, + }, + }, + + // rules recommended by eslint-plugin-import + importPlugin.flatConfigs.recommended, + importPlugin.flatConfigs.typescript, + { + settings: { + 'import/resolver': 'oxc', + 'import/ignore': [ + 'react-apexcharts', // ignore react-apexcharts as the default export is broken + ], + }, + }, + + // rules recommended by @stylistic/eslint-plugin + // stylistic.configs.customize({ + // semi: true, + // }), + + // rules recommended by eslint-plugin-i18next + i18next.configs['flat/recommended'], + + // other config + { + plugins: { + // eslint-plugin-react-refresh + 'react-refresh': reactRefresh, + // eslint-plugin-simple-import-sort + // 'simple-import-sort': simpleImportSort, + // local package eslint-plugin-custom-rules + 'custom-rules': customRules, + }, + rules: { + // react-refresh rules + 'react-refresh/only-export-components': [ + 'warn', + { + allowConstantExport: true, + }, + ], + + // eslint-plugin-simple-import-sort rules + // 'simple-import-sort/imports': 'error', + // 'simple-import-sort/exports': 'error', + + // local package eslint-plugin-custom-rules rules + 'custom-rules/classes-rule': 1, + + // @typescript-eslint rules + '@typescript-eslint/naming-convention': ['error', { + selector: 'variable', + format: ['camelCase', 'UPPER_CASE'], + leadingUnderscore: 'allow', + trailingUnderscore: 'allow', + filter: { + regex: '/([^_]*)/', + match: true, + }, + }], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + '@typescript-eslint/no-use-before-define': 'error', + + // eslint-plugin-react rules + 'react/prop-types': 0, + + // @stylistic rules + // '@stylistic/brace-style': ['error', '1tbs'], + // '@stylistic/multiline-ternary': ['error', 'always-multiline', { ignoreJSX: true }], + + // eslint-plugin-import rules + 'import/no-named-as-default-member': 'off', + 'import/prefer-default-export': 'error', + 'import/namespace': 'off', + + // custom rules inspired from airbnb + 'sort-imports': 'off', + 'no-underscore-dangle': 'error', + 'no-await-in-loop': 'error', + 'no-param-reassign': 'error', + 'consistent-return': 'error', + 'default-case': 'error', + 'no-template-curly-in-string': 'error', + 'no-bitwise': 'error', + 'no-nested-ternary': 'error', + 'prefer-promise-reject-errors': 'error', + 'no-console': 'error', + }, + languageOptions: { + globals: { + ...globals.browser, + ...globals.commonjs, + ...globals.es2020, + process: true, + }, + }, + linterOptions: { + reportUnusedDisableDirectives: 'off', // to fix when eslint handle disable directive on missing rules on purpose + }, + }, + + // tests e2e config + { + files: ['tests_e2e/**/*'], + // rules recommended by eslint-plugin-playwright + ...playwright.configs['flat/recommended'], + }, + + // ignores patterns + { + ignores: [ + 'node_modules', + 'coverage', + 'packages', + 'public', + 'src/static/ext', + 'builder/prod/build', + 'builder/dev/build', + '__generated__', + 'test-results', + 'playwright-report', + 'blob-report', + 'playwright/.cache', + '.yarn', + ], + }, +]; diff --git a/openbas-front/package.json b/openbas-front/package.json index 8222b1a38c..eabf754f03 100644 --- a/openbas-front/package.json +++ b/openbas-front/package.json @@ -26,7 +26,7 @@ "apexcharts": "3.51.0", "axios": "1.7.7", "ckeditor5-custom-build": "link:packages/ckeditor5-custom-build", - "classcat": "^5.0.5", + "classcat": "5.0.5", "classnames": "2.5.1", "cronstrue": "2.50.0", "d3-hierarchy": "3.1.2", @@ -76,15 +76,15 @@ "uuid": "10.0.0", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz", "zod": "3.23.8", - "zustand": "^4.5.4" + "zustand": "4.5.4" }, "devDependencies": { - "@babel/plugin-transform-modules-commonjs": "7.25.7", - "@eslint/js": "9.11.0", + "@eslint/js": "9.13.0", "@playwright/test": "1.48.2", - "@stylistic/eslint-plugin": "1.8.1", + "@stylistic/eslint-plugin": "2.9.0", "@testing-library/react": "14.3.1", "@types/d3-hierarchy": "3.1.7", + "@types/eslint__js": "8.42.3", "@types/node": "20.17.1", "@types/pdfmake": "0.2.9", "@types/qs": "6", @@ -94,23 +94,21 @@ "@types/react-syntax-highlighter": "15", "@types/seamless-immutable": "7.1.19", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "7.18.0", - "@typescript-eslint/parser": "7.18.0", + "@typescript-eslint/parser": "8.11.0", "@vitejs/plugin-react": "4.3.0", "chokidar": "4.0.1", "cross-env": "7.0.3", "esbuild": "0.24.0", - "eslint": "9.11.0", - "eslint-config-airbnb": "19.0.4", - "eslint-config-airbnb-base": "15.0.0", - "eslint-config-airbnb-typescript": "18.0.0", - "eslint-config-react-app": "7.0.1", + "eslint": "9.13.0", + "eslint-import-resolver-oxc": "0.4.0", "eslint-plugin-custom-rules": "link:packages/eslint-plugin-custom-rules", - "eslint-plugin-i18next": "6.0.9", - "eslint-plugin-import": "2.29.1", + "eslint-plugin-i18next": "6.1.0", + "eslint-plugin-import": "2.31.0", "eslint-plugin-import-newlines": "1.4.0", - "eslint-plugin-playwright": "1.6.2", - "eslint-plugin-react": "7.34.1", + "eslint-plugin-playwright": "2.0.0", + "eslint-plugin-react": "7.37.2", + "eslint-plugin-react-refresh": "0.4.13", + "eslint-plugin-simple-import-sort": "^12.1.1", "express": "4.20.0", "fs-extra": "11.2.0", "globals": "15.9.0", @@ -118,6 +116,7 @@ "nyc": "17.0.0", "swagger-typescript-api": "13.0.22", "typescript": "5.6.2", + "typescript-eslint": "8.11.0", "vite": "5.4.7", "vite-plugin-istanbul": "6.0.2", "vitest": "2.1.1" @@ -129,7 +128,7 @@ "start": "vite", "deprecated-start": "node builder/dev/dev.js", "build": "node builder/prod/prod.js", - "lint": "cross-env DEBUG=eslint:cli-engine TIMING=1 eslint --max-warnings 0 --cache .", + "lint": "cross-env DEBUG=eslint:cli-engine TIMING=1 eslint --max-warnings 0 --cache . --rule \"{'import/namespace': 'error', 'import/no-cycle': 'error'}\"", "control": "yarn audit --groups dependencies --summary", "test": "vitest run", "check-ts": "tsc --noEmit", diff --git a/openbas-front/tests_e2e/.eslintrc.cjs b/openbas-front/tests_e2e/.eslintrc.cjs deleted file mode 100644 index f6a2bdd7f7..0000000000 --- a/openbas-front/tests_e2e/.eslintrc.cjs +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - extends: [ - 'plugin:playwright/recommended' - ], - "rules": { - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": [ - "**/*.ts" - ] - } - ] - } -} \ No newline at end of file From 89a291dbe087c3dbfc707c9ccd9e0ef607c38a44 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Sun, 27 Oct 2024 22:11:02 +0100 Subject: [PATCH 03/14] [frontend] react-codemod update-react-imports --- openbas-front/src/__tests__/App.test.tsx | 1 - openbas-front/src/admin/Index.tsx | 2 +- .../src/admin/components/Dashboard.tsx | 2 +- openbas-front/src/admin/components/MiniMap.js | 1 - .../src/admin/components/agents/Agents.tsx | 3 +- .../admin/components/assets/AssetStatus.tsx | 2 +- .../src/admin/components/assets/Index.tsx | 2 +- .../asset_groups/AssetGroupAddEndpoints.tsx | 2 +- .../asset_groups/AssetGroupCreation.tsx | 2 +- .../asset_groups/AssetGroupDialogAdding.tsx | 2 +- .../assets/asset_groups/AssetGroupForm.tsx | 3 +- .../asset_groups/AssetGroupManagement.tsx | 2 +- .../assets/asset_groups/AssetGroupPopover.tsx | 2 +- .../assets/asset_groups/AssetGroups.tsx | 30 +- .../assets/asset_groups/AssetGroupsList.tsx | 3 +- .../assets/asset_groups/DynamicAssetField.tsx | 2 +- .../assets/endpoints/EndpointCreation.tsx | 2 +- .../assets/endpoints/EndpointForm.tsx | 3 +- .../assets/endpoints/EndpointPopover.tsx | 3 +- .../components/assets/endpoints/Endpoints.tsx | 2 +- .../endpoints/EndpointsDialogAdding.tsx | 2 +- .../assets/endpoints/EndpointsList.tsx | 3 +- .../SecurityPlatformCreation.tsx | 2 +- .../SecurityPlatformForm.tsx | 3 +- .../SecurityPlatformPopover.tsx | 3 +- .../security_platforms/SecurityPlatforms.tsx | 2 +- .../atomic_testings/AtomicTestings.tsx | 2 +- .../atomic_testings/InjectDtoList.tsx | 2 +- .../atomic_testing/AtomicTesting.tsx | 2 +- .../atomic_testing/AtomicTestingDetail.tsx | 2 +- .../atomic_testing/AtomicTestingHeader.tsx | 2 +- .../atomic_testing/AtomicTestingPopover.tsx | 2 +- .../atomic_testing/AtomicTestingResult.tsx | 2 +- .../atomic_testing/AtomicTestingUpdate.tsx | 2 +- .../atomic_testings/atomic_testing/Index.tsx | 2 +- .../atomic_testing/TargetListItem.tsx | 2 +- .../atomic_testing/TargetResultsDetail.tsx | 3 +- .../types/nodes/NodeResultStep.tsx | 2 +- .../src/admin/components/common/ToolBar.js | 4 +- .../common/articles/ArticleAddDocuments.js | 2 +- .../components/common/articles/ArticleForm.js | 2 +- .../common/articles/ArticlePopover.js | 6 +- .../components/common/articles/Articles.tsx | 376 +++++++++--------- .../common/articles/CreateArticle.js | 2 +- .../common/challenges/ContextualChallenges.js | 2 +- .../common/entreprise_edition/EEChip.tsx | 2 +- .../common/entreprise_edition/EEField.tsx | 3 +- .../common/entreprise_edition/EEMenu.tsx | 2 +- .../common/entreprise_edition/EETooltip.tsx | 2 +- .../entreprise_edition/EnterpriseEdition.tsx | 1 - .../EnterpriseEditionAgreement.tsx | 2 +- .../EnterpriseEditionButton.tsx | 2 +- .../filters/InjectorContractSwitchFilter.tsx | 3 +- .../common/filters/KillChainPhasesFilter.js | 2 +- .../components/common/filters/MitreFilter.tsx | 2 +- .../components/common/filters/TagsFilter.js | 2 +- .../components/common/form/TextFieldAskAI.tsx | 3 +- .../common/injects/CreateInject.tsx | 2 +- .../common/injects/CreateInjectDetails.js | 2 +- .../injects/ExerciseInjectsDistribution.tsx | 2 +- .../ImportUploaderInjectFromInjectsTest.tsx | 2 +- .../injects/ImportUploaderInjectFromXls.tsx | 2 +- .../ImportUploaderInjectFromXlsFile.tsx | 2 +- .../ImportUploaderInjectFromXlsInjects.tsx | 2 +- .../common/injects/InjectAddArticles.tsx | 2 +- .../common/injects/InjectAddChallenges.tsx | 2 +- .../common/injects/InjectAddTeams.tsx | 2 +- .../common/injects/InjectChainsForm.tsx | 3 +- .../common/injects/InjectDefinition.js | 2 +- .../injects/InjectDistributionByTeam.tsx | 2 +- .../injects/InjectDistributionByType.tsx | 2 +- .../components/common/injects/InjectForm.js | 2 +- .../components/common/injects/InjectIcon.js | 1 - .../common/injects/InjectPopover.tsx | 3 +- .../common/injects/InjectStatusDetails.js | 2 +- .../common/injects/InjectorContract.js | 2 +- .../components/common/injects/Injects.tsx | 3 +- .../common/injects/InjectsDistribution.tsx | 2 +- .../common/injects/InjectsListButtons.tsx | 2 +- .../components/common/injects/ResponsePie.tsx | 2 +- .../injects/ScenarioInjectsDistribution.tsx | 2 +- .../common/injects/UpdateInject.tsx | 3 +- .../common/injects/UpdateInjectDetails.js | 2 +- .../injects/UpdateInjectLogicalChains.tsx | 2 +- .../expectations/ExpectationFormCreate.tsx | 2 +- .../expectations/ExpectationFormUpdate.tsx | 2 +- .../expectations/ExpectationPopover.tsx | 3 +- .../injects/expectations/ExpectationUtils.tsx | 1 - .../expectations/InjectAddExpectation.tsx | 2 +- .../expectations/InjectExpectations.tsx | 2 +- .../field/ExpectationGroupField.tsx | 3 +- .../common/injects/teams/InjectTeamsList.tsx | 2 +- .../common/matrix/AttackPatternBox.tsx | 3 +- .../common/matrix/KillChainPhaseColumn.tsx | 2 +- .../components/common/matrix/MitreMatrix.tsx | 2 +- .../common/matrix/MitreMatrixDummy.tsx | 2 +- .../common/simulate/DefinitionMenu.tsx | 2 +- .../common/simulate/EmailParametersForm.tsx | 3 +- .../components/common/simulate/HeaderTags.tsx | 2 +- .../common/simulate/PaperMetric.tsx | 3 +- .../admin/components/common/tags/TagChip.tsx | 2 +- .../src/admin/components/components/Index.tsx | 2 +- .../components/challenges/ChallengeForm.js | 2 +- .../components/challenges/ChallengePopover.js | 4 +- .../components/challenges/Challenges.js | 1 - .../components/challenges/CreateChallenge.js | 2 +- .../components/components/channels/Channel.js | 1 - .../components/channels/ChannelAddLogo.tsx | 3 +- .../components/channels/ChannelForm.js | 2 +- .../components/channels/ChannelHeader.js | 1 - .../components/channels/ChannelIcon.js | 2 +- .../channels/ChannelOverviewMicroblogging.js | 22 +- .../channels/ChannelOverviewNewspaper.js | 26 +- .../channels/ChannelOverviewTvChannel.js | 1 - .../channels/ChannelParametersForm.js | 2 +- .../components/channels/ChannelPopover.tsx | 3 +- .../components/channels/Channels.tsx | 2 +- .../components/channels/ChannelsFilter.tsx | 3 +- .../components/channels/CreateChannel.js | 2 +- .../components/components/channels/Index.tsx | 2 +- .../components/documents/CreateDocument.js | 2 +- .../components/documents/DocumentForm.js | 1 - .../components/documents/DocumentPopover.js | 2 +- .../components/documents/DocumentType.js | 2 +- .../components/documents/Documents.js | 2 +- .../lessons/CreateLessonsTemplate.tsx | 2 +- .../components/components/lessons/Index.tsx | 1 - .../components/lessons/LessonsTemplate.tsx | 1 - .../lessons/LessonsTemplateForm.tsx | 2 +- .../lessons/LessonsTemplateHeader.tsx | 1 - .../lessons/LessonsTemplatePopover.tsx | 3 +- .../components/lessons/LessonsTemplates.tsx | 2 +- .../CreateLessonsTemplateCategory.tsx | 2 +- .../LessonsTemplateCategoryForm.tsx | 2 +- .../LessonsTemplateCategoryPopover.tsx | 2 +- .../CreateLessonsTemplateQuestion.tsx | 2 +- .../questions/LessonsTemplateQuestionForm.tsx | 2 +- .../LessonsTemplateQuestionPopover.tsx | 2 +- .../components/reports/ReportComment.tsx | 3 +- .../components/reports/ReportPopover.tsx | 3 +- .../components/components/reports/Reports.tsx | 3 +- .../components/teams/ContextualTeams.tsx | 3 +- .../components/teams/CreateTeam.tsx | 2 +- .../components/teams/TeamAddPlayers.tsx | 3 +- .../components/components/teams/TeamForm.tsx | 2 +- .../components/teams/TeamPlayers.tsx | 3 +- .../components/teams/TeamPopover.tsx | 3 +- .../components/components/teams/Teams.tsx | 2 +- .../components/teams/UpdateTeams.tsx | 3 +- .../components/variables/CreateVariable.tsx | 3 +- .../components/variables/VariableForm.tsx | 2 +- .../components/variables/VariablePopover.tsx | 3 +- .../components/variables/Variables.tsx | 2 +- .../admin/components/injects/InjectHeader.tsx | 2 +- .../components/injects/InjectTestDetail.tsx | 2 +- .../components/injects/InjectTestList.tsx | 2 +- .../components/injects/InjectTestPopover.tsx | 3 +- .../injects/InjectTestReplayAll.tsx | 2 +- .../components/integrations/Collectors.tsx | 1 - .../components/integrations/Executors.tsx | 1 - .../admin/components/integrations/Index.tsx | 2 +- .../components/integrations/Injectors.tsx | 1 - .../integrations/injectors/Index.tsx | 2 +- .../injectors/InjectorContracts.js | 2 +- .../integrations/injectors/InjectorHeader.js | 1 - .../CreateInjectorContract.js | 2 +- .../InjectorContractCustomForm.js | 2 +- .../InjectorContractForm.js | 1 - .../InjectorContractPopover.js | 2 +- .../components/lessons/CreateObjective.js | 2 +- .../lessons/ObjectiveEvaluations.js | 2 +- .../admin/components/lessons/ObjectiveForm.js | 2 +- .../components/lessons/ObjectivePopover.js | 2 +- .../components/lessons/SendLessonsForm.js | 2 +- .../categories/CreateLessonsCategory.js | 4 +- .../categories/LessonsCategoryAddTeams.js | 2 +- .../lessons/categories/LessonsCategoryForm.js | 1 - .../categories/LessonsCategoryPopover.js | 4 +- .../questions/CreateLessonsQuestion.js | 4 +- .../questions/LessonsQuestionForm.js | 1 - .../questions/LessonsQuestionPopover.js | 4 +- .../exercises/AnswersByQuestionDialog.tsx | 2 +- .../components/lessons/exercises/Lessons.tsx | 3 +- .../lessons/exercises/LessonsCategories.js | 2 +- .../lessons/exercises/LessonsObjectives.js | 1 - .../components/lessons/scenarios/Lessons.tsx | 3 +- .../lessons/scenarios/LessonsCategories.js | 2 +- .../lessons/scenarios/LessonsObjectives.js | 1 - .../mitigations/CreateMitigation.js | 2 +- .../components/mitigations/MitigationForm.js | 1 - .../mitigations/MitigationPopover.js | 2 +- .../components/mitigations/Mitigations.js | 2 +- .../src/admin/components/nav/LeftBar.tsx | 2 +- .../src/admin/components/nav/TopBar.tsx | 3 +- .../components/payloads/CreatePayload.js | 2 +- .../admin/components/payloads/PayloadForm.tsx | 2 +- .../components/payloads/PayloadPopover.js | 2 +- .../admin/components/payloads/Payloads.tsx | 2 +- .../src/admin/components/profile/Index.js | 1 - .../admin/components/profile/PasswordForm.js | 2 +- .../admin/components/profile/ProfileForm.js | 2 +- .../src/admin/components/profile/UserForm.js | 1 - .../scenarios/ImportUploaderScenario.tsx | 1 - .../components/scenarios/ScenarioCreation.tsx | 2 +- .../components/scenarios/ScenarioForm.tsx | 2 +- .../admin/components/scenarios/Scenarios.tsx | 2 +- .../components/scenarios/ScenariosCard.tsx | 2 +- .../components/scenarios/scenario/Index.tsx | 2 +- .../scenarios/scenario/Scenario.tsx | 3 +- .../scenarios/scenario/ScenarioDefinition.tsx | 1 - .../ScenarioDistributionByExercise.tsx | 2 +- .../scenario/ScenarioExportDialog.tsx | 2 +- .../scenarios/scenario/ScenarioHeader.tsx | 3 +- .../scenarios/scenario/ScenarioPopover.tsx | 2 +- .../scenario/ScenarioRecurringFormDialog.tsx | 3 +- .../scenarios/scenario/ScenarioStatus.tsx | 2 +- .../scenarios/scenario/ScenarioUpdate.tsx | 3 +- .../scenario/articles/ScenarioArticles.tsx | 1 - .../challenges/ScenarioChallenges.tsx | 1 - .../scenario/injects/ScenarioInjects.tsx | 2 +- .../scenario/lessons/ScenarioLessons.tsx | 1 - .../scenario/teams/ScenarioTeams.tsx | 3 +- .../scenario/tests/ScenarioTests.tsx | 2 +- .../scenario/variables/ScenarioVariables.tsx | 2 +- .../components/search/FullTextSearch.tsx | 3 +- .../components/settings/DataIngestionMenu.tsx | 1 - .../src/admin/components/settings/Index.tsx | 1 - .../admin/components/settings/Parameters.tsx | 1 - .../components/settings/ParametersForm.js | 1 - .../components/settings/SecurityMenu.tsx | 2 +- .../components/settings/TaxonomiesMenu.tsx | 2 +- .../admin/components/settings/ThemeForm.tsx | 2 +- .../attack_patterns/AttackPatternForm.js | 1 - .../attack_patterns/AttackPatternPopover.js | 2 +- .../attack_patterns/AttackPatterns.js | 2 +- .../attack_patterns/CreateAttackPattern.js | 2 +- .../data_ingestion/ImportUploaderMapper.tsx | 1 - .../data_ingestion/XlsMapperPopover.tsx | 2 +- .../settings/data_ingestion/XlsMappers.tsx | 2 +- .../data_ingestion/xls_mapper/MapperForm.tsx | 3 +- .../xls_mapper/RulesContractContent.tsx | 3 +- .../xls_mapper/XlsMapperCreation.tsx | 3 +- .../xls_mapper/XlsMapperTestDialog.tsx | 2 +- .../xls_mapper/XlsMapperUpdate.tsx | 2 +- .../components/settings/groups/CreateGroup.js | 2 +- .../components/settings/groups/GroupForm.js | 2 +- .../settings/groups/GroupPopover.js | 2 +- .../components/settings/groups/Groups.js | 2 +- .../kill_chain_phases/CreateKillChainPhase.js | 2 +- .../kill_chain_phases/KillChainPhaseForm.js | 2 +- .../KillChainPhasePopover.js | 2 +- .../kill_chain_phases/KillChainPhases.js | 2 +- .../components/settings/policies/Policies.tsx | 2 +- .../settings/policies/PolicyForm.tsx | 3 +- .../components/settings/tags/CreateTag.js | 2 +- .../admin/components/settings/tags/TagForm.js | 2 +- .../components/settings/tags/TagPopover.js | 4 +- .../admin/components/settings/tags/Tags.js | 2 +- .../components/settings/users/CreateUser.js | 4 +- .../components/settings/users/UserForm.js | 1 - .../settings/users/UserPasswordForm.js | 2 +- .../components/settings/users/UserPopover.js | 4 +- .../admin/components/settings/users/Users.js | 2 +- .../components/simulations/ExerciseList.tsx | 3 +- .../components/simulations/Exercises.tsx | 2 +- .../simulations/ImportUploaderExercise.tsx | 1 - .../simulations/simulation/AnimationMenu.tsx | 2 +- .../simulation/ExerciseCreation.tsx | 2 +- .../simulation/ExerciseCreationForm.tsx | 2 +- .../simulation/ExerciseDateForm.tsx | 3 +- .../simulation/ExerciseDatePopover.tsx | 3 +- .../simulation/ExerciseDefinition.tsx | 1 - .../simulations/simulation/ExerciseHeader.tsx | 2 +- .../simulation/ExerciseMainInformation.tsx | 2 +- .../simulation/ExercisePopover.tsx | 3 +- .../simulations/simulation/ExerciseStatus.tsx | 2 +- .../simulation/ExerciseUpdateForm.tsx | 2 +- .../simulations/simulation/Index.tsx | 2 +- .../simulation/articles/ExerciseArticles.tsx | 1 - .../challenges/ExerciseChallenges.tsx | 1 - .../simulations/simulation/chat/Chat.js | 1 - .../simulation/controls/Comcheck.js | 2 +- .../simulation/controls/ComcheckForm.js | 2 +- .../simulation/controls/ComcheckState.js | 2 +- .../controls/ComcheckStatusState.js | 2 +- .../simulation/controls/CreateControl.tsx | 4 +- .../simulations/simulation/controls/Dryrun.js | 1 - .../simulation/controls/DryrunForm.js | 2 +- .../simulation/controls/DryrunProgress.js | 2 +- .../simulation/controls/DryrunStatus.js | 2 +- .../definition/ExerciseControlComChecks.tsx | 2 +- .../definition/ExerciseControlDryRuns.tsx | 2 +- .../definition/ExerciseInformation.tsx | 2 +- .../definition/ExerciseSettings.tsx | 1 - .../simulation/injects/CreateQuickInject.js | 2 +- .../simulation/injects/ExerciseInjects.tsx | 2 +- .../simulation/injects/InjectIndex.tsx | 2 +- .../simulation/injects/QuickInject.js | 4 +- .../asset_groups/InjectAddAssetGroups.tsx | 2 +- .../injects/endpoints/InjectAddEndpoints.tsx | 2 +- .../simulation/lessons/ExerciseLessons.tsx | 1 - .../simulations/simulation/logs/LogForm.js | 2 +- .../simulations/simulation/logs/LogPopover.js | 2 +- .../simulations/simulation/logs/Logs.js | 2 +- .../simulation/mails/Communication.js | 2 +- .../simulation/mails/CommunicationForm.js | 1 - .../simulations/simulation/mails/Inject.js | 2 +- .../mails/MailDistributionByInject.tsx | 2 +- .../mails/MailDistributionByPlayer.tsx | 2 +- .../mails/MailDistributionByTeam.tsx | 2 +- .../mails/MailDistributionOverTimeChart.tsx | 2 +- .../mails/MailDistributionOverTimeLine.tsx | 2 +- .../simulations/simulation/mails/Mails.js | 2 +- .../simulation/overview/Exercise.tsx | 2 +- .../overview/ExerciseDistribution.tsx | 2 +- ...ExerciseDistributionByInjectorContract.tsx | 2 +- .../ExerciseDistributionScoreByInject.tsx | 2 +- ...xerciseDistributionScoreByOrganization.tsx | 2 +- .../ExerciseDistributionScoreByPlayer.tsx | 2 +- .../ExerciseDistributionScoreByTeam.tsx | 2 +- ...iseDistributionScoreByTeamInPercentage.tsx | 2 +- ...ibutionScoreOverTimeByInjectorContract.tsx | 2 +- ...xerciseDistributionScoreOverTimeByTeam.tsx | 2 +- ...ibutionScoreOverTimeByTeamInPercentage.tsx | 2 +- .../simulation/reports/ExerciseReportForm.tsx | 2 +- .../simulation/reports/ExerciseReportPage.tsx | 3 +- .../simulation/reports/ExerciseReports.tsx | 3 +- .../simulation/reports/InjectReportResult.tsx | 3 +- .../simulation/teams/ExerciseTeams.tsx | 3 +- .../simulation/tests/ExerciseTests.tsx | 2 +- .../timeline/InjectOverTimeArea.tsx | 2 +- .../timeline/InjectOverTimeLine.tsx | 2 +- .../simulation/timeline/TimelineOverview.tsx | 2 +- .../simulation/validation/Validations.js | 4 +- .../validation/common/TeamOrAssetLine.tsx | 2 +- .../expectations/ChallengeExpectation.tsx | 2 +- .../expectations/ChannelExpectation.tsx | 2 +- ...onPreventionExpectationsValidationForm.tsx | 2 +- .../expectations/ExpectationLine.tsx | 2 +- .../expectations/ManualExpectations.tsx | 3 +- .../ManualExpectationsValidationForm.tsx | 2 +- .../validation/expectations/ResultChip.tsx | 2 +- .../TechnicalExpectationAsset.tsx | 2 +- .../TechnicalExpectationAssetGroup.tsx | 2 +- .../variables/AvailableVariablesDialog.tsx | 3 +- .../variables/ExerciseVariables.tsx | 2 +- .../src/admin/components/teams/Index.tsx | 2 +- .../admin/components/teams/Organizations.tsx | 2 +- .../src/admin/components/teams/Players.tsx | 2 +- .../src/admin/components/teams/Teams.tsx | 3 +- .../teams/organizations/CreateOrganization.js | 4 +- .../teams/organizations/OrganizationForm.js | 2 +- .../organizations/OrganizationPopover.js | 4 +- .../components/teams/players/CreatePlayer.tsx | 2 +- .../components/teams/players/PlayerForm.tsx | 2 +- .../teams/players/PlayerPopover.tsx | 3 +- openbas-front/src/app.tsx | 1 - .../src/components/AppIntlProvider.js | 2 +- .../src/components/AppThemeProvider.tsx | 3 +- .../src/components/AttackPatternField.tsx | 4 +- openbas-front/src/components/Autocomplete.js | 1 - openbas-front/src/components/Breadcrumbs.tsx | 2 +- .../src/components/ChainedTimeline.tsx | 3 +- openbas-front/src/components/CheckboxField.js | 1 - .../src/components/ColorPickerField.tsx | 2 +- openbas-front/src/components/Countdown.js | 2 +- openbas-front/src/components/CountryField.js | 2 +- .../components/CustomTimelineBackground.tsx | 2 +- .../src/components/CustomTimelinePanel.tsx | 2 +- openbas-front/src/components/CustomTooltip.js | 2 +- .../src/components/DateTimePicker.js | 1 - .../components/DeprecatedColorPickerField.js | 4 +- openbas-front/src/components/DocumentField.js | 2 +- openbas-front/src/components/Empty.js | 2 - openbas-front/src/components/Error.js | 2 +- openbas-front/src/components/ExerciseField.js | 1 - .../src/components/ExpandableHtml.js | 2 +- .../src/components/ExpandableMarkdown.tsx | 2 +- .../src/components/ExpandableText.js | 2 +- .../src/components/ExportPdfButton.tsx | 3 +- .../src/components/ExternalLinkPopover.tsx | 2 +- openbas-front/src/components/FieldOrEmpty.tsx | 2 +- openbas-front/src/components/FileField.js | 2 +- .../components/InjectContractComponent.tsx | 3 +- openbas-front/src/components/ItemBoolean.js | 1 - openbas-front/src/components/ItemCategory.tsx | 2 +- openbas-front/src/components/ItemCopy.tsx | 2 +- .../src/components/ItemMainFocus.tsx | 2 +- .../src/components/ItemNumberDifference.js | 2 +- openbas-front/src/components/ItemResult.tsx | 2 +- openbas-front/src/components/ItemSeverity.tsx | 2 +- openbas-front/src/components/ItemStatus.tsx | 2 +- openbas-front/src/components/ItemTags.js | 4 +- openbas-front/src/components/ItemTargets.tsx | 2 +- .../src/components/KillChainPhaseField.js | 2 +- openbas-front/src/components/Loader.js | 2 +- .../src/components/MarkdownDisplay.tsx | 2 +- openbas-front/src/components/Message.js | 2 +- openbas-front/src/components/NotFound.tsx | 1 - .../src/components/OldAttackPatternField.js | 2 +- .../src/components/OrganizationField.js | 2 +- openbas-front/src/components/PayloadIcon.tsx | 2 +- .../src/components/PlatformField.tsx | 2 +- openbas-front/src/components/PlatformIcon.tsx | 2 +- openbas-front/src/components/PlayerField.js | 2 +- .../src/components/ProgressBarCountdown.js | 2 +- .../src/components/RedirectManager.tsx | 3 +- .../src/components/RegexComponent.tsx | 2 +- .../src/components/ScenarioField.jsx | 1 - openbas-front/src/components/SearchFilter.tsx | 2 +- openbas-front/src/components/TagField.js | 2 +- openbas-front/src/components/Timeline.tsx | 216 +++++----- openbas-front/src/components/TruncatedText.js | 1 - .../src/components/common/ButtonCreate.tsx | 2 +- .../src/components/common/ButtonPopover.tsx | 3 +- .../src/components/common/ChipInList.tsx | 2 +- .../src/components/common/CodeBlock.tsx | 2 +- .../components/common/CustomFileUploader.tsx | 2 +- .../src/components/common/Dialog.tsx | 3 +- .../src/components/common/DialogDelete.tsx | 2 +- .../src/components/common/DialogDuplicate.tsx | 2 +- .../src/components/common/DialogTest.tsx | 2 +- .../src/components/common/DialogWithCross.tsx | 3 +- .../src/components/common/Drawer.tsx | 3 +- .../src/components/common/ExpendableText.tsx | 2 +- .../src/components/common/ExportButton.tsx | 1 - .../src/components/common/IconPopover.tsx | 2 +- .../src/components/common/ImportUploader.tsx | 2 +- .../common/ListItemButtonCreate.tsx | 2 +- openbas-front/src/components/common/Paper.tsx | 3 +- .../src/components/common/RightMenu.tsx | 3 +- .../src/components/common/SelectList.tsx | 3 +- .../src/components/common/SortHeadersList.tsx | 3 +- .../src/components/common/TopMenu.tsx | 2 +- .../src/components/common/Transition.tsx | 3 +- .../src/components/common/chips/ChipUtils.tsx | 4 - .../components/common/chips/ClickableChip.tsx | 2 +- .../common/chips/ClickableChipPopover.tsx | 2 +- .../common/chips/ClickableModeChip.tsx | 2 +- .../common/pagination/PaginationComponent.tsx | 3 +- .../pagination/SortHeadersComponent.tsx | 2 +- .../queryable/filter/FilterAutocomplete.tsx | 4 +- .../common/queryable/filter/FilterChip.tsx | 2 +- .../queryable/filter/FilterChipPopover.tsx | 2 +- .../filter/FilterChipPopoverInput.tsx | 4 +- .../queryable/filter/FilterChipValues.tsx | 2 +- .../common/queryable/filter/FilterChips.tsx | 8 +- .../common/queryable/filter/FilterField.tsx | 2 +- .../common/queryable/filter/FilterUtils.tsx | 1 - .../filter/specific/ScenarioStatusFilter.tsx | 2 +- .../pagination/PaginationComponentV2.tsx | 3 +- .../pagination/TablePaginationComponent.tsx | 2 +- .../pagination/TablePaginationComponentV2.tsx | 3 +- .../pagination/usPaginationState.tsx | 3 +- .../queryable/sort/SortHeadersComponentV2.tsx | 2 +- .../textSearch/TextSearchComponent.tsx | 2 +- .../src/components/fields/DocumentField.tsx | 2 +- .../src/components/fields/FileLoader.tsx | 3 +- .../components/fields/FileTransferDialog.tsx | 3 +- .../src/components/fields/MarkDownField.tsx | 3 +- .../fields/MarkDownFieldController.tsx | 2 +- .../components/fields/MultipleFileLoader.tsx | 2 +- .../components/fields/OldMarkDownField.tsx | 2 +- .../src/components/fields/OldSelectField.jsx | 1 - .../src/components/fields/OldTextField.jsx | 1 - .../src/components/fields/RichTextField.jsx | 1 - .../fields/SecurityPlatformField.tsx | 2 +- .../src/components/fields/SelectField.jsx | 1 - .../components/fields/SimpleRichTextField.jsx | 1 - .../src/components/fields/SliderField.js | 1 - .../src/components/fields/SwitchField.js | 1 - .../src/components/fields/TagField.tsx | 2 +- .../src/components/fields/TextField.js | 1 - openbas-front/src/components/i18n.js | 2 +- .../src/components/nodes/NodeInject.tsx | 3 +- .../src/components/nodes/NodePhantom.tsx | 2 +- .../src/components/scalebar/ScaleBar.tsx | 2 +- openbas-front/src/index.tsx | 6 +- openbas-front/src/private/Index.tsx | 1 - .../src/private/components/Dashboard.js | 1 - .../src/private/components/nav/TopBar.tsx | 3 +- openbas-front/src/public/Index.tsx | 2 +- openbas-front/src/public/Root.tsx | 1 - .../components/challenges/Challenges.js | 1 - .../components/challenges/ChallengesPlayer.js | 2 +- .../challenges/ChallengesPreview.js | 2 +- .../src/public/components/channels/Channel.js | 1 - .../channels/ChannelMicroblogging.js | 1 - .../components/channels/ChannelNewspaper.js | 4 +- .../components/channels/ChannelPlayer.js | 2 +- .../components/channels/ChannelPreview.js | 2 +- .../components/channels/ChannelTvChannel.js | 1 - .../public/components/comcheck/Comcheck.js | 2 +- .../lessons/ExerciseViewLessons.tsx | 2 +- .../components/lessons/LessonsPlayer.js | 2 +- .../components/lessons/LessonsPreview.js | 1 - .../lessons/ScenarioViewLessons.tsx | 2 +- .../src/public/components/login/Login.js | 2 +- .../public/components/login/LoginError.tsx | 2 +- .../src/public/components/login/LoginForm.js | 1 - .../components/login/LoginSSOButton.tsx | 2 +- .../src/public/components/login/Reset.js | 2 +- .../systembanners/SystemBanners.tsx | 1 - openbas-front/src/root.tsx | 2 +- openbas-front/src/utils/Environment.js | 4 +- openbas-front/src/utils/SortingFiltering.js | 2 +- openbas-front/src/utils/ai/ResponseDialog.tsx | 2 +- openbas-front/src/utils/hooks/useAuth.ts | 4 +- .../src/utils/hooks/useEntityIcon.tsx | 1 - .../src/utils/hooks/useEntityToggle.ts | 3 +- 510 files changed, 873 insertions(+), 876 deletions(-) diff --git a/openbas-front/src/__tests__/App.test.tsx b/openbas-front/src/__tests__/App.test.tsx index 13b9d6d8d7..d46169e9b1 100644 --- a/openbas-front/src/__tests__/App.test.tsx +++ b/openbas-front/src/__tests__/App.test.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { act, cleanup, render } from '@testing-library/react'; import { describe, afterEach, it, expect } from 'vitest'; import { StyledEngineProvider } from '@mui/material/styles'; diff --git a/openbas-front/src/admin/Index.tsx b/openbas-front/src/admin/Index.tsx index d7cebc2154..ad2e1807fe 100644 --- a/openbas-front/src/admin/Index.tsx +++ b/openbas-front/src/admin/Index.tsx @@ -1,4 +1,4 @@ -import React, { lazy, Suspense } from 'react'; +import { lazy, Suspense } from 'react'; import { Route, Routes, useNavigate } from 'react-router-dom'; import { makeStyles, useTheme } from '@mui/styles'; import { Box } from '@mui/material'; diff --git a/openbas-front/src/admin/components/Dashboard.tsx b/openbas-front/src/admin/components/Dashboard.tsx index 2b5e61c513..64aa901c59 100644 --- a/openbas-front/src/admin/components/Dashboard.tsx +++ b/openbas-front/src/admin/components/Dashboard.tsx @@ -1,5 +1,5 @@ import { Grid, Paper, Theme, Typography } from '@mui/material'; -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import * as R from 'ramda'; import { ComputerOutlined, HubOutlined, MovieFilterOutlined, PersonOutlined } from '@mui/icons-material'; import { makeStyles, useTheme } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/MiniMap.js b/openbas-front/src/admin/components/MiniMap.js index 83b237136c..63f61d94b8 100644 --- a/openbas-front/src/admin/components/MiniMap.js +++ b/openbas-front/src/admin/components/MiniMap.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { withTheme, withStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/agents/Agents.tsx b/openbas-front/src/admin/components/agents/Agents.tsx index 0183bc2ac8..47c3dc0d9e 100644 --- a/openbas-front/src/admin/components/agents/Agents.tsx +++ b/openbas-front/src/admin/components/agents/Agents.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Alert, diff --git a/openbas-front/src/admin/components/assets/AssetStatus.tsx b/openbas-front/src/admin/components/assets/AssetStatus.tsx index 2cd230f0c8..25400ed5a9 100644 --- a/openbas-front/src/admin/components/assets/AssetStatus.tsx +++ b/openbas-front/src/admin/components/assets/AssetStatus.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { Chip } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { useFormatter } from '../../../components/i18n'; diff --git a/openbas-front/src/admin/components/assets/Index.tsx b/openbas-front/src/admin/components/assets/Index.tsx index 031d1b01f4..43d557a0ff 100644 --- a/openbas-front/src/admin/components/assets/Index.tsx +++ b/openbas-front/src/admin/components/assets/Index.tsx @@ -1,4 +1,4 @@ -import React, { Suspense, lazy } from 'react'; +import { Suspense, lazy } from 'react'; import { makeStyles } from '@mui/styles'; import { Navigate, Route, Routes } from 'react-router-dom'; import { errorWrapper } from '../../../components/Error'; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupAddEndpoints.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupAddEndpoints.tsx index 1f9b06981a..fc1ace4c09 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupAddEndpoints.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupAddEndpoints.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useAppDispatch } from '../../../../utils/hooks'; import { updateAssetsOnAssetGroup } from '../../../../actions/asset_groups/assetgroup-action'; import ButtonCreate from '../../../../components/common/ButtonCreate'; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupCreation.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupCreation.tsx index 4126b4f3cc..be83a6b173 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupCreation.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupCreation.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { ListItemButton, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupDialogAdding.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupDialogAdding.tsx index 0a96fc7f58..d45d5806a8 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupDialogAdding.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupDialogAdding.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useEffect, useMemo, useState } from 'react'; +import { FunctionComponent, useEffect, useMemo, useState } from 'react'; import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; import { SelectGroup } from 'mdi-material-ui'; import Transition from '../../../../components/common/Transition'; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupForm.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupForm.tsx index 37962ac7ec..bf1a3e04a4 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupForm.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupForm.tsx @@ -1,6 +1,7 @@ import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { Button, TextField } from '@mui/material'; -import React, { SyntheticEvent } from 'react'; +import { SyntheticEvent } from 'react'; +import * as React from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupManagement.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupManagement.tsx index cdfe5915c3..a08e22cf1b 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupManagement.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupManagement.tsx @@ -1,6 +1,6 @@ import { IconButton, Typography } from '@mui/material'; import { CloseRounded } from '@mui/icons-material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import type { Theme } from '../../../../components/Theme'; import TagsFilter from '../../common/filters/TagsFilter'; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupPopover.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupPopover.tsx index 8da1f2f824..ef12aa8f28 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupPopover.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupPopover.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { Drawer as MuiDrawer, IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroups.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroups.tsx index 3c1530e947..586a240135 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroups.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroups.tsx @@ -1,5 +1,5 @@ import { makeStyles } from '@mui/styles'; -import React, { CSSProperties, useMemo, useState } from 'react'; +import { Fragment, CSSProperties, useMemo, useState } from 'react'; import { Box, Chip, Drawer as MuiDrawer, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { SelectGroup } from 'mdi-material-ui'; import { useSearchParams } from 'react-router-dom'; @@ -73,21 +73,19 @@ const inlineStyles: Record = { const computeRuleValues = (assetGroup: AssetGroupOutput, t: (value: string) => string) => { const computeDynamic = () => { if (assetGroup.asset_group_dynamic_filter?.filters && assetGroup.asset_group_dynamic_filter?.filters.length > 0) { - return ( - <> - {assetGroup.asset_group_dynamic_filter.filters.map((filter, idx) => ( - - {idx !== 0 && } - } - /> - ))} - - ); + return <> + {assetGroup.asset_group_dynamic_filter.filters.map((filter, idx) => ( + + {idx !== 0 && } + } + /> + ))} + ; } return (<>); }; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupsList.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupsList.tsx index 5e18f62b82..fa204ee5ff 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupsList.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupsList.tsx @@ -1,4 +1,5 @@ -import React, { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; +import { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; +import * as React from 'react'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { SelectGroup } from 'mdi-material-ui'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/assets/asset_groups/DynamicAssetField.tsx b/openbas-front/src/admin/components/assets/asset_groups/DynamicAssetField.tsx index 2e500f8e23..4fa59c3cdf 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/DynamicAssetField.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/DynamicAssetField.tsx @@ -1,6 +1,6 @@ import { InputLabel, Tooltip } from '@mui/material'; import { InfoOutlined } from '@mui/icons-material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import FilterField from '../../../../components/common/queryable/filter/FilterField'; import useFiltersState from '../../../../components/common/queryable/filter/useFiltersState'; import { emptyFilterGroup } from '../../../../components/common/queryable/filter/FilterUtils'; diff --git a/openbas-front/src/admin/components/assets/endpoints/EndpointCreation.tsx b/openbas-front/src/admin/components/assets/endpoints/EndpointCreation.tsx index 917d2890b8..946505f272 100644 --- a/openbas-front/src/admin/components/assets/endpoints/EndpointCreation.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/EndpointCreation.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { ListItemButton, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/assets/endpoints/EndpointForm.tsx b/openbas-front/src/admin/components/assets/endpoints/EndpointForm.tsx index 4711e254ec..a094bc8849 100644 --- a/openbas-front/src/admin/components/assets/endpoints/EndpointForm.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/EndpointForm.tsx @@ -1,6 +1,7 @@ import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { Button, FormHelperText, MenuItem, TextField } from '@mui/material'; -import React, { FormEventHandler, SyntheticEvent } from 'react'; +import { FormEventHandler, SyntheticEvent } from 'react'; +import * as React from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { DateTimePicker as MuiDateTimePicker } from '@mui/x-date-pickers'; diff --git a/openbas-front/src/admin/components/assets/endpoints/EndpointPopover.tsx b/openbas-front/src/admin/components/assets/endpoints/EndpointPopover.tsx index e79c63f005..71d1fc6059 100644 --- a/openbas-front/src/admin/components/assets/endpoints/EndpointPopover.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/EndpointPopover.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/assets/endpoints/Endpoints.tsx b/openbas-front/src/admin/components/assets/endpoints/Endpoints.tsx index 00b6c7a2ce..3651c0ea1d 100644 --- a/openbas-front/src/admin/components/assets/endpoints/Endpoints.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/Endpoints.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, useState } from 'react'; +import { CSSProperties, useState } from 'react'; import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { DevicesOtherOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/assets/endpoints/EndpointsDialogAdding.tsx b/openbas-front/src/admin/components/assets/endpoints/EndpointsDialogAdding.tsx index 1f4abc8944..b3a583fcb7 100644 --- a/openbas-front/src/admin/components/assets/endpoints/EndpointsDialogAdding.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/EndpointsDialogAdding.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useEffect, useMemo, useState } from 'react'; +import { FunctionComponent, useEffect, useMemo, useState } from 'react'; import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; import { DevicesOtherOutlined } from '@mui/icons-material'; import Transition from '../../../../components/common/Transition'; diff --git a/openbas-front/src/admin/components/assets/endpoints/EndpointsList.tsx b/openbas-front/src/admin/components/assets/endpoints/EndpointsList.tsx index da1f418576..09fcbb25fb 100644 --- a/openbas-front/src/admin/components/assets/endpoints/EndpointsList.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/EndpointsList.tsx @@ -1,4 +1,5 @@ -import React, { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; +import { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; +import * as React from 'react'; import { Chip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { DevicesOtherOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformCreation.tsx b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformCreation.tsx index 9a6d3f9d01..fc6df44b0f 100644 --- a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformCreation.tsx +++ b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformCreation.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { ListItemButton, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformForm.tsx b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformForm.tsx index 2c609ba2a2..dbb465e345 100644 --- a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformForm.tsx +++ b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformForm.tsx @@ -1,6 +1,7 @@ import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { Button, MenuItem, TextField } from '@mui/material'; -import React, { SyntheticEvent } from 'react'; +import { SyntheticEvent } from 'react'; +import * as React from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformPopover.tsx b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformPopover.tsx index 1f8e76ada2..7a61533848 100644 --- a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformPopover.tsx +++ b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformPopover.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatforms.tsx b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatforms.tsx index aa58ace8bf..b15729cbdf 100644 --- a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatforms.tsx +++ b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatforms.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, useState } from 'react'; +import { CSSProperties, useState } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { useSearchParams } from 'react-router-dom'; diff --git a/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx b/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx index 4c681e71a4..40b1d899ec 100644 --- a/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx +++ b/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import * as R from 'ramda'; import { useFormatter } from '../../../components/i18n'; diff --git a/openbas-front/src/admin/components/atomic_testings/InjectDtoList.tsx b/openbas-front/src/admin/components/atomic_testings/InjectDtoList.tsx index 9202229b25..0307546777 100644 --- a/openbas-front/src/admin/components/atomic_testings/InjectDtoList.tsx +++ b/openbas-front/src/admin/components/atomic_testings/InjectDtoList.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, FunctionComponent, useMemo, useState } from 'react'; +import { CSSProperties, FunctionComponent, useMemo, useState } from 'react'; import { Link } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTesting.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTesting.tsx index 2add45bd81..b7d517eddf 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTesting.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTesting.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useState } from 'react'; +import { useContext, useEffect, useState } from 'react'; import { Chip, Grid, List, Paper, Tooltip, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import type { AttackPattern, InjectTargetWithResult, KillChainPhase } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingDetail.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingDetail.tsx index 53927d96ed..8143feb3b9 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingDetail.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingDetail.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext } from 'react'; +import { FunctionComponent, useContext } from 'react'; import { Props } from 'html-react-parser/lib/attributes-to-props'; import { Grid, Paper, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingHeader.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingHeader.tsx index c622799cfa..f01e37b4f2 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingHeader.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingHeader.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; import { Alert, Button, Dialog, DialogActions, DialogContent, DialogContentText, Tooltip, Typography } from '@mui/material'; import { PlayArrowOutlined, SettingsOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingPopover.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingPopover.tsx index 5864341d29..e6454439bb 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingPopover.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingPopover.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import type { InjectResultDTO } from '../../../../utils/api-types'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingResult.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingResult.tsx index 9c41886235..5e56621f75 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingResult.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingResult.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { SensorOccupiedOutlined, ShieldOutlined, TrackChangesOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; import type { ExpectationResultsByType, InjectResultDTO } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingUpdate.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingUpdate.tsx index 592838d54d..7eb840dff1 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingUpdate.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingUpdate.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext } from 'react'; +import { FunctionComponent, useContext } from 'react'; import * as R from 'ramda'; import UpdateInject from '../../common/injects/UpdateInject'; import type { Inject, InjectResultDTO } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/Index.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/Index.tsx index 7e6dc3180d..8a16de0ac7 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/Index.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/Index.tsx @@ -1,4 +1,4 @@ -import React, { lazy, Suspense, useEffect, useState } from 'react'; +import { lazy, Suspense, useEffect, useState } from 'react'; import { Link, Route, Routes, useLocation, useParams } from 'react-router-dom'; import { interval } from 'rxjs'; import { Box, Tab, Tabs } from '@mui/material'; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetListItem.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetListItem.tsx index 2b583e7e3b..a9cd32a8b1 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetListItem.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetListItem.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { Divider, ListItemButton, ListItemIcon, ListItemText, Paper } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { DevicesOtherOutlined, Groups3Outlined, PersonOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx index e9c2f6b5c9..24566f0ad9 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useContext, useEffect, useState } from 'react'; +import { FunctionComponent, useContext, useEffect, useState } from 'react'; +import * as React from 'react'; import { Box, Button, diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/types/nodes/NodeResultStep.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/types/nodes/NodeResultStep.tsx index f02f566490..249811837e 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/types/nodes/NodeResultStep.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/types/nodes/NodeResultStep.tsx @@ -1,4 +1,4 @@ -import React, { memo } from 'react'; +import { memo } from 'react'; import { Handle, Node, NodeProps, Position } from '@xyflow/react'; import { makeStyles } from '@mui/styles'; import { Tooltip } from '@mui/material'; diff --git a/openbas-front/src/admin/components/common/ToolBar.js b/openbas-front/src/admin/components/common/ToolBar.js index 117ecfdc36..92121873e6 100644 --- a/openbas-front/src/admin/components/common/ToolBar.js +++ b/openbas-front/src/admin/components/common/ToolBar.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { forwardRef, Component } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { withStyles, withTheme } from '@mui/styles'; @@ -144,7 +144,7 @@ const styles = (theme) => ({ }, }); -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/common/articles/ArticleAddDocuments.js b/openbas-front/src/admin/components/common/articles/ArticleAddDocuments.js index bfaa194d4e..3e15475308 100644 --- a/openbas-front/src/admin/components/common/articles/ArticleAddDocuments.js +++ b/openbas-front/src/admin/components/common/articles/ArticleAddDocuments.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; import * as R from 'ramda'; import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined, DescriptionOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/common/articles/ArticleForm.js b/openbas-front/src/admin/components/common/articles/ArticleForm.js index 4e3c3b201a..de917c196d 100644 --- a/openbas-front/src/admin/components/common/articles/ArticleForm.js +++ b/openbas-front/src/admin/components/common/articles/ArticleForm.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Form } from 'react-final-form'; import { Box, Button, Grid, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/articles/ArticlePopover.js b/openbas-front/src/admin/components/common/articles/ArticlePopover.js index 5b0e334046..d920d00038 100644 --- a/openbas-front/src/admin/components/common/articles/ArticlePopover.js +++ b/openbas-front/src/admin/components/common/articles/ArticlePopover.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { Fragment, useContext, useState } from 'react'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; @@ -70,7 +70,7 @@ const ArticlePopover = ({ article, onRemoveArticle = null }) => { )(article); return ( - + { - + ); }; diff --git a/openbas-front/src/admin/components/common/articles/Articles.tsx b/openbas-front/src/admin/components/common/articles/Articles.tsx index 77afe3f6fd..f6a1268bd0 100644 --- a/openbas-front/src/admin/components/common/articles/Articles.tsx +++ b/openbas-front/src/admin/components/common/articles/Articles.tsx @@ -1,6 +1,6 @@ import { Avatar, Button, Card, CardContent, CardHeader, CardMedia, Chip, Grid, IconButton, Tooltip, Typography } from '@mui/material'; import { green, orange } from '@mui/material/colors'; -import React, { FunctionComponent, useContext, useState } from 'react'; +import { Fragment, FunctionComponent, useContext, useState } from 'react'; import { Link } from 'react-router-dom'; import { ChatBubbleOutlineOutlined, FavoriteBorderOutlined, NewspaperOutlined, ShareOutlined, VisibilityOutlined } from '@mui/icons-material'; import * as R from 'ramda'; @@ -98,198 +98,196 @@ const Articles: FunctionComponent = ({ articles }) => { const { previewArticleUrl } = useContext(ArticleContext); const { permissions } = useContext(PermissionsContext); - return ( - <> - {permissions.canWrite && ( - - )} - {fullArticles.length > 0 && ( - - )} -
- {sortedArticles.length === 0 && ( - -
- {t('No media pressure article available in this simulation yet.')} -
- + return <> + {permissions.canWrite && ( + + )} + {fullArticles.length > 0 && ( + + )} +
+ {sortedArticles.length === 0 && ( + +
+ {t('No media pressure article available in this simulation yet.')}
- } - /> - )} - - {sortedArticles.map((article, index) => { - const docs = (article.article_documents ?? []) - .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) - .filter((d) => d !== undefined); - const images = docs.filter((d) => d.document_type.includes('image/')); - const videos = docs.filter((d) => d.document_type.includes('video/')); - let headersDocs = []; - if (article.article_fullchannel?.channel_type === 'newspaper') { - headersDocs = images; - } else if (article.article_fullchannel?.channel_type === 'tv') { - headersDocs = videos; - } else { - headersDocs = [...images, ...videos]; - } - let columns = 12; - if (headersDocs.length === 2) { - columns = 6; - } else if (headersDocs.length === 3) { - columns = 4; - } else if (headersDocs.length >= 4) { - columns = 3; + +
} - // const shouldBeTruncated = (article.article_content || '').length > 500; - return ( - - - - {(article.article_author || t('Unknown')).charAt(0)} - - } - title={article.article_author || t('Unknown')} - subheader={ - article.article_is_scheduled ? ( - - {t('Scheduled')} - - ) : ( - - {t('Not used in the context')} - - ) - } - action={ - - - - - - - } - /> - - {headersDocs.map((doc) => ( - - {doc.document_type.includes('image/') && ( - - )} - {doc.document_type.includes('video/') && ( - - )} - - ))} - - - + )} + + {sortedArticles.map((article, index) => { + const docs = (article.article_documents ?? []) + .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) + .filter((d) => d !== undefined); + const images = docs.filter((d) => d.document_type.includes('image/')); + const videos = docs.filter((d) => d.document_type.includes('video/')); + let headersDocs = []; + if (article.article_fullchannel?.channel_type === 'newspaper') { + headersDocs = images; + } else if (article.article_fullchannel?.channel_type === 'tv') { + headersDocs = videos; + } else { + headersDocs = [...images, ...videos]; + } + let columns = 12; + if (headersDocs.length === 2) { + columns = 6; + } else if (headersDocs.length === 3) { + columns = 4; + } else if (headersDocs.length >= 4) { + columns = 3; + } + // const shouldBeTruncated = (article.article_content || '').length > 500; + return ( + + + - {article.article_name} - - -
-
- - - } - classes={{ root: classes.channel }} - style={{ - color: ChannelColor( - article.article_fullchannel?.channel_type, - ), - borderColor: ChannelColor( - article.article_fullchannel?.channel_type, - ), - }} - variant="outlined" - label={article.article_fullchannel?.channel_name} - /> - -
-
- - - -
+ {(article.article_author || t('Unknown')).charAt(0)} + + } + title={article.article_author || t('Unknown')} + subheader={ + article.article_is_scheduled ? ( + + {t('Scheduled')} + + ) : ( + + {t('Not used in the context')} + + ) + } + action={ + + + + + + + } + /> + + {headersDocs.map((doc) => ( + + {doc.document_type.includes('image/') && ( + + )} + {doc.document_type.includes('video/') && ( + + )} + + ))} + + + + {article.article_name} + + +
+
+ + + } + classes={{ root: classes.channel }} + style={{ + color: ChannelColor( + article.article_fullchannel?.channel_type, + ), + borderColor: ChannelColor( + article.article_fullchannel?.channel_type, + ), + }} + variant="outlined" + label={article.article_fullchannel?.channel_name} + /> +
- - - - ); - })} - - - ); +
+ + + +
+
+
+ + + ); + })} + + ; }; export default Articles; diff --git a/openbas-front/src/admin/components/common/articles/CreateArticle.js b/openbas-front/src/admin/components/common/articles/CreateArticle.js index 83247adccc..5b7b7129c1 100644 --- a/openbas-front/src/admin/components/common/articles/CreateArticle.js +++ b/openbas-front/src/admin/components/common/articles/CreateArticle.js @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import { useContext } from 'react'; import { Dialog, DialogContent, DialogTitle, IconButton, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { Add, ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/challenges/ContextualChallenges.js b/openbas-front/src/admin/components/common/challenges/ContextualChallenges.js index eaeef8092e..9f9f697b0e 100644 --- a/openbas-front/src/admin/components/common/challenges/ContextualChallenges.js +++ b/openbas-front/src/admin/components/common/challenges/ContextualChallenges.js @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import { useContext } from 'react'; import { makeStyles } from '@mui/styles'; import { Avatar, Button, Card, CardContent, CardHeader, Chip, Grid, IconButton, Tooltip } from '@mui/material'; import { Link } from 'react-router-dom'; diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx index 3aabc7491b..19b65e43a1 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { makeStyles } from '@mui/styles'; import EnterpriseEditionAgreement from './EnterpriseEditionAgreement'; import type { Theme } from '../../../../components/Theme'; diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EEField.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EEField.tsx index 1c18237a36..1649402dd8 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EEField.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EEField.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import EEChip from './EEChip'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EEMenu.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EEMenu.tsx index fcb9355dae..0f06984734 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EEMenu.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EEMenu.tsx @@ -1,5 +1,5 @@ import { styled } from '@mui/material/styles'; -import React, { ReactElement } from 'react'; +import { ReactElement } from 'react'; import EEChip from './EEChip'; const EEDiv = styled('div')(() => ({ diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EETooltip.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EETooltip.tsx index 98c348092c..960c8ae794 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EETooltip.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EETooltip.tsx @@ -1,5 +1,5 @@ import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Tooltip } from '@mui/material'; -import React, { ReactElement, useState } from 'react'; +import { ReactElement, useState } from 'react'; import EnterpriseEditionAgreement from './EnterpriseEditionAgreement'; import { useFormatter } from '../../../../components/i18n'; import useEnterpriseEdition from '../../../../utils/hooks/useEnterpriseEdition'; diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEdition.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEdition.tsx index e1ad65af6a..56939146bd 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEdition.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEdition.tsx @@ -13,7 +13,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ -import React from 'react'; import { Alert, AlertTitle } from '@mui/material'; import { makeStyles } from '@mui/styles'; import EnterpriseEditionButton from './EnterpriseEditionButton'; diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreement.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreement.tsx index d1ff9edc1d..b6c3789f13 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreement.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreement.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, FormControlLabel, FormGroup } from '@mui/material'; import { useFormatter } from '../../../../components/i18n'; import type { SettingsEnterpriseEditionUpdateInput } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionButton.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionButton.tsx index 6c94bac9e5..a50ce68239 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionButton.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionButton.tsx @@ -1,5 +1,5 @@ import { Button } from '@mui/material'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { makeStyles } from '@mui/styles'; import { RocketLaunchOutlined } from '@mui/icons-material'; import classNames from 'classnames'; diff --git a/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx b/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx index 7cfa845e9a..e18f33a13a 100644 --- a/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx +++ b/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx @@ -1,5 +1,6 @@ import { Switch } from '@mui/material'; -import React, { FunctionComponent, useEffect, useState } from 'react'; +import { FunctionComponent, useEffect, useState } from 'react'; +import * as React from 'react'; import { useFormatter } from '../../../../components/i18n'; import { FilterHelpers } from '../../../../components/common/queryable/filter/FilterHelpers'; import type { FilterGroup } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/common/filters/KillChainPhasesFilter.js b/openbas-front/src/admin/components/common/filters/KillChainPhasesFilter.js index 802484c45c..6a09c9d11d 100644 --- a/openbas-front/src/admin/components/common/filters/KillChainPhasesFilter.js +++ b/openbas-front/src/admin/components/common/filters/KillChainPhasesFilter.js @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import { makeStyles } from '@mui/styles'; import { Autocomplete, Box, TextField } from '@mui/material'; import { RouteOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/common/filters/MitreFilter.tsx b/openbas-front/src/admin/components/common/filters/MitreFilter.tsx index 6ce4503154..d4369025da 100644 --- a/openbas-front/src/admin/components/common/filters/MitreFilter.tsx +++ b/openbas-front/src/admin/components/common/filters/MitreFilter.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useEffect } from 'react'; +import { FunctionComponent, useEffect } from 'react'; import { makeStyles } from '@mui/styles'; import { Button, Typography } from '@mui/material'; import { useHelper } from '../../../../store'; diff --git a/openbas-front/src/admin/components/common/filters/TagsFilter.js b/openbas-front/src/admin/components/common/filters/TagsFilter.js index 39f2e25fb0..89391c72a5 100644 --- a/openbas-front/src/admin/components/common/filters/TagsFilter.js +++ b/openbas-front/src/admin/components/common/filters/TagsFilter.js @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import * as R from 'ramda'; import { makeStyles } from '@mui/styles'; import { Box, Autocomplete, TextField, Chip } from '@mui/material'; diff --git a/openbas-front/src/admin/components/common/form/TextFieldAskAI.tsx b/openbas-front/src/admin/components/common/form/TextFieldAskAI.tsx index b6e3b45e41..cc4aaf416f 100644 --- a/openbas-front/src/admin/components/common/form/TextFieldAskAI.tsx +++ b/openbas-front/src/admin/components/common/form/TextFieldAskAI.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; +import * as React from 'react'; import { AutoAwesomeOutlined } from '@mui/icons-material'; import { Button, diff --git a/openbas-front/src/admin/components/common/injects/CreateInject.tsx b/openbas-front/src/admin/components/common/injects/CreateInject.tsx index 3676747b7c..5e5ddbf5e0 100644 --- a/openbas-front/src/admin/components/common/injects/CreateInject.tsx +++ b/openbas-front/src/admin/components/common/injects/CreateInject.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, FunctionComponent, useEffect, useMemo, useRef, useState } from 'react'; +import { CSSProperties, FunctionComponent, useEffect, useMemo, useRef, useState } from 'react'; import { Chip, Grid, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Tooltip } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { KeyboardArrowRight } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/common/injects/CreateInjectDetails.js b/openbas-front/src/admin/components/common/injects/CreateInjectDetails.js index 9ddf0c027b..bfab9ad721 100644 --- a/openbas-front/src/admin/components/common/injects/CreateInjectDetails.js +++ b/openbas-front/src/admin/components/common/injects/CreateInjectDetails.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; import * as R from 'ramda'; import arrayMutators from 'final-form-arrays'; import { Form } from 'react-final-form'; diff --git a/openbas-front/src/admin/components/common/injects/ExerciseInjectsDistribution.tsx b/openbas-front/src/admin/components/common/injects/ExerciseInjectsDistribution.tsx index 10190b8dfe..d0217c6c8e 100644 --- a/openbas-front/src/admin/components/common/injects/ExerciseInjectsDistribution.tsx +++ b/openbas-front/src/admin/components/common/injects/ExerciseInjectsDistribution.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import * as R from 'ramda'; import { useFormatter } from '../../../../components/i18n'; import type { TeamStore } from '../../../../actions/teams/Team'; diff --git a/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromInjectsTest.tsx b/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromInjectsTest.tsx index 203e998458..88ef528c41 100644 --- a/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromInjectsTest.tsx +++ b/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromInjectsTest.tsx @@ -1,5 +1,5 @@ import { Autocomplete as MuiAutocomplete, Box, Button, MenuItem, TextField } from '@mui/material'; -import React, { FunctionComponent, SyntheticEvent, useState } from 'react'; +import { FunctionComponent, SyntheticEvent, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; diff --git a/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXls.tsx b/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXls.tsx index a1144e7d16..76e8c3889d 100644 --- a/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXls.tsx +++ b/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXls.tsx @@ -1,6 +1,6 @@ import { ToggleButton, Tooltip } from '@mui/material'; import { CloudUploadOutlined } from '@mui/icons-material'; -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; import Dialog from '../../../../components/common/Dialog'; import { useFormatter } from '../../../../components/i18n'; import type { ImportPostSummary, InjectsImportInput, ImportMessage, ImportTestSummary } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXlsFile.tsx b/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXlsFile.tsx index 5d83ef234e..2e623bef09 100644 --- a/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXlsFile.tsx +++ b/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXlsFile.tsx @@ -1,5 +1,5 @@ import { Button } from '@mui/material'; -import React, { FunctionComponent, SyntheticEvent, useState } from 'react'; +import { FunctionComponent, SyntheticEvent, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; diff --git a/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXlsInjects.tsx b/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXlsInjects.tsx index 9b7e8678c2..fea10095e8 100644 --- a/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXlsInjects.tsx +++ b/openbas-front/src/admin/components/common/injects/ImportUploaderInjectFromXlsInjects.tsx @@ -1,7 +1,7 @@ import { Autocomplete as MuiAutocomplete, Box, Button, MenuItem, TextField, Tooltip } from '@mui/material'; import { TableViewOutlined } from '@mui/icons-material'; import { InformationOutline } from 'mdi-material-ui'; -import React, { FunctionComponent, SyntheticEvent, useContext, useEffect, useState } from 'react'; +import { FunctionComponent, SyntheticEvent, useContext, useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; diff --git a/openbas-front/src/admin/components/common/injects/InjectAddArticles.tsx b/openbas-front/src/admin/components/common/injects/InjectAddArticles.tsx index 3c97609b93..117ae65da1 100644 --- a/openbas-front/src/admin/components/common/injects/InjectAddArticles.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectAddArticles.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; import * as R from 'ramda'; import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/common/injects/InjectAddChallenges.tsx b/openbas-front/src/admin/components/common/injects/InjectAddChallenges.tsx index 05adf42682..ad0ce55ef4 100644 --- a/openbas-front/src/admin/components/common/injects/InjectAddChallenges.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectAddChallenges.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; import * as R from 'ramda'; import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined, EmojiEventsOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/common/injects/InjectAddTeams.tsx b/openbas-front/src/admin/components/common/injects/InjectAddTeams.tsx index 5ff7517a90..14a965d293 100644 --- a/openbas-front/src/admin/components/common/injects/InjectAddTeams.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectAddTeams.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext, useEffect, useMemo, useState } from 'react'; +import { FunctionComponent, useContext, useEffect, useMemo, useState } from 'react'; import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined, GroupsOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/injects/InjectChainsForm.tsx b/openbas-front/src/admin/components/common/injects/InjectChainsForm.tsx index b1050e3c05..6685547c92 100644 --- a/openbas-front/src/admin/components/common/injects/InjectChainsForm.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectChainsForm.tsx @@ -1,4 +1,5 @@ -import React, { ReactElement, ReactNode, useEffect, useState } from 'react'; +import { ReactElement, ReactNode, useEffect, useState } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import { Accordion, diff --git a/openbas-front/src/admin/components/common/injects/InjectDefinition.js b/openbas-front/src/admin/components/common/injects/InjectDefinition.js index 014bd5d20d..b3d7651315 100644 --- a/openbas-front/src/admin/components/common/injects/InjectDefinition.js +++ b/openbas-front/src/admin/components/common/injects/InjectDefinition.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { withStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx b/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx index 4bffcf8b18..3447e403a6 100644 --- a/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import Empty from '../../../../components/Empty'; diff --git a/openbas-front/src/admin/components/common/injects/InjectDistributionByType.tsx b/openbas-front/src/admin/components/common/injects/InjectDistributionByType.tsx index 494f606b97..7d57360bf5 100644 --- a/openbas-front/src/admin/components/common/injects/InjectDistributionByType.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectDistributionByType.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import Empty from '../../../../components/Empty'; diff --git a/openbas-front/src/admin/components/common/injects/InjectForm.js b/openbas-front/src/admin/components/common/injects/InjectForm.js index d13aacea42..663ccb8da2 100644 --- a/openbas-front/src/admin/components/common/injects/InjectForm.js +++ b/openbas-front/src/admin/components/common/injects/InjectForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { withStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/injects/InjectIcon.js b/openbas-front/src/admin/components/common/injects/InjectIcon.js index 65551dd98f..cb2eb45069 100644 --- a/openbas-front/src/admin/components/common/injects/InjectIcon.js +++ b/openbas-front/src/admin/components/common/injects/InjectIcon.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { DnsOutlined, HelpOutlineOutlined } from '@mui/icons-material'; import { ApplicationCogOutline, Console, FileImportOutline, LanConnect } from 'mdi-material-ui'; diff --git a/openbas-front/src/admin/components/common/injects/InjectPopover.tsx b/openbas-front/src/admin/components/common/injects/InjectPopover.tsx index 201edbb956..603f001cf1 100644 --- a/openbas-front/src/admin/components/common/injects/InjectPopover.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectPopover.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; +import * as React from 'react'; import { Link } from 'react-router-dom'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem, Table, TableBody, TableCell, TableRow } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/common/injects/InjectStatusDetails.js b/openbas-front/src/admin/components/common/injects/InjectStatusDetails.js index d15547d565..76c907e44d 100644 --- a/openbas-front/src/admin/components/common/injects/InjectStatusDetails.js +++ b/openbas-front/src/admin/components/common/injects/InjectStatusDetails.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { Dialog, DialogContent, DialogActions, Button, IconButton, TableRow, TableCell, TableBody, Table } from '@mui/material'; diff --git a/openbas-front/src/admin/components/common/injects/InjectorContract.js b/openbas-front/src/admin/components/common/injects/InjectorContract.js index c3b6e13296..82baea7f96 100644 --- a/openbas-front/src/admin/components/common/injects/InjectorContract.js +++ b/openbas-front/src/admin/components/common/injects/InjectorContract.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import * as PropTypes from 'prop-types'; import { withStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/injects/Injects.tsx b/openbas-front/src/admin/components/common/injects/Injects.tsx index 9a0f9ec81d..5e6ade5427 100644 --- a/openbas-front/src/admin/components/common/injects/Injects.tsx +++ b/openbas-front/src/admin/components/common/injects/Injects.tsx @@ -1,4 +1,5 @@ -import React, { CSSProperties, FunctionComponent, useContext, useMemo, useState } from 'react'; +import { CSSProperties, FunctionComponent, useContext, useMemo, useState } from 'react'; +import * as React from 'react'; import { Checkbox, Chip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { Link } from 'react-router-dom'; diff --git a/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx b/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx index 011e1434f8..368c83dc06 100644 --- a/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx @@ -1,5 +1,5 @@ import Chart from 'react-apexcharts'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import * as R from 'ramda'; import { useTheme } from '@mui/styles'; import { colors, horizontalBarsChartOptions } from '../../../../utils/Charts'; diff --git a/openbas-front/src/admin/components/common/injects/InjectsListButtons.tsx b/openbas-front/src/admin/components/common/injects/InjectsListButtons.tsx index 99e6df8b0c..64cd446055 100644 --- a/openbas-front/src/admin/components/common/injects/InjectsListButtons.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectsListButtons.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext } from 'react'; +import { FunctionComponent, useContext } from 'react'; import { ToggleButton, ToggleButtonGroup, Tooltip } from '@mui/material'; import { BarChartOutlined, ReorderOutlined, ViewTimelineOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/injects/ResponsePie.tsx b/openbas-front/src/admin/components/common/injects/ResponsePie.tsx index 4540623bc6..8a38648a6d 100644 --- a/openbas-front/src/admin/components/common/injects/ResponsePie.tsx +++ b/openbas-front/src/admin/components/common/injects/ResponsePie.tsx @@ -1,5 +1,5 @@ import Chart from 'react-apexcharts'; -import React, { memo } from 'react'; +import { memo } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Button, Grid } from '@mui/material'; import { InfoOutlined, SensorOccupiedOutlined, ShieldOutlined, TrackChangesOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx b/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx index 3f19c02fe0..95802ba0dd 100644 --- a/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx +++ b/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import * as R from 'ramda'; import { useFormatter } from '../../../../components/i18n'; import type { TeamStore } from '../../../../actions/teams/Team'; diff --git a/openbas-front/src/admin/components/common/injects/UpdateInject.tsx b/openbas-front/src/admin/components/common/injects/UpdateInject.tsx index dc213ebec0..a23b883158 100644 --- a/openbas-front/src/admin/components/common/injects/UpdateInject.tsx +++ b/openbas-front/src/admin/components/common/injects/UpdateInject.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; +import * as React from 'react'; import { Tab, Tabs } from '@mui/material'; import Drawer from '../../../../components/common/Drawer'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/common/injects/UpdateInjectDetails.js b/openbas-front/src/admin/components/common/injects/UpdateInjectDetails.js index cbf139e44e..e5d5c66939 100644 --- a/openbas-front/src/admin/components/common/injects/UpdateInjectDetails.js +++ b/openbas-front/src/admin/components/common/injects/UpdateInjectDetails.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; import * as R from 'ramda'; import arrayMutators from 'final-form-arrays'; import { Form } from 'react-final-form'; diff --git a/openbas-front/src/admin/components/common/injects/UpdateInjectLogicalChains.tsx b/openbas-front/src/admin/components/common/injects/UpdateInjectLogicalChains.tsx index f3e5845eaa..f2b992e05e 100644 --- a/openbas-front/src/admin/components/common/injects/UpdateInjectLogicalChains.tsx +++ b/openbas-front/src/admin/components/common/injects/UpdateInjectLogicalChains.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import arrayMutators from 'final-form-arrays'; import { Form } from 'react-final-form'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormCreate.tsx b/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormCreate.tsx index 3c9f87467e..28dece2620 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormCreate.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormCreate.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, SyntheticEvent, useEffect } from 'react'; +import { FunctionComponent, SyntheticEvent, useEffect } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; import { Alert, Button, InputLabel, MenuItem, Select as MUISelect, TextField, TextField as MuiTextField, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormUpdate.tsx b/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormUpdate.tsx index 7a6cd2d3f3..597c92f05f 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormUpdate.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormUpdate.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, SyntheticEvent } from 'react'; +import { FunctionComponent, SyntheticEvent } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; import { Alert, Button, InputLabel, MenuItem, Select as MUISelect, TextField, TextField as MuiTextField, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/injects/expectations/ExpectationPopover.tsx b/openbas-front/src/admin/components/common/injects/expectations/ExpectationPopover.tsx index 70973d8447..472b48c417 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/ExpectationPopover.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/ExpectationPopover.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; +import * as React from 'react'; import { Button, Dialog as DialogMUI, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; import Transition from '../../../../../components/common/Transition'; diff --git a/openbas-front/src/admin/components/common/injects/expectations/ExpectationUtils.tsx b/openbas-front/src/admin/components/common/injects/expectations/ExpectationUtils.tsx index 0747404b36..188ca8ef0b 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/ExpectationUtils.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/ExpectationUtils.tsx @@ -1,6 +1,5 @@ import { AssignmentTurnedIn, PublishedWithChangesOutlined, TrackChangesOutlined } from '@mui/icons-material'; import { NewspaperVariantMultipleOutline } from 'mdi-material-ui'; -import React from 'react'; import { ExpectationType } from './Expectation'; export const isAutomatic = (type: string) => { diff --git a/openbas-front/src/admin/components/common/injects/expectations/InjectAddExpectation.tsx b/openbas-front/src/admin/components/common/injects/expectations/InjectAddExpectation.tsx index 1e87fb39ea..4069b0b260 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/InjectAddExpectation.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/InjectAddExpectation.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/common/injects/expectations/InjectExpectations.tsx b/openbas-front/src/admin/components/common/injects/expectations/InjectExpectations.tsx index 5d449b3044..2ff761dea5 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/InjectExpectations.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/InjectExpectations.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/common/injects/expectations/field/ExpectationGroupField.tsx b/openbas-front/src/admin/components/common/injects/expectations/field/ExpectationGroupField.tsx index 835164e416..c4325a8888 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/field/ExpectationGroupField.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/field/ExpectationGroupField.tsx @@ -1,6 +1,7 @@ import { FormControlLabel, FormLabel, Radio, RadioGroup, Tooltip } from '@mui/material'; import { InfoOutlined } from '@mui/icons-material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; +import * as React from 'react'; import { Control, Controller } from 'react-hook-form'; import { makeStyles } from '@mui/styles'; import type { Theme } from '../../../../../../components/Theme'; diff --git a/openbas-front/src/admin/components/common/injects/teams/InjectTeamsList.tsx b/openbas-front/src/admin/components/common/injects/teams/InjectTeamsList.tsx index 27c48968f4..627ec24752 100644 --- a/openbas-front/src/admin/components/common/injects/teams/InjectTeamsList.tsx +++ b/openbas-front/src/admin/components/common/injects/teams/InjectTeamsList.tsx @@ -1,6 +1,6 @@ import { ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { GroupsOutlined } from '@mui/icons-material'; -import React, { FunctionComponent, useContext, useEffect, useState } from 'react'; +import { FunctionComponent, useContext, useEffect, useState } from 'react'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; import ItemTags from '../../../../../components/ItemTags'; diff --git a/openbas-front/src/admin/components/common/matrix/AttackPatternBox.tsx b/openbas-front/src/admin/components/common/matrix/AttackPatternBox.tsx index 3eb62bf096..222908804b 100644 --- a/openbas-front/src/admin/components/common/matrix/AttackPatternBox.tsx +++ b/openbas-front/src/admin/components/common/matrix/AttackPatternBox.tsx @@ -1,6 +1,7 @@ import { Link } from 'react-router-dom'; import { Button, ListItemText, Menu, MenuItem, Typography } from '@mui/material'; -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; +import * as React from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import type { AttackPattern, ExpectationResultsByType } from '../../../../utils/api-types'; import type { InjectExpectationResultsByAttackPatternStore, InjectExpectationResultsByTypeStore } from '../../../../actions/exercises/Exercise'; diff --git a/openbas-front/src/admin/components/common/matrix/KillChainPhaseColumn.tsx b/openbas-front/src/admin/components/common/matrix/KillChainPhaseColumn.tsx index 8a4bfee2f1..8e06facf12 100644 --- a/openbas-front/src/admin/components/common/matrix/KillChainPhaseColumn.tsx +++ b/openbas-front/src/admin/components/common/matrix/KillChainPhaseColumn.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import type { InjectExpectationResultsByAttackPatternStore } from '../../../../actions/exercises/Exercise'; import type { AttackPattern, KillChainPhase } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/common/matrix/MitreMatrix.tsx b/openbas-front/src/admin/components/common/matrix/MitreMatrix.tsx index af4c1b778a..c72f137570 100644 --- a/openbas-front/src/admin/components/common/matrix/MitreMatrix.tsx +++ b/openbas-front/src/admin/components/common/matrix/MitreMatrix.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; import { useHelper } from '../../../../store'; diff --git a/openbas-front/src/admin/components/common/matrix/MitreMatrixDummy.tsx b/openbas-front/src/admin/components/common/matrix/MitreMatrixDummy.tsx index df9003d7fb..02d577e3f9 100644 --- a/openbas-front/src/admin/components/common/matrix/MitreMatrixDummy.tsx +++ b/openbas-front/src/admin/components/common/matrix/MitreMatrixDummy.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; import { useHelper } from '../../../../store'; diff --git a/openbas-front/src/admin/components/common/simulate/DefinitionMenu.tsx b/openbas-front/src/admin/components/common/simulate/DefinitionMenu.tsx index 8229aa78dc..bc15f52f58 100644 --- a/openbas-front/src/admin/components/common/simulate/DefinitionMenu.tsx +++ b/openbas-front/src/admin/components/common/simulate/DefinitionMenu.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { AttachMoneyOutlined, EmojiEventsOutlined, GroupsOutlined } from '@mui/icons-material'; import { NewspaperVariantMultipleOutline } from 'mdi-material-ui'; import type { Exercise, Scenario } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/common/simulate/EmailParametersForm.tsx b/openbas-front/src/admin/components/common/simulate/EmailParametersForm.tsx index 74b0fbb507..67c29cc9a2 100644 --- a/openbas-front/src/admin/components/common/simulate/EmailParametersForm.tsx +++ b/openbas-front/src/admin/components/common/simulate/EmailParametersForm.tsx @@ -1,7 +1,8 @@ import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Alert, AlertTitle, Autocomplete, Button, Chip, TextField, TextField as MuiTextField } from '@mui/material'; -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { z } from 'zod'; import { makeStyles } from '@mui/styles'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/common/simulate/HeaderTags.tsx b/openbas-front/src/admin/components/common/simulate/HeaderTags.tsx index c6fe360983..6af9cb9d75 100644 --- a/openbas-front/src/admin/components/common/simulate/HeaderTags.tsx +++ b/openbas-front/src/admin/components/common/simulate/HeaderTags.tsx @@ -2,7 +2,7 @@ import { Button, Dialog, DialogContent, DialogTitle, IconButton } from '@mui/mat import { AddOutlined } from '@mui/icons-material'; import { Form } from 'react-final-form'; import * as R from 'ramda'; -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import Transition from '../../../../components/common/Transition'; import TagField from '../../../../components/TagField'; import TagChip from '../tags/TagChip'; diff --git a/openbas-front/src/admin/components/common/simulate/PaperMetric.tsx b/openbas-front/src/admin/components/common/simulate/PaperMetric.tsx index 4aa00a1dcd..8b7ac23a2a 100644 --- a/openbas-front/src/admin/components/common/simulate/PaperMetric.tsx +++ b/openbas-front/src/admin/components/common/simulate/PaperMetric.tsx @@ -1,5 +1,6 @@ import { Paper } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import type { Theme } from '../../../../components/Theme'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/common/tags/TagChip.tsx b/openbas-front/src/admin/components/common/tags/TagChip.tsx index 4a032dff90..b40c5b4b0c 100644 --- a/openbas-front/src/admin/components/common/tags/TagChip.tsx +++ b/openbas-front/src/admin/components/common/tags/TagChip.tsx @@ -1,5 +1,5 @@ import { Chip } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import { useHelper } from '../../../../store'; import type { TagHelper } from '../../../../actions/helper'; diff --git a/openbas-front/src/admin/components/components/Index.tsx b/openbas-front/src/admin/components/components/Index.tsx index bf16c66c80..43a66ffe4a 100644 --- a/openbas-front/src/admin/components/components/Index.tsx +++ b/openbas-front/src/admin/components/components/Index.tsx @@ -1,4 +1,4 @@ -import React, { Suspense, lazy } from 'react'; +import { Suspense, lazy } from 'react'; import { makeStyles } from '@mui/styles'; import { Navigate, Route, Routes } from 'react-router-dom'; import { errorWrapper } from '../../../components/Error'; diff --git a/openbas-front/src/admin/components/components/challenges/ChallengeForm.js b/openbas-front/src/admin/components/components/challenges/ChallengeForm.js index 5cba96bc3f..806746f783 100644 --- a/openbas-front/src/admin/components/components/challenges/ChallengeForm.js +++ b/openbas-front/src/admin/components/components/challenges/ChallengeForm.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Form } from 'react-final-form'; import arrayMutators from 'final-form-arrays'; import { FieldArray } from 'react-final-form-arrays'; diff --git a/openbas-front/src/admin/components/components/challenges/ChallengePopover.js b/openbas-front/src/admin/components/components/challenges/ChallengePopover.js index 1107f78d38..cd0fb4cc2d 100644 --- a/openbas-front/src/admin/components/components/challenges/ChallengePopover.js +++ b/openbas-front/src/admin/components/components/challenges/ChallengePopover.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { forwardRef, useState } from 'react'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; @@ -10,7 +10,7 @@ import { useHelper } from '../../../../store'; import { tagOptions } from '../../../../utils/Option'; import Drawer from '../../../../components/common/Drawer'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/components/challenges/Challenges.js b/openbas-front/src/admin/components/components/challenges/Challenges.js index 668207bc45..1be85223a4 100644 --- a/openbas-front/src/admin/components/components/challenges/Challenges.js +++ b/openbas-front/src/admin/components/components/challenges/Challenges.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemText, ListItemSecondaryAction, Tooltip, Chip } from '@mui/material'; import { useDispatch } from 'react-redux'; diff --git a/openbas-front/src/admin/components/components/challenges/CreateChallenge.js b/openbas-front/src/admin/components/components/challenges/CreateChallenge.js index 684e6f0e19..e57ebe52aa 100644 --- a/openbas-front/src/admin/components/components/challenges/CreateChallenge.js +++ b/openbas-front/src/admin/components/components/challenges/CreateChallenge.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import { Dialog, DialogContent, DialogTitle, Fab, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { Add, ControlPointOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/components/channels/Channel.js b/openbas-front/src/admin/components/components/channels/Channel.js index 4142f463c6..dbfc750cd1 100644 --- a/openbas-front/src/admin/components/components/channels/Channel.js +++ b/openbas-front/src/admin/components/components/channels/Channel.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; import { Grid, Typography, Paper, Skeleton } from '@mui/material'; diff --git a/openbas-front/src/admin/components/components/channels/ChannelAddLogo.tsx b/openbas-front/src/admin/components/components/channels/ChannelAddLogo.tsx index fac25ee657..fc41eed4a2 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelAddLogo.tsx +++ b/openbas-front/src/admin/components/components/channels/ChannelAddLogo.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; +import * as React from 'react'; import { Button } from '@mui/material'; import { fetchDocuments } from '../../../../actions/Document'; import FileTransferDialog from '../../../../components/fields/FileTransferDialog'; diff --git a/openbas-front/src/admin/components/components/channels/ChannelForm.js b/openbas-front/src/admin/components/components/channels/ChannelForm.js index 8ac6132704..3f65278a4d 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelForm.js +++ b/openbas-front/src/admin/components/components/channels/ChannelForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button, MenuItem } from '@mui/material'; diff --git a/openbas-front/src/admin/components/components/channels/ChannelHeader.js b/openbas-front/src/admin/components/components/channels/ChannelHeader.js index ec5cd90996..70e7d0088c 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelHeader.js +++ b/openbas-front/src/admin/components/components/channels/ChannelHeader.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { Typography } from '@mui/material'; import { useParams } from 'react-router-dom'; diff --git a/openbas-front/src/admin/components/components/channels/ChannelIcon.js b/openbas-front/src/admin/components/components/channels/ChannelIcon.js index 6aeb46923d..7d0bcb1434 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelIcon.js +++ b/openbas-front/src/admin/components/components/channels/ChannelIcon.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { NewspaperOutlined, HelpOutlined, OndemandVideoOutlined } from '@mui/icons-material'; import { PostOutline } from 'mdi-material-ui'; diff --git a/openbas-front/src/admin/components/components/channels/ChannelOverviewMicroblogging.js b/openbas-front/src/admin/components/components/channels/ChannelOverviewMicroblogging.js index 89add9bb99..61845731ee 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelOverviewMicroblogging.js +++ b/openbas-front/src/admin/components/components/channels/ChannelOverviewMicroblogging.js @@ -1,4 +1,4 @@ -import React from 'react'; +import { Fragment } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Typography, Grid, Card, CardHeader, Skeleton } from '@mui/material'; @@ -71,14 +71,14 @@ const ChannelOverviewMicroblogging = ({ channel }) => { /> } subheader={ - + - + } /> @@ -101,14 +101,14 @@ const ChannelOverviewMicroblogging = ({ channel }) => { /> } subheader={ - + - + } /> @@ -131,14 +131,14 @@ const ChannelOverviewMicroblogging = ({ channel }) => { /> } subheader={ - + - + } /> @@ -184,14 +184,14 @@ const ChannelOverviewMicroblogging = ({ channel }) => { /> } subheader={ - + - + } /> @@ -214,14 +214,14 @@ const ChannelOverviewMicroblogging = ({ channel }) => { /> } subheader={ - + - + } /> diff --git a/openbas-front/src/admin/components/components/channels/ChannelOverviewNewspaper.js b/openbas-front/src/admin/components/components/channels/ChannelOverviewNewspaper.js index 338cb7a4d9..6d825e1fa6 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelOverviewNewspaper.js +++ b/openbas-front/src/admin/components/components/channels/ChannelOverviewNewspaper.js @@ -1,4 +1,4 @@ -import React from 'react'; +import { Fragment } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Typography, Grid, Card, CardHeader, CardContent, Skeleton } from '@mui/material'; @@ -86,14 +86,14 @@ const ChannelOverviewNewspaper = ({ channel }) => { width="80%" style={{ marginBottom: 15 }} /> - + - + @@ -130,14 +130,14 @@ const ChannelOverviewNewspaper = ({ channel }) => { width="80%" style={{ marginBottom: 15 }} /> - + - + @@ -172,14 +172,14 @@ const ChannelOverviewNewspaper = ({ channel }) => { width="80%" style={{ marginBottom: 15 }} /> - + - + @@ -218,14 +218,14 @@ const ChannelOverviewNewspaper = ({ channel }) => { width="80%" style={{ marginBottom: 15 }} /> - + - + @@ -262,14 +262,14 @@ const ChannelOverviewNewspaper = ({ channel }) => { width="80%" style={{ marginBottom: 15 }} /> - + - + @@ -306,14 +306,14 @@ const ChannelOverviewNewspaper = ({ channel }) => { width="80%" style={{ marginBottom: 15 }} /> - + - + diff --git a/openbas-front/src/admin/components/components/channels/ChannelOverviewTvChannel.js b/openbas-front/src/admin/components/components/channels/ChannelOverviewTvChannel.js index 1e00ea60ba..99cd12754d 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelOverviewTvChannel.js +++ b/openbas-front/src/admin/components/components/channels/ChannelOverviewTvChannel.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Typography, Grid, Card, CardHeader, Skeleton } from '@mui/material'; diff --git a/openbas-front/src/admin/components/components/channels/ChannelParametersForm.js b/openbas-front/src/admin/components/components/channels/ChannelParametersForm.js index da7d9a89e7..977374ed16 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelParametersForm.js +++ b/openbas-front/src/admin/components/components/channels/ChannelParametersForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button, Grid, MenuItem } from '@mui/material'; diff --git a/openbas-front/src/admin/components/components/channels/ChannelPopover.tsx b/openbas-front/src/admin/components/components/channels/ChannelPopover.tsx index 7e9ab0ad34..357178d373 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelPopover.tsx +++ b/openbas-front/src/admin/components/components/channels/ChannelPopover.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, Button, IconButton, Menu, MenuItem, PopoverProps } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; import { useNavigate } from 'react-router-dom'; diff --git a/openbas-front/src/admin/components/components/channels/Channels.tsx b/openbas-front/src/admin/components/components/channels/Channels.tsx index 0a3325db0c..ac699a2e8a 100644 --- a/openbas-front/src/admin/components/components/channels/Channels.tsx +++ b/openbas-front/src/admin/components/components/channels/Channels.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties } from 'react'; +import { CSSProperties } from 'react'; import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { ChevronRightOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/components/channels/ChannelsFilter.tsx b/openbas-front/src/admin/components/components/channels/ChannelsFilter.tsx index ad3196691b..ab15885539 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelsFilter.tsx +++ b/openbas-front/src/admin/components/components/channels/ChannelsFilter.tsx @@ -1,4 +1,5 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import { Autocomplete, Box, TextField } from '@mui/material'; import { fetchChannels } from '../../../../actions/channels/channel-action'; diff --git a/openbas-front/src/admin/components/components/channels/CreateChannel.js b/openbas-front/src/admin/components/components/channels/CreateChannel.js index 9415f0a463..8767f6e9a7 100644 --- a/openbas-front/src/admin/components/components/channels/CreateChannel.js +++ b/openbas-front/src/admin/components/components/channels/CreateChannel.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/components/channels/Index.tsx b/openbas-front/src/admin/components/components/channels/Index.tsx index 596e4291f2..b3549a0db5 100644 --- a/openbas-front/src/admin/components/components/channels/Index.tsx +++ b/openbas-front/src/admin/components/components/channels/Index.tsx @@ -1,4 +1,4 @@ -import React, { lazy } from 'react'; +import { lazy } from 'react'; import { Route, Routes, useParams } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; import { fetchChannel } from '../../../../actions/channels/channel-action'; diff --git a/openbas-front/src/admin/components/components/documents/CreateDocument.js b/openbas-front/src/admin/components/components/documents/CreateDocument.js index a593df586e..d8439a71fb 100644 --- a/openbas-front/src/admin/components/components/documents/CreateDocument.js +++ b/openbas-front/src/admin/components/components/documents/CreateDocument.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/components/documents/DocumentForm.js b/openbas-front/src/admin/components/components/documents/DocumentForm.js index cb2965fddc..b6a0de38f5 100644 --- a/openbas-front/src/admin/components/components/documents/DocumentForm.js +++ b/openbas-front/src/admin/components/components/documents/DocumentForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import { Form } from 'react-final-form'; import { Button, CircularProgress } from '@mui/material'; import OldTextField from '../../../../components/fields/OldTextField'; diff --git a/openbas-front/src/admin/components/components/documents/DocumentPopover.js b/openbas-front/src/admin/components/components/documents/DocumentPopover.js index 8ddbb8a224..b7d5c5b7a2 100644 --- a/openbas-front/src/admin/components/components/documents/DocumentPopover.js +++ b/openbas-front/src/admin/components/components/documents/DocumentPopover.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/components/documents/DocumentType.js b/openbas-front/src/admin/components/components/documents/DocumentType.js index 9a292c4dc4..530a890735 100644 --- a/openbas-front/src/admin/components/components/documents/DocumentType.js +++ b/openbas-front/src/admin/components/components/documents/DocumentType.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { withStyles } from '@mui/styles'; import { Chip } from '@mui/material'; diff --git a/openbas-front/src/admin/components/components/documents/Documents.js b/openbas-front/src/admin/components/components/documents/Documents.js index 20ff3434bc..b7fcc36428 100644 --- a/openbas-front/src/admin/components/components/documents/Documents.js +++ b/openbas-front/src/admin/components/components/documents/Documents.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import * as R from 'ramda'; import { makeStyles } from '@mui/styles'; import { Chip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Tooltip } from '@mui/material'; diff --git a/openbas-front/src/admin/components/components/lessons/CreateLessonsTemplate.tsx b/openbas-front/src/admin/components/components/lessons/CreateLessonsTemplate.tsx index 51dda8d72f..adea72f28c 100644 --- a/openbas-front/src/admin/components/components/lessons/CreateLessonsTemplate.tsx +++ b/openbas-front/src/admin/components/components/lessons/CreateLessonsTemplate.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useFormatter } from '../../../../components/i18n'; import LessonsTemplateForm from './LessonsTemplateForm'; import { addLessonsTemplate } from '../../../../actions/Lessons'; diff --git a/openbas-front/src/admin/components/components/lessons/Index.tsx b/openbas-front/src/admin/components/components/lessons/Index.tsx index 90187f2be9..b30feef2e0 100644 --- a/openbas-front/src/admin/components/components/lessons/Index.tsx +++ b/openbas-front/src/admin/components/components/lessons/Index.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Route, Routes, useParams } from 'react-router-dom'; import Loader from '../../../../components/Loader'; import LessonsTemplate from './LessonsTemplate'; diff --git a/openbas-front/src/admin/components/components/lessons/LessonsTemplate.tsx b/openbas-front/src/admin/components/components/lessons/LessonsTemplate.tsx index 1ed8ca8b73..4c28bfe7c5 100644 --- a/openbas-front/src/admin/components/components/lessons/LessonsTemplate.tsx +++ b/openbas-front/src/admin/components/components/lessons/LessonsTemplate.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; import { Grid, List, ListItemButton, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Typography } from '@mui/material'; diff --git a/openbas-front/src/admin/components/components/lessons/LessonsTemplateForm.tsx b/openbas-front/src/admin/components/components/lessons/LessonsTemplateForm.tsx index ed700b3f38..f3bb154426 100644 --- a/openbas-front/src/admin/components/components/lessons/LessonsTemplateForm.tsx +++ b/openbas-front/src/admin/components/components/lessons/LessonsTemplateForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Button } from '@mui/material'; import { SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; diff --git a/openbas-front/src/admin/components/components/lessons/LessonsTemplateHeader.tsx b/openbas-front/src/admin/components/components/lessons/LessonsTemplateHeader.tsx index 013e496e66..63bad09407 100644 --- a/openbas-front/src/admin/components/components/lessons/LessonsTemplateHeader.tsx +++ b/openbas-front/src/admin/components/components/lessons/LessonsTemplateHeader.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { Typography } from '@mui/material'; import { useParams } from 'react-router-dom'; diff --git a/openbas-front/src/admin/components/components/lessons/LessonsTemplatePopover.tsx b/openbas-front/src/admin/components/components/lessons/LessonsTemplatePopover.tsx index 204151fcb7..197b9a4938 100644 --- a/openbas-front/src/admin/components/components/lessons/LessonsTemplatePopover.tsx +++ b/openbas-front/src/admin/components/components/lessons/LessonsTemplatePopover.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { useNavigate } from 'react-router-dom'; import LessonsTemplateForm from './LessonsTemplateForm'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/components/lessons/LessonsTemplates.tsx b/openbas-front/src/admin/components/components/lessons/LessonsTemplates.tsx index 77311c9916..73126f97b0 100644 --- a/openbas-front/src/admin/components/components/lessons/LessonsTemplates.tsx +++ b/openbas-front/src/admin/components/components/lessons/LessonsTemplates.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, useState } from 'react'; +import { CSSProperties, useState } from 'react'; import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemButton, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { ChevronRightOutlined, SchoolOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/components/lessons/categories/CreateLessonsTemplateCategory.tsx b/openbas-front/src/admin/components/components/lessons/categories/CreateLessonsTemplateCategory.tsx index d014d2045b..370b71b21a 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/CreateLessonsTemplateCategory.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/CreateLessonsTemplateCategory.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useFormatter } from '../../../../../components/i18n'; import LessonsTemplateCategoryForm, { LessonsTemplateCategoryInputForm } from './LessonsTemplateCategoryForm'; import { addLessonsTemplateCategory } from '../../../../../actions/Lessons'; diff --git a/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryForm.tsx b/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryForm.tsx index 44ac1ca793..5fc39a86ba 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryForm.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Button } from '@mui/material'; import { SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; diff --git a/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryPopover.tsx b/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryPopover.tsx index 2212dcc5c5..8ee7c63ae0 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryPopover.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryPopover.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import LessonsTemplateCategoryForm, { LessonsTemplateCategoryInputForm } from './LessonsTemplateCategoryForm'; import { useFormatter } from '../../../../../components/i18n'; import { deleteLessonsTemplateCategory, updateLessonsTemplateCategory } from '../../../../../actions/Lessons'; diff --git a/openbas-front/src/admin/components/components/lessons/categories/questions/CreateLessonsTemplateQuestion.tsx b/openbas-front/src/admin/components/components/lessons/categories/questions/CreateLessonsTemplateQuestion.tsx index 537173bfac..807b992fa2 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/questions/CreateLessonsTemplateQuestion.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/questions/CreateLessonsTemplateQuestion.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useFormatter } from '../../../../../../components/i18n'; import LessonsTemplateQuestionForm, { LessonsTemplateQuestionInputForm } from './LessonsTemplateQuestionForm'; import { addLessonsTemplateQuestion } from '../../../../../../actions/Lessons'; diff --git a/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionForm.tsx b/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionForm.tsx index 2719b251bb..fa5b5af5d2 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionForm.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Button } from '@mui/material'; import { SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; diff --git a/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionPopover.tsx b/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionPopover.tsx index efb6977828..539c4e5f01 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionPopover.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionPopover.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import LessonsTemplateQuestionForm, { LessonsTemplateQuestionInputForm } from './LessonsTemplateQuestionForm'; import { useFormatter } from '../../../../../../components/i18n'; import { deleteLessonsTemplateQuestion, updateLessonsTemplateQuestion } from '../../../../../../actions/Lessons'; diff --git a/openbas-front/src/admin/components/components/reports/ReportComment.tsx b/openbas-front/src/admin/components/components/reports/ReportComment.tsx index 89176df3d0..fd70067285 100644 --- a/openbas-front/src/admin/components/components/reports/ReportComment.tsx +++ b/openbas-front/src/admin/components/components/reports/ReportComment.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { Button, IconButton, Paper } from '@mui/material'; import { Edit } from '@mui/icons-material'; import MarkDownField from '../../../../components/fields/MarkDownField'; diff --git a/openbas-front/src/admin/components/components/reports/ReportPopover.tsx b/openbas-front/src/admin/components/components/reports/ReportPopover.tsx index 41e9d07ec8..39b07e2cdb 100644 --- a/openbas-front/src/admin/components/components/reports/ReportPopover.tsx +++ b/openbas-front/src/admin/components/components/reports/ReportPopover.tsx @@ -1,4 +1,5 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; +import * as React from 'react'; import ButtonPopover, { VariantButtonPopover } from '../../../../components/common/ButtonPopover'; import DialogDelete from '../../../../components/common/DialogDelete'; import Dialog from '../../../../components/common/Dialog'; diff --git a/openbas-front/src/admin/components/components/reports/Reports.tsx b/openbas-front/src/admin/components/components/reports/Reports.tsx index 31d6af7a66..5645d7efb3 100644 --- a/openbas-front/src/admin/components/components/reports/Reports.tsx +++ b/openbas-front/src/admin/components/components/reports/Reports.tsx @@ -1,4 +1,5 @@ -import React, { useContext } from 'react'; +import { useContext } from 'react'; +import * as React from 'react'; import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { ContentPasteOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/components/teams/ContextualTeams.tsx b/openbas-front/src/admin/components/components/teams/ContextualTeams.tsx index 3a9b0cd5be..7d646cb5d0 100644 --- a/openbas-front/src/admin/components/components/teams/ContextualTeams.tsx +++ b/openbas-front/src/admin/components/components/teams/ContextualTeams.tsx @@ -1,6 +1,7 @@ import { Drawer, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { CheckCircleOutlined, GroupsOutlined } from '@mui/icons-material'; -import React, { CSSProperties, useContext, useState } from 'react'; +import { CSSProperties, useContext, useState } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import { useSearchParams } from 'react-router-dom'; import ItemTags from '../../../../components/ItemTags'; diff --git a/openbas-front/src/admin/components/components/teams/CreateTeam.tsx b/openbas-front/src/admin/components/components/teams/CreateTeam.tsx index a381ed0864..82a5ccf8b1 100644 --- a/openbas-front/src/admin/components/components/teams/CreateTeam.tsx +++ b/openbas-front/src/admin/components/components/teams/CreateTeam.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; import { Fab, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { Add, ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/components/teams/TeamAddPlayers.tsx b/openbas-front/src/admin/components/components/teams/TeamAddPlayers.tsx index bbd0211a2a..cd09f89890 100644 --- a/openbas-front/src/admin/components/components/teams/TeamAddPlayers.tsx +++ b/openbas-front/src/admin/components/components/teams/TeamAddPlayers.tsx @@ -1,5 +1,6 @@ import { makeStyles } from '@mui/styles'; -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; +import * as React from 'react'; import * as R from 'ramda'; import { Avatar, Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Fab, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { Add, PersonOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/components/teams/TeamForm.tsx b/openbas-front/src/admin/components/components/teams/TeamForm.tsx index 271022d74d..92d4eb5d05 100644 --- a/openbas-front/src/admin/components/components/teams/TeamForm.tsx +++ b/openbas-front/src/admin/components/components/teams/TeamForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext } from 'react'; +import { FunctionComponent, useContext } from 'react'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/components/teams/TeamPlayers.tsx b/openbas-front/src/admin/components/components/teams/TeamPlayers.tsx index 0732c97490..1a26080575 100644 --- a/openbas-front/src/admin/components/components/teams/TeamPlayers.tsx +++ b/openbas-front/src/admin/components/components/teams/TeamPlayers.tsx @@ -1,4 +1,5 @@ -import React, { CSSProperties, useContext, useState } from 'react'; +import { CSSProperties, useContext, useState } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Typography } from '@mui/material'; import { ArrowDropDownOutlined, ArrowDropUpOutlined, CloseRounded, EmailOutlined, KeyOutlined, PersonOutlined, SmartphoneOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/components/teams/TeamPopover.tsx b/openbas-front/src/admin/components/components/teams/TeamPopover.tsx index c84001e2a5..41df3dd428 100644 --- a/openbas-front/src/admin/components/components/teams/TeamPopover.tsx +++ b/openbas-front/src/admin/components/components/teams/TeamPopover.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; +import * as React from 'react'; import { Button, Dialog as MuiDialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; import Dialog from '../../../../components/common/Dialog'; diff --git a/openbas-front/src/admin/components/components/teams/Teams.tsx b/openbas-front/src/admin/components/components/teams/Teams.tsx index 32a33c3411..87046a5ab5 100644 --- a/openbas-front/src/admin/components/components/teams/Teams.tsx +++ b/openbas-front/src/admin/components/components/teams/Teams.tsx @@ -1,6 +1,6 @@ import { Drawer, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { GroupsOutlined } from '@mui/icons-material'; -import React, { CSSProperties, useState } from 'react'; +import { CSSProperties, useState } from 'react'; import { makeStyles } from '@mui/styles'; import { useSearchParams } from 'react-router-dom'; import ItemTags from '../../../../components/ItemTags'; diff --git a/openbas-front/src/admin/components/components/teams/UpdateTeams.tsx b/openbas-front/src/admin/components/components/teams/UpdateTeams.tsx index b2c7ebd305..9b7ad4bb31 100644 --- a/openbas-front/src/admin/components/components/teams/UpdateTeams.tsx +++ b/openbas-front/src/admin/components/components/teams/UpdateTeams.tsx @@ -1,4 +1,5 @@ -import React, { useContext, useEffect, useMemo, useState } from 'react'; +import { useContext, useEffect, useMemo, useState } from 'react'; +import * as React from 'react'; import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton } from '@mui/material'; import { Add, GroupsOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/components/variables/CreateVariable.tsx b/openbas-front/src/admin/components/components/variables/CreateVariable.tsx index e5fec923c0..20b2ef602d 100644 --- a/openbas-front/src/admin/components/components/variables/CreateVariable.tsx +++ b/openbas-front/src/admin/components/components/variables/CreateVariable.tsx @@ -1,4 +1,5 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; +import * as React from 'react'; import { Dialog, DialogContent, DialogTitle, IconButton, ListItem, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { Add, ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/components/variables/VariableForm.tsx b/openbas-front/src/admin/components/components/variables/VariableForm.tsx index a9821db78e..777a1a3cc1 100644 --- a/openbas-front/src/admin/components/components/variables/VariableForm.tsx +++ b/openbas-front/src/admin/components/components/variables/VariableForm.tsx @@ -1,6 +1,6 @@ import { SubmitHandler, useForm } from 'react-hook-form'; import { Button, TextField as MuiTextField } from '@mui/material'; -import React from 'react'; +import * as React from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/components/variables/VariablePopover.tsx b/openbas-front/src/admin/components/components/variables/VariablePopover.tsx index 5e2aaeb071..4cab5fa0b9 100644 --- a/openbas-front/src/admin/components/components/variables/VariablePopover.tsx +++ b/openbas-front/src/admin/components/components/variables/VariablePopover.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/components/variables/Variables.tsx b/openbas-front/src/admin/components/components/variables/Variables.tsx index a6bf5dca43..ae9d8e53c9 100644 --- a/openbas-front/src/admin/components/components/variables/Variables.tsx +++ b/openbas-front/src/admin/components/components/variables/Variables.tsx @@ -1,6 +1,6 @@ import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { AttachMoneyOutlined } from '@mui/icons-material'; -import React, { CSSProperties, FunctionComponent, useContext } from 'react'; +import { CSSProperties, FunctionComponent, useContext } from 'react'; import { makeStyles } from '@mui/styles'; import VariablePopover from './VariablePopover'; import useSearchAnFilter from '../../../../utils/SortingFiltering'; diff --git a/openbas-front/src/admin/components/injects/InjectHeader.tsx b/openbas-front/src/admin/components/injects/InjectHeader.tsx index de4d26980e..7cf6497004 100644 --- a/openbas-front/src/admin/components/injects/InjectHeader.tsx +++ b/openbas-front/src/admin/components/injects/InjectHeader.tsx @@ -1,5 +1,5 @@ import { Tooltip, Typography } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { truncate } from '../../../utils/String'; import type { InjectResultDTO } from '../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/injects/InjectTestDetail.tsx b/openbas-front/src/admin/components/injects/InjectTestDetail.tsx index ff7660b040..e4a1f2a1a4 100644 --- a/openbas-front/src/admin/components/injects/InjectTestDetail.tsx +++ b/openbas-front/src/admin/components/injects/InjectTestDetail.tsx @@ -1,5 +1,5 @@ import { makeStyles } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Card, CardContent, CardHeader, Grid, Paper, Typography } from '@mui/material'; import { useFormatter } from '../../../components/i18n'; import type { InjectTestStatus } from '../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/injects/InjectTestList.tsx b/openbas-front/src/admin/components/injects/InjectTestList.tsx index 74986a326b..953500d50e 100644 --- a/openbas-front/src/admin/components/injects/InjectTestList.tsx +++ b/openbas-front/src/admin/components/injects/InjectTestList.tsx @@ -1,5 +1,5 @@ import { makeStyles } from '@mui/styles'; -import React, { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; +import { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import type { InjectTestStatus, SearchPaginationInput } from '../../../utils/api-types'; import { useFormatter } from '../../../components/i18n'; diff --git a/openbas-front/src/admin/components/injects/InjectTestPopover.tsx b/openbas-front/src/admin/components/injects/InjectTestPopover.tsx index a27800cada..4566735972 100644 --- a/openbas-front/src/admin/components/injects/InjectTestPopover.tsx +++ b/openbas-front/src/admin/components/injects/InjectTestPopover.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; +import * as React from 'react'; import { MoreVert } from '@mui/icons-material'; import { IconButton, Menu, MenuItem } from '@mui/material'; import type { InjectTestStatus } from '../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/injects/InjectTestReplayAll.tsx b/openbas-front/src/admin/components/injects/InjectTestReplayAll.tsx index 992f69e857..ea33da0f63 100644 --- a/openbas-front/src/admin/components/injects/InjectTestReplayAll.tsx +++ b/openbas-front/src/admin/components/injects/InjectTestReplayAll.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { IconButton, Tooltip } from '@mui/material'; import { ForwardToInbox } from '@mui/icons-material'; import { useFormatter } from '../../../components/i18n'; diff --git a/openbas-front/src/admin/components/integrations/Collectors.tsx b/openbas-front/src/admin/components/integrations/Collectors.tsx index 8f7fa490ed..c1cdd9ee68 100644 --- a/openbas-front/src/admin/components/integrations/Collectors.tsx +++ b/openbas-front/src/admin/components/integrations/Collectors.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { Card, CardContent, Chip, Grid, Typography } from '@mui/material'; import { useFormatter } from '../../../components/i18n'; diff --git a/openbas-front/src/admin/components/integrations/Executors.tsx b/openbas-front/src/admin/components/integrations/Executors.tsx index 19963c09a3..b7d0cf8d5e 100644 --- a/openbas-front/src/admin/components/integrations/Executors.tsx +++ b/openbas-front/src/admin/components/integrations/Executors.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { Card, CardContent, Chip, Grid, Typography } from '@mui/material'; import { useFormatter } from '../../../components/i18n'; diff --git a/openbas-front/src/admin/components/integrations/Index.tsx b/openbas-front/src/admin/components/integrations/Index.tsx index 1353dfe77e..f3b00e085d 100644 --- a/openbas-front/src/admin/components/integrations/Index.tsx +++ b/openbas-front/src/admin/components/integrations/Index.tsx @@ -1,4 +1,4 @@ -import React, { Suspense, lazy } from 'react'; +import { Suspense, lazy } from 'react'; import { makeStyles } from '@mui/styles'; import { Navigate, Route, Routes } from 'react-router-dom'; import { errorWrapper } from '../../../components/Error'; diff --git a/openbas-front/src/admin/components/integrations/Injectors.tsx b/openbas-front/src/admin/components/integrations/Injectors.tsx index 5129433b28..5375044177 100644 --- a/openbas-front/src/admin/components/integrations/Injectors.tsx +++ b/openbas-front/src/admin/components/integrations/Injectors.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { Link } from 'react-router-dom'; import { Card, CardActionArea, CardContent, Chip, Grid, Tooltip, Typography } from '@mui/material'; diff --git a/openbas-front/src/admin/components/integrations/injectors/Index.tsx b/openbas-front/src/admin/components/integrations/injectors/Index.tsx index baa18ad6f2..ef329c06ae 100644 --- a/openbas-front/src/admin/components/integrations/injectors/Index.tsx +++ b/openbas-front/src/admin/components/integrations/injectors/Index.tsx @@ -1,4 +1,4 @@ -import React, { lazy } from 'react'; +import { lazy } from 'react'; import { Route, Routes, useParams } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; import { fetchInjector } from '../../../../actions/Injectors'; diff --git a/openbas-front/src/admin/components/integrations/injectors/InjectorContracts.js b/openbas-front/src/admin/components/integrations/injectors/InjectorContracts.js index 137b8995dd..6402bd1bda 100644 --- a/openbas-front/src/admin/components/integrations/injectors/InjectorContracts.js +++ b/openbas-front/src/admin/components/integrations/injectors/InjectorContracts.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import * as R from 'ramda'; import { Chip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; diff --git a/openbas-front/src/admin/components/integrations/injectors/InjectorHeader.js b/openbas-front/src/admin/components/integrations/injectors/InjectorHeader.js index cf27b5e557..cd9b6d8c40 100644 --- a/openbas-front/src/admin/components/integrations/injectors/InjectorHeader.js +++ b/openbas-front/src/admin/components/integrations/injectors/InjectorHeader.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { Typography } from '@mui/material'; import { useParams } from 'react-router-dom'; diff --git a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/CreateInjectorContract.js b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/CreateInjectorContract.js index e8b18fdaa6..79d7504f12 100644 --- a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/CreateInjectorContract.js +++ b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/CreateInjectorContract.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { v4 as uuid } from 'uuid'; import { connect } from 'react-redux'; diff --git a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractCustomForm.js b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractCustomForm.js index 9abbcecec7..40153526ce 100644 --- a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractCustomForm.js +++ b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractCustomForm.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import * as R from 'ramda'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; diff --git a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractForm.js b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractForm.js index 2c381b89da..a99c410d90 100644 --- a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractForm.js +++ b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractPopover.js b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractPopover.js index 6694585116..c8d3b56b1d 100644 --- a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractPopover.js +++ b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractPopover.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; diff --git a/openbas-front/src/admin/components/lessons/CreateObjective.js b/openbas-front/src/admin/components/lessons/CreateObjective.js index fcefbc076e..4126a82b6d 100644 --- a/openbas-front/src/admin/components/lessons/CreateObjective.js +++ b/openbas-front/src/admin/components/lessons/CreateObjective.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { withStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/lessons/ObjectiveEvaluations.js b/openbas-front/src/admin/components/lessons/ObjectiveEvaluations.js index 02f88c94fe..dc1ea9ae88 100644 --- a/openbas-front/src/admin/components/lessons/ObjectiveEvaluations.js +++ b/openbas-front/src/admin/components/lessons/ObjectiveEvaluations.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; import { Box, Button, LinearProgress, List, ListItem, ListItemIcon, ListItemText, Slider, Typography } from '@mui/material'; import { HowToVoteOutlined } from '@mui/icons-material'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/lessons/ObjectiveForm.js b/openbas-front/src/admin/components/lessons/ObjectiveForm.js index da9f242c0c..3ca507a35e 100644 --- a/openbas-front/src/admin/components/lessons/ObjectiveForm.js +++ b/openbas-front/src/admin/components/lessons/ObjectiveForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/lessons/ObjectivePopover.js b/openbas-front/src/admin/components/lessons/ObjectivePopover.js index bd9d937377..96a2c71b32 100644 --- a/openbas-front/src/admin/components/lessons/ObjectivePopover.js +++ b/openbas-front/src/admin/components/lessons/ObjectivePopover.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem } from '@mui/material'; diff --git a/openbas-front/src/admin/components/lessons/SendLessonsForm.js b/openbas-front/src/admin/components/lessons/SendLessonsForm.js index 1c91afee80..0ffbe0ad6d 100644 --- a/openbas-front/src/admin/components/lessons/SendLessonsForm.js +++ b/openbas-front/src/admin/components/lessons/SendLessonsForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/lessons/categories/CreateLessonsCategory.js b/openbas-front/src/admin/components/lessons/categories/CreateLessonsCategory.js index 261c16bf10..700a0161c8 100644 --- a/openbas-front/src/admin/components/lessons/categories/CreateLessonsCategory.js +++ b/openbas-front/src/admin/components/lessons/categories/CreateLessonsCategory.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { forwardRef, useContext, useState } from 'react'; import { Dialog, DialogContent, DialogTitle, ListItem, ListItemIcon, ListItemText, Slide } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; @@ -7,7 +7,7 @@ import LessonsCategoryForm from './LessonsCategoryForm'; import ButtonCreate from '../../../../components/common/ButtonCreate'; import { LessonContext } from '../../common/Context'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryAddTeams.js b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryAddTeams.js index 0b2fb87210..c832ba45f2 100644 --- a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryAddTeams.js +++ b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryAddTeams.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, IconButton, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; diff --git a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryForm.js b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryForm.js index a489997c19..5c48fb9f96 100644 --- a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryForm.js +++ b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; import OldTextField from '../../../../components/fields/OldTextField'; diff --git a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryPopover.js b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryPopover.js index 777167b808..8a938bd873 100644 --- a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryPopover.js +++ b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryPopover.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { forwardRef, useContext, useState } from 'react'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; @@ -7,7 +7,7 @@ import LessonsCategoryForm from './LessonsCategoryForm'; import { useFormatter } from '../../../../components/i18n'; import { LessonContext } from '../../common/Context'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/lessons/categories/questions/CreateLessonsQuestion.js b/openbas-front/src/admin/components/lessons/categories/questions/CreateLessonsQuestion.js index 620111e43c..92b9c7b9cc 100644 --- a/openbas-front/src/admin/components/lessons/categories/questions/CreateLessonsQuestion.js +++ b/openbas-front/src/admin/components/lessons/categories/questions/CreateLessonsQuestion.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { forwardRef, useContext, useState } from 'react'; import { IconButton, Dialog, DialogTitle, DialogContent, Slide, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { Add, ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; @@ -6,7 +6,7 @@ import { useFormatter } from '../../../../../components/i18n'; import LessonsQuestionForm from './LessonsQuestionForm'; import { LessonContext } from '../../../common/Context'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionForm.js b/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionForm.js index 4a1e6f5f92..52bef68f77 100644 --- a/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionForm.js +++ b/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; import OldTextField from '../../../../../components/fields/OldTextField'; diff --git a/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionPopover.js b/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionPopover.js index 50ad95112e..74a28c7f34 100644 --- a/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionPopover.js +++ b/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionPopover.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { forwardRef, useContext, useState } from 'react'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; @@ -6,7 +6,7 @@ import LessonsQuestionForm from './LessonsQuestionForm'; import { useFormatter } from '../../../../../components/i18n'; import { LessonContext } from '../../../common/Context'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/lessons/exercises/AnswersByQuestionDialog.tsx b/openbas-front/src/admin/components/lessons/exercises/AnswersByQuestionDialog.tsx index bdc79ac9a6..b6702a2b82 100644 --- a/openbas-front/src/admin/components/lessons/exercises/AnswersByQuestionDialog.tsx +++ b/openbas-front/src/admin/components/lessons/exercises/AnswersByQuestionDialog.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { Button, LinearProgress, Typography, useTheme } from '@mui/material'; import Dialog from '../../../../components/common/Dialog'; diff --git a/openbas-front/src/admin/components/lessons/exercises/Lessons.tsx b/openbas-front/src/admin/components/lessons/exercises/Lessons.tsx index 3a87de481d..bcb3dd920b 100644 --- a/openbas-front/src/admin/components/lessons/exercises/Lessons.tsx +++ b/openbas-front/src/admin/components/lessons/exercises/Lessons.tsx @@ -1,4 +1,5 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; +import * as React from 'react'; import { BallotOutlined, ContactMailOutlined, diff --git a/openbas-front/src/admin/components/lessons/exercises/LessonsCategories.js b/openbas-front/src/admin/components/lessons/exercises/LessonsCategories.js index 0c0b20e32c..063572067f 100644 --- a/openbas-front/src/admin/components/lessons/exercises/LessonsCategories.js +++ b/openbas-front/src/admin/components/lessons/exercises/LessonsCategories.js @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import { useContext } from 'react'; import { makeStyles } from '@mui/styles'; import { Box, Chip, Grid, LinearProgress, List, ListItem, ListItemButton, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Tooltip, Typography } from '@mui/material'; import { CastForEducationOutlined, HelpOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/lessons/exercises/LessonsObjectives.js b/openbas-front/src/admin/components/lessons/exercises/LessonsObjectives.js index 109660533d..a9bfe6c4f7 100644 --- a/openbas-front/src/admin/components/lessons/exercises/LessonsObjectives.js +++ b/openbas-front/src/admin/components/lessons/exercises/LessonsObjectives.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Box, Grid, LinearProgress, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Typography } from '@mui/material'; import { FlagOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/lessons/scenarios/Lessons.tsx b/openbas-front/src/admin/components/lessons/scenarios/Lessons.tsx index 51cd2a0a13..fcf456ee3f 100644 --- a/openbas-front/src/admin/components/lessons/scenarios/Lessons.tsx +++ b/openbas-front/src/admin/components/lessons/scenarios/Lessons.tsx @@ -1,4 +1,5 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; +import * as React from 'react'; import { ContentPasteGoOutlined, DeleteSweepOutlined, VisibilityOutlined } from '@mui/icons-material'; import { Alert, diff --git a/openbas-front/src/admin/components/lessons/scenarios/LessonsCategories.js b/openbas-front/src/admin/components/lessons/scenarios/LessonsCategories.js index 5cfd9e4842..ccc3f07e0b 100644 --- a/openbas-front/src/admin/components/lessons/scenarios/LessonsCategories.js +++ b/openbas-front/src/admin/components/lessons/scenarios/LessonsCategories.js @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import { useContext } from 'react'; import { makeStyles } from '@mui/styles'; import { Chip, Grid, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Tooltip, Typography } from '@mui/material'; import { CastForEducationOutlined, HelpOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/lessons/scenarios/LessonsObjectives.js b/openbas-front/src/admin/components/lessons/scenarios/LessonsObjectives.js index 0c08f7ee21..279a3535a7 100644 --- a/openbas-front/src/admin/components/lessons/scenarios/LessonsObjectives.js +++ b/openbas-front/src/admin/components/lessons/scenarios/LessonsObjectives.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { Box, Grid, LinearProgress, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Typography } from '@mui/material'; import { FlagOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/mitigations/CreateMitigation.js b/openbas-front/src/admin/components/mitigations/CreateMitigation.js index e100a4d990..7943443ca8 100644 --- a/openbas-front/src/admin/components/mitigations/CreateMitigation.js +++ b/openbas-front/src/admin/components/mitigations/CreateMitigation.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/mitigations/MitigationForm.js b/openbas-front/src/admin/components/mitigations/MitigationForm.js index dff4a38eee..82c2f8c8af 100644 --- a/openbas-front/src/admin/components/mitigations/MitigationForm.js +++ b/openbas-front/src/admin/components/mitigations/MitigationForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/mitigations/MitigationPopover.js b/openbas-front/src/admin/components/mitigations/MitigationPopover.js index 7a57a34aef..eafde9c70c 100644 --- a/openbas-front/src/admin/components/mitigations/MitigationPopover.js +++ b/openbas-front/src/admin/components/mitigations/MitigationPopover.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; diff --git a/openbas-front/src/admin/components/mitigations/Mitigations.js b/openbas-front/src/admin/components/mitigations/Mitigations.js index 93cbe293e3..380cb21645 100644 --- a/openbas-front/src/admin/components/mitigations/Mitigations.js +++ b/openbas-front/src/admin/components/mitigations/Mitigations.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { useDispatch } from 'react-redux'; diff --git a/openbas-front/src/admin/components/nav/LeftBar.tsx b/openbas-front/src/admin/components/nav/LeftBar.tsx index 5034809275..86e65dad08 100644 --- a/openbas-front/src/admin/components/nav/LeftBar.tsx +++ b/openbas-front/src/admin/components/nav/LeftBar.tsx @@ -1,4 +1,4 @@ -import React, { LegacyRef, MutableRefObject, ReactNode, useRef, useState } from 'react'; +import { LegacyRef, MutableRefObject, ReactNode, useRef, useState } from 'react'; import { Link, useLocation, useNavigate } from 'react-router-dom'; import { Collapse, Divider, Drawer, ListItemIcon, ListItemText, MenuItem, MenuList, Popover, Toolbar, Tooltip, tooltipClasses } from '@mui/material'; import { diff --git a/openbas-front/src/admin/components/nav/TopBar.tsx b/openbas-front/src/admin/components/nav/TopBar.tsx index 214e0372ee..09c7f7e229 100644 --- a/openbas-front/src/admin/components/nav/TopBar.tsx +++ b/openbas-front/src/admin/components/nav/TopBar.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; +import * as React from 'react'; import { AppBar, Badge, Box, Grid, IconButton, Menu, MenuItem, Popover, Toolbar, Tooltip } from '@mui/material'; import { Link, useLocation, useNavigate, useSearchParams } from 'react-router-dom'; import { AccountCircleOutlined, AppsOutlined, ImportantDevicesOutlined, NotificationsOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/payloads/CreatePayload.js b/openbas-front/src/admin/components/payloads/CreatePayload.js index bdb772d355..c85b0d79b7 100644 --- a/openbas-front/src/admin/components/payloads/CreatePayload.js +++ b/openbas-front/src/admin/components/payloads/CreatePayload.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/payloads/PayloadForm.tsx b/openbas-front/src/admin/components/payloads/PayloadForm.tsx index 120c4a6f01..ed59d41754 100644 --- a/openbas-front/src/admin/components/payloads/PayloadForm.tsx +++ b/openbas-front/src/admin/components/payloads/PayloadForm.tsx @@ -1,4 +1,4 @@ -import React, { FormEvent, FunctionComponent } from 'react'; +import { FormEvent, FunctionComponent } from 'react'; import { Controller, SubmitHandler, useFieldArray, useForm } from 'react-hook-form'; import { Button, IconButton, InputLabel, List, ListItem, ListItemText, MenuItem, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/payloads/PayloadPopover.js b/openbas-front/src/admin/components/payloads/PayloadPopover.js index 6b69ee6b7c..0d890eb3fd 100644 --- a/openbas-front/src/admin/components/payloads/PayloadPopover.js +++ b/openbas-front/src/admin/components/payloads/PayloadPopover.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; diff --git a/openbas-front/src/admin/components/payloads/Payloads.tsx b/openbas-front/src/admin/components/payloads/Payloads.tsx index 0090dea1fd..716469556e 100644 --- a/openbas-front/src/admin/components/payloads/Payloads.tsx +++ b/openbas-front/src/admin/components/payloads/Payloads.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, useMemo, useState } from 'react'; +import { CSSProperties, useMemo, useState } from 'react'; import { Chip, Grid, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { searchPayloads } from '../../../actions/Payload'; diff --git a/openbas-front/src/admin/components/profile/Index.js b/openbas-front/src/admin/components/profile/Index.js index 2f14b08ca7..e623431680 100644 --- a/openbas-front/src/admin/components/profile/Index.js +++ b/openbas-front/src/admin/components/profile/Index.js @@ -1,4 +1,3 @@ -import React from 'react'; import { useDispatch } from 'react-redux'; import * as R from 'ramda'; import { Button, Typography } from '@mui/material'; diff --git a/openbas-front/src/admin/components/profile/PasswordForm.js b/openbas-front/src/admin/components/profile/PasswordForm.js index 5fda99a58b..bfee2ef4b0 100644 --- a/openbas-front/src/admin/components/profile/PasswordForm.js +++ b/openbas-front/src/admin/components/profile/PasswordForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/profile/ProfileForm.js b/openbas-front/src/admin/components/profile/ProfileForm.js index e55cfc1768..d35f8a8c65 100644 --- a/openbas-front/src/admin/components/profile/ProfileForm.js +++ b/openbas-front/src/admin/components/profile/ProfileForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/profile/UserForm.js b/openbas-front/src/admin/components/profile/UserForm.js index e0a325e7d8..2756dc9e91 100644 --- a/openbas-front/src/admin/components/profile/UserForm.js +++ b/openbas-front/src/admin/components/profile/UserForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import { Form } from 'react-final-form'; import { MenuItem, Button } from '@mui/material'; import { z } from 'zod'; diff --git a/openbas-front/src/admin/components/scenarios/ImportUploaderScenario.tsx b/openbas-front/src/admin/components/scenarios/ImportUploaderScenario.tsx index b35e7ac129..1a504163ab 100644 --- a/openbas-front/src/admin/components/scenarios/ImportUploaderScenario.tsx +++ b/openbas-front/src/admin/components/scenarios/ImportUploaderScenario.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useNavigate } from 'react-router-dom'; import { useAppDispatch } from '../../../utils/hooks'; import ImportUploader from '../../../components/common/ImportUploader'; diff --git a/openbas-front/src/admin/components/scenarios/ScenarioCreation.tsx b/openbas-front/src/admin/components/scenarios/ScenarioCreation.tsx index 86bd8e6aee..ea53f02226 100644 --- a/openbas-front/src/admin/components/scenarios/ScenarioCreation.tsx +++ b/openbas-front/src/admin/components/scenarios/ScenarioCreation.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import ButtonCreate from '../../../components/common/ButtonCreate'; import { useFormatter } from '../../../components/i18n'; diff --git a/openbas-front/src/admin/components/scenarios/ScenarioForm.tsx b/openbas-front/src/admin/components/scenarios/ScenarioForm.tsx index 74fe2b92e0..3e73c055ce 100644 --- a/openbas-front/src/admin/components/scenarios/ScenarioForm.tsx +++ b/openbas-front/src/admin/components/scenarios/ScenarioForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; diff --git a/openbas-front/src/admin/components/scenarios/Scenarios.tsx b/openbas-front/src/admin/components/scenarios/Scenarios.tsx index 8bf21bcf05..c39782ffed 100644 --- a/openbas-front/src/admin/components/scenarios/Scenarios.tsx +++ b/openbas-front/src/admin/components/scenarios/Scenarios.tsx @@ -1,7 +1,7 @@ import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemButton, ListItemIcon, ListItemText, ToggleButtonGroup } from '@mui/material'; import { MovieFilterOutlined } from '@mui/icons-material'; -import React, { CSSProperties, useMemo, useState } from 'react'; +import { CSSProperties, useMemo, useState } from 'react'; import { Link } from 'react-router-dom'; import { useFormatter } from '../../../components/i18n'; import { useHelper } from '../../../store'; diff --git a/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx b/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx index 569be9e1df..7fb296cc09 100644 --- a/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx +++ b/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx @@ -1,6 +1,6 @@ import classNames from 'classnames'; import { Card, CardActionArea, CardContent } from '@mui/material'; -import React, { FunctionComponent, useEffect, useState } from 'react'; +import { FunctionComponent, useEffect, useState } from 'react'; import { makeStyles } from '@mui/styles'; import ItemCategory from '../../../components/ItemCategory'; import { scenarioCategories } from './ScenarioForm'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/Index.tsx b/openbas-front/src/admin/components/scenarios/scenario/Index.tsx index 87650f15b5..f7e1c3560e 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/Index.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/Index.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, lazy, Suspense, useState } from 'react'; +import { FunctionComponent, lazy, Suspense, useState } from 'react'; import { Link, Route, Routes, useLocation, useParams } from 'react-router-dom'; import { Alert, AlertTitle, Box, IconButton, Tab, Tabs, Tooltip } from '@mui/material'; import cronstrue from 'cronstrue'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/Scenario.tsx b/openbas-front/src/admin/components/scenarios/scenario/Scenario.tsx index 8c287205f0..a798d0f7be 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/Scenario.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/Scenario.tsx @@ -1,5 +1,6 @@ import { Link, useParams } from 'react-router-dom'; -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { Avatar, Button, Chip, Grid, Paper, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; import { PlayArrowOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioDefinition.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioDefinition.tsx index 13160d2afd..02fbabf36b 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioDefinition.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioDefinition.tsx @@ -1,5 +1,4 @@ import { useParams } from 'react-router-dom'; -import React from 'react'; import { Grid, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { useHelper } from '../../../../store'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioDistributionByExercise.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioDistributionByExercise.tsx index 355ad870c2..82eb8b0b04 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioDistributionByExercise.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioDistributionByExercise.tsx @@ -1,5 +1,5 @@ import Chart from 'react-apexcharts'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useTheme } from '@mui/styles'; import type { ApexOptions } from 'apexcharts'; import type { ExerciseSimpleStore } from '../../../../actions/exercises/Exercise'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioExportDialog.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioExportDialog.tsx index c14ce5c9e4..9038a39502 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioExportDialog.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioExportDialog.tsx @@ -1,5 +1,5 @@ import { Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material'; -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioHeader.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioHeader.tsx index 31cc6526d6..8cd0ab74e9 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioHeader.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioHeader.tsx @@ -1,5 +1,6 @@ import { Link, useNavigate, useParams } from 'react-router-dom'; -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; +import * as React from 'react'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, Tooltip, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; import { PlayArrowOutlined, Stop } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioPopover.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioPopover.tsx index b2c366ced6..0121149935 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioPopover.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioPopover.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useFormatter } from '../../../../components/i18n'; import { useAppDispatch } from '../../../../utils/hooks'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioRecurringFormDialog.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioRecurringFormDialog.tsx index 03fce9c457..03b588a14f 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioRecurringFormDialog.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioRecurringFormDialog.tsx @@ -1,4 +1,5 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; +import * as React from 'react'; import { Button, Dialog, DialogActions, DialogContent, DialogTitle, FormControl, FormControlLabel, InputLabel, MenuItem, Select, Stack, Switch } from '@mui/material'; import { TimePicker, DateTimePicker } from '@mui/x-date-pickers'; import { Controller, useForm } from 'react-hook-form'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioStatus.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioStatus.tsx index 12d24d9553..b83563a5a1 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioStatus.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioStatus.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import { Chip } from '@mui/material'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioUpdate.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioUpdate.tsx index c0b7713598..c242cd9dd5 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioUpdate.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioUpdate.tsx @@ -1,5 +1,6 @@ import { Box, Tab, Tabs } from '@mui/material'; -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; +import * as React from 'react'; import ScenarioForm from '../ScenarioForm'; import EmailParametersForm, { SettingUpdateInput } from '../../common/simulate/EmailParametersForm'; import Drawer from '../../../../components/common/Drawer'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx b/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx index b686c6ffee..dd2424a2a7 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx @@ -1,5 +1,4 @@ import { useParams } from 'react-router-dom'; -import React from 'react'; import { useHelper } from '../../../../../store'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { addScenarioArticle, deleteScenarioArticle, fetchScenarioArticles, updateScenarioArticle } from '../../../../../actions/channels/article-action'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/challenges/ScenarioChallenges.tsx b/openbas-front/src/admin/components/scenarios/scenario/challenges/ScenarioChallenges.tsx index 0733082996..a74aa3d99d 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/challenges/ScenarioChallenges.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/challenges/ScenarioChallenges.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useParams } from 'react-router-dom'; import { useAppDispatch } from '../../../../../utils/hooks'; import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx b/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx index 9719b55d95..b4db16c726 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useParams } from 'react-router-dom'; import { ArticleContext, TeamContext, ViewModeContext } from '../../../common/Context'; import { useAppDispatch } from '../../../../../utils/hooks'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/lessons/ScenarioLessons.tsx b/openbas-front/src/admin/components/scenarios/scenario/lessons/ScenarioLessons.tsx index 354419987f..55a3289d5d 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/lessons/ScenarioLessons.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/lessons/ScenarioLessons.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useParams } from 'react-router-dom'; import { useAppDispatch } from '../../../../../utils/hooks'; import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx b/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx index 5721390ae0..6eecb10bc3 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx @@ -1,5 +1,6 @@ import { useParams } from 'react-router-dom'; -import React, { useContext, useEffect, useState } from 'react'; +import { useContext, useEffect, useState } from 'react'; +import * as React from 'react'; import { Paper, Typography } from '@mui/material'; import { useHelper } from '../../../../../store'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/tests/ScenarioTests.tsx b/openbas-front/src/admin/components/scenarios/scenario/tests/ScenarioTests.tsx index e6b837e17b..1578a71264 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/tests/ScenarioTests.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/tests/ScenarioTests.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useParams } from 'react-router-dom'; import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; import type { InjectTestStatus } from '../../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/variables/ScenarioVariables.tsx b/openbas-front/src/admin/components/scenarios/scenario/variables/ScenarioVariables.tsx index 7ab67f9064..423a2d9e39 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/variables/ScenarioVariables.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/variables/ScenarioVariables.tsx @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import { useContext } from 'react'; import { useParams } from 'react-router-dom'; import { Paper, Typography } from '@mui/material'; import Variables from '../../../components/variables/Variables'; diff --git a/openbas-front/src/admin/components/search/FullTextSearch.tsx b/openbas-front/src/admin/components/search/FullTextSearch.tsx index e7913d370e..f4331438b1 100644 --- a/openbas-front/src/admin/components/search/FullTextSearch.tsx +++ b/openbas-front/src/admin/components/search/FullTextSearch.tsx @@ -1,4 +1,5 @@ -import React, { CSSProperties, useEffect, useState } from 'react'; +import { CSSProperties, useEffect, useState } from 'react'; +import * as React from 'react'; import { Link, useSearchParams } from 'react-router-dom'; import { Box, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Tab, Tabs } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/settings/DataIngestionMenu.tsx b/openbas-front/src/admin/components/settings/DataIngestionMenu.tsx index b140613cbb..23c2e1d68b 100644 --- a/openbas-front/src/admin/components/settings/DataIngestionMenu.tsx +++ b/openbas-front/src/admin/components/settings/DataIngestionMenu.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { TableViewOutlined } from '@mui/icons-material'; import RightMenu, { RightMenuEntry } from '../../../components/common/RightMenu'; diff --git a/openbas-front/src/admin/components/settings/Index.tsx b/openbas-front/src/admin/components/settings/Index.tsx index a96424e054..f1b3e981d2 100644 --- a/openbas-front/src/admin/components/settings/Index.tsx +++ b/openbas-front/src/admin/components/settings/Index.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; import XlsMappers from './data_ingestion/XlsMappers'; import Parameters from './Parameters'; diff --git a/openbas-front/src/admin/components/settings/Parameters.tsx b/openbas-front/src/admin/components/settings/Parameters.tsx index 35c4740920..f29fdc9010 100644 --- a/openbas-front/src/admin/components/settings/Parameters.tsx +++ b/openbas-front/src/admin/components/settings/Parameters.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { Button, Grid, List, ListItem, ListItemText, Paper, Switch, TextField, Typography } from '@mui/material'; import ParametersForm from './ParametersForm'; diff --git a/openbas-front/src/admin/components/settings/ParametersForm.js b/openbas-front/src/admin/components/settings/ParametersForm.js index fc20027192..cd195870b1 100644 --- a/openbas-front/src/admin/components/settings/ParametersForm.js +++ b/openbas-front/src/admin/components/settings/ParametersForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { MenuItem, Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/settings/SecurityMenu.tsx b/openbas-front/src/admin/components/settings/SecurityMenu.tsx index 7c8daae1f6..f68aee271f 100644 --- a/openbas-front/src/admin/components/settings/SecurityMenu.tsx +++ b/openbas-front/src/admin/components/settings/SecurityMenu.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { GroupsOutlined, LocalPoliceOutlined, PermIdentityOutlined } from '@mui/icons-material'; import RightMenu, { RightMenuEntry } from '../../../components/common/RightMenu'; diff --git a/openbas-front/src/admin/components/settings/TaxonomiesMenu.tsx b/openbas-front/src/admin/components/settings/TaxonomiesMenu.tsx index 0007078f58..c7194871dd 100644 --- a/openbas-front/src/admin/components/settings/TaxonomiesMenu.tsx +++ b/openbas-front/src/admin/components/settings/TaxonomiesMenu.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { Link, useLocation } from 'react-router-dom'; import { Drawer, MenuList, MenuItem, ListItemIcon, ListItemText } from '@mui/material'; import { LockPattern } from 'mdi-material-ui'; diff --git a/openbas-front/src/admin/components/settings/ThemeForm.tsx b/openbas-front/src/admin/components/settings/ThemeForm.tsx index c395c0ae4c..ddbcfca8ff 100644 --- a/openbas-front/src/admin/components/settings/ThemeForm.tsx +++ b/openbas-front/src/admin/components/settings/ThemeForm.tsx @@ -1,6 +1,6 @@ import { SubmitHandler, useForm } from 'react-hook-form'; import { Button, TextField as MuiTextField } from '@mui/material'; -import React from 'react'; +import * as React from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternForm.js b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternForm.js index 7137930d34..259211352d 100644 --- a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternForm.js +++ b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternPopover.js b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternPopover.js index cfa701c9bc..f7cc03cff6 100644 --- a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternPopover.js +++ b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternPopover.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; diff --git a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatterns.js b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatterns.js index e76bf147b7..56f062cb50 100644 --- a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatterns.js +++ b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatterns.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/settings/attack_patterns/CreateAttackPattern.js b/openbas-front/src/admin/components/settings/attack_patterns/CreateAttackPattern.js index 1897e7d0f4..fe8a007918 100644 --- a/openbas-front/src/admin/components/settings/attack_patterns/CreateAttackPattern.js +++ b/openbas-front/src/admin/components/settings/attack_patterns/CreateAttackPattern.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/ImportUploaderMapper.tsx b/openbas-front/src/admin/components/settings/data_ingestion/ImportUploaderMapper.tsx index 5a56012915..2649e352a1 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/ImportUploaderMapper.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/ImportUploaderMapper.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useNavigate } from 'react-router-dom'; import ImportUploader from '../../../../components/common/ImportUploader'; import { importMapper } from '../../../../actions/mapper/mapper-actions'; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/XlsMapperPopover.tsx b/openbas-front/src/admin/components/settings/data_ingestion/XlsMapperPopover.tsx index 58c777b3ca..0da44df362 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/XlsMapperPopover.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/XlsMapperPopover.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { PopoverEntry } from '../../../../components/common/ButtonPopover'; import IconPopover from '../../../../components/common/IconPopover'; import type { RawPaginationImportMapper } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/XlsMappers.tsx b/openbas-front/src/admin/components/settings/data_ingestion/XlsMappers.tsx index 998dbe8928..602e0e9e6a 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/XlsMappers.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/XlsMappers.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, useState } from 'react'; +import { CSSProperties, useState } from 'react'; import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { TableViewOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/MapperForm.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/MapperForm.tsx index 2a2c82b1b3..4038c896e5 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/MapperForm.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/MapperForm.tsx @@ -1,5 +1,6 @@ import { Controller, SubmitHandler, useFieldArray, useForm } from 'react-hook-form'; -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { Button, IconButton, TextField, Typography } from '@mui/material'; import { Add } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/RulesContractContent.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/RulesContractContent.tsx index 61717dbaf8..fb5133d0e4 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/RulesContractContent.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/RulesContractContent.tsx @@ -18,7 +18,8 @@ import { } from '@mui/material'; import { DeleteOutlined, ExpandMore } from '@mui/icons-material'; import { CogOutline, InformationOutline } from 'mdi-material-ui'; -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import classNames from 'classnames'; import { directFetchInjectorContract } from '../../../../../actions/InjectorContracts'; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperCreation.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperCreation.tsx index 057d6a1253..ece4e5cd98 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperCreation.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperCreation.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import { Fab } from '@mui/material'; import { Add } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperTestDialog.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperTestDialog.tsx index 755c4f41cd..d16e2cff77 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperTestDialog.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperTestDialog.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useFormatter } from '../../../../../components/i18n'; import ImportUploaderInjectFromXlsFile from '../../../common/injects/ImportUploaderInjectFromXlsFile'; import type { ImportMapperAddInput, ImportPostSummary } from '../../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperUpdate.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperUpdate.tsx index b625d117f1..06ccddbe7c 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperUpdate.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperUpdate.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useEffect, useState } from 'react'; +import { FunctionComponent, useEffect, useState } from 'react'; import MapperForm from './MapperForm'; import { fetchMapper, updateMapper } from '../../../../../actions/mapper/mapper-actions'; import type { ImportMapperUpdateInput, RawPaginationImportMapper } from '../../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/settings/groups/CreateGroup.js b/openbas-front/src/admin/components/settings/groups/CreateGroup.js index 25364c3c39..a218c26e14 100644 --- a/openbas-front/src/admin/components/settings/groups/CreateGroup.js +++ b/openbas-front/src/admin/components/settings/groups/CreateGroup.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/settings/groups/GroupForm.js b/openbas-front/src/admin/components/settings/groups/GroupForm.js index 1410a6f18d..e6960b7067 100644 --- a/openbas-front/src/admin/components/settings/groups/GroupForm.js +++ b/openbas-front/src/admin/components/settings/groups/GroupForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button, Grid, Tooltip, Typography } from '@mui/material'; diff --git a/openbas-front/src/admin/components/settings/groups/GroupPopover.js b/openbas-front/src/admin/components/settings/groups/GroupPopover.js index b8e5b534d8..3f3ea22bad 100644 --- a/openbas-front/src/admin/components/settings/groups/GroupPopover.js +++ b/openbas-front/src/admin/components/settings/groups/GroupPopover.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/settings/groups/Groups.js b/openbas-front/src/admin/components/settings/groups/Groups.js index a487ebd47e..9f95a48be2 100644 --- a/openbas-front/src/admin/components/settings/groups/Groups.js +++ b/openbas-front/src/admin/components/settings/groups/Groups.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Tooltip } from '@mui/material'; import { useDispatch } from 'react-redux'; diff --git a/openbas-front/src/admin/components/settings/kill_chain_phases/CreateKillChainPhase.js b/openbas-front/src/admin/components/settings/kill_chain_phases/CreateKillChainPhase.js index 8d4ae48fce..064f126af7 100644 --- a/openbas-front/src/admin/components/settings/kill_chain_phases/CreateKillChainPhase.js +++ b/openbas-front/src/admin/components/settings/kill_chain_phases/CreateKillChainPhase.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhaseForm.js b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhaseForm.js index 63139a4ef7..9dc09e53fa 100644 --- a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhaseForm.js +++ b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhaseForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhasePopover.js b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhasePopover.js index 547e6849ab..4982e15add 100644 --- a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhasePopover.js +++ b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhasePopover.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhases.js b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhases.js index 0890bd6c80..fecc6aa609 100644 --- a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhases.js +++ b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhases.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, Chip, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { RouteOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/settings/policies/Policies.tsx b/openbas-front/src/admin/components/settings/policies/Policies.tsx index ebdb1c970f..6a8f81dc99 100644 --- a/openbas-front/src/admin/components/settings/policies/Policies.tsx +++ b/openbas-front/src/admin/components/settings/policies/Policies.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Grid, Paper, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/settings/policies/PolicyForm.tsx b/openbas-front/src/admin/components/settings/policies/PolicyForm.tsx index 47c4dd81ff..33895e9b5a 100644 --- a/openbas-front/src/admin/components/settings/policies/PolicyForm.tsx +++ b/openbas-front/src/admin/components/settings/policies/PolicyForm.tsx @@ -1,4 +1,5 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; +import * as React from 'react'; import { useForm, FormProvider, SubmitHandler } from 'react-hook-form'; import { Button } from '@mui/material'; import MarkDownFieldController from '../../../../components/fields/MarkDownFieldController'; diff --git a/openbas-front/src/admin/components/settings/tags/CreateTag.js b/openbas-front/src/admin/components/settings/tags/CreateTag.js index 92c8db0ccc..25dcd7428c 100644 --- a/openbas-front/src/admin/components/settings/tags/CreateTag.js +++ b/openbas-front/src/admin/components/settings/tags/CreateTag.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/settings/tags/TagForm.js b/openbas-front/src/admin/components/settings/tags/TagForm.js index 4c51d79834..c678218e62 100644 --- a/openbas-front/src/admin/components/settings/tags/TagForm.js +++ b/openbas-front/src/admin/components/settings/tags/TagForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/settings/tags/TagPopover.js b/openbas-front/src/admin/components/settings/tags/TagPopover.js index d1018288ea..33f04262e4 100644 --- a/openbas-front/src/admin/components/settings/tags/TagPopover.js +++ b/openbas-front/src/admin/components/settings/tags/TagPopover.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { forwardRef, Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; @@ -9,7 +9,7 @@ import TagForm from './TagForm'; import inject18n from '../../../../components/i18n'; import Drawer from '../../../../components/common/Drawer'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/settings/tags/Tags.js b/openbas-front/src/admin/components/settings/tags/Tags.js index ee242e1058..e7d9378c1a 100644 --- a/openbas-front/src/admin/components/settings/tags/Tags.js +++ b/openbas-front/src/admin/components/settings/tags/Tags.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemText, ListItemSecondaryAction } from '@mui/material'; import { LabelOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/settings/users/CreateUser.js b/openbas-front/src/admin/components/settings/users/CreateUser.js index 049c132310..1cd788ff4e 100644 --- a/openbas-front/src/admin/components/settings/users/CreateUser.js +++ b/openbas-front/src/admin/components/settings/users/CreateUser.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { forwardRef, Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; @@ -18,7 +18,7 @@ const styles = () => ({ }, }); -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/settings/users/UserForm.js b/openbas-front/src/admin/components/settings/users/UserForm.js index 5992a99014..cd2a592631 100644 --- a/openbas-front/src/admin/components/settings/users/UserForm.js +++ b/openbas-front/src/admin/components/settings/users/UserForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/settings/users/UserPasswordForm.js b/openbas-front/src/admin/components/settings/users/UserPasswordForm.js index 26a923ca86..ce6afd872b 100644 --- a/openbas-front/src/admin/components/settings/users/UserPasswordForm.js +++ b/openbas-front/src/admin/components/settings/users/UserPasswordForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/settings/users/UserPopover.js b/openbas-front/src/admin/components/settings/users/UserPopover.js index eefb622c37..917e294f00 100644 --- a/openbas-front/src/admin/components/settings/users/UserPopover.js +++ b/openbas-front/src/admin/components/settings/users/UserPopover.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { forwardRef, useState } from 'react'; import { useDispatch } from 'react-redux'; import * as R from 'ramda'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem, Slide } from '@mui/material'; @@ -10,7 +10,7 @@ import UserPasswordForm from './UserPasswordForm'; import { tagOptions } from '../../../../utils/Option'; import Drawer from '../../../../components/common/Drawer'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/settings/users/Users.js b/openbas-front/src/admin/components/settings/users/Users.js index c966012345..29848daa47 100644 --- a/openbas-front/src/admin/components/settings/users/Users.js +++ b/openbas-front/src/admin/components/settings/users/Users.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/ExerciseList.tsx b/openbas-front/src/admin/components/simulations/ExerciseList.tsx index 82409cba47..e6c6499c37 100644 --- a/openbas-front/src/admin/components/simulations/ExerciseList.tsx +++ b/openbas-front/src/admin/components/simulations/ExerciseList.tsx @@ -1,6 +1,7 @@ import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { HubOutlined } from '@mui/icons-material'; -import React, { CSSProperties, FunctionComponent } from 'react'; +import { CSSProperties, FunctionComponent } from 'react'; +import * as React from 'react'; import { Link } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; import ExerciseStatus from './simulation/ExerciseStatus'; diff --git a/openbas-front/src/admin/components/simulations/Exercises.tsx b/openbas-front/src/admin/components/simulations/Exercises.tsx index d2c1000cd4..03c9b8b63e 100644 --- a/openbas-front/src/admin/components/simulations/Exercises.tsx +++ b/openbas-front/src/admin/components/simulations/Exercises.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { ToggleButtonGroup } from '@mui/material'; import { useFormatter } from '../../../components/i18n'; import { useHelper } from '../../../store'; diff --git a/openbas-front/src/admin/components/simulations/ImportUploaderExercise.tsx b/openbas-front/src/admin/components/simulations/ImportUploaderExercise.tsx index 0c9424b552..cafbf47bee 100644 --- a/openbas-front/src/admin/components/simulations/ImportUploaderExercise.tsx +++ b/openbas-front/src/admin/components/simulations/ImportUploaderExercise.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useNavigate } from 'react-router-dom'; import { useAppDispatch } from '../../../utils/hooks'; import ImportUploader from '../../../components/common/ImportUploader'; diff --git a/openbas-front/src/admin/components/simulations/simulation/AnimationMenu.tsx b/openbas-front/src/admin/components/simulations/simulation/AnimationMenu.tsx index 29748f9d0e..e75a30393c 100644 --- a/openbas-front/src/admin/components/simulations/simulation/AnimationMenu.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/AnimationMenu.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { Link, useLocation } from 'react-router-dom'; import { Drawer, MenuList, MenuItem, ListItemText, ListItemIcon } from '@mui/material'; import { TheatersOutlined, FactCheckOutlined, MailOutlined, NoteAltOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreation.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreation.tsx index cba916be70..71dbdf3593 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreation.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreation.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import ButtonCreate from '../../../../components/common/ButtonCreate'; import Drawer from '../../../../components/common/Drawer'; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx index 7e5642470d..b45dbba684 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Button, MenuItem } from '@mui/material'; import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseDateForm.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseDateForm.tsx index 82fb545806..39d27abd45 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseDateForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseDateForm.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { Button, FormControlLabel, Stack, Switch } from '@mui/material'; import { DatePicker, TimePicker } from '@mui/x-date-pickers'; import { Controller, SubmitHandler, useForm } from 'react-hook-form'; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseDatePopover.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseDatePopover.tsx index d17b113d8b..446c5be1e1 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseDatePopover.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseDatePopover.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { Dialog, DialogContent, DialogTitle, IconButton, Tooltip } from '@mui/material'; import { UpdateOutlined } from '@mui/icons-material'; import { updateExerciseStartDate } from '../../../../actions/Exercise'; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseDefinition.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseDefinition.tsx index 46a75ca944..e387b992a9 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseDefinition.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseDefinition.tsx @@ -1,5 +1,4 @@ import { useParams } from 'react-router-dom'; -import React from 'react'; import { Grid, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { useHelper } from '../../../../store'; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseHeader.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseHeader.tsx index 8661711a59..daf7470617 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseHeader.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseHeader.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, Tooltip, Typography } from '@mui/material'; import { CancelOutlined, PauseOutlined, PlayArrowOutlined, RestartAltOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseMainInformation.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseMainInformation.tsx index 496fe94260..cb250eaaee 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseMainInformation.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseMainInformation.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import * as R from 'ramda'; import { Chip, Grid, Paper, Typography } from '@mui/material'; import type { Exercise, KillChainPhase } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExercisePopover.tsx b/openbas-front/src/admin/components/simulations/simulation/ExercisePopover.tsx index 9604c90587..1fadebb2b4 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExercisePopover.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExercisePopover.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; +import * as React from 'react'; import { useNavigate } from 'react-router-dom'; import { Box, diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseStatus.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseStatus.tsx index 736e485872..907cdc4c38 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseStatus.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseStatus.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import { Chip } from '@mui/material'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx index a4730f1e4c..ba28f87c67 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Button, MenuItem } from '@mui/material'; import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; diff --git a/openbas-front/src/admin/components/simulations/simulation/Index.tsx b/openbas-front/src/admin/components/simulations/simulation/Index.tsx index 971a0ae237..97e6839c1e 100644 --- a/openbas-front/src/admin/components/simulations/simulation/Index.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/Index.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, lazy, Suspense, useState } from 'react'; +import { FunctionComponent, lazy, Suspense, useState } from 'react'; import { Link, Navigate, Route, Routes, useLocation, useParams } from 'react-router-dom'; import { Alert, AlertTitle, Box, Tab, Tabs } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/articles/ExerciseArticles.tsx b/openbas-front/src/admin/components/simulations/simulation/articles/ExerciseArticles.tsx index ba79a3c4a8..d5ed280fbd 100644 --- a/openbas-front/src/admin/components/simulations/simulation/articles/ExerciseArticles.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/articles/ExerciseArticles.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useParams } from 'react-router-dom'; import { useHelper } from '../../../../../store'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; diff --git a/openbas-front/src/admin/components/simulations/simulation/challenges/ExerciseChallenges.tsx b/openbas-front/src/admin/components/simulations/simulation/challenges/ExerciseChallenges.tsx index 8c674065e8..0d64a333b0 100644 --- a/openbas-front/src/admin/components/simulations/simulation/challenges/ExerciseChallenges.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/challenges/ExerciseChallenges.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useParams } from 'react-router-dom'; import { useAppDispatch } from '../../../../../utils/hooks'; import type { Exercise } from '../../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/simulations/simulation/chat/Chat.js b/openbas-front/src/admin/components/simulations/simulation/chat/Chat.js index ba0a50922d..994efa14f1 100644 --- a/openbas-front/src/admin/components/simulations/simulation/chat/Chat.js +++ b/openbas-front/src/admin/components/simulations/simulation/chat/Chat.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; import AnimationMenu from '../AnimationMenu'; diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/Comcheck.js b/openbas-front/src/admin/components/simulations/simulation/controls/Comcheck.js index 3059de46fe..d91fb702d1 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/Comcheck.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/Comcheck.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { makeStyles, styled } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemText, Grid, Paper, LinearProgress, linearProgressClasses, Typography } from '@mui/material'; import { useDispatch } from 'react-redux'; diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckForm.js b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckForm.js index fe9c5e6c78..d6071ff462 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckForm.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { Form } from 'react-final-form'; diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckState.js b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckState.js index 22659deb21..787a406734 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckState.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckState.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import * as PropTypes from 'prop-types'; import { withStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckStatusState.js b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckStatusState.js index 90513a6b75..0af795732c 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckStatusState.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckStatusState.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import * as PropTypes from 'prop-types'; import { withStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/CreateControl.tsx b/openbas-front/src/admin/components/simulations/simulation/controls/CreateControl.tsx index c255f9c6e6..e699cbb4f0 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/CreateControl.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/controls/CreateControl.tsx @@ -1,5 +1,7 @@ /* eslint-disable no-template-curly-in-string */ -import React, { useState } from 'react'; +import { useState } from 'react'; + +import * as React from 'react'; import { SpeedDial, SpeedDialIcon, SpeedDialAction, Dialog, DialogTitle, DialogContent, Grid, Typography, Button } from '@mui/material'; import { VideoSettingsOutlined, MarkEmailReadOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/Dryrun.js b/openbas-front/src/admin/components/simulations/simulation/controls/Dryrun.js index ef1925e42f..6f85a0b265 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/Dryrun.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/Dryrun.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { Chip, Grid, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Typography } from '@mui/material'; import { useDispatch } from 'react-redux'; diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunForm.js b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunForm.js index 2583ac3407..6b0d65e318 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunForm.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunProgress.js b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunProgress.js index 516146e259..9b25617549 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunProgress.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunProgress.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { styled } from '@mui/styles'; import { LinearProgress, linearProgressClasses } from '@mui/material'; import { progression } from '../../../../../utils/Time'; diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunStatus.js b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunStatus.js index af9ae535ff..200cff970d 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunStatus.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunStatus.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import * as PropTypes from 'prop-types'; import { withStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlComChecks.tsx b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlComChecks.tsx index 94909a48cb..8fbddf1048 100644 --- a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlComChecks.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlComChecks.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { Link } from 'react-router-dom'; import { DeleteOutlined, MarkEmailReadOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlDryRuns.tsx b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlDryRuns.tsx index 52658f6375..86ce5e3aff 100644 --- a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlDryRuns.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlDryRuns.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { Link } from 'react-router-dom'; import { DeleteOutlined, VideoSettingsOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseInformation.tsx b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseInformation.tsx index 8c9057fc6d..2b948b450e 100644 --- a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseInformation.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseInformation.tsx @@ -1,5 +1,5 @@ import { Grid, Typography } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useFormatter } from '../../../../../components/i18n'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; diff --git a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseSettings.tsx b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseSettings.tsx index 4b1c5874db..f0730642af 100644 --- a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseSettings.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseSettings.tsx @@ -1,5 +1,4 @@ import { Alert, Grid, Paper, Typography } from '@mui/material'; -import React from 'react'; import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; import { Groups3Outlined, MailOutlined, NotificationsOutlined, PersonOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/CreateQuickInject.js b/openbas-front/src/admin/components/simulations/simulation/injects/CreateQuickInject.js index 10e8a70189..f7e5c48752 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/CreateQuickInject.js +++ b/openbas-front/src/admin/components/simulations/simulation/injects/CreateQuickInject.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx b/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx index 4ba4819b64..7ad848af71 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useParams } from 'react-router-dom'; import { BarChartOutlined, ReorderOutlined, ViewTimelineOutlined } from '@mui/icons-material'; import { Grid, Paper, ToggleButton, ToggleButtonGroup, Tooltip, Typography } from '@mui/material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/InjectIndex.tsx b/openbas-front/src/admin/components/simulations/simulation/injects/InjectIndex.tsx index 1735f7da56..057789594a 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/InjectIndex.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/injects/InjectIndex.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, Suspense, useEffect, useState } from 'react'; +import { FunctionComponent, Suspense, useEffect, useState } from 'react'; import { Box, Tab, Tabs } from '@mui/material'; import { Link, Route, Routes, useLocation, useParams, useSearchParams } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/QuickInject.js b/openbas-front/src/admin/components/simulations/simulation/injects/QuickInject.js index eb8d14920d..921bdafe5c 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/QuickInject.js +++ b/openbas-front/src/admin/components/simulations/simulation/injects/QuickInject.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { forwardRef, Component } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { withStyles } from '@mui/styles'; @@ -54,7 +54,7 @@ import { fetchVariablesForExercise } from '../../../../../actions/variables/vari export const EMAIL_CONTRACT = '138ad8f8-32f8-4a22-8114-aaa12322bd09'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/asset_groups/InjectAddAssetGroups.tsx b/openbas-front/src/admin/components/simulations/simulation/injects/asset_groups/InjectAddAssetGroups.tsx index 35d6d650e0..e63803b36e 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/asset_groups/InjectAddAssetGroups.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/injects/asset_groups/InjectAddAssetGroups.tsx @@ -1,5 +1,5 @@ import { makeStyles } from '@mui/styles'; -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; import type { Theme } from '../../../../../../components/Theme'; diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/endpoints/InjectAddEndpoints.tsx b/openbas-front/src/admin/components/simulations/simulation/injects/endpoints/InjectAddEndpoints.tsx index 336a3fa6bd..c9cccb77a9 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/endpoints/InjectAddEndpoints.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/injects/endpoints/InjectAddEndpoints.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/lessons/ExerciseLessons.tsx b/openbas-front/src/admin/components/simulations/simulation/lessons/ExerciseLessons.tsx index 6eb90a22bf..cf0eb1d041 100644 --- a/openbas-front/src/admin/components/simulations/simulation/lessons/ExerciseLessons.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/lessons/ExerciseLessons.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useParams } from 'react-router-dom'; import { useAppDispatch } from '../../../../../utils/hooks'; import { useHelper } from '../../../../../store'; diff --git a/openbas-front/src/admin/components/simulations/simulation/logs/LogForm.js b/openbas-front/src/admin/components/simulations/simulation/logs/LogForm.js index 4cf8f94d5a..80f1ab2693 100644 --- a/openbas-front/src/admin/components/simulations/simulation/logs/LogForm.js +++ b/openbas-front/src/admin/components/simulations/simulation/logs/LogForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/logs/LogPopover.js b/openbas-front/src/admin/components/simulations/simulation/logs/LogPopover.js index 43342a51df..16f11d4d57 100644 --- a/openbas-front/src/admin/components/simulations/simulation/logs/LogPopover.js +++ b/openbas-front/src/admin/components/simulations/simulation/logs/LogPopover.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/simulations/simulation/logs/Logs.js b/openbas-front/src/admin/components/simulations/simulation/logs/Logs.js index 90089360ba..c688a9aee5 100644 --- a/openbas-front/src/admin/components/simulations/simulation/logs/Logs.js +++ b/openbas-front/src/admin/components/simulations/simulation/logs/Logs.js @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { EditOutlined, ExpandMoreOutlined, RateReviewOutlined } from '@mui/icons-material'; import { Accordion, AccordionDetails, AccordionSummary, Card, CardContent, CardHeader, IconButton, Typography } from '@mui/material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/Communication.js b/openbas-front/src/admin/components/simulations/simulation/mails/Communication.js index ccdc3f8697..3c6dc3afb3 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/Communication.js +++ b/openbas-front/src/admin/components/simulations/simulation/mails/Communication.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Avatar, Card, CardHeader, CardContent, IconButton, Button } from '@mui/material'; import { lightBlue } from '@mui/material/colors'; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/CommunicationForm.js b/openbas-front/src/admin/components/simulations/simulation/mails/CommunicationForm.js index f3186ca340..2950c6b0f8 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/CommunicationForm.js +++ b/openbas-front/src/admin/components/simulations/simulation/mails/CommunicationForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; import { useFormatter } from '../../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/Inject.js b/openbas-front/src/admin/components/simulations/simulation/mails/Inject.js index 37d7c3a33c..cb4ee8c0b0 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/Inject.js +++ b/openbas-front/src/admin/components/simulations/simulation/mails/Inject.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import * as R from 'ramda'; import { makeStyles } from '@mui/styles'; import { useDispatch } from 'react-redux'; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByInject.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByInject.tsx index eaac390aa0..a205812f68 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByInject.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByInject.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import Empty from '../../../../../components/Empty'; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByPlayer.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByPlayer.tsx index bac7115ee3..daa55ede4f 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByPlayer.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByPlayer.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import Empty from '../../../../../components/Empty'; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByTeam.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByTeam.tsx index d168b73208..743a39ded5 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByTeam.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByTeam.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import Empty from '../../../../../components/Empty'; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeChart.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeChart.tsx index efefe4ea60..31e985e2d5 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeChart.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeChart.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import { Theme } from '@mui/material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx index 36c3612c7a..08ae12f03c 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import { Theme } from '@mui/material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/Mails.js b/openbas-front/src/admin/components/simulations/simulation/mails/Mails.js index 3beb47ff87..3341feaa73 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/Mails.js +++ b/openbas-front/src/admin/components/simulations/simulation/mails/Mails.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { makeStyles } from '@mui/styles'; import { Chip, Grid, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, ToggleButton, ToggleButtonGroup, Tooltip, Typography } from '@mui/material'; import { useDispatch } from 'react-redux'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/Exercise.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/Exercise.tsx index 648375a41b..3c32c7629f 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/Exercise.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/Exercise.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; import { Grid, Paper, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistribution.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistribution.tsx index bcd0686777..c617fa3d05 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistribution.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistribution.tsx @@ -1,5 +1,5 @@ import { Grid, Paper, Typography } from '@mui/material'; -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { useFormatter } from '../../../../../components/i18n'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionByInjectorContract.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionByInjectorContract.tsx index 09f2f8d1b4..9439862a37 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionByInjectorContract.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionByInjectorContract.tsx @@ -1,5 +1,5 @@ import Chart from 'react-apexcharts'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useTheme } from '@mui/styles'; import * as R from 'ramda'; import Empty from '../../../../../components/Empty'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByInject.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByInject.tsx index 4fe74fa730..4c8da9fa04 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByInject.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByInject.tsx @@ -1,5 +1,5 @@ import Chart from 'react-apexcharts'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useTheme } from '@mui/styles'; import * as R from 'ramda'; import { horizontalBarsChartOptions } from '../../../../../utils/Charts'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByOrganization.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByOrganization.tsx index 875e346e9d..ef71523c09 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByOrganization.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByOrganization.tsx @@ -1,5 +1,5 @@ import Chart from 'react-apexcharts'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import * as R from 'ramda'; import { useTheme } from '@mui/styles'; import { horizontalBarsChartOptions } from '../../../../../utils/Charts'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByPlayer.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByPlayer.tsx index 3c02caa204..a63afa3f7b 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByPlayer.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByPlayer.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import { useTheme } from '@mui/styles'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByTeam.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByTeam.tsx index 6520ea54c3..1b7a75571f 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByTeam.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByTeam.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import { useTheme } from '@mui/styles'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByTeamInPercentage.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByTeamInPercentage.tsx index 12303165f7..0b0f171a55 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByTeamInPercentage.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreByTeamInPercentage.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import { useTheme } from '@mui/styles'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByInjectorContract.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByInjectorContract.tsx index 08507c8bc9..2781b4e388 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByInjectorContract.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByInjectorContract.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByTeam.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByTeam.tsx index bb5b43536f..412cfb3231 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByTeam.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByTeam.tsx @@ -1,5 +1,5 @@ import Chart from 'react-apexcharts'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useTheme } from '@mui/styles'; import * as R from 'ramda'; import { lineChartOptions } from '../../../../../utils/Charts'; diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByTeamInPercentage.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByTeamInPercentage.tsx index c2ff491f7d..a466b866bb 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByTeamInPercentage.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionScoreOverTimeByTeamInPercentage.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import { useTheme } from '@mui/styles'; import * as R from 'ramda'; diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportForm.tsx b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportForm.tsx index 94ff69e3eb..8b69a0ac76 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportForm.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { z, ZodBoolean } from 'zod'; import { SubmitHandler, useForm } from 'react-hook-form'; diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportPage.tsx b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportPage.tsx index c590ad6d71..629ae56a92 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportPage.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportPage.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; +import * as React from 'react'; import { Link, useParams } from 'react-router-dom'; import { Alert, Button, Paper, ToggleButtonGroup, Typography } from '@mui/material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReports.tsx b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReports.tsx index de68e4b527..6442972585 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReports.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReports.tsx @@ -1,4 +1,5 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; +import * as React from 'react'; import { useNavigate } from 'react-router-dom'; import { Fab } from '@mui/material'; import { Add } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/InjectReportResult.tsx b/openbas-front/src/admin/components/simulations/simulation/reports/InjectReportResult.tsx index d3dfe387ed..013f4bf4ca 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/InjectReportResult.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/reports/InjectReportResult.tsx @@ -1,4 +1,5 @@ -import React, { CSSProperties } from 'react'; +import { CSSProperties } from 'react'; +import * as React from 'react'; import { Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'; import { SubmitHandler } from 'react-hook-form'; diff --git a/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx b/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx index 7cd52222bb..f7a6b83258 100644 --- a/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx @@ -1,5 +1,6 @@ import { useParams } from 'react-router-dom'; -import React, { useContext, useEffect, useState } from 'react'; +import { useContext, useEffect, useState } from 'react'; +import * as React from 'react'; import { Paper, Typography } from '@mui/material'; import { useHelper } from '../../../../../store'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; diff --git a/openbas-front/src/admin/components/simulations/simulation/tests/ExerciseTests.tsx b/openbas-front/src/admin/components/simulations/simulation/tests/ExerciseTests.tsx index 5412c77e9b..98cc54bc64 100644 --- a/openbas-front/src/admin/components/simulations/simulation/tests/ExerciseTests.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/tests/ExerciseTests.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useParams } from 'react-router-dom'; import type { Exercise, InjectTestStatus } from '../../../../../utils/api-types'; import { fetchInjectTestStatus, searchExerciseInjectTests } from '../../../../../actions/inject_test/inject-test-actions'; diff --git a/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeArea.tsx b/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeArea.tsx index 7bde2456c2..3716da7af3 100644 --- a/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeArea.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeArea.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import Empty from '../../../../../components/Empty'; diff --git a/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeLine.tsx b/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeLine.tsx index f84512de47..56a1319a8b 100644 --- a/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeLine.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeLine.tsx @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; import * as R from 'ramda'; import Empty from '../../../../../components/Empty'; diff --git a/openbas-front/src/admin/components/simulations/simulation/timeline/TimelineOverview.tsx b/openbas-front/src/admin/components/simulations/simulation/timeline/TimelineOverview.tsx index df4a1858e7..5dd6d1d7ff 100644 --- a/openbas-front/src/admin/components/simulations/simulation/timeline/TimelineOverview.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/timeline/TimelineOverview.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { makeStyles } from '@mui/styles'; import { Grid, List, ListItem, ListItemButton, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Typography } from '@mui/material'; import { Link, useParams } from 'react-router-dom'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js b/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js index 127e3bc936..6a12b3f872 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js +++ b/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { forwardRef, useState } from 'react'; import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; import { useDispatch } from 'react-redux'; @@ -18,7 +18,7 @@ import ItemTags from '../../../../../components/ItemTags'; import TeamOrAssetLine from './common/TeamOrAssetLine'; import { isNotEmptyField } from '../../../../../utils/utils'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/common/TeamOrAssetLine.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/common/TeamOrAssetLine.tsx index 44615d1360..655b2af3de 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/common/TeamOrAssetLine.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/common/TeamOrAssetLine.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { CastForEducationOutlined, DnsOutlined, LanOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChallengeExpectation.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChallengeExpectation.tsx index 5d7ceb73ec..5aee483a1c 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChallengeExpectation.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChallengeExpectation.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { EmojiEventsOutlined } from '@mui/icons-material'; import type { Challenge } from '../../../../../../utils/api-types'; import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChannelExpectation.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChannelExpectation.tsx index 8ed2dfddbc..37015826e2 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChannelExpectation.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChannelExpectation.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import type { Article, Channel } from '../../../../../../utils/api-types'; import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; import ChannelIcon from '../../../../components/channels/ChannelIcon'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/DetectionPreventionExpectationsValidationForm.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/DetectionPreventionExpectationsValidationForm.tsx index f0397cc027..8dc2447baf 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/DetectionPreventionExpectationsValidationForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/DetectionPreventionExpectationsValidationForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Button, TextField as MuiTextField, Typography } from '@mui/material'; import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ExpectationLine.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ExpectationLine.tsx index 8c0900ff91..f9816ffcc1 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ExpectationLine.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ExpectationLine.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, ReactElement } from 'react'; +import { FunctionComponent, ReactElement } from 'react'; import { ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectations.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectations.tsx index 7fb124c5d9..ff391f3470 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectations.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectations.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; +import * as React from 'react'; import { Accordion, AccordionDetails, diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectationsValidationForm.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectationsValidationForm.tsx index 9525f0b6f1..a51148edaa 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectationsValidationForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectationsValidationForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useEffect } from 'react'; +import { FunctionComponent, useEffect } from 'react'; import { Button, Chip, Grid, MenuItem, Select, Slider, TextField as MuiTextField, Typography } from '@mui/material'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ResultChip.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ResultChip.tsx index db16de9792..5d158ea886 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ResultChip.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ResultChip.tsx @@ -1,5 +1,5 @@ import { Chip } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; import colorStyles from '../../../../../../components/Color'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx index 66040afefa..1735cafa40 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { Alert, Button, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { KeyboardArrowRightOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAssetGroup.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAssetGroup.tsx index e7a656217e..9a9abe3769 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAssetGroup.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAssetGroup.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { DnsOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/simulations/simulation/variables/AvailableVariablesDialog.tsx b/openbas-front/src/admin/components/simulations/simulation/variables/AvailableVariablesDialog.tsx index fad52de4ca..613abef4be 100644 --- a/openbas-front/src/admin/components/simulations/simulation/variables/AvailableVariablesDialog.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/variables/AvailableVariablesDialog.tsx @@ -1,5 +1,6 @@ import { Alert, Button, Dialog, DialogActions, DialogContent, List, ListItem, ListItemButton, ListItemText, Tab } from '@mui/material'; -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import { Link } from 'react-router-dom'; import { TabContext, TabList, TabPanel } from '@mui/lab'; diff --git a/openbas-front/src/admin/components/simulations/simulation/variables/ExerciseVariables.tsx b/openbas-front/src/admin/components/simulations/simulation/variables/ExerciseVariables.tsx index 0d9749cb0c..fcbaed4dec 100644 --- a/openbas-front/src/admin/components/simulations/simulation/variables/ExerciseVariables.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/variables/ExerciseVariables.tsx @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import { useContext } from 'react'; import { useParams } from 'react-router-dom'; import { Paper, Typography } from '@mui/material'; import { useHelper } from '../../../../../store'; diff --git a/openbas-front/src/admin/components/teams/Index.tsx b/openbas-front/src/admin/components/teams/Index.tsx index effb420ab6..7d176d17da 100644 --- a/openbas-front/src/admin/components/teams/Index.tsx +++ b/openbas-front/src/admin/components/teams/Index.tsx @@ -1,4 +1,4 @@ -import React, { Suspense, lazy } from 'react'; +import { Suspense, lazy } from 'react'; import { makeStyles } from '@mui/styles'; import { Navigate, Route, Routes } from 'react-router-dom'; import { errorWrapper } from '../../../components/Error'; diff --git a/openbas-front/src/admin/components/teams/Organizations.tsx b/openbas-front/src/admin/components/teams/Organizations.tsx index 0c148e2344..d5f28151a7 100644 --- a/openbas-front/src/admin/components/teams/Organizations.tsx +++ b/openbas-front/src/admin/components/teams/Organizations.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties } from 'react'; +import { CSSProperties } from 'react'; import { makeStyles } from '@mui/styles'; import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Tooltip } from '@mui/material'; import { CSVLink } from 'react-csv'; diff --git a/openbas-front/src/admin/components/teams/Players.tsx b/openbas-front/src/admin/components/teams/Players.tsx index c1960cdba9..511a67e636 100644 --- a/openbas-front/src/admin/components/teams/Players.tsx +++ b/openbas-front/src/admin/components/teams/Players.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, useMemo, useState } from 'react'; +import { CSSProperties, useMemo, useState } from 'react'; import { makeStyles } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { PersonOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/admin/components/teams/Teams.tsx b/openbas-front/src/admin/components/teams/Teams.tsx index 41f679bbff..b8cf109021 100644 --- a/openbas-front/src/admin/components/teams/Teams.tsx +++ b/openbas-front/src/admin/components/teams/Teams.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import TeamsComponent from '../components/teams/Teams'; import { PermissionsContext, PermissionsContextType, TeamContext, type TeamContextType } from '../common/Context'; import { useHelper } from '../../../store'; @@ -29,7 +28,7 @@ const Teams = () => { const teamContext: TeamContextType = { onAddUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { return dispatch(updateTeamPlayers(teamId, { - team_users: [...(teams.find((t) => t.team_id === teamId)?.team_users) || [], ...userIds], + team_users: [...(teams.find((t) => t.team_id === teamId)?.team_users || []), ...userIds], })); }, onRemoveUsersTeam(teamId: TeamStore['team_id'], userIds: UserStore['user_id'][]): Promise { diff --git a/openbas-front/src/admin/components/teams/organizations/CreateOrganization.js b/openbas-front/src/admin/components/teams/organizations/CreateOrganization.js index c0be5d5ccb..fcf3a85524 100644 --- a/openbas-front/src/admin/components/teams/organizations/CreateOrganization.js +++ b/openbas-front/src/admin/components/teams/organizations/CreateOrganization.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { forwardRef, Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; @@ -9,7 +9,7 @@ import OrganizationForm from './OrganizationForm'; import { addOrganization } from '../../../../actions/Organization'; import inject18n from '../../../../components/i18n'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/teams/organizations/OrganizationForm.js b/openbas-front/src/admin/components/teams/organizations/OrganizationForm.js index a87154450c..3ab0e9a2bc 100644 --- a/openbas-front/src/admin/components/teams/organizations/OrganizationForm.js +++ b/openbas-front/src/admin/components/teams/organizations/OrganizationForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/admin/components/teams/organizations/OrganizationPopover.js b/openbas-front/src/admin/components/teams/organizations/OrganizationPopover.js index 747941fb08..e080983b7a 100644 --- a/openbas-front/src/admin/components/teams/organizations/OrganizationPopover.js +++ b/openbas-front/src/admin/components/teams/organizations/OrganizationPopover.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { forwardRef, Component } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import * as R from 'ramda'; @@ -9,7 +9,7 @@ import OrganizationForm from './OrganizationForm'; import inject18n from '../../../../components/i18n'; import { tagOptions } from '../../../../utils/Option'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/admin/components/teams/players/CreatePlayer.tsx b/openbas-front/src/admin/components/teams/players/CreatePlayer.tsx index aa372f2f52..757a7e8a79 100644 --- a/openbas-front/src/admin/components/teams/players/CreatePlayer.tsx +++ b/openbas-front/src/admin/components/teams/players/CreatePlayer.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/admin/components/teams/players/PlayerForm.tsx b/openbas-front/src/admin/components/teams/players/PlayerForm.tsx index d1c71c16d0..89d6a7ce44 100644 --- a/openbas-front/src/admin/components/teams/players/PlayerForm.tsx +++ b/openbas-front/src/admin/components/teams/players/PlayerForm.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Form } from 'react-final-form'; import { Button, InputAdornment, Tooltip } from '@mui/material'; import { z } from 'zod'; diff --git a/openbas-front/src/admin/components/teams/players/PlayerPopover.tsx b/openbas-front/src/admin/components/teams/players/PlayerPopover.tsx index 9e61626718..0334cbc97e 100644 --- a/openbas-front/src/admin/components/teams/players/PlayerPopover.tsx +++ b/openbas-front/src/admin/components/teams/players/PlayerPopover.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; +import * as React from 'react'; import { Button, Dialog as MuiDialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; import { deletePlayer, updatePlayer } from '../../../../actions/User'; diff --git a/openbas-front/src/app.tsx b/openbas-front/src/app.tsx index d23a64b2cc..d627eee017 100644 --- a/openbas-front/src/app.tsx +++ b/openbas-front/src/app.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Provider } from 'react-redux'; import { Route, Routes } from 'react-router-dom'; import { HistoryRouter as Router } from 'redux-first-history/rr6'; diff --git a/openbas-front/src/components/AppIntlProvider.js b/openbas-front/src/components/AppIntlProvider.js index 2b00d2cf05..07f91aa662 100644 --- a/openbas-front/src/components/AppIntlProvider.js +++ b/openbas-front/src/components/AppIntlProvider.js @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import * as PropTypes from 'prop-types'; import { IntlProvider } from 'react-intl'; import moment from 'moment'; diff --git a/openbas-front/src/components/AppThemeProvider.tsx b/openbas-front/src/components/AppThemeProvider.tsx index 3cba85ee8f..cd61fa0717 100644 --- a/openbas-front/src/components/AppThemeProvider.tsx +++ b/openbas-front/src/components/AppThemeProvider.tsx @@ -1,4 +1,5 @@ -import React, { ReactNode, useEffect, useState } from 'react'; +import { ReactNode, useEffect, useState } from 'react'; +import * as React from 'react'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import { ThemeOptions } from '@mui/material/styles/createTheme'; import { zhCN, frFR, enUS, esES, Localization } from '@mui/material/locale'; diff --git a/openbas-front/src/components/AttackPatternField.tsx b/openbas-front/src/components/AttackPatternField.tsx index e8c9772052..aed6527cbf 100644 --- a/openbas-front/src/components/AttackPatternField.tsx +++ b/openbas-front/src/components/AttackPatternField.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { useState, FunctionComponent } from 'react'; import * as R from 'ramda'; import { AddOutlined, RouteOutlined } from '@mui/icons-material'; import { Box, Dialog, DialogTitle, DialogContent, Autocomplete, TextField, IconButton } from '@mui/material'; @@ -62,7 +62,7 @@ const AttackPatternField: FunctionComponent = ({ dispatch(fetchKillChainPhases()); }); - const [attackPatternCreation, setAttackPatternCreation] = React.useState(false); + const [attackPatternCreation, setAttackPatternCreation] = useState(false); const handleOpenAttackPatternCreation = () => { setAttackPatternCreation(true); diff --git a/openbas-front/src/components/Autocomplete.js b/openbas-front/src/components/Autocomplete.js index 2fc6b27b14..6bb98328c9 100644 --- a/openbas-front/src/components/Autocomplete.js +++ b/openbas-front/src/components/Autocomplete.js @@ -1,4 +1,3 @@ -import React from 'react'; import { Field } from 'react-final-form'; import { TextField, IconButton, Autocomplete as MuiAutocomplete } from '@mui/material'; import { AddOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/components/Breadcrumbs.tsx b/openbas-front/src/components/Breadcrumbs.tsx index 53c30a2633..4df899448f 100644 --- a/openbas-front/src/components/Breadcrumbs.tsx +++ b/openbas-front/src/components/Breadcrumbs.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Breadcrumbs as MUIBreadcrumbs, Typography } from '@mui/material'; import { Link } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/ChainedTimeline.tsx b/openbas-front/src/components/ChainedTimeline.tsx index 465069b941..da0a60615a 100644 --- a/openbas-front/src/components/ChainedTimeline.tsx +++ b/openbas-front/src/components/ChainedTimeline.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useEffect, useState } from 'react'; +import { FunctionComponent, useEffect, useState } from 'react'; +import * as React from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Connection, diff --git a/openbas-front/src/components/CheckboxField.js b/openbas-front/src/components/CheckboxField.js index 20b003f1b3..b80153cc76 100644 --- a/openbas-front/src/components/CheckboxField.js +++ b/openbas-front/src/components/CheckboxField.js @@ -1,4 +1,3 @@ -import React from 'react'; import { Field } from 'react-final-form'; import { FormGroup, FormControlLabel, Checkbox as MuiCheckbox, FormHelperText, FormControl } from '@mui/material'; diff --git a/openbas-front/src/components/ColorPickerField.tsx b/openbas-front/src/components/ColorPickerField.tsx index 566763d4b3..5486e9ae76 100644 --- a/openbas-front/src/components/ColorPickerField.tsx +++ b/openbas-front/src/components/ColorPickerField.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { TextField as MuiTextField, IconButton, Popover, InputAdornment, TextFieldProps } from '@mui/material'; // @ts-expect-error react-color does not have types import { SketchPicker } from 'react-color'; diff --git a/openbas-front/src/components/Countdown.js b/openbas-front/src/components/Countdown.js index 0886a49cca..4b1704a18d 100644 --- a/openbas-front/src/components/Countdown.js +++ b/openbas-front/src/components/Countdown.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { splitDuration } from '../utils/Time'; const Countdown = ({ date, paused }) => { diff --git a/openbas-front/src/components/CountryField.js b/openbas-front/src/components/CountryField.js index 2d73604f96..e1fca7a10b 100644 --- a/openbas-front/src/components/CountryField.js +++ b/openbas-front/src/components/CountryField.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import { FlagOutlined } from '@mui/icons-material'; import { Box } from '@mui/material'; diff --git a/openbas-front/src/components/CustomTimelineBackground.tsx b/openbas-front/src/components/CustomTimelineBackground.tsx index 098d03c411..baee5803c1 100644 --- a/openbas-front/src/components/CustomTimelineBackground.tsx +++ b/openbas-front/src/components/CustomTimelineBackground.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, memo, useRef } from 'react'; +import { CSSProperties, memo, useRef } from 'react'; import cc from 'classcat'; import { shallow } from 'zustand/shallow'; diff --git a/openbas-front/src/components/CustomTimelinePanel.tsx b/openbas-front/src/components/CustomTimelinePanel.tsx index 28f5ab0e16..8b20a9864e 100644 --- a/openbas-front/src/components/CustomTimelinePanel.tsx +++ b/openbas-front/src/components/CustomTimelinePanel.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, memo, useEffect, useState } from 'react'; +import { CSSProperties, memo, useEffect, useState } from 'react'; import { shallow } from 'zustand/shallow'; import { useStore, type ReactFlowState, type BackgroundProps, Panel, Viewport } from '@xyflow/react'; import { makeStyles, useTheme } from '@mui/styles'; diff --git a/openbas-front/src/components/CustomTooltip.js b/openbas-front/src/components/CustomTooltip.js index 648b8de288..3da0bce881 100644 --- a/openbas-front/src/components/CustomTooltip.js +++ b/openbas-front/src/components/CustomTooltip.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Tooltip } from '@mui/material'; export default function CustomTooltip({ children, ...rest }) { diff --git a/openbas-front/src/components/DateTimePicker.js b/openbas-front/src/components/DateTimePicker.js index 46242ce069..826e0380a5 100644 --- a/openbas-front/src/components/DateTimePicker.js +++ b/openbas-front/src/components/DateTimePicker.js @@ -1,4 +1,3 @@ -import React from 'react'; import { useIntl } from 'react-intl'; import { DateTimePicker as MuiDateTimePicker } from '@mui/x-date-pickers'; import { Field } from 'react-final-form'; diff --git a/openbas-front/src/components/DeprecatedColorPickerField.js b/openbas-front/src/components/DeprecatedColorPickerField.js index da505ef36b..57c265116f 100644 --- a/openbas-front/src/components/DeprecatedColorPickerField.js +++ b/openbas-front/src/components/DeprecatedColorPickerField.js @@ -1,4 +1,4 @@ -import React from 'react'; +import { useState } from 'react'; import { Field } from 'react-final-form'; import { TextField as MuiTextField, IconButton, Popover, InputAdornment } from '@mui/material'; import { SketchPicker } from 'react-color'; @@ -10,7 +10,7 @@ const ColorPickerFieldBase = ({ meta: { touched, invalid, error, submitError }, ...others }) => { - const [anchorEl, setAnchorEl] = React.useState(null); + const [anchorEl, setAnchorEl] = useState(null); const handleChange = (color) => { onChange(color && color.hex ? color.hex : ''); }; diff --git a/openbas-front/src/components/DocumentField.js b/openbas-front/src/components/DocumentField.js index bdc10f70c8..69ec447ca5 100644 --- a/openbas-front/src/components/DocumentField.js +++ b/openbas-front/src/components/DocumentField.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import { Box } from '@mui/material'; import { withStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/Empty.js b/openbas-front/src/components/Empty.js index c849800725..9bfd141b07 100644 --- a/openbas-front/src/components/Empty.js +++ b/openbas-front/src/components/Empty.js @@ -1,5 +1,3 @@ -import React from 'react'; - const Empty = ({ message }) => (
{ diff --git a/openbas-front/src/components/FileField.js b/openbas-front/src/components/FileField.js index f7b99efe66..8466ae3685 100644 --- a/openbas-front/src/components/FileField.js +++ b/openbas-front/src/components/FileField.js @@ -1,4 +1,4 @@ -import React, { useCallback } from 'react'; +import { useCallback } from 'react'; import * as R from 'ramda'; import { Field } from 'react-final-form'; import { useDropzone } from 'react-dropzone'; diff --git a/openbas-front/src/components/InjectContractComponent.tsx b/openbas-front/src/components/InjectContractComponent.tsx index 4fc7f2a54f..fd8dabea8a 100644 --- a/openbas-front/src/components/InjectContractComponent.tsx +++ b/openbas-front/src/components/InjectContractComponent.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent, useEffect, useState } from 'react'; +import { FunctionComponent, useEffect, useState } from 'react'; +import * as React from 'react'; import { Autocomplete, SelectChangeEvent, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { FieldError } from 'react-hook-form'; diff --git a/openbas-front/src/components/ItemBoolean.js b/openbas-front/src/components/ItemBoolean.js index 1faeb47453..f92d34c120 100644 --- a/openbas-front/src/components/ItemBoolean.js +++ b/openbas-front/src/components/ItemBoolean.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { withStyles, useTheme } from '@mui/styles'; import { Chip, CircularProgress, Tooltip } from '@mui/material'; diff --git a/openbas-front/src/components/ItemCategory.tsx b/openbas-front/src/components/ItemCategory.tsx index 25b371a72d..b37467b415 100644 --- a/openbas-front/src/components/ItemCategory.tsx +++ b/openbas-front/src/components/ItemCategory.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { AdsClickOutlined, AppsOutlined, BlurLinearOutlined, CrisisAlertOutlined, NewspaperOutlined, TourOutlined } from '@mui/icons-material'; import { AirFilter, CarShiftPattern, CrosshairsQuestion, DatabaseEyeOutline } from 'mdi-material-ui'; diff --git a/openbas-front/src/components/ItemCopy.tsx b/openbas-front/src/components/ItemCopy.tsx index d787778378..bc139a4634 100644 --- a/openbas-front/src/components/ItemCopy.tsx +++ b/openbas-front/src/components/ItemCopy.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { ContentCopyOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; import { useFormatter } from './i18n'; diff --git a/openbas-front/src/components/ItemMainFocus.tsx b/openbas-front/src/components/ItemMainFocus.tsx index 076c004c14..8d199ef58c 100644 --- a/openbas-front/src/components/ItemMainFocus.tsx +++ b/openbas-front/src/components/ItemMainFocus.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { AccountBalanceOutlined, FireTruckOutlined, ImportantDevicesOutlined, KeyboardVoiceOutlined, QuizOutlined } from '@mui/icons-material'; import { BookOpenBlankVariantOutline, FilterMultipleOutline } from 'mdi-material-ui'; diff --git a/openbas-front/src/components/ItemNumberDifference.js b/openbas-front/src/components/ItemNumberDifference.js index 40253f6c8d..36159ba8ea 100644 --- a/openbas-front/src/components/ItemNumberDifference.js +++ b/openbas-front/src/components/ItemNumberDifference.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import { compose } from 'ramda'; import * as PropTypes from 'prop-types'; import { withStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/ItemResult.tsx b/openbas-front/src/components/ItemResult.tsx index 7953222c01..6788f166a5 100644 --- a/openbas-front/src/components/ItemResult.tsx +++ b/openbas-front/src/components/ItemResult.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Chip, Tooltip } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/ItemSeverity.tsx b/openbas-front/src/components/ItemSeverity.tsx index fc8d1a095a..e4848c816a 100644 --- a/openbas-front/src/components/ItemSeverity.tsx +++ b/openbas-front/src/components/ItemSeverity.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Chip } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/ItemStatus.tsx b/openbas-front/src/components/ItemStatus.tsx index 5400df59af..781c944f27 100644 --- a/openbas-front/src/components/ItemStatus.tsx +++ b/openbas-front/src/components/ItemStatus.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Chip, Tooltip } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { useFormatter } from './i18n'; diff --git a/openbas-front/src/components/ItemTags.js b/openbas-front/src/components/ItemTags.js index decded9b2a..3727a0fcb8 100644 --- a/openbas-front/src/components/ItemTags.js +++ b/openbas-front/src/components/ItemTags.js @@ -1,4 +1,4 @@ -import React from 'react'; +import { forwardRef } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { makeStyles, useTheme } from '@mui/styles'; @@ -8,7 +8,7 @@ import { useFormatter } from './i18n'; import { useHelper } from '../store'; import { getLabelOfRemainingItems, getRemainingItemsCount, getVisibleItems, truncate } from '../utils/String'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/components/ItemTargets.tsx b/openbas-front/src/components/ItemTargets.tsx index 3203d05f6c..4c844a541d 100644 --- a/openbas-front/src/components/ItemTargets.tsx +++ b/openbas-front/src/components/ItemTargets.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import { Chip, Tooltip } from '@mui/material'; import { DevicesOtherOutlined, Groups3Outlined, HorizontalRule } from '@mui/icons-material'; diff --git a/openbas-front/src/components/KillChainPhaseField.js b/openbas-front/src/components/KillChainPhaseField.js index 24c985f44a..099a06fd41 100644 --- a/openbas-front/src/components/KillChainPhaseField.js +++ b/openbas-front/src/components/KillChainPhaseField.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import { RouteOutlined } from '@mui/icons-material'; import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; diff --git a/openbas-front/src/components/Loader.js b/openbas-front/src/components/Loader.js index b51f0d15b5..34d495f514 100644 --- a/openbas-front/src/components/Loader.js +++ b/openbas-front/src/components/Loader.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { withStyles } from '@mui/styles'; import { CircularProgress } from '@mui/material'; diff --git a/openbas-front/src/components/MarkdownDisplay.tsx b/openbas-front/src/components/MarkdownDisplay.tsx index 215dc10196..3d4760b786 100644 --- a/openbas-front/src/components/MarkdownDisplay.tsx +++ b/openbas-front/src/components/MarkdownDisplay.tsx @@ -3,7 +3,7 @@ import remarkParse from 'remark-parse'; import remarkFlexibleMarkers from 'remark-flexible-markers'; import { useTheme } from '@mui/styles'; import { PluggableList } from 'react-markdown/lib'; -import React, { FunctionComponent, SyntheticEvent, useState } from 'react'; +import { FunctionComponent, SyntheticEvent, useState } from 'react'; import remarkGfm from 'remark-gfm'; import type { Theme } from './Theme'; import { truncate } from '../utils/String'; diff --git a/openbas-front/src/components/Message.js b/openbas-front/src/components/Message.js index 6367f0acd8..6675d06397 100644 --- a/openbas-front/src/components/Message.js +++ b/openbas-front/src/components/Message.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as PropTypes from 'prop-types'; import { Snackbar, Alert } from '@mui/material'; import { head } from 'ramda'; diff --git a/openbas-front/src/components/NotFound.tsx b/openbas-front/src/components/NotFound.tsx index d6eb964be5..d9ad3eb8d8 100644 --- a/openbas-front/src/components/NotFound.tsx +++ b/openbas-front/src/components/NotFound.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Alert, AlertTitle } from '@mui/material'; import { useFormatter } from './i18n'; diff --git a/openbas-front/src/components/OldAttackPatternField.js b/openbas-front/src/components/OldAttackPatternField.js index c80ad9aa9b..8a6e674255 100644 --- a/openbas-front/src/components/OldAttackPatternField.js +++ b/openbas-front/src/components/OldAttackPatternField.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import { RouteOutlined } from '@mui/icons-material'; import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; diff --git a/openbas-front/src/components/OrganizationField.js b/openbas-front/src/components/OrganizationField.js index 47a6e2af0c..f244028833 100644 --- a/openbas-front/src/components/OrganizationField.js +++ b/openbas-front/src/components/OrganizationField.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import { DomainOutlined } from '@mui/icons-material'; import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; diff --git a/openbas-front/src/components/PayloadIcon.tsx b/openbas-front/src/components/PayloadIcon.tsx index f9c3c08c19..f978559113 100644 --- a/openbas-front/src/components/PayloadIcon.tsx +++ b/openbas-front/src/components/PayloadIcon.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Tooltip } from '@mui/material'; import { ApplicationCogOutline, Console, FileImportOutline, LanConnect } from 'mdi-material-ui'; import { DnsOutlined, SubscriptionsOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/components/PlatformField.tsx b/openbas-front/src/components/PlatformField.tsx index 9806cb5359..53d3d8a554 100644 --- a/openbas-front/src/components/PlatformField.tsx +++ b/openbas-front/src/components/PlatformField.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Box, Autocomplete, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { FieldError } from 'react-hook-form'; diff --git a/openbas-front/src/components/PlatformIcon.tsx b/openbas-front/src/components/PlatformIcon.tsx index 718367e4a3..a2fe6d7806 100644 --- a/openbas-front/src/components/PlatformIcon.tsx +++ b/openbas-front/src/components/PlatformIcon.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useTheme } from '@mui/styles'; import { PaletteMode, Tooltip } from '@mui/material'; import type { Theme } from './Theme'; diff --git a/openbas-front/src/components/PlayerField.js b/openbas-front/src/components/PlayerField.js index f0a17f7c46..f8c352865a 100644 --- a/openbas-front/src/components/PlayerField.js +++ b/openbas-front/src/components/PlayerField.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import { PersonOutlined } from '@mui/icons-material'; import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; diff --git a/openbas-front/src/components/ProgressBarCountdown.js b/openbas-front/src/components/ProgressBarCountdown.js index 80cd0bb002..7a8696a5ba 100644 --- a/openbas-front/src/components/ProgressBarCountdown.js +++ b/openbas-front/src/components/ProgressBarCountdown.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { LinearProgress } from '@mui/material'; const now = Math.round(Date.now() / 1000); diff --git a/openbas-front/src/components/RedirectManager.tsx b/openbas-front/src/components/RedirectManager.tsx index 48db9a168d..7e146e9743 100644 --- a/openbas-front/src/components/RedirectManager.tsx +++ b/openbas-front/src/components/RedirectManager.tsx @@ -1,4 +1,5 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; +import * as React from 'react'; import { useNavigate } from 'react-router-dom'; import { MESSAGING$ } from '../utils/Environment'; diff --git a/openbas-front/src/components/RegexComponent.tsx b/openbas-front/src/components/RegexComponent.tsx index 62bcd32d3f..785b94fc5b 100644 --- a/openbas-front/src/components/RegexComponent.tsx +++ b/openbas-front/src/components/RegexComponent.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { Autocomplete, TextField } from '@mui/material'; import { FieldError } from 'react-hook-form'; import alphabet from '../admin/components/settings/data_ingestion/AttributeUtils'; diff --git a/openbas-front/src/components/ScenarioField.jsx b/openbas-front/src/components/ScenarioField.jsx index a91762db8f..7cc1a92132 100644 --- a/openbas-front/src/components/ScenarioField.jsx +++ b/openbas-front/src/components/ScenarioField.jsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Kayaking } from '@mui/icons-material'; import { Box } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/SearchFilter.tsx b/openbas-front/src/components/SearchFilter.tsx index 96cf3f6802..b3a33f1554 100644 --- a/openbas-front/src/components/SearchFilter.tsx +++ b/openbas-front/src/components/SearchFilter.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import { TextField, InputAdornment } from '@mui/material'; import { Search } from '@mui/icons-material'; diff --git a/openbas-front/src/components/TagField.js b/openbas-front/src/components/TagField.js index 5631fcddad..d99ab5c0c9 100644 --- a/openbas-front/src/components/TagField.js +++ b/openbas-front/src/components/TagField.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import * as R from 'ramda'; import { LabelOutlined } from '@mui/icons-material'; import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; diff --git a/openbas-front/src/components/Timeline.tsx b/openbas-front/src/components/Timeline.tsx index 163b4eacc0..d706182d8c 100644 --- a/openbas-front/src/components/Timeline.tsx +++ b/openbas-front/src/components/Timeline.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { Fragment, FunctionComponent } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { CastForEducationOutlined, CastOutlined } from '@mui/icons-material'; import * as R from 'ramda'; @@ -203,123 +203,121 @@ const Timeline: FunctionComponent = ({ injects, onSelectInject, teams }) ? '1px dashed rgba(0, 0, 0, 0.15)' : '1px dashed rgba(255, 255, 255, 0.15)'; - return ( - <> - {injects.length > 0 && sortedTeams.length > 0 ? ( -
-
- {sortedTeams.map((team) => ( -
-
- {team.team_name.startsWith('openbas_') ? ( - - ) : ( - - )} -    - {team.team_name.startsWith('openbas_') - ? t(team.team_name) - : truncate(team.team_name, 20)} -
+ return <> + {injects.length > 0 && sortedTeams.length > 0 ? ( +
+
+ {sortedTeams.map((team) => ( +
+
+ {team.team_name.startsWith('openbas_') ? ( + + ) : ( + + )} +    + {team.team_name.startsWith('openbas_') + ? t(team.team_name) + : truncate(team.team_name, 20)}
- ))} -
-
- {sortedTeams.map((team, index) => { - const injectsGroupedByTick = byTick( - filtering.filterAndSort(injectsMap[team.team_id] ?? []), - ); +
+ ))} +
+
+ {sortedTeams.map((team, index) => { + const injectsGroupedByTick = byTick( + filtering.filterAndSort(injectsMap[team.team_id] ?? []), + ); + return ( +
+ {Object.keys(injectsGroupedByTick).map((key, i) => { + const injectGroupPosition = (parseFloat(key) * 100) / totalDuration; + return ( +
+ {injectsGroupedByTick[key].map((inject: InjectStore) => { + const duration = splitDuration(inject.inject_depends_duration || 0); + const tooltipContent = ( + + {inject.inject_title} +
+ + {`${duration.days} ${t('d')}, ${duration.hours} ${t('h')}, ${duration.minutes} ${t('m')}`} + +
+ ); + return ( + handleSelectInject(inject.inject_id)} + done={inject.inject_status !== null} + disabled={!inject.inject_enabled} + size="small" + variant='timeline' + tooltip={tooltipContent} + /> + ); + }) + } +
+ ); + })} +
+ ); + })} +
+ {ticks.map((tick, index) => { + const duration = splitDuration(tick); return (
- {Object.keys(injectsGroupedByTick).map((key, i) => { - const injectGroupPosition = (parseFloat(key) * 100) / totalDuration; - return ( -
- {injectsGroupedByTick[key].map((inject: InjectStore) => { - const duration = splitDuration(inject.inject_depends_duration || 0); - const tooltipContent = ( - - {inject.inject_title} -
- - {`${duration.days} ${t('d')}, ${duration.hours} ${t('h')}, ${duration.minutes} ${t('m')}`} - -
- ); - return ( - handleSelectInject(inject.inject_id)} - done={inject.inject_status !== null} - disabled={!inject.inject_enabled} - size="small" - variant='timeline' - tooltip={tooltipContent} - /> - ); - }) - } -
- ); - })} +
+ {index % 5 === 0 + ? `${duration.days} + ${t('d')}, ${duration.hours} + ${t('h')}, ${duration.minutes} + ${t('m')}` + : ''} +
+
+ {index % 5 === 0 + ? `${duration.days} + ${t('d')}, ${duration.hours} + ${t('h')}, ${duration.minutes} + ${t('m')}` + : ''} +
); })} -
- {ticks.map((tick, index) => { - const duration = splitDuration(tick); - return ( -
-
- {index % 5 === 0 - ? `${duration.days} - ${t('d')}, ${duration.hours} - ${t('h')}, ${duration.minutes} - ${t('m')}` - : ''} -
-
- {index % 5 === 0 - ? `${duration.days} - ${t('d')}, ${duration.hours} - ${t('h')}, ${duration.minutes} - ${t('m')}` - : ''} -
-
- ); - })} -
- ) : null - } - - ); +
+ ) : null + } + ; }; export default Timeline; diff --git a/openbas-front/src/components/TruncatedText.js b/openbas-front/src/components/TruncatedText.js index a06bab6066..1924f38d21 100644 --- a/openbas-front/src/components/TruncatedText.js +++ b/openbas-front/src/components/TruncatedText.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { Tooltip } from '@mui/material'; import { truncate } from '../utils/String'; diff --git a/openbas-front/src/components/common/ButtonCreate.tsx b/openbas-front/src/components/common/ButtonCreate.tsx index 0ee0ca3b40..d82ef5a8dc 100644 --- a/openbas-front/src/components/common/ButtonCreate.tsx +++ b/openbas-front/src/components/common/ButtonCreate.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Add } from '@mui/icons-material'; import { Fab } from '@mui/material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/common/ButtonPopover.tsx b/openbas-front/src/components/common/ButtonPopover.tsx index 713251455f..ba8451ad12 100644 --- a/openbas-front/src/components/common/ButtonPopover.tsx +++ b/openbas-front/src/components/common/ButtonPopover.tsx @@ -1,6 +1,7 @@ import { IconButton, Menu, MenuItem, ToggleButton, ToggleButtonProps } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; +import * as React from 'react'; import { useFormatter } from '../i18n'; export interface PopoverEntry { diff --git a/openbas-front/src/components/common/ChipInList.tsx b/openbas-front/src/components/common/ChipInList.tsx index c6d422a545..21c9785d81 100644 --- a/openbas-front/src/components/common/ChipInList.tsx +++ b/openbas-front/src/components/common/ChipInList.tsx @@ -1,5 +1,5 @@ import { Chip } from '@mui/material'; -import React, { CSSProperties, FunctionComponent } from 'react'; +import { CSSProperties, FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import { useFormatter } from '../i18n'; diff --git a/openbas-front/src/components/common/CodeBlock.tsx b/openbas-front/src/components/common/CodeBlock.tsx index 88d74999de..a7c3a919d9 100644 --- a/openbas-front/src/components/common/CodeBlock.tsx +++ b/openbas-front/src/components/common/CodeBlock.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; import { a11yDark, coy } from 'react-syntax-highlighter/dist/esm/styles/prism'; import { useTheme } from '@mui/styles'; diff --git a/openbas-front/src/components/common/CustomFileUploader.tsx b/openbas-front/src/components/common/CustomFileUploader.tsx index e22c131bf8..7fc0ac6195 100644 --- a/openbas-front/src/components/common/CustomFileUploader.tsx +++ b/openbas-front/src/components/common/CustomFileUploader.tsx @@ -1,4 +1,4 @@ -import React, { FormEvent, FunctionComponent, useEffect, useState } from 'react'; +import { FormEvent, FunctionComponent, useEffect, useState } from 'react'; import { Box, Button, InputLabel } from '@mui/material'; import { Theme } from '@mui/material/styles/createTheme'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/common/Dialog.tsx b/openbas-front/src/components/common/Dialog.tsx index bc862701dd..3d1dc4f4e7 100644 --- a/openbas-front/src/components/common/Dialog.tsx +++ b/openbas-front/src/components/common/Dialog.tsx @@ -1,5 +1,6 @@ import { Dialog as DialogMUI, DialogTitle, DialogContent, Breakpoint } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; +import * as React from 'react'; import Transition from './Transition'; interface DialogProps { diff --git a/openbas-front/src/components/common/DialogDelete.tsx b/openbas-front/src/components/common/DialogDelete.tsx index 15bf1c1809..92120c916f 100644 --- a/openbas-front/src/components/common/DialogDelete.tsx +++ b/openbas-front/src/components/common/DialogDelete.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Button, Dialog as DialogMUI, DialogActions, DialogContent, DialogContentText } from '@mui/material'; import Transition from './Transition'; import { useFormatter } from '../i18n'; diff --git a/openbas-front/src/components/common/DialogDuplicate.tsx b/openbas-front/src/components/common/DialogDuplicate.tsx index fb91780e9d..8afb63f718 100644 --- a/openbas-front/src/components/common/DialogDuplicate.tsx +++ b/openbas-front/src/components/common/DialogDuplicate.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Button, Dialog as DialogMUI, DialogActions, DialogContent, DialogContentText } from '@mui/material'; import { useFormatter } from '../i18n'; import Transition from './Transition'; diff --git a/openbas-front/src/components/common/DialogTest.tsx b/openbas-front/src/components/common/DialogTest.tsx index a16791571e..b3b4b97270 100644 --- a/openbas-front/src/components/common/DialogTest.tsx +++ b/openbas-front/src/components/common/DialogTest.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, Alert } from '@mui/material'; import { useFormatter } from '../i18n'; import Transition from './Transition'; diff --git a/openbas-front/src/components/common/DialogWithCross.tsx b/openbas-front/src/components/common/DialogWithCross.tsx index 3664fb8728..be9e93aa1e 100644 --- a/openbas-front/src/components/common/DialogWithCross.tsx +++ b/openbas-front/src/components/common/DialogWithCross.tsx @@ -1,6 +1,7 @@ import { Dialog as DialogMUI, DialogTitle, DialogContent, IconButton, Breakpoint } from '@mui/material'; import { Close } from '@mui/icons-material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import Transition from './Transition'; import type { Theme } from '../Theme'; diff --git a/openbas-front/src/components/common/Drawer.tsx b/openbas-front/src/components/common/Drawer.tsx index 12e390a143..a9fb9cdaa4 100644 --- a/openbas-front/src/components/common/Drawer.tsx +++ b/openbas-front/src/components/common/Drawer.tsx @@ -1,5 +1,6 @@ import { Drawer as DrawerMUI, IconButton, type PaperProps, Typography } from '@mui/material'; -import React, { CSSProperties, FunctionComponent } from 'react'; +import { CSSProperties, FunctionComponent } from 'react'; +import * as React from 'react'; import { Close } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; import type { Theme } from '../Theme'; diff --git a/openbas-front/src/components/common/ExpendableText.tsx b/openbas-front/src/components/common/ExpendableText.tsx index 70f7b6c3ed..ac28392e81 100644 --- a/openbas-front/src/components/common/ExpendableText.tsx +++ b/openbas-front/src/components/common/ExpendableText.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { ExpandLess, ExpandMore } from '@mui/icons-material'; import { IconButton } from '@mui/material'; import { truncate } from '../../utils/String'; diff --git a/openbas-front/src/components/common/ExportButton.tsx b/openbas-front/src/components/common/ExportButton.tsx index 21f20031d0..52450400d8 100644 --- a/openbas-front/src/components/common/ExportButton.tsx +++ b/openbas-front/src/components/common/ExportButton.tsx @@ -1,6 +1,5 @@ import { ToggleButton, Tooltip } from '@mui/material'; import { FileDownloadOutlined } from '@mui/icons-material'; -import React from 'react'; import { CSVLink } from 'react-csv'; import { exportData } from '../../utils/Environment'; import { useFormatter } from '../i18n'; diff --git a/openbas-front/src/components/common/IconPopover.tsx b/openbas-front/src/components/common/IconPopover.tsx index cdc5a2c9c1..e05bcdff98 100644 --- a/openbas-front/src/components/common/IconPopover.tsx +++ b/openbas-front/src/components/common/IconPopover.tsx @@ -1,6 +1,6 @@ import { IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; -import React, { FunctionComponent, useState } from 'react'; +import { FunctionComponent, useState } from 'react'; import { useFormatter } from '../i18n'; import { PopoverEntry } from './ButtonPopover'; diff --git a/openbas-front/src/components/common/ImportUploader.tsx b/openbas-front/src/components/common/ImportUploader.tsx index 7e0e433d2d..4fec09adc3 100644 --- a/openbas-front/src/components/common/ImportUploader.tsx +++ b/openbas-front/src/components/common/ImportUploader.tsx @@ -1,4 +1,4 @@ -import React, { ChangeEvent, FunctionComponent, useRef, useState } from 'react'; +import { ChangeEvent, FunctionComponent, useRef, useState } from 'react'; import { CircularProgress, CircularProgressProps, IconButton, ToggleButton, Tooltip } from '@mui/material'; import { CloudUploadOutlined } from '@mui/icons-material'; import { useFormatter } from '../i18n'; diff --git a/openbas-front/src/components/common/ListItemButtonCreate.tsx b/openbas-front/src/components/common/ListItemButtonCreate.tsx index 5dbe64b64c..ec35a70c18 100644 --- a/openbas-front/src/components/common/ListItemButtonCreate.tsx +++ b/openbas-front/src/components/common/ListItemButtonCreate.tsx @@ -1,6 +1,6 @@ import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import type { Theme } from '../Theme'; diff --git a/openbas-front/src/components/common/Paper.tsx b/openbas-front/src/components/common/Paper.tsx index 38b1041075..d4ce61507e 100644 --- a/openbas-front/src/components/common/Paper.tsx +++ b/openbas-front/src/components/common/Paper.tsx @@ -1,6 +1,7 @@ import { makeStyles } from '@mui/styles'; import { Paper as PaperMui } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; +import * as React from 'react'; interface PaperProps { children: React.ReactElement; diff --git a/openbas-front/src/components/common/RightMenu.tsx b/openbas-front/src/components/common/RightMenu.tsx index e66cf18669..2bab9b586f 100644 --- a/openbas-front/src/components/common/RightMenu.tsx +++ b/openbas-front/src/components/common/RightMenu.tsx @@ -1,4 +1,5 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import { Drawer, ListItemIcon, ListItemText, MenuItem, MenuList } from '@mui/material'; import { Link, useLocation } from 'react-router-dom'; diff --git a/openbas-front/src/components/common/SelectList.tsx b/openbas-front/src/components/common/SelectList.tsx index 4850ff6aaf..940b349470 100644 --- a/openbas-front/src/components/common/SelectList.tsx +++ b/openbas-front/src/components/common/SelectList.tsx @@ -1,5 +1,6 @@ import { Box, Chip, Grid, List, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; -import React, { useMemo } from 'react'; +import { useMemo } from 'react'; +import * as React from 'react'; import { truncate } from '../../utils/String'; export interface SelectListIcon { diff --git a/openbas-front/src/components/common/SortHeadersList.tsx b/openbas-front/src/components/common/SortHeadersList.tsx index 75db12d57d..94400df12a 100644 --- a/openbas-front/src/components/common/SortHeadersList.tsx +++ b/openbas-front/src/components/common/SortHeadersList.tsx @@ -1,4 +1,5 @@ -import React, { CSSProperties, FunctionComponent, useState } from 'react'; +import { CSSProperties, FunctionComponent, useState } from 'react'; +import * as React from 'react'; import { ArrowDropDownOutlined, ArrowDropUpOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; diff --git a/openbas-front/src/components/common/TopMenu.tsx b/openbas-front/src/components/common/TopMenu.tsx index 42c712939f..a6a2cc35f4 100644 --- a/openbas-front/src/components/common/TopMenu.tsx +++ b/openbas-front/src/components/common/TopMenu.tsx @@ -1,5 +1,5 @@ import { makeStyles } from '@mui/styles'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { Button } from '@mui/material'; import { useFormatter } from '../i18n'; diff --git a/openbas-front/src/components/common/Transition.tsx b/openbas-front/src/components/common/Transition.tsx index b45427004d..9c59a93167 100644 --- a/openbas-front/src/components/common/Transition.tsx +++ b/openbas-front/src/components/common/Transition.tsx @@ -1,4 +1,5 @@ -import React, { JSXElementConstructor } from 'react'; +import { JSXElementConstructor } from 'react'; +import * as React from 'react'; import { Slide } from '@mui/material'; import type { TransitionProps } from '@mui/material/transitions'; diff --git a/openbas-front/src/components/common/chips/ChipUtils.tsx b/openbas-front/src/components/common/chips/ChipUtils.tsx index 67dc6a6970..a81d89ba8f 100644 --- a/openbas-front/src/components/common/chips/ChipUtils.tsx +++ b/openbas-front/src/components/common/chips/ChipUtils.tsx @@ -1,7 +1,3 @@ -import React from 'react'; - -// -- OPERATOR -- - const convertOperatorToIcon = (t: (text: string) => string, operator?: string) => { switch (operator) { case 'is': diff --git a/openbas-front/src/components/common/chips/ClickableChip.tsx b/openbas-front/src/components/common/chips/ClickableChip.tsx index 8cdd60f489..e89b7d1760 100644 --- a/openbas-front/src/components/common/chips/ClickableChip.tsx +++ b/openbas-front/src/components/common/chips/ClickableChip.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useRef, useState } from 'react'; +import { FunctionComponent, useRef, useState } from 'react'; import { Box, Chip, SelectChangeEvent, Tooltip } from '@mui/material'; import { makeStyles } from '@mui/styles'; import classNames from 'classnames'; diff --git a/openbas-front/src/components/common/chips/ClickableChipPopover.tsx b/openbas-front/src/components/common/chips/ClickableChipPopover.tsx index 8ac0579da8..c876387892 100644 --- a/openbas-front/src/components/common/chips/ClickableChipPopover.tsx +++ b/openbas-front/src/components/common/chips/ClickableChipPopover.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { MenuItem, Popover, Select, SelectChangeEvent } from '@mui/material'; interface Props { diff --git a/openbas-front/src/components/common/chips/ClickableModeChip.tsx b/openbas-front/src/components/common/chips/ClickableModeChip.tsx index d0e3d5a79f..75acf79c25 100644 --- a/openbas-front/src/components/common/chips/ClickableModeChip.tsx +++ b/openbas-front/src/components/common/chips/ClickableModeChip.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import classNames from 'classnames'; import { useFormatter } from '../../i18n'; diff --git a/openbas-front/src/components/common/pagination/PaginationComponent.tsx b/openbas-front/src/components/common/pagination/PaginationComponent.tsx index 6fddff6035..8f5840e0d8 100644 --- a/openbas-front/src/components/common/pagination/PaginationComponent.tsx +++ b/openbas-front/src/components/common/pagination/PaginationComponent.tsx @@ -1,5 +1,6 @@ import { Button, Chip, TablePagination, ToggleButtonGroup } from '@mui/material'; -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import SearchFilter from '../../SearchFilter'; import type { Page } from '../queryable/Page'; diff --git a/openbas-front/src/components/common/pagination/SortHeadersComponent.tsx b/openbas-front/src/components/common/pagination/SortHeadersComponent.tsx index e2499d9d3e..591dd90391 100644 --- a/openbas-front/src/components/common/pagination/SortHeadersComponent.tsx +++ b/openbas-front/src/components/common/pagination/SortHeadersComponent.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, FunctionComponent, useState } from 'react'; +import { CSSProperties, FunctionComponent, useState } from 'react'; import { ArrowDropDownOutlined, ArrowDropUpOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; import { useFormatter } from '../../i18n'; diff --git a/openbas-front/src/components/common/queryable/filter/FilterAutocomplete.tsx b/openbas-front/src/components/common/queryable/filter/FilterAutocomplete.tsx index cbb91660fa..cec850bba6 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterAutocomplete.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterAutocomplete.tsx @@ -1,6 +1,6 @@ import { Autocomplete as MuiAutocomplete, IconButton, TextField, Tooltip } from '@mui/material'; import { FilterListOffOutlined } from '@mui/icons-material'; -import React, { CSSProperties, FunctionComponent } from 'react'; +import { useState, CSSProperties, FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import type { Filter, FilterGroup } from '../../../../utils/api-types'; import { FilterHelpers } from './FilterHelpers'; @@ -36,7 +36,7 @@ const FilterAutocomplete: FunctionComponent = ({ const classes = useStyles(); const { t } = useFormatter(); - const [inputValue, setInputValue] = React.useState(''); + const [inputValue, setInputValue] = useState(''); const handleChange = (value: string, operator: Filter['operator']) => { setPristine(false); diff --git a/openbas-front/src/components/common/queryable/filter/FilterChip.tsx b/openbas-front/src/components/common/queryable/filter/FilterChip.tsx index 9b3e0797ba..e99f3554a4 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterChip.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterChip.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useRef, useState } from 'react'; +import { FunctionComponent, useRef, useState } from 'react'; import { Chip, Tooltip } from '@mui/material'; import * as R from 'ramda'; import { FilterHelpers } from './FilterHelpers'; diff --git a/openbas-front/src/components/common/queryable/filter/FilterChipPopover.tsx b/openbas-front/src/components/common/queryable/filter/FilterChipPopover.tsx index b44b3ac554..b045df90c3 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterChipPopover.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterChipPopover.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { MenuItem, Popover, Select, SelectChangeEvent } from '@mui/material'; import { useFormatter } from '../../../i18n'; import { FilterHelpers } from './FilterHelpers'; diff --git a/openbas-front/src/components/common/queryable/filter/FilterChipPopoverInput.tsx b/openbas-front/src/components/common/queryable/filter/FilterChipPopoverInput.tsx index b0e537529c..02f4a7b7b2 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterChipPopoverInput.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterChipPopoverInput.tsx @@ -1,5 +1,5 @@ import { Autocomplete, Checkbox, TextField } from '@mui/material'; -import React, { FunctionComponent, useEffect } from 'react'; +import { FunctionComponent, useEffect } from 'react'; import { DateTimePicker } from '@mui/x-date-pickers'; import { useFormatter } from '../../../i18n'; import type { Filter, PropertySchemaDTO } from '../../../../utils/api-types'; @@ -68,7 +68,7 @@ export const BasicSelectInput: FunctionComponent v !== optionId) ?? []) - : [...filter.values ?? [], optionId]; + : [...(filter.values ?? []), optionId]; helpers.handleAddMultipleValueFilter(filter.key, newValues); }; diff --git a/openbas-front/src/components/common/queryable/filter/FilterChipValues.tsx b/openbas-front/src/components/common/queryable/filter/FilterChipValues.tsx index becf6e7c05..46f1716b69 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterChipValues.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterChipValues.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useEffect } from 'react'; +import { FunctionComponent, useEffect } from 'react'; import { makeStyles } from '@mui/styles'; import { Box } from '@mui/material'; import classNames from 'classnames'; diff --git a/openbas-front/src/components/common/queryable/filter/FilterChips.tsx b/openbas-front/src/components/common/queryable/filter/FilterChips.tsx index c601f33413..e8c9d8c237 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterChips.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterChips.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { Fragment, FunctionComponent } from 'react'; import { Box } from '@mui/material'; import { FilterHelpers } from './FilterHelpers'; import type { Filter, FilterGroup, PropertySchemaDTO } from '../../../../utils/api-types'; @@ -44,10 +44,10 @@ const FilterChips: FunctionComponent = ({ {filters.map((filter, idx) => { const property = propertySchema(filter); if (!property) { - return (); + return ; } return ( - + {idx !== 0 && } = ({ propertySchema={property} pristine={pristine} /> - + ); }) } diff --git a/openbas-front/src/components/common/queryable/filter/FilterField.tsx b/openbas-front/src/components/common/queryable/filter/FilterField.tsx index 692915b253..6e70d6545d 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterField.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterField.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; +import { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; import { availableOperators } from './FilterUtils'; import { useFormatter } from '../../../i18n'; import type { FilterGroup, PropertySchemaDTO } from '../../../../utils/api-types'; diff --git a/openbas-front/src/components/common/queryable/filter/FilterUtils.tsx b/openbas-front/src/components/common/queryable/filter/FilterUtils.tsx index 2ca27a87b6..9300f5c5ba 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterUtils.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterUtils.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import * as R from 'ramda'; import type { Filter, FilterGroup, PropertySchemaDTO } from '../../../../utils/api-types'; diff --git a/openbas-front/src/components/common/queryable/filter/specific/ScenarioStatusFilter.tsx b/openbas-front/src/components/common/queryable/filter/specific/ScenarioStatusFilter.tsx index 5980821813..5c9adc2f2b 100644 --- a/openbas-front/src/components/common/queryable/filter/specific/ScenarioStatusFilter.tsx +++ b/openbas-front/src/components/common/queryable/filter/specific/ScenarioStatusFilter.tsx @@ -1,5 +1,5 @@ import { Autocomplete, MenuItem, Select, TextField } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useFormatter } from '../../../../i18n'; import { SCENARIO_NOT_SCHEDULED_STATUS, SCENARIO_SCHEDULED_STATUS } from '../../../../../admin/components/scenarios/scenario/ScenarioStatus'; import type { PropertySchemaDTO } from '../../../../../utils/api-types'; diff --git a/openbas-front/src/components/common/queryable/pagination/PaginationComponentV2.tsx b/openbas-front/src/components/common/queryable/pagination/PaginationComponentV2.tsx index 1883d6a9a5..497bd02fcb 100644 --- a/openbas-front/src/components/common/queryable/pagination/PaginationComponentV2.tsx +++ b/openbas-front/src/components/common/queryable/pagination/PaginationComponentV2.tsx @@ -1,5 +1,6 @@ import { Box, Button, Chip } from '@mui/material'; -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import type { Page } from '../Page'; import type { Filter, PropertySchemaDTO, SearchPaginationInput } from '../../../../utils/api-types'; diff --git a/openbas-front/src/components/common/queryable/pagination/TablePaginationComponent.tsx b/openbas-front/src/components/common/queryable/pagination/TablePaginationComponent.tsx index e178019d1b..5f7dad910b 100644 --- a/openbas-front/src/components/common/queryable/pagination/TablePaginationComponent.tsx +++ b/openbas-front/src/components/common/queryable/pagination/TablePaginationComponent.tsx @@ -1,5 +1,5 @@ import { TablePagination, ToggleButtonGroup } from '@mui/material'; -import React from 'react'; +import * as React from 'react'; import { makeStyles } from '@mui/styles'; import { ROWS_PER_PAGE_OPTIONS } from './usPaginationState'; import ExportButton, { ExportProps } from '../../ExportButton'; diff --git a/openbas-front/src/components/common/queryable/pagination/TablePaginationComponentV2.tsx b/openbas-front/src/components/common/queryable/pagination/TablePaginationComponentV2.tsx index cc60dfa9fe..c03a45daa5 100644 --- a/openbas-front/src/components/common/queryable/pagination/TablePaginationComponentV2.tsx +++ b/openbas-front/src/components/common/queryable/pagination/TablePaginationComponentV2.tsx @@ -1,5 +1,6 @@ import { TablePagination } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; +import * as React from 'react'; import { ROWS_PER_PAGE_OPTIONS } from './usPaginationState'; import { PaginationHelpers } from './PaginationHelpers'; diff --git a/openbas-front/src/components/common/queryable/pagination/usPaginationState.tsx b/openbas-front/src/components/common/queryable/pagination/usPaginationState.tsx index 2ba1af0313..9445ef1bc1 100644 --- a/openbas-front/src/components/common/queryable/pagination/usPaginationState.tsx +++ b/openbas-front/src/components/common/queryable/pagination/usPaginationState.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; +import * as React from 'react'; import { PaginationHelpers } from './PaginationHelpers'; export const ROWS_PER_PAGE_OPTIONS = [20, 50, 100]; diff --git a/openbas-front/src/components/common/queryable/sort/SortHeadersComponentV2.tsx b/openbas-front/src/components/common/queryable/sort/SortHeadersComponentV2.tsx index ed2fef5087..6a4a4779d3 100644 --- a/openbas-front/src/components/common/queryable/sort/SortHeadersComponentV2.tsx +++ b/openbas-front/src/components/common/queryable/sort/SortHeadersComponentV2.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, FunctionComponent } from 'react'; +import { CSSProperties, FunctionComponent } from 'react'; import { ArrowDropDownOutlined, ArrowDropUpOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; import { SortHelpers } from './SortHelpers'; diff --git a/openbas-front/src/components/common/queryable/textSearch/TextSearchComponent.tsx b/openbas-front/src/components/common/queryable/textSearch/TextSearchComponent.tsx index 81f8e1a0a7..6a12adc6cb 100644 --- a/openbas-front/src/components/common/queryable/textSearch/TextSearchComponent.tsx +++ b/openbas-front/src/components/common/queryable/textSearch/TextSearchComponent.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import SearchFilter from '../../../SearchFilter'; import { TextSearchHelpers } from './TextSearchHelpers'; diff --git a/openbas-front/src/components/fields/DocumentField.tsx b/openbas-front/src/components/fields/DocumentField.tsx index 85fd9ef8ca..454c70acbd 100644 --- a/openbas-front/src/components/fields/DocumentField.tsx +++ b/openbas-front/src/components/fields/DocumentField.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, FunctionComponent } from 'react'; +import { CSSProperties, FunctionComponent } from 'react'; import { Autocomplete as MuiAutocomplete, Box, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { FieldErrors } from 'react-hook-form'; diff --git a/openbas-front/src/components/fields/FileLoader.tsx b/openbas-front/src/components/fields/FileLoader.tsx index a18ac22ba2..b4b3bce329 100644 --- a/openbas-front/src/components/fields/FileLoader.tsx +++ b/openbas-front/src/components/fields/FileLoader.tsx @@ -1,4 +1,5 @@ -import React, { CSSProperties, useEffect, useState } from 'react'; +import { CSSProperties, useEffect, useState } from 'react'; +import * as React from 'react'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { AttachmentOutlined, ControlPointOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/components/fields/FileTransferDialog.tsx b/openbas-front/src/components/fields/FileTransferDialog.tsx index 432c754021..6bb8e90973 100644 --- a/openbas-front/src/components/fields/FileTransferDialog.tsx +++ b/openbas-front/src/components/fields/FileTransferDialog.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; +import * as React from 'react'; import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { DescriptionOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/fields/MarkDownField.tsx b/openbas-front/src/components/fields/MarkDownField.tsx index e7fbe35c07..e378fc14b2 100644 --- a/openbas-front/src/components/fields/MarkDownField.tsx +++ b/openbas-front/src/components/fields/MarkDownField.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import MDEditor, { commands } from '@uiw/react-md-editor/nohighlight'; import { ICommand } from '@uiw/react-md-editor'; import { Typography } from '@mui/material'; diff --git a/openbas-front/src/components/fields/MarkDownFieldController.tsx b/openbas-front/src/components/fields/MarkDownFieldController.tsx index a4a0c2e5a8..87f27ea001 100644 --- a/openbas-front/src/components/fields/MarkDownFieldController.tsx +++ b/openbas-front/src/components/fields/MarkDownFieldController.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { useController, useFormContext } from 'react-hook-form'; import { Box, FormHelperText, InputLabel } from '@mui/material'; import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; diff --git a/openbas-front/src/components/fields/MultipleFileLoader.tsx b/openbas-front/src/components/fields/MultipleFileLoader.tsx index d7ca94eace..2d88b8423f 100644 --- a/openbas-front/src/components/fields/MultipleFileLoader.tsx +++ b/openbas-front/src/components/fields/MultipleFileLoader.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useContext, useState } from 'react'; +import { FunctionComponent, useContext, useState } from 'react'; import { ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/components/fields/OldMarkDownField.tsx b/openbas-front/src/components/fields/OldMarkDownField.tsx index a3449e7f4f..995e223fad 100644 --- a/openbas-front/src/components/fields/OldMarkDownField.tsx +++ b/openbas-front/src/components/fields/OldMarkDownField.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import MDEditor, { commands } from '@uiw/react-md-editor/nohighlight'; import { Field, FieldInputProps, FieldMetaState } from 'react-final-form'; import { FormHelperText, InputLabel, useTheme } from '@mui/material'; diff --git a/openbas-front/src/components/fields/OldSelectField.jsx b/openbas-front/src/components/fields/OldSelectField.jsx index b7bd96d429..418471ce05 100644 --- a/openbas-front/src/components/fields/OldSelectField.jsx +++ b/openbas-front/src/components/fields/OldSelectField.jsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Select as MUISelect, FormControl, InputLabel, FormHelperText } from '@mui/material'; import { Field } from 'react-final-form'; diff --git a/openbas-front/src/components/fields/OldTextField.jsx b/openbas-front/src/components/fields/OldTextField.jsx index 82b7508d1f..65106f63c4 100644 --- a/openbas-front/src/components/fields/OldTextField.jsx +++ b/openbas-front/src/components/fields/OldTextField.jsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Field } from 'react-final-form'; import { TextField as MuiTextField } from '@mui/material'; import { useFormatter } from '../i18n'; diff --git a/openbas-front/src/components/fields/RichTextField.jsx b/openbas-front/src/components/fields/RichTextField.jsx index 82bcb11a35..f5a8962fd9 100644 --- a/openbas-front/src/components/fields/RichTextField.jsx +++ b/openbas-front/src/components/fields/RichTextField.jsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Field } from 'react-final-form'; import { FormHelperText, InputLabel } from '@mui/material'; import { CKEditor } from '@ckeditor/ckeditor5-react'; diff --git a/openbas-front/src/components/fields/SecurityPlatformField.tsx b/openbas-front/src/components/fields/SecurityPlatformField.tsx index f343d9fc86..6bff9c54d3 100644 --- a/openbas-front/src/components/fields/SecurityPlatformField.tsx +++ b/openbas-front/src/components/fields/SecurityPlatformField.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, FunctionComponent } from 'react'; +import { CSSProperties, FunctionComponent } from 'react'; import { Autocomplete as MuiAutocomplete, Box, TextField } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; import { FieldErrors } from 'react-hook-form'; diff --git a/openbas-front/src/components/fields/SelectField.jsx b/openbas-front/src/components/fields/SelectField.jsx index bfff2babec..5b9da28163 100644 --- a/openbas-front/src/components/fields/SelectField.jsx +++ b/openbas-front/src/components/fields/SelectField.jsx @@ -1,4 +1,3 @@ -import React from 'react'; import { FormControl, FormHelperText, InputLabel, Select as MUISelect } from '@mui/material'; import { Controller } from 'react-hook-form'; diff --git a/openbas-front/src/components/fields/SimpleRichTextField.jsx b/openbas-front/src/components/fields/SimpleRichTextField.jsx index 4fa987e89f..4b4b798473 100644 --- a/openbas-front/src/components/fields/SimpleRichTextField.jsx +++ b/openbas-front/src/components/fields/SimpleRichTextField.jsx @@ -1,4 +1,3 @@ -import React from 'react'; import { InputLabel } from '@mui/material'; import { CKEditor } from '@ckeditor/ckeditor5-react'; import Editor from 'ckeditor5-custom-build/build/ckeditor'; diff --git a/openbas-front/src/components/fields/SliderField.js b/openbas-front/src/components/fields/SliderField.js index 02727cfc46..94208e4059 100644 --- a/openbas-front/src/components/fields/SliderField.js +++ b/openbas-front/src/components/fields/SliderField.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { Slider as MUISlider } from '@mui/material'; import { Field } from 'react-final-form'; diff --git a/openbas-front/src/components/fields/SwitchField.js b/openbas-front/src/components/fields/SwitchField.js index 4f2ea936af..14b2fda512 100644 --- a/openbas-front/src/components/fields/SwitchField.js +++ b/openbas-front/src/components/fields/SwitchField.js @@ -1,4 +1,3 @@ -import React from 'react'; import { Field } from 'react-final-form'; import { FormGroup, FormControlLabel, Switch as MuiSwitch, FormHelperText, FormControl } from '@mui/material'; diff --git a/openbas-front/src/components/fields/TagField.tsx b/openbas-front/src/components/fields/TagField.tsx index a8d0b0f108..030f65fc30 100644 --- a/openbas-front/src/components/fields/TagField.tsx +++ b/openbas-front/src/components/fields/TagField.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, FunctionComponent, useState } from 'react'; +import { CSSProperties, FunctionComponent, useState } from 'react'; import * as R from 'ramda'; import { AddOutlined, LabelOutlined } from '@mui/icons-material'; import { Autocomplete as MuiAutocomplete, Box, Dialog, DialogContent, DialogTitle, IconButton, TextField } from '@mui/material'; diff --git a/openbas-front/src/components/fields/TextField.js b/openbas-front/src/components/fields/TextField.js index 118720f7ae..c0ebe6e6d0 100644 --- a/openbas-front/src/components/fields/TextField.js +++ b/openbas-front/src/components/fields/TextField.js @@ -1,4 +1,3 @@ -import React from 'react'; import { TextField as MuiTextField } from '@mui/material'; import { useWatch } from 'react-hook-form'; import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; diff --git a/openbas-front/src/components/i18n.js b/openbas-front/src/components/i18n.js index 8ba8a2ad42..ab9e4a719d 100644 --- a/openbas-front/src/components/i18n.js +++ b/openbas-front/src/components/i18n.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import { useIntl, injectIntl } from 'react-intl'; import moment from 'moment-timezone'; import { bytesFormat, numberFormat } from '../utils/Number'; diff --git a/openbas-front/src/components/nodes/NodeInject.tsx b/openbas-front/src/components/nodes/NodeInject.tsx index 46c23add77..19fd1cfb34 100644 --- a/openbas-front/src/components/nodes/NodeInject.tsx +++ b/openbas-front/src/components/nodes/NodeInject.tsx @@ -1,4 +1,5 @@ -import React, { memo } from 'react'; +import { memo } from 'react'; +import * as React from 'react'; import { Handle, NodeProps, Position, Node, OnConnect, XYPosition } from '@xyflow/react'; import { makeStyles, useTheme } from '@mui/styles'; import { Tooltip } from '@mui/material'; diff --git a/openbas-front/src/components/nodes/NodePhantom.tsx b/openbas-front/src/components/nodes/NodePhantom.tsx index b66793a0da..c2481c0b3d 100644 --- a/openbas-front/src/components/nodes/NodePhantom.tsx +++ b/openbas-front/src/components/nodes/NodePhantom.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, memo } from 'react'; +import { FunctionComponent, memo } from 'react'; import { makeStyles } from '@mui/styles'; import { AddCircleOutline } from '@mui/icons-material'; import type { Theme } from '../Theme'; diff --git a/openbas-front/src/components/scalebar/ScaleBar.tsx b/openbas-front/src/components/scalebar/ScaleBar.tsx index 6a0e7df956..5069a5ecbf 100644 --- a/openbas-front/src/components/scalebar/ScaleBar.tsx +++ b/openbas-front/src/components/scalebar/ScaleBar.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { useFormatter } from '../i18n'; import { Scale } from './Tick'; diff --git a/openbas-front/src/index.tsx b/openbas-front/src/index.tsx index 5b75880fb6..d35d7ee92b 100644 --- a/openbas-front/src/index.tsx +++ b/openbas-front/src/index.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import { StrictMode } from 'react'; import '@fontsource/ibm-plex-sans'; import '@fontsource/geologica'; import { createRoot } from 'react-dom/client'; @@ -12,8 +12,8 @@ const container = document.getElementById('root'); if (container) { const root = createRoot(container); root.render( - + - , + , ); } diff --git a/openbas-front/src/private/Index.tsx b/openbas-front/src/private/Index.tsx index 207058b6b2..d2e5b9101e 100644 --- a/openbas-front/src/private/Index.tsx +++ b/openbas-front/src/private/Index.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Route, Routes } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; import TopBar from './components/nav/TopBar'; diff --git a/openbas-front/src/private/components/Dashboard.js b/openbas-front/src/private/components/Dashboard.js index cc10cd43c4..bdf25f21da 100644 --- a/openbas-front/src/private/components/Dashboard.js +++ b/openbas-front/src/private/components/Dashboard.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; import { withStyles, withTheme } from '@mui/styles'; diff --git a/openbas-front/src/private/components/nav/TopBar.tsx b/openbas-front/src/private/components/nav/TopBar.tsx index 2ab2d9e6fa..b6afedff0f 100644 --- a/openbas-front/src/private/components/nav/TopBar.tsx +++ b/openbas-front/src/private/components/nav/TopBar.tsx @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import { AppBar, Toolbar, IconButton, Menu, MenuProps, MenuItem } from '@mui/material'; import { Link } from 'react-router-dom'; import { AccountCircleOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/public/Index.tsx b/openbas-front/src/public/Index.tsx index 0d3011740c..b20c019a4b 100644 --- a/openbas-front/src/public/Index.tsx +++ b/openbas-front/src/public/Index.tsx @@ -1,4 +1,4 @@ -import React, { lazy, Suspense } from 'react'; +import { lazy, Suspense } from 'react'; import * as PropTypes from 'prop-types'; import { Route, Routes } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; diff --git a/openbas-front/src/public/Root.tsx b/openbas-front/src/public/Root.tsx index d2111eb8a4..8ec9554b2c 100644 --- a/openbas-front/src/public/Root.tsx +++ b/openbas-front/src/public/Root.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { CssBaseline } from '@mui/material'; import { StyledEngineProvider } from '@mui/material/styles'; import ConnectedThemeProvider from '../components/AppThemeProvider'; diff --git a/openbas-front/src/public/components/challenges/Challenges.js b/openbas-front/src/public/components/challenges/Challenges.js index 2ef2599619..376327b4ce 100644 --- a/openbas-front/src/public/components/challenges/Challenges.js +++ b/openbas-front/src/public/components/challenges/Challenges.js @@ -1,4 +1,3 @@ -import React from 'react'; import { useQueryParameter } from '../../../utils/Environment'; import ChallengesPreview from './ChallengesPreview'; import ChallengesPlayer from './ChallengesPlayer'; diff --git a/openbas-front/src/public/components/challenges/ChallengesPlayer.js b/openbas-front/src/public/components/challenges/ChallengesPlayer.js index 1a16bc65fc..e306718df6 100644 --- a/openbas-front/src/public/components/challenges/ChallengesPlayer.js +++ b/openbas-front/src/public/components/challenges/ChallengesPlayer.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { Form } from 'react-final-form'; import { useDispatch } from 'react-redux'; import { makeStyles, useTheme } from '@mui/styles'; diff --git a/openbas-front/src/public/components/challenges/ChallengesPreview.js b/openbas-front/src/public/components/challenges/ChallengesPreview.js index 84ebbd6a20..69a91d6050 100644 --- a/openbas-front/src/public/components/challenges/ChallengesPreview.js +++ b/openbas-front/src/public/components/challenges/ChallengesPreview.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { Form } from 'react-final-form'; import { useDispatch } from 'react-redux'; import { makeStyles, useTheme } from '@mui/styles'; diff --git a/openbas-front/src/public/components/channels/Channel.js b/openbas-front/src/public/components/channels/Channel.js index fd2854b90d..4eea933fd0 100644 --- a/openbas-front/src/public/components/channels/Channel.js +++ b/openbas-front/src/public/components/channels/Channel.js @@ -1,4 +1,3 @@ -import React from 'react'; import { useQueryParameter } from '../../../utils/Environment'; import ChannelPreview from './ChannelPreview'; import ChannelPlayer from './ChannelPlayer'; diff --git a/openbas-front/src/public/components/channels/ChannelMicroblogging.js b/openbas-front/src/public/components/channels/ChannelMicroblogging.js index 88950e61cf..fa2e55e70d 100644 --- a/openbas-front/src/public/components/channels/ChannelMicroblogging.js +++ b/openbas-front/src/public/components/channels/ChannelMicroblogging.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import { Typography, Grid, Card, CardHeader, CardContent, Avatar, CardMedia, Button } from '@mui/material'; import { ChatBubbleOutlineOutlined, FavoriteBorderOutlined, ShareOutlined } from '@mui/icons-material'; diff --git a/openbas-front/src/public/components/channels/ChannelNewspaper.js b/openbas-front/src/public/components/channels/ChannelNewspaper.js index 12b0b89b1d..fa1848bcaf 100644 --- a/openbas-front/src/public/components/channels/ChannelNewspaper.js +++ b/openbas-front/src/public/components/channels/ChannelNewspaper.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { forwardRef, useState } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; import { Typography, Grid, Card, CardHeader, CardContent, Avatar, CardMedia, Button, Dialog, DialogTitle, DialogContent, Slide } from '@mui/material'; @@ -9,7 +9,7 @@ import { useHelper } from '../../../store'; import ExpandableMarkdown from '../../../components/ExpandableMarkdown'; import { useQueryParameter } from '../../../utils/Environment'; -const Transition = React.forwardRef((props, ref) => ( +const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; diff --git a/openbas-front/src/public/components/channels/ChannelPlayer.js b/openbas-front/src/public/components/channels/ChannelPlayer.js index c8db235c40..937d1528ff 100644 --- a/openbas-front/src/public/components/channels/ChannelPlayer.js +++ b/openbas-front/src/public/components/channels/ChannelPlayer.js @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import { useDispatch } from 'react-redux'; import { makeStyles } from '@mui/styles'; import { Link, useParams } from 'react-router-dom'; diff --git a/openbas-front/src/public/components/channels/ChannelPreview.js b/openbas-front/src/public/components/channels/ChannelPreview.js index cd5412e788..77ff094916 100644 --- a/openbas-front/src/public/components/channels/ChannelPreview.js +++ b/openbas-front/src/public/components/channels/ChannelPreview.js @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import { useDispatch } from 'react-redux'; import { makeStyles } from '@mui/styles'; import { Link, useParams } from 'react-router-dom'; diff --git a/openbas-front/src/public/components/channels/ChannelTvChannel.js b/openbas-front/src/public/components/channels/ChannelTvChannel.js index 37b521c106..e5d58da8a3 100644 --- a/openbas-front/src/public/components/channels/ChannelTvChannel.js +++ b/openbas-front/src/public/components/channels/ChannelTvChannel.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; import { Typography, Grid, Card, CardHeader, CardContent, Avatar, CardMedia, Button } from '@mui/material'; diff --git a/openbas-front/src/public/components/comcheck/Comcheck.js b/openbas-front/src/public/components/comcheck/Comcheck.js index b31fb40c6a..9ed3370260 100644 --- a/openbas-front/src/public/components/comcheck/Comcheck.js +++ b/openbas-front/src/public/components/comcheck/Comcheck.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; import { makeStyles, useTheme } from '@mui/styles'; import { AppBar, Toolbar, Paper } from '@mui/material'; diff --git a/openbas-front/src/public/components/lessons/ExerciseViewLessons.tsx b/openbas-front/src/public/components/lessons/ExerciseViewLessons.tsx index b07b70cb02..2b2fe1db38 100644 --- a/openbas-front/src/public/components/lessons/ExerciseViewLessons.tsx +++ b/openbas-front/src/public/components/lessons/ExerciseViewLessons.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import { useParams } from 'react-router-dom'; import { useQueryParameter } from '../../../utils/Environment'; import { usePermissions } from '../../../utils/Exercise'; diff --git a/openbas-front/src/public/components/lessons/LessonsPlayer.js b/openbas-front/src/public/components/lessons/LessonsPlayer.js index a13cbb6161..a9fd25763e 100644 --- a/openbas-front/src/public/components/lessons/LessonsPlayer.js +++ b/openbas-front/src/public/components/lessons/LessonsPlayer.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import { useContext, useState } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; import { Link } from 'react-router-dom'; diff --git a/openbas-front/src/public/components/lessons/LessonsPreview.js b/openbas-front/src/public/components/lessons/LessonsPreview.js index f8046abeb8..b48e110e6c 100644 --- a/openbas-front/src/public/components/lessons/LessonsPreview.js +++ b/openbas-front/src/public/components/lessons/LessonsPreview.js @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; import { Link } from 'react-router-dom'; diff --git a/openbas-front/src/public/components/lessons/ScenarioViewLessons.tsx b/openbas-front/src/public/components/lessons/ScenarioViewLessons.tsx index cb461e0dba..b64afebe2f 100644 --- a/openbas-front/src/public/components/lessons/ScenarioViewLessons.tsx +++ b/openbas-front/src/public/components/lessons/ScenarioViewLessons.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import { useParams } from 'react-router-dom'; import { useQueryParameter } from '../../../utils/Environment'; import LessonsPreview from './LessonsPreview'; diff --git a/openbas-front/src/public/components/login/Login.js b/openbas-front/src/public/components/login/Login.js index acb14155eb..49ac534302 100644 --- a/openbas-front/src/public/components/login/Login.js +++ b/openbas-front/src/public/components/login/Login.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { useTheme, withStyles } from '@mui/styles'; diff --git a/openbas-front/src/public/components/login/LoginError.tsx b/openbas-front/src/public/components/login/LoginError.tsx index faa8d0ed67..cb1aa7765c 100644 --- a/openbas-front/src/public/components/login/LoginError.tsx +++ b/openbas-front/src/public/components/login/LoginError.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { useLocation } from 'react-router-dom'; import Message from '../../../components/Message'; import { MESSAGING$ } from '../../../utils/Environment'; diff --git a/openbas-front/src/public/components/login/LoginForm.js b/openbas-front/src/public/components/login/LoginForm.js index 7ec53efa5f..f512b4ffc0 100644 --- a/openbas-front/src/public/components/login/LoginForm.js +++ b/openbas-front/src/public/components/login/LoginForm.js @@ -1,4 +1,3 @@ -import React from 'react'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; import { Button } from '@mui/material'; diff --git a/openbas-front/src/public/components/login/LoginSSOButton.tsx b/openbas-front/src/public/components/login/LoginSSOButton.tsx index 333e051634..3bfc1d5ea8 100644 --- a/openbas-front/src/public/components/login/LoginSSOButton.tsx +++ b/openbas-front/src/public/components/login/LoginSSOButton.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import { FunctionComponent } from 'react'; import { VpnKeyOutlined } from '@mui/icons-material'; import { Button } from '@mui/material'; import { useFormatter } from '../../../components/i18n'; diff --git a/openbas-front/src/public/components/login/Reset.js b/openbas-front/src/public/components/login/Reset.js index 5c87f91402..4a48c5a7a5 100644 --- a/openbas-front/src/public/components/login/Reset.js +++ b/openbas-front/src/public/components/login/Reset.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import { Paper, Button } from '@mui/material'; import { Form } from 'react-final-form'; diff --git a/openbas-front/src/public/components/systembanners/SystemBanners.tsx b/openbas-front/src/public/components/systembanners/SystemBanners.tsx index b459aeb065..fba6e857c6 100644 --- a/openbas-front/src/public/components/systembanners/SystemBanners.tsx +++ b/openbas-front/src/public/components/systembanners/SystemBanners.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { makeStyles } from '@mui/styles'; import { ReportProblem } from '@mui/icons-material'; import { isEmptyField, isNotEmptyField, recordEntries, recordKeys } from '../../../utils/utils'; diff --git a/openbas-front/src/root.tsx b/openbas-front/src/root.tsx index ce5ceefaf0..72a3ec165d 100644 --- a/openbas-front/src/root.tsx +++ b/openbas-front/src/root.tsx @@ -1,4 +1,4 @@ -import React, { lazy, Suspense, useEffect } from 'react'; +import { lazy, Suspense, useEffect } from 'react'; import * as R from 'ramda'; import { Navigate, Route, Routes } from 'react-router-dom'; import { StyledEngineProvider } from '@mui/material/styles'; diff --git a/openbas-front/src/utils/Environment.js b/openbas-front/src/utils/Environment.js index 003d5f65af..4607d8b777 100644 --- a/openbas-front/src/utils/Environment.js +++ b/openbas-front/src/utils/Environment.js @@ -1,7 +1,7 @@ import { Subject, timer } from 'rxjs'; import { debounce } from 'rxjs/operators'; import * as R from 'ramda'; -import React from 'react'; +import { useMemo } from 'react'; import { useLocation } from 'react-router-dom'; // Service bus @@ -24,7 +24,7 @@ export class ApplicationError extends Error { export const useQueryParameter = (parameters) => { const { search } = useLocation(); - const query = React.useMemo(() => new URLSearchParams(search), [search]); + const query = useMemo(() => new URLSearchParams(search), [search]); return parameters.map((p) => query.get(p)); }; diff --git a/openbas-front/src/utils/SortingFiltering.js b/openbas-front/src/utils/SortingFiltering.js index 12a9c1486f..067a1e97b5 100644 --- a/openbas-front/src/utils/SortingFiltering.js +++ b/openbas-front/src/utils/SortingFiltering.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import * as R from 'ramda'; import { ArrowDropDownOutlined, ArrowDropUpOutlined } from '@mui/icons-material'; import { useFormatter } from '../components/i18n'; diff --git a/openbas-front/src/utils/ai/ResponseDialog.tsx b/openbas-front/src/utils/ai/ResponseDialog.tsx index 2e0d30bd23..67d114b455 100644 --- a/openbas-front/src/utils/ai/ResponseDialog.tsx +++ b/openbas-front/src/utils/ai/ResponseDialog.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useRef, useEffect } from 'react'; +import { FunctionComponent, useRef, useEffect } from 'react'; import { CKEditor } from '@ckeditor/ckeditor5-react'; import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField } from '@mui/material'; import { LoadingButton } from '@mui/lab'; diff --git a/openbas-front/src/utils/hooks/useAuth.ts b/openbas-front/src/utils/hooks/useAuth.ts index ac5ff12490..dc1d682381 100644 --- a/openbas-front/src/utils/hooks/useAuth.ts +++ b/openbas-front/src/utils/hooks/useAuth.ts @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import { createContext, useContext } from 'react'; import type { PlatformSettings } from '../api-types'; export interface User { @@ -14,7 +14,7 @@ const defaultContext = { me: {}, settings: undefined, }; -export const UserContext = React.createContext(defaultContext); +export const UserContext = createContext(defaultContext); const useAuth = () => { const { me, settings } = useContext(UserContext); diff --git a/openbas-front/src/utils/hooks/useEntityIcon.tsx b/openbas-front/src/utils/hooks/useEntityIcon.tsx index ed6a097465..2bedfbf85e 100644 --- a/openbas-front/src/utils/hooks/useEntityIcon.tsx +++ b/openbas-front/src/utils/hooks/useEntityIcon.tsx @@ -1,5 +1,4 @@ import { ComputerOutlined, DomainOutlined, GroupsOutlined, Kayaking, LanOutlined, MovieFilterOutlined, PersonOutlined } from '@mui/icons-material'; -import React from 'react'; const useEntityIcon = (entity: string) => { switch (entity) { diff --git a/openbas-front/src/utils/hooks/useEntityToggle.ts b/openbas-front/src/utils/hooks/useEntityToggle.ts index af107a5a3e..c2cd158587 100644 --- a/openbas-front/src/utils/hooks/useEntityToggle.ts +++ b/openbas-front/src/utils/hooks/useEntityToggle.ts @@ -1,4 +1,5 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import * as React from 'react'; import * as R from 'ramda'; export interface UseEntityToggle { From fbe0e3ef186c8748ea5b7713a3105d96428ae747 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Sun, 27 Oct 2024 22:30:13 +0100 Subject: [PATCH 04/14] [frontend] manual fixes --- openbas-front/builder/dev/dev.js | 5 ++ openbas-front/src/admin/Index.tsx | 3 +- .../filters/InjectorContractSwitchFilter.tsx | 11 +--- .../components/common/filters/constants.ts | 9 +++ .../injects/ExerciseInjectsDistribution.tsx | 3 +- .../injects/InjectDistributionByTeam.tsx | 2 +- .../common/injects/InjectsDistribution.tsx | 16 +----- .../injects/ScenarioInjectsDistribution.tsx | 3 +- .../components/common/injects/teams/utils.ts | 20 +++++++ .../src/admin/components/nav/LeftBar.tsx | 2 +- .../src/admin/components/nav/TopBar.tsx | 2 +- .../components/scenarios/ScenarioForm.tsx | 12 +--- .../components/scenarios/ScenariosCard.tsx | 2 +- .../admin/components/scenarios/constants.ts | 11 ++++ .../scenario/articles/ScenarioArticles.tsx | 19 +------ .../articles/articleContextForScenario.ts | 21 +++++++ .../scenario/injects/ScenarioInjects.tsx | 10 +--- .../scenario/teams/ScenarioTeams.tsx | 53 +----------------- .../scenario/teams/teamContextForScenario.ts | 54 ++++++++++++++++++ .../simulation/ExerciseCreationForm.tsx | 2 +- .../simulation/ExerciseUpdateForm.tsx | 2 +- .../simulation/articles/ExerciseArticles.tsx | 21 +------ .../articles/articleContextForExercise.ts | 21 +++++++ .../simulation/injects/ExerciseInjects.tsx | 10 +--- .../mails/MailDistributionOverTimeLine.tsx | 2 +- .../reports/convertMarkdownToPdfMake.ts | 2 +- .../reports/getExerciseReportPdfDoc.ts | 2 +- .../simulation/teams/ExerciseTeams.tsx | 53 +----------------- .../teams/teamContextForExercise.ts | 55 +++++++++++++++++++ .../TechnicalExpectationAsset.tsx | 2 +- .../src/components/ExportPdfButton.tsx | 2 +- .../src/components/MarkdownDisplay.tsx | 2 +- .../src/components/common/Drawer.tsx | 2 +- .../systembanners/SystemBanners.tsx | 21 +------ .../public/components/systembanners/utils.ts | 22 ++++++++ 35 files changed, 256 insertions(+), 223 deletions(-) create mode 100644 openbas-front/src/admin/components/common/filters/constants.ts create mode 100644 openbas-front/src/admin/components/common/injects/teams/utils.ts create mode 100644 openbas-front/src/admin/components/scenarios/constants.ts create mode 100644 openbas-front/src/admin/components/scenarios/scenario/articles/articleContextForScenario.ts create mode 100644 openbas-front/src/admin/components/scenarios/scenario/teams/teamContextForScenario.ts create mode 100644 openbas-front/src/admin/components/simulations/simulation/articles/articleContextForExercise.ts create mode 100644 openbas-front/src/admin/components/simulations/simulation/teams/teamContextForExercise.ts create mode 100644 openbas-front/src/public/components/systembanners/utils.ts diff --git a/openbas-front/builder/dev/dev.js b/openbas-front/builder/dev/dev.js index 0b11c7d2eb..545c0bdc63 100644 --- a/openbas-front/builder/dev/dev.js +++ b/openbas-front/builder/dev/dev.js @@ -8,7 +8,9 @@ import esbuild from "esbuild"; import chokidar from "chokidar"; // mimic CommonJS variables -- not needed if using CommonJS +// eslint-disable-next-line no-underscore-dangle const __filename = fileURLToPath(import.meta.url); +// eslint-disable-next-line no-underscore-dangle const __dirname = path.dirname(__filename); const basePath = ""; @@ -75,11 +77,13 @@ esbuild "all", debounce(() => { const start = new Date().getTime(); + // eslint-disable-next-line no-console console.log(`[HOT RELOAD] Update of front detected`); return builder .rebuild() .then(() => { const time = new Date().getTime() - start; + // eslint-disable-next-line no-console console.log( `[HOT RELOAD] Rebuild done in ${time} ms, updating frontend`, ); @@ -87,6 +91,7 @@ esbuild clients.length = 0; }) .catch((error) => { + // eslint-disable-next-line no-console console.error(error); }); }), diff --git a/openbas-front/src/admin/Index.tsx b/openbas-front/src/admin/Index.tsx index ad2e1807fe..606ab73493 100644 --- a/openbas-front/src/admin/Index.tsx +++ b/openbas-front/src/admin/Index.tsx @@ -12,9 +12,10 @@ import type { LoggedHelper } from '../actions/helper'; import Loader from '../components/Loader'; import NotFound from '../components/NotFound'; import InjectIndex from './components/simulations/simulation/injects/InjectIndex'; -import SystemBanners, { computeBannerSettings } from '../public/components/systembanners/SystemBanners'; +import SystemBanners from '../public/components/systembanners/SystemBanners'; import { fetchTags } from '../actions/Tag'; import { useAppDispatch } from '../utils/hooks'; +import { computeBannerSettings } from '../public/components/systembanners/utils'; const Dashboard = lazy(() => import('./components/Dashboard')); const IndexProfile = lazy(() => import('./components/profile/Index')); diff --git a/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx b/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx index e18f33a13a..9aa2ad240e 100644 --- a/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx +++ b/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx @@ -5,16 +5,7 @@ import { useFormatter } from '../../../../components/i18n'; import { FilterHelpers } from '../../../../components/common/queryable/filter/FilterHelpers'; import type { FilterGroup } from '../../../../utils/api-types'; import { buildEmptyFilter } from '../../../../components/common/queryable/filter/FilterUtils'; - -export const INJECTOR_CONTRACT_INJECTOR_FILTER_KEY = 'injector_contract_injector'; - -export const INJECTOR_CONTRACT_PLAYERS_ONLY = [ - '49229430-b5b5-431f-ba5b-f36f599b0233', // Challenge - '8d932e36-353c-48fa-ba6f-86cb7b02ed19', // Channel - '41b4dd55-5bd1-4614-98cd-9e3770753306', // Email - '6981a39d-e219-4016-a235-cf7747994abc', // Manual - 'e5aefbca-cf8f-4a57-9384-0503a8ffc22f', // SMS -]; +import { INJECTOR_CONTRACT_INJECTOR_FILTER_KEY, INJECTOR_CONTRACT_PLAYERS_ONLY } from './constants'; interface Props { filterHelpers: FilterHelpers; diff --git a/openbas-front/src/admin/components/common/filters/constants.ts b/openbas-front/src/admin/components/common/filters/constants.ts new file mode 100644 index 0000000000..f8fefca83e --- /dev/null +++ b/openbas-front/src/admin/components/common/filters/constants.ts @@ -0,0 +1,9 @@ +export const INJECTOR_CONTRACT_PLAYERS_ONLY = [ + '49229430-b5b5-431f-ba5b-f36f599b0233', // Challenge + '8d932e36-353c-48fa-ba6f-86cb7b02ed19', // Channel + '41b4dd55-5bd1-4614-98cd-9e3770753306', // Email + '6981a39d-e219-4016-a235-cf7747994abc', // Manual + 'e5aefbca-cf8f-4a57-9384-0503a8ffc22f', // SMS +]; + +export const INJECTOR_CONTRACT_INJECTOR_FILTER_KEY = 'injector_contract_injector'; \ No newline at end of file diff --git a/openbas-front/src/admin/components/common/injects/ExerciseInjectsDistribution.tsx b/openbas-front/src/admin/components/common/injects/ExerciseInjectsDistribution.tsx index d0217c6c8e..45a476ea5d 100644 --- a/openbas-front/src/admin/components/common/injects/ExerciseInjectsDistribution.tsx +++ b/openbas-front/src/admin/components/common/injects/ExerciseInjectsDistribution.tsx @@ -2,7 +2,8 @@ import { FunctionComponent } from 'react'; import * as R from 'ramda'; import { useFormatter } from '../../../../components/i18n'; import type { TeamStore } from '../../../../actions/teams/Team'; -import InjectsDistribution, { getTeamsColors } from './InjectsDistribution'; +import InjectsDistribution from './InjectsDistribution'; +import { getTeamsColors } from './teams/utils'; interface Props { teams: TeamStore[]; diff --git a/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx b/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx index 3447e403a6..82f8698180 100644 --- a/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx @@ -10,10 +10,10 @@ import { useHelper } from '../../../../store'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { horizontalBarsChartOptions } from '../../../../utils/Charts'; import type { Theme } from '../../../../components/Theme'; -import { getTeamsColors } from './InjectsDistribution'; import type { TeamsHelper } from '../../../../actions/teams/team-helper'; import { fetchExerciseTeams } from '../../../../actions/Exercise'; import type { TeamStore } from '../../../../actions/teams/Team'; +import { getTeamsColors } from './teams/utils'; interface Props { exerciseId: ExerciseStore['exercise_id']; diff --git a/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx b/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx index 368c83dc06..05f1b9a4af 100644 --- a/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx @@ -1,8 +1,7 @@ import Chart from 'react-apexcharts'; import { FunctionComponent } from 'react'; -import * as R from 'ramda'; import { useTheme } from '@mui/styles'; -import { colors, horizontalBarsChartOptions } from '../../../../utils/Charts'; +import { horizontalBarsChartOptions } from '../../../../utils/Charts'; import Empty from '../../../../components/Empty'; import { useFormatter } from '../../../../components/i18n'; import type { Theme } from '../../../../components/Theme'; @@ -14,19 +13,6 @@ interface Props { maxInjectsNumber: number; } -export const getTeamsColors: (teams: TeamStore[]) => Record = (teams: TeamStore[]) => { - const theme = useTheme(); - - const mapIndexed = R.addIndex(R.map); - return R.pipe( - mapIndexed((a: TeamStore, index: number) => [ - a.team_id, - colors(theme.palette.mode === 'dark' ? 400 : 600)[index], - ]), - R.fromPairs, - )(teams); -}; - const InjectsDistribution: FunctionComponent = ({ topTeams, distributionChartData, diff --git a/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx b/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx index 95802ba0dd..e1c1d496cd 100644 --- a/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx +++ b/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx @@ -2,7 +2,8 @@ import { FunctionComponent } from 'react'; import * as R from 'ramda'; import { useFormatter } from '../../../../components/i18n'; import type { TeamStore } from '../../../../actions/teams/Team'; -import InjectsDistribution, { getTeamsColors } from './InjectsDistribution'; +import InjectsDistribution from './InjectsDistribution'; +import { getTeamsColors } from './teams/utils'; interface Props { teams: TeamStore[]; diff --git a/openbas-front/src/admin/components/common/injects/teams/utils.ts b/openbas-front/src/admin/components/common/injects/teams/utils.ts new file mode 100644 index 0000000000..8a615513e9 --- /dev/null +++ b/openbas-front/src/admin/components/common/injects/teams/utils.ts @@ -0,0 +1,20 @@ +import { useTheme } from '@mui/styles'; +import R from 'ramda'; + +import type { TeamStore } from '../../../../../actions/teams/Team'; +import type { Theme } from '../../../../../components/Theme'; +import { colors } from '../../../../../utils/Charts'; + +// eslint-disable-next-line import/prefer-default-export +export const getTeamsColors: (teams: TeamStore[]) => Record = (teams: TeamStore[]) => { + const theme = useTheme(); + + const mapIndexed = R.addIndex(R.map); + return R.pipe( + mapIndexed((a: TeamStore, index: number) => [ + a.team_id, + colors(theme.palette.mode === 'dark' ? 400 : 600)[index], + ]), + R.fromPairs, + )(teams); +}; diff --git a/openbas-front/src/admin/components/nav/LeftBar.tsx b/openbas-front/src/admin/components/nav/LeftBar.tsx index 86e65dad08..87b0133430 100644 --- a/openbas-front/src/admin/components/nav/LeftBar.tsx +++ b/openbas-front/src/admin/components/nav/LeftBar.tsx @@ -41,7 +41,7 @@ import logoFiligranTextDark from '../../../static/images/logo_filigran_text_dark import logoFiligranTextLight from '../../../static/images/logo_filigran_text_light.png'; import useDimensions from '../../../utils/hooks/useDimensions'; import useAuth from '../../../utils/hooks/useAuth'; -import { computeBannerSettings } from '../../../public/components/systembanners/SystemBanners'; +import { computeBannerSettings } from '../../../public/components/systembanners/utils'; type entry = { type?: string, diff --git a/openbas-front/src/admin/components/nav/TopBar.tsx b/openbas-front/src/admin/components/nav/TopBar.tsx index 09c7f7e229..41e650d624 100644 --- a/openbas-front/src/admin/components/nav/TopBar.tsx +++ b/openbas-front/src/admin/components/nav/TopBar.tsx @@ -19,7 +19,7 @@ import oermLight from '../../../static/images/xtm/oerm_light.png'; import omtdDark from '../../../static/images/xtm/omtd_dark.png'; import omtdLight from '../../../static/images/xtm/omtd_light.png'; import useAuth from '../../../utils/hooks/useAuth'; -import { computeBannerSettings } from '../../../public/components/systembanners/SystemBanners'; +import { computeBannerSettings } from '../../../public/components/systembanners/utils'; const useStyles = makeStyles((theme) => ({ appBar: { diff --git a/openbas-front/src/admin/components/scenarios/ScenarioForm.tsx b/openbas-front/src/admin/components/scenarios/ScenarioForm.tsx index 3e73c055ce..608b21595c 100644 --- a/openbas-front/src/admin/components/scenarios/ScenarioForm.tsx +++ b/openbas-front/src/admin/components/scenarios/ScenarioForm.tsx @@ -9,6 +9,7 @@ import { useFormatter } from '../../../components/i18n'; import TagField from '../../../components/fields/TagField'; import TextField from '../../../components/fields/TextField'; import SelectField from '../../../components/fields/SelectField'; +import { scenarioCategories } from './constants'; interface Props { onSubmit: SubmitHandler; @@ -17,17 +18,6 @@ interface Props { initialValues?: ScenarioInput; } -export const scenarioCategories = new Map([ - ['global-crisis', 'Global Crisis'], - ['attack-scenario', 'Attack Scenario'], - ['media-pressure', 'Media Pressure'], - ['data-exfiltration', 'Data Exfiltration'], - ['capture-the-flag', 'Capture The Flag'], - ['vulnerability-exploitation', 'Vulnerability Exploitation'], - ['lateral-movement', 'Lateral Movement'], - ['url-filtering', 'URL Filtering'], -]); - const ScenarioForm: FunctionComponent = ({ onSubmit, handleClose, diff --git a/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx b/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx index 7fb296cc09..cb637743ad 100644 --- a/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx +++ b/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx @@ -3,7 +3,7 @@ import { Card, CardActionArea, CardContent } from '@mui/material'; import { FunctionComponent, useEffect, useState } from 'react'; import { makeStyles } from '@mui/styles'; import ItemCategory from '../../../components/ItemCategory'; -import { scenarioCategories } from './ScenarioForm'; +import { scenarioCategories } from './constants'; import type { Theme } from '../../../components/Theme'; import { useFormatter } from '../../../components/i18n'; import type { ScenarioStatistic, SearchPaginationInput } from '../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/scenarios/constants.ts b/openbas-front/src/admin/components/scenarios/constants.ts new file mode 100644 index 0000000000..9db3940434 --- /dev/null +++ b/openbas-front/src/admin/components/scenarios/constants.ts @@ -0,0 +1,11 @@ +// eslint-disable-next-line import/prefer-default-export +export const scenarioCategories = new Map([ + ['global-crisis', 'Global Crisis'], + ['attack-scenario', 'Attack Scenario'], + ['media-pressure', 'Media Pressure'], + ['data-exfiltration', 'Data Exfiltration'], + ['capture-the-flag', 'Capture The Flag'], + ['vulnerability-exploitation', 'Vulnerability Exploitation'], + ['lateral-movement', 'Lateral Movement'], + ['url-filtering', 'URL Filtering'], +]); diff --git a/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx b/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx index dd2424a2a7..cb666a8a7a 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx @@ -1,28 +1,13 @@ import { useParams } from 'react-router-dom'; import { useHelper } from '../../../../../store'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { addScenarioArticle, deleteScenarioArticle, fetchScenarioArticles, updateScenarioArticle } from '../../../../../actions/channels/article-action'; +import { fetchScenarioArticles } from '../../../../../actions/channels/article-action'; import Articles from '../../../common/articles/Articles'; import { useAppDispatch } from '../../../../../utils/hooks'; import type { ArticlesHelper } from '../../../../../actions/channels/article-helper'; import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; -import type { ArticleStore, FullArticleStore } from '../../../../../actions/channels/Article'; -import type { ArticleCreateInput, ArticleUpdateInput } from '../../../../../utils/api-types'; import { ArticleContext } from '../../../common/Context'; - -export const articleContextForScenario = (scenarioId: ScenarioStore['scenario_id']) => { - const dispatch = useAppDispatch(); - return { - previewArticleUrl: (article: FullArticleStore) => `/channels/${scenarioId}/${article.article_fullchannel?.channel_id}?preview=true`, - onAddArticle: (data: ArticleCreateInput) => dispatch(addScenarioArticle(scenarioId, data)), - onUpdateArticle: (article: ArticleStore, data: ArticleUpdateInput) => dispatch( - updateScenarioArticle(scenarioId, article.article_id, data), - ), - onDeleteArticle: (article: ArticleStore) => dispatch( - deleteScenarioArticle(scenarioId, article.article_id), - ), - }; -}; +import articleContextForScenario from './articleContextForScenario'; const ScenarioArticles = () => { // Standard hooks diff --git a/openbas-front/src/admin/components/scenarios/scenario/articles/articleContextForScenario.ts b/openbas-front/src/admin/components/scenarios/scenario/articles/articleContextForScenario.ts new file mode 100644 index 0000000000..e4b7ce548a --- /dev/null +++ b/openbas-front/src/admin/components/scenarios/scenario/articles/articleContextForScenario.ts @@ -0,0 +1,21 @@ +import type { ArticleStore, FullArticleStore } from '../../../../../actions/channels/Article'; +import { addScenarioArticle, deleteScenarioArticle, updateScenarioArticle } from '../../../../../actions/channels/article-action'; +import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; +import type { ArticleCreateInput, ArticleUpdateInput } from '../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../utils/hooks'; + +const articleContextForScenario = (scenarioId: ScenarioStore['scenario_id']) => { + const dispatch = useAppDispatch(); + return { + previewArticleUrl: (article: FullArticleStore) => `/channels/${scenarioId}/${article.article_fullchannel?.channel_id}?preview=true`, + onAddArticle: (data: ArticleCreateInput) => dispatch(addScenarioArticle(scenarioId, data)), + onUpdateArticle: (article: ArticleStore, data: ArticleUpdateInput) => dispatch( + updateScenarioArticle(scenarioId, article.article_id, data), + ), + onDeleteArticle: (article: ArticleStore) => dispatch( + deleteScenarioArticle(scenarioId, article.article_id), + ), + }; +}; + +export default articleContextForScenario; diff --git a/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx b/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx index b4db16c726..8598643664 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx @@ -12,16 +12,12 @@ import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { fetchVariablesForScenario } from '../../../../../actions/variables/variable-actions'; import { fetchScenarioTeams } from '../../../../../actions/scenarios/scenario-actions'; import type { Scenario } from '../../../../../utils/api-types'; -import { articleContextForScenario } from '../articles/ScenarioArticles'; -import { teamContextForScenario } from '../teams/ScenarioTeams'; +import articleContextForScenario from '../articles/articleContextForScenario'; +import teamContextForScenario from '../teams/teamContextForScenario'; import { fetchScenarioInjectsSimple } from '../../../../../actions/injects/inject-action'; import Injects from '../../../common/injects/Injects'; -interface Props { - -} - -const ScenarioInjects: FunctionComponent = () => { +const ScenarioInjects: FunctionComponent = () => { // Standard hooks const dispatch = useAppDispatch(); const { scenarioId } = useParams() as { scenarioId: Scenario['scenario_id'] }; diff --git a/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx b/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx index 6eecb10bc3..13ae8f3a86 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx @@ -6,72 +6,21 @@ import { useHelper } from '../../../../../store'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { useAppDispatch } from '../../../../../utils/hooks'; import { - addScenarioTeamPlayers, - disableScenarioTeamPlayers, - enableScenarioTeamPlayers, fetchScenarioTeams, - removeScenarioTeamPlayers, } from '../../../../../actions/scenarios/scenario-actions'; import type { ScenariosHelper } from '../../../../../actions/scenarios/scenario-helper'; import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; import type { TeamStore } from '../../../../../actions/teams/Team'; import { PermissionsContext, TeamContext } from '../../../common/Context'; -import type { SearchPaginationInput, Team, TeamCreateInput, TeamOutput } from '../../../../../utils/api-types'; -import { addTeam, fetchTeams } from '../../../../../actions/teams/team-actions'; -import type { UserStore } from '../../../teams/players/Player'; import UpdateTeams from '../../../components/teams/UpdateTeams'; import { useFormatter } from '../../../../../components/i18n'; import ContextualTeams from '../../../components/teams/ContextualTeams'; -import { addScenarioTeams, removeScenarioTeams, replaceScenarioTeams, searchScenarioTeams } from '../../../../../actions/scenarios/scenario-teams-action'; -import type { Page } from '../../../../../components/common/queryable/Page'; +import teamContextForScenario from './teamContextForScenario'; interface Props { scenarioTeamsUsers: ScenarioStore['scenario_teams_users'], } -export const teamContextForScenario = (scenarioId: ScenarioStore['scenario_id'], scenarioTeamsUsers: ScenarioStore['scenario_teams_users']) => { - const dispatch = useAppDispatch(); - - return { - async onAddUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { - await dispatch(addScenarioTeamPlayers(scenarioId, teamId, { scenario_team_players: userIds })); - return dispatch(fetchTeams()); - }, - async onRemoveUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { - await dispatch(removeScenarioTeamPlayers(scenarioId, teamId, { scenario_team_players: userIds })); - return dispatch(fetchTeams()); - }, - onAddTeam(teamId: Team['team_id']): Promise { - return dispatch(addScenarioTeams(scenarioId, { scenario_teams: [teamId] })); - }, - onCreateTeam(team: TeamCreateInput): Promise<{ result: string }> { - return dispatch(addTeam({ ...team, team_scenarios: [scenarioId] })); - }, - checkUserEnabled(teamId: Team['team_id'], userId: UserStore['user_id']): boolean { - return scenarioTeamsUsers.filter((o: ScenarioStore['scenario_teams_users']) => o.scenario_id === scenarioId && o.team_id === teamId && userId === o.user_id).length > 0; - }, - computeTeamUsersEnabled(teamId: Team['team_id']) { - return scenarioTeamsUsers.filter((o: ScenarioStore['scenario_teams_users']) => o.team_id === teamId).length; - }, - onRemoveTeam(teamId: Team['team_id']): void { - dispatch(removeScenarioTeams(scenarioId, { scenario_teams: [teamId] })); - }, - onReplaceTeam(teamIds: Team['team_id'][]): Promise<{ result: string[], entities: { teams: Record } }> { - return dispatch(replaceScenarioTeams(scenarioId, { scenario_teams: teamIds })); - }, - onToggleUser(teamId: Team['team_id'], userId: UserStore['user_id'], userEnabled: boolean): void { - if (userEnabled) { - dispatch(disableScenarioTeamPlayers(scenarioId, teamId, { scenario_team_players: [userId] })); - } else { - dispatch(enableScenarioTeamPlayers(scenarioId, teamId, { scenario_team_players: [userId] })); - } - }, - searchTeams(input: SearchPaginationInput, contextualOnly?: boolean): Promise<{ data: Page }> { - return searchScenarioTeams(scenarioId, input, contextualOnly); - }, - }; -}; - const ScenarioTeams: React.FC = ({ scenarioTeamsUsers }) => { // Standard hooks const { t } = useFormatter(); diff --git a/openbas-front/src/admin/components/scenarios/scenario/teams/teamContextForScenario.ts b/openbas-front/src/admin/components/scenarios/scenario/teams/teamContextForScenario.ts new file mode 100644 index 0000000000..003aace1e9 --- /dev/null +++ b/openbas-front/src/admin/components/scenarios/scenario/teams/teamContextForScenario.ts @@ -0,0 +1,54 @@ +import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; +import { addScenarioTeamPlayers, disableScenarioTeamPlayers, enableScenarioTeamPlayers, removeScenarioTeamPlayers } from '../../../../../actions/scenarios/scenario-actions'; +import { addScenarioTeams, removeScenarioTeams, replaceScenarioTeams, searchScenarioTeams } from '../../../../../actions/scenarios/scenario-teams-action'; +import type { TeamStore } from '../../../../../actions/teams/Team'; +import { addTeam, fetchTeams } from '../../../../../actions/teams/team-actions'; +import type { Page } from '../../../../../components/common/queryable/Page'; +import type { SearchPaginationInput, Team, TeamCreateInput, TeamOutput } from '../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import type { UserStore } from '../../../teams/players/Player'; + +const teamContextForScenario = (scenarioId: ScenarioStore['scenario_id'], scenarioTeamsUsers: ScenarioStore['scenario_teams_users']) => { + const dispatch = useAppDispatch(); + + return { + async onAddUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { + await dispatch(addScenarioTeamPlayers(scenarioId, teamId, { scenario_team_players: userIds })); + return dispatch(fetchTeams()); + }, + async onRemoveUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { + await dispatch(removeScenarioTeamPlayers(scenarioId, teamId, { scenario_team_players: userIds })); + return dispatch(fetchTeams()); + }, + onAddTeam(teamId: Team['team_id']): Promise { + return dispatch(addScenarioTeams(scenarioId, { scenario_teams: [teamId] })); + }, + onCreateTeam(team: TeamCreateInput): Promise<{ result: string }> { + return dispatch(addTeam({ ...team, team_scenarios: [scenarioId] })); + }, + checkUserEnabled(teamId: Team['team_id'], userId: UserStore['user_id']): boolean { + return scenarioTeamsUsers.filter((o: ScenarioStore['scenario_teams_users']) => o.scenario_id === scenarioId && o.team_id === teamId && userId === o.user_id).length > 0; + }, + computeTeamUsersEnabled(teamId: Team['team_id']) { + return scenarioTeamsUsers.filter((o: ScenarioStore['scenario_teams_users']) => o.team_id === teamId).length; + }, + onRemoveTeam(teamId: Team['team_id']): void { + dispatch(removeScenarioTeams(scenarioId, { scenario_teams: [teamId] })); + }, + onReplaceTeam(teamIds: Team['team_id'][]): Promise<{ result: string[]; entities: { teams: Record } }> { + return dispatch(replaceScenarioTeams(scenarioId, { scenario_teams: teamIds })); + }, + onToggleUser(teamId: Team['team_id'], userId: UserStore['user_id'], userEnabled: boolean): void { + if (userEnabled) { + dispatch(disableScenarioTeamPlayers(scenarioId, teamId, { scenario_team_players: [userId] })); + } else { + dispatch(enableScenarioTeamPlayers(scenarioId, teamId, { scenario_team_players: [userId] })); + } + }, + searchTeams(input: SearchPaginationInput, contextualOnly?: boolean): Promise<{ data: Page }> { + return searchScenarioTeams(scenarioId, input, contextualOnly); + }, + }; +}; + +export default teamContextForScenario; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx index b45dbba684..eefe4d38d8 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx @@ -10,7 +10,7 @@ import type { ExerciseCreateInput } from '../../../../utils/api-types'; import { zodImplement } from '../../../../utils/Zod'; import TextField from '../../../../components/fields/TextField'; import SelectField from '../../../../components/fields/SelectField'; -import { scenarioCategories } from '../../scenarios/ScenarioForm'; +import { scenarioCategories } from '../../scenarios/constants'; interface Props { onSubmit: SubmitHandler; diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx index ba28f87c67..47bb8f2bbe 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx @@ -8,7 +8,7 @@ import type { ExerciseUpdateInput } from '../../../../utils/api-types'; import { zodImplement } from '../../../../utils/Zod'; import TextField from '../../../../components/fields/TextField'; import SelectField from '../../../../components/fields/SelectField'; -import { scenarioCategories } from '../../scenarios/ScenarioForm'; +import { scenarioCategories } from '../../scenarios/constants'; import TagField from '../../../../components/fields/TagField'; interface Props { diff --git a/openbas-front/src/admin/components/simulations/simulation/articles/ExerciseArticles.tsx b/openbas-front/src/admin/components/simulations/simulation/articles/ExerciseArticles.tsx index d5ed280fbd..d474892d18 100644 --- a/openbas-front/src/admin/components/simulations/simulation/articles/ExerciseArticles.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/articles/ExerciseArticles.tsx @@ -1,28 +1,13 @@ import { useParams } from 'react-router-dom'; import { useHelper } from '../../../../../store'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { addExerciseArticle, deleteExerciseArticle, fetchExerciseArticles, updateExerciseArticle } from '../../../../../actions/channels/article-action'; +import { fetchExerciseArticles } from '../../../../../actions/channels/article-action'; import Articles from '../../../common/articles/Articles'; import { useAppDispatch } from '../../../../../utils/hooks'; import type { ArticlesHelper } from '../../../../../actions/channels/article-helper'; -import type { ArticleCreateInput, ArticleUpdateInput, Exercise } from '../../../../../utils/api-types'; +import type { Exercise } from '../../../../../utils/api-types'; import { ArticleContext } from '../../../common/Context'; -import type { ArticleStore, FullArticleStore } from '../../../../../actions/channels/Article'; -import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; - -export const articleContextForExercise = (exerciseId: ExerciseStore['exercise_id']) => { - const dispatch = useAppDispatch(); - return { - previewArticleUrl: (article: FullArticleStore) => `/channels/${exerciseId}/${article.article_fullchannel?.channel_id}?preview=true`, - onAddArticle: (data: ArticleCreateInput) => dispatch(addExerciseArticle(exerciseId, data)), - onUpdateArticle: (article: ArticleStore, data: ArticleUpdateInput) => dispatch( - updateExerciseArticle(exerciseId, article.article_id, data), - ), - onDeleteArticle: (article: ArticleStore) => dispatch( - deleteExerciseArticle(exerciseId, article.article_id), - ), - }; -}; +import articleContextForExercise from './articleContextForExercise'; const ExerciseArticles = () => { // Standard hooks diff --git a/openbas-front/src/admin/components/simulations/simulation/articles/articleContextForExercise.ts b/openbas-front/src/admin/components/simulations/simulation/articles/articleContextForExercise.ts new file mode 100644 index 0000000000..bcbc0e6d36 --- /dev/null +++ b/openbas-front/src/admin/components/simulations/simulation/articles/articleContextForExercise.ts @@ -0,0 +1,21 @@ +import type { ArticleStore, FullArticleStore } from '../../../../../actions/channels/Article'; +import { addExerciseArticle, deleteExerciseArticle, updateExerciseArticle } from '../../../../../actions/channels/article-action'; +import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import type { ArticleCreateInput, ArticleUpdateInput } from '../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../utils/hooks'; + +const articleContextForExercise = (exerciseId: ExerciseStore['exercise_id']) => { + const dispatch = useAppDispatch(); + return { + previewArticleUrl: (article: FullArticleStore) => `/channels/${exerciseId}/${article.article_fullchannel?.channel_id}?preview=true`, + onAddArticle: (data: ArticleCreateInput) => dispatch(addExerciseArticle(exerciseId, data)), + onUpdateArticle: (article: ArticleStore, data: ArticleUpdateInput) => dispatch( + updateExerciseArticle(exerciseId, article.article_id, data), + ), + onDeleteArticle: (article: ArticleStore) => dispatch( + deleteExerciseArticle(exerciseId, article.article_id), + ), + }; +}; + +export default articleContextForExercise; diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx b/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx index 7ad848af71..680740de67 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx @@ -16,8 +16,8 @@ import type { VariablesHelper } from '../../../../../actions/variables/variable- import { fetchVariablesForExercise } from '../../../../../actions/variables/variable-actions'; import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; import { fetchExerciseArticles } from '../../../../../actions/channels/article-action'; -import { articleContextForExercise } from '../articles/ExerciseArticles'; -import { teamContextForExercise } from '../teams/ExerciseTeams'; +import articleContextForExercise from '../articles/articleContextForExercise'; +import teamContextForExercise from '../teams/teamContextForExercise'; import InjectDistributionByType from '../../../common/injects/InjectDistributionByType'; import InjectDistributionByTeam from '../../../common/injects/InjectDistributionByTeam'; import ExerciseDistributionScoreByTeamInPercentage from '../overview/ExerciseDistributionScoreByTeamInPercentage'; @@ -37,11 +37,7 @@ const useStyles = makeStyles(() => ({ }, })); -interface Props { - -} - -const ExerciseInjects: FunctionComponent = () => { +const ExerciseInjects: FunctionComponent = () => { // Standard hooks const { t } = useFormatter(); const classes = useStyles(); diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx index 08ae12f03c..b9009f5c42 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx @@ -11,7 +11,7 @@ import { useHelper } from '../../../../../store'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import type { Communication } from '../../../../../utils/api-types'; import { lineChartOptions } from '../../../../../utils/Charts'; -import { getTeamsColors } from '../../../common/injects/InjectsDistribution'; +import { getTeamsColors } from '../../../common/injects/teams/utils'; import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; import { fetchExerciseTeams } from '../../../../../actions/Exercise'; import type { TeamStore } from '../../../../../actions/teams/Team'; diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/convertMarkdownToPdfMake.ts b/openbas-front/src/admin/components/simulations/simulation/reports/convertMarkdownToPdfMake.ts index 3ccc6daad2..ee2833d1f3 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/convertMarkdownToPdfMake.ts +++ b/openbas-front/src/admin/components/simulations/simulation/reports/convertMarkdownToPdfMake.ts @@ -1,4 +1,4 @@ -import { Content } from 'pdfmake/interfaces'; +import type { Content } from 'pdfmake/interfaces'; const parseMarkdownLine = (line: string): Content[] => { const tokens: Content[] = []; diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/getExerciseReportPdfDoc.ts b/openbas-front/src/admin/components/simulations/simulation/reports/getExerciseReportPdfDoc.ts index 5d8025287c..775bf13db5 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/getExerciseReportPdfDoc.ts +++ b/openbas-front/src/admin/components/simulations/simulation/reports/getExerciseReportPdfDoc.ts @@ -1,5 +1,5 @@ import { toPng } from 'html-to-image'; -import { Content, ContentTable, TDocumentDefinitions } from 'pdfmake/interfaces'; +import type { Content, ContentTable, TDocumentDefinitions } from 'pdfmake/interfaces'; import type { InjectResultDTO, LessonsAnswer, Report } from '../../../../../utils/api-types'; import convertMarkdownToPdfMake from './convertMarkdownToPdfMake'; import { ExerciseReportData } from './useExerciseReportData'; diff --git a/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx b/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx index f7a6b83258..d0baa05c0b 100644 --- a/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx @@ -5,67 +5,20 @@ import { Paper, Typography } from '@mui/material'; import { useHelper } from '../../../../../store'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { useAppDispatch } from '../../../../../utils/hooks'; -import { PermissionsContext, TeamContext, TeamContextType } from '../../../common/Context'; -import type { UserStore } from '../../../teams/players/Player'; +import { PermissionsContext, TeamContext } from '../../../common/Context'; import UpdateTeams from '../../../components/teams/UpdateTeams'; -import type { SearchPaginationInput, Team, TeamCreateInput, TeamOutput } from '../../../../../utils/api-types'; import type { TeamStore } from '../../../../../actions/teams/Team'; -import { addExerciseTeamPlayers, disableExerciseTeamPlayers, enableExerciseTeamPlayers, fetchExerciseTeams, removeExerciseTeamPlayers } from '../../../../../actions/Exercise'; -import { addTeam, fetchTeams } from '../../../../../actions/teams/team-actions'; +import { fetchExerciseTeams } from '../../../../../actions/Exercise'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; import ContextualTeams from '../../../components/teams/ContextualTeams'; import { useFormatter } from '../../../../../components/i18n'; -import type { Page } from '../../../../../components/common/queryable/Page'; -import { searchExerciseTeams, addExerciseTeams, removeExerciseTeams, replaceExerciseTeams } from '../../../../../actions/exercises/exercise-teams-action'; +import teamContextForExercise from './teamContextForExercise'; interface Props { exerciseTeamsUsers: ExerciseStore['exercise_teams_users'], } -export const teamContextForExercise = (exerciseId: ExerciseStore['exercise_id'], exerciseTeamsUsers: ExerciseStore['exercise_teams_users']): TeamContextType => { - const dispatch = useAppDispatch(); - - return { - async onAddUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { - await dispatch(addExerciseTeamPlayers(exerciseId, teamId, { exercise_team_players: userIds })); - return dispatch(fetchTeams()); - }, - async onRemoveUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { - await dispatch(removeExerciseTeamPlayers(exerciseId, teamId, { exercise_team_players: userIds })); - return dispatch(fetchTeams()); - }, - onAddTeam(teamId: Team['team_id']): Promise { - return dispatch(addExerciseTeams(exerciseId, { exercise_teams: [teamId] })); - }, - onCreateTeam(team: TeamCreateInput): Promise<{ result: string }> { - return dispatch(addTeam({ ...team, team_exercises: [exerciseId] })); - }, - checkUserEnabled(teamId: Team['team_id'], userId: UserStore['user_id']): boolean { - return exerciseTeamsUsers.filter((o: ExerciseStore['exercise_teams_users']) => o.exercise_id === exerciseId && o.team_id === teamId && userId === o.user_id).length > 0; - }, - computeTeamUsersEnabled(teamId: Team['team_id']) { - return exerciseTeamsUsers.filter((o: ExerciseStore['exercise_teams_users']) => o.team_id === teamId).length; - }, - onRemoveTeam(teamId: Team['team_id']): void { - dispatch(removeExerciseTeams(exerciseId, { exercise_teams: [teamId] })); - }, - onReplaceTeam(teamIds: Team['team_id'][]): Promise<{ result: string[], entities: { teams: Record } }> { - return dispatch(replaceExerciseTeams(exerciseId, { exercise_teams: teamIds })); - }, - onToggleUser(teamId: Team['team_id'], userId: UserStore['user_id'], userEnabled: boolean): void { - if (userEnabled) { - dispatch(disableExerciseTeamPlayers(exerciseId, teamId, { exercise_team_players: [userId] })); - } else { - dispatch(enableExerciseTeamPlayers(exerciseId, teamId, { exercise_team_players: [userId] })); - } - }, - searchTeams(input: SearchPaginationInput, contextualOnly?: boolean): Promise<{ data: Page }> { - return searchExerciseTeams(exerciseId, input, contextualOnly); - }, - }; -}; - const ExerciseTeams: React.FC = ({ exerciseTeamsUsers }) => { // Standard hooks const { t } = useFormatter(); diff --git a/openbas-front/src/admin/components/simulations/simulation/teams/teamContextForExercise.ts b/openbas-front/src/admin/components/simulations/simulation/teams/teamContextForExercise.ts new file mode 100644 index 0000000000..e538e9d028 --- /dev/null +++ b/openbas-front/src/admin/components/simulations/simulation/teams/teamContextForExercise.ts @@ -0,0 +1,55 @@ +import { addExerciseTeamPlayers, disableExerciseTeamPlayers, enableExerciseTeamPlayers, removeExerciseTeamPlayers } from '../../../../../actions/Exercise'; +import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import { addExerciseTeams, removeExerciseTeams, replaceExerciseTeams, searchExerciseTeams } from '../../../../../actions/exercises/exercise-teams-action'; +import type { TeamStore } from '../../../../../actions/teams/Team'; +import { addTeam, fetchTeams } from '../../../../../actions/teams/team-actions'; +import type { Page } from '../../../../../components/common/queryable/Page'; +import type { SearchPaginationInput, Team, TeamCreateInput, TeamOutput } from '../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import { TeamContextType } from '../../../common/Context'; +import type { UserStore } from '../../../teams/players/Player'; + +const teamContextForExercise = (exerciseId: ExerciseStore['exercise_id'], exerciseTeamsUsers: ExerciseStore['exercise_teams_users']): TeamContextType => { + const dispatch = useAppDispatch(); + + return { + async onAddUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { + await dispatch(addExerciseTeamPlayers(exerciseId, teamId, { exercise_team_players: userIds })); + return dispatch(fetchTeams()); + }, + async onRemoveUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { + await dispatch(removeExerciseTeamPlayers(exerciseId, teamId, { exercise_team_players: userIds })); + return dispatch(fetchTeams()); + }, + onAddTeam(teamId: Team['team_id']): Promise { + return dispatch(addExerciseTeams(exerciseId, { exercise_teams: [teamId] })); + }, + onCreateTeam(team: TeamCreateInput): Promise<{ result: string }> { + return dispatch(addTeam({ ...team, team_exercises: [exerciseId] })); + }, + checkUserEnabled(teamId: Team['team_id'], userId: UserStore['user_id']): boolean { + return exerciseTeamsUsers.filter((o: ExerciseStore['exercise_teams_users']) => o.exercise_id === exerciseId && o.team_id === teamId && userId === o.user_id).length > 0; + }, + computeTeamUsersEnabled(teamId: Team['team_id']) { + return exerciseTeamsUsers.filter((o: ExerciseStore['exercise_teams_users']) => o.team_id === teamId).length; + }, + onRemoveTeam(teamId: Team['team_id']): void { + dispatch(removeExerciseTeams(exerciseId, { exercise_teams: [teamId] })); + }, + onReplaceTeam(teamIds: Team['team_id'][]): Promise<{ result: string[]; entities: { teams: Record } }> { + return dispatch(replaceExerciseTeams(exerciseId, { exercise_teams: teamIds })); + }, + onToggleUser(teamId: Team['team_id'], userId: UserStore['user_id'], userEnabled: boolean): void { + if (userEnabled) { + dispatch(disableExerciseTeamPlayers(exerciseId, teamId, { exercise_team_players: [userId] })); + } else { + dispatch(enableExerciseTeamPlayers(exerciseId, teamId, { exercise_team_players: [userId] })); + } + }, + searchTeams(input: SearchPaginationInput, contextualOnly?: boolean): Promise<{ data: Page }> { + return searchExerciseTeams(exerciseId, input, contextualOnly); + }, + }; +}; + +export default teamContextForExercise; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx index 1735cafa40..edfe2fe376 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx @@ -51,7 +51,7 @@ const TechnicalExpectationAsset: FunctionComponent = ({ return JSON.parse(result).map((entry: string[], idx: number) => (

{Object.entries(entry).map(([key, value]) => `${key}: ${value}\n`)}

)); - } catch (e) { + } catch { return (

{result}

); } }; diff --git a/openbas-front/src/components/ExportPdfButton.tsx b/openbas-front/src/components/ExportPdfButton.tsx index 5152da49c7..2d6e2fdc6c 100644 --- a/openbas-front/src/components/ExportPdfButton.tsx +++ b/openbas-front/src/components/ExportPdfButton.tsx @@ -6,7 +6,7 @@ import pdfMake from 'pdfmake/build/pdfmake'; import pdfFonts from 'pdfmake/build/vfs_fonts'; import { useDispatch } from 'react-redux'; -import { TDocumentDefinitions } from 'pdfmake/interfaces'; +import type { TDocumentDefinitions } from 'pdfmake/interfaces'; import { useFormatter } from './i18n'; import Loader from './Loader'; import { useHelper } from '../store'; diff --git a/openbas-front/src/components/MarkdownDisplay.tsx b/openbas-front/src/components/MarkdownDisplay.tsx index 3d4760b786..05cab5e890 100644 --- a/openbas-front/src/components/MarkdownDisplay.tsx +++ b/openbas-front/src/components/MarkdownDisplay.tsx @@ -2,13 +2,13 @@ import Markdown from 'react-markdown'; import remarkParse from 'remark-parse'; import remarkFlexibleMarkers from 'remark-flexible-markers'; import { useTheme } from '@mui/styles'; -import { PluggableList } from 'react-markdown/lib'; import { FunctionComponent, SyntheticEvent, useState } from 'react'; import remarkGfm from 'remark-gfm'; import type { Theme } from './Theme'; import { truncate } from '../utils/String'; import ExternalLinkPopover from './ExternalLinkPopover'; import FieldOrEmpty from './FieldOrEmpty'; +import type { PluggableList } from 'react-markdown/lib'; export const MarkDownComponents = ( theme: Theme, diff --git a/openbas-front/src/components/common/Drawer.tsx b/openbas-front/src/components/common/Drawer.tsx index a9fb9cdaa4..04702d059f 100644 --- a/openbas-front/src/components/common/Drawer.tsx +++ b/openbas-front/src/components/common/Drawer.tsx @@ -5,7 +5,7 @@ import { Close } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; import type { Theme } from '../Theme'; import useAuth from '../../utils/hooks/useAuth'; -import { computeBannerSettings } from '../../public/components/systembanners/SystemBanners'; +import { computeBannerSettings } from '../../public/components/systembanners/utils'; const useStyles = makeStyles((theme: Theme) => ({ drawerPaperHalf: { diff --git a/openbas-front/src/public/components/systembanners/SystemBanners.tsx b/openbas-front/src/public/components/systembanners/SystemBanners.tsx index fba6e857c6..bb6f302a9a 100644 --- a/openbas-front/src/public/components/systembanners/SystemBanners.tsx +++ b/openbas-front/src/public/components/systembanners/SystemBanners.tsx @@ -1,30 +1,11 @@ import { makeStyles } from '@mui/styles'; import { ReportProblem } from '@mui/icons-material'; -import { isEmptyField, isNotEmptyField, recordEntries, recordKeys } from '../../../utils/utils'; +import { isEmptyField, recordEntries, recordKeys } from '../../../utils/utils'; import type { Theme } from '../../../components/Theme'; -import type { PlatformSettings } from '../../../utils/api-types'; import { useFormatter } from '../../../components/i18n'; export const SYSTEM_BANNER_HEIGHT_PER_MESSAGE = 18; -export const computeBannerSettings = (settings: PlatformSettings) => { - const bannerByLevel = settings.platform_banner_by_level; - const isBannerActivated = bannerByLevel !== undefined && isNotEmptyField(recordKeys(bannerByLevel)); - let numberOfElements = 0; - if (settings.platform_banner_by_level !== undefined) { - for (const bannerLevel of recordEntries(settings.platform_banner_by_level)) { - numberOfElements += bannerLevel[1].length; - } - } - const bannerHeight = isBannerActivated ? `${(SYSTEM_BANNER_HEIGHT_PER_MESSAGE * numberOfElements) + 16}px` : '0'; - const bannerHeightNumber = isBannerActivated ? (SYSTEM_BANNER_HEIGHT_PER_MESSAGE * numberOfElements) + 16 : 0; - return { - bannerByLevel, - bannerHeight, - bannerHeightNumber, - }; -}; - /* eslint-disable */ /* Avoid auto-lint removal using --fix with false positive finding of: */ const useStyles = makeStyles((theme: Theme) => ({ diff --git a/openbas-front/src/public/components/systembanners/utils.ts b/openbas-front/src/public/components/systembanners/utils.ts new file mode 100644 index 0000000000..ffcaa5cbff --- /dev/null +++ b/openbas-front/src/public/components/systembanners/utils.ts @@ -0,0 +1,22 @@ +import type { PlatformSettings } from '../../../utils/api-types'; +import { isNotEmptyField, recordEntries, recordKeys } from '../../../utils/utils'; +import { SYSTEM_BANNER_HEIGHT_PER_MESSAGE } from './SystemBanners'; + +// eslint-disable-next-line import/prefer-default-export +export const computeBannerSettings = (settings: PlatformSettings) => { + const bannerByLevel = settings.platform_banner_by_level; + const isBannerActivated = bannerByLevel !== undefined && isNotEmptyField(recordKeys(bannerByLevel)); + let numberOfElements = 0; + if (settings.platform_banner_by_level !== undefined) { + for (const bannerLevel of recordEntries(settings.platform_banner_by_level)) { + numberOfElements += bannerLevel[1].length; + } + } + const bannerHeight = isBannerActivated ? `${(SYSTEM_BANNER_HEIGHT_PER_MESSAGE * numberOfElements) + 16}px` : '0'; + const bannerHeightNumber = isBannerActivated ? (SYSTEM_BANNER_HEIGHT_PER_MESSAGE * numberOfElements) + 16 : 0; + return { + bannerByLevel, + bannerHeight, + bannerHeightNumber, + }; +}; From 0e6999799f509509710c83381896e13ae91d4959 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Sun, 27 Oct 2024 22:31:25 +0100 Subject: [PATCH 05/14] [frontend] uncomment stylistic & simple imports eslint plugins --- openbas-front/eslint.config.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openbas-front/eslint.config.js b/openbas-front/eslint.config.js index fe84fe2473..050a2fda35 100644 --- a/openbas-front/eslint.config.js +++ b/openbas-front/eslint.config.js @@ -45,9 +45,9 @@ export default [ }, // rules recommended by @stylistic/eslint-plugin - // stylistic.configs.customize({ - // semi: true, - // }), + stylistic.configs.customize({ + semi: true, + }), // rules recommended by eslint-plugin-i18next i18next.configs['flat/recommended'], @@ -58,7 +58,7 @@ export default [ // eslint-plugin-react-refresh 'react-refresh': reactRefresh, // eslint-plugin-simple-import-sort - // 'simple-import-sort': simpleImportSort, + 'simple-import-sort': simpleImportSort, // local package eslint-plugin-custom-rules 'custom-rules': customRules, }, @@ -72,8 +72,8 @@ export default [ ], // eslint-plugin-simple-import-sort rules - // 'simple-import-sort/imports': 'error', - // 'simple-import-sort/exports': 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', // local package eslint-plugin-custom-rules rules 'custom-rules/classes-rule': 1, @@ -103,8 +103,8 @@ export default [ 'react/prop-types': 0, // @stylistic rules - // '@stylistic/brace-style': ['error', '1tbs'], - // '@stylistic/multiline-ternary': ['error', 'always-multiline', { ignoreJSX: true }], + '@stylistic/brace-style': ['error', '1tbs'], + '@stylistic/multiline-ternary': ['error', 'always-multiline', { ignoreJSX: true }], // eslint-plugin-import rules 'import/no-named-as-default-member': 'off', From 687420db8070a46f2c4afd37938ce152d17840cb Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Sun, 27 Oct 2024 22:35:37 +0100 Subject: [PATCH 06/14] [frontend] automatic fixes --- openbas-front/builder/dev/dev.js | 101 +- openbas-front/builder/prod/prod.js | 7 +- openbas-front/i18n-checker.js | 3 +- openbas-front/src/__tests__/App.test.tsx | 4 +- openbas-front/src/actions/Application.js | 19 +- openbas-front/src/actions/AskAI.js | 3 +- openbas-front/src/actions/AttackPattern.ts | 3 +- openbas-front/src/actions/Challenge.js | 15 +- openbas-front/src/actions/Collector.js | 8 +- openbas-front/src/actions/Comcheck.js | 6 +- openbas-front/src/actions/Communication.js | 4 +- openbas-front/src/actions/Document.js | 14 +- openbas-front/src/actions/Dryinject.js | 6 +- openbas-front/src/actions/Dryrun.js | 4 +- openbas-front/src/actions/Evaluation.js | 2 +- openbas-front/src/actions/Executor.js | 4 +- openbas-front/src/actions/Exercise.js | 42 +- openbas-front/src/actions/Grant.js | 2 +- openbas-front/src/actions/Group.js | 14 +- openbas-front/src/actions/Inject.js | 8 +- .../src/actions/InjectorContracts.js | 8 +- openbas-front/src/actions/Injectors.js | 8 +- openbas-front/src/actions/KillChainPhase.js | 6 +- openbas-front/src/actions/Lessons.js | 10 +- openbas-front/src/actions/Log.js | 4 +- openbas-front/src/actions/Mitigation.js | 6 +- openbas-front/src/actions/Objective.js | 6 +- openbas-front/src/actions/Organization.js | 10 +- openbas-front/src/actions/Payload.js | 8 +- openbas-front/src/actions/Schema.js | 154 +- openbas-front/src/actions/Tag.js | 12 +- openbas-front/src/actions/User.js | 30 +- .../actions/asset_groups/assetgroup-action.ts | 3 +- .../src/actions/assets/endpoint-actions.ts | 1 + .../assets/securityPlatform-actions.ts | 3 +- .../atomic_testings/atomic-testing-actions.ts | 2 +- .../atomic_testings/atomic-testing.d.ts | 2 +- .../attack_patterns/AttackPattern.d.ts | 4 +- .../src/actions/channels/Article.d.ts | 2 +- .../src/actions/channels/article-action.js | 6 +- .../src/actions/channels/channel-action.js | 8 +- .../src/actions/contract/contract.d.ts | 28 +- .../src/actions/exercises/Exercise.d.ts | 2 +- .../src/actions/exercises/exercise-action.ts | 3 +- .../actions/exercises/exercise-helper.d.ts | 4 +- .../exercises/exercise-teams-action.ts | 5 +- openbas-front/src/actions/helper.d.ts | 2 +- .../injector_contracts/InjectorContract.d.ts | 8 +- .../actions/injectors/injector-helper.d.ts | 2 +- openbas-front/src/actions/injects/Inject.d.ts | 68 +- .../src/actions/injects/inject-action.ts | 3 +- .../src/actions/injects/inject-helper.d.ts | 2 +- .../src/actions/mapper/mapper-actions.ts | 2 +- .../src/actions/reports/report-actions.ts | 3 +- .../src/actions/scenarios/scenario-actions.ts | 5 +- .../actions/scenarios/scenario-helper.d.ts | 4 +- .../scenarios/scenario-teams-action.ts | 5 +- openbas-front/src/actions/teams/Team.d.ts | 4 +- .../src/actions/teams/team-actions.ts | 5 +- .../src/actions/teams/team-helper.d.ts | 4 +- .../src/actions/variables/variable-actions.ts | 5 +- openbas-front/src/admin/Index.tsx | 25 +- .../src/admin/components/Dashboard.tsx | 118 +- openbas-front/src/admin/components/MiniMap.js | 10 +- .../src/admin/components/agents/Agents.tsx | 275 +- .../admin/components/assets/AssetStatus.tsx | 7 +- .../src/admin/components/assets/Index.tsx | 5 +- .../asset_groups/AssetGroupAddEndpoints.tsx | 14 +- .../asset_groups/AssetGroupCreation.tsx | 18 +- .../asset_groups/AssetGroupDialogAdding.tsx | 37 +- .../assets/asset_groups/AssetGroupForm.tsx | 9 +- .../asset_groups/AssetGroupManagement.tsx | 56 +- .../assets/asset_groups/AssetGroupPopover.tsx | 26 +- .../assets/asset_groups/AssetGroups.tsx | 114 +- .../assets/asset_groups/AssetGroupsList.tsx | 11 +- .../assets/asset_groups/DynamicAssetField.tsx | 7 +- .../assets/endpoints/EndpointCreation.tsx | 18 +- .../assets/endpoints/EndpointForm.tsx | 21 +- .../assets/endpoints/EndpointPopover.tsx | 23 +- .../components/assets/endpoints/Endpoints.tsx | 69 +- .../endpoints/EndpointsDialogAdding.tsx | 63 +- .../assets/endpoints/EndpointsList.tsx | 17 +- .../SecurityPlatformCreation.tsx | 18 +- .../SecurityPlatformForm.tsx | 29 +- .../SecurityPlatformPopover.tsx | 17 +- .../security_platforms/SecurityPlatforms.tsx | 39 +- .../atomic_testings/AtomicTestings.tsx | 52 +- .../atomic_testings/InjectDtoList.tsx | 51 +- .../atomic_testings/InjectResultDtoContext.ts | 3 +- .../atomic_testing/AtomicTesting.tsx | 59 +- .../atomic_testing/AtomicTestingDetail.tsx | 115 +- .../atomic_testing/AtomicTestingHeader.tsx | 78 +- .../atomic_testing/AtomicTestingPopover.tsx | 27 +- .../atomic_testing/AtomicTestingResult.tsx | 7 +- .../atomic_testing/AtomicTestingUpdate.tsx | 7 +- .../atomic_testings/atomic_testing/Index.tsx | 27 +- .../atomic_testing/TargetListItem.tsx | 11 +- .../atomic_testing/TargetResultsDetail.tsx | 127 +- .../context/TeamContextForAtomicTesting.tsx | 6 +- .../types/nodes/NodeResultStep.tsx | 27 +- .../src/admin/components/common/Context.ts | 139 +- .../src/admin/components/common/ToolBar.js | 45 +- .../common/articles/ArticleAddDocuments.js | 41 +- .../components/common/articles/ArticleForm.js | 53 +- .../common/articles/ArticlePopover.js | 14 +- .../components/common/articles/Articles.tsx | 411 +-- .../common/articles/CreateArticle.js | 11 +- .../common/challenges/ContextualChallenges.js | 57 +- .../common/entreprise_edition/EEChip.tsx | 13 +- .../common/entreprise_edition/EEField.tsx | 11 +- .../common/entreprise_edition/EEMenu.tsx | 6 +- .../common/entreprise_edition/EETooltip.tsx | 9 +- .../entreprise_edition/EnterpriseEdition.tsx | 9 +- .../EnterpriseEditionAgreement.tsx | 26 +- .../EnterpriseEditionButton.tsx | 11 +- .../filters/InjectorContractSwitchFilter.tsx | 9 +- .../common/filters/KillChainPhasesFilter.js | 17 +- .../components/common/filters/MitreFilter.tsx | 55 +- .../components/common/filters/TagsFilter.js | 17 +- .../components/common/filters/constants.ts | 2 +- .../components/common/form/TextFieldAskAI.tsx | 65 +- .../common/injects/CreateInject.tsx | 68 +- .../common/injects/CreateInjectDetails.js | 141 +- .../injects/ExerciseInjectsDistribution.tsx | 8 +- .../ImportUploaderInjectFromInjectsTest.tsx | 48 +- .../injects/ImportUploaderInjectFromXls.tsx | 35 +- .../ImportUploaderInjectFromXlsFile.tsx | 16 +- .../ImportUploaderInjectFromXlsInjects.tsx | 110 +- .../common/injects/InjectAddArticles.tsx | 31 +- .../common/injects/InjectAddChallenges.tsx | 35 +- .../common/injects/InjectAddTeams.tsx | 67 +- .../common/injects/InjectChainsForm.tsx | 342 +-- .../common/injects/InjectDefinition.js | 522 ++-- .../injects/InjectDistributionByTeam.tsx | 17 +- .../injects/InjectDistributionByType.tsx | 19 +- .../components/common/injects/InjectForm.js | 65 +- .../components/common/injects/InjectIcon.js | 9 +- .../common/injects/InjectPopover.tsx | 59 +- .../common/injects/InjectStatusDetails.js | 13 +- .../common/injects/InjectorContract.js | 9 +- .../components/common/injects/Injects.tsx | 224 +- .../common/injects/InjectsDistribution.tsx | 9 +- .../common/injects/InjectsListButtons.tsx | 36 +- .../components/common/injects/ResponsePie.tsx | 77 +- .../injects/ScenarioInjectsDistribution.tsx | 8 +- .../common/injects/UpdateInject.tsx | 27 +- .../common/injects/UpdateInjectDetails.js | 55 +- .../injects/UpdateInjectLogicalChains.tsx | 85 +- .../expectations/ExpectationFormCreate.tsx | 36 +- .../expectations/ExpectationFormUpdate.tsx | 22 +- .../expectations/ExpectationFormUtils.ts | 3 +- .../expectations/ExpectationPopover.tsx | 19 +- .../injects/expectations/ExpectationUtils.tsx | 1 + .../expectations/InjectAddExpectation.tsx | 13 +- .../expectations/InjectExpectations.tsx | 15 +- .../field/ExpectationGroupField.tsx | 21 +- .../useExpectationExpirationTime.tsx | 4 +- .../common/injects/teams/InjectTeamsList.tsx | 19 +- .../common/matrix/AttackPatternBox.tsx | 17 +- .../common/matrix/KillChainPhaseColumn.tsx | 11 +- .../components/common/matrix/MitreMatrix.tsx | 27 +- .../common/matrix/MitreMatrixDummy.tsx | 19 +- .../common/simulate/DefinitionMenu.tsx | 5 +- .../common/simulate/EmailParametersForm.tsx | 14 +- .../components/common/simulate/HeaderTags.tsx | 11 +- .../common/simulate/PaperMetric.tsx | 5 +- .../admin/components/common/tags/TagChip.tsx | 9 +- .../src/admin/components/components/Index.tsx | 5 +- .../components/challenges/ChallengeForm.js | 61 +- .../components/challenges/ChallengePopover.js | 19 +- .../components/challenges/Challenges.js | 39 +- .../components/challenges/CreateChallenge.js | 13 +- .../components/components/channels/Channel.js | 27 +- .../components/channels/ChannelAddLogo.tsx | 8 +- .../components/channels/ChannelForm.js | 7 +- .../components/channels/ChannelHeader.js | 7 +- .../components/channels/ChannelIcon.js | 7 +- .../channels/ChannelOverviewMicroblogging.js | 64 +- .../channels/ChannelOverviewNewspaper.js | 52 +- .../channels/ChannelOverviewTvChannel.js | 50 +- .../channels/ChannelParametersForm.js | 7 +- .../components/channels/ChannelPopover.tsx | 13 +- .../components/channels/Channels.tsx | 37 +- .../components/channels/ChannelsFilter.tsx | 27 +- .../components/channels/CreateChannel.js | 17 +- .../components/components/channels/Index.tsx | 17 +- .../components/documents/CreateDocument.js | 29 +- .../components/documents/DocumentForm.js | 9 +- .../components/documents/DocumentPopover.js | 31 +- .../components/documents/DocumentType.js | 7 +- .../components/documents/Documents.js | 49 +- .../lessons/CreateLessonsTemplate.tsx | 13 +- .../components/components/lessons/Index.tsx | 29 +- .../components/lessons/LessonsTemplate.tsx | 31 +- .../lessons/LessonsTemplateForm.tsx | 9 +- .../lessons/LessonsTemplateHeader.tsx | 7 +- .../lessons/LessonsTemplatePopover.tsx | 13 +- .../components/lessons/LessonsTemplates.tsx | 31 +- .../CreateLessonsTemplateCategory.tsx | 7 +- .../LessonsTemplateCategoryForm.tsx | 7 +- .../LessonsTemplateCategoryPopover.tsx | 11 +- .../CreateLessonsTemplateQuestion.tsx | 11 +- .../questions/LessonsTemplateQuestionForm.tsx | 7 +- .../LessonsTemplateQuestionPopover.tsx | 11 +- .../components/reports/ReportComment.tsx | 28 +- .../components/reports/ReportPopover.tsx | 9 +- .../components/components/reports/Reports.tsx | 19 +- .../components/teams/ContextualTeams.tsx | 19 +- .../components/teams/CreateTeam.tsx | 15 +- .../components/teams/TeamAddPlayers.tsx | 47 +- .../components/components/teams/TeamForm.tsx | 11 +- .../components/teams/TeamPlayers.tsx | 154 +- .../components/teams/TeamPopover.tsx | 45 +- .../components/components/teams/Teams.tsx | 43 +- .../components/teams/UpdateTeams.tsx | 61 +- .../components/variables/CreateVariable.tsx | 11 +- .../components/variables/VariableForm.tsx | 5 +- .../components/variables/VariablePopover.tsx | 7 +- .../components/variables/Variables.tsx | 19 +- .../admin/components/injects/InjectHeader.tsx | 5 +- .../components/injects/InjectTestDetail.tsx | 85 +- .../components/injects/InjectTestList.tsx | 39 +- .../components/injects/InjectTestPopover.tsx | 11 +- .../injects/InjectTestReplayAll.tsx | 9 +- .../components/integrations/Collectors.tsx | 27 +- .../components/integrations/Executors.tsx | 23 +- .../admin/components/integrations/Index.tsx | 5 +- .../components/integrations/Injectors.tsx | 53 +- .../integrations/injectors/Index.tsx | 21 +- .../injectors/InjectorContracts.js | 39 +- .../integrations/injectors/InjectorHeader.js | 5 +- .../CreateInjectorContract.js | 25 +- .../InjectorContractCustomForm.js | 74 +- .../InjectorContractForm.js | 3 +- .../InjectorContractPopover.js | 15 +- .../components/lessons/CreateObjective.js | 11 +- .../lessons/ObjectiveEvaluations.js | 14 +- .../admin/components/lessons/ObjectiveForm.js | 5 +- .../components/lessons/ObjectivePopover.js | 11 +- .../components/lessons/SendLessonsForm.js | 7 +- .../categories/CreateLessonsCategory.js | 11 +- .../categories/LessonsCategoryAddTeams.js | 31 +- .../lessons/categories/LessonsCategoryForm.js | 3 +- .../categories/LessonsCategoryPopover.js | 9 +- .../questions/CreateLessonsQuestion.js | 9 +- .../questions/LessonsQuestionForm.js | 3 +- .../questions/LessonsQuestionPopover.js | 9 +- .../exercises/AnswersByQuestionDialog.tsx | 32 +- .../components/lessons/exercises/Lessons.tsx | 87 +- .../lessons/exercises/LessonsCategories.js | 99 +- .../lessons/exercises/LessonsObjectives.js | 23 +- .../components/lessons/scenarios/Lessons.tsx | 55 +- .../lessons/scenarios/LessonsCategories.js | 29 +- .../lessons/scenarios/LessonsObjectives.js | 15 +- .../mitigations/CreateMitigation.js | 15 +- .../components/mitigations/MitigationForm.js | 3 +- .../mitigations/MitigationPopover.js | 13 +- .../components/mitigations/Mitigations.js | 33 +- .../src/admin/components/nav/LeftBar.tsx | 254 +- .../src/admin/components/nav/TopBar.tsx | 41 +- .../components/payloads/CreatePayload.js | 15 +- .../admin/components/payloads/PayloadForm.tsx | 19 +- .../components/payloads/PayloadPopover.js | 13 +- .../admin/components/payloads/Payloads.tsx | 149 +- .../src/admin/components/profile/Index.js | 39 +- .../admin/components/profile/PasswordForm.js | 5 +- .../admin/components/profile/ProfileForm.js | 5 +- .../src/admin/components/profile/UserForm.js | 5 +- .../scenarios/ImportUploaderScenario.tsx | 9 +- .../components/scenarios/ScenarioCreation.tsx | 11 +- .../components/scenarios/ScenarioForm.tsx | 19 +- .../admin/components/scenarios/Scenarios.tsx | 100 +- .../components/scenarios/ScenariosCard.tsx | 31 +- .../components/scenarios/scenario/Index.tsx | 31 +- .../scenarios/scenario/Scenario.tsx | 59 +- .../scenarios/scenario/ScenarioContext.ts | 26 +- .../scenarios/scenario/ScenarioDefinition.tsx | 11 +- .../ScenarioDistributionByExercise.tsx | 22 +- .../scenario/ScenarioExportDialog.tsx | 1 + .../scenarios/scenario/ScenarioHeader.tsx | 33 +- .../scenarios/scenario/ScenarioPopover.tsx | 39 +- .../scenario/ScenarioRecurringFormDialog.tsx | 209 +- .../scenarios/scenario/ScenarioStatus.tsx | 7 +- .../scenarios/scenario/ScenarioUpdate.tsx | 9 +- .../scenario/articles/ScenarioArticles.tsx | 9 +- .../challenges/ScenarioChallenges.tsx | 7 +- .../scenario/injects/ScenarioInjects.tsx | 21 +- .../scenario/lessons/ScenarioLessons.tsx | 37 +- .../scenario/teams/ScenarioTeams.tsx | 26 +- .../scenario/tests/ScenarioTests.tsx | 5 +- .../scenario/variables/ScenarioVariables.tsx | 17 +- .../components/search/FullTextSearch.tsx | 52 +- .../components/settings/DataIngestionMenu.tsx | 1 + .../src/admin/components/settings/Index.tsx | 13 +- .../admin/components/settings/Parameters.tsx | 21 +- .../components/settings/ParametersForm.js | 5 +- .../components/settings/SecurityMenu.tsx | 3 +- .../components/settings/TaxonomiesMenu.tsx | 15 +- .../admin/components/settings/ThemeForm.tsx | 9 +- .../attack_patterns/AttackPatternForm.js | 3 +- .../attack_patterns/AttackPatternPopover.js | 13 +- .../attack_patterns/AttackPatterns.js | 35 +- .../attack_patterns/CreateAttackPattern.js | 15 +- .../settings/data_ingestion/AttributeUtils.ts | 4 +- .../data_ingestion/ImportUploaderMapper.tsx | 7 +- .../data_ingestion/XlsMapperPopover.tsx | 15 +- .../settings/data_ingestion/XlsMappers.tsx | 39 +- .../data_ingestion/xls_mapper/MapperForm.tsx | 17 +- .../xls_mapper/RulesContractContent.tsx | 161 +- .../xls_mapper/XlsMapperCreation.tsx | 15 +- .../xls_mapper/XlsMapperTestDialog.tsx | 21 +- .../xls_mapper/XlsMapperUpdate.tsx | 15 +- .../components/settings/groups/CreateGroup.js | 17 +- .../components/settings/groups/GroupForm.js | 9 +- .../settings/groups/GroupPopover.js | 47 +- .../components/settings/groups/Groups.js | 43 +- .../kill_chain_phases/CreateKillChainPhase.js | 17 +- .../kill_chain_phases/KillChainPhaseForm.js | 5 +- .../KillChainPhasePopover.js | 15 +- .../kill_chain_phases/KillChainPhases.js | 33 +- .../components/settings/policies/Policies.tsx | 27 +- .../settings/policies/PolicyForm.tsx | 5 +- .../components/settings/tags/CreateTag.js | 15 +- .../admin/components/settings/tags/TagForm.js | 7 +- .../components/settings/tags/TagPopover.js | 13 +- .../admin/components/settings/tags/Tags.js | 35 +- .../components/settings/users/CreateUser.js | 15 +- .../components/settings/users/UserForm.js | 7 +- .../settings/users/UserPasswordForm.js | 5 +- .../components/settings/users/UserPopover.js | 13 +- .../admin/components/settings/users/Users.js | 43 +- .../components/simulations/ExerciseList.tsx | 39 +- .../components/simulations/Exercises.tsx | 33 +- .../simulations/ImportUploaderExercise.tsx | 9 +- .../simulations/simulation/AnimationMenu.tsx | 11 +- .../simulations/simulation/ExerciseContext.ts | 34 +- .../simulation/ExerciseCreation.tsx | 9 +- .../simulation/ExerciseCreationForm.tsx | 21 +- .../simulation/ExerciseDateForm.tsx | 31 +- .../simulation/ExerciseDatePopover.tsx | 9 +- .../simulation/ExerciseDefinition.tsx | 11 +- .../simulations/simulation/ExerciseHeader.tsx | 32 +- .../simulation/ExerciseMainInformation.tsx | 15 +- .../simulation/ExercisePopover.tsx | 29 +- .../simulations/simulation/ExerciseStatus.tsx | 7 +- .../simulation/ExerciseUpdateForm.tsx | 17 +- .../simulations/simulation/Index.tsx | 35 +- .../simulation/articles/ExerciseArticles.tsx | 9 +- .../challenges/ExerciseChallenges.tsx | 9 +- .../simulations/simulation/chat/Chat.js | 3 +- .../simulation/controls/Comcheck.js | 37 +- .../simulation/controls/ComcheckForm.js | 26 +- .../simulation/controls/ComcheckState.js | 9 +- .../controls/ComcheckStatusState.js | 9 +- .../simulation/controls/CreateControl.tsx | 30 +- .../simulations/simulation/controls/Dryrun.js | 48 +- .../simulation/controls/DryrunForm.js | 7 +- .../simulation/controls/DryrunProgress.js | 5 +- .../simulation/controls/DryrunStatus.js | 37 +- .../definition/ExerciseControlComChecks.tsx | 32 +- .../definition/ExerciseControlDryRuns.tsx | 32 +- .../definition/ExerciseInformation.tsx | 3 +- .../definition/ExerciseSettings.tsx | 29 +- .../simulation/injects/CreateQuickInject.js | 28 +- .../simulation/injects/ExerciseInjects.tsx | 253 +- .../simulation/injects/InjectIndex.tsx | 29 +- .../simulation/injects/QuickInject.js | 484 ++-- .../asset_groups/InjectAddAssetGroups.tsx | 7 +- .../injects/endpoints/InjectAddEndpoints.tsx | 15 +- .../simulation/lessons/ExerciseLessons.tsx | 61 +- .../simulations/simulation/logs/LogForm.js | 5 +- .../simulations/simulation/logs/LogPopover.js | 17 +- .../simulations/simulation/logs/Logs.js | 97 +- .../simulation/mails/Communication.js | 29 +- .../simulation/mails/CommunicationForm.js | 5 +- .../simulations/simulation/mails/Inject.js | 81 +- .../mails/MailDistributionByInject.tsx | 17 +- .../mails/MailDistributionByPlayer.tsx | 21 +- .../mails/MailDistributionByTeam.tsx | 17 +- .../mails/MailDistributionOverTimeChart.tsx | 15 +- .../mails/MailDistributionOverTimeLine.tsx | 17 +- .../simulations/simulation/mails/Mails.js | 405 +-- .../simulation/overview/DistributionUtils.ts | 3 +- .../simulation/overview/Exercise.tsx | 35 +- .../overview/ExerciseDistribution.tsx | 39 +- ...ExerciseDistributionByInjectorContract.tsx | 17 +- .../ExerciseDistributionScoreByInject.tsx | 15 +- ...xerciseDistributionScoreByOrganization.tsx | 21 +- .../ExerciseDistributionScoreByPlayer.tsx | 17 +- .../ExerciseDistributionScoreByTeam.tsx | 19 +- ...iseDistributionScoreByTeamInPercentage.tsx | 17 +- ...ibutionScoreOverTimeByInjectorContract.tsx | 15 +- ...xerciseDistributionScoreOverTimeByTeam.tsx | 19 +- ...ibutionScoreOverTimeByTeamInPercentage.tsx | 19 +- .../simulation/reports/ExerciseReportForm.tsx | 17 +- .../simulation/reports/ExerciseReportPage.tsx | 100 +- .../simulation/reports/ExerciseReports.tsx | 27 +- .../simulation/reports/InjectReportResult.tsx | 38 +- .../reports/getExerciseReportPdfDoc.ts | 158 +- .../reports/useExerciseReportData.ts | 57 +- .../simulation/teams/ExerciseTeams.tsx | 28 +- .../simulation/tests/ExerciseTests.tsx | 5 +- .../timeline/InjectOverTimeArea.tsx | 7 +- .../timeline/InjectOverTimeLine.tsx | 7 +- .../simulation/timeline/TimelineOverview.tsx | 59 +- .../simulation/validation/Validations.js | 59 +- .../validation/common/TeamOrAssetLine.tsx | 51 +- .../expectations/ChallengeExpectation.tsx | 6 +- .../expectations/ChannelExpectation.tsx | 4 +- ...onPreventionExpectationsValidationForm.tsx | 33 +- .../expectations/ExpectationLine.tsx | 15 +- .../expectations/ManualExpectations.tsx | 31 +- .../ManualExpectationsValidationForm.tsx | 38 +- .../validation/expectations/ResultChip.tsx | 3 +- .../TechnicalExpectationAsset.tsx | 39 +- .../TechnicalExpectationAssetGroup.tsx | 23 +- .../variables/AvailableVariablesDialog.tsx | 95 +- .../variables/ExerciseVariables.tsx | 13 +- .../src/admin/components/teams/Index.tsx | 5 +- .../admin/components/teams/Organizations.tsx | 39 +- .../src/admin/components/teams/Players.tsx | 56 +- .../src/admin/components/teams/Teams.tsx | 20 +- .../teams/organizations/CreateOrganization.js | 15 +- .../teams/organizations/OrganizationForm.js | 5 +- .../organizations/OrganizationPopover.js | 13 +- .../components/teams/players/CreatePlayer.tsx | 17 +- .../components/teams/players/Player.d.ts | 2 +- .../components/teams/players/PlayerForm.tsx | 11 +- .../teams/players/PlayerPopover.tsx | 23 +- openbas-front/src/app.tsx | 7 +- .../src/components/AppIntlProvider.js | 24 +- .../src/components/AppThemeProvider.tsx | 19 +- .../src/components/AttackPatternField.tsx | 35 +- openbas-front/src/components/Autocomplete.js | 6 +- openbas-front/src/components/Breadcrumbs.tsx | 9 +- .../src/components/ChainedTimeline.tsx | 163 +- openbas-front/src/components/CheckboxField.js | 8 +- .../src/components/ColorPickerField.tsx | 10 +- openbas-front/src/components/Countdown.js | 9 +- openbas-front/src/components/CountryField.js | 7 +- .../components/CustomTimelineBackground.tsx | 18 +- .../src/components/CustomTimelinePanel.tsx | 24 +- openbas-front/src/components/CustomTooltip.js | 2 +- .../src/components/DateTimePicker.js | 9 +- .../components/DeprecatedColorPickerField.js | 12 +- openbas-front/src/components/DocumentField.js | 11 +- openbas-front/src/components/Error.js | 7 +- openbas-front/src/components/ExerciseField.js | 13 +- .../src/components/ExpandableHtml.js | 9 +- .../src/components/ExpandableMarkdown.tsx | 15 +- .../src/components/ExpandableText.js | 7 +- .../src/components/ExportPdfButton.tsx | 20 +- .../src/components/ExternalLinkPopover.tsx | 3 +- openbas-front/src/components/FieldOrEmpty.tsx | 1 + openbas-front/src/components/FileField.js | 37 +- .../components/InjectContractComponent.tsx | 23 +- openbas-front/src/components/ItemBoolean.js | 7 +- openbas-front/src/components/ItemCategory.tsx | 4 +- openbas-front/src/components/ItemCopy.tsx | 23 +- .../src/components/ItemMainFocus.tsx | 4 +- .../src/components/ItemNumberDifference.js | 29 +- openbas-front/src/components/ItemResult.tsx | 4 +- openbas-front/src/components/ItemSeverity.tsx | 2 +- openbas-front/src/components/ItemStatus.tsx | 5 +- openbas-front/src/components/ItemTags.js | 76 +- openbas-front/src/components/ItemTargets.tsx | 17 +- .../src/components/KillChainPhaseField.js | 13 +- openbas-front/src/components/Loader.js | 6 +- .../src/components/MarkdownDisplay.tsx | 15 +- openbas-front/src/components/Message.js | 5 +- openbas-front/src/components/NotFound.tsx | 1 + .../src/components/OldAttackPatternField.js | 11 +- .../src/components/OrganizationField.js | 13 +- openbas-front/src/components/PayloadIcon.tsx | 4 +- .../src/components/PlatformField.tsx | 11 +- openbas-front/src/components/PlatformIcon.tsx | 19 +- openbas-front/src/components/PlayerField.js | 15 +- .../src/components/ProgressBarCountdown.js | 2 +- .../src/components/RedirectManager.tsx | 3 +- .../src/components/RegexComponent.tsx | 7 +- openbas-front/src/components/SearchFilter.tsx | 31 +- openbas-front/src/components/TagField.js | 13 +- openbas-front/src/components/ThemeDark.ts | 30 +- openbas-front/src/components/ThemeLight.ts | 28 +- openbas-front/src/components/Timeline.tsx | 237 +- openbas-front/src/components/TruncatedText.js | 3 +- .../src/components/common/ButtonCreate.tsx | 4 +- .../src/components/common/ButtonPopover.tsx | 21 +- .../src/components/common/ChipInList.tsx | 3 +- .../src/components/common/CodeBlock.tsx | 4 +- .../components/common/CustomFileUploader.tsx | 21 +- .../src/components/common/Dialog.tsx | 3 +- .../src/components/common/DialogDelete.tsx | 5 +- .../src/components/common/DialogDuplicate.tsx | 3 +- .../src/components/common/DialogTest.tsx | 3 +- .../src/components/common/DialogWithCross.tsx | 7 +- .../src/components/common/Drawer.tsx | 15 +- .../src/components/common/ExpendableText.tsx | 3 +- .../src/components/common/ExportButton.tsx | 58 +- .../src/components/common/IconPopover.tsx | 8 +- .../src/components/common/ImportUploader.tsx | 16 +- .../common/ListItemButtonCreate.tsx | 5 +- openbas-front/src/components/common/Paper.tsx | 2 +- .../src/components/common/RightMenu.tsx | 9 +- .../src/components/common/SelectList.tsx | 9 +- .../src/components/common/SortHeadersList.tsx | 17 +- .../src/components/common/TopMenu.tsx | 7 +- .../src/components/common/Transition.tsx | 6 +- .../common/chaining/ChainingUtils.tsx | 2 +- .../src/components/common/chips/ChipUtils.tsx | 7 +- .../components/common/chips/ClickableChip.tsx | 63 +- .../common/chips/ClickableChipPopover.tsx | 6 +- .../common/chips/ClickableModeChip.tsx | 5 +- .../common/pagination/PaginationComponent.tsx | 19 +- .../pagination/SortHeadersComponent.tsx | 5 +- .../common/queryable/QueryableHelpers.ts | 4 +- .../common/queryable/QueryableUtils.ts | 1 + .../queryable/filter/FilterAutocomplete.tsx | 13 +- .../common/queryable/filter/FilterChip.tsx | 24 +- .../queryable/filter/FilterChipPopover.tsx | 11 +- .../filter/FilterChipPopoverInput.tsx | 11 +- .../queryable/filter/FilterChipValues.tsx | 48 +- .../common/queryable/filter/FilterChips.tsx | 14 +- .../common/queryable/filter/FilterField.tsx | 11 +- .../common/queryable/filter/FilterUtils.tsx | 47 +- .../filter/filtersManageStateUtils.ts | 14 +- .../filter/specific/ScenarioStatusFilter.tsx | 15 +- .../filter/useFilterableProperties.ts | 6 +- .../queryable/filter/useFiltersState.tsx | 21 +- .../queryable/filter/useRetrieveOptions.tsx | 11 +- .../queryable/filter/useSearchOptions.tsx | 13 +- .../pagination/PaginationComponentV2.tsx | 45 +- .../pagination/TablePaginationComponent.tsx | 5 +- .../pagination/TablePaginationComponentV2.tsx | 3 +- .../pagination/usPaginationState.tsx | 1 + .../queryable/sort/SortHeadersComponentV2.tsx | 7 +- .../common/queryable/sort/useSortState.tsx | 1 + .../textSearch/TextSearchComponent.tsx | 1 + .../textSearch/useTextSearchState.tsx | 1 + .../common/queryable/uri/useUriState.tsx | 7 +- .../useQueryableWithLocalStorage.tsx | 11 +- .../src/components/fields/DocumentField.tsx | 21 +- .../src/components/fields/FileLoader.tsx | 140 +- .../components/fields/FileTransferDialog.tsx | 71 +- .../src/components/fields/MarkDownField.tsx | 48 +- .../fields/MarkDownFieldController.tsx | 3 +- .../components/fields/MultipleFileLoader.tsx | 17 +- .../components/fields/OldMarkDownField.tsx | 9 +- .../fields/SecurityPlatformField.tsx | 19 +- .../src/components/fields/SliderField.js | 4 +- .../src/components/fields/SwitchField.js | 8 +- .../src/components/fields/TagField.tsx | 25 +- .../src/components/fields/TextField.js | 15 +- openbas-front/src/components/i18n.js | 13 +- .../src/components/nodes/NodeInject.tsx | 100 +- .../src/components/nodes/NodePhantom.tsx | 37 +- openbas-front/src/components/nodes/index.ts | 1 + .../src/components/scalebar/ScaleBar.tsx | 13 +- openbas-front/src/index.tsx | 8 +- openbas-front/src/private/Index.tsx | 15 +- .../src/private/components/Dashboard.js | 3 +- .../src/private/components/nav/TopBar.tsx | 11 +- openbas-front/src/public/Index.tsx | 11 +- openbas-front/src/public/Root.tsx | 3 +- .../components/challenges/Challenges.js | 2 +- .../components/challenges/ChallengesPlayer.js | 195 +- .../challenges/ChallengesPreview.js | 94 +- .../src/public/components/channels/Channel.js | 2 +- .../channels/ChannelMicroblogging.js | 23 +- .../components/channels/ChannelNewspaper.js | 79 +- .../components/channels/ChannelPlayer.js | 19 +- .../components/channels/ChannelPreview.js | 19 +- .../components/channels/ChannelTvChannel.js | 47 +- .../public/components/comcheck/Comcheck.js | 15 +- .../lessons/ExerciseViewLessons.tsx | 17 +- .../components/lessons/LessonsPlayer.js | 399 +-- .../components/lessons/LessonsPreview.js | 73 +- .../lessons/ScenarioViewLessons.tsx | 15 +- .../src/public/components/login/Login.js | 65 +- .../public/components/login/LoginError.tsx | 1 + .../src/public/components/login/LoginForm.js | 3 +- .../components/login/LoginSSOButton.tsx | 3 +- .../src/public/components/login/Reset.js | 18 +- .../systembanners/SystemBanners.tsx | 13 +- openbas-front/src/reducers/App.js | 1 + openbas-front/src/reducers/Referential.js | 3 +- openbas-front/src/reducers/Root.ts | 1 + openbas-front/src/root.tsx | 25 +- openbas-front/src/store.ts | 15 +- openbas-front/src/utils/Action.ts | 13 +- openbas-front/src/utils/BrowserLanguage.js | 4 +- openbas-front/src/utils/Charts.js | 26 +- openbas-front/src/utils/Cron.ts | 10 +- openbas-front/src/utils/Environment.js | 20 +- openbas-front/src/utils/Exercise.js | 1 + openbas-front/src/utils/Localization.js | 2260 ++++++++--------- openbas-front/src/utils/Option.ts | 55 +- openbas-front/src/utils/Scenario.tsx | 11 +- openbas-front/src/utils/SortingFiltering.js | 31 +- openbas-front/src/utils/String.js | 6 +- openbas-front/src/utils/Time.js | 24 +- openbas-front/src/utils/Zod.ts | 2 +- openbas-front/src/utils/ai/ResponseDialog.tsx | 24 +- .../utils/flows/algorithms/d3-hierarchy.ts | 5 +- .../src/utils/flows/algorithms/dagre.ts | 1 + .../src/utils/flows/algorithms/index.ts | 4 +- .../src/utils/flows/useAutoLayout.ts | 8 +- openbas-front/src/utils/flows/utils.ts | 1 + openbas-front/src/utils/hooks/useAI.ts | 2 +- openbas-front/src/utils/hooks/useAuth.ts | 3 +- .../src/utils/hooks/useDataLoader.js | 3 +- .../src/utils/hooks/useEntityToggle.ts | 12 +- .../src/utils/hooks/useExportToXLS.ts | 2 +- .../InjectorContractUtils.ts | 1 + openbas-front/src/utils/utils.ts | 7 +- .../tests_e2e/fixtures/assetFixtures.ts | 1 + .../tests_e2e/fixtures/baseFixtures.ts | 4 +- .../tests/assets/create-asset.spec.ts | 7 +- .../tests/assets/delete-asset.spec.ts | 7 +- .../tests/assets/update-asset.spec.ts | 7 +- openbas-front/tests_e2e/utils/login.ts | 1 + openbas-front/tests_e2e/utils/logout.ts | 1 + openbas-front/vite.config.ts | 2 +- openbas-front/vitest.config.ts | 3 +- 624 files changed, 10561 insertions(+), 9381 deletions(-) diff --git a/openbas-front/builder/dev/dev.js b/openbas-front/builder/dev/dev.js index 545c0bdc63..8b294ac115 100644 --- a/openbas-front/builder/dev/dev.js +++ b/openbas-front/builder/dev/dev.js @@ -1,11 +1,12 @@ -import express from "express"; -import { createProxyMiddleware } from "http-proxy-middleware"; -import { readFileSync } from "node:fs"; -import { fileURLToPath } from "url"; -import fsExtra from "fs-extra/esm"; -import path from "node:path"; -import esbuild from "esbuild"; -import chokidar from "chokidar"; +import { readFileSync } from 'node:fs'; +import path from 'node:path'; + +import chokidar from 'chokidar'; +import esbuild from 'esbuild'; +import express from 'express'; +import fsExtra from 'fs-extra/esm'; +import { createProxyMiddleware } from 'http-proxy-middleware'; +import { fileURLToPath } from 'url'; // mimic CommonJS variables -- not needed if using CommonJS // eslint-disable-next-line no-underscore-dangle @@ -13,9 +14,9 @@ const __filename = fileURLToPath(import.meta.url); // eslint-disable-next-line no-underscore-dangle const __dirname = path.dirname(__filename); -const basePath = ""; +const basePath = ''; const clients = []; -const buildPath = "./builder/dev/build/"; +const buildPath = './builder/dev/build/'; const debounce = (func, timeout = 500) => { let timer; return (...args) => { @@ -28,7 +29,7 @@ const debounce = (func, timeout = 500) => { const middleware = (target, ws = true) => createProxyMiddleware({ - target: "http://localhost:8080" + basePath + target, + target: 'http://localhost:8080' + basePath + target, changeOrigin: true, ws, }); @@ -36,34 +37,34 @@ const middleware = (target, ws = true) => // Start with an initial build esbuild .context({ - logLevel: "info", - entryPoints: ["src/index.tsx"], - publicPath: "/", + logLevel: 'info', + entryPoints: ['src/index.tsx'], + publicPath: '/', bundle: true, banner: { js: ' (() => new EventSource("http://localhost:3001/dev").onmessage = () => location.reload())();', }, loader: { - ".js": "jsx", - ".svg": "file", - ".png": "file", - ".woff": "dataurl", - ".woff2": "dataurl", - ".ttf": "dataurl", - ".eot": "dataurl", + '.js': 'jsx', + '.svg': 'file', + '.png': 'file', + '.woff': 'dataurl', + '.woff2': 'dataurl', + '.ttf': 'dataurl', + '.eot': 'dataurl', }, - assetNames: "[dir]/[name]-[hash]", - target: ["chrome58"], + assetNames: '[dir]/[name]-[hash]', + target: ['chrome58'], minify: false, keepNames: true, sourcemap: true, - sourceRoot: "src", - outdir: "builder/dev/build", + sourceRoot: 'src', + outdir: 'builder/dev/build', }) .then(async (builder) => { await builder.rebuild(); // region Copy public files to build - fsExtra.copySync("./src/static/ext", buildPath + "/static/ext", { + fsExtra.copySync('./src/static/ext', buildPath + '/static/ext', { recursive: true, overwrite: true, }); @@ -74,7 +75,7 @@ esbuild && !(path.endsWith('.js') || path.endsWith('.jsx') || path.endsWith('.ts') || path.endsWith('.tsx')), }) .on( - "all", + 'all', debounce(() => { const start = new Date().getTime(); // eslint-disable-next-line no-console @@ -87,7 +88,7 @@ esbuild console.log( `[HOT RELOAD] Rebuild done in ${time} ms, updating frontend`, ); - clients.forEach((res) => res.write("data: update\n\n")); + clients.forEach(res => res.write('data: update\n\n')); clients.length = 0; }) .catch((error) => { @@ -98,42 +99,42 @@ esbuild ); // Start a dev web server const app = express(); - app.get("/dev", (req, res) => { + app.get('/dev', (req, res) => { return clients.push( res.writeHead(200, { - "Content-Type": "text/event-stream", - "Cache-Control": "no-cache", - "Access-Control-Allow-Origin": "*", - Connection: "keep-alive", + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + 'Access-Control-Allow-Origin': '*', + 'Connection': 'keep-alive', }), ); }); - app.set("trust proxy", 1); - app.use("/api", middleware("/api")); - app.use("/login", middleware("/login")); - app.use("/logout", middleware("/logout")); - app.use("/oauth2", middleware("/oauth2")); - app.use("/saml2", middleware("/saml2")); + app.set('trust proxy', 1); + app.use('/api', middleware('/api')); + app.use('/login', middleware('/login')); + app.use('/logout', middleware('/logout')); + app.use('/oauth2', middleware('/oauth2')); + app.use('/saml2', middleware('/saml2')); app.use( basePath + `/static`, - express.static(path.join(__dirname, "./build/static")), + express.static(path.join(__dirname, './build/static')), ); - app.use(`/css`, express.static(path.join(__dirname, "./build"))); - app.use(`/js`, express.static(path.join(__dirname, "./build"))); - app.get("*", (req, res) => { - const data = readFileSync(`${__dirname}/index.html`, "utf8"); + app.use(`/css`, express.static(path.join(__dirname, './build'))); + app.use(`/js`, express.static(path.join(__dirname, './build'))); + app.get('*', (req, res) => { + const data = readFileSync(`${__dirname}/index.html`, 'utf8'); const withOptionValued = data .replace(/%BASE_PATH%/g, basePath) - .replace(/%APP_TITLE%/g, "OpenBAS Dev") - .replace(/%APP_DESCRIPTION%/g, "OpenBAS Development platform") + .replace(/%APP_TITLE%/g, 'OpenBAS Dev') + .replace(/%APP_DESCRIPTION%/g, 'OpenBAS Development platform') .replace(/%APP_FAVICON%/g, `${basePath}/static/ext/favicon.png`) .replace(/%APP_MANIFEST%/g, `${basePath}/static/ext/manifest.json`); res.header( - "Cache-Control", - "private, no-cache, no-store, must-revalidate", + 'Cache-Control', + 'private, no-cache, no-store, must-revalidate', ); - res.header("Expires", "-1"); - res.header("Pragma", "no-cache"); + res.header('Expires', '-1'); + res.header('Pragma', 'no-cache'); return res.send(withOptionValued); }); app.listen(3001); diff --git a/openbas-front/builder/prod/prod.js b/openbas-front/builder/prod/prod.js index 94dede9b36..1c74360dbe 100644 --- a/openbas-front/builder/prod/prod.js +++ b/openbas-front/builder/prod/prod.js @@ -1,6 +1,7 @@ +import fs from 'node:fs'; + import { build } from 'esbuild'; import fsExtra from 'fs-extra/esm'; -import fs from 'node:fs'; const buildPath = './builder/prod/build/'; build({ @@ -36,12 +37,12 @@ build({ // region Generate index.html const cssStaticFiles = fs.readdirSync(buildPath + 'static/css'); const cssLinks = cssStaticFiles.map( - (f) => ``, + f => ``, ); const cssImport = cssLinks.join('\n'); const jsStaticFiles = fs.readdirSync(buildPath + 'static/js'); const jsLinks = jsStaticFiles.map( - (f) => ``, + f => ``, ); const jsImport = jsLinks.join('\n'); const indexHtml = ` diff --git a/openbas-front/i18n-checker.js b/openbas-front/i18n-checker.js index b2e298e872..67c49ae3a4 100644 --- a/openbas-front/i18n-checker.js +++ b/openbas-front/i18n-checker.js @@ -1,7 +1,8 @@ /* eslint-disable no-underscore-dangle */ import fs from 'node:fs'; -import { fileURLToPath } from 'url'; + import path from 'path'; +import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); diff --git a/openbas-front/src/__tests__/App.test.tsx b/openbas-front/src/__tests__/App.test.tsx index d46169e9b1..2f7a135c18 100644 --- a/openbas-front/src/__tests__/App.test.tsx +++ b/openbas-front/src/__tests__/App.test.tsx @@ -1,6 +1,6 @@ -import { act, cleanup, render } from '@testing-library/react'; -import { describe, afterEach, it, expect } from 'vitest'; import { StyledEngineProvider } from '@mui/material/styles'; +import { act, cleanup, render } from '@testing-library/react'; +import { afterEach, describe, expect, it } from 'vitest'; describe('App', () => { afterEach(cleanup); diff --git a/openbas-front/src/actions/Application.js b/openbas-front/src/actions/Application.js index c9382eca37..98fad4aea6 100644 --- a/openbas-front/src/actions/Application.js +++ b/openbas-front/src/actions/Application.js @@ -1,13 +1,14 @@ import { FORM_ERROR } from 'final-form'; + import * as Constants from '../constants/ActionTypes'; -import * as schema from './Schema'; import { getReferential, postReferential, putReferential, simpleCall } from '../utils/Action'; +import * as schema from './Schema'; export const fetchPlatformParameters = () => (dispatch) => { return getReferential(schema.platformParameters, '/api/settings')(dispatch); }; -export const updatePlatformParameters = (data) => (dispatch) => { +export const updatePlatformParameters = data => (dispatch) => { return putReferential( schema.platformParameters, '/api/settings', @@ -15,7 +16,7 @@ export const updatePlatformParameters = (data) => (dispatch) => { )(dispatch); }; -export const updatePlatformPolicies = (data) => (dispatch) => { +export const updatePlatformPolicies = data => (dispatch) => { return putReferential( schema.platformParameters, '/api/settings/policies', @@ -23,7 +24,7 @@ export const updatePlatformPolicies = (data) => (dispatch) => { )(dispatch); }; -export const updatePlatformEnterpriseEditionParameters = (data) => (dispatch) => { +export const updatePlatformEnterpriseEditionParameters = data => (dispatch) => { return putReferential( schema.platformParameters, '/api/settings/enterprise_edition', @@ -31,7 +32,7 @@ export const updatePlatformEnterpriseEditionParameters = (data) => (dispatch) => )(dispatch); }; -export const updatePlatformWhitemarkParameters = (data) => (dispatch) => { +export const updatePlatformWhitemarkParameters = data => (dispatch) => { return putReferential( schema.platformParameters, '/api/settings/platform_whitemark', @@ -39,7 +40,7 @@ export const updatePlatformWhitemarkParameters = (data) => (dispatch) => { )(dispatch); }; -export const updatePlatformLightParameters = (data) => (dispatch) => { +export const updatePlatformLightParameters = data => (dispatch) => { return putReferential( schema.platformParameters, '/api/settings/theme/light', @@ -47,7 +48,7 @@ export const updatePlatformLightParameters = (data) => (dispatch) => { )(dispatch); }; -export const updatePlatformDarkParameters = (data) => (dispatch) => { +export const updatePlatformDarkParameters = data => (dispatch) => { return putReferential( schema.platformParameters, '/api/settings/theme/dark', @@ -81,7 +82,7 @@ export const resetPassword = (token, values) => (dispatch) => { }); }; -export const validateResetToken = (token) => (dispatch) => { +export const validateResetToken = token => (dispatch) => { return getReferential(null, `/api/reset/${token}`)(dispatch); }; @@ -111,7 +112,7 @@ export const checkKerberos = () => (dispatch) => { export const fetchMe = () => (dispatch) => { const ref = getReferential(schema.user, '/api/me')(dispatch); - return ref.then((data) => dispatch({ type: Constants.IDENTITY_LOGIN_SUCCESS, payload: data })); + return ref.then(data => dispatch({ type: Constants.IDENTITY_LOGIN_SUCCESS, payload: data })); }; export const logout = () => (dispatch) => { diff --git a/openbas-front/src/actions/AskAI.js b/openbas-front/src/actions/AskAI.js index c6857df9f9..c2889bde63 100644 --- a/openbas-front/src/actions/AskAI.js +++ b/openbas-front/src/actions/AskAI.js @@ -1,4 +1,5 @@ import { fetchEventSource } from '@microsoft/fetch-event-source'; + import { buildUri } from '../utils/Action'; /** @@ -14,7 +15,7 @@ export const askAI = async (uri, input, eventCallback) => { method: 'POST', body: JSON.stringify(input), headers: { - Accept: 'text/event-stream', + 'Accept': 'text/event-stream', 'Content-Type': 'application/json', }, onmessage(event) { diff --git a/openbas-front/src/actions/AttackPattern.ts b/openbas-front/src/actions/AttackPattern.ts index f4ab5963a3..227b7380c2 100644 --- a/openbas-front/src/actions/AttackPattern.ts +++ b/openbas-front/src/actions/AttackPattern.ts @@ -1,7 +1,8 @@ import { Dispatch } from 'redux'; -import * as schema from './Schema'; + import { delReferential, getReferential, postReferential, putReferential, simpleCall, simplePostCall } from '../utils/Action'; import type { AttackPattern, AttackPatternCreateInput, AttackPatternUpdateInput, SearchPaginationInput } from '../utils/api-types'; +import * as schema from './Schema'; const ATTACK_PATTERN_URI = '/api/attack_patterns'; diff --git a/openbas-front/src/actions/Challenge.js b/openbas-front/src/actions/Challenge.js index 1e291feb51..0bdac43a08 100644 --- a/openbas-front/src/actions/Challenge.js +++ b/openbas-front/src/actions/Challenge.js @@ -1,4 +1,5 @@ import { schema } from 'normalizr'; + import { delReferential, getReferential, postReferential, putReferential } from '../utils/Action'; import { challengesReader } from './Schema'; @@ -14,12 +15,12 @@ export const fetchChallenges = () => (dispatch) => { return getReferential(arrayOfChallenges, uri)(dispatch); }; -export const fetchExerciseChallenges = (exerciseId) => (dispatch) => { +export const fetchExerciseChallenges = exerciseId => (dispatch) => { const uri = `/api/exercises/${exerciseId}/challenges`; return getReferential(arrayOfChallenges, uri)(dispatch); }; -export const fetchChallenge = (challengeId) => (dispatch) => { +export const fetchChallenge = challengeId => (dispatch) => { const uri = `/api/challenges/${challengeId}`; return getReferential(challengeId, uri)(dispatch); }; @@ -29,17 +30,17 @@ export const updateChallenge = (challengeId, data) => (dispatch) => { return putReferential(challengeId, uri, data)(dispatch); }; -export const addChallenge = (data) => (dispatch) => postReferential(challenge, '/api/challenges', data)(dispatch); +export const addChallenge = data => dispatch => postReferential(challenge, '/api/challenges', data)(dispatch); -export const tryChallenge = (challengeId, data) => (dispatch) => postReferential(null, `/api/challenges/${challengeId}/try`, data)(dispatch); +export const tryChallenge = (challengeId, data) => dispatch => postReferential(null, `/api/challenges/${challengeId}/try`, data)(dispatch); -export const validateChallenge = (exerciseId, challengeId, userId, data) => (dispatch) => postReferential( +export const validateChallenge = (exerciseId, challengeId, userId, data) => dispatch => postReferential( challengesReader, `/api/player/challenges/${exerciseId}/${challengeId}/validate?userId=${userId}`, data, )(dispatch); -export const deleteChallenge = (channelId) => (dispatch) => { +export const deleteChallenge = channelId => (dispatch) => { const uri = `/api/challenges/${channelId}`; return delReferential(uri, 'challenges', channelId)(dispatch); }; @@ -56,7 +57,7 @@ export const fetchObserverChallenges = (exerciseId, userId) => (dispatch) => { // -- SCENARIOS -- -export const fetchScenarioChallenges = (scenarioId) => (dispatch) => { +export const fetchScenarioChallenges = scenarioId => (dispatch) => { const uri = `/api/scenarios/${scenarioId}/challenges`; return getReferential(arrayOfChallenges, uri)(dispatch); }; diff --git a/openbas-front/src/actions/Collector.js b/openbas-front/src/actions/Collector.js index e7eaebe27a..17695b40ae 100644 --- a/openbas-front/src/actions/Collector.js +++ b/openbas-front/src/actions/Collector.js @@ -1,12 +1,12 @@ +import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, putReferential, postReferential, delReferential, simplePostCall } from '../utils/Action'; export const fetchCollectors = () => (dispatch) => { const uri = '/api/collectors'; return getReferential(schema.arrayOfCollectors, uri)(dispatch); }; -export const fetchCollector = (collectorId) => (dispatch) => { +export const fetchCollector = collectorId => (dispatch) => { const uri = `/api/collectors/${collectorId}`; return getReferential(schema.collector, uri)(dispatch); }; @@ -22,12 +22,12 @@ export const updateCollector = (collectorId, data) => (dispatch) => { return putReferential(schema.collector, uri, data)(dispatch); }; -export const addCollector = (data) => (dispatch) => { +export const addCollector = data => (dispatch) => { const uri = '/api/collectors'; return postReferential(schema.collector, uri, data)(dispatch); }; -export const deleteCollector = (collectorId) => (dispatch) => { +export const deleteCollector = collectorId => (dispatch) => { const uri = `/api/collectors/${collectorId}`; return delReferential(uri, 'collectors', collectorId)(dispatch); }; diff --git a/openbas-front/src/actions/Comcheck.js b/openbas-front/src/actions/Comcheck.js index ecaa1bc90f..fb3fe3321f 100644 --- a/openbas-front/src/actions/Comcheck.js +++ b/openbas-front/src/actions/Comcheck.js @@ -1,7 +1,7 @@ +import { delReferential, getReferential, postReferential } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, postReferential, delReferential } from '../utils/Action'; -export const fetchComchecks = (exerciseId) => (dispatch) => { +export const fetchComchecks = exerciseId => (dispatch) => { const uri = `/api/exercises/${exerciseId}/comchecks`; return getReferential(schema.arrayOfComchecks, uri)(dispatch); }; @@ -26,7 +26,7 @@ export const fetchComcheckStatuses = (exerciseId, comcheckId) => (dispatch) => { return getReferential(schema.arrayOfComcheckStatuses, uri)(dispatch); }; -export const fetchComcheckStatus = (statusId) => (dispatch) => { +export const fetchComcheckStatus = statusId => (dispatch) => { const uri = `/api/comcheck/${statusId}`; return getReferential(schema.comcheckStatus, uri)(dispatch); }; diff --git a/openbas-front/src/actions/Communication.js b/openbas-front/src/actions/Communication.js index db2d27a1df..54a261fb65 100644 --- a/openbas-front/src/actions/Communication.js +++ b/openbas-front/src/actions/Communication.js @@ -1,7 +1,7 @@ -import * as schema from './Schema'; import { getReferential } from '../utils/Action'; +import * as schema from './Schema'; -export const fetchExerciseCommunications = (exerciseId) => (dispatch) => { +export const fetchExerciseCommunications = exerciseId => (dispatch) => { const uri = `/api/exercises/${exerciseId}/communications`; return getReferential(schema.arrayOfCommunications, uri)(dispatch); }; diff --git a/openbas-front/src/actions/Document.js b/openbas-front/src/actions/Document.js index 4e4dafcbac..3d56f39b56 100644 --- a/openbas-front/src/actions/Document.js +++ b/openbas-front/src/actions/Document.js @@ -1,9 +1,9 @@ +import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, postReferential, delReferential, putReferential, simplePostCall } from '../utils/Action'; -export const fetchDocuments = () => (dispatch) => getReferential(schema.arrayOfDocuments, '/api/documents')(dispatch); +export const fetchDocuments = () => dispatch => getReferential(schema.arrayOfDocuments, '/api/documents')(dispatch); -export const fetchDocument = (documentId) => (dispatch) => getReferential(schema.document, `/api/documents/${documentId}`)(dispatch); +export const fetchDocument = documentId => dispatch => getReferential(schema.document, `/api/documents/${documentId}`)(dispatch); export const searchDocuments = (paginationInput) => { const data = paginationInput; @@ -11,23 +11,23 @@ export const searchDocuments = (paginationInput) => { return simplePostCall(uri, data); }; -export const addDocument = (data) => (dispatch) => { +export const addDocument = data => (dispatch) => { const uri = '/api/documents'; return postReferential(schema.document, uri, data)(dispatch); }; -export const updateDocument = (documentId, data) => (dispatch) => putReferential( +export const updateDocument = (documentId, data) => dispatch => putReferential( schema.document, `/api/documents/${documentId}`, data, )(dispatch); -export const deleteDocument = (documentId) => (dispatch) => { +export const deleteDocument = documentId => (dispatch) => { const uri = `/api/documents/${documentId}`; return delReferential(uri, 'documents', documentId)(dispatch); }; -export const fetchPlayerDocuments = (exerciseId, userId = null) => (dispatch) => getReferential( +export const fetchPlayerDocuments = (exerciseId, userId = null) => dispatch => getReferential( schema.arrayOfDocuments, `/api/player/${exerciseId}/documents${userId ? `?userId=${userId}` : ''}`, )(dispatch); diff --git a/openbas-front/src/actions/Dryinject.js b/openbas-front/src/actions/Dryinject.js index c86a62b53c..9250914b0c 100644 --- a/openbas-front/src/actions/Dryinject.js +++ b/openbas-front/src/actions/Dryinject.js @@ -1,13 +1,13 @@ -import * as schema from './Schema'; import { getReferential, postReferential } from '../utils/Action'; +import * as schema from './Schema'; export const fetchDryinjects = (exerciseId, dryrunId) => (dispatch) => { const uri = `/api/exercises/${exerciseId}/dryruns/${dryrunId}/dryinjects`; return getReferential(schema.arrayOfDryinjects, uri)(dispatch); }; -export const dryinjectDone = (dryinjectId) => (dispatch) => { - const data = { status: 'SUCCESS', message: "['Manual validation']" }; +export const dryinjectDone = dryinjectId => (dispatch) => { + const data = { status: 'SUCCESS', message: '[\'Manual validation\']' }; const uri = `/api/dryinjects/${dryinjectId}/status`; return postReferential(null, uri, data)(dispatch); }; diff --git a/openbas-front/src/actions/Dryrun.js b/openbas-front/src/actions/Dryrun.js index 7cc60a474d..47fd520aa7 100644 --- a/openbas-front/src/actions/Dryrun.js +++ b/openbas-front/src/actions/Dryrun.js @@ -1,7 +1,7 @@ +import { delReferential, getReferential, postReferential } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, postReferential, delReferential } from '../utils/Action'; -export const fetchDryruns = (exerciseId) => (dispatch) => { +export const fetchDryruns = exerciseId => (dispatch) => { const uri = `/api/exercises/${exerciseId}/dryruns`; return getReferential(schema.arrayOfDryruns, uri)(dispatch); }; diff --git a/openbas-front/src/actions/Evaluation.js b/openbas-front/src/actions/Evaluation.js index 7285a7dc94..80017a8066 100644 --- a/openbas-front/src/actions/Evaluation.js +++ b/openbas-front/src/actions/Evaluation.js @@ -1,5 +1,5 @@ -import * as schema from './Schema'; import { getReferential, postReferential, putReferential } from '../utils/Action'; +import * as schema from './Schema'; export const fetchExerciseEvaluations = (exerciseId, objectiveId) => (dispatch) => { const uri = `/api/exercises/${exerciseId}/objectives/${objectiveId}/evaluations`; diff --git a/openbas-front/src/actions/Executor.js b/openbas-front/src/actions/Executor.js index 29e7bfcd7f..26171be760 100644 --- a/openbas-front/src/actions/Executor.js +++ b/openbas-front/src/actions/Executor.js @@ -1,12 +1,12 @@ -import * as schema from './Schema'; import { getReferential, simplePostCall } from '../utils/Action'; +import * as schema from './Schema'; export const fetchExecutors = () => (dispatch) => { const uri = '/api/executors'; return getReferential(schema.arrayOfExecutors, uri)(dispatch); }; -export const fetchExecutor = (executorId) => (dispatch) => { +export const fetchExecutor = executorId => (dispatch) => { const uri = `/api/executors/${executorId}`; return getReferential(schema.executor, uri)(dispatch); }; diff --git a/openbas-front/src/actions/Exercise.js b/openbas-front/src/actions/Exercise.js index e09978c243..e02867b0bd 100644 --- a/openbas-front/src/actions/Exercise.js +++ b/openbas-front/src/actions/Exercise.js @@ -1,98 +1,98 @@ +import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, putReferential, postReferential, delReferential, simplePostCall } from '../utils/Action'; -export const fetchExercises = () => (dispatch) => getReferential(schema.arrayOfExercises, '/api/exercises')(dispatch); +export const fetchExercises = () => dispatch => getReferential(schema.arrayOfExercises, '/api/exercises')(dispatch); -export const searchExercises = (paginationInput) => simplePostCall('/api/exercises/search', paginationInput); +export const searchExercises = paginationInput => simplePostCall('/api/exercises/search', paginationInput); -export const fetchExercise = (exerciseId) => (dispatch) => getReferential(schema.exercise, `/api/exercises/${exerciseId}`)(dispatch); +export const fetchExercise = exerciseId => dispatch => getReferential(schema.exercise, `/api/exercises/${exerciseId}`)(dispatch); -export const fetchExerciseInjectExpectations = (exerciseId) => (dispatch) => getReferential( +export const fetchExerciseInjectExpectations = exerciseId => dispatch => getReferential( schema.arrayOfInjectexpectations, `/api/exercises/${exerciseId}/expectations`, )(dispatch); -export const addExercise = (data) => (dispatch) => postReferential(schema.exercise, '/api/exercises', data)(dispatch); +export const addExercise = data => dispatch => postReferential(schema.exercise, '/api/exercises', data)(dispatch); -export const duplicateExercise = (exerciseId) => (dispatch) => postReferential(schema.exercise, `/api/exercises/${exerciseId}`, null)(dispatch); +export const duplicateExercise = exerciseId => dispatch => postReferential(schema.exercise, `/api/exercises/${exerciseId}`, null)(dispatch); -export const updateExercise = (exerciseId, data) => (dispatch) => putReferential( +export const updateExercise = (exerciseId, data) => dispatch => putReferential( schema.exercise, `/api/exercises/${exerciseId}`, data, )(dispatch); -export const updateExerciseStartDate = (exerciseId, data) => (dispatch) => putReferential( +export const updateExerciseStartDate = (exerciseId, data) => dispatch => putReferential( schema.exercise, `/api/exercises/${exerciseId}/start_date`, data, )(dispatch); -export const updateExerciseLessons = (exerciseId, data) => (dispatch) => putReferential( +export const updateExerciseLessons = (exerciseId, data) => dispatch => putReferential( schema.exercise, `/api/exercises/${exerciseId}/lessons`, data, )(dispatch); -export const fetchExerciseTeams = (exerciseId) => (dispatch) => { +export const fetchExerciseTeams = exerciseId => (dispatch) => { const uri = `/api/exercises/${exerciseId}/teams`; return getReferential(schema.arrayOfTeams, uri)(dispatch); }; -export const enableExerciseTeamPlayers = (exerciseId, teamId, data) => (dispatch) => putReferential( +export const enableExerciseTeamPlayers = (exerciseId, teamId, data) => dispatch => putReferential( schema.exercise, `/api/exercises/${exerciseId}/teams/${teamId}/players/enable`, data, )(dispatch); -export const disableExerciseTeamPlayers = (exerciseId, teamId, data) => (dispatch) => putReferential( +export const disableExerciseTeamPlayers = (exerciseId, teamId, data) => dispatch => putReferential( schema.exercise, `/api/exercises/${exerciseId}/teams/${teamId}/players/disable`, data, )(dispatch); -export const addExerciseTeamPlayers = (exerciseId, teamId, data) => (dispatch) => putReferential( +export const addExerciseTeamPlayers = (exerciseId, teamId, data) => dispatch => putReferential( schema.exercise, `/api/exercises/${exerciseId}/teams/${teamId}/players/add`, data, )(dispatch); -export const removeExerciseTeamPlayers = (exerciseId, teamId, data) => (dispatch) => putReferential( +export const removeExerciseTeamPlayers = (exerciseId, teamId, data) => dispatch => putReferential( schema.exercise, `/api/exercises/${exerciseId}/teams/${teamId}/players/remove`, data, )(dispatch); -export const updateExerciseTags = (exerciseId, data) => (dispatch) => putReferential( +export const updateExerciseTags = (exerciseId, data) => dispatch => putReferential( schema.exercise, `/api/exercises/${exerciseId}/tags`, data, )(dispatch); -export const updateExerciseStatus = (exerciseId, status) => (dispatch) => putReferential( +export const updateExerciseStatus = (exerciseId, status) => dispatch => putReferential( schema.exercise, `/api/exercises/${exerciseId}/status`, status, )(dispatch); -export const updateInjectExpectation = (injectExpectationId, data) => (dispatch) => putReferential( +export const updateInjectExpectation = (injectExpectationId, data) => dispatch => putReferential( schema.injectexpectation, `/api/expectations/${injectExpectationId}`, data, )(dispatch); -export const deleteInjectExpectationResult = (injectExpectationId, sourceId) => (dispatch) => putReferential( +export const deleteInjectExpectationResult = (injectExpectationId, sourceId) => dispatch => putReferential( schema.injectexpectation, `/api/expectations/${injectExpectationId}/${sourceId}/delete`, )(dispatch); -export const deleteExercise = (exerciseId) => (dispatch) => delReferential( +export const deleteExercise = exerciseId => dispatch => delReferential( `/api/exercises/${exerciseId}`, 'exercises', exerciseId, )(dispatch); -export const importingExercise = (data) => (dispatch) => { +export const importingExercise = data => (dispatch) => { const uri = '/api/exercises/import'; return postReferential(null, uri, data)(dispatch); }; diff --git a/openbas-front/src/actions/Grant.js b/openbas-front/src/actions/Grant.js index 993670dada..f0a4a5f49d 100644 --- a/openbas-front/src/actions/Grant.js +++ b/openbas-front/src/actions/Grant.js @@ -1,5 +1,5 @@ +import { delReferential, postReferential } from '../utils/Action'; import * as schema from './Schema'; -import { postReferential, delReferential } from '../utils/Action'; export const addGrant = (groupId, data) => (dispatch) => { const uri = `/api/groups/${groupId}/grants`; diff --git a/openbas-front/src/actions/Group.js b/openbas-front/src/actions/Group.js index 4d5959b332..08524114cb 100644 --- a/openbas-front/src/actions/Group.js +++ b/openbas-front/src/actions/Group.js @@ -1,9 +1,9 @@ +import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, postReferential, putReferential, delReferential, simplePostCall } from '../utils/Action'; -export const fetchGroups = () => (dispatch) => getReferential(schema.arrayOfGroups, '/api/groups')(dispatch); +export const fetchGroups = () => dispatch => getReferential(schema.arrayOfGroups, '/api/groups')(dispatch); -export const fetchGroup = (groupId) => (dispatch) => getReferential(schema.group, `/api/groups/${groupId}`)(dispatch); +export const fetchGroup = groupId => dispatch => getReferential(schema.group, `/api/groups/${groupId}`)(dispatch); export const searchGroups = (paginationInput) => { const data = paginationInput; @@ -11,14 +11,14 @@ export const searchGroups = (paginationInput) => { return simplePostCall(uri, data); }; -export const addGroup = (data) => (dispatch) => postReferential(schema.group, '/api/groups', data)(dispatch); +export const addGroup = data => dispatch => postReferential(schema.group, '/api/groups', data)(dispatch); -export const updateGroupInformation = (groupId, data) => (dispatch) => putReferential( +export const updateGroupInformation = (groupId, data) => dispatch => putReferential( schema.group, `/api/groups/${groupId}/information`, data, )(dispatch); -export const updateGroupUsers = (groupId, data) => (dispatch) => putReferential(schema.group, `/api/groups/${groupId}/users`, data)(dispatch); +export const updateGroupUsers = (groupId, data) => dispatch => putReferential(schema.group, `/api/groups/${groupId}/users`, data)(dispatch); -export const deleteGroup = (groupId) => (dispatch) => delReferential(`/api/groups/${groupId}`, 'groups', groupId)(dispatch); +export const deleteGroup = groupId => dispatch => delReferential(`/api/groups/${groupId}`, 'groups', groupId)(dispatch); diff --git a/openbas-front/src/actions/Inject.js b/openbas-front/src/actions/Inject.js index 5925724c61..f3e06ba5a6 100644 --- a/openbas-front/src/actions/Inject.js +++ b/openbas-front/src/actions/Inject.js @@ -1,16 +1,16 @@ -import * as schema from './Schema'; import { bulkDeleteReferential, delReferential, getReferential, postReferential, putReferential } from '../utils/Action'; +import * as schema from './Schema'; // -- INJECTS -- -export const fetchInject = (injectId) => (dispatch) => { +export const fetchInject = injectId => (dispatch) => { const uri = `/api/injects/${injectId}`; return getReferential(schema.inject, uri)(dispatch); }; // -- EXERCISES -- -export const fetchExerciseInjects = (exerciseId) => (dispatch) => { +export const fetchExerciseInjects = exerciseId => (dispatch) => { const uri = `/api/exercises/${exerciseId}/injects`; return getReferential(schema.arrayOfInjects, uri)(dispatch); }; @@ -87,7 +87,7 @@ export const duplicateInjectForScenario = (scenarioId, injectId) => (dispatch) = return postReferential(schema.inject, uri, null)(dispatch); }; -export const fetchScenarioInjects = (scenarioId) => (dispatch) => { +export const fetchScenarioInjects = scenarioId => (dispatch) => { const uri = `/api/scenarios/${scenarioId}/injects`; return getReferential(schema.arrayOfInjects, uri)(dispatch); }; diff --git a/openbas-front/src/actions/InjectorContracts.js b/openbas-front/src/actions/InjectorContracts.js index 9e38856a6d..9ba64d354e 100644 --- a/openbas-front/src/actions/InjectorContracts.js +++ b/openbas-front/src/actions/InjectorContracts.js @@ -1,7 +1,7 @@ +import { delReferential, getReferential, postReferential, putReferential, simpleCall, simplePostCall } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, putReferential, postReferential, delReferential, simplePostCall, simpleCall } from '../utils/Action'; -export const fetchInjectorContract = (injectorContractId) => (dispatch) => { +export const fetchInjectorContract = injectorContractId => (dispatch) => { const uri = `/api/injector_contracts/${injectorContractId}`; return getReferential(schema.injectorContract, uri)(dispatch); }; @@ -32,12 +32,12 @@ export const updateInjectorContractMapping = (injectorContractId, data) => (disp return putReferential(schema.injectorContract, uri, data)(dispatch); }; -export const addInjectorContract = (data) => (dispatch) => { +export const addInjectorContract = data => (dispatch) => { const uri = '/api/injector_contracts'; return postReferential(schema.injectorContract, uri, data)(dispatch); }; -export const deleteInjectorContract = (injectorContractId) => (dispatch) => { +export const deleteInjectorContract = injectorContractId => (dispatch) => { const uri = `/api/injector_contracts/${injectorContractId}`; return delReferential(uri, 'injectorcontracts', injectorContractId)(dispatch); }; diff --git a/openbas-front/src/actions/Injectors.js b/openbas-front/src/actions/Injectors.js index d5f24cbe10..f18c6fc666 100644 --- a/openbas-front/src/actions/Injectors.js +++ b/openbas-front/src/actions/Injectors.js @@ -1,12 +1,12 @@ +import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, putReferential, postReferential, delReferential, simplePostCall } from '../utils/Action'; export const fetchInjectors = () => (dispatch) => { const uri = '/api/injectors'; return getReferential(schema.arrayOfInjectors, uri)(dispatch); }; -export const fetchInjector = (injectorId) => (dispatch) => { +export const fetchInjector = injectorId => (dispatch) => { const uri = `/api/injectors/${injectorId}`; return getReferential(schema.injector, uri)(dispatch); }; @@ -22,12 +22,12 @@ export const updateInjector = (injectorId, data) => (dispatch) => { return putReferential(schema.injector, uri, data)(dispatch); }; -export const addInjector = (data) => (dispatch) => { +export const addInjector = data => (dispatch) => { const uri = '/api/injectors'; return postReferential(schema.injector, uri, data)(dispatch); }; -export const deleteInjector = (injectorId) => (dispatch) => { +export const deleteInjector = injectorId => (dispatch) => { const uri = `/api/injectors/${injectorId}`; return delReferential(uri, 'injectors', injectorId)(dispatch); }; diff --git a/openbas-front/src/actions/KillChainPhase.js b/openbas-front/src/actions/KillChainPhase.js index 9460010491..13c6050453 100644 --- a/openbas-front/src/actions/KillChainPhase.js +++ b/openbas-front/src/actions/KillChainPhase.js @@ -1,5 +1,5 @@ +import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, putReferential, postReferential, delReferential, simplePostCall } from '../utils/Action'; export const fetchKillChainPhases = () => (dispatch) => { const uri = '/api/kill_chain_phases'; @@ -17,12 +17,12 @@ export const updateKillChainPhase = (killChainPhaseId, data) => (dispatch) => { return putReferential(schema.killChainPhase, uri, data)(dispatch); }; -export const addKillChainPhase = (data) => (dispatch) => { +export const addKillChainPhase = data => (dispatch) => { const uri = '/api/kill_chain_phases'; return postReferential(schema.killChainPhase, uri, data)(dispatch); }; -export const deleteKillChainPhase = (killChainPhaseId) => (dispatch) => { +export const deleteKillChainPhase = killChainPhaseId => (dispatch) => { const uri = `/api/kill_chain_phases/${killChainPhaseId}`; return delReferential(uri, 'killchainphases', killChainPhaseId)(dispatch); }; diff --git a/openbas-front/src/actions/Lessons.js b/openbas-front/src/actions/Lessons.js index dfb7b97384..3351c0ebe8 100644 --- a/openbas-front/src/actions/Lessons.js +++ b/openbas-front/src/actions/Lessons.js @@ -1,5 +1,5 @@ -import * as schema from './Schema'; import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; +import * as schema from './Schema'; export const fetchLessonsTemplates = () => (dispatch) => { const uri = '/api/lessons_templates'; @@ -17,17 +17,17 @@ export const updateLessonsTemplate = (lessonsTemplateId, data) => (dispatch) => return putReferential(schema.lessonsTemplate, uri, data)(dispatch); }; -export const addLessonsTemplate = (data) => (dispatch) => { +export const addLessonsTemplate = data => (dispatch) => { const uri = '/api/lessons_templates'; return postReferential(schema.lessonsTemplate, uri, data)(dispatch); }; -export const deleteLessonsTemplate = (lessonsTemplateId) => (dispatch) => { +export const deleteLessonsTemplate = lessonsTemplateId => (dispatch) => { const uri = `/api/lessons_templates/${lessonsTemplateId}`; return delReferential(uri, 'lessons_templates', lessonsTemplateId)(dispatch); }; -export const fetchLessonsTemplateCategories = (lessonsTemplateId) => (dispatch) => { +export const fetchLessonsTemplateCategories = lessonsTemplateId => (dispatch) => { const uri = `/api/lessons_templates/${lessonsTemplateId}/lessons_template_categories`; return getReferential( schema.arrayOfLessonsTemplateCategories, @@ -54,7 +54,7 @@ export const deleteLessonsTemplateCategory = (lessonsTemplateId, lessonsTemplate )(dispatch); }; -export const fetchLessonsTemplateQuestions = (lessonsTemplateId) => (dispatch) => { +export const fetchLessonsTemplateQuestions = lessonsTemplateId => (dispatch) => { const uri = `/api/lessons_templates/${lessonsTemplateId}/lessons_template_questions`; return getReferential( schema.arrayOfLessonsTemplateQuestions, diff --git a/openbas-front/src/actions/Log.js b/openbas-front/src/actions/Log.js index 6915680f35..e8ee9b7fcf 100644 --- a/openbas-front/src/actions/Log.js +++ b/openbas-front/src/actions/Log.js @@ -1,7 +1,7 @@ +import { delReferential, getReferential, postReferential, putReferential } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, putReferential, postReferential, delReferential } from '../utils/Action'; -export const fetchLogs = (exerciseId) => (dispatch) => { +export const fetchLogs = exerciseId => (dispatch) => { const uri = `/api/exercises/${exerciseId}/logs`; return getReferential(schema.arrayOfLogs, uri)(dispatch); }; diff --git a/openbas-front/src/actions/Mitigation.js b/openbas-front/src/actions/Mitigation.js index e447ddef65..51915d5714 100644 --- a/openbas-front/src/actions/Mitigation.js +++ b/openbas-front/src/actions/Mitigation.js @@ -1,5 +1,5 @@ +import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, putReferential, postReferential, delReferential, simplePostCall } from '../utils/Action'; export const fetchMitigations = () => (dispatch) => { const uri = '/api/mitigations'; @@ -17,12 +17,12 @@ export const updateMitigation = (mitigationId, data) => (dispatch) => { return putReferential(schema.mitigation, uri, data)(dispatch); }; -export const addMitigation = (data) => (dispatch) => { +export const addMitigation = data => (dispatch) => { const uri = '/api/mitigations'; return postReferential(schema.mitigation, uri, data)(dispatch); }; -export const deleteMitigation = (mitigationId) => (dispatch) => { +export const deleteMitigation = mitigationId => (dispatch) => { const uri = `/api/mitigations/${mitigationId}`; return delReferential(uri, 'mitigations', mitigationId)(dispatch); }; diff --git a/openbas-front/src/actions/Objective.js b/openbas-front/src/actions/Objective.js index 340e71db21..c57f6120a5 100644 --- a/openbas-front/src/actions/Objective.js +++ b/openbas-front/src/actions/Objective.js @@ -1,7 +1,7 @@ -import * as schema from './Schema'; import { delReferential, getReferential, postReferential, putReferential } from '../utils/Action'; +import * as schema from './Schema'; -export const fetchExerciseObjectives = (exerciseId) => (dispatch) => { +export const fetchExerciseObjectives = exerciseId => (dispatch) => { const uri = `/api/exercises/${exerciseId}/objectives`; return getReferential(schema.arrayOfObjectives, uri)(dispatch); }; @@ -21,7 +21,7 @@ export const deleteExerciseObjective = (exerciseId, objectiveId) => (dispatch) = return delReferential(uri, 'objectives', objectiveId)(dispatch); }; -export const fetchScenarioObjectives = (scenarioId) => (dispatch) => { +export const fetchScenarioObjectives = scenarioId => (dispatch) => { const uri = `/api/scenarios/${scenarioId}/objectives`; return getReferential(schema.arrayOfObjectives, uri)(dispatch); }; diff --git a/openbas-front/src/actions/Organization.js b/openbas-front/src/actions/Organization.js index e8ea493d30..8b8310e974 100644 --- a/openbas-front/src/actions/Organization.js +++ b/openbas-front/src/actions/Organization.js @@ -1,17 +1,17 @@ -import * as schema from './Schema'; import { delReferential, getReferential, postReferential, putReferential } from '../utils/Action'; +import * as schema from './Schema'; -export const fetchOrganizations = () => (dispatch) => getReferential(schema.arrayOfOrganizations, '/api/organizations')(dispatch); +export const fetchOrganizations = () => dispatch => getReferential(schema.arrayOfOrganizations, '/api/organizations')(dispatch); -export const addOrganization = (data) => (dispatch) => postReferential(schema.organization, '/api/organizations', data)(dispatch); +export const addOrganization = data => dispatch => postReferential(schema.organization, '/api/organizations', data)(dispatch); -export const updateOrganization = (organizationId, data) => (dispatch) => putReferential( +export const updateOrganization = (organizationId, data) => dispatch => putReferential( schema.organization, `/api/organizations/${organizationId}`, data, )(dispatch); -export const deleteOrganization = (organizationId) => (dispatch) => delReferential( +export const deleteOrganization = organizationId => dispatch => delReferential( `/api/organizations/${organizationId}`, 'organizations', organizationId, diff --git a/openbas-front/src/actions/Payload.js b/openbas-front/src/actions/Payload.js index d54b772008..614b76b8e1 100644 --- a/openbas-front/src/actions/Payload.js +++ b/openbas-front/src/actions/Payload.js @@ -1,5 +1,5 @@ -import * as schema from './Schema'; import { delReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; +import * as schema from './Schema'; export const searchPayloads = (paginationInput) => { const data = paginationInput; @@ -12,17 +12,17 @@ export const updatePayload = (payloadId, data) => (dispatch) => { return putReferential(schema.payload, uri, data)(dispatch); }; -export const addPayload = (data) => (dispatch) => { +export const addPayload = data => (dispatch) => { const uri = '/api/payloads'; return postReferential(schema.payload, uri, data)(dispatch); }; -export const duplicatePayload = (payloadId) => (dispatch) => { +export const duplicatePayload = payloadId => (dispatch) => { const uri = `/api/payloads/${payloadId}/duplicate`; return postReferential(schema.payload, uri, {})(dispatch); }; -export const deletePayload = (payloadId) => (dispatch) => { +export const deletePayload = payloadId => (dispatch) => { const uri = `/api/payloads/${payloadId}`; return delReferential(uri, 'payloads', payloadId)(dispatch); }; diff --git a/openbas-front/src/actions/Schema.js b/openbas-front/src/actions/Schema.js index 9842311ab9..6e419b2b7c 100644 --- a/openbas-front/src/actions/Schema.js +++ b/openbas-front/src/actions/Schema.js @@ -276,7 +276,7 @@ user.define({ user_organization: organization }); const maps = (key, state) => state.referential.entities[key].asMutable({ deep: true }); const entities = (key, state) => Object.values(maps(key, state)); const entity = (id, key, state) => state.referential.entities[key][id]?.asMutable({ deep: true }); -const me = (state) => state.referential.entities.users[R.path(['logged', 'user'], state.app)]; +const me = state => state.referential.entities.users[R.path(['logged', 'user'], state.app)]; const getInjectWithParsedInjectorContractContent = (i) => { if (!i) { @@ -299,56 +299,56 @@ const getInjectsWithParsedInjectorContractContent = (injects) => { return injects.map(getInjectWithParsedInjectorContractContent); }; -export const storeHelper = (state) => ({ +export const storeHelper = state => ({ logged: () => state.app.logged, getMe: () => me(state), getMeTokens: () => entities('tokens', state).filter( - (t) => t.token_user === me(state)?.user_id, + t => t.token_user === me(state)?.user_id, ), getStatistics: () => state.referential.entities.statistics?.openbas, // exercises getExercises: () => entities('exercises', state), getExercisesMap: () => maps('exercises', state), - getExercise: (id) => entity(id, 'exercises', state), - getExerciseDryruns: (id) => entities('dryruns', state).filter((i) => i.dryrun_exercise === id), - getExerciseComchecks: (id) => entities('comchecks', state).filter((i) => i.comcheck_exercise === id), - getExerciseTeams: (id) => entities('teams', state).filter((i) => i.team_exercises?.includes(id)), - getExerciseVariables: (id) => entities('variables', state).filter((i) => i.variable_exercise === id), - getExerciseArticles: (id) => entities('articles', state).filter((i) => i.article_exercise === id), - getExerciseInjects: (id) => getInjectsWithParsedInjectorContractContent(entities('injects', state).filter((i) => i.inject_exercise === id)), - getExerciseCommunications: (id) => entities('communications', state).filter( - (i) => i.communication_exercise === id, + getExercise: id => entity(id, 'exercises', state), + getExerciseDryruns: id => entities('dryruns', state).filter(i => i.dryrun_exercise === id), + getExerciseComchecks: id => entities('comchecks', state).filter(i => i.comcheck_exercise === id), + getExerciseTeams: id => entities('teams', state).filter(i => i.team_exercises?.includes(id)), + getExerciseVariables: id => entities('variables', state).filter(i => i.variable_exercise === id), + getExerciseArticles: id => entities('articles', state).filter(i => i.article_exercise === id), + getExerciseInjects: id => getInjectsWithParsedInjectorContractContent(entities('injects', state).filter(i => i.inject_exercise === id)), + getExerciseCommunications: id => entities('communications', state).filter( + i => i.communication_exercise === id, ), - getExerciseObjectives: (id) => entities('objectives', state).filter((o) => o.objective_exercise === id), - getExerciseLogs: (id) => entities('logs', state).filter((l) => l.log_exercise === id), - getExerciseLessonsCategories: (id) => entities('lessonscategorys', state).filter( - (l) => l.lessons_category_exercise === id, + getExerciseObjectives: id => entities('objectives', state).filter(o => o.objective_exercise === id), + getExerciseLogs: id => entities('logs', state).filter(l => l.log_exercise === id), + getExerciseLessonsCategories: id => entities('lessonscategorys', state).filter( + l => l.lessons_category_exercise === id, ), - getExerciseLessonsQuestions: (id) => entities('lessonsquestions', state).filter( - (l) => l.lessons_question_exercise === id, + getExerciseLessonsQuestions: id => entities('lessonsquestions', state).filter( + l => l.lessons_question_exercise === id, ), - getExerciseLessonsAnswers: (exerciseId) => entities('lessonsanswers', state).filter( - (l) => l.lessons_answer_exercise === exerciseId, + getExerciseLessonsAnswers: exerciseId => entities('lessonsanswers', state).filter( + l => l.lessons_answer_exercise === exerciseId, ), getExerciseUserLessonsAnswers: (exerciseId, userId) => entities('lessonsanswers', state).filter( - (l) => l.lessons_answer_exercise === exerciseId - && l.lessons_answer_user === userId, + l => l.lessons_answer_exercise === exerciseId + && l.lessons_answer_user === userId, ), - getExerciseReports: (exerciseId) => entities('reports', state).filter((l) => l.report_exercise === exerciseId), + getExerciseReports: exerciseId => entities('reports', state).filter(l => l.report_exercise === exerciseId), // report - getReport: (id) => entity(id, 'reports', state), + getReport: id => entity(id, 'reports', state), // dryrun - getDryrun: (id) => entity(id, 'dryruns', state), - getDryrunInjects: (id) => entities('dryinjects', state).filter((i) => i.dryinject_dryrun === id), - getDryrunUsers: (id) => entities('users', state).filter((i) => (entity(id, 'dryruns', state) || {}).dryrun_users?.includes(i.user_id)), + getDryrun: id => entity(id, 'dryruns', state), + getDryrunInjects: id => entities('dryinjects', state).filter(i => i.dryinject_dryrun === id), + getDryrunUsers: id => entities('users', state).filter(i => (entity(id, 'dryruns', state) || {}).dryrun_users?.includes(i.user_id)), // comcheck - getComcheck: (id) => entity(id, 'comchecks', state), - getComcheckStatus: (id) => entity(id, 'comcheckstatuses', state), - getComcheckStatuses: (id) => entities('comcheckstatuses', state).filter( - (i) => i.comcheckstatus_comcheck === id, + getComcheck: id => entity(id, 'comchecks', state), + getComcheckStatus: id => entity(id, 'comcheckstatuses', state), + getComcheckStatuses: id => entities('comcheckstatuses', state).filter( + i => i.comcheckstatus_comcheck === id, ), - getChannelReader: (id) => entity(id, 'channelreaders', state), - getChallengesReader: (id) => entity(id, 'challengesreaders', state), + getChannelReader: id => entity(id, 'channelreaders', state), + getChallengesReader: id => entity(id, 'challengesreaders', state), // users getUsers: () => entities('users', state), getGroups: () => entities('groups', state), @@ -356,18 +356,18 @@ export const storeHelper = (state) => ({ getOrganizations: () => entities('organizations', state), getOrganizationsMap: () => maps('organizations', state), // objectives - getObjective: (id) => entity(id, 'objectives', state), - getObjectiveEvaluations: (id) => entities('evaluations', state).filter((e) => e.evaluation_objective === id), + getObjective: id => entity(id, 'objectives', state), + getObjectiveEvaluations: id => entities('evaluations', state).filter(e => e.evaluation_objective === id), // tags - getTag: (id) => entity(id, 'tags', state), + getTag: id => entity(id, 'tags', state), getTags: () => entities('tags', state), getTagsMap: () => maps('tags', state), // injects - getInject: (id) => getInjectWithParsedInjectorContractContent(entity(id, 'injects', state)), - getAtomicTesting: (id) => entity(id, 'atomics', state), - getAtomicTestingDetail: (id) => entity(id, 'atomicdetails', state), + getInject: id => getInjectWithParsedInjectorContractContent(entity(id, 'injects', state)), + getAtomicTesting: id => entity(id, 'atomics', state), + getAtomicTestingDetail: id => entity(id, 'atomicdetails', state), getAtomicTestings: () => entities('atomics', state), - getTargetResults: (id, injectId) => entities('targetresults', state).filter((r) => (r.target_id === id) && (r.target_inject_id === injectId)), + getTargetResults: (id, injectId) => entities('targetresults', state).filter(r => (r.target_id === id) && (r.target_inject_id === injectId)), getInjectsMap: () => getInjectsWithParsedInjectorContractContent(entities('injects', state)).reduce((map, i) => { // eslint-disable-next-line no-param-reassign map[i.inject_id] = i; @@ -376,28 +376,28 @@ export const storeHelper = (state) => ({ getNextInjects: () => { const sortFn = (a, b) => new Date(a.inject_date).getTime() - new Date(b.inject_date).getTime(); const injects = entities('injects', state).filter( - (i) => i.inject_date !== null && i.inject_status === null, + i => i.inject_date !== null && i.inject_status === null, ); return R.take(6, R.sort(sortFn, injects)); }, - getInjectCommunications: (id) => entities('communications', state).filter( - (i) => i.communication_inject === id, + getInjectCommunications: id => entities('communications', state).filter( + i => i.communication_inject === id, ), // injectexpectation getInjectExpectations: () => entities('injectexpectations', state), - getExerciseInjectExpectations: (id) => entities('injectexpectations', state).filter( - (i) => i.inject_expectation_exercise === id, + getExerciseInjectExpectations: id => entities('injectexpectations', state).filter( + i => i.inject_expectation_exercise === id, ), getInjectExpectationsMap: () => maps('injectexpectations', state), // documents getDocuments: () => entities('documents', state), getDocumentsMap: () => maps('documents', state), // teams - getTeam: (id) => entity(id, 'teams', state), - getTeamUsers: (id) => entities('users', state).filter((u) => (entity(id, 'teams', state) || {}).team_users?.includes( + getTeam: id => entity(id, 'teams', state), + getTeamUsers: id => entities('users', state).filter(u => (entity(id, 'teams', state) || {}).team_users?.includes( u.user_id, )), - getTeamExerciseInjects: (id) => entities('injects', state).filter((i) => (entity(id, 'teams', state) || {}).team_exercise_injects?.includes( + getTeamExerciseInjects: id => entities('injects', state).filter(i => (entity(id, 'teams', state) || {}).team_exercise_injects?.includes( i.inject_id, )), getTeams: () => entities('teams', state), @@ -406,19 +406,19 @@ export const storeHelper = (state) => ({ return state.referential.entities.platformParameters.parameters || {}; }, // kill chain phases - getKillChainPhase: (id) => entity(id, 'killchainphases', state), + getKillChainPhase: id => entity(id, 'killchainphases', state), getKillChainPhases: () => entities('killchainphases', state), getKillChainPhasesMap: () => maps('killchainphases', state), // attack patterns - getAttackPattern: (id) => entity(id, 'attackpatterns', state), + getAttackPattern: id => entity(id, 'attackpatterns', state), getAttackPatterns: () => entities('attackpatterns', state), getAttackPatternsMap: () => maps('attackpatterns', state), // mitigations - getMitigation: (id) => entity(id, 'mitigations', state), + getMitigation: id => entity(id, 'mitigations', state), getMitigations: () => entities('mitigations', state), getMitigationsMap: () => maps('mitigations', state), // injectors - getInjector: (id) => entity(id, 'injectors', state), + getInjector: id => entity(id, 'injectors', state), getInjectors: () => entities('injectors', state), getInjectorsMap: () => maps('injectors', state), // injector contracts @@ -434,40 +434,40 @@ export const storeHelper = (state) => ({ }, getInjectorContracts: () => entities('injector_contracts', state), // collectors - getCollector: (id) => entity(id, 'collectors', state), + getCollector: id => entity(id, 'collectors', state), getCollectors: () => entities('collectors', state), getCollectorsMap: () => maps('collectors', state), // executors - getExecutor: (id) => entity(id, 'executors', state), + getExecutor: id => entity(id, 'executors', state), getExecutors: () => entities('executors', state), getExecutorsMap: () => maps('executors', state), // channels getChannels: () => entities('channels', state), - getChannel: (id) => entity(id, 'channels', state), + getChannel: id => entity(id, 'channels', state), getChannelsMap: () => maps('channels', state), // payloads getPayloads: () => entities('payloads', state), - getPayload: (id) => entity(id, 'payloads', state), + getPayload: id => entity(id, 'payloads', state), getPayloadsMap: () => maps('payloads', state), // articles getArticles: () => entities('articles', state), - getArticle: (id) => entity(id, 'articles', state), + getArticle: id => entity(id, 'articles', state), getArticlesMap: () => maps('articles', state), // challenges getChallenges: () => entities('challenges', state), - getExerciseChallenges: (id) => entities('challenges', state).filter((c) => c.challenge_exercises.includes(id)), + getExerciseChallenges: id => entities('challenges', state).filter(c => c.challenge_exercises.includes(id)), getChallengesMap: () => maps('challenges', state), // lessons templates - getLessonsTemplate: (id) => entity(id, 'lessonstemplates', state), + getLessonsTemplate: id => entity(id, 'lessonstemplates', state), getLessonsTemplates: () => entities('lessonstemplates', state), getLessonsTemplatesMap: () => maps('lessonstemplates', state), - getLessonsTemplateCategories: (id) => entities('lessonstemplatecategorys', state).filter( - (c) => c.lessons_template_category_template === id, + getLessonsTemplateCategories: id => entities('lessonstemplatecategorys', state).filter( + c => c.lessons_template_category_template === id, ), getLessonsTemplateQuestions: () => entities('lessonstemplatequestions', state), getLessonsTemplateQuestionsMap: () => maps('lessonstemplatequestions', state), - getLessonsTemplateCategoryQuestions: (id) => entities('lessonstemplatequestions', state).filter( - (c) => c.lessons_template_question_category === id, + getLessonsTemplateCategoryQuestions: id => entities('lessonstemplatequestions', state).filter( + c => c.lessons_template_question_category === id, ), // assets getEndpoints: () => entities('endpoints', state), @@ -475,28 +475,28 @@ export const storeHelper = (state) => ({ // asset groups getAssetGroups: () => entities('asset_groups', state), getAssetGroupMaps: () => maps('asset_groups', state), - getAssetGroup: (id) => entity(id, 'asset_groups', state), + getAssetGroup: id => entity(id, 'asset_groups', state), // security platforms getSecurityPlatforms: () => entities('securityplatforms', state), getSecurityPlatformsMap: () => maps('securityplatforms', state), - getSecurityPlatform: (id) => entity(id, 'securityplatforms', state), + getSecurityPlatform: id => entity(id, 'securityplatforms', state), // scenarios getScenarios: () => entities('scenarios', state), getScenariosMap: () => maps('scenarios', state), - getScenario: (id) => entity(id, 'scenarios', state), - getScenarioTeams: (id) => entities('teams', state).filter((i) => i.team_scenarios.includes(id)), - getScenarioVariables: (id) => entities('variables', state).filter((i) => i.variable_scenario === id), - getScenarioArticles: (id) => entities('articles', state).filter((i) => i.article_scenario === id), - getScenarioChallenges: (id) => entities('challenges', state).filter((c) => c.challenge_scenarios.includes(id)), - getScenarioInjects: (id) => getInjectsWithParsedInjectorContractContent(entities('injects', state).filter((i) => i.inject_scenario === id)), - getTeamScenarioInjects: (id) => entities('injects', state).filter((i) => (entity(id, 'teams', state) || {}).team_scenario_injects?.includes( + getScenario: id => entity(id, 'scenarios', state), + getScenarioTeams: id => entities('teams', state).filter(i => i.team_scenarios.includes(id)), + getScenarioVariables: id => entities('variables', state).filter(i => i.variable_scenario === id), + getScenarioArticles: id => entities('articles', state).filter(i => i.article_scenario === id), + getScenarioChallenges: id => entities('challenges', state).filter(c => c.challenge_scenarios.includes(id)), + getScenarioInjects: id => getInjectsWithParsedInjectorContractContent(entities('injects', state).filter(i => i.inject_scenario === id)), + getTeamScenarioInjects: id => entities('injects', state).filter(i => (entity(id, 'teams', state) || {}).team_scenario_injects?.includes( i.inject_id, )), - getScenarioObjectives: (id) => entities('objectives', state).filter((o) => o.objective_scenario === id), - getScenarioLessonsCategories: (id) => entities('lessonscategorys', state).filter( - (l) => l.lessons_category_scenario === id, + getScenarioObjectives: id => entities('objectives', state).filter(o => o.objective_scenario === id), + getScenarioLessonsCategories: id => entities('lessonscategorys', state).filter( + l => l.lessons_category_scenario === id, ), - getScenarioLessonsQuestions: (id) => entities('lessonsquestions', state).filter( - (l) => l.lessons_question_scenario === id, + getScenarioLessonsQuestions: id => entities('lessonsquestions', state).filter( + l => l.lessons_question_scenario === id, ), }); diff --git a/openbas-front/src/actions/Tag.js b/openbas-front/src/actions/Tag.js index 7279c8e317..02a4fe8c20 100644 --- a/openbas-front/src/actions/Tag.js +++ b/openbas-front/src/actions/Tag.js @@ -1,7 +1,7 @@ +import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; import * as schema from './Schema'; -import { getReferential, postReferential, delReferential, putReferential, simplePostCall } from '../utils/Action'; -export const fetchTags = () => (dispatch) => getReferential(schema.arrayOfTags, '/api/tags')(dispatch); +export const fetchTags = () => dispatch => getReferential(schema.arrayOfTags, '/api/tags')(dispatch); export const searchTags = (searchPaginationInput) => { const data = searchPaginationInput; @@ -9,10 +9,10 @@ export const searchTags = (searchPaginationInput) => { return simplePostCall(uri, data); }; -export const fetchTag = (tagId) => (dispatch) => getReferential(schema.tag, `/api/tags/${tagId}`)(dispatch); +export const fetchTag = tagId => dispatch => getReferential(schema.tag, `/api/tags/${tagId}`)(dispatch); -export const addTag = (data) => (dispatch) => postReferential(schema.tag, '/api/tags', data)(dispatch); +export const addTag = data => dispatch => postReferential(schema.tag, '/api/tags', data)(dispatch); -export const updateTag = (userId, data) => (dispatch) => putReferential(schema.tag, `/api/tags/${userId}`, data)(dispatch); +export const updateTag = (userId, data) => dispatch => putReferential(schema.tag, `/api/tags/${userId}`, data)(dispatch); -export const deleteTag = (tagId) => (dispatch) => delReferential(`/api/tags/${tagId}`, 'tags', tagId)(dispatch); +export const deleteTag = tagId => dispatch => delReferential(`/api/tags/${tagId}`, 'tags', tagId)(dispatch); diff --git a/openbas-front/src/actions/User.js b/openbas-front/src/actions/User.js index bf4c8799d0..693ef1d8e5 100644 --- a/openbas-front/src/actions/User.js +++ b/openbas-front/src/actions/User.js @@ -1,18 +1,18 @@ -import * as schema from './Schema'; import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../utils/Action'; +import * as schema from './Schema'; // region players -export const fetchPlayers = () => (dispatch) => getReferential(schema.arrayOfUsers, '/api/players')(dispatch); +export const fetchPlayers = () => dispatch => getReferential(schema.arrayOfUsers, '/api/players')(dispatch); -export const addPlayer = (data) => (dispatch) => postReferential(schema.user, '/api/players', data)(dispatch); +export const addPlayer = data => dispatch => postReferential(schema.user, '/api/players', data)(dispatch); -export const updatePlayer = (userId, data) => (dispatch) => putReferential(schema.user, `/api/players/${userId}`, data)(dispatch); +export const updatePlayer = (userId, data) => dispatch => putReferential(schema.user, `/api/players/${userId}`, data)(dispatch); -export const deletePlayer = (userId) => (dispatch) => delReferential(`/api/players/${userId}`, 'users', userId)(dispatch); +export const deletePlayer = userId => dispatch => delReferential(`/api/players/${userId}`, 'users', userId)(dispatch); // endregion // region users -export const fetchUsers = () => (dispatch) => getReferential(schema.arrayOfUsers, '/api/users')(dispatch); +export const fetchUsers = () => dispatch => getReferential(schema.arrayOfUsers, '/api/users')(dispatch); export const searchUsers = (paginationInput) => { const data = paginationInput; @@ -20,28 +20,28 @@ export const searchUsers = (paginationInput) => { return simplePostCall(uri, data); }; -export const addUser = (data) => (dispatch) => postReferential(schema.user, '/api/users', data)(dispatch); +export const addUser = data => dispatch => postReferential(schema.user, '/api/users', data)(dispatch); -export const updateUserPassword = (userId, data) => (dispatch) => putReferential(schema.user, `/api/users/${userId}/password`, data)(dispatch); +export const updateUserPassword = (userId, data) => dispatch => putReferential(schema.user, `/api/users/${userId}/password`, data)(dispatch); -export const updateUser = (userId, data) => (dispatch) => putReferential(schema.user, `/api/users/${userId}`, data)(dispatch); +export const updateUser = (userId, data) => dispatch => putReferential(schema.user, `/api/users/${userId}`, data)(dispatch); -export const deleteUser = (userId) => (dispatch) => delReferential(`/api/users/${userId}`, 'users', userId)(dispatch); +export const deleteUser = userId => dispatch => delReferential(`/api/users/${userId}`, 'users', userId)(dispatch); // endregion // region me -export const meTokens = () => (dispatch) => getReferential(schema.arrayOfTokens, '/api/me/tokens')(dispatch); +export const meTokens = () => dispatch => getReferential(schema.arrayOfTokens, '/api/me/tokens')(dispatch); -export const updateMePassword = (currentPassword, newPassword) => (dispatch) => putReferential(schema.user, '/api/me/password', { +export const updateMePassword = (currentPassword, newPassword) => dispatch => putReferential(schema.user, '/api/me/password', { user_current_password: currentPassword, user_plain_password: newPassword, })(dispatch); -export const updateMeProfile = (data) => (dispatch) => putReferential(schema.user, '/api/me/profile', data)(dispatch); +export const updateMeProfile = data => dispatch => putReferential(schema.user, '/api/me/profile', data)(dispatch); -export const updateMeInformation = (data) => (dispatch) => putReferential(schema.user, '/api/me/information', data)(dispatch); +export const updateMeInformation = data => dispatch => putReferential(schema.user, '/api/me/information', data)(dispatch); -export const renewToken = (tokenId) => (dispatch) => postReferential(schema.token, '/api/me/token/refresh', { +export const renewToken = tokenId => dispatch => postReferential(schema.token, '/api/me/token/refresh', { token_id: tokenId, })(dispatch); // endregion diff --git a/openbas-front/src/actions/asset_groups/assetgroup-action.ts b/openbas-front/src/actions/asset_groups/assetgroup-action.ts index 272c961838..b1783658e6 100644 --- a/openbas-front/src/actions/asset_groups/assetgroup-action.ts +++ b/openbas-front/src/actions/asset_groups/assetgroup-action.ts @@ -1,6 +1,7 @@ import { Dispatch } from 'redux'; -import type { AssetGroup, AssetGroupInput, SearchPaginationInput, UpdateAssetsOnAssetGroupInput } from '../../utils/api-types'; + import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../../utils/Action'; +import type { AssetGroup, AssetGroupInput, SearchPaginationInput, UpdateAssetsOnAssetGroupInput } from '../../utils/api-types'; import { arrayOfAssetGroups, assetGroup } from './assetgroup-schema'; const ASSET_GROUP_URI = '/api/asset_groups'; diff --git a/openbas-front/src/actions/assets/endpoint-actions.ts b/openbas-front/src/actions/assets/endpoint-actions.ts index 50c8a3565b..36d8ffaf05 100644 --- a/openbas-front/src/actions/assets/endpoint-actions.ts +++ b/openbas-front/src/actions/assets/endpoint-actions.ts @@ -1,4 +1,5 @@ import { Dispatch } from 'redux'; + import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../../utils/Action'; import type { Endpoint, EndpointInput, SearchPaginationInput } from '../../utils/api-types'; import { arrayOfEndpoints, endpoint } from './asset-schema'; diff --git a/openbas-front/src/actions/assets/securityPlatform-actions.ts b/openbas-front/src/actions/assets/securityPlatform-actions.ts index b15f362a51..61ed9184db 100644 --- a/openbas-front/src/actions/assets/securityPlatform-actions.ts +++ b/openbas-front/src/actions/assets/securityPlatform-actions.ts @@ -1,6 +1,7 @@ import { Dispatch } from 'redux'; + import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../../utils/Action'; -import type { SecurityPlatform, SecurityPlatformInput, SearchPaginationInput } from '../../utils/api-types'; +import type { SearchPaginationInput, SecurityPlatform, SecurityPlatformInput } from '../../utils/api-types'; import { arrayOfSecurityPlatforms, securityPlatform } from './asset-schema'; const SECURITY_PLATFORM_URI = '/api/security_platforms'; diff --git a/openbas-front/src/actions/atomic_testings/atomic-testing-actions.ts b/openbas-front/src/actions/atomic_testings/atomic-testing-actions.ts index 41ddf6ea43..034e5ba76c 100644 --- a/openbas-front/src/actions/atomic_testings/atomic-testing-actions.ts +++ b/openbas-front/src/actions/atomic_testings/atomic-testing-actions.ts @@ -29,7 +29,7 @@ export const tryAtomicTesting = (injectId: string) => { return simpleCall(uri); }; -export const fetchTargetResult = (injectId: string, targetId: string, targetType: string, parentTargetId ?: string) => { +export const fetchTargetResult = (injectId: string, targetId: string, targetType: string, parentTargetId?: string) => { let uri = `${ATOMIC_TESTING_URI}/${injectId}/target_results/${targetId}/types/${targetType}`; if (parentTargetId) { uri += `?parentTargetId=${encodeURIComponent(parentTargetId)}`; diff --git a/openbas-front/src/actions/atomic_testings/atomic-testing.d.ts b/openbas-front/src/actions/atomic_testings/atomic-testing.d.ts index 6dcf4f2081..0b7fc3dee3 100644 --- a/openbas-front/src/actions/atomic_testings/atomic-testing.d.ts +++ b/openbas-front/src/actions/atomic_testings/atomic-testing.d.ts @@ -2,5 +2,5 @@ import { InjectExpectationsStore } from '../../admin/components/common/injects/e import type { InjectResultDTO } from '../../utils/api-types'; export type InjectResultDTOStore = Omit & { - atomic_expectations: InjectExpectationsStore[] | undefined + atomic_expectations: InjectExpectationsStore[] | undefined; }; diff --git a/openbas-front/src/actions/attack_patterns/AttackPattern.d.ts b/openbas-front/src/actions/attack_patterns/AttackPattern.d.ts index fd20903855..2d714020f3 100644 --- a/openbas-front/src/actions/attack_patterns/AttackPattern.d.ts +++ b/openbas-front/src/actions/attack_patterns/AttackPattern.d.ts @@ -1,6 +1,6 @@ import type { AttackPattern } from '../../utils/api-types'; export type AttackPatternStore = Omit & { - attack_pattern_kill_chain_phases: string[] | undefined - attack_pattern_parent: string | undefined + attack_pattern_kill_chain_phases: string[] | undefined; + attack_pattern_parent: string | undefined; }; diff --git a/openbas-front/src/actions/channels/Article.d.ts b/openbas-front/src/actions/channels/Article.d.ts index 638e23516a..55172ec364 100644 --- a/openbas-front/src/actions/channels/Article.d.ts +++ b/openbas-front/src/actions/channels/Article.d.ts @@ -6,5 +6,5 @@ export type ArticleStore = Omit (dispatch) => { +export const fetchExerciseArticles = exerciseId => (dispatch) => { const uri = `/api/exercises/${exerciseId}/articles`; return getReferential(arrayOfArticles, uri)(dispatch); }; @@ -27,7 +27,7 @@ export const addScenarioArticle = (scenarioId, data) => (dispatch) => { return postReferential(article, uri, data)(dispatch); }; -export const fetchScenarioArticles = (scenarioId) => (dispatch) => { +export const fetchScenarioArticles = scenarioId => (dispatch) => { const uri = `/api/scenarios/${scenarioId}/articles`; return getReferential(arrayOfArticles, uri)(dispatch); }; diff --git a/openbas-front/src/actions/channels/channel-action.js b/openbas-front/src/actions/channels/channel-action.js index 627e59e7ff..e7cc07a6ed 100644 --- a/openbas-front/src/actions/channels/channel-action.js +++ b/openbas-front/src/actions/channels/channel-action.js @@ -1,12 +1,12 @@ import { delReferential, getReferential, postReferential, putReferential } from '../../utils/Action'; import { channelReader } from '../Schema'; -import { channelAction, arrayOfChannels } from './channel-schema'; +import { arrayOfChannels, channelAction } from './channel-schema'; export const fetchChannels = () => (dispatch) => { const uri = '/api/channels'; return getReferential(arrayOfChannels, uri)(dispatch); }; -export const fetchChannel = (channelId) => (dispatch) => { +export const fetchChannel = channelId => (dispatch) => { const uri = `/api/channels/${channelId}`; return getReferential(channelAction, uri)(dispatch); }; @@ -18,8 +18,8 @@ export const updateChannelLogos = (channelId, data) => (dispatch) => { const uri = `/api/channels/${channelId}/logos`; return putReferential(channelAction, uri, data)(dispatch); }; -export const addChannel = (data) => (dispatch) => postReferential(channelAction, '/api/channels', data)(dispatch); -export const deleteChannel = (channelId) => (dispatch) => { +export const addChannel = data => dispatch => postReferential(channelAction, '/api/channels', data)(dispatch); +export const deleteChannel = channelId => (dispatch) => { const uri = `/api/channels/${channelId}`; return delReferential(uri, 'channels', channelId)(dispatch); }; diff --git a/openbas-front/src/actions/contract/contract.d.ts b/openbas-front/src/actions/contract/contract.d.ts index a5547acf80..45ed48e690 100644 --- a/openbas-front/src/actions/contract/contract.d.ts +++ b/openbas-front/src/actions/contract/contract.d.ts @@ -25,20 +25,20 @@ export interface ContractElement { mandatory?: boolean; mandatoryGroups?: string[]; type?: - | 'text' - | 'number' - | 'tuple' - | 'checkbox' - | 'textarea' - | 'select' - | 'article' - | 'challenge' - | 'dependency-select' - | 'attachment' - | 'team' - | 'expectation' - | 'asset' - | 'asset-group'; + | 'text' + | 'number' + | 'tuple' + | 'checkbox' + | 'textarea' + | 'select' + | 'article' + | 'challenge' + | 'dependency-select' + | 'attachment' + | 'team' + | 'expectation' + | 'asset' + | 'asset-group'; } export interface ContractVariable { diff --git a/openbas-front/src/actions/exercises/Exercise.d.ts b/openbas-front/src/actions/exercises/Exercise.d.ts index 683f693534..25a974aed9 100644 --- a/openbas-front/src/actions/exercises/Exercise.d.ts +++ b/openbas-front/src/actions/exercises/Exercise.d.ts @@ -16,7 +16,7 @@ export type ExerciseSimpleStore = Omit & { }; export type InjectExpectationResultsByTypeStore = Omit & { - inject: string | undefined + inject: string | undefined; }; export type InjectExpectationResultsByAttackPatternStore = Omit & { diff --git a/openbas-front/src/actions/exercises/exercise-action.ts b/openbas-front/src/actions/exercises/exercise-action.ts index beab91fa81..4842e7db91 100644 --- a/openbas-front/src/actions/exercises/exercise-action.ts +++ b/openbas-front/src/actions/exercises/exercise-action.ts @@ -1,4 +1,5 @@ import { Dispatch } from 'redux'; + import { delReferential, getReferential, postReferential, putReferential, simpleCall, simplePostCall } from '../../utils/Action'; import type { Exercise, @@ -12,8 +13,8 @@ import type { LessonsSendInput, SearchPaginationInput, } from '../../utils/api-types'; -import * as schema from '../Schema'; import { MESSAGING$ } from '../../utils/Environment'; +import * as schema from '../Schema'; export const EXERCISE_URI = '/api/exercises'; diff --git a/openbas-front/src/actions/exercises/exercise-helper.d.ts b/openbas-front/src/actions/exercises/exercise-helper.d.ts index 80608e3054..a4b92e74be 100644 --- a/openbas-front/src/actions/exercises/exercise-helper.d.ts +++ b/openbas-front/src/actions/exercises/exercise-helper.d.ts @@ -1,6 +1,6 @@ -import type { ExerciseSimpleStore, ExerciseStore } from './Exercise'; -import type { TeamStore } from '../teams/Team'; import type { Exercise, InjectExpectation, LessonsAnswer, LessonsCategory, LessonsQuestion, Objective } from '../../utils/api-types'; +import type { TeamStore } from '../teams/Team'; +import type { ExerciseSimpleStore, ExerciseStore } from './Exercise'; export interface ExercisesHelper { getExercise: (exerciseId: string) => ExerciseStore; diff --git a/openbas-front/src/actions/exercises/exercise-teams-action.ts b/openbas-front/src/actions/exercises/exercise-teams-action.ts index b71445e12a..16952eb9e0 100644 --- a/openbas-front/src/actions/exercises/exercise-teams-action.ts +++ b/openbas-front/src/actions/exercises/exercise-teams-action.ts @@ -1,8 +1,9 @@ import { Dispatch } from 'redux'; -import type { ExerciseUpdateTeamsInput, Scenario, SearchPaginationInput } from '../../utils/api-types'; + import { putReferential, simplePostCall } from '../../utils/Action'; -import { EXERCISE_URI } from './exercise-action'; +import type { ExerciseUpdateTeamsInput, Scenario, SearchPaginationInput } from '../../utils/api-types'; import * as schema from '../Schema'; +import { EXERCISE_URI } from './exercise-action'; export const searchExerciseTeams = (exerciseId: Scenario['scenario_id'], paginationInput: SearchPaginationInput, contextualOnly: boolean = false) => { const uri = `${EXERCISE_URI}/${exerciseId}/teams/search?contextualOnly=${contextualOnly}`; diff --git a/openbas-front/src/actions/helper.d.ts b/openbas-front/src/actions/helper.d.ts index 073ca2e875..85484a4e01 100644 --- a/openbas-front/src/actions/helper.d.ts +++ b/openbas-front/src/actions/helper.d.ts @@ -38,5 +38,5 @@ export interface DocumentHelper { } export interface MeTokensHelper { - getMeTokens: () => Token[] + getMeTokens: () => Token[]; } diff --git a/openbas-front/src/actions/injector_contracts/InjectorContract.d.ts b/openbas-front/src/actions/injector_contracts/InjectorContract.d.ts index fcd3b34194..a5758f1cd3 100644 --- a/openbas-front/src/actions/injector_contracts/InjectorContract.d.ts +++ b/openbas-front/src/actions/injector_contracts/InjectorContract.d.ts @@ -1,8 +1,8 @@ import type { InjectorContract } from '../../utils/api-types'; export type InjectorContractStore = Omit & { - injector_contract_attack_patterns: string[] | undefined - injector_contract_injector: string | undefined + injector_contract_attack_patterns: string[] | undefined; + injector_contract_injector: string | undefined; }; export type ContractType = 'text' | 'number' | 'tuple' | 'checkbox' | 'textarea' | 'select' | 'article' | 'challenge' | 'dependency-select' | 'attachment' | 'team' | 'expectation' | 'asset' | 'asset-group' | 'payload'; @@ -15,6 +15,6 @@ export interface ContractElement { export type InjectorContractConverted = Omit & { convertedContent: { - fields: ContractElement[] - } + fields: ContractElement[]; + }; }; diff --git a/openbas-front/src/actions/injectors/injector-helper.d.ts b/openbas-front/src/actions/injectors/injector-helper.d.ts index 2c972a4374..0560c888e3 100644 --- a/openbas-front/src/actions/injectors/injector-helper.d.ts +++ b/openbas-front/src/actions/injectors/injector-helper.d.ts @@ -1,7 +1,7 @@ import type { Injector } from '../../utils/api-types'; export interface InjectorHelper { - getInjector: (injectorId: string) => Injector, + getInjector: (injectorId: string) => Injector; getInjectors: () => Injector[]; getInjectorsMap: () => Record; } diff --git a/openbas-front/src/actions/injects/Inject.d.ts b/openbas-front/src/actions/injects/Inject.d.ts index f1b3154851..13add9f24f 100644 --- a/openbas-front/src/actions/injects/Inject.d.ts +++ b/openbas-front/src/actions/injects/Inject.d.ts @@ -3,36 +3,36 @@ import type { Inject, InjectExpectation, InjectOutput } from '../../utils/api-ty export type InjectStore = Omit & { inject_tags: string[] | undefined; inject_teams: string[] | undefined; - inject_content: { expectationScore: number, challenges: string[] | undefined } + inject_content: { expectationScore: number; challenges: string[] | undefined }; inject_injector_contract: { // as we don't know the type of the content of a contract we need to put any here // eslint-disable-next-line @typescript-eslint/no-explicit-any - injector_contract_content_parsed: any + injector_contract_content_parsed: any; convertedContent: { - label: Record + label: Record; config: { - expose: boolean - } - } - } & Inject['inject_injector_contract'] - inject_exercise?: string - inject_scenario?: string + expose: boolean; + }; + }; + } & Inject['inject_injector_contract']; + inject_exercise?: string; + inject_scenario?: string; }; export type InjectorContractConvertedContent = { - label: Record + label: Record; config: { - expose: boolean - } + expose: boolean; + }; }; export type InjectOutputType = InjectOutput & { inject_injector_contract: { // as we don't know the type of the content of a contract we need to put any here // eslint-disable-next-line @typescript-eslint/no-explicit-any - injector_contract_content_parsed: any - convertedContent: InjectorContractConvertedContent - } & Inject['inject_injector_contract'] + injector_contract_content_parsed: any; + convertedContent: InjectorContractConvertedContent; + } & Inject['inject_injector_contract']; }; export type InjectExpectationStore = Omit & { @@ -41,38 +41,38 @@ export type InjectExpectationStore = Omit { const uri = `/api/injects/${injectId}/test`; diff --git a/openbas-front/src/actions/injects/inject-helper.d.ts b/openbas-front/src/actions/injects/inject-helper.d.ts index 397e1a2f5b..12546dd1ef 100644 --- a/openbas-front/src/actions/injects/inject-helper.d.ts +++ b/openbas-front/src/actions/injects/inject-helper.d.ts @@ -1,4 +1,4 @@ -import type { Exercise, Inject, Scenario, InjectExpectation, Team } from '../../utils/api-types'; +import type { Exercise, Inject, InjectExpectation, Scenario, Team } from '../../utils/api-types'; export interface InjectHelper { getInject: (injectId: Inject['inject_id']) => Inject; diff --git a/openbas-front/src/actions/mapper/mapper-actions.ts b/openbas-front/src/actions/mapper/mapper-actions.ts index 0802cd1660..ac9f00ef19 100644 --- a/openbas-front/src/actions/mapper/mapper-actions.ts +++ b/openbas-front/src/actions/mapper/mapper-actions.ts @@ -1,3 +1,4 @@ +import { simpleCall, simpleDelCall, simplePostCall, simplePutCall } from '../../utils/Action'; import type { ExportMapperInput, ImportMapperAddInput, @@ -6,7 +7,6 @@ import type { RawPaginationImportMapper, SearchPaginationInput, } from '../../utils/api-types'; -import { simpleCall, simpleDelCall, simplePostCall, simplePutCall } from '../../utils/Action'; const XLS_MAPPER_URI = '/api/mappers'; diff --git a/openbas-front/src/actions/reports/report-actions.ts b/openbas-front/src/actions/reports/report-actions.ts index b940d28e64..54ebc5fb2e 100644 --- a/openbas-front/src/actions/reports/report-actions.ts +++ b/openbas-front/src/actions/reports/report-actions.ts @@ -1,6 +1,7 @@ import { Dispatch } from 'redux'; -import type { Exercise, Report, ReportInjectComment, ReportInput } from '../../utils/api-types'; + import { delReferential, getReferential, postReferential, putReferential } from '../../utils/Action'; +import type { Exercise, Report, ReportInjectComment, ReportInput } from '../../utils/api-types'; import * as schema from '../Schema'; export const fetchReportsForExercise = (exerciseId: Exercise['exercise_id']) => (dispatch: Dispatch) => { diff --git a/openbas-front/src/actions/scenarios/scenario-actions.ts b/openbas-front/src/actions/scenarios/scenario-actions.ts index e50dc9350a..e19b97ea36 100644 --- a/openbas-front/src/actions/scenarios/scenario-actions.ts +++ b/openbas-front/src/actions/scenarios/scenario-actions.ts @@ -1,6 +1,6 @@ import { Dispatch } from 'redux'; + import { delReferential, getReferential, postReferential, putReferential, simpleCall, simplePostCall } from '../../utils/Action'; -import { arrayOfScenarios, scenario } from './scenario-schema'; import type { InjectsImportInput, LessonsCategoryCreateInput, @@ -17,8 +17,9 @@ import type { SearchPaginationInput, Team, } from '../../utils/api-types'; -import * as schema from '../Schema'; import { MESSAGING$ } from '../../utils/Environment'; +import * as schema from '../Schema'; +import { arrayOfScenarios, scenario } from './scenario-schema'; export const SCENARIO_URI = '/api/scenarios'; diff --git a/openbas-front/src/actions/scenarios/scenario-helper.d.ts b/openbas-front/src/actions/scenarios/scenario-helper.d.ts index 8f20c8936e..92919a5049 100644 --- a/openbas-front/src/actions/scenarios/scenario-helper.d.ts +++ b/openbas-front/src/actions/scenarios/scenario-helper.d.ts @@ -1,6 +1,6 @@ -import type { ScenarioStore } from './Scenario'; -import type { TeamStore } from '../teams/Team'; import type { LessonsCategory, LessonsQuestion, Objective } from '../../utils/api-types'; +import type { TeamStore } from '../teams/Team'; +import type { ScenarioStore } from './Scenario'; export interface ScenariosHelper { getScenario: (scenarioId: string) => ScenarioStore; diff --git a/openbas-front/src/actions/scenarios/scenario-teams-action.ts b/openbas-front/src/actions/scenarios/scenario-teams-action.ts index 9d70b9d56b..832c948e6a 100644 --- a/openbas-front/src/actions/scenarios/scenario-teams-action.ts +++ b/openbas-front/src/actions/scenarios/scenario-teams-action.ts @@ -1,8 +1,9 @@ import { Dispatch } from 'redux'; -import type { Scenario, ScenarioUpdateTeamsInput, SearchPaginationInput } from '../../utils/api-types'; + import { putReferential, simplePostCall } from '../../utils/Action'; -import { SCENARIO_URI } from './scenario-actions'; +import type { Scenario, ScenarioUpdateTeamsInput, SearchPaginationInput } from '../../utils/api-types'; import * as schema from '../Schema'; +import { SCENARIO_URI } from './scenario-actions'; export const searchScenarioTeams = (scenarioId: Scenario['scenario_id'], paginationInput: SearchPaginationInput, contextualOnly: boolean = false) => { const uri = `${SCENARIO_URI}/${scenarioId}/teams/search?contextualOnly=${contextualOnly}`; diff --git a/openbas-front/src/actions/teams/Team.d.ts b/openbas-front/src/actions/teams/Team.d.ts index 014e623d6d..9d9ff72089 100644 --- a/openbas-front/src/actions/teams/Team.d.ts +++ b/openbas-front/src/actions/teams/Team.d.ts @@ -1,8 +1,8 @@ -import type { TeamUpdateInput, Team } from '../../utils/api-types'; +import type { Team, TeamUpdateInput } from '../../utils/api-types'; import { Option } from '../../utils/Option'; export type TeamInputForm = Omit< -TeamUpdateInput, + TeamUpdateInput, 'team_organization' | 'team_tags' > & { team_organization: Option | undefined; diff --git a/openbas-front/src/actions/teams/team-actions.ts b/openbas-front/src/actions/teams/team-actions.ts index 7b1d4e671b..a47d7d1932 100644 --- a/openbas-front/src/actions/teams/team-actions.ts +++ b/openbas-front/src/actions/teams/team-actions.ts @@ -1,7 +1,8 @@ import type { Dispatch } from 'redux'; -import * as schema from '../Schema'; -import { getReferential, putReferential, postReferential, delReferential, simplePostCall } from '../../utils/Action'; + +import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../../utils/Action'; import type { SearchPaginationInput, Team, TeamCreateInput, TeamUpdateInput, User } from '../../utils/api-types'; +import * as schema from '../Schema'; export const fetchTeams = () => (dispatch: Dispatch) => { const uri = '/api/teams'; diff --git a/openbas-front/src/actions/teams/team-helper.d.ts b/openbas-front/src/actions/teams/team-helper.d.ts index d8c391506f..ee599ca2ea 100644 --- a/openbas-front/src/actions/teams/team-helper.d.ts +++ b/openbas-front/src/actions/teams/team-helper.d.ts @@ -3,8 +3,8 @@ import type { Exercise, Scenario, Team, User } from '../../utils/api-types'; export interface TeamsHelper { getExerciseTeams: (exerciseId: Exercise['exercise_id']) => Team[]; getScenarioTeams: (scenarioId: Scenario['scenario_id']) => Team[]; - getTeam: (teamId: Team['team_id']) => Team, - getTeams: () => Team[], + getTeam: (teamId: Team['team_id']) => Team; + getTeams: () => Team[]; getTeamsMap: () => Record; getTeamUsers: (teamId: Team['team_id']) => User[]; } diff --git a/openbas-front/src/actions/variables/variable-actions.ts b/openbas-front/src/actions/variables/variable-actions.ts index d62715d713..39031fa25f 100644 --- a/openbas-front/src/actions/variables/variable-actions.ts +++ b/openbas-front/src/actions/variables/variable-actions.ts @@ -1,8 +1,9 @@ import { Dispatch } from 'redux'; -import * as schema from '../Schema'; -import { getReferential, putReferential, postReferential, delReferential } from '../../utils/Action'; + +import { delReferential, getReferential, postReferential, putReferential } from '../../utils/Action'; import type { Exercise, Variable, VariableInput } from '../../utils/api-types'; import type { ScenarioStore } from '../scenarios/Scenario'; +import * as schema from '../Schema'; // -- EXERCISES -- diff --git a/openbas-front/src/admin/Index.tsx b/openbas-front/src/admin/Index.tsx index 606ab73493..4ed08e500b 100644 --- a/openbas-front/src/admin/Index.tsx +++ b/openbas-front/src/admin/Index.tsx @@ -1,21 +1,22 @@ +import { Box } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; import { lazy, Suspense } from 'react'; import { Route, Routes, useNavigate } from 'react-router-dom'; -import { makeStyles, useTheme } from '@mui/styles'; -import { Box } from '@mui/material'; -import TopBar from './components/nav/TopBar'; -import LeftBar from './components/nav/LeftBar'; -import { errorWrapper } from '../components/Error'; -import useDataLoader from '../utils/hooks/useDataLoader'; -import { useHelper } from '../store'; -import type { Theme } from '../components/Theme'; + import type { LoggedHelper } from '../actions/helper'; +import { fetchTags } from '../actions/Tag'; +import { errorWrapper } from '../components/Error'; import Loader from '../components/Loader'; import NotFound from '../components/NotFound'; -import InjectIndex from './components/simulations/simulation/injects/InjectIndex'; +import type { Theme } from '../components/Theme'; import SystemBanners from '../public/components/systembanners/SystemBanners'; -import { fetchTags } from '../actions/Tag'; -import { useAppDispatch } from '../utils/hooks'; import { computeBannerSettings } from '../public/components/systembanners/utils'; +import { useHelper } from '../store'; +import { useAppDispatch } from '../utils/hooks'; +import useDataLoader from '../utils/hooks/useDataLoader'; +import LeftBar from './components/nav/LeftBar'; +import TopBar from './components/nav/TopBar'; +import InjectIndex from './components/simulations/simulation/injects/InjectIndex'; const Dashboard = lazy(() => import('./components/Dashboard')); const IndexProfile = lazy(() => import('./components/profile/Index')); @@ -35,7 +36,7 @@ const Payloads = lazy(() => import('./components/payloads/Payloads')); const Mitigations = lazy(() => import('./components/mitigations/Mitigations')); const IndexSettings = lazy(() => import('./components/settings/Index')); -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ toolbar: theme.mixins.toolbar, })); diff --git a/openbas-front/src/admin/components/Dashboard.tsx b/openbas-front/src/admin/components/Dashboard.tsx index 64aa901c59..cf1edfb496 100644 --- a/openbas-front/src/admin/components/Dashboard.tsx +++ b/openbas-front/src/admin/components/Dashboard.tsx @@ -1,36 +1,37 @@ -import { Grid, Paper, Theme, Typography } from '@mui/material'; -import { useEffect, useState } from 'react'; -import * as R from 'ramda'; import { ComputerOutlined, HubOutlined, MovieFilterOutlined, PersonOutlined } from '@mui/icons-material'; +import { Grid, Paper, Theme, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; -import Chart from 'react-apexcharts'; import type { ApexOptions } from 'apexcharts'; -import { useFormatter } from '../../components/i18n'; -import PaperMetric from './common/simulate/PaperMetric'; -import { useAppDispatch } from '../../utils/hooks'; -import { useHelper } from '../../store'; -import useDataLoader from '../../utils/hooks/useDataLoader'; +import * as R from 'ramda'; +import { useEffect, useState } from 'react'; +import Chart from 'react-apexcharts'; + import { fetchStatistics } from '../../actions/Application'; -import type { StatisticsHelper } from '../../actions/statistics/statistics-helper'; -import ResponsePie from './common/injects/ResponsePie'; -import MitreMatrix from './common/matrix/MitreMatrix'; -import MitreMatrixDummy from './common/matrix/MitreMatrixDummy'; -import { horizontalBarsChartOptions, polarAreaChartOptions, verticalBarsChartOptions } from '../../utils/Charts'; +import type { AttackPatternHelper } from '../../actions/attack_patterns/attackpattern-helper'; +import { fetchAttackPatterns } from '../../actions/AttackPattern'; import { fetchExercises, searchExercises } from '../../actions/Exercise'; import type { ExercisesHelper } from '../../actions/exercises/exercise-helper'; -import type { ExerciseSimple } from '../../utils/api-types'; -import { daysAgo, fillTimeSeries, getNextWeek, groupBy } from '../../utils/Time'; -import type { AttackPatternHelper } from '../../actions/attack_patterns/attackpattern-helper'; -import type { KillChainPhaseHelper } from '../../actions/kill_chain_phases/killchainphase-helper'; import type { InjectorHelper } from '../../actions/injectors/injector-helper'; +import type { KillChainPhaseHelper } from '../../actions/kill_chain_phases/killchainphase-helper'; import { fetchKillChainPhases } from '../../actions/KillChainPhase'; -import { fetchAttackPatterns } from '../../actions/AttackPattern'; +import type { StatisticsHelper } from '../../actions/statistics/statistics-helper'; +import { initSorting, type Page } from '../../components/common/queryable/Page'; import Empty from '../../components/Empty'; +import { useFormatter } from '../../components/i18n'; +import Loader from '../../components/Loader'; +import { useHelper } from '../../store'; +import type { ExerciseSimple } from '../../utils/api-types'; +import { horizontalBarsChartOptions, polarAreaChartOptions, verticalBarsChartOptions } from '../../utils/Charts'; import { attackPatternsFakeData, categoriesDataFakeData, categoriesLabelsFakeData, exercisesTimeSeriesFakeData } from '../../utils/fakeData'; -import ExerciseList from './simulations/ExerciseList'; +import { useAppDispatch } from '../../utils/hooks'; +import useDataLoader from '../../utils/hooks/useDataLoader'; +import { daysAgo, fillTimeSeries, getNextWeek, groupBy } from '../../utils/Time'; import type { EndpointStore } from './assets/endpoints/Endpoint'; -import { initSorting, type Page } from '../../components/common/queryable/Page'; -import Loader from '../../components/Loader'; +import ResponsePie from './common/injects/ResponsePie'; +import MitreMatrix from './common/matrix/MitreMatrix'; +import MitreMatrixDummy from './common/matrix/MitreMatrixDummy'; +import PaperMetric from './common/simulate/PaperMetric'; +import ExerciseList from './simulations/ExerciseList'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. @@ -94,10 +95,12 @@ const Dashboard = () => { const exercisesData = [ { name: t('Number of simulations'), - data: exercisesOverTime.length === 0 ? exercisesTimeSeriesFakeData : exercisesTimeSeries.map((grouping: { date: string, value: number }) => ({ - x: grouping.date, - y: grouping.value, - })), + data: exercisesOverTime.length === 0 + ? exercisesTimeSeriesFakeData + : exercisesTimeSeries.map((grouping: { date: string; value: number }) => ({ + x: grouping.date, + y: grouping.value, + })), }, ]; const countByCategory = R.countBy((exercise: ExerciseSimple) => exercise?.exercise_category || t('Unknown'), exercisesFromStore); @@ -122,25 +125,33 @@ const Dashboard = () => { return ( - } + } number={statistics?.scenarios_count?.global_count} progression={statistics?.scenarios_count?.progression_count} /> - } + } number={statistics?.exercises_count?.global_count} progression={statistics?.exercises_count?.progression_count} /> - } + } number={statistics?.users_count?.global_count} progression={statistics?.users_count?.progression_count} /> - } + } number={statistics?.assets_count?.global_count} progression={statistics?.assets_count?.progression_count} /> @@ -155,26 +166,28 @@ const Dashboard = () => { {t('Simulations')} {loadingExercises && ()} - {!loadingExercises && ()} + {!loadingExercises && ( + + )} @@ -227,7 +240,7 @@ const Dashboard = () => { @@ -236,8 +249,7 @@ const Dashboard = () => { {(statistics?.inject_expectation_results ?? []).length > 0 ? - : - } + : } diff --git a/openbas-front/src/admin/components/MiniMap.js b/openbas-front/src/admin/components/MiniMap.js index 63f61d94b8..5ae74ebe19 100644 --- a/openbas-front/src/admin/components/MiniMap.js +++ b/openbas-front/src/admin/components/MiniMap.js @@ -1,12 +1,14 @@ +import '../../static/css/leaflet.css'; + +import { withStyles, withTheme } from '@mui/styles'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; -import { withTheme, withStyles } from '@mui/styles'; -import { MapContainer, TileLayer, GeoJSON } from 'react-leaflet'; +import { GeoJSON, MapContainer, TileLayer } from 'react-leaflet'; import { connect } from 'react-redux'; -import countries from '../../static/geo/countries.json'; + import { storeHelper } from '../../actions/Schema'; import Loader from '../../components/Loader'; -import '../../static/css/leaflet.css'; +import countries from '../../static/geo/countries.json'; const styles = () => ({ paper: { diff --git a/openbas-front/src/admin/components/agents/Agents.tsx b/openbas-front/src/admin/components/agents/Agents.tsx index 47c3dc0d9e..9cd1af8fc2 100644 --- a/openbas-front/src/admin/components/agents/Agents.tsx +++ b/openbas-front/src/admin/components/agents/Agents.tsx @@ -1,6 +1,4 @@ -import { useState } from 'react'; -import * as React from 'react'; -import { makeStyles, useTheme } from '@mui/styles'; +import { ArticleOutlined, ContentCopyOutlined, DownloadingOutlined, TerminalOutlined } from '@mui/icons-material'; import { Alert, Button, @@ -20,24 +18,27 @@ import { Tabs, Typography, } from '@mui/material'; -import { ArticleOutlined, ContentCopyOutlined, DownloadingOutlined, TerminalOutlined } from '@mui/icons-material'; +import { makeStyles, useTheme } from '@mui/styles'; import { Bash, DownloadCircleOutline, Powershell } from 'mdi-material-ui'; import * as R from 'ramda'; -import { useFormatter } from '../../../components/i18n'; -import { useHelper } from '../../../store'; -import useDataLoader from '../../../utils/hooks/useDataLoader'; -import { useAppDispatch } from '../../../utils/hooks'; -import type { Executor } from '../../../utils/api-types'; -import type { ExecutorHelper } from '../../../actions/executors/executor-helper'; +import { useState } from 'react'; +import * as React from 'react'; + import { fetchExecutors } from '../../../actions/Executor'; -import type { Theme } from '../../../components/Theme'; +import type { ExecutorHelper } from '../../../actions/executors/executor-helper'; +import type { MeTokensHelper } from '../../../actions/helper'; +import { meTokens } from '../../../actions/User'; import Breadcrumbs from '../../../components/Breadcrumbs'; import Transition from '../../../components/common/Transition'; -import { copyToClipboard, download } from '../../../utils/utils'; -import useAuth from '../../../utils/hooks/useAuth'; +import { useFormatter } from '../../../components/i18n'; import PlatformIcon from '../../../components/PlatformIcon'; -import { meTokens } from '../../../actions/User'; -import type { MeTokensHelper } from '../../../actions/helper'; +import type { Theme } from '../../../components/Theme'; +import { useHelper } from '../../../store'; +import type { Executor } from '../../../utils/api-types'; +import { useAppDispatch } from '../../../utils/hooks'; +import useAuth from '../../../utils/hooks/useAuth'; +import useDataLoader from '../../../utils/hooks/useDataLoader'; +import { copyToClipboard, download } from '../../../utils/utils'; const useStyles = makeStyles(() => ({ card: { @@ -98,7 +99,7 @@ const Executors = () => { const windowsExecutors = sortedExecutors.filter((executor: Executor) => executor.executor_platforms?.includes('Windows')); const linuxExecutors = sortedExecutors.filter((executor: Executor) => executor.executor_platforms?.includes('Linux')); const macOsExecutors = sortedExecutors.filter((executor: Executor) => executor.executor_platforms?.includes('MacOS')); - const browserExecutors = sortedExecutors.filter((executor: Executor) => executor.executor_platforms?.some((n) => ['Chrome', 'Firefox', 'Edge', 'Safari'].includes(n))); + const browserExecutors = sortedExecutors.filter((executor: Executor) => executor.executor_platforms?.some(n => ['Chrome', 'Firefox', 'Edge', 'Safari'].includes(n))); // Selection const handleTabChange = (_: React.SyntheticEvent, newValue: string) => { @@ -116,7 +117,7 @@ const Executors = () => { setAgentFolder(null); setArch('x86_64'); }; - const currentSelectedExecutor = (selectedExecutors ?? []).filter((executor) => executor.executor_type === activeTab).at(0); + const currentSelectedExecutor = (selectedExecutors ?? []).filter(executor => executor.executor_type === activeTab).at(0); const platformSelector = () => { switch (platform) { case 'windows': @@ -268,8 +269,13 @@ SHA512: ca07dc1d0a5297e29327e483f4f35dadb254d96a16a5c33da5ad048e6965a3863d621518 <> - {t('Here, you can download and install simulation agents available in your executors. Depending on the integrations you have enabled, some of them may be unavailable.')}

- {t('Learn more information about how to setup simulation agents')} {t('in the documentation')}. + {t('Here, you can download and install simulation agents available in your executors. Depending on the integrations you have enabled, some of them may be unavailable.')} +
+
+ {t('Learn more information about how to setup simulation agents')} + {' '} + {t('in the documentation')} + .
@@ -277,7 +283,7 @@ SHA512: ca07dc1d0a5297e29327e483f4f35dadb254d96a16a5c33da5ad048e6965a3863d621518 openInstall('windows', windowsExecutors)} disabled={windowsExecutors.length === 0}>
- +
- {t('Install Windows Agent')} + + {' '} + {t('Install Windows Agent')}
{windowsExecutors.map((executor: Executor) => { @@ -326,7 +334,9 @@ SHA512: ca07dc1d0a5297e29327e483f4f35dadb254d96a16a5c33da5ad048e6965a3863d621518 color: linuxExecutors.length === 0 ? theme.palette.text?.disabled : theme.palette.text?.primary, }} > - {t('Install Linux Agent')} + + {' '} + {t('Install Linux Agent')}
{linuxExecutors.map((executor: Executor) => { @@ -362,7 +372,9 @@ SHA512: ca07dc1d0a5297e29327e483f4f35dadb254d96a16a5c33da5ad048e6965a3863d621518 color: macOsExecutors.length === 0 ? theme.palette.text?.disabled : theme.palette.text?.primary, }} > - {t('Install MacOS Agent')} + + {' '} + {t('Install MacOS Agent')}
{macOsExecutors.map((executor: Executor) => { @@ -398,7 +410,9 @@ SHA512: ca07dc1d0a5297e29327e483f4f35dadb254d96a16a5c33da5ad048e6965a3863d621518 color: browserExecutors.length === 0 ? theme.palette.text?.disabled : theme.palette.text?.primary, }} > - {t('Install Browser Agent')} + + {' '} + {t('Install Browser Agent')}
{browserExecutors.map((executor: Executor) => { @@ -430,123 +444,130 @@ SHA512: ca07dc1d0a5297e29327e483f4f35dadb254d96a16a5c33da5ad048e6965a3863d621518 {(selectedExecutors ?? []).map((executor) => { return ( - + ); })} {currentSelectedExecutor && ( -
+
{currentSelectedExecutor.executor_type === 'openbas_caldera' && ( -
- {platform === 'macos' && ( - - {t('Architecture')} - - - )} - {t('Step 1 - Install the agent')} - - {t('Installing the agent is requiring local administrator privileges.')} - - {platform === 'windows' && ( - <> +
+ {platform === 'macos' && ( + + {t('Architecture')} + + + )} + {t('Step 1 - Install the agent')} + + {t('Installing the agent is requiring local administrator privileges.')} + + {platform === 'windows' && ( + <> +

+ {t('You can whether directly copy and paste the following Powershell snippet in an elevated prompt or download the .ps1 script (and execute it as an administrator).')} +

+
{platformSelector().displayedCode}
+
+ + +
+ + )} + {platform !== 'windows' && ( + <> +

+ {t('You can whether directly copy and paste the following bash snippet in a root console or download the .sh script (and execute it as root).')} +

+ + {t('For the moment, the following snippet or script will not add the agent at boot. Please be sure to add it in rc.local or other files to make it persistent. We will release proper packages in the near future.')} + +
{platformSelector().displayedCode}
+
+ + +
+ + )} + {t('Step 2 - Add antivirus exclusions')} + + {t('The agent will never execute directly any payload.')} +

- {t('You can whether directly copy and paste the following Powershell snippet in an elevated prompt or download the .ps1 script (and execute it as an administrator).')} + {t('You will need to add proper antivirus exclusions for this agent (to ensure Caldera injects execution to work properly). It may not be necessary in the future but this is generally a good practice to ensure the agent will be always available.')}

-
{platformSelector().displayedCode}
-
- - -
- - )} - {platform !== 'windows' && ( - <> +
{platformSelector().exclusions}
+
+ )} + {currentSelectedExecutor.executor_type === 'openbas_agent' && ( +
+ {t('Step 1 - Install the agent')} + + {t('Installing the agent is requiring local administrator privileges.')} + + {platform === 'windows' && ( + <> +

+ {t('You can whether directly copy and paste the following Powershell snippet in an elevated prompt or download the .ps1 script (and execute it as an administrator).')} +

+
{platformAgentSelector().displayedCode}
+
+ + +
+ + )} + {platform !== 'windows' && ( + <> +

+ {t('You can whether directly copy and paste the following bash snippet in a root console or download the .sh script (and execute it as root).')} +

+
{platformAgentSelector().displayedCode}
+
+ + +
+ + )} + {t('Step 2 - Add antivirus exclusions')} + + {t('The agent will never execute directly any payload.')} +

- {t('You can whether directly copy and paste the following bash snippet in a root console or download the .sh script (and execute it as root).')} + {t('You will need to add proper antivirus exclusions for this agent (to ensure Caldera injects execution to work properly). It may not be necessary in the future but this is generally a good practice to ensure the agent will be always available.')}

- - {t('For the moment, the following snippet or script will not add the agent at boot. Please be sure to add it in rc.local or other files to make it persistent. We will release proper packages in the near future.')} - -
{platformSelector().displayedCode}
-
- - -
- - )} - {t('Step 2 - Add antivirus exclusions')} - - {t('The agent will never execute directly any payload.')} - -

- {t('You will need to add proper antivirus exclusions for this agent (to ensure Caldera injects execution to work properly). It may not be necessary in the future but this is generally a good practice to ensure the agent will be always available.')} -

-
{platformSelector().exclusions}
-
- )} - {currentSelectedExecutor.executor_type === 'openbas_agent' && ( -
- {t('Step 1 - Install the agent')} - - {t('Installing the agent is requiring local administrator privileges.')} - - {platform === 'windows' && ( - <> -

- {t('You can whether directly copy and paste the following Powershell snippet in an elevated prompt or download the .ps1 script (and execute it as an administrator).')} -

-
{platformAgentSelector().displayedCode}
-
- - +
{platformAgentSelector().exclusions}
- )} - {platform !== 'windows' && ( - <> -

- {t('You can whether directly copy and paste the following bash snippet in a root console or download the .sh script (and execute it as root).')} -

-
{platformAgentSelector().displayedCode}
-
- - + {currentSelectedExecutor.executor_type === 'openbas_tanium' && ( +
+ } + classes={{ root: classes.chip }} + label={t('documentation')} + /> + + {t('To install the agent please follow the')} + {' '} + + {currentSelectedExecutor.executor_name} + {' '} + {t('documentation')} + + . +
- )} - {t('Step 2 - Add antivirus exclusions')} - - {t('The agent will never execute directly any payload.')} - -

- {t('You will need to add proper antivirus exclusions for this agent (to ensure Caldera injects execution to work properly). It may not be necessary in the future but this is generally a good practice to ensure the agent will be always available.')} -

-
{platformAgentSelector().exclusions}
- )} - {currentSelectedExecutor.executor_type === 'openbas_tanium' && ( -
- } - classes={{ root: classes.chip }} - label={t('documentation')} - /> - - {t('To install the agent please follow the')} {currentSelectedExecutor.executor_name} {t('documentation')}. - -
- )} -
)} diff --git a/openbas-front/src/admin/components/assets/AssetStatus.tsx b/openbas-front/src/admin/components/assets/AssetStatus.tsx index 25400ed5a9..4c28615136 100644 --- a/openbas-front/src/admin/components/assets/AssetStatus.tsx +++ b/openbas-front/src/admin/components/assets/AssetStatus.tsx @@ -1,6 +1,7 @@ -import * as React from 'react'; import { Chip } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import * as React from 'react'; + import { useFormatter } from '../../../components/i18n'; const useStyles = makeStyles(() => ({ @@ -33,8 +34,8 @@ const inlineStyles = { }; interface Props { - variant: string, - status: string, + variant: string; + status: string; } const AssetStatus: React.FC = ({ variant, status }) => { diff --git a/openbas-front/src/admin/components/assets/Index.tsx b/openbas-front/src/admin/components/assets/Index.tsx index 43d557a0ff..532977514d 100644 --- a/openbas-front/src/admin/components/assets/Index.tsx +++ b/openbas-front/src/admin/components/assets/Index.tsx @@ -1,6 +1,7 @@ -import { Suspense, lazy } from 'react'; import { makeStyles } from '@mui/styles'; +import { lazy, Suspense } from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; + import { errorWrapper } from '../../../components/Error'; import Loader from '../../../components/Loader'; import NotFound from '../../../components/NotFound'; @@ -26,7 +27,7 @@ const Index = () => { {/* Not found */} - }/> + } />
diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupAddEndpoints.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupAddEndpoints.tsx index fc1ace4c09..df36a9188d 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupAddEndpoints.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupAddEndpoints.tsx @@ -1,10 +1,11 @@ import { FunctionComponent, useState } from 'react'; -import { useAppDispatch } from '../../../../utils/hooks'; + import { updateAssetsOnAssetGroup } from '../../../../actions/asset_groups/assetgroup-action'; import ButtonCreate from '../../../../components/common/ButtonCreate'; -import EndpointsDialogAdding from '../endpoints/EndpointsDialogAdding'; import { useFormatter } from '../../../../components/i18n'; +import { useAppDispatch } from '../../../../utils/hooks'; import type { UserStore } from '../../teams/players/Player'; +import EndpointsDialogAdding from '../endpoints/EndpointsDialogAdding'; import type { AssetGroupStore } from './AssetGroup'; interface Props { @@ -31,7 +32,7 @@ const AssetGroupAddEndpoints: FunctionComponent = ({ return dispatch(updateAssetsOnAssetGroup(assetGroupId, { asset_group_assets: endpointIds, })).then( - (result: { result: string, entities: { asset_groups: Record } }) => { + (result: { result: string; entities: { asset_groups: Record } }) => { if (result.result) { if (onUpdate) { const created = result.entities.asset_groups[result.result]; @@ -47,8 +48,11 @@ const AssetGroupAddEndpoints: FunctionComponent = ({ return ( <> setOpen(true)} /> - diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupCreation.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupCreation.tsx index be83a6b173..b1b88d1d33 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupCreation.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupCreation.tsx @@ -1,18 +1,18 @@ -import { FunctionComponent, useState } from 'react'; -import { ListItemButton, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; +import { ListItemButton, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useState } from 'react'; -import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { AssetGroupInput } from '../../../../utils/api-types'; -import Drawer from '../../../../components/common/Drawer'; import { addAssetGroup } from '../../../../actions/asset_groups/assetgroup-action'; -import AssetGroupForm from './AssetGroupForm'; import ButtonCreate from '../../../../components/common/ButtonCreate'; import Dialog from '../../../../components/common/Dialog'; -import type { AssetGroupStore } from './AssetGroup'; +import Drawer from '../../../../components/common/Drawer'; +import { useFormatter } from '../../../../components/i18n'; +import type { AssetGroupInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; import type { UserStore } from '../../teams/players/Player'; +import type { AssetGroupStore } from './AssetGroup'; +import AssetGroupForm from './AssetGroupForm'; const useStyles = makeStyles((theme: Theme) => ({ text: { @@ -39,7 +39,7 @@ const AssetGroupCreation: FunctionComponent = ({ const dispatch = useAppDispatch(); const onSubmit = (data: AssetGroupInput) => { dispatch(addAssetGroup(data)).then( - (result: { result: string, entities: { asset_groups: Record } }) => { + (result: { result: string; entities: { asset_groups: Record } }) => { if (result.result) { if (onCreate) { const created = result.entities.asset_groups[result.result]; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupDialogAdding.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupDialogAdding.tsx index d45d5806a8..edad3fb0f4 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupDialogAdding.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupDialogAdding.tsx @@ -1,13 +1,14 @@ -import { FunctionComponent, useEffect, useMemo, useState } from 'react'; import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; import { SelectGroup } from 'mdi-material-ui'; -import Transition from '../../../../components/common/Transition'; -import { useFormatter } from '../../../../components/i18n'; +import { FunctionComponent, useEffect, useMemo, useState } from 'react'; + import { findAssetGroups, searchAssetGroups } from '../../../../actions/asset_groups/assetgroup-action'; -import SelectList, { SelectListElements } from '../../../../components/common/SelectList'; -import { useQueryable } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; -import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; +import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; +import { useQueryable } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; +import SelectList, { SelectListElements } from '../../../../components/common/SelectList'; +import Transition from '../../../../components/common/Transition'; +import { useFormatter } from '../../../../components/i18n'; import type { AssetGroupOutput } from '../../../../utils/api-types'; interface Props { @@ -29,12 +30,12 @@ const AssetGroupDialogAdding: FunctionComponent = ({ const [assetGroupValues, setAssetGroupValues] = useState([]); useEffect(() => { if (open) { - findAssetGroups(initialState).then((result) => setAssetGroupValues(result.data)); + findAssetGroups(initialState).then(result => setAssetGroupValues(result.data)); } }, [open, initialState]); const addAssetGroup = (_assetGroupId: string, assetGroup: AssetGroupOutput) => setAssetGroupValues([...assetGroupValues, assetGroup]); - const removeAssetGroup = (assetGroupId: string) => setAssetGroupValues(assetGroupValues.filter((v) => v.asset_group_id !== assetGroupId)); + const removeAssetGroup = (assetGroupId: string) => setAssetGroupValues(assetGroupValues.filter(v => v.asset_group_id !== assetGroupId)); // Dialog const handleClose = () => { @@ -43,7 +44,7 @@ const AssetGroupDialogAdding: FunctionComponent = ({ }; const handleSubmit = () => { - onSubmit(assetGroupValues.map((v) => v.asset_group_id)); + onSubmit(assetGroupValues.map(v => v.asset_group_id)); handleClose(); }; @@ -69,14 +70,16 @@ const AssetGroupDialogAdding: FunctionComponent = ({ ]; const { queryableHelpers, searchPaginationInput } = useQueryable(buildSearchPagination({})); - const paginationComponent = ; + const paginationComponent = ( + + ); return ( ({ // Drawer Header @@ -83,8 +84,8 @@ const AssetGroupManagement: FunctionComponent = ({ const getAssetFromMap = (assets: string[]) => assets?.filter((endpointId: string) => !!endpointsMap[endpointId]).map((endpointId: string) => endpointsMap[endpointId]); const filteringAssets = useSearchAnFilter('asset', 'name', ['name']); - const assets = getAssetFromMap(assetGroup?.asset_group_assets ?? [])?.map((a) => ({ ...a, type: 'static' })) - .concat(getAssetFromMap(assetGroup?.asset_group_dynamic_assets ?? [])?.map((a) => ({ ...a, type: 'dynamic' }))); + const assets = getAssetFromMap(assetGroup?.asset_group_assets ?? [])?.map(a => ({ ...a, type: 'static' })) + .concat(getAssetFromMap(assetGroup?.asset_group_dynamic_assets ?? [])?.map(a => ({ ...a, type: 'dynamic' }))); const sortedAsset: EndpointStoreWithType[] = filteringAssets.filterAndSort(assets); return ( @@ -123,27 +124,28 @@ const AssetGroupManagement: FunctionComponent = ({
) - :   - } + /> + ) + :   } /> {userAdmin - && () - } + /> + )} ); }; diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupPopover.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupPopover.tsx index ef12aa8f28..d47c92dba3 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupPopover.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupPopover.tsx @@ -1,20 +1,20 @@ -import { FunctionComponent, useState } from 'react'; -import { Drawer as MuiDrawer, IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; - +import { Drawer as MuiDrawer, IconButton, Menu, MenuItem } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useState } from 'react'; + +import { deleteAssetGroup, updateAssetGroup, updateAssetsOnAssetGroup } from '../../../../actions/asset_groups/assetgroup-action'; +import Dialog from '../../../../components/common/Dialog'; +import DialogDelete from '../../../../components/common/DialogDelete'; +import Drawer from '../../../../components/common/Drawer'; +import { emptyFilterGroup } from '../../../../components/common/queryable/filter/FilterUtils'; import { useFormatter } from '../../../../components/i18n'; import type { AssetGroupInput, AssetGroupOutput } from '../../../../utils/api-types'; import { useAppDispatch } from '../../../../utils/hooks'; -import Drawer from '../../../../components/common/Drawer'; -import DialogDelete from '../../../../components/common/DialogDelete'; +import EndpointsDialogAdding from '../endpoints/EndpointsDialogAdding'; import type { AssetGroupStore } from './AssetGroup'; -import { deleteAssetGroup, updateAssetGroup, updateAssetsOnAssetGroup } from '../../../../actions/asset_groups/assetgroup-action'; import AssetGroupForm from './AssetGroupForm'; import AssetGroupManagement from './AssetGroupManagement'; -import Dialog from '../../../../components/common/Dialog'; -import EndpointsDialogAdding from '../endpoints/EndpointsDialogAdding'; -import { emptyFilterGroup } from '../../../../components/common/queryable/filter/FilterUtils'; const useStyles = makeStyles(() => ({ drawerPaper: { @@ -72,7 +72,7 @@ const AssetGroupPopover: FunctionComponent = ({ }; const submitEdit = (data: AssetGroupInput) => { dispatch(updateAssetGroup(assetGroup.asset_group_id, data)).then( - (result: { result: string, entities: { asset_groups: Record } }) => { + (result: { result: string; entities: { asset_groups: Record } }) => { if (result.entities) { if (onUpdate) { const updated = result.entities.asset_groups[result.result]; @@ -191,8 +191,10 @@ const AssetGroupPopover: FunctionComponent = ({ <> {selected !== undefined && ( setSelected(false)} onSubmit={sumitManage} + initialState={assetGroup.asset_group_assets ?? []} + open={selected} + onClose={() => setSelected(false)} + onSubmit={sumitManage} title={t('Add assets in this asset group')} /> )} diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroups.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroups.tsx index 586a240135..6ff787aee2 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroups.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroups.tsx @@ -1,32 +1,33 @@ -import { makeStyles } from '@mui/styles'; -import { Fragment, CSSProperties, useMemo, useState } from 'react'; import { Box, Chip, Drawer as MuiDrawer, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { SelectGroup } from 'mdi-material-ui'; +import { CSSProperties, Fragment, useMemo, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; -import { useFormatter } from '../../../../components/i18n'; -import { useHelper } from '../../../../store'; -import type { TagHelper, UserHelper } from '../../../../actions/helper'; -import type { AssetGroupStore } from './AssetGroup'; -import ItemTags from '../../../../components/ItemTags'; -import AssetGroupPopover from './AssetGroupPopover'; -import AssetGroupCreation from './AssetGroupCreation'; + import { searchAssetGroups } from '../../../../actions/asset_groups/assetgroup-action'; -import AssetGroupManagement from './AssetGroupManagement'; -import Breadcrumbs from '../../../../components/Breadcrumbs'; import type { EndpointHelper } from '../../../../actions/assets/asset-helper'; -import type { AssetGroupOutput } from '../../../../utils/api-types'; -import { initSorting } from '../../../../components/common/queryable/Page'; -import { useAppDispatch } from '../../../../utils/hooks'; +import type { TagHelper, UserHelper } from '../../../../actions/helper'; import { fetchTags } from '../../../../actions/Tag'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; -import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; +import Breadcrumbs from '../../../../components/Breadcrumbs'; +import ClickableModeChip from '../../../../components/common/chips/ClickableModeChip'; import ExportButton from '../../../../components/common/ExportButton'; -import { useQueryableWithLocalStorage } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; +import FilterChipValues from '../../../../components/common/queryable/filter/FilterChipValues'; +import { initSorting } from '../../../../components/common/queryable/Page'; +import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; +import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; import SortHeadersComponentV2 from '../../../../components/common/queryable/sort/SortHeadersComponentV2'; +import { useQueryableWithLocalStorage } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; import { Header } from '../../../../components/common/SortHeadersList'; -import ClickableModeChip from '../../../../components/common/chips/ClickableModeChip'; -import FilterChipValues from '../../../../components/common/queryable/filter/FilterChipValues'; +import { useFormatter } from '../../../../components/i18n'; +import ItemTags from '../../../../components/ItemTags'; +import { useHelper } from '../../../../store'; +import type { AssetGroupOutput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import type { AssetGroupStore } from './AssetGroup'; +import AssetGroupCreation from './AssetGroupCreation'; +import AssetGroupManagement from './AssetGroupManagement'; +import AssetGroupPopover from './AssetGroupPopover'; const useStyles = makeStyles(() => ({ itemHead: { @@ -73,19 +74,22 @@ const inlineStyles: Record = { const computeRuleValues = (assetGroup: AssetGroupOutput, t: (value: string) => string) => { const computeDynamic = () => { if (assetGroup.asset_group_dynamic_filter?.filters && assetGroup.asset_group_dynamic_filter?.filters.length > 0) { - return <> - {assetGroup.asset_group_dynamic_filter.filters.map((filter, idx) => ( - - {idx !== 0 && } - } - /> - ))} - ; + return ( + <> + {assetGroup.asset_group_dynamic_filter.filters.map((filter, idx) => ( + + {idx !== 0 && } + } + /> + + ))} + + ); } return (<>); }; @@ -93,7 +97,11 @@ const computeRuleValues = (assetGroup: AssetGroupOutput, t: (value: string) => s const computeStatic = () => { if (assetGroup.asset_group_assets && assetGroup.asset_group_assets?.length > 0) { return ( -
{assetGroup.asset_group_assets?.length} {t('managed assets')}
+
+ {assetGroup.asset_group_assets?.length} + {' '} + {t('managed assets')} +
); } return (<>); @@ -222,13 +230,13 @@ const AssetGroups = () => { > - } + )} /> {assetGroups.map((assetGroup: AssetGroupOutput) => ( @@ -243,9 +251,9 @@ const AssetGroups = () => { - {headers.map((header) => ( + {headers.map(header => (
{
))}
- } + )} /> setAssetGroups(assetGroups.map((ag) => (ag.asset_group_id !== result.asset_group_id ? ag : result)))} - onDelete={(result) => setAssetGroups(assetGroups.filter((ag) => (ag.asset_group_id !== result)))} - onRemoveEndpointFromAssetGroup={(assetId) => setAssetGroups(assetGroups.map((ag) => (ag.asset_group_id !== assetGroup.asset_group_id ? ag : { - ...ag, - asset_group_assets: ag?.asset_group_assets?.toSpliced(ag?.asset_group_assets?.indexOf(assetId), 1), - })))} + onUpdate={result => setAssetGroups(assetGroups.map(ag => (ag.asset_group_id !== result.asset_group_id ? ag : result)))} + onDelete={result => setAssetGroups(assetGroups.filter(ag => (ag.asset_group_id !== result)))} + onRemoveEndpointFromAssetGroup={assetId => setAssetGroups(assetGroups.map(ag => (ag.asset_group_id !== assetGroup.asset_group_id + ? ag + : { + ...ag, + asset_group_assets: ag?.asset_group_assets?.toSpliced(ag?.asset_group_assets?.indexOf(assetId), 1), + })))} openEditOnInit={assetGroup.asset_group_id === searchId} /> ))} - {userAdmin && setAssetGroups([result, ...assetGroups])} />} + {userAdmin && setAssetGroups([result, ...assetGroups])} />} { setSelectedAssetGroupId(undefined)} - onUpdate={(result) => setAssetGroups(assetGroups.map((ag) => (ag.asset_group_id !== result.asset_group_id ? ag : result)))} - onRemoveEndpointFromAssetGroup={(assetId) => setAssetGroups(assetGroups.map((ag) => (ag.asset_group_id !== selectedAssetGroupId ? ag : { - ...ag, - asset_group_assets: ag?.asset_group_assets?.toSpliced(ag?.asset_group_assets?.indexOf(assetId), 1), - })))} + onUpdate={result => setAssetGroups(assetGroups.map(ag => (ag.asset_group_id !== result.asset_group_id ? ag : result)))} + onRemoveEndpointFromAssetGroup={assetId => setAssetGroups(assetGroups.map(ag => (ag.asset_group_id !== selectedAssetGroupId + ? ag + : { + ...ag, + asset_group_assets: ag?.asset_group_assets?.toSpliced(ag?.asset_group_assets?.indexOf(assetId), 1), + })))} /> )} diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupsList.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupsList.tsx index fa204ee5ff..3fb7f55a63 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupsList.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupsList.tsx @@ -1,8 +1,9 @@ -import { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; -import * as React from 'react'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; -import { SelectGroup } from 'mdi-material-ui'; import { makeStyles } from '@mui/styles'; +import { SelectGroup } from 'mdi-material-ui'; +import { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; +import * as React from 'react'; + import ItemTags from '../../../../components/ItemTags'; import type { AssetGroupStore } from './AssetGroup'; @@ -63,7 +64,7 @@ const AssetGroupsList: FunctionComponent = ({
= ({
- } + )} /> {component(assetGroup)} diff --git a/openbas-front/src/admin/components/assets/asset_groups/DynamicAssetField.tsx b/openbas-front/src/admin/components/assets/asset_groups/DynamicAssetField.tsx index 4fa59c3cdf..7e558612fd 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/DynamicAssetField.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/DynamicAssetField.tsx @@ -1,11 +1,12 @@ -import { InputLabel, Tooltip } from '@mui/material'; import { InfoOutlined } from '@mui/icons-material'; +import { InputLabel, Tooltip } from '@mui/material'; import { FunctionComponent } from 'react'; + import FilterField from '../../../../components/common/queryable/filter/FilterField'; -import useFiltersState from '../../../../components/common/queryable/filter/useFiltersState'; import { emptyFilterGroup } from '../../../../components/common/queryable/filter/FilterUtils'; -import type { FilterGroup } from '../../../../utils/api-types'; +import useFiltersState from '../../../../components/common/queryable/filter/useFiltersState'; import { useFormatter } from '../../../../components/i18n'; +import type { FilterGroup } from '../../../../utils/api-types'; interface Props { value?: FilterGroup; diff --git a/openbas-front/src/admin/components/assets/endpoints/EndpointCreation.tsx b/openbas-front/src/admin/components/assets/endpoints/EndpointCreation.tsx index 946505f272..1b6afa3c85 100644 --- a/openbas-front/src/admin/components/assets/endpoints/EndpointCreation.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/EndpointCreation.tsx @@ -1,17 +1,17 @@ -import { FunctionComponent, useState } from 'react'; -import { ListItemButton, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; +import { ListItemButton, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useState } from 'react'; -import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { EndpointInput } from '../../../../utils/api-types'; -import EndpointForm from './EndpointForm'; import { addEndpoint } from '../../../../actions/assets/endpoint-actions'; -import Drawer from '../../../../components/common/Drawer'; -import Dialog from '../../../../components/common/Dialog'; import ButtonCreate from '../../../../components/common/ButtonCreate'; +import Dialog from '../../../../components/common/Dialog'; +import Drawer from '../../../../components/common/Drawer'; +import { useFormatter } from '../../../../components/i18n'; +import type { EndpointInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; import type { EndpointStore } from './Endpoint'; +import EndpointForm from './EndpointForm'; const useStyles = makeStyles((theme: Theme) => ({ text: { @@ -38,7 +38,7 @@ const EndpointCreation: FunctionComponent = ({ const dispatch = useAppDispatch(); const onSubmit = (data: EndpointInput) => { dispatch(addEndpoint(data)).then( - (result: { result: string, entities: { endpoints: Record } }) => { + (result: { result: string; entities: { endpoints: Record } }) => { if (result.entities) { if (onCreate) { const endpointCreated = result.entities.endpoints[result.result]; diff --git a/openbas-front/src/admin/components/assets/endpoints/EndpointForm.tsx b/openbas-front/src/admin/components/assets/endpoints/EndpointForm.tsx index a094bc8849..0e797ce5e4 100644 --- a/openbas-front/src/admin/components/assets/endpoints/EndpointForm.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/EndpointForm.tsx @@ -1,14 +1,15 @@ -import { Controller, SubmitHandler, useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button, FormHelperText, MenuItem, TextField } from '@mui/material'; +import { DateTimePicker as MuiDateTimePicker } from '@mui/x-date-pickers'; import { FormEventHandler, SyntheticEvent } from 'react'; import * as React from 'react'; -import { zodResolver } from '@hookform/resolvers/zod'; +import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { z } from 'zod'; -import { DateTimePicker as MuiDateTimePicker } from '@mui/x-date-pickers'; + +import TagField from '../../../../components/fields/TagField'; import { useFormatter } from '../../../../components/i18n'; import type { EndpointInput } from '../../../../utils/api-types'; import { zodImplement } from '../../../../utils/Zod'; -import TagField from '../../../../components/fields/TagField'; interface Props { onSubmit: SubmitHandler; @@ -112,7 +113,7 @@ const EndpointForm: React.FC = ({ helperText: errors.asset_last_seen?.message, }, }} - onChange={(date) => field.onChange(date?.toISOString())} + onChange={date => field.onChange(date?.toISOString())} ampm={false} format="yyyy-MM-dd HH:mm:ss" /> @@ -214,9 +215,9 @@ const EndpointForm: React.FC = ({ inputProps={register('endpoint_platform')} InputLabelProps={{ required: true }} > - {t('Linux')} - {t('Windows')} - {t('MacOS')} + {t('Linux')} + {t('Windows')} + {t('MacOS')} )} /> @@ -236,8 +237,8 @@ const EndpointForm: React.FC = ({ inputProps={register('endpoint_arch')} InputLabelProps={{ required: true }} > - {t('x86_64')} - {t('arm64')} + {t('x86_64')} + {t('arm64')} )} /> diff --git a/openbas-front/src/admin/components/assets/endpoints/EndpointPopover.tsx b/openbas-front/src/admin/components/assets/endpoints/EndpointPopover.tsx index 71d1fc6059..98aa83ce8a 100644 --- a/openbas-front/src/admin/components/assets/endpoints/EndpointPopover.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/EndpointPopover.tsx @@ -1,18 +1,19 @@ +import { MoreVert } from '@mui/icons-material'; +import { IconButton, Menu, MenuItem } from '@mui/material'; import { useState } from 'react'; import * as React from 'react'; -import { IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; + +import { updateAssetsOnAssetGroup } from '../../../../actions/asset_groups/assetgroup-action'; +import { deleteEndpoint, updateEndpoint } from '../../../../actions/assets/endpoint-actions'; +import Dialog from '../../../../components/common/Dialog'; +import DialogDelete from '../../../../components/common/DialogDelete'; +import Drawer from '../../../../components/common/Drawer'; import { useFormatter } from '../../../../components/i18n'; import type { EndpointInput } from '../../../../utils/api-types'; -import EndpointForm from './EndpointForm'; import { useAppDispatch } from '../../../../utils/hooks'; -import { deleteEndpoint, updateEndpoint } from '../../../../actions/assets/endpoint-actions'; -import Drawer from '../../../../components/common/Drawer'; -import DialogDelete from '../../../../components/common/DialogDelete'; -import { updateAssetsOnAssetGroup } from '../../../../actions/asset_groups/assetgroup-action'; -import Dialog from '../../../../components/common/Dialog'; -import { EndpointStoreWithType } from './EndpointsList'; import type { EndpointStore } from './Endpoint'; +import EndpointForm from './EndpointForm'; +import { EndpointStoreWithType } from './EndpointsList'; interface Props { inline?: boolean; @@ -64,7 +65,7 @@ const EndpointPopover: React.FC = ({ }; const submitEdit = (data: EndpointInput) => { dispatch(updateEndpoint(endpoint.asset_id, data)).then( - (result: { result: string, entities: { endpoints: Record } }) => { + (result: { result: string; entities: { endpoints: Record } }) => { if (result.entities) { if (onUpdate) { const endpointUpdated = result.entities.endpoints[result.result]; @@ -88,7 +89,7 @@ const EndpointPopover: React.FC = ({ if (assetGroupId) { dispatch( updateAssetsOnAssetGroup(assetGroupId, { - asset_group_assets: assetGroupEndpointIds?.filter((id) => id !== endpoint.asset_id), + asset_group_assets: assetGroupEndpointIds?.filter(id => id !== endpoint.asset_id), }), ).then(() => { if (onRemoveEndpointFromAssetGroup) { diff --git a/openbas-front/src/admin/components/assets/endpoints/Endpoints.tsx b/openbas-front/src/admin/components/assets/endpoints/Endpoints.tsx index 3651c0ea1d..b4845828f0 100644 --- a/openbas-front/src/admin/components/assets/endpoints/Endpoints.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/Endpoints.tsx @@ -1,29 +1,30 @@ -import { CSSProperties, useState } from 'react'; -import { makeStyles } from '@mui/styles'; -import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { DevicesOtherOutlined } from '@mui/icons-material'; +import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { CSSProperties, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; -import { useAppDispatch } from '../../../../utils/hooks'; -import EndpointCreation from './EndpointCreation'; -import EndpointPopover from './EndpointPopover'; -import { useHelper } from '../../../../store'; -import { useFormatter } from '../../../../components/i18n'; + +import { searchEndpoints } from '../../../../actions/assets/endpoint-actions'; +import { fetchExecutors } from '../../../../actions/Executor'; +import type { ExecutorHelper } from '../../../../actions/executors/executor-helper'; import type { TagHelper, UserHelper } from '../../../../actions/helper'; -import type { EndpointStore } from './Endpoint'; -import ItemTags from '../../../../components/ItemTags'; -import AssetStatus from '../AssetStatus'; +import { fetchTags } from '../../../../actions/Tag'; import Breadcrumbs from '../../../../components/Breadcrumbs'; import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; import { initSorting } from '../../../../components/common/queryable/Page'; -import type { SearchPaginationInput } from '../../../../utils/api-types'; -import { searchEndpoints } from '../../../../actions/assets/endpoint-actions'; +import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; +import { useFormatter } from '../../../../components/i18n'; +import ItemTags from '../../../../components/ItemTags'; import PlatformIcon from '../../../../components/PlatformIcon'; -import type { ExecutorHelper } from '../../../../actions/executors/executor-helper'; +import { useHelper } from '../../../../store'; +import type { SearchPaginationInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchExecutors } from '../../../../actions/Executor'; -import { fetchTags } from '../../../../actions/Tag'; -import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; +import AssetStatus from '../AssetStatus'; +import type { EndpointStore } from './Endpoint'; +import EndpointCreation from './EndpointCreation'; +import EndpointPopover from './EndpointPopover'; const useStyles = makeStyles(() => ({ itemHead: { @@ -148,14 +149,14 @@ const Endpoints = () => { > - } + )} /> @@ -168,44 +169,46 @@ const Endpoints = () => { divider > - +
{endpoint.asset_name}
- {endpoint.endpoint_platform} + + {' '} + {endpoint.endpoint_platform}
{endpoint.endpoint_arch}
{executor && ( - {executor.executor_type} + {executor.executor_type} )} {executor?.executor_name ?? t('Unknown')}
- +
- +
- } + )} /> setEndpoints(endpoints.map((e) => (e.asset_id !== result.asset_id ? e : result)))} - onDelete={(result) => setEndpoints(endpoints.filter((e) => (e.asset_id !== result)))} + onUpdate={result => setEndpoints(endpoints.map(e => (e.asset_id !== result.asset_id ? e : result)))} + onDelete={result => setEndpoints(endpoints.filter(e => (e.asset_id !== result)))} openEditOnInit={endpoint.asset_id === searchId} /> @@ -213,7 +216,7 @@ const Endpoints = () => { ); })} - {userAdmin && setEndpoints([result, ...endpoints])} />} + {userAdmin && setEndpoints([result, ...endpoints])} />} ); }; diff --git a/openbas-front/src/admin/components/assets/endpoints/EndpointsDialogAdding.tsx b/openbas-front/src/admin/components/assets/endpoints/EndpointsDialogAdding.tsx index b3a583fcb7..609eabac21 100644 --- a/openbas-front/src/admin/components/assets/endpoints/EndpointsDialogAdding.tsx +++ b/openbas-front/src/admin/components/assets/endpoints/EndpointsDialogAdding.tsx @@ -1,22 +1,23 @@ -import { FunctionComponent, useEffect, useMemo, useState } from 'react'; -import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; import { DevicesOtherOutlined } from '@mui/icons-material'; -import Transition from '../../../../components/common/Transition'; -import ItemTags from '../../../../components/ItemTags'; -import type { EndpointStore } from './Endpoint'; -import { useAppDispatch } from '../../../../utils/hooks'; -import { useFormatter } from '../../../../components/i18n'; -import { useHelper } from '../../../../store'; +import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; +import { FunctionComponent, useEffect, useMemo, useState } from 'react'; + import type { EndpointHelper } from '../../../../actions/assets/asset-helper'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { fetchEndpoints, searchEndpoints } from '../../../../actions/assets/endpoint-actions'; -import PlatformIcon from '../../../../components/PlatformIcon'; -import SelectList, { SelectListElements } from '../../../../components/common/SelectList'; +import { buildFilter } from '../../../../components/common/queryable/filter/FilterUtils'; import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; -import { useQueryable } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; +import { useQueryable } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; +import SelectList, { SelectListElements } from '../../../../components/common/SelectList'; +import Transition from '../../../../components/common/Transition'; +import { useFormatter } from '../../../../components/i18n'; +import ItemTags from '../../../../components/ItemTags'; +import PlatformIcon from '../../../../components/PlatformIcon'; +import { useHelper } from '../../../../store'; import type { FilterGroup } from '../../../../utils/api-types'; -import { buildFilter } from '../../../../components/common/queryable/filter/FilterUtils'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import type { EndpointStore } from './Endpoint'; interface Props { initialState: string[]; @@ -51,16 +52,16 @@ const EndpointsDialogAdding: FunctionComponent = ({ dispatch(fetchEndpoints()); }); - const [endpointValues, setEndpointValues] = useState(initialState.map((id) => endpointsMap[id])); + const [endpointValues, setEndpointValues] = useState(initialState.map(id => endpointsMap[id])); useEffect(() => { - setEndpointValues(initialState.map((id) => endpointsMap[id])); + setEndpointValues(initialState.map(id => endpointsMap[id])); }, [open, initialState]); const addEndpoint = (endpointId: string) => { setEndpointValues([...endpointValues, endpointsMap[endpointId]]); }; const removeEndpoint = (endpointId: string) => { - setEndpointValues(endpointValues.filter((v) => v.asset_id !== endpointId)); + setEndpointValues(endpointValues.filter(v => v.asset_id !== endpointId)); }; // Dialog @@ -70,7 +71,7 @@ const EndpointsDialogAdding: FunctionComponent = ({ }; const handleSubmit = () => { - onSubmit(endpointValues.map((v) => v.asset_id)); + onSubmit(endpointValues.map(v => v.asset_id)); handleClose(); }; @@ -87,10 +88,12 @@ const EndpointsDialogAdding: FunctionComponent = ({ }, { field: 'endpoint_platform', - value: (endpoint: EndpointStore) =>
- - {endpoint.endpoint_platform} -
, + value: (endpoint: EndpointStore) => ( +
+ + {endpoint.endpoint_platform} +
+ ), width: 20, }, { @@ -127,14 +130,16 @@ const EndpointsDialogAdding: FunctionComponent = ({ filterGroup: quickFilter, })); - const paginationComponent = ; + const paginationComponent = ( + + ); return ( ({ item: { @@ -80,7 +81,7 @@ const EndpointsList: FunctionComponent = ({
= ({ className={classes.bodyItem} style={inlineStyles.asset_platform} > - {endpoint.endpoint_platform} + + {' '} + {endpoint.endpoint_platform}
= ({ />
- } + )} /> {component(endpoint)} diff --git a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformCreation.tsx b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformCreation.tsx index fc6df44b0f..1055f45169 100644 --- a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformCreation.tsx +++ b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformCreation.tsx @@ -1,17 +1,17 @@ -import { FunctionComponent, useState } from 'react'; -import { ListItemButton, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; +import { ListItemButton, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useState } from 'react'; -import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { SecurityPlatformInput } from '../../../../utils/api-types'; -import SecurityPlatformForm from './SecurityPlatformForm'; import { addSecurityPlatform } from '../../../../actions/assets/securityPlatform-actions'; -import Drawer from '../../../../components/common/Drawer'; -import Dialog from '../../../../components/common/Dialog'; import ButtonCreate from '../../../../components/common/ButtonCreate'; +import Dialog from '../../../../components/common/Dialog'; +import Drawer from '../../../../components/common/Drawer'; +import { useFormatter } from '../../../../components/i18n'; +import type { SecurityPlatformInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; import type { SecurityPlatformStore } from './SecurityPlatform'; +import SecurityPlatformForm from './SecurityPlatformForm'; const useStyles = makeStyles((theme: Theme) => ({ text: { @@ -38,7 +38,7 @@ const SecurityPlatformCreation: FunctionComponent = ({ const dispatch = useAppDispatch(); const onSubmit = (data: SecurityPlatformInput) => { dispatch(addSecurityPlatform(data)).then( - (result: { result: string, entities: { securityplatforms: Record } }) => { + (result: { result: string; entities: { securityplatforms: Record } }) => { if (result.entities) { if (onCreate) { const securityPlatformCreated = result.entities.securityplatforms[result.result]; diff --git a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformForm.tsx b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformForm.tsx index dbb465e345..7147f56b16 100644 --- a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformForm.tsx +++ b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformForm.tsx @@ -1,14 +1,15 @@ -import { Controller, SubmitHandler, useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button, MenuItem, TextField } from '@mui/material'; import { SyntheticEvent } from 'react'; import * as React from 'react'; -import { zodResolver } from '@hookform/resolvers/zod'; +import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { z } from 'zod'; + +import FileLoader from '../../../../components/fields/FileLoader'; +import TagField from '../../../../components/fields/TagField'; import { useFormatter } from '../../../../components/i18n'; import type { SecurityPlatformInput } from '../../../../utils/api-types'; import { zodImplement } from '../../../../utils/Zod'; -import TagField from '../../../../components/fields/TagField'; -import FileLoader from '../../../../components/fields/FileLoader'; interface Props { onSubmit: SubmitHandler; @@ -89,12 +90,12 @@ const SecurityPlatformForm: React.FC = ({ inputProps={register('security_platform_type')} InputLabelProps={{ required: true }} > - {t('EDR')} - {t('XDR')} - {t('SIEM')} - {t('SOAR')} - {t('NDR')} - {t('ISPM')} + {t('EDR')} + {t('XDR')} + {t('SIEM')} + {t('SOAR')} + {t('NDR')} + {t('ISPM')} )} /> @@ -117,7 +118,9 @@ const SecurityPlatformForm: React.FC = ({ name="security_platform_logo_light" label={t('Logo light')} extensions={['png', 'jpg', 'jpeg', 'svg', 'gif']} - setFieldValue={(_name, document) => { onChange(document?.id); }} + setFieldValue={(_name, document) => { + onChange(document?.id); + }} initialValue={{ id: value }} /> )} @@ -130,7 +133,9 @@ const SecurityPlatformForm: React.FC = ({ name="security_platform_logo_dark" label={t('Logo dark')} extensions={['png', 'jpg', 'tiff', 'tif', 'bmp', 'jpeg', 'svg', 'gif']} - setFieldValue={(_name, document) => { onChange(document?.id); }} + setFieldValue={(_name, document) => { + onChange(document?.id); + }} initialValue={{ id: value }} /> )} diff --git a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformPopover.tsx b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformPopover.tsx index 7a61533848..0af12cf1b5 100644 --- a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformPopover.tsx +++ b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatformPopover.tsx @@ -1,16 +1,17 @@ +import { MoreVert } from '@mui/icons-material'; +import { IconButton, Menu, MenuItem } from '@mui/material'; import { useState } from 'react'; import * as React from 'react'; -import { IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; + +import { deleteSecurityPlatform, updateSecurityPlatform } from '../../../../actions/assets/securityPlatform-actions'; +import Dialog from '../../../../components/common/Dialog'; +import DialogDelete from '../../../../components/common/DialogDelete'; +import Drawer from '../../../../components/common/Drawer'; import { useFormatter } from '../../../../components/i18n'; import type { SecurityPlatformInput } from '../../../../utils/api-types'; -import SecurityPlatformForm from './SecurityPlatformForm'; import { useAppDispatch } from '../../../../utils/hooks'; -import { deleteSecurityPlatform, updateSecurityPlatform } from '../../../../actions/assets/securityPlatform-actions'; -import Drawer from '../../../../components/common/Drawer'; -import DialogDelete from '../../../../components/common/DialogDelete'; -import Dialog from '../../../../components/common/Dialog'; import type { SecurityPlatformStore } from './SecurityPlatform'; +import SecurityPlatformForm from './SecurityPlatformForm'; export type SecurityPlatformStoreWithType = SecurityPlatformStore & { type: string }; @@ -68,7 +69,7 @@ const SecurityPlatformPopover: React.FC = ({ }; const submitEdit = (data: SecurityPlatformInput) => { dispatch(updateSecurityPlatform(securityPlatform.asset_id, data)).then( - (result: { result: string, entities: { securityplatforms: Record } }) => { + (result: { result: string; entities: { securityplatforms: Record } }) => { if (result.entities) { if (onUpdate) { const securityPlatformUpdated = result.entities.securityplatforms[result.result]; diff --git a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatforms.tsx b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatforms.tsx index b15729cbdf..e2c09e5188 100644 --- a/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatforms.tsx +++ b/openbas-front/src/admin/components/assets/security_platforms/SecurityPlatforms.tsx @@ -1,23 +1,24 @@ -import { CSSProperties, useState } from 'react'; -import { makeStyles, useTheme } from '@mui/styles'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; +import { CSSProperties, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; -import SecurityPlatformCreation from './SecurityPlatformCreation'; -import SecurityPlatformPopover from './SecurityPlatformPopover'; -import { useHelper } from '../../../../store'; -import { useFormatter } from '../../../../components/i18n'; + +import { searchSecurityPlatforms } from '../../../../actions/assets/securityPlatform-actions'; import type { UserHelper } from '../../../../actions/helper'; -import type { SecurityPlatformStore } from './SecurityPlatform'; -import ItemTags from '../../../../components/ItemTags'; import Breadcrumbs from '../../../../components/Breadcrumbs'; import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; import { initSorting } from '../../../../components/common/queryable/Page'; -import type { SearchPaginationInput } from '../../../../utils/api-types'; -import { searchSecurityPlatforms } from '../../../../actions/assets/securityPlatform-actions'; +import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; +import { useFormatter } from '../../../../components/i18n'; +import ItemTags from '../../../../components/ItemTags'; import type { Theme } from '../../../../components/Theme'; +import { useHelper } from '../../../../store'; +import type { SearchPaginationInput } from '../../../../utils/api-types'; import { isNotEmptyField } from '../../../../utils/utils'; -import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; +import type { SecurityPlatformStore } from './SecurityPlatform'; +import SecurityPlatformCreation from './SecurityPlatformCreation'; +import SecurityPlatformPopover from './SecurityPlatformPopover'; const useStyles = makeStyles(() => ({ itemHead: { @@ -129,14 +130,14 @@ const SecurityPlatforms = () => { - } + )} />   @@ -155,7 +156,7 @@ const SecurityPlatforms = () => { />
{securityPlatform.asset_name} @@ -167,16 +168,16 @@ const SecurityPlatforms = () => { {securityPlatform.asset_description}
- +
- } + )} /> setSecurityPlatforms(securityPlatforms.map((e) => (e.asset_id !== result.asset_id ? e : result)))} - onDelete={(result) => setSecurityPlatforms(securityPlatforms.filter((e) => (e.asset_id !== result)))} + onUpdate={result => setSecurityPlatforms(securityPlatforms.map(e => (e.asset_id !== result.asset_id ? e : result)))} + onDelete={result => setSecurityPlatforms(securityPlatforms.filter(e => (e.asset_id !== result)))} openEditOnInit={securityPlatform.asset_id === searchId} disabled={isNotEmptyField(securityPlatform.asset_external_reference)} /> @@ -185,7 +186,7 @@ const SecurityPlatforms = () => { ); })} - {userAdmin && setSecurityPlatforms([result, ...securityPlatforms])} />} + {userAdmin && setSecurityPlatforms([result, ...securityPlatforms])} />} ); }; diff --git a/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx b/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx index 40b1d899ec..9944f40364 100644 --- a/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx +++ b/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx @@ -1,21 +1,22 @@ +import * as R from 'ramda'; import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import * as R from 'ramda'; + +import { createAtomicTesting, searchAtomicTestings } from '../../../actions/atomic_testings/atomic-testing-actions'; +import type { UserHelper } from '../../../actions/helper'; +import Breadcrumbs from '../../../components/Breadcrumbs'; +import ButtonCreate from '../../../components/common/ButtonCreate'; +import { buildEmptyFilter } from '../../../components/common/queryable/filter/FilterUtils'; +import { initSorting } from '../../../components/common/queryable/Page'; +import { buildSearchPagination } from '../../../components/common/queryable/QueryableUtils'; +import { useQueryableWithLocalStorage } from '../../../components/common/queryable/useQueryableWithLocalStorage'; import { useFormatter } from '../../../components/i18n'; import { useHelper } from '../../../store'; -import Breadcrumbs from '../../../components/Breadcrumbs'; -import type { UserHelper } from '../../../actions/helper'; import type { FilterGroup, Inject, InjectResultDTO } from '../../../utils/api-types'; -import { createAtomicTesting, searchAtomicTestings } from '../../../actions/atomic_testings/atomic-testing-actions'; +import { TeamContext } from '../common/Context'; import CreateInject from '../common/injects/CreateInject'; -import InjectDtoList from './InjectDtoList'; -import { buildEmptyFilter } from '../../../components/common/queryable/filter/FilterUtils'; -import { useQueryableWithLocalStorage } from '../../../components/common/queryable/useQueryableWithLocalStorage'; -import { buildSearchPagination } from '../../../components/common/queryable/QueryableUtils'; -import { initSorting } from '../../../components/common/queryable/Page'; -import ButtonCreate from '../../../components/common/ButtonCreate'; import teamContextForAtomicTesting from './atomic_testing/context/TeamContextForAtomicTesting'; -import { TeamContext } from '../common/Context'; +import InjectDtoList from './InjectDtoList'; // eslint-disable-next-line consistent-return const AtomicTestings = () => { @@ -71,24 +72,25 @@ const AtomicTestings = () => { `/admin/atomic_testings/${injectId}`} + goTo={injectId => `/admin/atomic_testings/${injectId}`} queryableHelpers={queryableHelpers} searchPaginationInput={searchPaginationInput} availableFilterNames={availableFilterNames} /> - {userAdmin && (<> - setOpenCreateDrawer(true)} /> - - setOpenCreateDrawer(false)} - /> - - ) - } + {userAdmin && ( + <> + setOpenCreateDrawer(true)} /> + + setOpenCreateDrawer(false)} + /> + + + )} ); }; diff --git a/openbas-front/src/admin/components/atomic_testings/InjectDtoList.tsx b/openbas-front/src/admin/components/atomic_testings/InjectDtoList.tsx index 0307546777..48ba77899b 100644 --- a/openbas-front/src/admin/components/atomic_testings/InjectDtoList.tsx +++ b/openbas-front/src/admin/components/atomic_testings/InjectDtoList.tsx @@ -1,22 +1,23 @@ +import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { CSSProperties, FunctionComponent, useMemo, useState } from 'react'; import { Link } from 'react-router-dom'; -import { makeStyles } from '@mui/styles'; -import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; -import { useFormatter } from '../../../components/i18n'; -import InjectIcon from '../common/injects/InjectIcon'; -import type { InjectResultDTO, SearchPaginationInput } from '../../../utils/api-types'; -import Empty from '../../../components/Empty'; + import { type Page } from '../../../components/common/queryable/Page'; -import InjectorContract from '../common/injects/InjectorContract'; -import AtomicTestingPopover from './atomic_testing/AtomicTestingPopover'; -import { isNotEmptyField } from '../../../utils/utils'; -import { QueryableHelpers } from '../../../components/common/queryable/QueryableHelpers'; import PaginationComponentV2 from '../../../components/common/queryable/pagination/PaginationComponentV2'; +import { QueryableHelpers } from '../../../components/common/queryable/QueryableHelpers'; import SortHeadersComponentV2 from '../../../components/common/queryable/sort/SortHeadersComponentV2'; import { Header } from '../../../components/common/SortHeadersList'; +import Empty from '../../../components/Empty'; +import { useFormatter } from '../../../components/i18n'; import ItemStatus from '../../../components/ItemStatus'; -import AtomicTestingResult from './atomic_testing/AtomicTestingResult'; import ItemTargets from '../../../components/ItemTargets'; +import type { InjectResultDTO, SearchPaginationInput } from '../../../utils/api-types'; +import { isNotEmptyField } from '../../../utils/utils'; +import InjectIcon from '../common/injects/InjectIcon'; +import InjectorContract from '../common/injects/InjectorContract'; +import AtomicTestingPopover from './atomic_testing/AtomicTestingPopover'; +import AtomicTestingResult from './atomic_testing/AtomicTestingResult'; const useStyles = makeStyles(() => ({ itemHead: { @@ -39,25 +40,25 @@ const useStyles = makeStyles(() => ({ })); const inlineStyles: Record = { - inject_type: { + 'inject_type': { width: '10%', }, - inject_title: { + 'inject_title': { width: '20%', }, 'inject_status.tracking_sent_date': { width: '15%', }, - inject_status: { + 'inject_status': { width: '10%', }, - inject_targets: { + 'inject_targets': { width: '20%', }, - inject_expectations: { + 'inject_expectations': { width: '10%', }, - inject_updated_at: { + 'inject_updated_at': { width: '15%', }, }; @@ -170,13 +171,13 @@ const InjectDtoList: FunctionComponent = ({ > - } + )} /> {injects.map((injectDto) => { @@ -185,14 +186,14 @@ const InjectDtoList: FunctionComponent = ({ key={injectDto.inject_id} classes={{ root: classes.item }} divider - secondaryAction={ + secondaryAction={( setInjects(injects.filter((e) => (e.inject_id !== result)))} + onDelete={result => setInjects(injects.filter(e => (e.inject_id !== result)))} inList /> - } + )} disablePadding > = ({ /> - {headers.map((header) => ( + {headers.map(header => (
= ({
))}
- } + )} /> diff --git a/openbas-front/src/admin/components/atomic_testings/InjectResultDtoContext.ts b/openbas-front/src/admin/components/atomic_testings/InjectResultDtoContext.ts index d22f42129a..30e679dea3 100644 --- a/openbas-front/src/admin/components/atomic_testings/InjectResultDtoContext.ts +++ b/openbas-front/src/admin/components/atomic_testings/InjectResultDtoContext.ts @@ -1,7 +1,8 @@ import { createContext } from 'react'; + import type { InjectResultDTO } from '../../../utils/api-types'; -export type InjectResultDtoContextType = { injectResultDto: InjectResultDTO | null, updateInjectResultDto: (data: InjectResultDTO) => void }; +export type InjectResultDtoContextType = { injectResultDto: InjectResultDTO | null; updateInjectResultDto: (data: InjectResultDTO) => void }; export const InjectResultDtoContext = createContext({ injectResultDto: null, updateInjectResultDto: () => { diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTesting.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTesting.tsx index b7d517eddf..6db74c69a9 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTesting.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTesting.tsx @@ -1,21 +1,22 @@ -import { useContext, useEffect, useState } from 'react'; import { Chip, Grid, List, Paper, Tooltip, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import type { AttackPattern, InjectTargetWithResult, KillChainPhase } from '../../../../utils/api-types'; -import ResponsePie from '../../common/injects/ResponsePie'; +import { useContext, useEffect, useState } from 'react'; + import Empty from '../../../../components/Empty'; -import { useFormatter } from '../../../../components/i18n'; -import TargetResultsDetail from './TargetResultsDetail'; -import useSearchAnFilter from '../../../../utils/SortingFiltering'; -import TargetListItem from './TargetListItem'; import ExpandableMarkdown from '../../../../components/ExpandableMarkdown'; +import { useFormatter } from '../../../../components/i18n'; import ItemStatus from '../../../../components/ItemStatus'; +import Loader from '../../../../components/Loader'; +import PlatformIcon from '../../../../components/PlatformIcon'; import SearchFilter from '../../../../components/SearchFilter'; +import type { AttackPattern, InjectTargetWithResult, KillChainPhase } from '../../../../utils/api-types'; +import useSearchAnFilter from '../../../../utils/SortingFiltering'; +import { isNotEmptyField } from '../../../../utils/utils'; import InjectIcon from '../../common/injects/InjectIcon'; -import PlatformIcon from '../../../../components/PlatformIcon'; -import Loader from '../../../../components/Loader'; +import ResponsePie from '../../common/injects/ResponsePie'; import { InjectResultDtoContext, InjectResultDtoContextType } from '../InjectResultDtoContext'; -import { isNotEmptyField } from '../../../../utils/utils'; +import TargetListItem from './TargetListItem'; +import TargetResultsDetail from './TargetResultsDetail'; const useStyles = makeStyles(() => ({ chip: { @@ -104,11 +105,11 @@ const AtomicTesting = () => { variant="inline" isPayload={isNotEmptyField(injectResultDto.inject_injector_contract?.injector_contract_payload)} type={ - injectResultDto.inject_injector_contract?.injector_contract_payload - ? injectResultDto.inject_injector_contract.injector_contract_payload?.payload_collector_type - || injectResultDto.inject_injector_contract.injector_contract_payload?.payload_type - : injectResultDto.inject_type - } + injectResultDto.inject_injector_contract?.injector_contract_payload + ? injectResultDto.inject_injector_contract.injector_contract_payload?.payload_collector_type + || injectResultDto.inject_injector_contract.injector_contract_payload?.payload_type + : injectResultDto.inject_type + } />
{ {sortedTargets.length > 0 ? ( - {sortedTargets.map((target) => ( + {sortedTargets.map(target => (
handleTargetClick(target)} target={target} selected={selectedTarget?.id === target.id} /> - {target?.children?.map((child) => ( - handleTargetClick(child, target)} - target={child} selected={selectedTarget?.id === child.id && currentParentTarget?.id === target.id} + {target?.children?.map(child => ( + handleTargetClick(child, target)} + target={child} + selected={selectedTarget?.id === child.id && currentParentTarget?.id === target.id} /> ))} @@ -251,16 +256,16 @@ const AtomicTesting = () => { {selectedTarget && !!injectResultDto.inject_type && ( - + )} {!selectedTarget && ( - + )} diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingDetail.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingDetail.tsx index 8143feb3b9..6f3077a648 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingDetail.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingDetail.tsx @@ -1,15 +1,16 @@ -import { FunctionComponent, useContext } from 'react'; -import { Props } from 'html-react-parser/lib/attributes-to-props'; import { Grid, Paper, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { Props } from 'html-react-parser/lib/attributes-to-props'; +import { FunctionComponent, useContext } from 'react'; + +import { fetchDocuments } from '../../../../actions/Document'; +import type { DocumentHelper } from '../../../../actions/helper'; import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; -import { useHelper } from '../../../../store'; import ItemStatus from '../../../../components/ItemStatus'; -import { InjectResultDtoContext, InjectResultDtoContextType } from '../InjectResultDtoContext'; +import { useHelper } from '../../../../store'; +import { useAppDispatch } from '../../../../utils/hooks'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchDocuments } from '../../../../actions/Document'; -import type { DocumentHelper } from '../../../../actions/helper'; +import { InjectResultDtoContext, InjectResultDtoContextType } from '../InjectResultDtoContext'; const useStyles = makeStyles(() => ({ paper: { @@ -73,15 +74,17 @@ const AtomicTestingDetail: FunctionComponent = () => { { injectResultDto.inject_expectations !== undefined && injectResultDto.inject_expectations.length > 0 - ? Array.from(new Set(injectResultDto.inject_expectations.map((expectation) => expectation.inject_expectation_name))) + ? Array.from(new Set(injectResultDto.inject_expectations.map(expectation => expectation.inject_expectation_name))) .map((name, index) => ( {name} )) - : - {'-'} - + : ( + + - + + ) }
@@ -97,9 +100,11 @@ const AtomicTestingDetail: FunctionComponent = () => { {document?.document_name ?? '-'} ); - }) : - {'-'} - + }) : ( + + - + + ) }
@@ -117,33 +122,39 @@ const AtomicTestingDetail: FunctionComponent = () => { {t('Content')} - {(injectResultDto.inject_commands_lines?.content?.length ?? 0) > 0 ?
-              
-                {injectResultDto.inject_commands_lines?.content?.map((content, index) => (
-                  
  • {content}
  • - ))} -
    -
    : '-'} + {(injectResultDto.inject_commands_lines?.content?.length ?? 0) > 0 ? ( +
    +                
    +                  {injectResultDto.inject_commands_lines?.content?.map((content, index) => (
    +                    
  • {content}
  • + ))} +
    +
    + ) : '-'} {t('Cleanup command')} - {(injectResultDto.inject_commands_lines?.cleanup_command?.length ?? 0) > 0 ?
    -              
    -                {injectResultDto.inject_commands_lines?.cleanup_command?.map((content, index) => (
    -                  
  • {content}
  • - ))} -
    -
    : '-'} + {(injectResultDto.inject_commands_lines?.cleanup_command?.length ?? 0) > 0 ? ( +
    +                
    +                  {injectResultDto.inject_commands_lines?.cleanup_command?.map((content, index) => (
    +                    
  • {content}
  • + ))} +
    +
    + ) : '-'} {t('External ID')} - {injectResultDto.inject_commands_lines?.external_id ?
    -              
    -                {injectResultDto.inject_commands_lines?.external_id}
    -              
    -            
    : '-'} + {injectResultDto.inject_commands_lines?.external_id ? ( +
    +                
    +                  {injectResultDto.inject_commands_lines?.external_id}
    +                
    +              
    + ) : '-'} - + )} {t('Execution logs')} @@ -153,8 +164,7 @@ const AtomicTestingDetail: FunctionComponent = () => { {t('Status')} {injectResultDto.inject_status?.status_name - && - } + && } {t('Traces')} @@ -162,26 +172,42 @@ const AtomicTestingDetail: FunctionComponent = () => { {injectResultDto.inject_status?.tracking_sent_date ? ( <> - {t('Tracking Sent Date')}: {injectResultDto.inject_status?.tracking_sent_date} + {t('Tracking Sent Date')} + : + {injectResultDto.inject_status?.tracking_sent_date} - {t('Tracking Ack Date')}: {injectResultDto.inject_status?.tracking_ack_date} + {t('Tracking Ack Date')} + : + {injectResultDto.inject_status?.tracking_ack_date} - {t('Tracking End Date')}: {injectResultDto.inject_status?.tracking_end_date} + {t('Tracking End Date')} + : + {injectResultDto.inject_status?.tracking_end_date} {t('Tracking Total Execution')} - {t('Time')}: {injectResultDto.inject_status?.tracking_total_execution_time} {t('ms')} + {t('Time')} + : + {injectResultDto.inject_status?.tracking_total_execution_time} + {' '} + {t('ms')} - {t('Tracking Total Count')}: {injectResultDto.inject_status?.tracking_total_count} + {t('Tracking Total Count')} + : + {injectResultDto.inject_status?.tracking_total_count} - {t('Tracking Total Error')}: {injectResultDto.inject_status?.tracking_total_error} + {t('Tracking Total Error')} + : + {injectResultDto.inject_status?.tracking_total_error} - {t('Tracking Total Success')}: {injectResultDto.inject_status?.tracking_total_success} + {t('Tracking Total Success')} + : + {injectResultDto.inject_status?.tracking_total_success} ) : ( @@ -192,7 +218,8 @@ const AtomicTestingDetail: FunctionComponent = () => { {(injectResultDto.inject_status?.status_traces?.length ?? 0) > 0 && ( <> - {t('Traces')}: + {t('Traces')} + :
      {injectResultDto.inject_status?.status_traces?.map((trace, index) => ( diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingHeader.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingHeader.tsx index f01e37b4f2..876283bf77 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingHeader.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingHeader.tsx @@ -1,16 +1,17 @@ -import { useContext, useState } from 'react'; -import { Alert, Button, Dialog, DialogActions, DialogContent, DialogContentText, Tooltip, Typography } from '@mui/material'; import { PlayArrowOutlined, SettingsOutlined } from '@mui/icons-material'; +import { Alert, Button, Dialog, DialogActions, DialogContent, DialogContentText, Tooltip, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { useContext, useState } from 'react'; import { useNavigate } from 'react-router-dom'; + import { fetchInjectResultDto, tryAtomicTesting } from '../../../../actions/atomic_testings/atomic-testing-actions'; -import AtomicTestingPopover from './AtomicTestingPopover'; -import { useFormatter } from '../../../../components/i18n'; import Transition from '../../../../components/common/Transition'; -import { truncate } from '../../../../utils/String'; +import { useFormatter } from '../../../../components/i18n'; import Loader from '../../../../components/Loader'; -import { InjectResultDtoContext, InjectResultDtoContextType } from '../InjectResultDtoContext'; import type { InjectResultDTO } from '../../../../utils/api-types'; +import { truncate } from '../../../../utils/String'; +import { InjectResultDtoContext, InjectResultDtoContextType } from '../InjectResultDtoContext'; +import AtomicTestingPopover from './AtomicTestingPopover'; import AtomicTestingUpdate from './AtomicTestingUpdate'; const useStyles = makeStyles(() => ({ @@ -71,38 +72,39 @@ const AtomicTestingHeader = () => {
      {/* eslint-disable-next-line no-nested-ternary */} {injectResultDto.inject_injector_contract ? ( - !injectResultDto.inject_ready ? ( - <> - - - - ) : ( - - )) : null - } + !injectResultDto.inject_ready + ? ( + <> + + + + ) + : ( + + )) : null} = ({ <> {actions.includes('Duplicate') - && - } + /> + )} {actions.includes(('Update')) - && - } + /> + )} {actions.includes('Delete') - && } + /> + )} ); }; diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingResult.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingResult.tsx index 5e56621f75..f0defbc5fa 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingResult.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingResult.tsx @@ -1,6 +1,7 @@ -import * as React from 'react'; import { SensorOccupiedOutlined, ShieldOutlined, TrackChangesOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; +import * as React from 'react'; + import type { ExpectationResultsByType, InjectResultDTO } from '../../../../utils/api-types'; const useStyles = makeStyles(() => ({ @@ -13,7 +14,7 @@ const useStyles = makeStyles(() => ({ interface Props { expectations: ExpectationResultsByType[] | undefined; - injectId?: InjectResultDTO['inject_id'] + injectId?: InjectResultDTO['inject_id']; } const AtomicTestingResult: React.FC = ({ expectations, injectId }) => { @@ -52,7 +53,7 @@ const AtomicTestingResult: React.FC = ({ expectations, injectId }) => { IconComponent = SensorOccupiedOutlined; } return ( - + ); })}
      diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingUpdate.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingUpdate.tsx index 7eb840dff1..88ffe3f67a 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingUpdate.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/AtomicTestingUpdate.tsx @@ -1,8 +1,9 @@ -import { FunctionComponent, useContext } from 'react'; import * as R from 'ramda'; -import UpdateInject from '../../common/injects/UpdateInject'; -import type { Inject, InjectResultDTO } from '../../../../utils/api-types'; +import { FunctionComponent, useContext } from 'react'; + import { updateAtomicTesting } from '../../../../actions/atomic_testings/atomic-testing-actions'; +import type { Inject, InjectResultDTO } from '../../../../utils/api-types'; +import UpdateInject from '../../common/injects/UpdateInject'; import { InjectResultDtoContext, InjectResultDtoContextType } from '../InjectResultDtoContext'; interface Props { diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/Index.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/Index.tsx index 8a16de0ac7..2e7503e96a 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/Index.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/Index.tsx @@ -1,19 +1,20 @@ +import { Box, Tab, Tabs } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { lazy, Suspense, useEffect, useState } from 'react'; import { Link, Route, Routes, useLocation, useParams } from 'react-router-dom'; import { interval } from 'rxjs'; -import { Box, Tab, Tabs } from '@mui/material'; -import { makeStyles } from '@mui/styles'; -import Loader from '../../../../components/Loader'; + +import { fetchInjectResultDto } from '../../../../actions/atomic_testings/atomic-testing-actions'; +import Breadcrumbs from '../../../../components/Breadcrumbs'; import { errorWrapper } from '../../../../components/Error'; -import NotFound from '../../../../components/NotFound'; import { useFormatter } from '../../../../components/i18n'; -import Breadcrumbs from '../../../../components/Breadcrumbs'; -import AtomicTestingHeader from './AtomicTestingHeader'; -import { fetchInjectResultDto } from '../../../../actions/atomic_testings/atomic-testing-actions'; +import Loader from '../../../../components/Loader'; +import NotFound from '../../../../components/NotFound'; import type { InjectResultDTO } from '../../../../utils/api-types'; -import { InjectResultDtoContext } from '../InjectResultDtoContext'; import { FIVE_SECONDS } from '../../../../utils/Time'; import { TeamContext } from '../../common/Context'; +import { InjectResultDtoContext } from '../InjectResultDtoContext'; +import AtomicTestingHeader from './AtomicTestingHeader'; import teamContextForAtomicTesting from './context/TeamContextForAtomicTesting'; const interval$ = interval(FIVE_SECONDS); @@ -75,10 +76,12 @@ const Index = () => { return ( - ({ bodyTarget: { @@ -61,7 +62,7 @@ const TargetListItem: React.FC = ({ isChild, onClick, target, selected }) {getIcon(target?.targetType)}
      {target?.name} @@ -74,7 +75,7 @@ const TargetListItem: React.FC = ({ isChild, onClick, target, selected })
    - } + )} /> diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx index 24566f0ad9..ad50b57f59 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx @@ -1,5 +1,4 @@ -import { FunctionComponent, useContext, useEffect, useState } from 'react'; -import * as React from 'react'; +import { AddBoxOutlined, MoreVertOutlined } from '@mui/icons-material'; import { Box, Button, @@ -24,28 +23,30 @@ import { } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; import { Edge, MarkerType, ReactFlow, ReactFlowProvider, useEdgesState, useNodesState, useReactFlow } from '@xyflow/react'; -import { AddBoxOutlined, MoreVertOutlined } from '@mui/icons-material'; -import type { InjectResultDTO, InjectTargetWithResult, InjectExpectationResult } from '../../../../utils/api-types'; +import { FunctionComponent, useContext, useEffect, useState } from 'react'; +import * as React from 'react'; + import { fetchInjectResultDto, fetchTargetResult } from '../../../../actions/atomic_testings/atomic-testing-actions'; +import { deleteInjectExpectationResult } from '../../../../actions/Exercise'; +import type { InjectExpectationStore } from '../../../../actions/injects/Inject'; +import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; +import ItemResult from '../../../../components/ItemResult'; import type { Theme } from '../../../../components/Theme'; -import ManualExpectationsValidationForm from '../../simulations/simulation/validation/expectations/ManualExpectationsValidationForm'; -import type { InjectExpectationsStore } from '../../common/injects/expectations/Expectation'; -import nodeTypes from './types/nodes'; +import type { InjectExpectationResult, InjectResultDTO, InjectTargetWithResult } from '../../../../utils/api-types'; import useAutoLayout, { type LayoutOptions } from '../../../../utils/flows/useAutoLayout'; -import { InjectResultDtoContext, InjectResultDtoContextType } from '../InjectResultDtoContext'; -import ItemResult from '../../../../components/ItemResult'; -import InjectIcon from '../../common/injects/InjectIcon'; -import { isNotEmptyField } from '../../../../utils/utils'; -import Transition from '../../../../components/common/Transition'; +import { useAppDispatch } from '../../../../utils/hooks'; import { emptyFilled, truncate } from '../../../../utils/String'; +import { splitDuration } from '../../../../utils/Time'; +import { isNotEmptyField } from '../../../../utils/utils'; +import type { InjectExpectationsStore } from '../../common/injects/expectations/Expectation'; +import { isTechnicalExpectation } from '../../common/injects/expectations/ExpectationUtils'; +import InjectIcon from '../../common/injects/InjectIcon'; import DetectionPreventionExpectationsValidationForm from '../../simulations/simulation/validation/expectations/DetectionPreventionExpectationsValidationForm'; -import { deleteInjectExpectationResult } from '../../../../actions/Exercise'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { InjectExpectationStore } from '../../../../actions/injects/Inject'; +import ManualExpectationsValidationForm from '../../simulations/simulation/validation/expectations/ManualExpectationsValidationForm'; +import { InjectResultDtoContext, InjectResultDtoContextType } from '../InjectResultDtoContext'; +import nodeTypes from './types/nodes'; import { NodeResultStep } from './types/nodes/NodeResultStep'; -import { isTechnicalExpectation } from '../../common/injects/expectations/ExpectationUtils'; -import { splitDuration } from '../../../../utils/Time'; interface Steptarget { label: string; @@ -54,7 +55,7 @@ interface Steptarget { key?: string; } -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ container: { margin: '20px 0 0 0', overflow: 'hidden', @@ -103,11 +104,11 @@ const useStyles = makeStyles((theme) => ({ })); interface Props { - inject: InjectResultDTO, - lastExecutionStartDate: string, - lastExecutionEndDate: string, - target: InjectTargetWithResult, - parentTargetId?: string, + inject: InjectResultDTO; + lastExecutionStartDate: string; + lastExecutionEndDate: string; + target: InjectTargetWithResult; + parentTargetId?: string; } const TargetResultsDetailFlow: FunctionComponent = ({ @@ -122,9 +123,9 @@ const TargetResultsDetailFlow: FunctionComponent = ({ const theme = useTheme(); const { nsdt, t } = useFormatter(); const [anchorEls, setAnchorEls] = useState>({}); - const [selectedExpectationForCreation, setSelectedExpectationForCreation] = useState<{ injectExpectation: InjectExpectationsStore, sourceIds: string[] } | null>(null); - const [selectedResultEdition, setSelectedResultEdition] = useState<{ injectExpectation: InjectExpectationsStore, expectationResult: InjectExpectationResult } | null>(null); - const [selectedResultDeletion, setSelectedResultDeletion] = useState<{ injectExpectation: InjectExpectationsStore, expectationResult: InjectExpectationResult } | null>(null); + const [selectedExpectationForCreation, setSelectedExpectationForCreation] = useState<{ injectExpectation: InjectExpectationsStore; sourceIds: string[] } | null>(null); + const [selectedResultEdition, setSelectedResultEdition] = useState<{ injectExpectation: InjectExpectationsStore; expectationResult: InjectExpectationResult } | null>(null); + const [selectedResultDeletion, setSelectedResultDeletion] = useState<{ injectExpectation: InjectExpectationsStore; expectationResult: InjectExpectationResult } | null>(null); const [initialized, setInitialized] = useState(false); const [activeTab, setActiveTab] = useState(0); const [targetResults, setTargetResults] = useState([]); @@ -255,7 +256,7 @@ const TargetResultsDetailFlow: FunctionComponent = ({ if (status.includes('FAILED')) { return 'FAILED'; } - return status.every((s) => s === 'SUCCESS') ? 'SUCCESS' : 'FAILED'; + return status.every(s => s === 'SUCCESS') ? 'SUCCESS' : 'FAILED'; }; const getStatusLabel = (type: string, status: string[]) => { switch (type) { @@ -266,7 +267,7 @@ const TargetResultsDetailFlow: FunctionComponent = ({ if (status.includes('PENDING')) { return 'Waiting for Detection'; } - return status.every((s) => s === 'SUCCESS') ? 'Attack Detected' : 'Attack Not Detected'; + return status.every(s => s === 'SUCCESS') ? 'Attack Detected' : 'Attack Not Detected'; case 'MANUAL': case 'ARTICLE': case 'CHALLENGE': @@ -276,7 +277,7 @@ const TargetResultsDetailFlow: FunctionComponent = ({ if (status.includes('PENDING')) { return 'Waiting for Validation'; } - return status.every((s) => s === 'SUCCESS') ? 'Validation Success' : 'Validation Failed'; + return status.every(s => s === 'SUCCESS') ? 'Validation Success' : 'Validation Failed'; case 'PREVENTION': if (status.includes('UNKNOWN')) { return 'No Expectation'; @@ -284,7 +285,7 @@ const TargetResultsDetailFlow: FunctionComponent = ({ if (status.includes('PENDING')) { return 'Waiting for Prevention'; } - return status.every((s) => s === 'SUCCESS') ? 'Attack Prevented' : 'Attack Not Prevented'; + return status.every(s => s === 'SUCCESS') ? 'Attack Prevented' : 'Attack Not Prevented'; default: return ''; } @@ -368,7 +369,8 @@ const TargetResultsDetailFlow: FunctionComponent = ({ label: ( {getStatusLabel(targetType, [expectation.inject_expectation_status])} -
    {truncate(expectation.inject_expectation_name, 20)} +
    + {truncate(expectation.inject_expectation_name, 20)}
    ), type: targetType, @@ -515,7 +517,7 @@ const TargetResultsDetailFlow: FunctionComponent = ({ } return a.inject_expectation_id.localeCompare(b.inject_expectation_id); }) - .map((injectExpectation) => ( + .map(injectExpectation => (
    @@ -548,7 +550,7 @@ const TargetResultsDetailFlow: FunctionComponent = ({ = ({ - } + )} title={expectationResult.sourceName ? t(expectationResult.sourceName) : t('Unknown')} - subheader={ + subheader={( <>
    {nsdt(expectationResult.date)}
    @@ -592,8 +594,7 @@ const TargetResultsDetailFlow: FunctionComponent = ({
    - - } + )} /> @@ -604,21 +605,21 @@ const TargetResultsDetailFlow: FunctionComponent = ({ ); })} {(['DETECTION', 'PREVENTION'].includes(injectExpectation.inject_expectation_type) || (injectExpectation.inject_expectation_type === 'MANUAL' && injectExpectation.inject_expectation_results && injectExpectation.inject_expectation_results.length === 0)) - && ( - - - setSelectedExpectationForCreation({ - injectExpectation, - sourceIds: computeExistingSourceIds(injectExpectation.inject_expectation_results ?? []), - }) - } - > - - - - - )} + && ( + + + setSelectedExpectationForCreation({ + injectExpectation, + sourceIds: computeExistingSourceIds(injectExpectation.inject_expectation_results ?? []), + })} + > + + + + + )}
    @@ -635,13 +636,15 @@ const TargetResultsDetailFlow: FunctionComponent = ({ {selectedExpectationForCreation && ( <> {selectedExpectationForCreation.injectExpectation.inject_expectation_type === 'MANUAL' - && } + && } {['DETECTION', 'PREVENTION'].includes(selectedExpectationForCreation.injectExpectation.inject_expectation_type) - && } + /> + )} )} @@ -658,18 +661,20 @@ const TargetResultsDetailFlow: FunctionComponent = ({ {selectedResultEdition && selectedResultEdition.injectExpectation && ( <> {selectedResultEdition.injectExpectation.inject_expectation_type === 'MANUAL' - && - } + /> + )} {['DETECTION', 'PREVENTION'].includes(selectedResultEdition.injectExpectation.inject_expectation_type) - && - } + /> + )} )} diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/context/TeamContextForAtomicTesting.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/context/TeamContextForAtomicTesting.tsx index 5ce4456390..362c9a375b 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/context/TeamContextForAtomicTesting.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/context/TeamContextForAtomicTesting.tsx @@ -1,7 +1,7 @@ -import { TeamContextType } from '../../../common/Context'; -import type { SearchPaginationInput, TeamOutput } from '../../../../../utils/api-types'; -import type { Page } from '../../../../../components/common/queryable/Page'; import { searchAtomicTestingTeams } from '../../../../../actions/atomic_testings/atomic-testing-actions'; +import type { Page } from '../../../../../components/common/queryable/Page'; +import type { SearchPaginationInput, TeamOutput } from '../../../../../utils/api-types'; +import { TeamContextType } from '../../../common/Context'; const teamContextForAtomicTesting = (): TeamContextType => { return { diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/types/nodes/NodeResultStep.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/types/nodes/NodeResultStep.tsx index 249811837e..1f95e8ebcc 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/types/nodes/NodeResultStep.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/types/nodes/NodeResultStep.tsx @@ -1,13 +1,14 @@ -import { memo } from 'react'; -import { Handle, Node, NodeProps, Position } from '@xyflow/react'; -import { makeStyles } from '@mui/styles'; -import { Tooltip } from '@mui/material'; import { FlagOutlined, HelpOutlined, ModeStandbyOutlined, ScoreOutlined } from '@mui/icons-material'; +import { Tooltip } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { Handle, Node, NodeProps, Position } from '@xyflow/react'; +import { memo } from 'react'; + import type { Theme } from '../../../../../../components/Theme'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ node: { position: 'relative', border: @@ -58,14 +59,14 @@ const renderIcon = (icon: string) => { }; export type NodeResultStep = Node<{ - background?: string, - color?: string, - key: string, - label: string, - description?: string, - end: boolean, - middle: boolean, - start: boolean, + background?: string; + color?: string; + key: string; + label: string; + description?: string; + end: boolean; + middle: boolean; + start: boolean; } >; diff --git a/openbas-front/src/admin/components/common/Context.ts b/openbas-front/src/admin/components/common/Context.ts index 90739fbe0a..b87b4b5fd0 100644 --- a/openbas-front/src/admin/components/common/Context.ts +++ b/openbas-front/src/admin/components/common/Context.ts @@ -1,5 +1,9 @@ import { createContext, ReactElement } from 'react'; + import type { ArticleStore, FullArticleStore } from '../../../actions/channels/Article'; +import type { InjectOutputType, InjectStore } from '../../../actions/injects/Inject'; +import type { TeamStore } from '../../../actions/teams/Team'; +import { Page } from '../../../components/common/queryable/Page'; import type { ArticleCreateInput, ArticleUpdateInput, @@ -31,12 +35,9 @@ import type { VariableInput, } from '../../../utils/api-types'; import type { UserStore } from '../teams/players/Player'; -import type { InjectOutputType, InjectStore } from '../../../actions/injects/Inject'; -import { Page } from '../../../components/common/queryable/Page'; -import type { TeamStore } from '../../../actions/teams/Team'; export type PermissionsContextType = { - permissions: { readOnly: boolean, canWrite: boolean, isRunning: boolean } + permissions: { readOnly: boolean; canWrite: boolean; isRunning: boolean }; }; export type ArticleContextType = { @@ -47,82 +48,82 @@ export type ArticleContextType = { }; export type ChallengeContextType = { - previewChallengeUrl: () => string + previewChallengeUrl: () => string; }; export type DocumentContextType = { onInitDocument: () => { - document_tags: { id: string, label: string }[], - document_exercises: { id: string, label: string }[], - document_scenarios: { id: string, label: string }[] - } + document_tags: { id: string; label: string }[]; + document_exercises: { id: string; label: string }[]; + document_scenarios: { id: string; label: string }[]; + }; }; export type VariableContextType = { - onCreateVariable: (data: VariableInput) => void, - onEditVariable: (variable: Variable, data: VariableInput) => void, - onDeleteVariable: (variable: Variable) => void, + onCreateVariable: (data: VariableInput) => void; + onEditVariable: (variable: Variable, data: VariableInput) => void; + onDeleteVariable: (variable: Variable) => void; }; export type ReportContextType = { - onDeleteReport: (report: Report) => void, - onUpdateReport: (reportId: Report['report_id'], report: ReportInput) => void - renderReportForm: (onSubmitForm: (data: ReportInput) => void, onHandleCancel: () => void, report: Report) => ReactElement, + onDeleteReport: (report: Report) => void; + onUpdateReport: (reportId: Report['report_id'], report: ReportInput) => void; + renderReportForm: (onSubmitForm: (data: ReportInput) => void, onHandleCancel: () => void, report: Report) => ReactElement; }; export type TeamContextType = { - onAddUsersTeam?: (teamId: Team['team_id'], userIds: UserStore['user_id'][]) => Promise, - onRemoveUsersTeam?: (teamId: Team['team_id'], userIds: UserStore['user_id'][]) => Promise, - onAddTeam?: (teamId: Team['team_id']) => Promise, - onCreateTeam?: (team: TeamCreateInput) => Promise<{ result: string }>, - onRemoveTeam?: (teamId: Team['team_id']) => void, - onReplaceTeam?: (teamIds: Team['team_id'][]) => Promise<{ result: string[], entities: { teams: Record } }>, - onToggleUser?: (teamId: Team['team_id'], userId: UserStore['user_id'], userEnabled: boolean) => void, - checkUserEnabled?: (teamId: Team['team_id'], userId: UserStore['user_id']) => boolean, - computeTeamUsersEnabled?: (teamId: Team['team_id']) => number, - searchTeams: (input: SearchPaginationInput, contextualOnly?: boolean) => Promise<{ data: Page }>, + onAddUsersTeam?: (teamId: Team['team_id'], userIds: UserStore['user_id'][]) => Promise; + onRemoveUsersTeam?: (teamId: Team['team_id'], userIds: UserStore['user_id'][]) => Promise; + onAddTeam?: (teamId: Team['team_id']) => Promise; + onCreateTeam?: (team: TeamCreateInput) => Promise<{ result: string }>; + onRemoveTeam?: (teamId: Team['team_id']) => void; + onReplaceTeam?: (teamIds: Team['team_id'][]) => Promise<{ result: string[]; entities: { teams: Record } }>; + onToggleUser?: (teamId: Team['team_id'], userId: UserStore['user_id'], userEnabled: boolean) => void; + checkUserEnabled?: (teamId: Team['team_id'], userId: UserStore['user_id']) => boolean; + computeTeamUsersEnabled?: (teamId: Team['team_id']) => number; + searchTeams: (input: SearchPaginationInput, contextualOnly?: boolean) => Promise<{ data: Page }>; }; export type InjectContextType = { - searchInjects: (input: SearchPaginationInput) => Promise<{ data: Page }>, - onAddInject: (inject: Inject) => Promise<{ result: string, entities: { injects: Record } }>, - onBulkUpdateInject: (injectId: Inject['inject_id'], inject: Inject) => Promise<{ result: string, entities: { injects: Record } }>, - onUpdateInject: (injectId: Inject['inject_id'], inject: Inject) => Promise<{ result: string, entities: { injects: Record } }>, - onUpdateInjectTrigger?: (injectId: Inject['inject_id']) => Promise<{ result: string, entities: { injects: Record } }>, + searchInjects: (input: SearchPaginationInput) => Promise<{ data: Page }>; + onAddInject: (inject: Inject) => Promise<{ result: string; entities: { injects: Record } }>; + onBulkUpdateInject: (injectId: Inject['inject_id'], inject: Inject) => Promise<{ result: string; entities: { injects: Record } }>; + onUpdateInject: (injectId: Inject['inject_id'], inject: Inject) => Promise<{ result: string; entities: { injects: Record } }>; + onUpdateInjectTrigger?: (injectId: Inject['inject_id']) => Promise<{ result: string; entities: { injects: Record } }>; onUpdateInjectActivation: (injectId: Inject['inject_id'], injectEnabled: { inject_enabled: boolean }) => Promise<{ - result: string, - entities: { injects: Record } - }>, - onInjectDone?: (injectId: Inject['inject_id']) => Promise<{ result: string, entities: { injects: Record } }>, - onDeleteInject: (injectId: Inject['inject_id']) => Promise, - onImportInjectFromXls?: (importId: string, input: InjectsImportInput) => Promise - onDryImportInjectFromXls?: (importId: string, input: InjectsImportInput) => Promise - onBulkDeleteInjects: (injectIds: string[]) => void - bulkTestInjects: (injectIds: string[]) => Promise<{ uri: string, data: InjectTestStatus[] }> + result: string; + entities: { injects: Record }; + }>; + onInjectDone?: (injectId: Inject['inject_id']) => Promise<{ result: string; entities: { injects: Record } }>; + onDeleteInject: (injectId: Inject['inject_id']) => Promise; + onImportInjectFromXls?: (importId: string, input: InjectsImportInput) => Promise; + onDryImportInjectFromXls?: (importId: string, input: InjectsImportInput) => Promise; + onBulkDeleteInjects: (injectIds: string[]) => void; + bulkTestInjects: (injectIds: string[]) => Promise<{ uri: string; data: InjectTestStatus[] }>; }; export type LessonContextType = { - onApplyLessonsTemplate: (data: string) => Promise, - onResetLessonsAnswers?: () => Promise, - onEmptyLessonsCategories: () => Promise, - onUpdateSourceLessons: (data: boolean) => Promise<{ result: string }>, - onSendLessons?: (data: LessonsSendInput) => void, - onAddLessonsCategory: (data: LessonsCategoryCreateInput) => Promise, - onDeleteLessonsCategory: (data: string) => void, - onUpdateLessonsCategory: (lessonCategoryId: string, data: LessonsCategoryUpdateInput) => Promise, - onUpdateLessonsCategoryTeams: (lessonCategoryId: string, data: LessonsCategoryTeamsInput) => Promise, - onDeleteLessonsQuestion: (lessonsCategoryId: string, lessonsQuestionId: string) => void, - onUpdateLessonsQuestion: (lessonsCategoryId: string, lessonsQuestionId: string, data: LessonsQuestionUpdateInput) => Promise, - onAddLessonsQuestion: (lessonsCategoryId: string, data: LessonsQuestionCreateInput) => Promise, - onAddObjective: (data: ObjectiveInput) => Promise, - onUpdateObjective: (objectiveId: string, data: ObjectiveInput) => Promise, - onDeleteObjective: (objectiveId: string) => void, - onAddEvaluation: (objectiveId: string, data: EvaluationInput) => Promise, - onUpdateEvaluation: (objectiveId: string, evaluationId: string, data: EvaluationInput) => Promise, - onFetchEvaluation: (objectiveId: string) => Promise, + onApplyLessonsTemplate: (data: string) => Promise; + onResetLessonsAnswers?: () => Promise; + onEmptyLessonsCategories: () => Promise; + onUpdateSourceLessons: (data: boolean) => Promise<{ result: string }>; + onSendLessons?: (data: LessonsSendInput) => void; + onAddLessonsCategory: (data: LessonsCategoryCreateInput) => Promise; + onDeleteLessonsCategory: (data: string) => void; + onUpdateLessonsCategory: (lessonCategoryId: string, data: LessonsCategoryUpdateInput) => Promise; + onUpdateLessonsCategoryTeams: (lessonCategoryId: string, data: LessonsCategoryTeamsInput) => Promise; + onDeleteLessonsQuestion: (lessonsCategoryId: string, lessonsQuestionId: string) => void; + onUpdateLessonsQuestion: (lessonsCategoryId: string, lessonsQuestionId: string, data: LessonsQuestionUpdateInput) => Promise; + onAddLessonsQuestion: (lessonsCategoryId: string, data: LessonsQuestionCreateInput) => Promise; + onAddObjective: (data: ObjectiveInput) => Promise; + onUpdateObjective: (objectiveId: string, data: ObjectiveInput) => Promise; + onDeleteObjective: (objectiveId: string) => void; + onAddEvaluation: (objectiveId: string, data: EvaluationInput) => Promise; + onUpdateEvaluation: (objectiveId: string, evaluationId: string, data: EvaluationInput) => Promise; + onFetchEvaluation: (objectiveId: string) => Promise; }; export type ViewLessonContextType = { - onAddLessonsAnswers?: (questionCategory: string, lessonsQuestionId: string, answerData: LessonsAnswerCreateInput) => Promise, - onFetchPlayerLessonsAnswers?: () => Promise, + onAddLessonsAnswers?: (questionCategory: string, lessonsQuestionId: string, answerData: LessonsAnswerCreateInput) => Promise; + onFetchPlayerLessonsAnswers?: () => Promise; }; export const PermissionsContext = createContext({ @@ -151,7 +152,7 @@ export const DocumentContext = createContext({ onInitDocument(): { document_tags: { id: string; label: string }[]; document_exercises: { id: string; label: string }[]; - document_scenarios: { id: string; label: string }[] + document_scenarios: { id: string; label: string }[]; } { return { document_exercises: [], document_scenarios: [], document_tags: [] }; }, @@ -191,25 +192,25 @@ export const InjectContext = createContext({ return new Promise<{ data: Page }>(() => { }); }, - onAddInject(_inject: Inject): Promise<{ result: string, entities: { injects: Record } }> { + onAddInject(_inject: Inject): Promise<{ result: string; entities: { injects: Record } }> { return Promise.resolve({ result: '', entities: { injects: {} } }); }, - onBulkUpdateInject(_injectId: Inject['inject_id'], _inject: Inject): Promise<{ result: string, entities: { injects: Record } }> { + onBulkUpdateInject(_injectId: Inject['inject_id'], _inject: Inject): Promise<{ result: string; entities: { injects: Record } }> { return Promise.resolve({ result: '', entities: { injects: {} } }); }, - onUpdateInject(_injectId: Inject['inject_id'], _inject: Inject): Promise<{ result: string, entities: { injects: Record } }> { + onUpdateInject(_injectId: Inject['inject_id'], _inject: Inject): Promise<{ result: string; entities: { injects: Record } }> { return Promise.resolve({ result: '', entities: { injects: {} } }); }, - onUpdateInjectTrigger(_injectId: Inject['inject_id']): Promise<{ result: string, entities: { injects: Record } }> { + onUpdateInjectTrigger(_injectId: Inject['inject_id']): Promise<{ result: string; entities: { injects: Record } }> { return Promise.resolve({ result: '', entities: { injects: {} } }); }, onUpdateInjectActivation(_injectId: Inject['inject_id'], _injectEnabled: { inject_enabled: boolean }): Promise<{ - result: string, - entities: { injects: Record } + result: string; + entities: { injects: Record }; }> { return Promise.resolve({ result: '', entities: { injects: {} } }); }, - onInjectDone(_injectId: Inject['inject_id']): Promise<{ result: string, entities: { injects: Record } }> { + onInjectDone(_injectId: Inject['inject_id']): Promise<{ result: string; entities: { injects: Record } }> { return Promise.resolve({ result: '', entities: { injects: {} } }); }, onDeleteInject(_injectId: Inject['inject_id']): Promise { @@ -225,8 +226,8 @@ export const InjectContext = createContext({ }, onBulkDeleteInjects(_injectIds: string[]): void { }, - bulkTestInjects(_injectIds: string[]): Promise<{ uri: string, data: InjectTestStatus[] }> { - return new Promise<{ uri: string, data: InjectTestStatus[] }>(() => { + bulkTestInjects(_injectIds: string[]): Promise<{ uri: string; data: InjectTestStatus[] }> { + return new Promise<{ uri: string; data: InjectTestStatus[] }>(() => { }); }, }); diff --git a/openbas-front/src/admin/components/common/ToolBar.js b/openbas-front/src/admin/components/common/ToolBar.js index 92121873e6..be4206c6ff 100644 --- a/openbas-front/src/admin/components/common/ToolBar.js +++ b/openbas-front/src/admin/components/common/ToolBar.js @@ -1,8 +1,3 @@ -import { forwardRef, Component } from 'react'; -import * as PropTypes from 'prop-types'; -import * as R from 'ramda'; -import { withStyles, withTheme } from '@mui/styles'; -import { Autocomplete, Button, Drawer, FormControl, Grid, IconButton, InputLabel, MenuItem, Select, Slide, TextField, Toolbar, Tooltip, Typography } from '@mui/material'; import { AddOutlined, BrushOutlined, @@ -14,17 +9,23 @@ import { ForwardToInbox, GroupsOutlined, } from '@mui/icons-material'; +import { Autocomplete, Button, Drawer, FormControl, Grid, IconButton, InputLabel, MenuItem, Select, Slide, TextField, Toolbar, Tooltip, Typography } from '@mui/material'; +import { withStyles, withTheme } from '@mui/styles'; import { SelectGroup } from 'mdi-material-ui'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component, forwardRef } from 'react'; import { connect } from 'react-redux'; -import inject18n from '../../../components/i18n'; -import { MESSAGING$ } from '../../../utils/Environment'; + import { fetchAssetGroups } from '../../../actions/asset_groups/assetgroup-action'; import { fetchEndpoints } from '../../../actions/assets/endpoint-actions'; import { storeHelper } from '../../../actions/Schema'; import DialogDelete from '../../../components/common/DialogDelete'; import DialogTest from '../../../components/common/DialogTest'; +import inject18n from '../../../components/i18n'; +import { MESSAGING$ } from '../../../utils/Environment'; -const styles = (theme) => ({ +const styles = theme => ({ bottomNav: { padding: 0, zIndex: 1100, @@ -303,7 +304,7 @@ class ToolBar extends Component { > {options.length > 0 ? ( R.map( - (n) => ( + n => ( {n.label} @@ -341,10 +342,10 @@ class ToolBar extends Component { fullWidth={true} selectOnFocus={true} autoHighlight={true} - getOptionLabel={(option) => (option.label ? option.label : '')} + getOptionLabel={option => (option.label ? option.label : '')} value={actionsInputs[i]?.values || []} multiple={true} - renderInput={(params) => ( + renderInput={params => ( (option.label ? option.label : '')} + getOptionLabel={option => (option.label ? option.label : '')} value={actionsInputs[i]?.values || []} multiple={true} - renderInput={(params) => ( + renderInput={params => ( (option.label ? option.label : '')} + getOptionLabel={option => (option.label ? option.label : '')} value={actionsInputs[i]?.values || []} multiple={true} - renderInput={(params) => ( + renderInput={params => ( - + {numberOfSelectedElements} - {' '} - {t('selected')}{' '} + + {' '} + {t('selected')} + {' '} { const helper = storeHelper(state); const endpoints = helper.getEndpoints() - .map((n) => ({ label: n.asset_name, value: n.asset_id })) + .map(n => ({ label: n.asset_name, value: n.asset_id })) .sort((a, b) => a.label.localeCompare(b.label)); const assetGroups = helper.getAssetGroups() - .map((n) => ({ label: n.asset_group_name, value: n.asset_group_id })) + .map(n => ({ label: n.asset_group_name, value: n.asset_group_id })) .sort((a, b) => a.label.localeCompare(b.label)); const teams = ownProps.teamsFromExerciseOrScenario - .map((n) => ({ label: n.team_name, value: n.team_id })) + .map(n => ({ label: n.team_name, value: n.team_id })) .sort((a, b) => a.label.localeCompare(b.label)); return { endpoints, assetGroups, teams }; }; diff --git a/openbas-front/src/admin/components/common/articles/ArticleAddDocuments.js b/openbas-front/src/admin/components/common/articles/ArticleAddDocuments.js index 3e15475308..76fe4f633a 100644 --- a/openbas-front/src/admin/components/common/articles/ArticleAddDocuments.js +++ b/openbas-front/src/admin/components/common/articles/ArticleAddDocuments.js @@ -1,22 +1,23 @@ -import { useContext, useState } from 'react'; -import * as R from 'ramda'; -import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined, DescriptionOutlined } from '@mui/icons-material'; +import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import SearchFilter from '../../../../components/SearchFilter'; -import { useFormatter } from '../../../../components/i18n'; +import * as R from 'ramda'; +import { useContext, useState } from 'react'; + import { fetchDocuments } from '../../../../actions/Document'; -import CreateDocument from '../../components/documents/CreateDocument'; -import { truncate } from '../../../../utils/String'; import Transition from '../../../../components/common/Transition'; -import TagsFilter from '../filters/TagsFilter'; +import { useFormatter } from '../../../../components/i18n'; import ItemTags from '../../../../components/ItemTags'; +import SearchFilter from '../../../../components/SearchFilter'; import { useHelper } from '../../../../store'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import { truncate } from '../../../../utils/String'; +import CreateDocument from '../../components/documents/CreateDocument'; import { PermissionsContext } from '../Context'; +import TagsFilter from '../filters/TagsFilter'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ box: { width: '100%', minHeight: '100%', @@ -50,7 +51,7 @@ const ArticleAddDocuments = (props) => { const [tags, setTags] = useState([]); // Fetching data - const { documents } = useHelper((helper) => ({ + const { documents } = useHelper(helper => ({ documents: helper.getDocumentsMap(), })); useDataLoader(() => { @@ -86,7 +87,7 @@ const ArticleAddDocuments = (props) => { }; const removeDocument = (documentId) => { - setDocumentsIds(R.filter((u) => u !== documentId, documentsIds)); + setDocumentsIds(R.filter(u => u !== documentId, documentsIds)); }; const submitAddDocuments = () => { @@ -97,19 +98,19 @@ const ArticleAddDocuments = (props) => { const onCreate = (result) => { addDocument(result.document_id); }; - const filterByKeyword = (n) => keyword === '' + const filterByKeyword = n => keyword === '' || (n.document_name || '').toLowerCase().indexOf(keyword.toLowerCase()) !== -1 || (n.document_description || '') .toLowerCase() .indexOf(keyword.toLowerCase()) !== -1 - || (n.document_type || '').toLowerCase().indexOf(keyword.toLowerCase()) - !== -1; + || (n.document_type || '').toLowerCase().indexOf(keyword.toLowerCase()) + !== -1; const filteredDocuments = R.pipe( R.filter( - (n) => tags.length === 0 + n => tags.length === 0 || R.any( - (filter) => R.includes(filter, n.document_tags), + filter => R.includes(filter, n.document_tags), R.pluck('id', tags), ), ), @@ -120,14 +121,14 @@ const ArticleAddDocuments = (props) => { if (channelType === 'newspaper') { finalDocuments = R.take( 10, - filteredDocuments.filter((d) => d.document_type.includes('image/')), + filteredDocuments.filter(d => d.document_type.includes('image/')), ); filters = ['image/']; } else if (channelType === 'microblogging') { finalDocuments = R.take( 10, filteredDocuments.filter( - (d) => d.document_type.includes('image/') + d => d.document_type.includes('image/') || d.document_type.includes('video/'), ), ); @@ -135,7 +136,7 @@ const ArticleAddDocuments = (props) => { } else if (channelType === 'tv') { finalDocuments = R.take( 10, - filteredDocuments.filter((d) => d.document_type.includes('video/')), + filteredDocuments.filter(d => d.document_type.includes('video/')), ); filters = ['video/']; } diff --git a/openbas-front/src/admin/components/common/articles/ArticleForm.js b/openbas-front/src/admin/components/common/articles/ArticleForm.js index de917c196d..85ef587e5c 100644 --- a/openbas-front/src/admin/components/common/articles/ArticleForm.js +++ b/openbas-front/src/admin/components/common/articles/ArticleForm.js @@ -1,22 +1,23 @@ -import { useState } from 'react'; -import { Form } from 'react-final-form'; +import { ArrowDropDownOutlined, ArrowDropUpOutlined, AttachmentOutlined } from '@mui/icons-material'; import { Box, Button, Grid, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { useDispatch } from 'react-redux'; import * as R from 'ramda'; -import { ArrowDropDownOutlined, ArrowDropUpOutlined, AttachmentOutlined } from '@mui/icons-material'; -import { useFormatter } from '../../../../components/i18n'; -import OldTextField from '../../../../components/fields/OldTextField'; -import Autocomplete from '../../../../components/Autocomplete'; -import { useHelper } from '../../../../store'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import { useState } from 'react'; +import { Form } from 'react-final-form'; +import { useDispatch } from 'react-redux'; + import { fetchChannels } from '../../../../actions/channels/channel-action'; import { fetchDocuments } from '../../../../actions/Document'; -import ChannelIcon from '../../components/channels/ChannelIcon'; +import Autocomplete from '../../../../components/Autocomplete'; import OldMarkDownField from '../../../../components/fields/OldMarkDownField'; -import DocumentType from '../../components/documents/DocumentType'; +import OldTextField from '../../../../components/fields/OldTextField'; +import { useFormatter } from '../../../../components/i18n'; import ItemTags from '../../../../components/ItemTags'; +import { useHelper } from '../../../../store'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import ChannelIcon from '../../components/channels/ChannelIcon'; import DocumentPopover from '../../components/documents/DocumentPopover'; +import DocumentType from '../../components/documents/DocumentType'; import ArticleAddDocuments from './ArticleAddDocuments'; const useStyles = makeStyles(() => ({ @@ -127,7 +128,7 @@ const ArticleForm = ({ }; // Fetching data const { channels, documentsMap } = useHelper( - (helper) => ({ + helper => ({ channels: helper.getChannels(), documentsMap: helper.getDocumentsMap(), }), @@ -136,14 +137,14 @@ const ArticleForm = ({ dispatch(fetchChannels()); dispatch(fetchDocuments()); }); - const handleAddDocuments = (docsIds) => setDocuments([...documents, ...docsIds]); - const handleRemoveDocument = (docId) => setDocuments(documents.filter((n) => n !== docId)); + const handleAddDocuments = docsIds => setDocuments([...documents, ...docsIds]); + const handleRemoveDocument = docId => setDocuments(documents.filter(n => n !== docId)); // Preparing data const sortedChannels = R.sortWith([R.ascend(R.prop('channel_name'))], channels).map( - (n) => ({ id: n.channel_id, label: n.channel_name, type: n.channel_type }), + n => ({ id: n.channel_id, label: n.channel_name, type: n.channel_type }), ); const currentChannel = sortedChannels.find( - (m) => m.id === initialValues.article_channel, + m => m.id === initialValues.article_channel, ); const formData = { ...initialValues, article_channel: currentChannel }; @@ -153,11 +154,13 @@ const ArticleForm = ({ }; const documentsSortHeader = (field, label, isSortable) => { - const sortComponent = documentsOrderAsc ? ( - - ) : ( - - ); + const sortComponent = documentsOrderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    {documentsSortHeader('document_name', 'Name', true)} {documentsSortHeader('document_type', 'Type', true)} {documentsSortHeader('document_tags', 'Tags', true)}
    - } + )} />   @@ -312,7 +315,7 @@ const ArticleForm = ({
    - } + )} /> { // Standard hooks @@ -71,7 +72,8 @@ const ArticlePopover = ({ article, onRemoveArticle = null }) => { return ( - ({ channel: { @@ -84,13 +85,13 @@ const Articles: FunctionComponent = ({ articles }) => { const searchColumns = ['name', 'type', 'content']; const filtering = useSearchAnFilter('article', 'name', searchColumns); // Rendering - const fullArticles = articles.map((item) => ({ + const fullArticles = articles.map(item => ({ ...item, article_fullchannel: item.article_channel ? channelsMap[item.article_channel] : {}, })); const sortedArticles: FullArticleStore[] = R.filter( (n: FullArticleStore) => channels.length === 0 - || channels.map((o) => o.id).includes(n.article_fullchannel?.channel_id ?? ''), + || channels.map(o => o.id).includes(n.article_fullchannel?.channel_id ?? ''), filtering.filterAndSort(fullArticles), ); @@ -98,196 +99,198 @@ const Articles: FunctionComponent = ({ articles }) => { const { previewArticleUrl } = useContext(ArticleContext); const { permissions } = useContext(PermissionsContext); - return <> - {permissions.canWrite && ( - - )} - {fullArticles.length > 0 && ( - - )} -
    - {sortedArticles.length === 0 && ( - -
    - {t('No media pressure article available in this simulation yet.')} -
    - -
    - } - /> - )} - - {sortedArticles.map((article, index) => { - const docs = (article.article_documents ?? []) - .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) - .filter((d) => d !== undefined); - const images = docs.filter((d) => d.document_type.includes('image/')); - const videos = docs.filter((d) => d.document_type.includes('video/')); - let headersDocs = []; - if (article.article_fullchannel?.channel_type === 'newspaper') { - headersDocs = images; - } else if (article.article_fullchannel?.channel_type === 'tv') { - headersDocs = videos; - } else { - headersDocs = [...images, ...videos]; - } - let columns = 12; - if (headersDocs.length === 2) { - columns = 6; - } else if (headersDocs.length === 3) { - columns = 4; - } else if (headersDocs.length >= 4) { - columns = 3; - } - // const shouldBeTruncated = (article.article_content || '').length > 500; - return ( - - + {permissions.canWrite && ( + + )} + {fullArticles.length > 0 && ( + + )} +
    + {sortedArticles.length === 0 && ( + +
    + {t('No media pressure article available in this simulation yet.')} +
    + - - +
    + )} + /> + )} + + {sortedArticles.map((article, index) => { + const docs = (article.article_documents ?? []) + .map(docId => (documentsMap[docId] ? documentsMap[docId] : undefined)) + .filter(d => d !== undefined); + const images = docs.filter(d => d.document_type.includes('image/')); + const videos = docs.filter(d => d.document_type.includes('video/')); + let headersDocs = []; + if (article.article_fullchannel?.channel_type === 'newspaper') { + headersDocs = images; + } else if (article.article_fullchannel?.channel_type === 'tv') { + headersDocs = videos; + } else { + headersDocs = [...images, ...videos]; + } + let columns = 12; + if (headersDocs.length === 2) { + columns = 6; + } else if (headersDocs.length === 3) { + columns = 4; + } else if (headersDocs.length >= 4) { + columns = 3; + } + // const shouldBeTruncated = (article.article_content || '').length > 500; + return ( + + + - {article.article_likes || 0} - + {(article.article_author || t('Unknown')).charAt(0)} + + )} + title={article.article_author || t('Unknown')} + subheader={ + article.article_is_scheduled ? ( + + {t('Scheduled')} + + ) : ( + + {t('Not used in the context')} + + ) + } + action={( + + + + + + + )} + /> + + {headersDocs.map(doc => ( + + {doc.document_type.includes('image/') && ( + + )} + {doc.document_type.includes('video/') && ( + + )} + + ))} + + + + {article.article_name} + + +
    +
    + + + )} + classes={{ root: classes.channel }} + style={{ + color: ChannelColor( + article.article_fullchannel?.channel_type, + ), + borderColor: ChannelColor( + article.article_fullchannel?.channel_type, + ), + }} + variant="outlined" + label={article.article_fullchannel?.channel_name} + /> + +
    +
    + + + +
    -
    - - - - ); - })} - - ; + + + + ); + })} + + + ); }; export default Articles; diff --git a/openbas-front/src/admin/components/common/articles/CreateArticle.js b/openbas-front/src/admin/components/common/articles/CreateArticle.js index 5b7b7129c1..abd68b8b08 100644 --- a/openbas-front/src/admin/components/common/articles/CreateArticle.js +++ b/openbas-front/src/admin/components/common/articles/CreateArticle.js @@ -1,13 +1,14 @@ -import { useContext } from 'react'; -import { Dialog, DialogContent, DialogTitle, IconButton, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { Add, ControlPointOutlined } from '@mui/icons-material'; +import { Dialog, DialogContent, DialogTitle, IconButton, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { useContext } from 'react'; + +import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; -import ArticleForm from './ArticleForm'; import { ArticleContext } from '../Context'; -import Transition from '../../../../components/common/Transition'; +import ArticleForm from './ArticleForm'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ createButton: { float: 'left', marginTop: -15, diff --git a/openbas-front/src/admin/components/common/challenges/ContextualChallenges.js b/openbas-front/src/admin/components/common/challenges/ContextualChallenges.js index 9f9f697b0e..554f0ee0a4 100644 --- a/openbas-front/src/admin/components/common/challenges/ContextualChallenges.js +++ b/openbas-front/src/admin/components/common/challenges/ContextualChallenges.js @@ -1,7 +1,3 @@ -import { useContext } from 'react'; -import { makeStyles } from '@mui/styles'; -import { Avatar, Button, Card, CardContent, CardHeader, Chip, Grid, IconButton, Tooltip } from '@mui/material'; -import { Link } from 'react-router-dom'; import { CrisisAlertOutlined, DescriptionOutlined, @@ -11,11 +7,16 @@ import { SportsScoreOutlined, VisibilityOutlined, } from '@mui/icons-material'; -import useSearchAnFilter from '../../../../utils/SortingFiltering'; +import { Avatar, Button, Card, CardContent, CardHeader, Chip, Grid, IconButton, Tooltip } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { useContext } from 'react'; +import { Link } from 'react-router-dom'; + +import Empty from '../../../../components/Empty'; import ExpandableMarkdown from '../../../../components/ExpandableMarkdown'; import { useFormatter } from '../../../../components/i18n'; +import useSearchAnFilter from '../../../../utils/SortingFiltering'; import { ChallengeContext } from '../Context'; -import Empty from '../../../../components/Empty'; const useStyles = makeStyles(() => ({ flag: { @@ -76,27 +77,27 @@ const ContextualChallenges = ({ challenges, linkToInjects }) => {
    {sortedChallenges.length === 0 && ( - -
    - {t('No challenge are used in the injects of this simulation.')} + +
    + {t('No challenge are used in the injects of this simulation.')} +
    + {linkToInjects && ( + + )}
    - {linkToInjects && ( - - )} -
    - } - /> + )} + /> )} {sortedChallenges.map((challenge, index) => { @@ -108,11 +109,11 @@ const ContextualChallenges = ({ challenges, linkToInjects }) => { sx={{ width: '100%', height: '100%' }} > - } + )} title={challenge.challenge_name} subheader={challenge.challenge_category} /> diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx index 19b65e43a1..6ee1c0dbf9 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx @@ -1,14 +1,15 @@ -import { useState } from 'react'; import { makeStyles } from '@mui/styles'; -import EnterpriseEditionAgreement from './EnterpriseEditionAgreement'; +import { useState } from 'react'; + +import type { UserHelper } from '../../../../actions/helper'; import type { Theme } from '../../../../components/Theme'; -import useEnterpriseEdition from '../../../../utils/hooks/useEnterpriseEdition'; import { useHelper } from '../../../../store'; -import type { UserHelper } from '../../../../actions/helper'; +import useEnterpriseEdition from '../../../../utils/hooks/useEnterpriseEdition'; +import EnterpriseEditionAgreement from './EnterpriseEditionAgreement'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ container: { fontSize: 'xx-small', height: 14, @@ -41,7 +42,7 @@ const useStyles = makeStyles((theme) => ({ }, })); -const EEChip = ({ clickable = true, floating = false }: { clickable?: boolean, floating?: boolean }) => { +const EEChip = ({ clickable = true, floating = false }: { clickable?: boolean; floating?: boolean }) => { const classes = useStyles(); const isEnterpriseEdition = useEnterpriseEdition(); const [displayDialog, setDisplayDialog] = useState(false); diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EEField.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EEField.tsx index 1649402dd8..f4eddbccf2 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EEField.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EEField.tsx @@ -1,8 +1,9 @@ +import { makeStyles } from '@mui/styles'; import { FunctionComponent } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import EEChip from './EEChip'; + import { useFormatter } from '../../../../components/i18n'; +import EEChip from './EEChip'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. @@ -24,7 +25,11 @@ const EEField: FunctionComponent = ({ const classes = useStyles(); const { t } = useFormatter(); const component = React.cloneElement(children, { - label: <>{t(children.props.label)}, + label: + <> + {t(children.props.label)} + + , }); return (
    diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EEMenu.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EEMenu.tsx index 0f06984734..e0a2724b57 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EEMenu.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EEMenu.tsx @@ -1,5 +1,6 @@ import { styled } from '@mui/material/styles'; import { ReactElement } from 'react'; + import EEChip from './EEChip'; const EEDiv = styled('div')(() => ({ @@ -8,7 +9,10 @@ const EEDiv = styled('div')(() => ({ const EEMenu = ({ children }: { children: ReactElement }) => { return ( - {children} + + {children} + + ); }; diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EETooltip.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EETooltip.tsx index 960c8ae794..b34286cca6 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EETooltip.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EETooltip.tsx @@ -1,11 +1,12 @@ import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Tooltip } from '@mui/material'; import { ReactElement, useState } from 'react'; -import EnterpriseEditionAgreement from './EnterpriseEditionAgreement'; + +import type { UserHelper } from '../../../../actions/helper'; import { useFormatter } from '../../../../components/i18n'; -import useEnterpriseEdition from '../../../../utils/hooks/useEnterpriseEdition'; -import useAI from '../../../../utils/hooks/useAI'; import { useHelper } from '../../../../store'; -import type { UserHelper } from '../../../../actions/helper'; +import useAI from '../../../../utils/hooks/useAI'; +import useEnterpriseEdition from '../../../../utils/hooks/useEnterpriseEdition'; +import EnterpriseEditionAgreement from './EnterpriseEditionAgreement'; const EETooltip = ({ children, diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEdition.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEdition.tsx index 56939146bd..fa56461826 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEdition.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEdition.tsx @@ -15,13 +15,14 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import { Alert, AlertTitle } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import EnterpriseEditionButton from './EnterpriseEditionButton'; -import type { Theme } from '../../../../components/Theme'; + import { useFormatter } from '../../../../components/i18n'; +import type { Theme } from '../../../../components/Theme'; +import EnterpriseEditionButton from './EnterpriseEditionButton'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ alert: { width: '100%', marginBottom: 20, @@ -30,7 +31,7 @@ const useStyles = makeStyles((theme) => ({ }, })); -const EnterpriseEdition = ({ message }: { message?: string, feature?: string }) => { +const EnterpriseEdition = ({ message }: { message?: string; feature?: string }) => { const classes = useStyles(); const { t } = useFormatter(); return ( diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreement.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreement.tsx index b6c3789f13..bb069f536a 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreement.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreement.tsx @@ -1,8 +1,9 @@ -import { FunctionComponent, useState } from 'react'; import { Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, FormControlLabel, FormGroup } from '@mui/material'; +import { FunctionComponent, useState } from 'react'; + +import { updatePlatformEnterpriseEditionParameters } from '../../../../actions/Application'; import { useFormatter } from '../../../../components/i18n'; import type { SettingsEnterpriseEditionUpdateInput } from '../../../../utils/api-types'; -import { updatePlatformEnterpriseEditionParameters } from '../../../../actions/Application'; import { useAppDispatch } from '../../../../utils/hooks'; interface EnterpriseEditionAgreementProps { @@ -11,7 +12,7 @@ interface EnterpriseEditionAgreementProps { } const EnterpriseEditionAgreement: FunctionComponent< -EnterpriseEditionAgreementProps + EnterpriseEditionAgreementProps > = ({ open, onClose }) => { const { t } = useFormatter(); const dispatch = useAppDispatch(); @@ -52,7 +53,8 @@ EnterpriseEditionAgreementProps
  • {t( 'For all other usages, you (and your organization) should have entered in a', - )}{' '} + )} + {' '} {t('Filigran Enterprise agreement')} @@ -61,25 +63,27 @@ EnterpriseEditionAgreementProps setEnterpriseEditionConsent(event.target.checked)} + onChange={event => setEnterpriseEditionConsent(event.target.checked)} /> - } - label={ + )} + label={( <> - {t('I have read and agree to the')}{' '} + {t('I have read and agree to the')} + {' '} {t('OpenBAS EE license terms')} . - } + )} /> diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionButton.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionButton.tsx index a50ce68239..713797c49d 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionButton.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionButton.tsx @@ -1,12 +1,13 @@ +import { RocketLaunchOutlined } from '@mui/icons-material'; import { Button } from '@mui/material'; -import { useState } from 'react'; import { makeStyles } from '@mui/styles'; -import { RocketLaunchOutlined } from '@mui/icons-material'; import classNames from 'classnames'; -import EnterpriseEditionAgreement from './EnterpriseEditionAgreement'; +import { useState } from 'react'; + +import type { UserHelper } from '../../../../actions/helper'; import { useFormatter } from '../../../../components/i18n'; import { useHelper } from '../../../../store'; -import type { UserHelper } from '../../../../actions/helper'; +import EnterpriseEditionAgreement from './EnterpriseEditionAgreement'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. @@ -20,7 +21,7 @@ const useStyles = makeStyles({ }, }); -const EnterpriseEditionButton = ({ inLine = false }: { inLine?: boolean; }) => { +const EnterpriseEditionButton = ({ inLine = false }: { inLine?: boolean }) => { const { t } = useFormatter(); const classes = useStyles(); const [openEnterpriseEditionConsent, setOpenEnterpriseEditionConsent] = useState(false); diff --git a/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx b/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx index 9aa2ad240e..67a1f7699c 100644 --- a/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx +++ b/openbas-front/src/admin/components/common/filters/InjectorContractSwitchFilter.tsx @@ -1,10 +1,11 @@ import { Switch } from '@mui/material'; import { FunctionComponent, useEffect, useState } from 'react'; import * as React from 'react'; -import { useFormatter } from '../../../../components/i18n'; + import { FilterHelpers } from '../../../../components/common/queryable/filter/FilterHelpers'; -import type { FilterGroup } from '../../../../utils/api-types'; import { buildEmptyFilter } from '../../../../components/common/queryable/filter/FilterUtils'; +import { useFormatter } from '../../../../components/i18n'; +import type { FilterGroup } from '../../../../utils/api-types'; import { INJECTOR_CONTRACT_INJECTOR_FILTER_KEY, INJECTOR_CONTRACT_PLAYERS_ONLY } from './constants'; interface Props { @@ -20,7 +21,7 @@ const InjectorContractSwitchFilter: FunctionComponent = ({ const { t } = useFormatter(); const retrieveFilter = () => { - return filterGroup?.filters?.find((f) => f.key === INJECTOR_CONTRACT_INJECTOR_FILTER_KEY); + return filterGroup?.filters?.find(f => f.key === INJECTOR_CONTRACT_INJECTOR_FILTER_KEY); }; const isChecked = () => { @@ -28,7 +29,7 @@ const InjectorContractSwitchFilter: FunctionComponent = ({ if (!filter) { return false; } - return filter.values?.some((v) => INJECTOR_CONTRACT_PLAYERS_ONLY.includes(v)); + return filter.values?.some(v => INJECTOR_CONTRACT_PLAYERS_ONLY.includes(v)); }; const [enablePlayerFilter, setEnablePlayerFilter] = useState(isChecked); diff --git a/openbas-front/src/admin/components/common/filters/KillChainPhasesFilter.js b/openbas-front/src/admin/components/common/filters/KillChainPhasesFilter.js index 6a09c9d11d..f7c62e04d6 100644 --- a/openbas-front/src/admin/components/common/filters/KillChainPhasesFilter.js +++ b/openbas-front/src/admin/components/common/filters/KillChainPhasesFilter.js @@ -1,13 +1,14 @@ -import { useEffect } from 'react'; -import { makeStyles } from '@mui/styles'; -import { Autocomplete, Box, TextField } from '@mui/material'; import { RouteOutlined } from '@mui/icons-material'; -import { useDispatch } from 'react-redux'; +import { Autocomplete, Box, TextField } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; +import { useEffect } from 'react'; +import { useDispatch } from 'react-redux'; + import { fetchKillChainPhases } from '../../../../actions/KillChainPhase'; +import { buildEmptyFilter } from '../../../../components/common/queryable/filter/FilterUtils'; import { useFormatter } from '../../../../components/i18n'; import { useHelper } from '../../../../store'; -import { buildEmptyFilter } from '../../../../components/common/queryable/filter/FilterUtils'; const useStyles = makeStyles(() => ({ icon: { @@ -26,12 +27,12 @@ const KillChainPhasesFilter = (props) => { const classes = useStyles(); const { t } = useFormatter(); const dispatch = useDispatch(); - const killChainPhases = useHelper((helper) => helper.getKillChainPhases()); + const killChainPhases = useHelper(helper => helper.getKillChainPhases()); useEffect(() => { dispatch(fetchKillChainPhases()); helpers.handleAddFilterWithEmptyValue(buildEmptyFilter(filterKey, 'eq')); }, []); - const killChainPhaseTransform = (n) => ({ + const killChainPhaseTransform = n => ({ id: n.phase_id, label: n.phase_name, }); @@ -63,7 +64,7 @@ const KillChainPhasesFilter = (props) => {
    {option.label}
    )} - renderInput={(params) => ( + renderInput={params => ( { - return attackPatterns.filter((attackPattern) => attackPattern.attack_pattern_external_id.indexOf('.') < 0); + return attackPatterns.filter(attackPattern => attackPattern.attack_pattern_external_id.indexOf('.') < 0); }; export const MITRE_FILTER_KEY = 'injector_contract_attack_patterns'; @@ -76,17 +77,23 @@ const KillChainPhaseColumn: FunctionComponent = ({ const techniques = computeTechnique(attackPatterns); const computeSubTechnique = (attackPattern: AttackPattern) => { - return attackPatterns.filter((value) => value.attack_pattern_external_id.includes(attackPattern.attack_pattern_external_id)); + return attackPatterns.filter(value => value.attack_pattern_external_id.includes(attackPattern.attack_pattern_external_id)); }; const injectorsContratComponent = (attackPattern: AttackPattern) => { const subTechnique = computeSubTechnique(attackPattern); - const externalIds = subTechnique.map((value) => value.attack_pattern_external_id); + const externalIds = subTechnique.map(value => value.attack_pattern_external_id); externalIds.push(attackPattern.attack_pattern_external_id); const injectorsContratList = injectorsContratLight - .filter((value) => externalIds.some((value1) => value.injector_contract_attack_patterns_external_id?.includes(value1))); + .filter(value => externalIds.some(value1 => value.injector_contract_attack_patterns_external_id?.includes(value1))); if (injectorsContratList.length > 0) { - return ( ({injectorsContratList.length})); + return ( + + ( + {injectorsContratList.length} + ) + + ); } return (<>); }; @@ -103,11 +110,17 @@ const KillChainPhaseColumn: FunctionComponent = ({
    {killChainPhase.phase_name}
    -
    ({techniques.length} {t('techniques')})
    +
    + ( + {techniques.length} + {' '} + {t('techniques')} + ) +
    {techniques.sort(sortAttackPattern) - .map((attackPattern) => ( + .map(attackPattern => (
    handleAskAi('explain', false)} disabled={isContentEmpty()}> {t('Explain')} -
    + +
    = ({ setMessageTone(event.target.value as unknown as 'informal' | 'formal' | 'assertive' | 'sarcastic' | 'authoritative' | 'bitter' | 'critical' | 'arrogant' | 'aggressive')} + onChange={event => setMessageTone(event.target.value as unknown as 'informal' | 'formal' | 'assertive' | 'sarcastic' | 'authoritative' | 'bitter' | 'critical' | 'arrogant' | 'aggressive')} fullWidth={true} > {t('Formal')} @@ -385,7 +390,7 @@ const TextFieldAskAI: FunctionComponent = ({ label={t('Author')} fullWidth={true} value={messageSender} - onChange={(event) => setMessageSender(event.target.value)} + onChange={event => setMessageSender(event.target.value)} style={{ marginTop: 20 }} /> = ({ fullWidth={true} type="number" value={messageParagraphs} - onChange={(event) => setMessageParagraphs(Number.isNaN(parseInt(event.target.value, 10)) ? 1 : parseInt(event.target.value, 10))} + onChange={event => setMessageParagraphs(Number.isNaN(parseInt(event.target.value, 10)) ? 1 : parseInt(event.target.value, 10))} style={{ marginTop: 20 }} /> = ({ multiline={true} value={messageContext} rows={5} - onChange={(event) => setMessageContext(event.target.value)} + onChange={event => setMessageContext(event.target.value)} /> @@ -436,7 +441,7 @@ const TextFieldAskAI: FunctionComponent = ({ @@ -873,9 +909,9 @@ const InjectForm: React.FC = ({ values, form, injects }) => { addConditionParent(parent); }} style={{ justifyContent: 'start' }} - disabled={!canAddConditions(parent.inject!, parentConditions.find((parentCondition) => parentCondition.parentId === parent.inject?.inject_id))} + disabled={!canAddConditions(parent.inject!, parentConditions.find(parentCondition => parentCondition.parentId === parent.inject?.inject_id))} > - + {t('Add condition')} @@ -898,7 +934,7 @@ const InjectForm: React.FC = ({ values, form, injects }) => { disabled={addChildrenButtonDisabled} onClick={addChildren} > - +
  • {childrens.map((children, index) => { @@ -909,17 +945,23 @@ const InjectForm: React.FC = ({ values, form, injects }) => { style={{ width: '100%', marginBottom: '10px' }} > } + expandIcon={} >
    - #{index + 1} {children.inject?.inject_title} + # + {index + 1} + {' '} + {children.inject?.inject_title} - { deleteChildren(children); }} + { + deleteChildren(children); + }} > - +
    @@ -930,18 +972,22 @@ const InjectForm: React.FC = ({ values, form, injects }) => { @@ -968,11 +1014,11 @@ const InjectForm: React.FC = ({ values, form, injects }) => { }} disabled={!canAddConditions( values as InjectOutput as InjectOutputType, - childrenConditions.find((childrenCondition) => childrenCondition.childrenId === children.inject?.inject_id), + childrenConditions.find(childrenCondition => childrenCondition.childrenId === children.inject?.inject_id), )} style={{ justifyContent: 'start' }} > - + {t('Add condition')} diff --git a/openbas-front/src/admin/components/common/injects/InjectDefinition.js b/openbas-front/src/admin/components/common/injects/InjectDefinition.js index b3d7651315..019f278a6e 100644 --- a/openbas-front/src/admin/components/common/injects/InjectDefinition.js +++ b/openbas-front/src/admin/components/common/injects/InjectDefinition.js @@ -1,7 +1,14 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import * as R from 'ramda'; -import { withStyles } from '@mui/styles'; +import { + ArrowDropDownOutlined, + ArrowDropUpOutlined, + AttachmentOutlined, + ControlPointOutlined, + DeleteOutlined, + EmojiEventsOutlined, + GroupsOutlined, + HelpOutlineOutlined, + RotateLeftOutlined, +} from '@mui/icons-material'; import { Button, FormControlLabel, @@ -18,53 +25,47 @@ import { Tooltip, Typography, } from '@mui/material'; -import { connect } from 'react-redux'; -import { - ArrowDropDownOutlined, - ArrowDropUpOutlined, - AttachmentOutlined, - ControlPointOutlined, - DeleteOutlined, - EmojiEventsOutlined, - GroupsOutlined, - HelpOutlineOutlined, - RotateLeftOutlined, -} from '@mui/icons-material'; +import { withStyles } from '@mui/styles'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; import { FieldArray } from 'react-final-form-arrays'; -import inject18n from '../../../../components/i18n'; -import { fetchInjectTeams } from '../../../../actions/Inject'; -import { fetchDocuments } from '../../../../actions/Document'; -import { fetchChannels } from '../../../../actions/channels/channel-action'; +import { connect } from 'react-redux'; + import { fetchChallenges } from '../../../../actions/Challenge'; -import ItemTags from '../../../../components/ItemTags'; +import { fetchChannels } from '../../../../actions/channels/channel-action'; +import { fetchDocuments } from '../../../../actions/Document'; +import { fetchInjectTeams } from '../../../../actions/Inject'; import { storeHelper } from '../../../../actions/Schema'; -import ItemBoolean from '../../../../components/ItemBoolean'; -import InjectAddTeams from './InjectAddTeams'; +import MultipleFileLoader from '../../../../components/fields/MultipleFileLoader'; +import OldSelectField from '../../../../components/fields/OldSelectField'; import OldTextField from '../../../../components/fields/OldTextField'; -import SwitchField from '../../../../components/fields/SwitchField'; import RichTextField from '../../../../components/fields/RichTextField'; -import MultipleFileLoader from '../../../../components/fields/MultipleFileLoader'; +import SwitchField from '../../../../components/fields/SwitchField'; +import inject18n from '../../../../components/i18n'; +import ItemBoolean from '../../../../components/ItemBoolean'; +import ItemTags from '../../../../components/ItemTags'; import Loader from '../../../../components/Loader'; -import DocumentType from '../../components/documents/DocumentType'; +import arraysEqual from '../../../../utils/ArrayUtils'; +import AssetGroupPopover from '../../assets/asset_groups/AssetGroupPopover'; +import AssetGroupsList from '../../assets/asset_groups/AssetGroupsList'; +import EndpointPopover from '../../assets/endpoints/EndpointPopover'; +import EndpointsList from '../../assets/endpoints/EndpointsList'; +import ChallengePopover from '../../components/challenges/ChallengePopover'; +import ChannelIcon from '../../components/channels/ChannelIcon'; import DocumentPopover from '../../components/documents/DocumentPopover'; -import OldSelectField from '../../../../components/fields/OldSelectField'; +import DocumentType from '../../components/documents/DocumentType'; +import InjectAddAssetGroups from '../../simulations/simulation/injects/asset_groups/InjectAddAssetGroups'; +import InjectAddEndpoints from '../../simulations/simulation/injects/endpoints/InjectAddEndpoints'; +import AvailableVariablesDialog from '../../simulations/simulation/variables/AvailableVariablesDialog'; import ArticlePopover from '../articles/ArticlePopover'; +import InjectExpectations from './expectations/InjectExpectations'; import InjectAddArticles from './InjectAddArticles'; -import ChannelIcon from '../../components/channels/ChannelIcon'; -import ChallengePopover from '../../components/challenges/ChallengePopover'; import InjectAddChallenges from './InjectAddChallenges'; -import AvailableVariablesDialog from '../../simulations/simulation/variables/AvailableVariablesDialog'; -import InjectExpectations from './expectations/InjectExpectations'; -import EndpointsList from '../../assets/endpoints/EndpointsList'; -import EndpointPopover from '../../assets/endpoints/EndpointPopover'; -import InjectAddEndpoints from '../../simulations/simulation/injects/endpoints/InjectAddEndpoints'; -import AssetGroupsList from '../../assets/asset_groups/AssetGroupsList'; -import AssetGroupPopover from '../../assets/asset_groups/AssetGroupPopover'; -import InjectAddAssetGroups from '../../simulations/simulation/injects/asset_groups/InjectAddAssetGroups'; +import InjectAddTeams from './InjectAddTeams'; import InjectTeamsList from './teams/InjectTeamsList'; -import arraysEqual from '../../../../utils/ArrayUtils'; -const styles = (theme) => ({ +const styles = theme => ({ header: { backgroundColor: theme.palette.background.nav, padding: '20px 20px 20px 60px', @@ -418,7 +419,7 @@ class InjectDefinition extends Component { handleRemoveTeam(teamId) { this.setState({ - teamsIds: this.state.teamsIds.filter((a) => a !== teamId), + teamsIds: this.state.teamsIds.filter(a => a !== teamId), }, () => this.props.setInjectDetailsState(this.state)); } @@ -431,7 +432,7 @@ class InjectDefinition extends Component { handleRemoveAsset(assetId) { this.setState({ - assetIds: this.state.assetIds.filter((a) => a !== assetId), + assetIds: this.state.assetIds.filter(a => a !== assetId), }, () => this.props.setInjectDetailsState(this.state)); } @@ -444,7 +445,7 @@ class InjectDefinition extends Component { handleRemoveAssetGroup(assetGroupId) { this.setState({ - assetGroupIds: this.state.assetGroupIds.filter((a) => a !== assetGroupId), + assetGroupIds: this.state.assetGroupIds.filter(a => a !== assetGroupId), }, () => this.props.setInjectDetailsState(this.state)); } @@ -457,7 +458,7 @@ class InjectDefinition extends Component { handleRemoveArticle(articleId) { this.setState({ - articlesIds: this.state.articlesIds.filter((a) => a !== articleId), + articlesIds: this.state.articlesIds.filter(a => a !== articleId), }, () => this.props.setInjectDetailsState(this.state)); } @@ -470,7 +471,7 @@ class InjectDefinition extends Component { handleRemoveChallenge(challengeId) { this.setState({ - challengesIds: this.state.challengesIds.filter((a) => a !== challengeId), + challengesIds: this.state.challengesIds.filter(a => a !== challengeId), }, () => this.props.setInjectDetailsState(this.state)); } @@ -484,7 +485,7 @@ class InjectDefinition extends Component { handleRemoveDocument(documentId) { this.setState({ documents: this.state.documents.filter( - (d) => d.document_id !== documentId, + d => d.document_id !== documentId, ), }, () => this.props.setInjectDetailsState(this.state)); } @@ -496,11 +497,11 @@ class InjectDefinition extends Component { toggleAttachment(documentId) { this.setState({ - documents: this.state.documents.map((d) => (d.document_id === documentId + documents: this.state.documents.map(d => (d.document_id === documentId ? { - document_id: d.document_id, - document_attached: !d.document_attached, - } + document_id: d.document_id, + document_attached: !d.document_attached, + } : d)), }, () => this.props.setInjectDetailsState(this.state)); } @@ -515,11 +516,13 @@ class InjectDefinition extends Component { articlesSortHeader(field, label, isSortable) { const { t } = this.props; const { articlesSortBy, articlesOrderAsc } = this.state; - const sortComponent = articlesOrderAsc ? ( - - ) : ( - - ); + const sortComponent = articlesOrderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    - ) : ( - - ); + const sortComponent = challengesOrderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    - ) : ( - - ); + const sortComponent = documentsOrderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    { switch (field.type) { case 'textarea': - return field.richText ? ( - - ) : ( - - ); + return field.richText + ? ( + + ) + : ( + + ); case 'number': return ( - {attachedDocs.map((doc) => ( - - - {doc.document_name} - - - ))} - - ) : ( - - )} + {attachedDocs.map(doc => ( + + + {doc.document_name} + + + ))} + + ) : ( + + )} {field.cardinality === 'n' && ( fields.remove(index)} @@ -790,101 +798,103 @@ class InjectDefinition extends Component {
    ); case 'select': - return field.cardinality === 'n' ? ( - v.map((a) => field.choices[a]).join(', ')} - name={field.key} - fullWidth={true} - style={{ marginTop: 20 }} - disabled={this.props.permissions.readOnly || field.readOnly} - > - {Object.entries(field.choices) - .sort((a, b) => a[1].localeCompare(b[1])) - .map(([k, v]) => ( - - - {field.expectation ? t(v || 'Unknown') : v} - - - ))} - - ) : ( - (field.expectation - ? t(field.choices[v] || 'Unknown') - : field.choices[v]) - } - name={field.key} - fullWidth={true} - style={{ marginTop: 20 }} - disabled={this.props.permissions.readOnly} - > - {Object.entries(field.choices) - .sort((a, b) => a[1].localeCompare(b[1])) - .map(([k, v]) => ( - - - {field.expectation ? t(v || 'Unknown') : v} - - - ))} - - ); + return field.cardinality === 'n' + ? ( + v.map(a => field.choices[a]).join(', ')} + name={field.key} + fullWidth={true} + style={{ marginTop: 20 }} + disabled={this.props.permissions.readOnly || field.readOnly} + > + {Object.entries(field.choices) + .sort((a, b) => a[1].localeCompare(b[1])) + .map(([k, v]) => ( + + + {field.expectation ? t(v || 'Unknown') : v} + + + ))} + + ) + : ( + (field.expectation + ? t(field.choices[v] || 'Unknown') + : field.choices[v])} + name={field.key} + fullWidth={true} + style={{ marginTop: 20 }} + disabled={this.props.permissions.readOnly} + > + {Object.entries(field.choices) + .sort((a, b) => a[1].localeCompare(b[1])) + .map(([k, v]) => ( + + + {field.expectation ? t(v || 'Unknown') : v} + + + ))} + + ); case 'dependency-select': // eslint-disable-next-line no-case-declarations const depValue = values[field.dependencyField]; // eslint-disable-next-line no-case-declarations const choices = field.choices[depValue] ?? {}; - return field.cardinality === 'n' ? ( - v.map((a) => choices[a]).join(', ')} - name={field.key} - fullWidth={true} - style={{ marginTop: 20 }} - disabled={this.props.permissions.readOnly || field.readOnly} - > - {Object.entries(choices) - .sort((a, b) => a[1].localeCompare(b[1])) - .map(([k, v]) => ( - - {v} - - ))} - - ) : ( - (field.expectation ? t(choices[v] || 'Unknown') : choices[v]) - } - disabled={this.props.permissions.readOnly || field.readOnly} - name={field.key} - fullWidth={true} - style={{ marginTop: 20 }} - > - {Object.entries(choices) - .sort((a, b) => a[1].localeCompare(b[1])) - .map(([k, v]) => ( - - - {field.expectation ? t(v || 'Unknown') : v} - - - ))} - - ); + return field.cardinality === 'n' + ? ( + v.map(a => choices[a]).join(', ')} + name={field.key} + fullWidth={true} + style={{ marginTop: 20 }} + disabled={this.props.permissions.readOnly || field.readOnly} + > + {Object.entries(choices) + .sort((a, b) => a[1].localeCompare(b[1])) + .map(([k, v]) => ( + + {v} + + ))} + + ) + : ( + (field.expectation ? t(choices[v] || 'Unknown') : choices[v])} + disabled={this.props.permissions.readOnly || field.readOnly} + name={field.key} + fullWidth={true} + style={{ marginTop: 20 }} + > + {Object.entries(choices) + .sort((a, b) => a[1].localeCompare(b[1])) + .map(([k, v]) => ( + + + {field.expectation ? t(v || 'Unknown') : v} + + + ))} + + ); default: return ( !builtInFields.includes(f.key) && !f.expectation) + .filter(f => !builtInFields.includes(f.key) && !f.expectation) .forEach((field) => { if (field.cardinality && field.cardinality === '1') { let defaultValue = R.head(field.defaultValue); @@ -992,30 +1002,30 @@ class InjectDefinition extends Component { openVariables, } = this.state; // -- TEAMS -- - const fieldTeams = injectorContract.fields.filter((n) => n.key === 'teams').at(0); + const fieldTeams = injectorContract.fields.filter(n => n.key === 'teams').at(0); const hasTeams = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('teams'); // -- ASSETS -- - const fieldAssets = injectorContract.fields.filter((n) => n.key === 'assets').at(0); + const fieldAssets = injectorContract.fields.filter(n => n.key === 'assets').at(0); const hasAssets = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('assets'); const assets = assetIds - .map((a) => ({ asset_id: a, ...endpointsMap[a], type: 'static' })) - .filter((a) => a !== undefined); + .map(a => ({ asset_id: a, ...endpointsMap[a], type: 'static' })) + .filter(a => a !== undefined); // -- ASSET GROUPS -- const hasAssetGroups = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('assetgroups'); const assetGroups = assetGroupIds - .map((a) => assetGroupsMap[a]) - .filter((a) => a !== undefined); + .map(a => assetGroupsMap[a]) + .filter(a => a !== undefined); // -- ARTICLES -- const articles = articlesIds - .map((a) => articlesMap[a]) - .filter((a) => a !== undefined) - .map((a) => ({ + .map(a => articlesMap[a]) + .filter(a => a !== undefined) + .map(a => ({ ...a, article_channel_type: channelsMap[a.article_channel]?.channel_type || '', article_channel_name: channelsMap[a.article_channel]?.channel_name || '', @@ -1026,53 +1036,53 @@ class InjectDefinition extends Component { : [R.descend(R.prop(articlesSortBy))], ); const sortedArticles = sortArticles(articles); - const fieldArticles = injectorContract.fields.filter((n) => n.key === 'articles').at(0); + const fieldArticles = injectorContract.fields.filter(n => n.key === 'articles').at(0); const hasArticles = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('articles'); // -- CHALLENGES -- const challenges = challengesIds - .map((a) => challengesMap[a]) - .filter((a) => a !== undefined); + .map(a => challengesMap[a]) + .filter(a => a !== undefined); const sortChallenges = R.sortWith( challengesOrderAsc ? [R.ascend(R.prop(challengesSortBy))] : [R.descend(R.prop(challengesSortBy))], ); const sortedChallenges = sortChallenges(challenges); - const fieldChallenges = injectorContract.fields.filter((n) => n.key === 'challenges').at(0); + const fieldChallenges = injectorContract.fields.filter(n => n.key === 'challenges').at(0); const hasChallenges = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('challenges'); // -- DOCUMENTS -- const docs = documents - .map((d) => (documentsMap[d.document_id] + .map(d => (documentsMap[d.document_id] ? { - ...documentsMap[d.document_id], - document_attached: d.document_attached, - } + ...documentsMap[d.document_id], + document_attached: d.document_attached, + } : undefined)) - .filter((d) => d !== undefined); - const attachedDocs = docs.filter((n) => n.document_attached); + .filter(d => d !== undefined); + const attachedDocs = docs.filter(n => n.document_attached); const sortDocuments = R.sortWith( documentsOrderAsc ? [R.ascend(R.prop(documentsSortBy))] : [R.descend(R.prop(documentsSortBy))], ); const sortedDocuments = sortDocuments(docs); - const fieldAttachements = injectorContract.fields.filter((n) => n.key === 'attachments').at(0); + const fieldAttachements = injectorContract.fields.filter(n => n.key === 'attachments').at(0); const hasAttachments = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('attachments'); // -- EXPECTATIONS -- const hasExpectations = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('expectations'); const predefinedExpectations = injectorContract.fields.filter( - (f) => f.key === 'expectations', - ).flatMap((f) => f.predefinedExpectations); + f => f.key === 'expectations', + ).flatMap(f => f.predefinedExpectations); const expectationsNotManual = injectorContract.fields.filter( - (f) => f.expectation === true, + f => f.expectation === true, ); const builtInFields = [ 'teams', @@ -1093,7 +1103,7 @@ class InjectDefinition extends Component { - } + )} label={{t('All teams')}} /> @@ -1113,7 +1123,7 @@ class InjectDefinition extends Component {
    - } + )} />   @@ -1208,7 +1218,7 @@ class InjectDefinition extends Component { {t('Media pressure to publish')} - {sortedArticles.map((article) => ( + {sortedArticles.map(article => (
    - } + )} /> - {sortedChallenges.map((challenge) => ( + {sortedChallenges.map(challenge => (
    - } + )} /> !builtInFields.includes(f.key) && !f.expectation, + f => !builtInFields.includes(f.key) && !f.expectation, ) .filter((f) => { // Filter display if linked fields @@ -1438,7 +1448,7 @@ class InjectDefinition extends Component { {t('Inject documents')} - {sortedDocuments.map((document) => ( + {sortedDocuments.map(document => (
    - } + )} /> ))} !a.inject_document_attached).map((d) => d.document_id)} + initialDocumentIds={documents.filter(a => !a.inject_document_attached).map(d => d.document_id)} handleAddDocuments={this.handleAddDocuments.bind(this)} hasAttachments={hasAttachments} /> diff --git a/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx b/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx index 82f8698180..db18b75836 100644 --- a/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectDistributionByTeam.tsx @@ -1,18 +1,19 @@ import { useTheme } from '@mui/styles'; +import * as R from 'ramda'; import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; -import * as R from 'ramda'; -import Empty from '../../../../components/Empty'; + +import { fetchExerciseTeams } from '../../../../actions/Exercise'; import type { ExerciseStore } from '../../../../actions/exercises/Exercise'; +import type { TeamStore } from '../../../../actions/teams/Team'; +import type { TeamsHelper } from '../../../../actions/teams/team-helper'; +import Empty from '../../../../components/Empty'; import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; +import type { Theme } from '../../../../components/Theme'; import { useHelper } from '../../../../store'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { horizontalBarsChartOptions } from '../../../../utils/Charts'; -import type { Theme } from '../../../../components/Theme'; -import type { TeamsHelper } from '../../../../actions/teams/team-helper'; -import { fetchExerciseTeams } from '../../../../actions/Exercise'; -import type { TeamStore } from '../../../../actions/teams/Team'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { getTeamsColors } from './teams/utils'; interface Props { diff --git a/openbas-front/src/admin/components/common/injects/InjectDistributionByType.tsx b/openbas-front/src/admin/components/common/injects/InjectDistributionByType.tsx index 7d57360bf5..f2f85f4c36 100644 --- a/openbas-front/src/admin/components/common/injects/InjectDistributionByType.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectDistributionByType.tsx @@ -1,19 +1,20 @@ import { useTheme } from '@mui/styles'; +import * as R from 'ramda'; import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; -import * as R from 'ramda'; -import Empty from '../../../../components/Empty'; + import type { ExerciseStore } from '../../../../actions/exercises/Exercise'; +import { fetchExerciseInjects } from '../../../../actions/Inject'; +import type { InjectorContractHelper } from '../../../../actions/injector_contracts/injector-contract-helper'; +import type { InjectExpectationStore, InjectStore } from '../../../../actions/injects/Inject'; +import type { InjectHelper } from '../../../../actions/injects/inject-helper'; +import Empty from '../../../../components/Empty'; import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; +import type { Theme } from '../../../../components/Theme'; import { useHelper } from '../../../../store'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { horizontalBarsChartOptions } from '../../../../utils/Charts'; -import type { Theme } from '../../../../components/Theme'; -import type { InjectHelper } from '../../../../actions/injects/inject-helper'; -import { fetchExerciseInjects } from '../../../../actions/Inject'; -import type { InjectExpectationStore, InjectStore } from '../../../../actions/injects/Inject'; -import type { InjectorContractHelper } from '../../../../actions/injector_contracts/injector-contract-helper'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; interface Props { exerciseId: ExerciseStore['exercise_id']; diff --git a/openbas-front/src/admin/components/common/injects/InjectForm.js b/openbas-front/src/admin/components/common/injects/InjectForm.js index 663ccb8da2..d4d205e5b1 100644 --- a/openbas-front/src/admin/components/common/injects/InjectForm.js +++ b/openbas-front/src/admin/components/common/injects/InjectForm.js @@ -1,12 +1,13 @@ -import { Component } from 'react'; +import { withStyles } from '@mui/styles'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; -import { withStyles } from '@mui/styles'; +import { Component } from 'react'; + import OldTextField from '../../../../components/fields/OldTextField'; import inject18n from '../../../../components/i18n'; import TagField from '../../../../components/TagField'; -const styles = (theme) => ({ +const styles = theme => ({ duration: { marginTop: 20, width: '100%', @@ -89,35 +90,35 @@ class InjectForm extends Component { disabled={disabled} /> {!isAtomic - && ( -
    -
    {t('Trigger after')}
    - - - -
    - )} + && ( +
    +
    {t('Trigger after')}
    + + + +
    + )} ); } diff --git a/openbas-front/src/admin/components/common/injects/InjectIcon.js b/openbas-front/src/admin/components/common/injects/InjectIcon.js index cb2eb45069..96d26231d9 100644 --- a/openbas-front/src/admin/components/common/injects/InjectIcon.js +++ b/openbas-front/src/admin/components/common/injects/InjectIcon.js @@ -1,6 +1,7 @@ -import * as PropTypes from 'prop-types'; import { DnsOutlined, HelpOutlineOutlined } from '@mui/icons-material'; import { ApplicationCogOutline, Console, FileImportOutline, LanConnect } from 'mdi-material-ui'; +import * as PropTypes from 'prop-types'; + import CustomTooltip from '../../../../components/CustomTooltip'; import { useFormatter } from '../../../../components/i18n'; @@ -16,18 +17,18 @@ const iconSelector = (type, isPayload, variant, fontSize, done, disabled, onClic }; if (!type) { return ( - + ); } if (isPayload) { if (type.startsWith('openbas_')) { return ( - {type} + {type} ); } switch (type) { case 'Command': - return ; + return ; case 'Executable': return ; case 'FileDrop': diff --git a/openbas-front/src/admin/components/common/injects/InjectPopover.tsx b/openbas-front/src/admin/components/common/injects/InjectPopover.tsx index 603f001cf1..34c35d0d18 100644 --- a/openbas-front/src/admin/components/common/injects/InjectPopover.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectPopover.tsx @@ -1,32 +1,33 @@ +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem, Table, TableBody, TableCell, TableRow } from '@mui/material'; import { FunctionComponent, useContext, useState } from 'react'; import * as React from 'react'; import { Link } from 'react-router-dom'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem, Table, TableBody, TableCell, TableRow } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; -import { useFormatter } from '../../../../components/i18n'; -import Transition from '../../../../components/common/Transition'; -import { InjectContext, PermissionsContext } from '../Context'; -import type { Inject, InjectStatus, InjectStatusExecution, InjectTestStatus } from '../../../../utils/api-types'; + +import type { ExercisesHelper } from '../../../../actions/exercises/exercise-helper'; import { duplicateInjectForExercise, duplicateInjectForScenario } from '../../../../actions/Inject'; +import type { InjectStore } from '../../../../actions/injects/Inject'; import { testInject } from '../../../../actions/injects/inject-action'; -import { useAppDispatch } from '../../../../utils/hooks'; import DialogDuplicate from '../../../../components/common/DialogDuplicate'; -import { useHelper } from '../../../../store'; -import type { ExercisesHelper } from '../../../../actions/exercises/exercise-helper'; import DialogTest from '../../../../components/common/DialogTest'; +import Transition from '../../../../components/common/Transition'; +import { useFormatter } from '../../../../components/i18n'; +import { useHelper } from '../../../../store'; +import type { Inject, InjectStatus, InjectStatusExecution, InjectTestStatus } from '../../../../utils/api-types'; import { MESSAGING$ } from '../../../../utils/Environment'; -import type { InjectStore } from '../../../../actions/injects/Inject'; +import { useAppDispatch } from '../../../../utils/hooks'; +import { InjectContext, PermissionsContext } from '../Context'; type InjectPopoverType = { - inject_id: string, - inject_exercise?: string, - inject_scenario?: string, - inject_status?: InjectStatus, - inject_testable?: boolean, - inject_teams?: string[], - inject_type?: string, - inject_enabled?: boolean, - inject_title?: string, + inject_id: string; + inject_exercise?: string; + inject_scenario?: string; + inject_status?: InjectStatus; + inject_testable?: boolean; + inject_teams?: string[]; + inject_type?: string; + inject_enabled?: boolean; + inject_title?: string; }; interface Props { @@ -37,8 +38,8 @@ interface Props { canDone?: boolean; canTriggerNow?: boolean; exerciseOrScenarioId?: string; - onCreate?: (result: { result: string, entities: { injects: Record } }) => void; - onUpdate?: (result: { result: string, entities: { injects: Record } }) => void; + onCreate?: (result: { result: string; entities: { injects: Record } }) => void; + onUpdate?: (result: { result: string; entities: { injects: Record } }) => void; onDelete?: (result: string) => void; } @@ -93,12 +94,12 @@ const InjectPopover: FunctionComponent = ({ const submitDuplicate = () => { if (inject.inject_exercise) { - dispatch(duplicateInjectForExercise(inject.inject_exercise, inject.inject_id)).then((result: { result: string, entities: { injects: Record } }) => { + dispatch(duplicateInjectForExercise(inject.inject_exercise, inject.inject_id)).then((result: { result: string; entities: { injects: Record } }) => { onCreate?.(result); }); } if (inject.inject_scenario) { - dispatch(duplicateInjectForScenario(inject.inject_scenario, inject.inject_id)).then((result: { result: string, entities: { injects: Record } }) => { + dispatch(duplicateInjectForScenario(inject.inject_scenario, inject.inject_id)).then((result: { result: string; entities: { injects: Record } }) => { onCreate?.(result); }); } @@ -227,12 +228,12 @@ const InjectPopover: FunctionComponent = ({ {t('Update')} {!inject.inject_status && onInjectDone && canDone && ( - - {t('Mark as done')} - + + {t('Mark as done')} + )} {inject.inject_testable && canBeTested && ( diff --git a/openbas-front/src/admin/components/common/injects/InjectStatusDetails.js b/openbas-front/src/admin/components/common/injects/InjectStatusDetails.js index 76c907e44d..3e90c382f2 100644 --- a/openbas-front/src/admin/components/common/injects/InjectStatusDetails.js +++ b/openbas-front/src/admin/components/common/injects/InjectStatusDetails.js @@ -1,8 +1,9 @@ -import { Component } from 'react'; +import { PreviewOutlined } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, IconButton, Table, TableBody, TableCell, TableRow } from '@mui/material'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; -import { Dialog, DialogContent, DialogActions, Button, IconButton, TableRow, TableCell, TableBody, Table } from '@mui/material'; -import { PreviewOutlined } from '@mui/icons-material'; +import { Component } from 'react'; + import Transition from '../../../../components/common/Transition'; import inject18n from '../../../../components/i18n'; @@ -51,9 +52,9 @@ class InjectStatusDetails extends Component { {key} - - {value.filter((trace) => !!trace.execution_message) - .map((trace) => ( + + {value.filter(trace => !!trace.execution_message) + .map(trace => ( {trace.execution_message} diff --git a/openbas-front/src/admin/components/common/injects/InjectorContract.js b/openbas-front/src/admin/components/common/injects/InjectorContract.js index 82baea7f96..bc5054f70a 100644 --- a/openbas-front/src/admin/components/common/injects/InjectorContract.js +++ b/openbas-front/src/admin/components/common/injects/InjectorContract.js @@ -1,8 +1,9 @@ -import { Component } from 'react'; -import * as R from 'ramda'; -import * as PropTypes from 'prop-types'; -import { withStyles } from '@mui/styles'; import { Chip, Tooltip } from '@mui/material'; +import { withStyles } from '@mui/styles'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; + import inject18n from '../../../../components/i18n'; const styles = () => ({ diff --git a/openbas-front/src/admin/components/common/injects/Injects.tsx b/openbas-front/src/admin/components/common/injects/Injects.tsx index 5e6ade5427..0689309683 100644 --- a/openbas-front/src/admin/components/common/injects/Injects.tsx +++ b/openbas-front/src/admin/components/common/injects/Injects.tsx @@ -1,37 +1,38 @@ -import { CSSProperties, FunctionComponent, useContext, useMemo, useState } from 'react'; -import * as React from 'react'; import { Checkbox, Chip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { Link } from 'react-router-dom'; import * as R from 'ramda'; -import { splitDuration } from '../../../../utils/Time'; -import ItemTags from '../../../../components/ItemTags'; -import InjectIcon from './InjectIcon'; -import InjectPopover from './InjectPopover'; -import InjectorContract from './InjectorContract'; -import ItemBoolean from '../../../../components/ItemBoolean'; -import PlatformIcon from '../../../../components/PlatformIcon'; -import { isNotEmptyField } from '../../../../utils/utils'; -import { useFormatter } from '../../../../components/i18n'; -import type { FilterGroup, Inject, InjectTestStatus, Variable } from '../../../../utils/api-types'; +import { CSSProperties, FunctionComponent, useContext, useMemo, useState } from 'react'; +import * as React from 'react'; +import { Link } from 'react-router-dom'; + +import type { ArticleStore } from '../../../../actions/channels/Article'; import type { InjectorContractConvertedContent, InjectOutputType, InjectStore } from '../../../../actions/injects/Inject'; -import { InjectContext, PermissionsContext, ViewModeContext } from '../Context'; -import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; -import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; -import SortHeadersComponentV2 from '../../../../components/common/queryable/sort/SortHeadersComponentV2'; -import InjectsListButtons from './InjectsListButtons'; +import type { TeamStore } from '../../../../actions/teams/Team'; import ChainedTimeline from '../../../../components/ChainedTimeline'; -import { initSorting } from '../../../../components/common/queryable/Page'; -import UpdateInject from './UpdateInject'; import ButtonCreate from '../../../../components/common/ButtonCreate'; -import CreateInject from './CreateInject'; -import type { TeamStore } from '../../../../actions/teams/Team'; -import type { ArticleStore } from '../../../../actions/channels/Article'; import { buildEmptyFilter } from '../../../../components/common/queryable/filter/FilterUtils'; +import { initSorting } from '../../../../components/common/queryable/Page'; +import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; +import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; +import SortHeadersComponentV2 from '../../../../components/common/queryable/sort/SortHeadersComponentV2'; import { useQueryableWithLocalStorage } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; -import ToolBar from '../ToolBar'; +import { useFormatter } from '../../../../components/i18n'; +import ItemBoolean from '../../../../components/ItemBoolean'; +import ItemTags from '../../../../components/ItemTags'; +import PlatformIcon from '../../../../components/PlatformIcon'; +import type { FilterGroup, Inject, InjectTestStatus, Variable } from '../../../../utils/api-types'; import { MESSAGING$ } from '../../../../utils/Environment'; import useEntityToggle from '../../../../utils/hooks/useEntityToggle'; +import { splitDuration } from '../../../../utils/Time'; +import { isNotEmptyField } from '../../../../utils/utils'; +import { InjectContext, PermissionsContext, ViewModeContext } from '../Context'; +import ToolBar from '../ToolBar'; +import CreateInject from './CreateInject'; +import InjectIcon from './InjectIcon'; +import InjectorContract from './InjectorContract'; +import InjectPopover from './InjectPopover'; +import InjectsListButtons from './InjectsListButtons'; +import UpdateInject from './UpdateInject'; const useStyles = makeStyles(() => ({ disabled: { @@ -91,16 +92,16 @@ const inlineStyles: Record = { }; interface Props { - exerciseOrScenarioId: string - setViewMode?: (mode: string) => void - availableButtons: string[] - teams: TeamStore[] - articles: ArticleStore[] - variables: Variable[] - uriVariable: string - allUsersNumber?: number - usersNumber?: number - teamsUsers: never + exerciseOrScenarioId: string; + setViewMode?: (mode: string) => void; + availableButtons: string[]; + teams: TeamStore[]; + articles: ArticleStore[]; + variables: Variable[]; + uriVariable: string; + allUsersNumber?: number; + usersNumber?: number; + teamsUsers: never; } const Injects: FunctionComponent = ({ @@ -130,13 +131,15 @@ const Injects: FunctionComponent = ({ isSortable: false, value: (_: InjectOutputType, injectContract: InjectorContractConvertedContent) => { const injectorContractName = tPick(injectContract?.label); - return injectContract ? ( - - ) : ; + return injectContract + ? ( + + ) + : ; } , }, @@ -154,28 +157,37 @@ const Injects: FunctionComponent = ({ const duration = splitDuration( inject.inject_depends_duration || 0, ); - return ; + /> + ); }, }, { field: 'inject_platforms', label: 'Platform(s)', isSortable: false, - value: (inject: InjectOutputType, _: InjectorContractConvertedContent) => <>{ - inject.inject_injector_contract?.injector_contract_platforms?.map( - (platform) => , - )}, + value: (inject: InjectOutputType, _: InjectorContractConvertedContent) => ( + <> + { + inject.inject_injector_contract?.injector_contract_platforms?.map( + platform => ( + + ), + ) + } + + ), }, { field: 'inject_enabled', @@ -188,13 +200,15 @@ const Injects: FunctionComponent = ({ if (!inject.inject_ready) { injectStatus = t('Missing content'); } - return ; + return ( + + ); }, }, { @@ -211,14 +225,14 @@ const Injects: FunctionComponent = ({ const [reloadInjectCount, setReloadInjectCount] = useState(0); // Optimistic update - const onCreate = (result: { result: string, entities: { injects: Record } }) => { + const onCreate = (result: { result: string; entities: { injects: Record } }) => { if (result.entities) { const created = result.entities.injects[result.result]; setInjects([created as InjectOutputType, ...injects]); } }; - const onUpdate = (result: { result: string, entities: { injects: Record } }) => { + const onUpdate = (result: { result: string; entities: { injects: Record } }) => { if (result.entities) { const updated = result.entities.injects[result.result]; setInjects(injects.map((i) => { @@ -229,25 +243,25 @@ const Injects: FunctionComponent = ({ const onDelete = (result: string) => { if (result) { - setInjects(injects.filter((i) => (i.inject_id !== result))); + setInjects(injects.filter(i => (i.inject_id !== result))); } }; const onMassDelete = (results: string[]) => { if (results.length !== 0) { - setInjects(injects.filter((i) => (!results.includes(i.inject_id)))); + setInjects(injects.filter(i => (!results.includes(i.inject_id)))); } }; const onCreateInject = async (data: Inject) => { - await injectContext.onAddInject(data).then((result: { result: string, entities: { injects: Record } }) => { + await injectContext.onAddInject(data).then((result: { result: string; entities: { injects: Record } }) => { onCreate(result); }); }; const onUpdateInject = async (data: Inject) => { if (selectedInjectId) { - await injectContext.onUpdateInject(selectedInjectId, data).then((result: { result: string, entities: { injects: Record } }) => { + await injectContext.onUpdateInject(selectedInjectId, data).then((result: { result: string; entities: { injects: Record } }) => { onUpdate(result); return result; }); @@ -257,7 +271,7 @@ const Injects: FunctionComponent = ({ const massUpdateInject = async (data: Inject[]) => { const promises: Promise[] = []; data.forEach((inject) => { - promises.push(injectContext.onUpdateInject(inject.inject_id, inject).then((result: { result: string, entities: { injects: Record } }) => { + promises.push(injectContext.onUpdateInject(inject.inject_id, inject).then((result: { result: string; entities: { injects: Record } }) => { if (result.entities) { return result.entities.injects[result.result]; } @@ -268,8 +282,8 @@ const Injects: FunctionComponent = ({ Promise.all(promises).then((values) => { if (values !== undefined) { const updatedInjects = injects - .map((inject) => (values.find((value) => value !== undefined && value.inject_id === inject.inject_id) - ? (values.find((value) => value !== undefined && value?.inject_id === inject.inject_id) as InjectOutputType) + .map(inject => (values.find(value => value !== undefined && value.inject_id === inject.inject_id) + ? (values.find(value => value !== undefined && value?.inject_id === inject.inject_id) as InjectOutputType) : inject as InjectOutputType)); setInjects(updatedInjects); } @@ -278,15 +292,15 @@ const Injects: FunctionComponent = ({ const [openCreateDrawer, setOpenCreateDrawer] = useState(false); const [presetCreationValues, setPresetCreationValues] = useState<{ - inject_depends_duration_days?: number, - inject_depends_duration_hours?: number, - inject_depends_duration_minutes?: number, + inject_depends_duration_days?: number; + inject_depends_duration_hours?: number; + inject_depends_duration_minutes?: number; }>(); const openCreateInjectDrawer = (data: { - inject_depends_duration_days?: number, - inject_depends_duration_hours?: number, - inject_depends_duration_minutes?: number, + inject_depends_duration_days?: number; + inject_depends_duration_hours?: number; + inject_depends_duration_minutes?: number; }) => { setOpenCreateDrawer(true); setPresetCreationValues(data); @@ -345,7 +359,7 @@ const Injects: FunctionComponent = ({ firstIndex++; } const forcedRemove = R.values(selectedElements).filter( - (n: Inject) => !entities.map((o) => o.inject_id).includes(n.inject_id), + (n: Inject) => !entities.map(o => o.inject_id).includes(n.inject_id), ); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error @@ -358,7 +372,7 @@ const Injects: FunctionComponent = ({ firstIndex--; } const forcedRemove = R.values(selectedElements).filter( - (n: Inject) => !entities.map((o) => o.inject_id).includes(n.inject_id), + (n: Inject) => !entities.map(o => o.inject_id).includes(n.inject_id), ); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error @@ -376,9 +390,9 @@ const Injects: FunctionComponent = ({ ); const massUpdateInjects = async (actions: { - field: string, - type: string, - values: { value: string }[] + field: string; + type: string; + values: { value: string }[]; }[]) => { const updateFields = [ 'inject_title', @@ -408,23 +422,23 @@ const Injects: FunctionComponent = ({ // @ts-expect-error define type if (isNotEmptyField(injectToUpdate[`inject_${action.field}`])) { // @ts-expect-error define type - injectToUpdate[`inject_${action.field}`] = R.uniq([...injectToUpdate[`inject_${action.field}`], ...action.values.map((n) => n.value)]); + injectToUpdate[`inject_${action.field}`] = R.uniq([...injectToUpdate[`inject_${action.field}`], ...action.values.map(n => n.value)]); } else { // @ts-expect-error define type - injectToUpdate[`inject_${action.field}`] = R.uniq(action.values.map((n) => n.value)); + injectToUpdate[`inject_${action.field}`] = R.uniq(action.values.map(n => n.value)); } // eslint-disable-next-line no-await-in-loop await injectContext.onBulkUpdateInject(injectToUpdate.inject_id, R.pick(updateFields, injectToUpdate)) - .then((result: { result: string, entities: { injects: Record } }) => { + .then((result: { result: string; entities: { injects: Record } }) => { onUpdate(result); }); break; case 'REPLACE': // @ts-expect-error define type - injectToUpdate[`inject_${action.field}`] = R.uniq(action.values.map((n) => n.value)); + injectToUpdate[`inject_${action.field}`] = R.uniq(action.values.map(n => n.value)); // eslint-disable-next-line no-await-in-loop await injectContext.onBulkUpdateInject(injectToUpdate.inject_id, R.pick(updateFields, injectToUpdate)) - .then((result: { result: string, entities: { injects: Record } }) => { + .then((result: { result: string; entities: { injects: Record } }) => { onUpdate(result); }); break; @@ -432,14 +446,14 @@ const Injects: FunctionComponent = ({ // @ts-expect-error define type if (isNotEmptyField(injectToUpdate[`inject_${action.field}`])) { // @ts-expect-error define type - injectToUpdate[`inject_${action.field}`] = injectToUpdate[`inject_${action.field}`].filter((n: string) => !action.values.map((o) => o.value).includes(n)); + injectToUpdate[`inject_${action.field}`] = injectToUpdate[`inject_${action.field}`].filter((n: string) => !action.values.map(o => o.value).includes(n)); } else { // @ts-expect-error define type injectToUpdate[`inject_${action.field}`] = []; } // eslint-disable-next-line no-await-in-loop await injectContext.onBulkUpdateInject(injectToUpdate.inject_id, R.pick(updateFields, injectToUpdate)) - .then((result: { result: string, entities: { injects: Record } }) => { + .then((result: { result: string; entities: { injects: Record } }) => { onUpdate(result); }); break; @@ -458,7 +472,7 @@ const Injects: FunctionComponent = ({ }; const massTestInjects = () => { - injectContext.bulkTestInjects(injectsToProcess.map((inject: InjectOutputType) => inject.inject_id)).then((result: { uri: string, data: InjectTestStatus[] }) => { + injectContext.bulkTestInjects(injectsToProcess.map((inject: InjectOutputType) => inject.inject_id)).then((result: { uri: string; data: InjectTestStatus[] }) => { if (numberOfSelectedElements === 1) { MESSAGING$.notifySuccess(t('Inject test has been sent, you can view test logs details on {itsDedicatedPage}.', { itsDedicatedPage: {t('its dedicated page')}, @@ -474,21 +488,21 @@ const Injects: FunctionComponent = ({ return ( <> injectContext.searchInjects(input)} + fetch={input => injectContext.searchInjects(input)} searchPaginationInput={searchPaginationInput} setContent={setInjects} entityPrefix="inject" availableFilterNames={availableFilterNames} queryableHelpers={queryableHelpers} reloadContentCount={reloadInjectCount} - topBarButtons={ + topBarButtons={( setReloadInjectCount((prev) => prev + 1)} + onImportedInjects={() => setReloadInjectCount(prev => prev + 1)} /> - } + )} /> {viewModeContext === 'chain' && (
    @@ -531,13 +545,13 @@ const Injects: FunctionComponent = ({ - } + )} /> @@ -558,17 +572,16 @@ const Injects: FunctionComponent = ({ > (event.shiftKey + onClick={event => (event.shiftKey ? onRowShiftClick(index, inject, event) - : onToggleEntity(inject, event)) - } + : onToggleEntity(inject, event))} > @@ -586,12 +599,12 @@ const Injects: FunctionComponent = ({ />
    - {headers.map((header) => ( + {headers.map(header => (
    = ({ ))}
    - } + )} /> = ({ {permissions.canWrite && ( <> {selectedInjectId !== null - && setSelectedInjectId(null)} onUpdateInject={onUpdateInject} @@ -639,8 +653,8 @@ const Injects: FunctionComponent = ({ usersNumber={usersNumber} teamsUsers={teamsUsers} injects={injects} - /> - } + /> + )} { setOpenCreateDrawer(true); setPresetCreationValues(undefined); diff --git a/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx b/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx index 05f1b9a4af..f2326cb446 100644 --- a/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectsDistribution.tsx @@ -1,11 +1,12 @@ -import Chart from 'react-apexcharts'; -import { FunctionComponent } from 'react'; import { useTheme } from '@mui/styles'; -import { horizontalBarsChartOptions } from '../../../../utils/Charts'; +import { FunctionComponent } from 'react'; +import Chart from 'react-apexcharts'; + +import type { TeamStore } from '../../../../actions/teams/Team'; import Empty from '../../../../components/Empty'; import { useFormatter } from '../../../../components/i18n'; import type { Theme } from '../../../../components/Theme'; -import type { TeamStore } from '../../../../actions/teams/Team'; +import { horizontalBarsChartOptions } from '../../../../utils/Charts'; interface Props { topTeams: TeamStore[]; diff --git a/openbas-front/src/admin/components/common/injects/InjectsListButtons.tsx b/openbas-front/src/admin/components/common/injects/InjectsListButtons.tsx index 64cd446055..6780265747 100644 --- a/openbas-front/src/admin/components/common/injects/InjectsListButtons.tsx +++ b/openbas-front/src/admin/components/common/injects/InjectsListButtons.tsx @@ -1,16 +1,17 @@ -import { FunctionComponent, useContext } from 'react'; -import { ToggleButton, ToggleButtonGroup, Tooltip } from '@mui/material'; import { BarChartOutlined, ReorderOutlined, ViewTimelineOutlined } from '@mui/icons-material'; +import { ToggleButton, ToggleButtonGroup, Tooltip } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useContext } from 'react'; + +import type { TagHelper } from '../../../../actions/helper'; import type { InjectOutputType } from '../../../../actions/injects/Inject'; -import { exportData } from '../../../../utils/Environment'; +import ButtonPopover from '../../../../components/common/ButtonPopover'; import { useFormatter } from '../../../../components/i18n'; +import { useHelper } from '../../../../store'; +import { exportData } from '../../../../utils/Environment'; +import useExportToXLS from '../../../../utils/hooks/useExportToXLS'; import { InjectContext, ViewModeContext } from '../Context'; import ImportUploaderInjectFromXls from './ImportUploaderInjectFromXls'; -import useExportToXLS from '../../../../utils/hooks/useExportToXLS'; -import { useHelper } from '../../../../store'; -import type { TagHelper } from '../../../../actions/helper'; -import ButtonPopover from '../../../../components/common/ButtonPopover'; const useStyles = makeStyles(() => ({ container: { @@ -46,7 +47,7 @@ const InjectsListButtons: FunctionComponent = ({ tagsMap: helper.getTagsMap(), })); - const isAtLeastOneValidInject = injects.some((inject) => !inject.inject_injector_contract?.injector_contract_content_parsed); + const isAtLeastOneValidInject = injects.some(inject => !inject.inject_injector_contract?.injector_contract_content_parsed); const exportInjects = exportData( 'inject', @@ -73,7 +74,7 @@ const InjectsListButtons: FunctionComponent = ({ = ({ aria-label="Change view mode" > {injectContext.onImportInjectFromXls - && } + && } {(!!setViewMode && availableButtons.includes('list')) - && + && ( + setViewMode('list')} @@ -94,9 +96,10 @@ const InjectsListButtons: FunctionComponent = ({ - } + )} {(!!setViewMode && availableButtons.includes('chain')) - && + && ( + setViewMode('chain')} @@ -106,9 +109,10 @@ const InjectsListButtons: FunctionComponent = ({ - } + )} {(!!setViewMode && availableButtons.includes('distribution')) - && + && ( + setViewMode('distribution')} @@ -117,7 +121,7 @@ const InjectsListButtons: FunctionComponent = ({ - } + )}
    ); diff --git a/openbas-front/src/admin/components/common/injects/ResponsePie.tsx b/openbas-front/src/admin/components/common/injects/ResponsePie.tsx index 8a38648a6d..30b3b0fb22 100644 --- a/openbas-front/src/admin/components/common/injects/ResponsePie.tsx +++ b/openbas-front/src/admin/components/common/injects/ResponsePie.tsx @@ -1,15 +1,16 @@ -import Chart from 'react-apexcharts'; -import { memo } from 'react'; -import { makeStyles, useTheme } from '@mui/styles'; -import { Button, Grid } from '@mui/material'; import { InfoOutlined, SensorOccupiedOutlined, ShieldOutlined, TrackChangesOutlined } from '@mui/icons-material'; -import { Link } from 'react-router-dom'; +import { Button, Grid } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; import type { ApexOptions } from 'apexcharts'; +import { memo } from 'react'; +import Chart from 'react-apexcharts'; +import { Link } from 'react-router-dom'; + import { useFormatter } from '../../../../components/i18n'; -import type { ExpectationResultsByType, ResultDistribution } from '../../../../utils/api-types'; +import Loader from '../../../../components/Loader'; import type { Theme } from '../../../../components/Theme'; +import type { ExpectationResultsByType, ResultDistribution } from '../../../../utils/api-types'; import { donutChartOptions } from '../../../../utils/Charts'; -import Loader from '../../../../components/Loader'; const useStyles = makeStyles((theme: Theme) => ({ chartContainer: { @@ -44,10 +45,10 @@ interface Props { expectationResultsByTypes?: ExpectationResultsByType[] | null; humanValidationLink?: string; immutable?: boolean; - disableChartAnimation?:boolean; + disableChartAnimation?: boolean; } -const ResponsePie = (({ expectationResultsByTypes, humanValidationLink, immutable, disableChartAnimation }: Props) => { +const ResponsePie = ({ expectationResultsByTypes, humanValidationLink, immutable, disableChartAnimation }: Props) => { // Standard hooks const classes = useStyles(); const { t } = useFormatter(); @@ -55,23 +56,23 @@ const ResponsePie = (({ expectationResultsByTypes, humanValidationLink, immutabl // Style const getColor = (result: string | undefined): string => { const colorMap: Record = { - Blocked: theme.palette.success.main ?? '', - Detected: theme.palette.success.main ?? '', - Successful: theme.palette.success.main ?? '', - Partial: theme.palette.warning.main ?? '', + 'Blocked': theme.palette.success.main ?? '', + 'Detected': theme.palette.success.main ?? '', + 'Successful': theme.palette.success.main ?? '', + 'Partial': theme.palette.warning.main ?? '', 'Partially Prevented': theme.palette.warning.main ?? '', 'Partially Detected': theme.palette.warning.main ?? '', - Pending: theme.palette.grey?.['500'] ?? '', + 'Pending': theme.palette.grey?.['500'] ?? '', }; return colorMap[result ?? ''] ?? theme.palette.error.main ?? ''; }; const getTotal = (distribution: ResultDistribution[]) => { return distribution.reduce((sum, item) => sum + (item.value!), 0)!; }; - const prevention = expectationResultsByTypes?.find((e) => e.type === 'PREVENTION'); - const detection = expectationResultsByTypes?.find((e) => e.type === 'DETECTION'); - const humanResponse = expectationResultsByTypes?.find((e) => e.type === 'HUMAN_RESPONSE'); - const pending = humanResponse?.distribution?.filter((res) => res.label === 'Pending' && (res.value ?? 0) > 0) ?? []; + const prevention = expectationResultsByTypes?.find(e => e.type === 'PREVENTION'); + const detection = expectationResultsByTypes?.find(e => e.type === 'DETECTION'); + const humanResponse = expectationResultsByTypes?.find(e => e.type === 'HUMAN_RESPONSE'); + const pending = humanResponse?.distribution?.filter(res => res.label === 'Pending' && (res.value ?? 0) > 0) ?? []; const displayHumanValidationBtn = humanValidationLink && (pending.length > 0); const renderIcon = (type: string, hasDistribution: boolean | undefined) => { switch (type) { @@ -83,33 +84,35 @@ const ResponsePie = (({ expectationResultsByTypes, humanValidationLink, immutabl return ; } }; - const Pie = ({ title, expectationResultsByType, type }: { title: string, expectationResultsByType?: ExpectationResultsByType, type: string }) => { + const Pie = ({ title, expectationResultsByType, type }: { title: string; expectationResultsByType?: ExpectationResultsByType; type: string }) => { const hasDistribution = expectationResultsByType && expectationResultsByType.distribution && expectationResultsByType.distribution.length > 0; const labels = hasDistribution - ? expectationResultsByType.distribution.map((e) => `${t(e.label)} (${(((e.value!) / getTotal(expectationResultsByType.distribution!)) * 100).toFixed(1)}%)`) + ? expectationResultsByType.distribution.map(e => `${t(e.label)} (${(((e.value!) / getTotal(expectationResultsByType.distribution!)) * 100).toFixed(1)}%)`) : [`${t('No expectation for')} ${title}`]; let colors = []; if (immutable) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - colors = hasDistribution ? expectationResultsByType.distribution.map((e) => getColor(e.label)).asMutable() : ['rgba(202, 203, 206, 0.18)']; + colors = hasDistribution ? expectationResultsByType.distribution.map(e => getColor(e.label)).asMutable() : ['rgba(202, 203, 206, 0.18)']; } else { - colors = hasDistribution ? expectationResultsByType.distribution.map((e) => getColor(e.label)) : ['rgba(202, 203, 206, 0.18)']; + colors = hasDistribution ? expectationResultsByType.distribution.map(e => getColor(e.label)) : ['rgba(202, 203, 206, 0.18)']; } - const data = hasDistribution ? expectationResultsByType.distribution.map((e) => e.value) : [1]; + const data = hasDistribution ? expectationResultsByType.distribution.map(e => e.value) : [1]; return (
    {renderIcon(type, hasDistribution)} - + - {expectationResultsByTypes && expectationResultsByTypes.length > 0 ? : } + {expectationResultsByTypes && expectationResultsByTypes.length > 0 ? : } - {expectationResultsByTypes && expectationResultsByTypes.length > 0 ? : } + {expectationResultsByTypes && expectationResultsByTypes.length > 0 ? : } - {expectationResultsByTypes && expectationResultsByTypes.length > 0 ? : } + {expectationResultsByTypes && expectationResultsByTypes.length > 0 ? : } ); -}); +}; export default memo(ResponsePie); diff --git a/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx b/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx index e1c1d496cd..f3f2343d29 100644 --- a/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx +++ b/openbas-front/src/admin/components/common/injects/ScenarioInjectsDistribution.tsx @@ -1,7 +1,8 @@ -import { FunctionComponent } from 'react'; import * as R from 'ramda'; -import { useFormatter } from '../../../../components/i18n'; +import { FunctionComponent } from 'react'; + import type { TeamStore } from '../../../../actions/teams/Team'; +import { useFormatter } from '../../../../components/i18n'; import InjectsDistribution from './InjectsDistribution'; import { getTeamsColors } from './teams/utils'; @@ -35,7 +36,8 @@ const ScenarioInjectsDistribution: FunctionComponent = ({ ); return ( - diff --git a/openbas-front/src/admin/components/common/injects/UpdateInject.tsx b/openbas-front/src/admin/components/common/injects/UpdateInject.tsx index a23b883158..edd7ff0421 100644 --- a/openbas-front/src/admin/components/common/injects/UpdateInject.tsx +++ b/openbas-front/src/admin/components/common/injects/UpdateInject.tsx @@ -1,17 +1,18 @@ +import { Tab, Tabs } from '@mui/material'; import { useEffect, useRef, useState } from 'react'; import * as React from 'react'; -import { Tab, Tabs } from '@mui/material'; + +import { fetchInject } from '../../../../actions/Inject'; +import type { InjectOutputType } from '../../../../actions/injects/Inject'; +import type { InjectHelper } from '../../../../actions/injects/inject-helper'; import Drawer from '../../../../components/common/Drawer'; import { useFormatter } from '../../../../components/i18n'; +import { useHelper } from '../../../../store'; import type { Inject } from '../../../../utils/api-types'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; import UpdateInjectDetails from './UpdateInjectDetails'; -import { fetchInject } from '../../../../actions/Inject'; -import { useHelper } from '../../../../store'; -import type { InjectHelper } from '../../../../actions/injects/inject-helper'; import UpdateInjectLogicalChains from './UpdateInjectLogicalChains'; -import type { InjectOutputType } from '../../../../actions/injects/Inject'; interface Props { open: boolean; @@ -63,13 +64,13 @@ const UpdateInject: React.FC = ({ open, handleClose, onUpdateInject, mass > <> {!isAtomic && ( - - {availableTabs.map((tab) => { - return ( - - ); - })} - + + {availableTabs.map((tab) => { + return ( + + ); + })} + )} {!isInjectLoading && (isAtomic || activeTab === 'Inject details') && ( ({ +const useStyles = makeStyles(theme => ({ details: { marginTop: 20, }, @@ -65,7 +66,7 @@ const UpdateInjectDetails = ({ const [openDetails, setOpenDetails] = useState(true); const [injectDetailsState, setInjectDetailsState] = useState({}); const dispatch = useAppDispatch(); - const { tagsMap } = useHelper((helper) => ({ + const { tagsMap } = useHelper(helper => ({ tagsMap: helper.getTagsMap(), })); useDataLoader(() => { @@ -101,19 +102,19 @@ const UpdateInjectDetails = ({ if (contractContent) { const finalData = {}; const hasArticles = contractContent.fields - .map((f) => f.key) + .map(f => f.key) .includes('articles'); if (hasArticles && injectDetailsState.articlesIds) { finalData.articles = injectDetailsState.articlesIds; } const hasChallenges = contractContent.fields - .map((f) => f.key) + .map(f => f.key) .includes('challenges'); if (hasChallenges && injectDetailsState.challengesIds) { finalData.challenges = injectDetailsState.challengesIds; } const hasExpectations = contractContent.fields - .map((f) => f.key) + .map(f => f.key) .includes('expectations'); if (hasExpectations && injectDetailsState.expectations) { finalData.expectations = injectDetailsState.expectations; @@ -121,7 +122,7 @@ const UpdateInjectDetails = ({ if (openDetails) { contractContent.fields .filter( - (f) => !['teams', 'assets', 'assetgroups', 'articles', 'challenges', 'attachments', 'expectations'].includes( + f => !['teams', 'assets', 'assetgroups', 'articles', 'challenges', 'attachments', 'expectations'].includes( f.key, ), ) @@ -210,7 +211,7 @@ const UpdateInjectDetails = ({ ]; if (isEmptyField(inject?.inject_content)) { contractContent?.fields - .filter((f) => !builtInFields.includes(f.key)) + .filter(f => !builtInFields.includes(f.key)) .forEach((field) => { if (!initialValues[field.key]) { if (field.cardinality && field.cardinality === '1') { @@ -223,7 +224,7 @@ const UpdateInjectDetails = ({ } // Specific processing for some fields contractContent?.fields - .filter((f) => !builtInFields.includes(f.key)) + .filter(f => !builtInFields.includes(f.key)) .forEach((field) => { if ( field.type === 'textarea' @@ -289,11 +290,13 @@ const UpdateInjectDetails = ({ avatar={contractContent ? : } title={contractContent?.contract_attack_patterns_external_ids.join(', ')} - action={
    - {inject?.inject_injector_contract?.injector_contract_platforms?.map( - (platform) => , - )} -
    } + action={( +
    + {inject?.inject_injector_contract?.injector_contract_platforms?.map( + platform => , + )} +
    + )} /> {contractContent !== null ? tPick(contractContent.label) : ''} @@ -331,7 +334,7 @@ const UpdateInjectDetails = ({ variablesFromExerciseOrScenario={[]} onUpdateInject={onUpdateInject} setInjectDetailsState={setInjectDetailsState} - uriVariable={''} + uriVariable="" allUsersNumber={0} usersNumber={0} teamsUsers={[]} diff --git a/openbas-front/src/admin/components/common/injects/UpdateInjectLogicalChains.tsx b/openbas-front/src/admin/components/common/injects/UpdateInjectLogicalChains.tsx index f2b992e05e..674364f819 100644 --- a/openbas-front/src/admin/components/common/injects/UpdateInjectLogicalChains.tsx +++ b/openbas-front/src/admin/components/common/injects/UpdateInjectLogicalChains.tsx @@ -1,19 +1,20 @@ -import * as React from 'react'; +import { HelpOutlined } from '@mui/icons-material'; +import { Avatar, Button, Card, CardContent, CardHeader } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import arrayMutators from 'final-form-arrays'; +import * as React from 'react'; import { Form } from 'react-final-form'; -import { makeStyles } from '@mui/styles'; -import { Avatar, Button, Card, CardContent, CardHeader } from '@mui/material'; -import { HelpOutlined } from '@mui/icons-material'; + +import type { InjectOutputType } from '../../../../actions/injects/Inject'; +import type { InjectHelper } from '../../../../actions/injects/inject-helper'; import { useFormatter } from '../../../../components/i18n'; import PlatformIcon from '../../../../components/PlatformIcon'; -import InjectChainsForm from './InjectChainsForm'; import type { Theme } from '../../../../components/Theme'; -import type { Inject, InjectDependency } from '../../../../utils/api-types'; -import type { InjectOutputType } from '../../../../actions/injects/Inject'; import { useHelper } from '../../../../store'; -import type { InjectHelper } from '../../../../actions/injects/inject-helper'; +import type { Inject, InjectDependency } from '../../../../utils/api-types'; +import InjectChainsForm from './InjectChainsForm'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ injectorContract: { margin: '10px 0 20px 0', width: '100%', @@ -30,10 +31,10 @@ const useStyles = makeStyles((theme) => ({ })); interface Props { - inject: Inject, + inject: Inject; handleClose: () => void; onUpdateInject?: (data: Inject[]) => Promise; - injects?: InjectOutputType[], + injects?: InjectOutputType[]; } const UpdateInjectLogicalChains: React.FC = ({ inject, handleClose, onUpdateInject, injects }) => { @@ -46,15 +47,17 @@ const UpdateInjectLogicalChains: React.FC = ({ inject, handleClose, onUpd const initialValues = { ...inject, - inject_depends_to: injects !== undefined ? injects - .filter((currentInject) => currentInject.inject_depends_on !== undefined + inject_depends_to: injects !== undefined + ? injects + .filter(currentInject => currentInject.inject_depends_on !== undefined && currentInject.inject_depends_on !== null && currentInject.inject_depends_on - .find((searchInject) => searchInject.dependency_relationship?.inject_parent_id === inject.inject_id) - !== undefined) - .flatMap((currentInject) => { - return currentInject.inject_depends_on; - }) : undefined, + .find(searchInject => searchInject.dependency_relationship?.inject_parent_id === inject.inject_id) + !== undefined) + .flatMap((currentInject) => { + return currentInject.inject_depends_on; + }) + : undefined, inject_depends_on: inject.inject_depends_on, }; @@ -70,27 +73,29 @@ const UpdateInjectLogicalChains: React.FC = ({ inject, handleClose, onUpd const childrenIds = data.inject_depends_to.map((childrenInject: InjectDependency) => childrenInject.dependency_relationship?.inject_children_id); - const injectsWithoutDependencies = injects ? injects - .filter((currentInject) => currentInject.inject_depends_on !== null - && currentInject.inject_depends_on?.find((searchInject) => searchInject.dependency_relationship?.inject_parent_id === data.inject_id) !== undefined - && !childrenIds.includes(currentInject.inject_id)) - .map((currentInject) => { - return { - ...injectsMap[currentInject.inject_id], - inject_id: currentInject.inject_id, - inject_injector_contract: currentInject.inject_injector_contract.injector_contract_id, - inject_depends_on: undefined, - } as unknown as Inject; - }) : []; + const injectsWithoutDependencies = injects + ? injects + .filter(currentInject => currentInject.inject_depends_on !== null + && currentInject.inject_depends_on?.find(searchInject => searchInject.dependency_relationship?.inject_parent_id === data.inject_id) !== undefined + && !childrenIds.includes(currentInject.inject_id)) + .map((currentInject) => { + return { + ...injectsMap[currentInject.inject_id], + inject_id: currentInject.inject_id, + inject_injector_contract: currentInject.inject_injector_contract.injector_contract_id, + inject_depends_on: undefined, + } as unknown as Inject; + }) + : []; injectsToUpdate.push(...injectsWithoutDependencies); childrenIds.forEach((childrenId) => { if (injects === undefined || childrenId === undefined) return; - const children = injects.find((currentInject) => currentInject.inject_id === childrenId); + const children = injects.find(currentInject => currentInject.inject_id === childrenId); if (children !== undefined) { const injectDependsOnUpdate = data.inject_depends_to - .find((dependsTo) => dependsTo.dependency_relationship?.inject_children_id === childrenId); + .find(dependsTo => dependsTo.dependency_relationship?.inject_children_id === childrenId); const injectChildrenUpdate: Inject = { ...injectsMap[children.inject_id], @@ -115,12 +120,14 @@ const UpdateInjectLogicalChains: React.FC = ({ inject, handleClose, onUpd classes={{ root: classes.injectorContractHeader }} avatar={injectorContractContent?.config?.type ? : } - title={inject?.inject_attack_patterns?.map((value) => value.attack_pattern_external_id)?.join(', ')} - action={
    - {inject?.inject_injector_contract?.injector_contract_platforms?.map( - (platform) => , - )} -
    } + title={inject?.inject_attack_patterns?.map(value => value.attack_pattern_external_id)?.join(', ')} + action={( +
    + {inject?.inject_injector_contract?.injector_contract_platforms?.map( + platform => , + )} +
    + )} /> {tPick(inject?.inject_injector_contract?.injector_contract_labels)} @@ -157,7 +164,7 @@ const UpdateInjectLogicalChains: React.FC = ({ inject, handleClose, onUpd variant="contained" color="secondary" type="submit" - disabled={errors !== undefined && Object.keys(errors).length > 0 } + disabled={errors !== undefined && Object.keys(errors).length > 0} > {t('Update')} diff --git a/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormCreate.tsx b/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormCreate.tsx index 28dece2620..25a3d2d018 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormCreate.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/ExpectationFormCreate.tsx @@ -1,19 +1,20 @@ +import { Alert, Button, InputLabel, MenuItem, Select as MUISelect, TextField as MuiTextField, TextField, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { FunctionComponent, SyntheticEvent, useEffect } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; -import { Alert, Button, InputLabel, MenuItem, Select as MUISelect, TextField, TextField as MuiTextField, Typography } from '@mui/material'; -import { makeStyles } from '@mui/styles'; -import { ExpectationInput, ExpectationInputForm } from './Expectation'; -import { formProps, infoMessage } from './ExpectationFormUtils'; + +import type { LoggedHelper } from '../../../../../actions/helper'; import { useFormatter } from '../../../../../components/i18n'; -import type { Theme } from '../../../../../components/Theme'; -import ExpectationGroupField from './field/ExpectationGroupField'; -import { isTechnicalExpectation } from './ExpectationUtils'; import ScaleBar from '../../../../../components/scalebar/ScaleBar'; +import type { Theme } from '../../../../../components/Theme'; +import { useHelper } from '../../../../../store'; +import type { PlatformSettings } from '../../../../../utils/api-types'; import { splitDuration } from '../../../../../utils/Time'; +import { ExpectationInput, ExpectationInputForm } from './Expectation'; +import { formProps, infoMessage } from './ExpectationFormUtils'; +import { isTechnicalExpectation } from './ExpectationUtils'; +import ExpectationGroupField from './field/ExpectationGroupField'; import useExpectationExpirationTime from './useExpectationExpirationTime'; -import type { PlatformSettings } from '../../../../../utils/api-types'; -import { useHelper } from '../../../../../store'; -import type { LoggedHelper } from '../../../../../actions/helper'; const useStyles = makeStyles((theme: Theme) => ({ marginTop_2: { @@ -63,7 +64,7 @@ const ExpectationFormCreate: FunctionComponent = ({ const manualExpectationExpirationTime = useExpectationExpirationTime('MANUAL'); const computeValuesFromType = (type: string): ExpectationInputForm => { - const predefinedExpectation = predefinedExpectations.filter((pe) => pe.expectation_type === type)[0]; + const predefinedExpectation = predefinedExpectations.filter(pe => pe.expectation_type === type)[0]; if (predefinedExpectation) { const expirationTime = splitDuration(predefinedExpectation.expectation_expiration_time || 0); return { @@ -90,7 +91,7 @@ const ExpectationFormCreate: FunctionComponent = ({ }; }; - const predefinedTypes = predefinedExpectations.map((e) => e.expectation_type); + const predefinedTypes = predefinedExpectations.map(e => e.expectation_type); const initialValues: ExpectationInputForm = computeValuesFromType(predefinedTypes[0]); const { @@ -126,18 +127,19 @@ const ExpectationFormCreate: FunctionComponent = ({ error={!!errors.expectation_type} inputProps={register('expectation_type')} > - {predefinedTypes.map((type) => ({t(type)}))} - {t('MANUAL')} + {predefinedTypes.map(type => ({t(type)}))} + {t('MANUAL')}
    {(watchType === 'ARTICLE' || watchType === 'CHALLENGE') - && + > {infoMessage(getValues().expectation_type, t)} - } + )} ({ marginTop_2: { @@ -91,13 +92,14 @@ const ExpectationFormUpdate: FunctionComponent = ({
    {(getValues().expectation_type === 'ARTICLE' || getValues().expectation_type === 'CHALLENGE') - && + > {infoMessage(getValues().expectation_type, t)} - } + )} = ({ return (
    handlePopoverOpen(event)} + onClick={event => handlePopoverOpen(event)} aria-haspopup="true" size="large" disabled={permissions.readOnly} diff --git a/openbas-front/src/admin/components/common/injects/expectations/ExpectationUtils.tsx b/openbas-front/src/admin/components/common/injects/expectations/ExpectationUtils.tsx index 188ca8ef0b..c47330feea 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/ExpectationUtils.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/ExpectationUtils.tsx @@ -1,5 +1,6 @@ import { AssignmentTurnedIn, PublishedWithChangesOutlined, TrackChangesOutlined } from '@mui/icons-material'; import { NewspaperVariantMultipleOutline } from 'mdi-material-ui'; + import { ExpectationType } from './Expectation'; export const isAutomatic = (type: string) => { diff --git a/openbas-front/src/admin/components/common/injects/expectations/InjectAddExpectation.tsx b/openbas-front/src/admin/components/common/injects/expectations/InjectAddExpectation.tsx index 4069b0b260..e6adaed4ba 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/InjectAddExpectation.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/InjectAddExpectation.tsx @@ -1,13 +1,14 @@ -import { FunctionComponent, useContext, useState } from 'react'; -import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; +import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import type { Theme } from '../../../../../components/Theme'; -import { useFormatter } from '../../../../../components/i18n'; +import { FunctionComponent, useContext, useState } from 'react'; + import Dialog from '../../../../../components/common/Dialog'; -import ExpectationFormCreate from './ExpectationFormCreate'; -import type { ExpectationInput, ExpectationInputForm } from './Expectation'; +import { useFormatter } from '../../../../../components/i18n'; +import type { Theme } from '../../../../../components/Theme'; import { PermissionsContext } from '../../Context'; +import type { ExpectationInput, ExpectationInputForm } from './Expectation'; +import ExpectationFormCreate from './ExpectationFormCreate'; const useStyles = makeStyles((theme: Theme) => ({ item: { diff --git a/openbas-front/src/admin/components/common/injects/expectations/InjectExpectations.tsx b/openbas-front/src/admin/components/common/injects/expectations/InjectExpectations.tsx index 2ff761dea5..9fba82b471 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/InjectExpectations.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/InjectExpectations.tsx @@ -1,14 +1,15 @@ -import { FunctionComponent, useState } from 'react'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; -import type { Theme } from '../../../../../components/Theme'; -import InjectAddExpectation from './InjectAddExpectation'; +import { FunctionComponent, useState } from 'react'; + import { useFormatter } from '../../../../../components/i18n'; +import type { Theme } from '../../../../../components/Theme'; import { truncate } from '../../../../../utils/String'; -import ExpectationPopover from './ExpectationPopover'; import type { ExpectationInput } from './Expectation'; +import ExpectationPopover from './ExpectationPopover'; import { isAutomatic, typeIcon } from './ExpectationUtils'; +import InjectAddExpectation from './InjectAddExpectation'; const useStyles = makeStyles((theme: Theme) => ({ item: { @@ -43,7 +44,7 @@ const InjectExpectations: FunctionComponent = ({ // Filter predefinedExpectations already included into expectations const predefinedExpectations = predefinedExpectationDatas - .filter((pe) => !expectations.map((e) => e.expectation_type).includes(pe.expectation_type)); + .filter(pe => !expectations.map(e => e.expectation_type).includes(pe.expectation_type)); // -- SORT HEADERS -- @@ -99,7 +100,7 @@ const InjectExpectations: FunctionComponent = ({ {typeIcon(expectation.expectation_type)}
    {truncate(expectation.expectation_name || '', 40)} @@ -114,7 +115,7 @@ const InjectExpectations: FunctionComponent = ({ {typeLabel(expectation.expectation_type)}
    - } + )} /> ({ @@ -58,11 +59,17 @@ const ExpectationGroupField: FunctionComponent = ({ onChange((event.target as HTMLInputElement).value === 'true'); }} > - } label={isTechnicalExpectation ? t('All assets (per group) must validate the expectation') - : t('All players (per team) must validate the expectation')} + } + label={isTechnicalExpectation ? t('All assets (per group) must validate the expectation') + : t('All players (per team) must validate the expectation')} /> - } label={isTechnicalExpectation ? t('At least one asset (per group) must validate the expectation') - : t('At least one player (per team) must validate the expectation')} + } + label={isTechnicalExpectation ? t('At least one asset (per group) must validate the expectation') + : t('At least one player (per team) must validate the expectation')} /> diff --git a/openbas-front/src/admin/components/common/injects/expectations/useExpectationExpirationTime.tsx b/openbas-front/src/admin/components/common/injects/expectations/useExpectationExpirationTime.tsx index 4158fe0324..e2b4ea3780 100644 --- a/openbas-front/src/admin/components/common/injects/expectations/useExpectationExpirationTime.tsx +++ b/openbas-front/src/admin/components/common/injects/expectations/useExpectationExpirationTime.tsx @@ -1,6 +1,6 @@ -import type { InjectExpectation, PlatformSettings } from '../../../../../utils/api-types'; -import { useHelper } from '../../../../../store'; import type { LoggedHelper } from '../../../../../actions/helper'; +import { useHelper } from '../../../../../store'; +import type { InjectExpectation, PlatformSettings } from '../../../../../utils/api-types'; const useExpectationExpirationTime = (expectationType: InjectExpectation['inject_expectation_type']): number => { const { settings }: { settings: PlatformSettings } = useHelper((helper: LoggedHelper) => ({ diff --git a/openbas-front/src/admin/components/common/injects/teams/InjectTeamsList.tsx b/openbas-front/src/admin/components/common/injects/teams/InjectTeamsList.tsx index 627ec24752..0ed0f4ee2f 100644 --- a/openbas-front/src/admin/components/common/injects/teams/InjectTeamsList.tsx +++ b/openbas-front/src/admin/components/common/injects/teams/InjectTeamsList.tsx @@ -1,14 +1,15 @@ -import { ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { GroupsOutlined } from '@mui/icons-material'; -import { FunctionComponent, useContext, useEffect, useState } from 'react'; +import { ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; +import { FunctionComponent, useContext, useEffect, useState } from 'react'; + +import { findTeams } from '../../../../../actions/teams/team-actions'; import ItemTags from '../../../../../components/ItemTags'; -import TeamPopover from '../../../components/teams/TeamPopover'; import type { Theme } from '../../../../../components/Theme'; -import { PermissionsContext, TeamContext } from '../../Context'; -import { findTeams } from '../../../../../actions/teams/team-actions'; import type { TeamOutput } from '../../../../../utils/api-types'; +import TeamPopover from '../../../components/teams/TeamPopover'; +import { PermissionsContext, TeamContext } from '../../Context'; const useStyles = makeStyles((theme: Theme) => ({ item: { @@ -43,12 +44,12 @@ const InjectTeamsList: FunctionComponent = ({ [R.ascend(R.prop('team_name'))], ); useEffect(() => { - findTeams(teamIds).then((result) => setTeams(sortTeams(result.data))); + findTeams(teamIds).then(result => setTeams(sortTeams(result.data))); }, [teamIds]); return ( <> - {teams.map((team) => ( + {teams.map(team => ( = ({
    {team.team_name} @@ -73,7 +74,7 @@ const InjectTeamsList: FunctionComponent = ({
    - } + )} /> ({ button: { @@ -96,9 +97,9 @@ const AttackPatternBox: FunctionComponent = ({ } return 'SUCCESS'; }; - const aggregatedPrevention = (results ?? []).map((result) => result.results?.filter((r) => r.type === 'PREVENTION').map((r) => r.avgResult)).flat(); - const aggregatedDetection = (results ?? []).map((result) => result.results?.filter((r) => r.type === 'DETECTION').map((r) => r.avgResult)).flat(); - const aggregatedHumanResponse = (results ?? []).map((result) => result.results?.filter((r) => r.type === 'HUMAN_RESPONSE').map((r) => r.avgResult)).flat(); + const aggregatedPrevention = (results ?? []).map(result => result.results?.filter(r => r.type === 'PREVENTION').map(r => r.avgResult)).flat(); + const aggregatedDetection = (results ?? []).map(result => result.results?.filter(r => r.type === 'DETECTION').map(r => r.avgResult)).flat(); + const aggregatedHumanResponse = (results ?? []).map(result => result.results?.filter(r => r.type === 'HUMAN_RESPONSE').map(r => r.avgResult)).flat(); const aggregatedResults: ExpectationResultsByType[] = [ { type: 'PREVENTION', @@ -122,7 +123,7 @@ const AttackPatternBox: FunctionComponent = ({ aria-haspopup="true" aria-expanded={open ? 'true' : undefined} className={classes.button} - onClick={(event) => handleOpen(event)} + onClick={event => handleOpen(event)} >
    diff --git a/openbas-front/src/admin/components/common/matrix/KillChainPhaseColumn.tsx b/openbas-front/src/admin/components/common/matrix/KillChainPhaseColumn.tsx index 8e06facf12..3c7a4c0206 100644 --- a/openbas-front/src/admin/components/common/matrix/KillChainPhaseColumn.tsx +++ b/openbas-front/src/admin/components/common/matrix/KillChainPhaseColumn.tsx @@ -1,10 +1,11 @@ -import { FunctionComponent } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; +import { FunctionComponent } from 'react'; + +import type { AttackPatternStore } from '../../../../actions/attack_patterns/AttackPattern'; import type { InjectExpectationResultsByAttackPatternStore } from '../../../../actions/exercises/Exercise'; +import type { Theme } from '../../../../components/Theme'; import type { AttackPattern, KillChainPhase } from '../../../../utils/api-types'; import AttackPatternBox from './AttackPatternBox'; -import type { AttackPatternStore } from '../../../../actions/attack_patterns/AttackPattern'; -import type { Theme } from '../../../../components/Theme'; const useStyles = makeStyles(() => ({ column: { @@ -43,14 +44,14 @@ const KillChainPhaseColumn: FunctionComponent = ({ }; // Inject Results const getInjectResult = (attack: AttackPatternStore) => { - return injectResults.find((injectResult) => injectResult.inject_attack_pattern === attack.attack_pattern_id); + return injectResults.find(injectResult => injectResult.inject_attack_pattern === attack.attack_pattern_id); }; return (
    {killChainPhase.phase_name}
    {[...attackPatterns].sort(sortAttackPattern) - .map((attackPattern) => ( + .map(attackPattern => ( ({ @@ -40,8 +41,8 @@ const MitreMatrix: FunctionComponent = ({ const dispatch = useAppDispatch(); // Fetching data const { attackPatternMap, killChainPhaseMap }: { - attackPatternMap: Record, - killChainPhaseMap: Record + attackPatternMap: Record; + killChainPhaseMap: Record; } = useHelper((helper: AttackPatternHelper & KillChainPhaseHelper) => ({ attackPatternMap: helper.getAttackPatternsMap(), killChainPhaseMap: helper.getKillChainPhasesMap(), @@ -55,8 +56,8 @@ const MitreMatrix: FunctionComponent = ({ // Attack Pattern const resultAttackPatternIds = R.uniq( injectResults - .filter((injectResult) => !!injectResult.inject_attack_pattern) - .flatMap((injectResult) => injectResult.inject_attack_pattern) as unknown as string[], + .filter(injectResult => !!injectResult.inject_attack_pattern) + .flatMap(injectResult => injectResult.inject_attack_pattern) as unknown as string[], ); const resultAttackPatterns: AttackPatternStore[] = resultAttackPatternIds.map((attackPatternId: string) => attackPatternMap[attackPatternId]) .filter((attackPattern: AttackPattern) => !!attackPattern); @@ -65,9 +66,9 @@ const MitreMatrix: FunctionComponent = ({ }; // Kill Chain Phase const resultKillChainPhases = R.uniq(resultAttackPatterns - .flatMap((attackPattern) => (attackPattern.attack_pattern_kill_chain_phases ?? [])) + .flatMap(attackPattern => (attackPattern.attack_pattern_kill_chain_phases ?? [])) .map((killChainPhaseId: string) => killChainPhaseMap[killChainPhaseId]) - .filter((killChainPhase) => !!killChainPhase)); + .filter(killChainPhase => !!killChainPhase)); const sortKillChainPhase = (k1: KillChainPhase, k2: KillChainPhase) => { return (k1.phase_order ?? 0) - (k2.phase_order ?? 0); }; diff --git a/openbas-front/src/admin/components/common/matrix/MitreMatrixDummy.tsx b/openbas-front/src/admin/components/common/matrix/MitreMatrixDummy.tsx index 02d577e3f9..1bb4992af1 100644 --- a/openbas-front/src/admin/components/common/matrix/MitreMatrixDummy.tsx +++ b/openbas-front/src/admin/components/common/matrix/MitreMatrixDummy.tsx @@ -1,17 +1,18 @@ -import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; -import { useHelper } from '../../../../store'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import { FunctionComponent } from 'react'; + +import type { AttackPatternStore } from '../../../../actions/attack_patterns/AttackPattern'; import type { AttackPatternHelper } from '../../../../actions/attack_patterns/attackpattern-helper'; +import { fetchAttackPatterns } from '../../../../actions/AttackPattern'; import type { KillChainPhaseHelper } from '../../../../actions/kill_chain_phases/killchainphase-helper'; import { fetchKillChainPhases } from '../../../../actions/KillChainPhase'; -import { fetchAttackPatterns } from '../../../../actions/AttackPattern'; -import { useAppDispatch } from '../../../../utils/hooks'; +import { useHelper } from '../../../../store'; import type { AttackPattern, KillChainPhase } from '../../../../utils/api-types'; -import type { AttackPatternStore } from '../../../../actions/attack_patterns/AttackPattern'; -import KillChainPhaseColumn from './KillChainPhaseColumn'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { random } from '../../../../utils/Number'; +import KillChainPhaseColumn from './KillChainPhaseColumn'; const useStyles = makeStyles(() => ({ container: { @@ -35,8 +36,8 @@ const MitreMatrixDummy: FunctionComponent = ({ ttpAlreadyLoaded }) => { const dispatch = useAppDispatch(); // Fetching data const { attackPatterns, killChainPhaseMap }: { - attackPatterns: AttackPattern[], - killChainPhaseMap: Record + attackPatterns: AttackPattern[]; + killChainPhaseMap: Record; } = useHelper((helper: AttackPatternHelper & KillChainPhaseHelper) => ({ attackPatterns: helper.getAttackPatterns(), killChainPhaseMap: helper.getKillChainPhasesMap(), diff --git a/openbas-front/src/admin/components/common/simulate/DefinitionMenu.tsx b/openbas-front/src/admin/components/common/simulate/DefinitionMenu.tsx index bc15f52f58..003448662f 100644 --- a/openbas-front/src/admin/components/common/simulate/DefinitionMenu.tsx +++ b/openbas-front/src/admin/components/common/simulate/DefinitionMenu.tsx @@ -1,8 +1,9 @@ -import * as React from 'react'; import { AttachMoneyOutlined, EmojiEventsOutlined, GroupsOutlined } from '@mui/icons-material'; import { NewspaperVariantMultipleOutline } from 'mdi-material-ui'; -import type { Exercise, Scenario } from '../../../../utils/api-types'; +import * as React from 'react'; + import RightMenu, { RightMenuEntry } from '../../../../components/common/RightMenu'; +import type { Exercise, Scenario } from '../../../../utils/api-types'; interface Numbers { teamsNumber?: number; diff --git a/openbas-front/src/admin/components/common/simulate/EmailParametersForm.tsx b/openbas-front/src/admin/components/common/simulate/EmailParametersForm.tsx index 67c29cc9a2..27029417ec 100644 --- a/openbas-front/src/admin/components/common/simulate/EmailParametersForm.tsx +++ b/openbas-front/src/admin/components/common/simulate/EmailParametersForm.tsx @@ -1,10 +1,11 @@ -import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; -import { Alert, AlertTitle, Autocomplete, Button, Chip, TextField, TextField as MuiTextField } from '@mui/material'; +import { Alert, AlertTitle, Autocomplete, Button, Chip, TextField as MuiTextField, TextField } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useState } from 'react'; import * as React from 'react'; +import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { z } from 'zod'; -import { makeStyles } from '@mui/styles'; + import { useFormatter } from '../../../../components/i18n'; import { zodImplement } from '../../../../utils/Zod'; @@ -127,14 +128,14 @@ const EmailParametersForm: React.FC = ({ }} /> ))} - renderInput={(params) => ( + renderInput={params => ( value != null)?.message ?? '' : ''} + helperText={errors.setting_mails_reply_to?.find ? errors.setting_mails_reply_to?.find(value => value != null)?.message ?? '' : ''} /> )} /> @@ -158,7 +159,8 @@ const EmailParametersForm: React.FC = ({ color="primary" type="submit" disabled={!isDirty || isSubmitting} - >{t('Update')} + > + {t('Update')}
    diff --git a/openbas-front/src/admin/components/common/simulate/HeaderTags.tsx b/openbas-front/src/admin/components/common/simulate/HeaderTags.tsx index 6af9cb9d75..24c5fedf74 100644 --- a/openbas-front/src/admin/components/common/simulate/HeaderTags.tsx +++ b/openbas-front/src/admin/components/common/simulate/HeaderTags.tsx @@ -1,13 +1,14 @@ -import { Button, Dialog, DialogContent, DialogTitle, IconButton } from '@mui/material'; import { AddOutlined } from '@mui/icons-material'; -import { Form } from 'react-final-form'; +import { Button, Dialog, DialogContent, DialogTitle, IconButton } from '@mui/material'; import * as R from 'ramda'; import { FunctionComponent, useState } from 'react'; +import { Form } from 'react-final-form'; + import Transition from '../../../../components/common/Transition'; -import TagField from '../../../../components/TagField'; -import TagChip from '../tags/TagChip'; import { useFormatter } from '../../../../components/i18n'; +import TagField from '../../../../components/TagField'; import { Option } from '../../../../utils/Option'; +import TagChip from '../tags/TagChip'; interface Props { tags: string[] | undefined; @@ -32,7 +33,7 @@ const HeaderTags: FunctionComponent = ({ const submitTags = (values: { tags: Option[] }) => { handleToggleAddTag(); updateTags(R.uniq([ - ...values.tags.map((tag) => tag.id), + ...values.tags.map(tag => tag.id), ...(tags ?? []), ])); }; diff --git a/openbas-front/src/admin/components/common/simulate/PaperMetric.tsx b/openbas-front/src/admin/components/common/simulate/PaperMetric.tsx index 8b7ac23a2a..bdf13861e6 100644 --- a/openbas-front/src/admin/components/common/simulate/PaperMetric.tsx +++ b/openbas-front/src/admin/components/common/simulate/PaperMetric.tsx @@ -1,10 +1,11 @@ import { Paper } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { FunctionComponent } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import type { Theme } from '../../../../components/Theme'; + import { useFormatter } from '../../../../components/i18n'; import ItemNumberDifference from '../../../../components/ItemNumberDifference'; +import type { Theme } from '../../../../components/Theme'; const useStyles = makeStyles((theme: Theme) => ({ title: { diff --git a/openbas-front/src/admin/components/common/tags/TagChip.tsx b/openbas-front/src/admin/components/common/tags/TagChip.tsx index b40c5b4b0c..137321ef3f 100644 --- a/openbas-front/src/admin/components/common/tags/TagChip.tsx +++ b/openbas-front/src/admin/components/common/tags/TagChip.tsx @@ -1,8 +1,9 @@ import { Chip } from '@mui/material'; -import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; -import { useHelper } from '../../../../store'; +import { FunctionComponent } from 'react'; + import type { TagHelper } from '../../../../actions/helper'; +import { useHelper } from '../../../../store'; const useStyles = makeStyles(() => ({ tag: { @@ -35,8 +36,8 @@ const TagChip: FunctionComponent = ({ classes={{ root: classes.tag }} label={tag.tag_name} onDelete={isReadOnly - ? (() => { - }) + ? () => { + } : () => deleteTag(tag.tag_id)} /> ); diff --git a/openbas-front/src/admin/components/components/Index.tsx b/openbas-front/src/admin/components/components/Index.tsx index 43a66ffe4a..7f440e492c 100644 --- a/openbas-front/src/admin/components/components/Index.tsx +++ b/openbas-front/src/admin/components/components/Index.tsx @@ -1,6 +1,7 @@ -import { Suspense, lazy } from 'react'; import { makeStyles } from '@mui/styles'; +import { lazy, Suspense } from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; + import { errorWrapper } from '../../../components/Error'; import Loader from '../../../components/Loader'; import NotFound from '../../../components/NotFound'; @@ -32,7 +33,7 @@ const Index = () => { {/* Not found */} - }/> + } />
    diff --git a/openbas-front/src/admin/components/components/challenges/ChallengeForm.js b/openbas-front/src/admin/components/components/challenges/ChallengeForm.js index 806746f783..ed9be68742 100644 --- a/openbas-front/src/admin/components/components/challenges/ChallengeForm.js +++ b/openbas-front/src/admin/components/components/challenges/ChallengeForm.js @@ -1,24 +1,25 @@ +import { ArrowDropDownOutlined, ArrowDropUpOutlined, AttachmentOutlined, ControlPointOutlined, DeleteOutlined } from '@mui/icons-material'; +import { Button, Grid, IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, MenuItem, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import arrayMutators from 'final-form-arrays'; import { useState } from 'react'; import { Form } from 'react-final-form'; -import arrayMutators from 'final-form-arrays'; import { FieldArray } from 'react-final-form-arrays'; -import { Button, Grid, IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, MenuItem, Typography } from '@mui/material'; -import { ArrowDropDownOutlined, ArrowDropUpOutlined, AttachmentOutlined, ControlPointOutlined, DeleteOutlined } from '@mui/icons-material'; -import { makeStyles } from '@mui/styles'; import { useDispatch } from 'react-redux'; + +import { fetchDocuments } from '../../../../actions/Document'; +import { fetchExercises } from '../../../../actions/Exercise'; +import MultipleFileLoader from '../../../../components/fields/MultipleFileLoader'; +import OldMarkDownField from '../../../../components/fields/OldMarkDownField'; +import OldSelectField from '../../../../components/fields/OldSelectField'; import OldTextField from '../../../../components/fields/OldTextField'; import { useFormatter } from '../../../../components/i18n'; -import OldSelectField from '../../../../components/fields/OldSelectField'; -import OldMarkDownField from '../../../../components/fields/OldMarkDownField'; -import DocumentType from '../documents/DocumentType'; import ItemTags from '../../../../components/ItemTags'; -import DocumentPopover from '../documents/DocumentPopover'; +import TagField from '../../../../components/TagField'; import { useHelper } from '../../../../store'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchExercises } from '../../../../actions/Exercise'; -import { fetchDocuments } from '../../../../actions/Document'; -import TagField from '../../../../components/TagField'; -import MultipleFileLoader from '../../../../components/fields/MultipleFileLoader'; +import DocumentPopover from '../documents/DocumentPopover'; +import DocumentType from '../documents/DocumentType'; const useStyles = makeStyles(() => ({ itemHead: { @@ -104,9 +105,9 @@ const ChallengeForm = (props) => { const [documentsOrderAsc, setDocumentsOrderAsc] = useState(true); const [documents, setDocuments] = useState(documentsIds || []); const handleAddDocuments = (updatedDocuments) => { - setDocuments(updatedDocuments.map((document) => document.document_id)); + setDocuments(updatedDocuments.map(document => document.document_id)); }; - const handleRemoveDocument = (docId) => setDocuments(documents.filter((n) => n !== docId)); + const handleRemoveDocument = docId => setDocuments(documents.filter(n => n !== docId)); // Functions const validate = (values) => { const errors = {}; @@ -118,9 +119,9 @@ const ChallengeForm = (props) => { }); return errors; }; - const required = (value) => (value ? undefined : t('This field is required.')); - const requiredArray = (value) => (value && value.length > 0 ? undefined : t('This field is required.')); - const { documentsMap } = useHelper((helper) => ({ + const required = value => (value ? undefined : t('This field is required.')); + const requiredArray = value => (value && value.length > 0 ? undefined : t('This field is required.')); + const { documentsMap } = useHelper(helper => ({ documentsMap: helper.getDocumentsMap(), })); useDataLoader(() => { @@ -132,11 +133,13 @@ const ChallengeForm = (props) => { setDocumentsOrderAsc(!documentsSortBy); }; const documentsSortHeader = (field, label, isSortable) => { - const sortComponent = documentsOrderAsc ? ( - - ) : ( - - ); + const sortComponent = documentsOrderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    { {documentsSortHeader('document_name', 'Name', true)} {documentsSortHeader('document_type', 'Type', true)} {documentsSortHeader('document_tags', 'Tags', true)}
    - } + )} />   @@ -263,7 +266,7 @@ const ChallengeForm = (props) => {
    { />
    - } + )} /> {
    ); })} - @@ -313,8 +317,7 @@ const ChallengeForm = (props) => { {t('Flags')} fields.push({ flag_type: 'VALUE', flag_value: '' }) - } + onClick={() => fields.push({ flag_type: 'VALUE', flag_value: '' })} size="small" color="primary" style={{ float: 'left', margin: '-8px 0 0 10px' }} diff --git a/openbas-front/src/admin/components/components/challenges/ChallengePopover.js b/openbas-front/src/admin/components/components/challenges/ChallengePopover.js index cd0fb4cc2d..db02878dcc 100644 --- a/openbas-front/src/admin/components/components/challenges/ChallengePopover.js +++ b/openbas-front/src/admin/components/components/challenges/ChallengePopover.js @@ -1,14 +1,15 @@ -import { forwardRef, useState } from 'react'; -import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; +import * as R from 'ramda'; +import { forwardRef, useState } from 'react'; import { useDispatch } from 'react-redux'; -import ChallengeForm from './ChallengeForm'; -import { useFormatter } from '../../../../components/i18n'; + import { deleteChallenge, updateChallenge } from '../../../../actions/Challenge'; +import Drawer from '../../../../components/common/Drawer'; +import { useFormatter } from '../../../../components/i18n'; import { useHelper } from '../../../../store'; import { tagOptions } from '../../../../utils/Option'; -import Drawer from '../../../../components/common/Drawer'; +import ChallengeForm from './ChallengeForm'; const Transition = forwardRef((props, ref) => ( @@ -25,7 +26,7 @@ const ChallengePopover = ({ challenge, documents, onRemoveChallenge, inline }) = const [openEdit, setOpenEdit] = useState(false); const [anchorEl, setAnchorEl] = useState(null); // popover management - const { tagsMap } = useHelper((helper) => ({ + const { tagsMap } = useHelper(helper => ({ tagsMap: helper.getTagsMap(), })); const handlePopoverOpen = (event) => { @@ -134,7 +135,7 @@ const ChallengePopover = ({ challenge, documents, onRemoveChallenge, inline }) = onSubmit={onSubmitEdit} handleClose={handleCloseEdit} initialValues={initialValues} - documentsIds={(documents || []).map((i) => i.document_id)} + documentsIds={(documents || []).map(i => i.document_id)} /> @@ -149,7 +150,7 @@ const ChallengePopover = ({ challenge, documents, onRemoveChallenge, inline }) = onSubmit={onSubmitEdit} handleClose={handleCloseEdit} initialValues={initialValues} - documentsIds={(documents || []).map((i) => i.document_id)} + documentsIds={(documents || []).map(i => i.document_id)} /> )} diff --git a/openbas-front/src/admin/components/components/challenges/Challenges.js b/openbas-front/src/admin/components/components/challenges/Challenges.js index 1be85223a4..deee57d219 100644 --- a/openbas-front/src/admin/components/components/challenges/Challenges.js +++ b/openbas-front/src/admin/components/components/challenges/Challenges.js @@ -1,23 +1,24 @@ -import { makeStyles } from '@mui/styles'; -import { List, ListItem, ListItemIcon, ListItemText, ListItemSecondaryAction, Tooltip, Chip } from '@mui/material'; -import { useDispatch } from 'react-redux'; import { RowingOutlined } from '@mui/icons-material'; +import { Chip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Tooltip } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; +import { useDispatch } from 'react-redux'; import { Link } from 'react-router-dom'; -import SearchFilter from '../../../../components/SearchFilter'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../../store'; -import useSearchAnFilter from '../../../../utils/SortingFiltering'; + import { fetchChallenges } from '../../../../actions/Challenge'; -import ChallengePopover from './ChallengePopover'; -import CreateChallenge from './CreateChallenge'; -import { fetchTags } from '../../../../actions/Tag'; -import TagsFilter from '../../common/filters/TagsFilter'; -import ItemTags from '../../../../components/ItemTags'; import { fetchDocuments } from '../../../../actions/Document'; import { fetchExercises } from '../../../../actions/Exercise'; +import { fetchTags } from '../../../../actions/Tag'; import Breadcrumbs from '../../../../components/Breadcrumbs'; import { useFormatter } from '../../../../components/i18n'; +import ItemTags from '../../../../components/ItemTags'; +import SearchFilter from '../../../../components/SearchFilter'; +import { useHelper } from '../../../../store'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import useSearchAnFilter from '../../../../utils/SortingFiltering'; +import TagsFilter from '../../common/filters/TagsFilter'; +import ChallengePopover from './ChallengePopover'; +import CreateChallenge from './CreateChallenge'; const useStyles = makeStyles(() => ({ parameters: { @@ -144,7 +145,7 @@ const Challenges = () => { const searchColumns = ['name', 'content', 'category']; const filtering = useSearchAnFilter('challenge', 'name', searchColumns); // Fetching data - const { challenges, documentsMap, exercisesMap } = useHelper((helper) => ({ + const { challenges, documentsMap, exercisesMap } = useHelper(helper => ({ exercisesMap: helper.getExercisesMap(), challenges: helper.getChallenges(), documentsMap: helper.getDocumentsMap(), @@ -189,7 +190,7 @@ const Challenges = () => { {filtering.buildHeader( 'challenge_name', @@ -222,14 +223,14 @@ const Challenges = () => { headerStyles, )} - } + )} />   {sortedChallenges.map((challenge) => { const docs = challenge.challenge_documents - .map((d) => (documentsMap[d] ? documentsMap[d] : undefined)) - .filter((d) => d !== undefined); + .map(d => (documentsMap[d] ? documentsMap[d] : undefined)) + .filter(d => d !== undefined); return ( {
    { />
    - } + )} /> diff --git a/openbas-front/src/admin/components/components/challenges/CreateChallenge.js b/openbas-front/src/admin/components/components/challenges/CreateChallenge.js index e57ebe52aa..f896a21173 100644 --- a/openbas-front/src/admin/components/components/challenges/CreateChallenge.js +++ b/openbas-front/src/admin/components/components/challenges/CreateChallenge.js @@ -1,16 +1,17 @@ -import { useState } from 'react'; -import { useDispatch } from 'react-redux'; -import { Dialog, DialogContent, DialogTitle, Fab, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { Add, ControlPointOutlined } from '@mui/icons-material'; +import { Dialog, DialogContent, DialogTitle, Fab, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; -import { useFormatter } from '../../../../components/i18n'; +import { useState } from 'react'; +import { useDispatch } from 'react-redux'; + import { addChallenge } from '../../../../actions/Challenge'; -import ChallengeForm from './ChallengeForm'; import Drawer from '../../../../components/common/Drawer'; import Transition from '../../../../components/common/Transition'; +import { useFormatter } from '../../../../components/i18n'; +import ChallengeForm from './ChallengeForm'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ createButton: { position: 'fixed', bottom: 30, diff --git a/openbas-front/src/admin/components/components/channels/Channel.js b/openbas-front/src/admin/components/components/channels/Channel.js index dbfc750cd1..d440fcc9f7 100644 --- a/openbas-front/src/admin/components/components/channels/Channel.js +++ b/openbas-front/src/admin/components/components/channels/Channel.js @@ -1,18 +1,19 @@ +import { Grid, Paper, Skeleton, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { useParams } from 'react-router-dom'; -import { Grid, Typography, Paper, Skeleton } from '@mui/material'; import * as R from 'ramda'; import { useDispatch } from 'react-redux'; -import { useHelper } from '../../../../store'; -import { useFormatter } from '../../../../components/i18n'; +import { useParams } from 'react-router-dom'; + import { updateChannel, updateChannelLogos } from '../../../../actions/channels/channel-action'; -import ChannelParametersForm from './ChannelParametersForm'; -import ChannelOverviewNewspaper from './ChannelOverviewNewspaper'; -import ChannelOverviewMicroblogging from './ChannelOverviewMicroblogging'; -import ChannelOverviewTvChannel from './ChannelOverviewTvChannel'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { fetchDocuments } from '../../../../actions/Document'; +import { useFormatter } from '../../../../components/i18n'; +import { useHelper } from '../../../../store'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; import ChannelAddLogo from './ChannelAddLogo'; +import ChannelOverviewMicroblogging from './ChannelOverviewMicroblogging'; +import ChannelOverviewNewspaper from './ChannelOverviewNewspaper'; +import ChannelOverviewTvChannel from './ChannelOverviewTvChannel'; +import ChannelParametersForm from './ChannelParametersForm'; const useStyles = makeStyles(() => ({ root: { @@ -42,7 +43,7 @@ const Channel = () => { useDataLoader(() => { dispatch(fetchDocuments()); }); - const submitUpdate = (data) => dispatch(updateChannel(channelId, data)); + const submitUpdate = data => dispatch(updateChannel(channelId, data)); const submitLogo = (documentId, theme) => { const data = { channel_logo_dark: theme === 'dark' ? documentId : channel.channel_logo_dark, @@ -107,8 +108,7 @@ const Channel = () => { )} {userAdmin && ( submitLogo(documentId, 'dark') - } + handleAddLogo={documentId => submitLogo(documentId, 'dark')} /> )} @@ -130,8 +130,7 @@ const Channel = () => { )} {userAdmin && ( submitLogo(documentId, 'light') - } + handleAddLogo={documentId => submitLogo(documentId, 'light')} /> )} diff --git a/openbas-front/src/admin/components/components/channels/ChannelAddLogo.tsx b/openbas-front/src/admin/components/components/channels/ChannelAddLogo.tsx index fc41eed4a2..e3190a1aa4 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelAddLogo.tsx +++ b/openbas-front/src/admin/components/components/channels/ChannelAddLogo.tsx @@ -1,12 +1,13 @@ +import { Button } from '@mui/material'; import { useEffect, useState } from 'react'; import * as React from 'react'; -import { Button } from '@mui/material'; + import { fetchDocuments } from '../../../../actions/Document'; import FileTransferDialog from '../../../../components/fields/FileTransferDialog'; +import { useFormatter } from '../../../../components/i18n'; import type { RawDocument } from '../../../../utils/api-types'; import { useAppDispatch } from '../../../../utils/hooks'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { useFormatter } from '../../../../components/i18n'; interface Props { handleAddLogo: (documentId: string) => void; @@ -51,7 +52,8 @@ const ChannelAddLogo: React.FC = ({ handleAddLogo }) => { onAddDocument={setSelectedDocument} extensions={['png', 'jpg', 'jpeg', 'svg', 'gif']} > - )} + + )} ); }; diff --git a/openbas-front/src/admin/components/components/channels/ChannelForm.js b/openbas-front/src/admin/components/components/channels/ChannelForm.js index 3f65278a4d..e05b696e2c 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelForm.js +++ b/openbas-front/src/admin/components/components/channels/ChannelForm.js @@ -1,10 +1,11 @@ -import { Component } from 'react'; +import { Button, MenuItem } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button, MenuItem } from '@mui/material'; + +import OldSelectField from '../../../../components/fields/OldSelectField'; import OldTextField from '../../../../components/fields/OldTextField'; import inject18n from '../../../../components/i18n'; -import OldSelectField from '../../../../components/fields/OldSelectField'; class ChannelForm extends Component { validate(values) { diff --git a/openbas-front/src/admin/components/components/channels/ChannelHeader.js b/openbas-front/src/admin/components/components/channels/ChannelHeader.js index 70e7d0088c..4edd9cda80 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelHeader.js +++ b/openbas-front/src/admin/components/components/channels/ChannelHeader.js @@ -1,8 +1,9 @@ -import { makeStyles } from '@mui/styles'; import { Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; -import ChannelPopover from './ChannelPopover'; + import { useHelper } from '../../../../store'; +import ChannelPopover from './ChannelPopover'; const useStyles = makeStyles(() => ({ container: { @@ -17,7 +18,7 @@ const useStyles = makeStyles(() => ({ const ChannelHeader = () => { const classes = useStyles(); const { channelId } = useParams(); - const { channel, userAdmin } = useHelper((helper) => ({ + const { channel, userAdmin } = useHelper(helper => ({ channel: helper.getChannel(channelId), userAdmin: helper.getMe()?.user_admin ?? false, })); diff --git a/openbas-front/src/admin/components/components/channels/ChannelIcon.js b/openbas-front/src/admin/components/components/channels/ChannelIcon.js index 7d0bcb1434..4cb86502ec 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelIcon.js +++ b/openbas-front/src/admin/components/components/channels/ChannelIcon.js @@ -1,7 +1,8 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { NewspaperOutlined, HelpOutlined, OndemandVideoOutlined } from '@mui/icons-material'; +import { HelpOutlined, NewspaperOutlined, OndemandVideoOutlined } from '@mui/icons-material'; import { PostOutline } from 'mdi-material-ui'; +import * as PropTypes from 'prop-types'; +import { Component } from 'react'; + import CustomTooltip from '../../../../components/CustomTooltip'; const iconSelector = (type, variant, fontSize) => { diff --git a/openbas-front/src/admin/components/components/channels/ChannelOverviewMicroblogging.js b/openbas-front/src/admin/components/components/channels/ChannelOverviewMicroblogging.js index 61845731ee..76c4859253 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelOverviewMicroblogging.js +++ b/openbas-front/src/admin/components/components/channels/ChannelOverviewMicroblogging.js @@ -1,6 +1,6 @@ -import { Fragment } from 'react'; +import { Card, CardHeader, Grid, Skeleton, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; -import { Typography, Grid, Card, CardHeader, Skeleton } from '@mui/material'; +import { Fragment } from 'react'; const useStyles = makeStyles(() => ({ root: { @@ -54,23 +54,23 @@ const ChannelOverviewMicroblogging = ({ channel }) => { - } - title={ + )} + title={( - } - subheader={ + )} + subheader={( { /> - } + )} /> - } - title={ + )} + title={( - } - subheader={ + )} + subheader={( { /> - } + )} /> - } - title={ + )} + title={( - } - subheader={ + )} + subheader={( { /> - } + )} /> @@ -167,23 +167,23 @@ const ChannelOverviewMicroblogging = ({ channel }) => { - } - title={ + )} + title={( - } - subheader={ + )} + subheader={( { /> - } + )} /> - } - title={ + )} + title={( - } - subheader={ + )} + subheader={( { /> - } + )} /> diff --git a/openbas-front/src/admin/components/components/channels/ChannelOverviewNewspaper.js b/openbas-front/src/admin/components/components/channels/ChannelOverviewNewspaper.js index 6d825e1fa6..7c4c7bc912 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelOverviewNewspaper.js +++ b/openbas-front/src/admin/components/components/channels/ChannelOverviewNewspaper.js @@ -1,6 +1,6 @@ -import { Fragment } from 'react'; +import { Card, CardContent, CardHeader, Grid, Skeleton, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; -import { Typography, Grid, Card, CardHeader, CardContent, Skeleton } from '@mui/material'; +import { Fragment } from 'react'; const useStyles = makeStyles(() => ({ root: { @@ -56,22 +56,22 @@ const ChannelOverviewNewspaper = ({ channel }) => { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> ({ root: { @@ -55,22 +55,22 @@ const ChannelOverviewTvChannel = ({ channel }) => { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> { - } - title={ + )} + title={( - } + )} subheader={} /> ({ button: { diff --git a/openbas-front/src/admin/components/components/channels/Channels.tsx b/openbas-front/src/admin/components/components/channels/Channels.tsx index ac699a2e8a..ed5eee8847 100644 --- a/openbas-front/src/admin/components/components/channels/Channels.tsx +++ b/openbas-front/src/admin/components/components/channels/Channels.tsx @@ -1,21 +1,22 @@ -import { CSSProperties } from 'react'; -import { makeStyles } from '@mui/styles'; -import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { ChevronRightOutlined } from '@mui/icons-material'; +import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { CSSProperties } from 'react'; import { Link } from 'react-router-dom'; -import SearchFilter from '../../../../components/SearchFilter'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../../store'; -import useSearchAnFilter from '../../../../utils/SortingFiltering'; + import { fetchChannels } from '../../../../actions/channels/channel-action'; -import CreateChannel from './CreateChannel'; -import { useFormatter } from '../../../../components/i18n'; -import ChannelIcon from './ChannelIcon'; import type { ChannelsHelper } from '../../../../actions/channels/channel-helper'; import type { UserHelper } from '../../../../actions/helper'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { Channel } from '../../../../utils/api-types'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { useFormatter } from '../../../../components/i18n'; +import SearchFilter from '../../../../components/SearchFilter'; +import { useHelper } from '../../../../store'; +import type { Channel } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import useSearchAnFilter from '../../../../utils/SortingFiltering'; +import ChannelIcon from './ChannelIcon'; +import CreateChannel from './CreateChannel'; const useStyles = makeStyles(() => ({ parameters: { @@ -106,7 +107,7 @@ const Channels = () => { const searchColumns = ['type', 'name', 'description']; const filtering = useSearchAnFilter('channel', 'name', searchColumns); // Fetching data - const { channels, userAdmin }: { channels: Channel[], userAdmin: boolean } = useHelper((helper: ChannelsHelper & UserHelper) => ({ + const { channels, userAdmin }: { channels: Channel[]; userAdmin: boolean } = useHelper((helper: ChannelsHelper & UserHelper) => ({ channels: helper.getChannels(), userAdmin: helper.getMe()?.user_admin ?? false, })); @@ -141,7 +142,7 @@ const Channels = () => { {filtering.buildHeader( 'channel_type', @@ -162,11 +163,11 @@ const Channels = () => { headerStyles, )} - } + )} />  
    - {sortedChannels.map((channel) => ( + {sortedChannels.map(channel => ( { />
    { {channel.channel_description}
    - } + )} /> diff --git a/openbas-front/src/admin/components/components/channels/ChannelsFilter.tsx b/openbas-front/src/admin/components/components/channels/ChannelsFilter.tsx index ab15885539..c4bda54754 100644 --- a/openbas-front/src/admin/components/components/channels/ChannelsFilter.tsx +++ b/openbas-front/src/admin/components/components/channels/ChannelsFilter.tsx @@ -1,15 +1,16 @@ +import { Autocomplete, Box, TextField } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useEffect } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import { Autocomplete, Box, TextField } from '@mui/material'; + import { fetchChannels } from '../../../../actions/channels/channel-action'; +import type { ChannelsHelper } from '../../../../actions/channels/channel-helper'; import { useFormatter } from '../../../../components/i18n'; import { useHelper } from '../../../../store'; -import ChannelIcon from './ChannelIcon'; +import type { Channel } from '../../../../utils/api-types'; import { useAppDispatch } from '../../../../utils/hooks'; -import type { ChannelsHelper } from '../../../../actions/channels/channel-helper'; +import ChannelIcon from './ChannelIcon'; import type { ChannelOption } from './ChannelOption'; -import type { Channel } from '../../../../utils/api-types'; const useStyles = makeStyles(() => ({ icon: { @@ -24,16 +25,16 @@ const useStyles = makeStyles(() => ({ })); interface Props { - onChannelsChange: (value: ChannelOption[]) => void - onClearChannels?: () => void - fullWidth?: boolean + onChannelsChange: (value: ChannelOption[]) => void; + onClearChannels?: () => void; + fullWidth?: boolean; } interface ChannelTransformed { - id: string - label: string - color: string - type: string + id: string; + label: string; + color: string; + type: string; } const ChannelsFilter: React.FC = (props) => { @@ -92,7 +93,7 @@ const ChannelsFilter: React.FC = (props) => {
    {option.label}
    )} - renderInput={(params) => ( + renderInput={params => ( ({ createButton: { @@ -35,7 +36,7 @@ class CreateChannel extends Component { onSubmit(data) { return this.props .addChannel(data) - .then((result) => (result.result ? this.handleClose() : result)); + .then(result => (result.result ? this.handleClose() : result)); } render() { diff --git a/openbas-front/src/admin/components/components/channels/Index.tsx b/openbas-front/src/admin/components/components/channels/Index.tsx index b3549a0db5..93b59c3794 100644 --- a/openbas-front/src/admin/components/components/channels/Index.tsx +++ b/openbas-front/src/admin/components/components/channels/Index.tsx @@ -1,16 +1,17 @@ +import { makeStyles } from '@mui/styles'; import { lazy } from 'react'; import { Route, Routes, useParams } from 'react-router-dom'; -import { makeStyles } from '@mui/styles'; + import { fetchChannel } from '../../../../actions/channels/channel-action'; -import Loader from '../../../../components/Loader'; -import ChannelHeader from './ChannelHeader'; +import type { ChannelsHelper } from '../../../../actions/channels/channel-helper'; import { errorWrapper } from '../../../../components/Error'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import Loader from '../../../../components/Loader'; +import NotFound from '../../../../components/NotFound'; import { useHelper } from '../../../../store'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { ChannelsHelper } from '../../../../actions/channels/channel-helper'; import type { Channel as ChannelType } from '../../../../utils/api-types'; -import NotFound from '../../../../components/NotFound'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import ChannelHeader from './ChannelHeader'; const useStyles = makeStyles(() => ({ root: { @@ -38,7 +39,7 @@ const Index = () => { {/* Not found */} - }/> + } /> ); diff --git a/openbas-front/src/admin/components/components/documents/CreateDocument.js b/openbas-front/src/admin/components/components/documents/CreateDocument.js index d8439a71fb..f7ae5c1977 100644 --- a/openbas-front/src/admin/components/components/documents/CreateDocument.js +++ b/openbas-front/src/admin/components/components/documents/CreateDocument.js @@ -1,18 +1,19 @@ -import { useContext, useState } from 'react'; +import { Add, ControlPointOutlined } from '@mui/icons-material'; +import { Fab, ListItem, ListItemIcon, ListItemText } from '@mui/material'; +import { withStyles } from '@mui/styles'; import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import * as R from 'ramda'; -import { withStyles } from '@mui/styles'; -import { Fab, ListItem, ListItemIcon, ListItemText } from '@mui/material'; -import { Add, ControlPointOutlined } from '@mui/icons-material'; -import DocumentForm from './DocumentForm'; +import { useContext, useState } from 'react'; +import { connect } from 'react-redux'; + import { addDocument, fetchDocument } from '../../../../actions/Document'; +import Dialog from '../../../../components/common/Dialog'; +import Drawer from '../../../../components/common/Drawer'; import inject18n from '../../../../components/i18n'; import { DocumentContext } from '../../common/Context'; -import Drawer from '../../../../components/common/Drawer'; -import Dialog from '../../../../components/common/Dialog'; +import DocumentForm from './DocumentForm'; -const styles = (theme) => ({ +const styles = theme => ({ createButton: { position: 'fixed', bottom: 30, @@ -35,11 +36,11 @@ const CreateDocument = (props) => { ? context.onInitDocument() // TODO: should be platform : { - document_tags: [], - document_exercises: [], - document_scenarios: [], - }; - const computeInputValues = (data) => R.pipe( + document_tags: [], + document_exercises: [], + document_scenarios: [], + }; + const computeInputValues = data => R.pipe( R.assoc('document_tags', R.pluck('id', data.document_tags)), R.assoc('document_exercises', R.pluck('id', data.document_exercises)), R.assoc('document_scenarios', R.pluck('id', data.document_scenarios)), diff --git a/openbas-front/src/admin/components/components/documents/DocumentForm.js b/openbas-front/src/admin/components/components/documents/DocumentForm.js index b6a0de38f5..81f2ce9fca 100644 --- a/openbas-front/src/admin/components/components/documents/DocumentForm.js +++ b/openbas-front/src/admin/components/components/documents/DocumentForm.js @@ -1,11 +1,12 @@ -import { Form } from 'react-final-form'; import { Button, CircularProgress } from '@mui/material'; +import { Form } from 'react-final-form'; + +import ExerciseField from '../../../../components/ExerciseField'; import OldTextField from '../../../../components/fields/OldTextField'; -import { useFormatter } from '../../../../components/i18n'; -import TagField from '../../../../components/TagField'; import FileField from '../../../../components/FileField'; -import ExerciseField from '../../../../components/ExerciseField'; +import { useFormatter } from '../../../../components/i18n'; import ScenarioField from '../../../../components/ScenarioField'; +import TagField from '../../../../components/TagField'; const DocumentForm = (props) => { // Standard hooks diff --git a/openbas-front/src/admin/components/components/documents/DocumentPopover.js b/openbas-front/src/admin/components/components/documents/DocumentPopover.js index b7d5c5b7a2..2db5c85d8e 100644 --- a/openbas-front/src/admin/components/components/documents/DocumentPopover.js +++ b/openbas-front/src/admin/components/components/documents/DocumentPopover.js @@ -1,18 +1,19 @@ -import { useState } from 'react'; -import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; +import * as R from 'ramda'; +import { useState } from 'react'; + import { deleteDocument, updateDocument } from '../../../../actions/Document'; -import DocumentForm from './DocumentForm'; -import { useFormatter } from '../../../../components/i18n'; +import { fetchExercises } from '../../../../actions/Exercise'; +import { fetchScenarios } from '../../../../actions/scenarios/scenario-actions'; +import Drawer from '../../../../components/common/Drawer'; import Transition from '../../../../components/common/Transition'; -import { exerciseOptions, scenarioOptions, tagOptions } from '../../../../utils/Option'; -import { useAppDispatch } from '../../../../utils/hooks'; +import { useFormatter } from '../../../../components/i18n'; import { useHelper } from '../../../../store'; +import { useAppDispatch } from '../../../../utils/hooks'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchScenarios } from '../../../../actions/scenarios/scenario-actions'; -import { fetchExercises } from '../../../../actions/Exercise'; -import Drawer from '../../../../components/common/Drawer'; +import { exerciseOptions, scenarioOptions, tagOptions } from '../../../../utils/Option'; +import DocumentForm from './DocumentForm'; const DocumentPopover = (props) => { // Standard hooks @@ -22,7 +23,7 @@ const DocumentPopover = (props) => { const { document, disabled, onRemoveDocument, attached, onToggleAttach, inline, onUpdate, onDelete } = props; // Fetching data - const { tagsMap, exercisesMap, scenariosMap } = useHelper((helper) => ({ + const { tagsMap, exercisesMap, scenariosMap } = useHelper(helper => ({ tagsMap: helper.getTagsMap(), exercisesMap: helper.getExercisesMap(), scenariosMap: helper.getScenariosMap(), @@ -150,9 +151,11 @@ const DocumentPopover = (props) => { open={Boolean(anchorEl)} onClose={handlePopoverClose} > - {onUpdate && - {t('Update')} - } + {onUpdate && ( + + {t('Update')} + + )} {onToggleAttach && ( {attached ? t('Disable attachment') : t('Enable attachment')} diff --git a/openbas-front/src/admin/components/components/documents/DocumentType.js b/openbas-front/src/admin/components/components/documents/DocumentType.js index 530a890735..6d50dbc9ca 100644 --- a/openbas-front/src/admin/components/components/documents/DocumentType.js +++ b/openbas-front/src/admin/components/components/documents/DocumentType.js @@ -1,8 +1,9 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { withStyles } from '@mui/styles'; import { Chip } from '@mui/material'; +import { withStyles } from '@mui/styles'; +import * as PropTypes from 'prop-types'; import { compose } from 'ramda'; +import { Component } from 'react'; + import inject18n from '../../../../components/i18n'; import { hexToRGB, stringToColour } from '../../../../utils/Colors'; diff --git a/openbas-front/src/admin/components/components/documents/Documents.js b/openbas-front/src/admin/components/components/documents/Documents.js index b7fcc36428..4e96aff4f6 100644 --- a/openbas-front/src/admin/components/components/documents/Documents.js +++ b/openbas-front/src/admin/components/components/documents/Documents.js @@ -1,25 +1,26 @@ -import { useState } from 'react'; -import * as R from 'ramda'; -import { makeStyles } from '@mui/styles'; +import { DescriptionOutlined, RowingOutlined } from '@mui/icons-material'; import { Chip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Tooltip } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; -import { DescriptionOutlined, RowingOutlined } from '@mui/icons-material'; import { useNavigate } from 'react-router-dom'; -import { useFormatter } from '../../../../components/i18n'; + import { searchDocuments } from '../../../../actions/Document'; -import { fetchTags } from '../../../../actions/Tag'; import { fetchExercises } from '../../../../actions/Exercise'; -import ItemTags from '../../../../components/ItemTags'; -import CreateDocument from './CreateDocument'; -import DocumentPopover from './DocumentPopover'; -import DocumentType from './DocumentType'; import { fetchScenarios } from '../../../../actions/scenarios/scenario-actions'; +import { fetchTags } from '../../../../actions/Tag'; import Breadcrumbs from '../../../../components/Breadcrumbs'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { initSorting } from '../../../../components/common/queryable/Page'; import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; +import { initSorting } from '../../../../components/common/queryable/Page'; +import { useFormatter } from '../../../../components/i18n'; +import ItemTags from '../../../../components/ItemTags'; import { useHelper } from '../../../../store'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import CreateDocument from './CreateDocument'; +import DocumentPopover from './DocumentPopover'; +import DocumentType from './DocumentType'; const useStyles = makeStyles(() => ({ itemHead: { @@ -87,7 +88,7 @@ const Documents = () => { const dispatch = useDispatch(); const navigate = useNavigate(); const { t } = useFormatter(); - const { exercisesMap, scenariosMap, userAdmin } = useHelper((helper) => ({ + const { exercisesMap, scenariosMap, userAdmin } = useHelper(helper => ({ exercisesMap: helper.getExercisesMap(), scenariosMap: helper.getScenariosMap(), userAdmin: helper.getMe()?.user_admin ?? false, @@ -152,18 +153,18 @@ const Documents = () => { - } + )} />  
    - {documents.map((document) => ( + {documents.map(document => ( {
    {
    - } + )} /> setDocuments(documents.map((d) => (d.document_id !== result.document_id ? d : result)))} - onDelete={(result) => setDocuments(documents.filter((d) => (d.document_id !== result)))} + onUpdate={result => setDocuments(documents.map(d => (d.document_id !== result.document_id ? d : result)))} + onDelete={result => setDocuments(documents.filter(d => (d.document_id !== result)))} scenariosAndExercisesFetched />
    ))} - {userAdmin && setDocuments([result, ...documents])} - />} + {userAdmin && ( + setDocuments([result, ...documents])} + /> + )} ); }; diff --git a/openbas-front/src/admin/components/components/lessons/CreateLessonsTemplate.tsx b/openbas-front/src/admin/components/components/lessons/CreateLessonsTemplate.tsx index adea72f28c..aceaa6a36f 100644 --- a/openbas-front/src/admin/components/components/lessons/CreateLessonsTemplate.tsx +++ b/openbas-front/src/admin/components/components/lessons/CreateLessonsTemplate.tsx @@ -1,13 +1,14 @@ import { FunctionComponent, useState } from 'react'; -import { useFormatter } from '../../../../components/i18n'; -import LessonsTemplateForm from './LessonsTemplateForm'; + import { addLessonsTemplate } from '../../../../actions/Lessons'; import ButtonCreate from '../../../../components/common/ButtonCreate'; +import Dialog from '../../../../components/common/Dialog'; import Drawer from '../../../../components/common/Drawer'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { LessonsTemplate, LessonsTemplateInput } from '../../../../utils/api-types'; import ListItemButtonCreate from '../../../../components/common/ListItemButtonCreate'; -import Dialog from '../../../../components/common/Dialog'; +import { useFormatter } from '../../../../components/i18n'; +import type { LessonsTemplate, LessonsTemplateInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; +import LessonsTemplateForm from './LessonsTemplateForm'; interface Props { inline?: boolean; @@ -26,7 +27,7 @@ const CreateLessonsTemplate: FunctionComponent = ({ const handleOpen = () => setOpen(true); const handleClose = () => setOpen(false); const onSubmit = (data: LessonsTemplateInput) => { - return dispatch(addLessonsTemplate(data)).then((result: { result: string, entities: { lessonstemplates: Record } }) => { + return dispatch(addLessonsTemplate(data)).then((result: { result: string; entities: { lessonstemplates: Record } }) => { if (result.result) { if (onCreate) { const created = result.entities.lessonstemplates[result.result]; diff --git a/openbas-front/src/admin/components/components/lessons/Index.tsx b/openbas-front/src/admin/components/components/lessons/Index.tsx index b30feef2e0..2ccdb0535b 100644 --- a/openbas-front/src/admin/components/components/lessons/Index.tsx +++ b/openbas-front/src/admin/components/components/lessons/Index.tsx @@ -1,16 +1,17 @@ import { Route, Routes, useParams } from 'react-router-dom'; -import Loader from '../../../../components/Loader'; -import LessonsTemplate from './LessonsTemplate'; -import LessonsTemplateHeader from './LessonsTemplateHeader'; -import { errorWrapper } from '../../../../components/Error'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../../store'; + import { fetchLessonsTemplates } from '../../../../actions/Lessons'; -import { useAppDispatch } from '../../../../utils/hooks'; import type { LessonsTemplatesHelper } from '../../../../actions/lessons/lesson-helper'; -import NotFound from '../../../../components/NotFound'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { errorWrapper } from '../../../../components/Error'; import { useFormatter } from '../../../../components/i18n'; +import Loader from '../../../../components/Loader'; +import NotFound from '../../../../components/NotFound'; +import { useHelper } from '../../../../store'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import LessonsTemplate from './LessonsTemplate'; +import LessonsTemplateHeader from './LessonsTemplateHeader'; const Index = () => { // Standard hooks @@ -28,11 +29,13 @@ const Index = () => { if (lessonsTemplate) { return ( <> - diff --git a/openbas-front/src/admin/components/components/lessons/LessonsTemplate.tsx b/openbas-front/src/admin/components/components/lessons/LessonsTemplate.tsx index 4c28bfe7c5..dce7e3ce9c 100644 --- a/openbas-front/src/admin/components/components/lessons/LessonsTemplate.tsx +++ b/openbas-front/src/admin/components/components/lessons/LessonsTemplate.tsx @@ -1,20 +1,21 @@ +import { HelpOutlined } from '@mui/icons-material'; +import { Grid, List, ListItemButton, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; -import { Grid, List, ListItemButton, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Typography } from '@mui/material'; -import { HelpOutlined } from '@mui/icons-material'; -import { useHelper } from '../../../../store'; + +import type { UserHelper } from '../../../../actions/helper'; +import { fetchLessonsTemplateCategories, fetchLessonsTemplateQuestions } from '../../../../actions/Lessons'; +import type { LessonsTemplatesHelper } from '../../../../actions/lessons/lesson-helper'; +import type { LessonsTemplateQuestionStore } from '../../../../actions/lessons/Lessons'; import { useFormatter } from '../../../../components/i18n'; -import CreateLessonsTemplateCategory from './categories/CreateLessonsTemplateCategory'; +import { useHelper } from '../../../../store'; +import type { LessonsTemplateCategory } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchLessonsTemplateCategories, fetchLessonsTemplateQuestions } from '../../../../actions/Lessons'; +import CreateLessonsTemplateCategory from './categories/CreateLessonsTemplateCategory'; import LessonsTemplateCategoryPopover from './categories/LessonsTemplateCategoryPopover'; import CreateLessonsTemplateQuestion from './categories/questions/CreateLessonsTemplateQuestion'; import LessonsTemplateQuestionPopover from './categories/questions/LessonsTemplateQuestionPopover'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { LessonsTemplatesHelper } from '../../../../actions/lessons/lesson-helper'; -import type { UserHelper } from '../../../../actions/helper'; -import type { LessonsTemplateCategory } from '../../../../utils/api-types'; -import type { LessonsTemplateQuestionStore } from '../../../../actions/lessons/Lessons'; const useStyles = makeStyles(() => ({ container: { @@ -36,9 +37,9 @@ const LessonsTemplate = () => { categories, questions, }: { - userAdmin: boolean, - categories: LessonsTemplateCategory[], - questions: LessonsTemplateQuestionStore[] + userAdmin: boolean; + categories: LessonsTemplateCategory[]; + questions: LessonsTemplateQuestionStore[]; } = useHelper((helper: LessonsTemplatesHelper & UserHelper) => { return { categories: helper.getLessonsTemplateCategories(lessonsTemplateId), @@ -64,12 +65,12 @@ const LessonsTemplate = () => { {categoriesSorted.map((category) => { const questionsSorted = sortQuestions( - questions.filter((q) => q.lessons_template_question_category === category.lessonstemplatecategory_id), + questions.filter(q => q.lessons_template_question_category === category.lessonstemplatecategory_id), ); return (
    - + {category.lessons_template_category_name} ; diff --git a/openbas-front/src/admin/components/components/lessons/LessonsTemplateHeader.tsx b/openbas-front/src/admin/components/components/lessons/LessonsTemplateHeader.tsx index 63bad09407..3832c74b86 100644 --- a/openbas-front/src/admin/components/components/lessons/LessonsTemplateHeader.tsx +++ b/openbas-front/src/admin/components/components/lessons/LessonsTemplateHeader.tsx @@ -1,10 +1,11 @@ -import { makeStyles } from '@mui/styles'; import { Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; + +import type { UserHelper } from '../../../../actions/helper'; +import type { LessonsTemplatesHelper } from '../../../../actions/lessons/lesson-helper'; import { useHelper } from '../../../../store'; import LessonsTemplatePopover from './LessonsTemplatePopover'; -import type { LessonsTemplatesHelper } from '../../../../actions/lessons/lesson-helper'; -import type { UserHelper } from '../../../../actions/helper'; const useStyles = makeStyles(() => ({ containerTitle: { diff --git a/openbas-front/src/admin/components/components/lessons/LessonsTemplatePopover.tsx b/openbas-front/src/admin/components/components/lessons/LessonsTemplatePopover.tsx index 197b9a4938..c7f4e291ab 100644 --- a/openbas-front/src/admin/components/components/lessons/LessonsTemplatePopover.tsx +++ b/openbas-front/src/admin/components/components/lessons/LessonsTemplatePopover.tsx @@ -1,14 +1,15 @@ import { useState } from 'react'; import * as React from 'react'; import { useNavigate } from 'react-router-dom'; -import LessonsTemplateForm from './LessonsTemplateForm'; -import { useFormatter } from '../../../../components/i18n'; + import { deleteLessonsTemplate, updateLessonsTemplate } from '../../../../actions/Lessons'; +import ButtonPopover from '../../../../components/common/ButtonPopover'; +import DialogDelete from '../../../../components/common/DialogDelete'; +import Drawer from '../../../../components/common/Drawer'; +import { useFormatter } from '../../../../components/i18n'; import type { LessonsTemplate, LessonsTemplateInput } from '../../../../utils/api-types'; import { useAppDispatch } from '../../../../utils/hooks'; -import Drawer from '../../../../components/common/Drawer'; -import DialogDelete from '../../../../components/common/DialogDelete'; -import ButtonPopover from '../../../../components/common/ButtonPopover'; +import LessonsTemplateForm from './LessonsTemplateForm'; interface Props { lessonsTemplate: LessonsTemplate; @@ -54,7 +55,7 @@ const LessonsTemplatePopover: React.FC = ({ lessonsTemplate }) => { return ( <> - + ({ itemHead: { @@ -96,14 +97,14 @@ const LessonsTemplates = () => { > - } + )} /> @@ -120,9 +121,9 @@ const LessonsTemplates = () => { - {headers.map((header) => ( + {headers.map(header => (
    {
    ))}
    - } + )} /> @@ -141,7 +142,7 @@ const LessonsTemplates = () => { ); })} - {userAdmin && setLessonTemplates([result, ...lessonTemplates])} />} + {userAdmin && setLessonTemplates([result, ...lessonTemplates])} />} ); }; diff --git a/openbas-front/src/admin/components/components/lessons/categories/CreateLessonsTemplateCategory.tsx b/openbas-front/src/admin/components/components/lessons/categories/CreateLessonsTemplateCategory.tsx index 370b71b21a..e20275cc1c 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/CreateLessonsTemplateCategory.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/CreateLessonsTemplateCategory.tsx @@ -1,11 +1,12 @@ import { FunctionComponent, useState } from 'react'; -import { useFormatter } from '../../../../../components/i18n'; -import LessonsTemplateCategoryForm, { LessonsTemplateCategoryInputForm } from './LessonsTemplateCategoryForm'; + import { addLessonsTemplateCategory } from '../../../../../actions/Lessons'; import ButtonCreate from '../../../../../components/common/ButtonCreate.js'; import Drawer from '../../../../../components/common/Drawer.js'; +import { useFormatter } from '../../../../../components/i18n'; import type { LessonsTemplateCategory } from '../../../../../utils/api-types'; import { useAppDispatch } from '../../../../../utils/hooks'; +import LessonsTemplateCategoryForm, { LessonsTemplateCategoryInputForm } from './LessonsTemplateCategoryForm'; interface Props { lessonsTemplateId: string; @@ -23,7 +24,7 @@ const CreateLessonsTemplateCategory: FunctionComponent = ({ const handleClose = () => setOpen(false); const onSubmit = (data: LessonsTemplateCategoryInputForm) => { return dispatch(addLessonsTemplateCategory(lessonsTemplateId, data)).then( - (result: { result: string, entities: { lessonstemplatecategorys: Record } }) => { + (result: { result: string; entities: { lessonstemplatecategorys: Record } }) => { if (result.result) { return handleClose(); } diff --git a/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryForm.tsx b/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryForm.tsx index 5fc39a86ba..a5e34a367c 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryForm.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryForm.tsx @@ -1,12 +1,13 @@ -import { FunctionComponent } from 'react'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@mui/material'; +import { FunctionComponent } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; + +import TextField from '../../../../../components/fields/TextField'; import { useFormatter } from '../../../../../components/i18n'; import type { LessonsTemplateCategoryInput } from '../../../../../utils/api-types'; import { zodImplement } from '../../../../../utils/Zod'; -import TextField from '../../../../../components/fields/TextField'; export type LessonsTemplateCategoryInputForm = Omit & { lessons_template_category_order: string; diff --git a/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryPopover.tsx b/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryPopover.tsx index 8ee7c63ae0..373f49596e 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryPopover.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/LessonsTemplateCategoryPopover.tsx @@ -1,12 +1,13 @@ import { FunctionComponent, useState } from 'react'; -import LessonsTemplateCategoryForm, { LessonsTemplateCategoryInputForm } from './LessonsTemplateCategoryForm'; -import { useFormatter } from '../../../../../components/i18n'; + import { deleteLessonsTemplateCategory, updateLessonsTemplateCategory } from '../../../../../actions/Lessons'; -import type { LessonsTemplateCategory } from '../../../../../utils/api-types'; +import ButtonPopover from '../../../../../components/common/ButtonPopover'; import DialogDelete from '../../../../../components/common/DialogDelete'; import Drawer from '../../../../../components/common/Drawer'; -import ButtonPopover from '../../../../../components/common/ButtonPopover'; +import { useFormatter } from '../../../../../components/i18n'; +import type { LessonsTemplateCategory } from '../../../../../utils/api-types'; import { useAppDispatch } from '../../../../../utils/hooks'; +import LessonsTemplateCategoryForm, { LessonsTemplateCategoryInputForm } from './LessonsTemplateCategoryForm'; interface Props { lessonsTemplateId: string; @@ -61,7 +62,7 @@ const LessonsTemplateCategoryPopover: FunctionComponent = ({ return ( <> - + = ({ lessonsTemplateCategoryId, data, ), - ).then((result: { result: string, entities: { lessonstemplatequestions: Record } }) => { + ).then((result: { result: string; entities: { lessonstemplatequestions: Record } }) => { if (result.result) { return handleClose(); } diff --git a/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionForm.tsx b/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionForm.tsx index fa5b5af5d2..b28867e5d7 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionForm.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionForm.tsx @@ -1,12 +1,13 @@ -import { FunctionComponent } from 'react'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@mui/material'; +import { FunctionComponent } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; + +import TextField from '../../../../../../components/fields/TextField'; import { useFormatter } from '../../../../../../components/i18n'; import type { LessonsTemplateQuestionInput } from '../../../../../../utils/api-types'; import { zodImplement } from '../../../../../../utils/Zod'; -import TextField from '../../../../../../components/fields/TextField'; export type LessonsTemplateQuestionInputForm = Omit & { lessons_template_question_order: string; diff --git a/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionPopover.tsx b/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionPopover.tsx index 539c4e5f01..d1b61fd533 100644 --- a/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionPopover.tsx +++ b/openbas-front/src/admin/components/components/lessons/categories/questions/LessonsTemplateQuestionPopover.tsx @@ -1,12 +1,13 @@ import { FunctionComponent, useState } from 'react'; -import LessonsTemplateQuestionForm, { LessonsTemplateQuestionInputForm } from './LessonsTemplateQuestionForm'; -import { useFormatter } from '../../../../../../components/i18n'; + import { deleteLessonsTemplateQuestion, updateLessonsTemplateQuestion } from '../../../../../../actions/Lessons'; -import { useAppDispatch } from '../../../../../../utils/hooks'; +import type { LessonsTemplateQuestionStore } from '../../../../../../actions/lessons/Lessons'; import ButtonPopover from '../../../../../../components/common/ButtonPopover'; import DialogDelete from '../../../../../../components/common/DialogDelete'; import Drawer from '../../../../../../components/common/Drawer'; -import type { LessonsTemplateQuestionStore } from '../../../../../../actions/lessons/Lessons'; +import { useFormatter } from '../../../../../../components/i18n'; +import { useAppDispatch } from '../../../../../../utils/hooks'; +import LessonsTemplateQuestionForm, { LessonsTemplateQuestionInputForm } from './LessonsTemplateQuestionForm'; interface Props { lessonsTemplateId: string; @@ -65,7 +66,7 @@ const LessonsTemplateQuestionPopover: FunctionComponent = ({ return ( <> - + void - canEditComment?:boolean, + initialComment: string; + saveComment: (newComment: string) => void; + canEditComment?: boolean; } const ReportComment: React.FC = ({ initialComment, saveComment, canEditComment = false }) => { @@ -20,12 +21,13 @@ const ReportComment: React.FC = ({ initialComment, saveComment, canEditCo return (
    - + { canEditComment - && setOpenEdit(true)}> - - - } + && ( + setOpenEdit(true)}> + + + )} = ({ initialComment, saveComment, canEditCo <> setComment(value)} + onChange={value => setComment(value)} initialValue={comment} /> diff --git a/openbas-front/src/admin/components/components/reports/ReportPopover.tsx b/openbas-front/src/admin/components/components/reports/ReportPopover.tsx index 39b07e2cdb..31cfd17d5f 100644 --- a/openbas-front/src/admin/components/components/reports/ReportPopover.tsx +++ b/openbas-front/src/admin/components/components/reports/ReportPopover.tsx @@ -1,10 +1,11 @@ import { useContext, useState } from 'react'; import * as React from 'react'; + import ButtonPopover, { VariantButtonPopover } from '../../../../components/common/ButtonPopover'; -import DialogDelete from '../../../../components/common/DialogDelete'; import Dialog from '../../../../components/common/Dialog'; -import type { Report, ReportInput } from '../../../../utils/api-types'; +import DialogDelete from '../../../../components/common/DialogDelete'; import { useFormatter } from '../../../../components/i18n'; +import type { Report, ReportInput } from '../../../../utils/api-types'; import { ReportContext } from '../../common/Context'; type ReportActionType = 'Update' | 'Delete'; @@ -12,7 +13,7 @@ type ReportActionType = 'Update' | 'Delete'; interface Props { actions: ReportActionType[]; report: Report; - variant?: VariantButtonPopover + variant?: VariantButtonPopover; } const ReportPopover: React.FC = ({ @@ -46,7 +47,7 @@ const ReportPopover: React.FC = ({ return ( <> - + setOpenDelete(false)} diff --git a/openbas-front/src/admin/components/components/reports/Reports.tsx b/openbas-front/src/admin/components/components/reports/Reports.tsx index 5645d7efb3..57892a8e59 100644 --- a/openbas-front/src/admin/components/components/reports/Reports.tsx +++ b/openbas-front/src/admin/components/components/reports/Reports.tsx @@ -1,16 +1,16 @@ +import { ContentPasteOutlined } from '@mui/icons-material'; +import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { useContext } from 'react'; import * as React from 'react'; -import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; -import { ContentPasteOutlined } from '@mui/icons-material'; -import type { Report } from '../../../../utils/api-types'; import { useFormatter } from '../../../../components/i18n'; -import ReportPopover from './ReportPopover'; +import type { Report } from '../../../../utils/api-types'; import { PermissionsContext } from '../../common/Context'; +import ReportPopover from './ReportPopover'; interface Props { - reports: Report[], - navigateToReportPage: (id: string) => void + reports: Report[]; + navigateToReportPage: (id: string) => void; } const Reports: React.FC = ({ reports, navigateToReportPage }) => { @@ -34,11 +34,12 @@ const Reports: React.FC = ({ reports, navigateToReportPage }) => { divider={true} style={{ height: 50, padding: 0 }} secondaryAction={permissions.canWrite - && - } + /> + )} > navigateToReportPage(report.report_id)}> diff --git a/openbas-front/src/admin/components/components/teams/ContextualTeams.tsx b/openbas-front/src/admin/components/components/teams/ContextualTeams.tsx index 7d646cb5d0..28b30578a6 100644 --- a/openbas-front/src/admin/components/components/teams/ContextualTeams.tsx +++ b/openbas-front/src/admin/components/components/teams/ContextualTeams.tsx @@ -1,15 +1,16 @@ -import { Drawer, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { CheckCircleOutlined, GroupsOutlined } from '@mui/icons-material'; +import { Drawer, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { CSSProperties, useContext, useState } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; import { useSearchParams } from 'react-router-dom'; + +import type { TeamStore } from '../../../../actions/teams/Team'; import ItemTags from '../../../../components/ItemTags'; -import TeamPopover from './TeamPopover'; import useSearchAnFilter from '../../../../utils/SortingFiltering'; -import type { TeamStore } from '../../../../actions/teams/Team'; -import TeamPlayers from './TeamPlayers'; import { PermissionsContext, TeamContext } from '../../common/Context'; +import TeamPlayers from './TeamPlayers'; +import TeamPopover from './TeamPopover'; const useStyles = makeStyles(() => ({ itemHead: { @@ -174,7 +175,7 @@ const ContextualTeams: React.FC = ({ teams }) => { {filtering.buildHeader( 'team_name', @@ -207,7 +208,7 @@ const ContextualTeams: React.FC = ({ teams }) => { headerStylesContextual, )} - } + )} />   @@ -223,7 +224,7 @@ const ContextualTeams: React.FC = ({ teams }) => {
    = ({ teams }) => { {team.team_contextual ? : '-'}
    - } + )} /> ({ createButton: { diff --git a/openbas-front/src/admin/components/components/teams/TeamAddPlayers.tsx b/openbas-front/src/admin/components/components/teams/TeamAddPlayers.tsx index cd09f89890..bbf8aed724 100644 --- a/openbas-front/src/admin/components/components/teams/TeamAddPlayers.tsx +++ b/openbas-front/src/admin/components/components/teams/TeamAddPlayers.tsx @@ -1,25 +1,26 @@ +import { Add, PersonOutlined } from '@mui/icons-material'; +import { Avatar, Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Fab, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import * as R from 'ramda'; import { useContext, useState } from 'react'; import * as React from 'react'; -import * as R from 'ramda'; -import { Avatar, Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Fab, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; -import { Add, PersonOutlined } from '@mui/icons-material'; -import type { Organization, Team } from '../../../../utils/api-types'; -import { useAppDispatch } from '../../../../utils/hooks'; + +import type { OrganizationHelper, UserHelper } from '../../../../actions/helper'; +import { fetchPlayers } from '../../../../actions/User'; +import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; +import ItemTags from '../../../../components/ItemTags'; +import SearchFilter from '../../../../components/SearchFilter'; import { useHelper } from '../../../../store'; -import type { OrganizationHelper, UserHelper } from '../../../../actions/helper'; -import type { UserStore } from '../../teams/players/Player'; +import type { Organization, Team } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchPlayers } from '../../../../actions/User'; import type { Option } from '../../../../utils/Option'; -import SearchFilter from '../../../../components/SearchFilter'; -import TagsFilter from '../../common/filters/TagsFilter'; import { resolveUserName, truncate } from '../../../../utils/String'; -import ItemTags from '../../../../components/ItemTags'; -import CreatePlayer from '../../teams/players/CreatePlayer'; -import Transition from '../../../../components/common/Transition'; import { TeamContext } from '../../common/Context'; +import TagsFilter from '../../common/filters/TagsFilter'; +import CreatePlayer from '../../teams/players/CreatePlayer'; +import type { UserStore } from '../../teams/players/Player'; const useStyles = makeStyles(() => ({ createButton: { @@ -40,12 +41,12 @@ const useStyles = makeStyles(() => ({ interface Props { addedUsersIds: UserStore['user_id'][]; - teamId: Team['team_id'] + teamId: Team['team_id']; } type UserStoreExtended = UserStore & { organization_name: Organization['organization_name']; - organization_description: Organization['organization_description'] + organization_description: Organization['organization_description']; }; const TeamAddPlayers: React.FC = ({ addedUsersIds, teamId }) => { @@ -60,8 +61,8 @@ const TeamAddPlayers: React.FC = ({ addedUsersIds, teamId }) => { const { onAddUsersTeam } = useContext(TeamContext); const { usersMap, organizationsMap }: { - organizationsMap: Record, - usersMap: Record + organizationsMap: Record; + usersMap: Record; } = useHelper((helper: UserHelper & OrganizationHelper) => ({ usersMap: helper.getUsersMap(), organizationsMap: helper.getOrganizationsMap(), @@ -83,8 +84,10 @@ const TeamAddPlayers: React.FC = ({ addedUsersIds, teamId }) => { organization_name: u.user_organization ? (organizationsMap[u.user_organization]?.organization_name ?? '-') : '-', organization_description: - u.user_organization ? (organizationsMap[u.user_organization]?.organization_description - ?? '-') : '-', + u.user_organization + ? (organizationsMap[u.user_organization]?.organization_description + ?? '-') + : '-', ...u, })), R.filter( @@ -183,7 +186,7 @@ const TeamAddPlayers: React.FC = ({ addedUsersIds, teamId }) => { })} setUsersIds([...usersIds, user.user_id])} + onCreate={user => setUsersIds([...usersIds, user.user_id])} /> @@ -214,7 +217,9 @@ const TeamAddPlayers: React.FC = ({ addedUsersIds, teamId }) => { setKeyword(''); setUsersIds([]); }} - >{t('Cancel')} + > + {t('Cancel')} + diff --git a/openbas-front/src/admin/components/components/teams/TeamForm.tsx b/openbas-front/src/admin/components/components/teams/TeamForm.tsx index 92d4eb5d05..56fdebd066 100644 --- a/openbas-front/src/admin/components/components/teams/TeamForm.tsx +++ b/openbas-front/src/admin/components/components/teams/TeamForm.tsx @@ -1,16 +1,17 @@ -import { FunctionComponent, useContext } from 'react'; -import { Form } from 'react-final-form'; import { Button } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useContext } from 'react'; +import { Form } from 'react-final-form'; import { z } from 'zod'; + +import type { TeamInputForm } from '../../../../actions/teams/Team'; +import CheckboxField from '../../../../components/CheckboxField'; import OldTextField from '../../../../components/fields/OldTextField'; import { useFormatter } from '../../../../components/i18n'; -import TagField from '../../../../components/TagField'; import OrganizationField from '../../../../components/OrganizationField'; +import TagField from '../../../../components/TagField'; import type { Theme } from '../../../../components/Theme'; -import type { TeamInputForm } from '../../../../actions/teams/Team'; import { schemaValidator } from '../../../../utils/Zod'; -import CheckboxField from '../../../../components/CheckboxField'; import { TeamContext, TeamContextType } from '../../common/Context'; const useStyles = makeStyles((theme: Theme) => ({ diff --git a/openbas-front/src/admin/components/components/teams/TeamPlayers.tsx b/openbas-front/src/admin/components/components/teams/TeamPlayers.tsx index 1a26080575..4c000c810f 100644 --- a/openbas-front/src/admin/components/components/teams/TeamPlayers.tsx +++ b/openbas-front/src/admin/components/components/teams/TeamPlayers.tsx @@ -1,28 +1,29 @@ -import { CSSProperties, useContext, useState } from 'react'; -import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Typography } from '@mui/material'; import { ArrowDropDownOutlined, ArrowDropUpOutlined, CloseRounded, EmailOutlined, KeyOutlined, PersonOutlined, SmartphoneOutlined } from '@mui/icons-material'; +import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; +import { CSSProperties, useContext, useState } from 'react'; +import * as React from 'react'; + +import type { OrganizationHelper, UserHelper } from '../../../../actions/helper'; +import { fetchOrganizations } from '../../../../actions/Organization'; +import { fetchTeam, fetchTeamPlayers } from '../../../../actions/teams/team-actions'; +import type { TeamsHelper } from '../../../../actions/teams/team-helper'; import { useFormatter } from '../../../../components/i18n'; -import type { Theme } from '../../../../components/Theme'; -import TagsFilter from '../../common/filters/TagsFilter'; -import SearchFilter from '../../../../components/SearchFilter'; import ItemBoolean from '../../../../components/ItemBoolean'; import ItemTags from '../../../../components/ItemTags'; -import PlayerPopover from '../../teams/players/PlayerPopover'; -import TeamAddPlayers from './TeamAddPlayers'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchTeam, fetchTeamPlayers } from '../../../../actions/teams/team-actions'; -import { fetchOrganizations } from '../../../../actions/Organization'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { Organization, Team } from '../../../../utils/api-types'; +import SearchFilter from '../../../../components/SearchFilter'; +import type { Theme } from '../../../../components/Theme'; import { useHelper } from '../../../../store'; -import type { OrganizationHelper, UserHelper } from '../../../../actions/helper'; -import type { UserStore } from '../../teams/players/Player'; +import type { Organization, Team } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; import type { Option } from '../../../../utils/Option'; -import type { TeamsHelper } from '../../../../actions/teams/team-helper'; import { PermissionsContext, TeamContext } from '../../common/Context'; +import TagsFilter from '../../common/filters/TagsFilter'; +import type { UserStore } from '../../teams/players/Player'; +import PlayerPopover from '../../teams/players/PlayerPopover'; +import TeamAddPlayers from './TeamAddPlayers'; const useStyles = makeStyles((theme: Theme) => ({ header: { @@ -153,8 +154,8 @@ const inlineStyles: Record = { }; interface Props { - teamId: Team['team_id'] - handleClose: () => void + teamId: Team['team_id']; + handleClose: () => void; } type UserStoreExtended = UserStore & { @@ -172,9 +173,9 @@ const TeamPlayers: React.FC = ({ teamId, handleClose }) => { const [tags, setTags] = useState([]); const { organizationsMap, team, users }: { - organizationsMap: Record, - team: Team, - users: UserStore[] + organizationsMap: Record; + team: Team; + users: UserStore[]; } = useHelper((helper: UserHelper & TeamsHelper & OrganizationHelper) => ({ organizationsMap: helper.getOrganizationsMap(), team: helper.getTeam(teamId), @@ -220,11 +221,13 @@ const TeamPlayers: React.FC = ({ teamId, handleClose }) => { )(users); const sortHeader = (field: string, label: string, isSortable: boolean) => { - const sortComponent = orderAsc ? ( - - ) : ( - - ); + const sortComponent = orderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    = ({ teamId, handleClose }) => { {onToggleUser && sortHeader('user_enabled', 'Enabled', true)} {sortHeader('user_email', 'Email address', true)} @@ -312,11 +315,11 @@ const TeamPlayers: React.FC = ({ teamId, handleClose }) => { {sortHeader('user_organization', 'Organization', true)} {sortHeader('user_tags', 'Tags', true)} - } + )} />   - {sortedUsers.map((user) => ( + {sortedUsers.map(user => ( = ({ teamId, handleClose }) => { {onToggleUser && (
    = ({ teamId, handleClose }) => { > {R.isNil(user.user_email) || R.isEmpty(user.user_email) ? ( - - ) : ( - - )} + + ) : ( + + )} {R.isNil(user.user_pgp_key) || R.isEmpty(user.user_pgp_key) ? ( - - ) : ( - - )} + + ) : ( + + )} {R.isNil(user.user_phone) || R.isEmpty(user.user_phone) ? ( - - ) : ( - - )} + + ) : ( + + )}
    = ({ teamId, handleClose }) => {
    - } + )} /> {permissions.canWrite ? ( - - ) - :   - } + + ) + :   }
    ))} @@ -432,7 +434,7 @@ const TeamPlayers: React.FC = ({ teamId, handleClose }) => { && ( u.user_id)} + addedUsersIds={users.map(u => u.user_id)} /> ) } diff --git a/openbas-front/src/admin/components/components/teams/TeamPopover.tsx b/openbas-front/src/admin/components/components/teams/TeamPopover.tsx index 41df3dd428..f7e039b94d 100644 --- a/openbas-front/src/admin/components/components/teams/TeamPopover.tsx +++ b/openbas-front/src/admin/components/components/teams/TeamPopover.tsx @@ -1,27 +1,28 @@ +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog as MuiDialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; import { FunctionComponent, useContext, useState } from 'react'; import * as React from 'react'; -import { Button, Dialog as MuiDialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; -import Dialog from '../../../../components/common/Dialog'; + +import type { ExercisesHelper } from '../../../../actions/exercises/exercise-helper'; +import type { OrganizationHelper, TagHelper } from '../../../../actions/helper'; +import type { TeamInputForm, TeamStore } from '../../../../actions/teams/Team'; import { deleteTeam, updateTeam } from '../../../../actions/teams/team-actions'; -import TeamForm from './TeamForm'; -import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; +import type { TeamsHelper } from '../../../../actions/teams/team-helper'; +import Dialog from '../../../../components/common/Dialog'; import Transition from '../../../../components/common/Transition'; +import { useFormatter } from '../../../../components/i18n'; +import { useHelper } from '../../../../store'; import type { TeamOutput, TeamUpdateInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; import { Option, organizationOption, tagOptions } from '../../../../utils/Option'; -import { useHelper } from '../../../../store'; -import type { OrganizationHelper, TagHelper } from '../../../../actions/helper'; -import type { TeamInputForm, TeamStore } from '../../../../actions/teams/Team'; -import type { TeamsHelper } from '../../../../actions/teams/team-helper'; import { TeamContext } from '../../common/Context'; -import type { ExercisesHelper } from '../../../../actions/exercises/exercise-helper'; +import TeamForm from './TeamForm'; interface TeamPopoverProps { team: TeamStore | TeamOutput; - managePlayers?: () => void, - disabled?: boolean, - openEditOnInit?: boolean, + managePlayers?: () => void; + disabled?: boolean; + openEditOnInit?: boolean; onRemoveTeamFromInject?: (teamId: string) => void; onUpdate?: (result: TeamStore) => void; onDelete?: (result: string) => void; @@ -80,7 +81,7 @@ const TeamPopover: FunctionComponent = ({ team_tags: data.team_tags?.map((tag: Option) => tag.id), }; return dispatch(updateTeam(team.team_id, inputValues)).then( - (result: { result: string, entities: { teams: Record } }) => { + (result: { result: string; entities: { teams: Record } }) => { if (result.entities) { if (onUpdate) { const updated = result.entities.teams[result.result]; @@ -166,8 +167,18 @@ const TeamPopover: FunctionComponent = ({ {t('Manage players')} )} - {onRemoveTeam && !onRemoveTeamFromInject && !team.team_contextual && {t('Remove from the context')}} - {onRemoveTeamFromInject && {t('Remove from the inject')}} + {onRemoveTeam && !onRemoveTeamFromInject && !team.team_contextual && ( + + {' '} + {t('Remove from the context')} + + )} + {onRemoveTeamFromInject && ( + + {' '} + {t('Remove from the inject')} + + )} {t('Delete')} ({ itemHead: { @@ -138,14 +139,14 @@ const Teams = () => { > - } + )} />   @@ -159,7 +160,7 @@ const Teams = () => {
    {team.team_name} @@ -177,14 +178,14 @@ const Teams = () => { {nsdt(team.team_updated_at)}
    - } + )} /> setSelectedTeam(team.team_id)} - onUpdate={(result) => setTeams(teams.map((v) => (v.team_id !== result.team_id ? v : result)))} - onDelete={(result) => setTeams(teams.filter((v) => (v.team_id !== result)))} + onUpdate={result => setTeams(teams.map(v => (v.team_id !== result.team_id ? v : result)))} + onDelete={result => setTeams(teams.filter(v => (v.team_id !== result)))} openEditOnInit={team.team_id === searchId} /> @@ -207,7 +208,7 @@ const Teams = () => { /> )} - {userAdmin && ( setTeams([result, ...teams])}/>)} + {userAdmin && ( setTeams([result, ...teams])} />)} ); }; diff --git a/openbas-front/src/admin/components/components/teams/UpdateTeams.tsx b/openbas-front/src/admin/components/components/teams/UpdateTeams.tsx index 9b7ad4bb31..c64de73bcd 100644 --- a/openbas-front/src/admin/components/components/teams/UpdateTeams.tsx +++ b/openbas-front/src/admin/components/components/teams/UpdateTeams.tsx @@ -1,23 +1,24 @@ -import { useContext, useEffect, useMemo, useState } from 'react'; -import * as React from 'react'; -import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton } from '@mui/material'; import { Add, GroupsOutlined } from '@mui/icons-material'; +import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import ItemTags from '../../../../components/ItemTags'; +import { useContext, useEffect, useMemo, useState } from 'react'; +import * as React from 'react'; + +import { fetchTags } from '../../../../actions/Tag'; +import type { TeamStore } from '../../../../actions/teams/Team'; +import { findTeams } from '../../../../actions/teams/team-actions'; +import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; +import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; +import { useQueryable } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; +import SelectList, { SelectListElements } from '../../../../components/common/SelectList'; import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; -import { findTeams } from '../../../../actions/teams/team-actions'; +import ItemTags from '../../../../components/ItemTags'; import type { Team, TeamOutput } from '../../../../utils/api-types'; -import type { TeamStore } from '../../../../actions/teams/Team'; -import SelectList, { SelectListElements } from '../../../../components/common/SelectList'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; import type { EndpointStore } from '../../assets/endpoints/Endpoint'; -import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; -import { useQueryable } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; -import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; import { TeamContext } from '../../common/Context'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchTags } from '../../../../actions/Tag'; -import { useAppDispatch } from '../../../../utils/hooks'; import CreateTeam from './CreateTeam'; const useStyles = makeStyles(() => ({ @@ -60,7 +61,7 @@ const UpdateTeams: React.FC = ({ const handleSubmit = async () => { setOpen(false); - onReplaceTeam?.(selectedTeamValues.map((v) => v.team_id)).then((result) => { + onReplaceTeam?.(selectedTeamValues.map(v => v.team_id)).then((result) => { if (result.result.length === 0) { setTeams([]); } else { @@ -71,13 +72,13 @@ const UpdateTeams: React.FC = ({ useEffect(() => { if (open) { - findTeams(addedTeamIds).then((result) => setSelectedTeamValues(result.data)); + findTeams(addedTeamIds).then(result => setSelectedTeamValues(result.data)); } }, [open, addedTeamIds]); // Pagination const addTeam = (_teamId: string, team: TeamOutput) => setSelectedTeamValues([...selectedTeamValues, team]); - const removeTeam = (teamId: string) => setSelectedTeamValues(selectedTeamValues.filter((v) => v.team_id !== teamId)); + const removeTeam = (teamId: string) => setSelectedTeamValues(selectedTeamValues.filter(v => v.team_id !== teamId)); // Headers const elements: SelectListElements = useMemo(() => ({ @@ -103,14 +104,16 @@ const UpdateTeams: React.FC = ({ ]; const { queryableHelpers, searchPaginationInput } = useQueryable(buildSearchPagination({})); - const paginationComponent = searchTeams(input)} - searchPaginationInput={searchPaginationInput} - setContent={setTeamValues} - entityPrefix="team" - availableFilterNames={availableFilterNames} - queryableHelpers={queryableHelpers} - />; + const paginationComponent = ( + searchTeams(input)} + searchPaginationInput={searchPaginationInput} + setContent={setTeamValues} + entityPrefix="team" + availableFilterNames={availableFilterNames} + queryableHelpers={queryableHelpers} + /> + ); return ( <> @@ -148,10 +151,12 @@ const UpdateTeams: React.FC = ({ onSelect={addTeam} onDelete={removeTeam} paginationComponent={paginationComponent} - buttonComponent={ setSelectedTeamValues([...selectedTeamValues, team])} - />} + buttonComponent={( + setSelectedTeamValues([...selectedTeamValues, team])} + /> + )} /> diff --git a/openbas-front/src/admin/components/components/variables/CreateVariable.tsx b/openbas-front/src/admin/components/components/variables/CreateVariable.tsx index 20b2ef602d..1f36301d50 100644 --- a/openbas-front/src/admin/components/components/variables/CreateVariable.tsx +++ b/openbas-front/src/admin/components/components/variables/CreateVariable.tsx @@ -1,13 +1,14 @@ -import { useContext, useState } from 'react'; -import * as React from 'react'; -import { Dialog, DialogContent, DialogTitle, IconButton, ListItem, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { Add, ControlPointOutlined } from '@mui/icons-material'; +import { Dialog, DialogContent, DialogTitle, IconButton, ListItem, ListItemIcon, ListItemText, Theme } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { useContext, useState } from 'react'; +import * as React from 'react'; + +import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; -import VariableForm from './VariableForm'; import type { VariableInput } from '../../../../utils/api-types'; -import Transition from '../../../../components/common/Transition'; import { VariableContext } from '../../common/Context'; +import VariableForm from './VariableForm'; const useStyles = makeStyles((theme: Theme) => ({ createButton: { diff --git a/openbas-front/src/admin/components/components/variables/VariableForm.tsx b/openbas-front/src/admin/components/components/variables/VariableForm.tsx index 777a1a3cc1..1337221c57 100644 --- a/openbas-front/src/admin/components/components/variables/VariableForm.tsx +++ b/openbas-front/src/admin/components/components/variables/VariableForm.tsx @@ -1,8 +1,9 @@ -import { SubmitHandler, useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button, TextField as MuiTextField } from '@mui/material'; import * as React from 'react'; -import { zodResolver } from '@hookform/resolvers/zod'; +import { SubmitHandler, useForm } from 'react-hook-form'; import { z } from 'zod'; + import { useFormatter } from '../../../../components/i18n'; import type { VariableInput } from '../../../../utils/api-types'; import { zodImplement } from '../../../../utils/Zod'; diff --git a/openbas-front/src/admin/components/components/variables/VariablePopover.tsx b/openbas-front/src/admin/components/components/variables/VariablePopover.tsx index 4cab5fa0b9..4ce6672b43 100644 --- a/openbas-front/src/admin/components/components/variables/VariablePopover.tsx +++ b/openbas-front/src/admin/components/components/variables/VariablePopover.tsx @@ -1,11 +1,12 @@ +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem } from '@mui/material'; import { useState } from 'react'; import * as React from 'react'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; + +import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; import type { Variable, VariableInput } from '../../../../utils/api-types'; import VariableForm from './VariableForm'; -import Transition from '../../../../components/common/Transition'; interface Props { variable: Variable; diff --git a/openbas-front/src/admin/components/components/variables/Variables.tsx b/openbas-front/src/admin/components/components/variables/Variables.tsx index ae9d8e53c9..8b17fc0dd2 100644 --- a/openbas-front/src/admin/components/components/variables/Variables.tsx +++ b/openbas-front/src/admin/components/components/variables/Variables.tsx @@ -1,11 +1,12 @@ -import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { AttachMoneyOutlined } from '@mui/icons-material'; -import { CSSProperties, FunctionComponent, useContext } from 'react'; +import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import VariablePopover from './VariablePopover'; -import useSearchAnFilter from '../../../../utils/SortingFiltering'; +import { CSSProperties, FunctionComponent, useContext } from 'react'; + import type { Variable } from '../../../../utils/api-types'; +import useSearchAnFilter from '../../../../utils/SortingFiltering'; import { PermissionsContext, VariableContext } from '../../common/Context'; +import VariablePopover from './VariablePopover'; const useStyles = makeStyles(() => ({ itemHead: { @@ -115,7 +116,7 @@ const Variables: FunctionComponent = ({ variables }) => { {filtering.buildHeader( 'variable_key', @@ -136,11 +137,11 @@ const Variables: FunctionComponent = ({ variables }) => { headerStyles, )} - } + )} />   - {sortedVariables.map((variable) => ( + {sortedVariables.map(variable => ( = ({ variables }) => {
    = ({ variables }) => { {variable.variable_value}
    - } + )} /> = ({ }) => { return ( - + {truncate(inject.inject_title, 80)} diff --git a/openbas-front/src/admin/components/injects/InjectTestDetail.tsx b/openbas-front/src/admin/components/injects/InjectTestDetail.tsx index e4a1f2a1a4..c6576572a7 100644 --- a/openbas-front/src/admin/components/injects/InjectTestDetail.tsx +++ b/openbas-front/src/admin/components/injects/InjectTestDetail.tsx @@ -1,14 +1,15 @@ +import { Card, CardContent, CardHeader, Grid, Paper, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { FunctionComponent } from 'react'; -import { Card, CardContent, CardHeader, Grid, Paper, Typography } from '@mui/material'; + +import Drawer from '../../../components/common/Drawer'; import { useFormatter } from '../../../components/i18n'; -import type { InjectTestStatus } from '../../../utils/api-types'; import ItemStatus from '../../../components/ItemStatus'; -import Drawer from '../../../components/common/Drawer'; -import { isNotEmptyField } from '../../../utils/utils'; -import InjectIcon from '../common/injects/InjectIcon'; import type { Theme } from '../../../components/Theme'; +import type { InjectTestStatus } from '../../../utils/api-types'; import { truncate } from '../../../utils/String'; +import { isNotEmptyField } from '../../../utils/utils'; +import InjectIcon from '../common/injects/InjectIcon'; const useStyles = makeStyles((theme: Theme) => ({ paper: { @@ -63,25 +64,27 @@ const InjectTestDetail: FunctionComponent = ({ {test ? ( - } + + )} - /> - ) : ( - - {t('No data available')} - - )} + /> + ) : ( + + {t('No data available')} + + )} {truncate(test?.inject_title, 80)} @@ -94,8 +97,7 @@ const InjectTestDetail: FunctionComponent = ({ {t('Status')} {test.status_name - && - } + && } {t('Traces')} @@ -103,26 +105,42 @@ const InjectTestDetail: FunctionComponent = ({ {test.tracking_sent_date ? ( <> - {t('Tracking Sent Date')}: {test.tracking_sent_date} + {t('Tracking Sent Date')} + : + {test.tracking_sent_date} - {t('Tracking Ack Date')}: {test.tracking_ack_date} + {t('Tracking Ack Date')} + : + {test.tracking_ack_date} - {t('Tracking End Date')}: {test.tracking_end_date} + {t('Tracking End Date')} + : + {test.tracking_end_date} {t('Tracking Total Execution')} - {t('Time')}: {test.tracking_total_execution_time} {t('ms')} + {t('Time')} + : + {test.tracking_total_execution_time} + {' '} + {t('ms')} - {t('Tracking Total Count')}: {test.tracking_total_count} + {t('Tracking Total Count')} + : + {test.tracking_total_count} - {t('Tracking Total Error')}: {test.tracking_total_error} + {t('Tracking Total Error')} + : + {test.tracking_total_error} - {t('Tracking Total Success')}: {test.tracking_total_success} + {t('Tracking Total Success')} + : + {test.tracking_total_success} ) : ( @@ -133,7 +151,8 @@ const InjectTestDetail: FunctionComponent = ({ {(test.status_traces?.length ?? 0) > 0 && ( <> - {t('Traces')}: + {t('Traces')} + :
      {test.status_traces?.map((trace, index) => ( diff --git a/openbas-front/src/admin/components/injects/InjectTestList.tsx b/openbas-front/src/admin/components/injects/InjectTestList.tsx index 953500d50e..71c62197a5 100644 --- a/openbas-front/src/admin/components/injects/InjectTestList.tsx +++ b/openbas-front/src/admin/components/injects/InjectTestList.tsx @@ -1,17 +1,18 @@ +import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; -import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; -import type { InjectTestStatus, SearchPaginationInput } from '../../../utils/api-types'; + +import PaginationComponent from '../../../components/common/pagination/PaginationComponent'; +import SortHeadersComponent from '../../../components/common/pagination/SortHeadersComponent'; +import { Page } from '../../../components/common/queryable/Page'; +import { buildSearchPagination } from '../../../components/common/queryable/QueryableUtils'; +import Empty from '../../../components/Empty'; import { useFormatter } from '../../../components/i18n'; import ItemStatus from '../../../components/ItemStatus'; -import { Page } from '../../../components/common/queryable/Page'; -import SortHeadersComponent from '../../../components/common/pagination/SortHeadersComponent'; -import InjectIcon from '../common/injects/InjectIcon'; +import type { InjectTestStatus, SearchPaginationInput } from '../../../utils/api-types'; import { isNotEmptyField } from '../../../utils/utils'; -import Empty from '../../../components/Empty'; +import InjectIcon from '../common/injects/InjectIcon'; import InjectTestDetail from './InjectTestDetail'; -import PaginationComponent from '../../../components/common/pagination/PaginationComponent'; -import { buildSearchPagination } from '../../../components/common/queryable/QueryableUtils'; import InjectTestPopover from './InjectTestPopover'; import InjectTestReplayAll from './InjectTestReplayAll'; @@ -112,11 +113,11 @@ const InjectTestList: FunctionComponent = ({ return ( <> searchInjectTests(exerciseOrScenarioId, input)} + fetch={input => searchInjectTests(exerciseOrScenarioId, input)} searchPaginationInput={searchPaginationInput} setContent={setTests} > - test.inject_id!)} onTest={(result) => setTests(result)} /> + test.inject_id!)} onTest={result => setTests(result)} /> = ({ > = ({ setSearchPaginationInput={setSearchPaginationInput} defaultSortAsc /> - } + )} /> {tests?.map((test) => { @@ -144,13 +145,13 @@ const InjectTestList: FunctionComponent = ({ key={test.status_id} classes={{ root: classes.item }} divider - secondaryAction={ + secondaryAction={( setTests(tests?.map((existing) => (existing.status_id !== result.status_id ? existing : result)))} - onDelete={(result) => setTests(tests.filter((existing) => (existing.status_id !== result)))} + onTest={result => setTests(tests?.map(existing => (existing.status_id !== result.status_id ? existing : result)))} + onDelete={result => setTests(tests.filter(existing => (existing.status_id !== result)))} /> - } + )} disablePadding > = ({ /> - {headers.map((header) => ( + {headers.map(header => (
      = ({
      ))}
    - } + )} /> diff --git a/openbas-front/src/admin/components/injects/InjectTestPopover.tsx b/openbas-front/src/admin/components/injects/InjectTestPopover.tsx index 4566735972..d870f3504c 100644 --- a/openbas-front/src/admin/components/injects/InjectTestPopover.tsx +++ b/openbas-front/src/admin/components/injects/InjectTestPopover.tsx @@ -1,15 +1,16 @@ -import { FunctionComponent, useContext, useState } from 'react'; -import * as React from 'react'; import { MoreVert } from '@mui/icons-material'; import { IconButton, Menu, MenuItem } from '@mui/material'; -import type { InjectTestStatus } from '../../../utils/api-types'; -import { useFormatter } from '../../../components/i18n'; +import { FunctionComponent, useContext, useState } from 'react'; +import * as React from 'react'; + import { deleteInjectTest } from '../../../actions/inject_test/inject-test-actions'; import { testInject } from '../../../actions/injects/inject-action'; -import { PermissionsContext } from '../common/Context'; import DialogDelete from '../../../components/common/DialogDelete'; import DialogTest from '../../../components/common/DialogTest'; +import { useFormatter } from '../../../components/i18n'; +import type { InjectTestStatus } from '../../../utils/api-types'; import { MESSAGING$ } from '../../../utils/Environment'; +import { PermissionsContext } from '../common/Context'; interface Props { injectTestStatus: InjectTestStatus; diff --git a/openbas-front/src/admin/components/injects/InjectTestReplayAll.tsx b/openbas-front/src/admin/components/injects/InjectTestReplayAll.tsx index ea33da0f63..245475e73c 100644 --- a/openbas-front/src/admin/components/injects/InjectTestReplayAll.tsx +++ b/openbas-front/src/admin/components/injects/InjectTestReplayAll.tsx @@ -1,10 +1,11 @@ -import { FunctionComponent, useState } from 'react'; -import { IconButton, Tooltip } from '@mui/material'; import { ForwardToInbox } from '@mui/icons-material'; -import { useFormatter } from '../../../components/i18n'; -import type { InjectTestStatus } from '../../../utils/api-types'; +import { IconButton, Tooltip } from '@mui/material'; +import { FunctionComponent, useState } from 'react'; + import { bulkTestInjects } from '../../../actions/injects/inject-action'; import DialogTest from '../../../components/common/DialogTest'; +import { useFormatter } from '../../../components/i18n'; +import type { InjectTestStatus } from '../../../utils/api-types'; import { MESSAGING$ } from '../../../utils/Environment'; interface Props { diff --git a/openbas-front/src/admin/components/integrations/Collectors.tsx b/openbas-front/src/admin/components/integrations/Collectors.tsx index c1cdd9ee68..ef97c09343 100644 --- a/openbas-front/src/admin/components/integrations/Collectors.tsx +++ b/openbas-front/src/admin/components/integrations/Collectors.tsx @@ -1,16 +1,17 @@ -import { makeStyles } from '@mui/styles'; import { Card, CardContent, Chip, Grid, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; + +import { fetchCollectors } from '../../../actions/Collector'; +import type { CollectorHelper } from '../../../actions/collectors/collector-helper'; +import Breadcrumbs from '../../../components/Breadcrumbs'; import { useFormatter } from '../../../components/i18n'; +import SearchFilter from '../../../components/SearchFilter'; +import type { Theme } from '../../../components/Theme'; import { useHelper } from '../../../store'; -import useDataLoader from '../../../utils/hooks/useDataLoader'; -import { useAppDispatch } from '../../../utils/hooks'; import type { Collector } from '../../../utils/api-types'; -import type { CollectorHelper } from '../../../actions/collectors/collector-helper'; -import { fetchCollectors } from '../../../actions/Collector'; +import { useAppDispatch } from '../../../utils/hooks'; +import useDataLoader from '../../../utils/hooks/useDataLoader'; import useSearchAnFilter from '../../../utils/SortingFiltering'; -import SearchFilter from '../../../components/SearchFilter'; -import type { Theme } from '../../../components/Theme'; -import Breadcrumbs from '../../../components/Breadcrumbs'; const useStyles = makeStyles((theme: Theme) => ({ parameters: { @@ -118,9 +119,9 @@ const Collectors = () => { />
    { - (collector.collector_external && collector.collector_updated_at) || !collector.collector_external - ?
    :
    - } + (collector.collector_external && collector.collector_updated_at) || !collector.collector_external + ?
    :
    + } { textOverflow: 'ellipsis', }} > - {t('Updated at')} {nsdt(collector.collector_updated_at)} + {t('Updated at')} + {' '} + {nsdt(collector.collector_updated_at)}
    diff --git a/openbas-front/src/admin/components/integrations/Executors.tsx b/openbas-front/src/admin/components/integrations/Executors.tsx index b7d0cf8d5e..0da8896500 100644 --- a/openbas-front/src/admin/components/integrations/Executors.tsx +++ b/openbas-front/src/admin/components/integrations/Executors.tsx @@ -1,16 +1,17 @@ -import { makeStyles } from '@mui/styles'; import { Card, CardContent, Chip, Grid, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; + +import { fetchExecutors } from '../../../actions/Executor'; +import type { ExecutorHelper } from '../../../actions/executors/executor-helper'; +import Breadcrumbs from '../../../components/Breadcrumbs'; import { useFormatter } from '../../../components/i18n'; +import SearchFilter from '../../../components/SearchFilter'; +import type { Theme } from '../../../components/Theme'; import { useHelper } from '../../../store'; -import useDataLoader from '../../../utils/hooks/useDataLoader'; -import { useAppDispatch } from '../../../utils/hooks'; import type { Executor } from '../../../utils/api-types'; -import type { ExecutorHelper } from '../../../actions/executors/executor-helper'; -import { fetchExecutors } from '../../../actions/Executor'; +import { useAppDispatch } from '../../../utils/hooks'; +import useDataLoader from '../../../utils/hooks/useDataLoader'; import useSearchAnFilter from '../../../utils/SortingFiltering'; -import SearchFilter from '../../../components/SearchFilter'; -import type { Theme } from '../../../components/Theme'; -import Breadcrumbs from '../../../components/Breadcrumbs'; const useStyles = makeStyles((theme: Theme) => ({ parameters: { @@ -107,7 +108,7 @@ const Executors = () => { variant="outlined" classes={{ root: classes.chipInList }} style={{ width: 120 }} - color='secondary' + color="secondary" label={t('Built-in')} />
    @@ -121,7 +122,9 @@ const Executors = () => { textOverflow: 'ellipsis', }} > - {t('Updated at')} {nsdt(executor.executor_updated_at)} + {t('Updated at')} + {' '} + {nsdt(executor.executor_updated_at)}
    diff --git a/openbas-front/src/admin/components/integrations/Index.tsx b/openbas-front/src/admin/components/integrations/Index.tsx index f3b00e085d..40a49f7e52 100644 --- a/openbas-front/src/admin/components/integrations/Index.tsx +++ b/openbas-front/src/admin/components/integrations/Index.tsx @@ -1,6 +1,7 @@ -import { Suspense, lazy } from 'react'; import { makeStyles } from '@mui/styles'; +import { lazy, Suspense } from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; + import { errorWrapper } from '../../../components/Error'; import Loader from '../../../components/Loader'; import NotFound from '../../../components/NotFound'; @@ -28,7 +29,7 @@ const Index = () => { {/* Not found */} - }/> + } />
    diff --git a/openbas-front/src/admin/components/integrations/Injectors.tsx b/openbas-front/src/admin/components/integrations/Injectors.tsx index 5375044177..ef08f194b1 100644 --- a/openbas-front/src/admin/components/integrations/Injectors.tsx +++ b/openbas-front/src/admin/components/integrations/Injectors.tsx @@ -1,18 +1,19 @@ +import { AutoModeOutlined, SubscriptionsOutlined } from '@mui/icons-material'; +import { Card, CardActionArea, CardContent, Chip, Grid, Tooltip, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { Link } from 'react-router-dom'; -import { Card, CardActionArea, CardContent, Chip, Grid, Tooltip, Typography } from '@mui/material'; -import { AutoModeOutlined, SubscriptionsOutlined } from '@mui/icons-material'; + +import { fetchInjectors } from '../../../actions/Injectors'; +import type { InjectorHelper } from '../../../actions/injectors/injector-helper'; +import Breadcrumbs from '../../../components/Breadcrumbs'; import { useFormatter } from '../../../components/i18n'; +import SearchFilter from '../../../components/SearchFilter'; +import type { Theme } from '../../../components/Theme'; import { useHelper } from '../../../store'; -import useDataLoader from '../../../utils/hooks/useDataLoader'; -import { useAppDispatch } from '../../../utils/hooks'; import type { Injector } from '../../../utils/api-types'; -import type { InjectorHelper } from '../../../actions/injectors/injector-helper'; -import { fetchInjectors } from '../../../actions/Injectors'; +import { useAppDispatch } from '../../../utils/hooks'; +import useDataLoader from '../../../utils/hooks/useDataLoader'; import useSearchAnFilter from '../../../utils/SortingFiltering'; -import SearchFilter from '../../../components/SearchFilter'; -import type { Theme } from '../../../components/Theme'; -import Breadcrumbs from '../../../components/Breadcrumbs'; const useStyles = makeStyles((theme: Theme) => ({ parameters: { @@ -138,9 +139,9 @@ const Injectors = () => { />
    { - (injector.injector_external && injector.injector_updated_at) || !injector.injector_external - ?
    :
    - } + (injector.injector_external && injector.injector_updated_at) || !injector.injector_external + ?
    :
    + } { textOverflow: 'ellipsis', }} > - {t('Updated at')} {nsdt(injector.injector_updated_at)} + {t('Updated at')} + {' '} + {nsdt(injector.injector_updated_at)}
    - {injector.injector_custom_contracts &&
    - - - -
    } - {injector.injector_payloads &&
    - - - -
    } + {injector.injector_custom_contracts && ( +
    + + + +
    + )} + {injector.injector_payloads && ( +
    + + + +
    + )} diff --git a/openbas-front/src/admin/components/integrations/injectors/Index.tsx b/openbas-front/src/admin/components/integrations/injectors/Index.tsx index ef329c06ae..060e40ed9f 100644 --- a/openbas-front/src/admin/components/integrations/injectors/Index.tsx +++ b/openbas-front/src/admin/components/integrations/injectors/Index.tsx @@ -1,18 +1,19 @@ +import { makeStyles } from '@mui/styles'; import { lazy } from 'react'; import { Route, Routes, useParams } from 'react-router-dom'; -import { makeStyles } from '@mui/styles'; + import { fetchInjector } from '../../../../actions/Injectors'; -import Loader from '../../../../components/Loader'; -import InjectorHeader from './InjectorHeader'; -import { errorWrapper } from '../../../../components/Error'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../../store'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { Injector as InjectorType } from '../../../../utils/api-types'; -import NotFound from '../../../../components/NotFound'; import type { InjectorHelper } from '../../../../actions/injectors/injector-helper'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { errorWrapper } from '../../../../components/Error'; import { useFormatter } from '../../../../components/i18n'; +import Loader from '../../../../components/Loader'; +import NotFound from '../../../../components/NotFound'; +import { useHelper } from '../../../../store'; +import type { Injector as InjectorType } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import InjectorHeader from './InjectorHeader'; const useStyles = makeStyles(() => ({ root: { @@ -49,7 +50,7 @@ const Index = () => { {/* Not found */} - }/> + } />
    ); diff --git a/openbas-front/src/admin/components/integrations/injectors/InjectorContracts.js b/openbas-front/src/admin/components/integrations/injectors/InjectorContracts.js index 6402bd1bda..def614c878 100644 --- a/openbas-front/src/admin/components/integrations/injectors/InjectorContracts.js +++ b/openbas-front/src/admin/components/integrations/injectors/InjectorContracts.js @@ -1,21 +1,22 @@ -import { useState } from 'react'; -import { useDispatch } from 'react-redux'; -import * as R from 'ramda'; +import { SmartButtonOutlined } from '@mui/icons-material'; import { Chip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { useState } from 'react'; +import { useDispatch } from 'react-redux'; import { useParams } from 'react-router-dom'; -import { SmartButtonOutlined } from '@mui/icons-material'; -import CreateInjectorContract from './injector_contracts/CreateInjectorContract'; -import InjectorContractPopover from './injector_contracts/InjectorContractPopover'; + +import { fetchAttackPatterns } from '../../../../actions/AttackPattern'; +import { searchInjectorContracts } from '../../../../actions/InjectorContracts'; +import { fetchKillChainPhases } from '../../../../actions/KillChainPhase'; import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; import { initSorting } from '../../../../components/common/queryable/Page'; import { useFormatter } from '../../../../components/i18n'; import { useHelper } from '../../../../store'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchKillChainPhases } from '../../../../actions/KillChainPhase'; -import { fetchAttackPatterns } from '../../../../actions/AttackPattern'; -import { searchInjectorContracts } from '../../../../actions/InjectorContracts'; +import CreateInjectorContract from './injector_contracts/CreateInjectorContract'; +import InjectorContractPopover from './injector_contracts/InjectorContractPopover'; const useStyles = makeStyles(() => ({ container: { @@ -103,7 +104,7 @@ const InjectorContracts = () => { const dispatch = useDispatch(); const { injectorId } = useParams(); const { t, tPick, nsdt } = useFormatter(); - const { injector, attackPatternsMap, killChainPhasesMap } = useHelper((helper) => ({ + const { injector, attackPatternsMap, killChainPhasesMap } = useHelper(helper => ({ injector: helper.getInjector(injectorId), attackPatternsMap: helper.getAttackPatternsMap(), killChainPhasesMap: helper.getKillChainPhasesMap(), @@ -174,18 +175,18 @@ const InjectorContracts = () => { - } + )} />   - {injectorContracts.map((injectorContract) => ( + {injectorContracts.map(injectorContract => ( {
    { > { R.uniq(injectorContract.injector_contract_attack_patterns.map( - (n) => attackPatternsMap[n]?.attack_pattern_kill_chain_phases ?? [], - ).flat().map((o) => killChainPhasesMap[o]?.phase_kill_chain_name ?? '')).map((killChain) => { + n => attackPatternsMap[n]?.attack_pattern_kill_chain_phases ?? [], + ).flat().map(o => killChainPhasesMap[o]?.phase_kill_chain_name ?? '')).map((killChain) => { return ( { className={classes.bodyItem} style={inlineStyles.attack_patterns} > - {injectorContract.injector_contract_attack_patterns.map((n) => `[${attackPatternsMap[n]?.attack_pattern_external_id ?? ''}] ${attackPatternsMap[n]?.attack_pattern_name ?? ''}`).join(', ')} + {injectorContract.injector_contract_attack_patterns.map(n => `[${attackPatternsMap[n]?.attack_pattern_external_id ?? ''}] ${attackPatternsMap[n]?.attack_pattern_name ?? ''}`).join(', ')}
    { {nsdt(injectorContract.injector_contract_updated_at)}
    - } + )} /> setInjectorContracts(injectorContracts.map((ic) => (ic.injector_contract_id !== result.injector_contract_id ? ic : result)))} + onUpdate={result => setInjectorContracts(injectorContracts.map(ic => (ic.injector_contract_id !== result.injector_contract_id ? ic : result)))} /> diff --git a/openbas-front/src/admin/components/integrations/injectors/InjectorHeader.js b/openbas-front/src/admin/components/integrations/injectors/InjectorHeader.js index cd9b6d8c40..e414dbac85 100644 --- a/openbas-front/src/admin/components/integrations/injectors/InjectorHeader.js +++ b/openbas-front/src/admin/components/integrations/injectors/InjectorHeader.js @@ -1,6 +1,7 @@ -import { makeStyles } from '@mui/styles'; import { Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; + import { useHelper } from '../../../../store'; const useStyles = makeStyles(() => ({ @@ -12,7 +13,7 @@ const useStyles = makeStyles(() => ({ const InjectorHeader = () => { const classes = useStyles(); const { injectorId } = useParams(); - const { injector } = useHelper((helper) => ({ + const { injector } = useHelper(helper => ({ injector: helper.getInjector(injectorId), })); return ( diff --git a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/CreateInjectorContract.js b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/CreateInjectorContract.js index 79d7504f12..a76feec231 100644 --- a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/CreateInjectorContract.js +++ b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/CreateInjectorContract.js @@ -1,15 +1,16 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { v4 as uuid } from 'uuid'; -import { connect } from 'react-redux'; -import * as R from 'ramda'; +import { Add, SmartButtonOutlined } from '@mui/icons-material'; import { Fab, List, ListItemButton, ListItemIcon, ListItemText, Step, StepLabel, Stepper } from '@mui/material'; import { withStyles } from '@mui/styles'; -import { Add, SmartButtonOutlined } from '@mui/icons-material'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; +import { connect } from 'react-redux'; +import { v4 as uuid } from 'uuid'; + import { addInjectorContract } from '../../../../../actions/InjectorContracts'; +import Drawer from '../../../../../components/common/Drawer'; import inject18n from '../../../../../components/i18n'; import InjectorContractCustomForm from './InjectorContractCustomForm'; -import Drawer from '../../../../../components/common/Drawer'; const styles = () => ({ createButton: { @@ -44,7 +45,7 @@ class CreateInjectorContract extends Component { onSubmit(data, fields) { const { injector, injectorContracts } = this.props; const { selectedInjectorContract } = this.state; - const injectorContract = injectorContracts.filter((n) => n.injector_contract_id === selectedInjectorContract).at(0); + const injectorContract = injectorContracts.filter(n => n.injector_contract_id === selectedInjectorContract).at(0); const injectorContractContent = JSON.parse(injectorContract.injector_contract_content); const newInjectorContractContent = { ...injectorContractContent, @@ -70,7 +71,7 @@ class CreateInjectorContract extends Component { )(data); return this.props .addInjectorContract(inputValues) - .then((result) => (result.result ? this.handleClose() : result)); + .then(result => (result.result ? this.handleClose() : result)); } renderInjectorContracts() { @@ -116,10 +117,10 @@ class CreateInjectorContract extends Component { <> - {t('Select the template')} + {t('Select the template')} - {t('Create the injector contract')} + {t('Create the injector contract')} {activeStep === 0 && this.renderInjectorContracts()} @@ -129,7 +130,7 @@ class CreateInjectorContract extends Component { onSubmit={this.onSubmit.bind(this)} initialValues={{ injector_contract_attack_patterns: [] }} handleClose={this.handleClose.bind(this)} - contractTemplate={injectorContracts.filter((n) => n.injector_contract_id === selectedInjectorContract).at(0)} + contractTemplate={injectorContracts.filter(n => n.injector_contract_id === selectedInjectorContract).at(0)} /> )} diff --git a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractCustomForm.js b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractCustomForm.js index 40153526ce..40147f2e3f 100644 --- a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractCustomForm.js +++ b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractCustomForm.js @@ -1,15 +1,17 @@ -import { useState } from 'react'; -import * as R from 'ramda'; -import * as PropTypes from 'prop-types'; -import { Form } from 'react-final-form'; -import { CKEditor } from '@ckeditor/ckeditor5-react'; -import Editor from 'ckeditor5-custom-build/build/ckeditor'; import 'ckeditor5-custom-build/build/translations/fr'; -import { Button, Typography, Grid, Switch, TextField as MUITextField } from '@mui/material'; + +import { CKEditor } from '@ckeditor/ckeditor5-react'; +import { Button, Grid, Switch, TextField as MUITextField, Typography } from '@mui/material'; import { useTheme } from '@mui/styles'; +import Editor from 'ckeditor5-custom-build/build/ckeditor'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { useState } from 'react'; +import { Form } from 'react-final-form'; + +import OldTextField from '../../../../../components/fields/OldTextField'; import { useFormatter } from '../../../../../components/i18n'; import OldAttackPatternField from '../../../../../components/OldAttackPatternField'; -import OldTextField from '../../../../../components/fields/OldTextField'; const InjectorContractForm = (props) => { const { onSubmit, initialValues, editing, handleClose, contractTemplate } = props; @@ -30,29 +32,31 @@ const InjectorContractForm = (props) => { const renderField = (field) => { switch (field.type) { case 'textarea': - return field.richText ? ( - { - setFields({ ...fields, [field.key]: { defaultValue: editor.getData() } }); - }} - /> - ) : ( - setFields({ ...fields, [field.key]: { defaultValue: event.target.value } })} - /> - ); + return field.richText + ? ( + { + setFields({ ...fields, [field.key]: { defaultValue: editor.getData() } }); + }} + /> + ) + : ( + setFields({ ...fields, [field.key]: { defaultValue: event.target.value } })} + /> + ); case 'number': return ( { type="number" style={{ marginTop: 5 }} value={!R.isNil(fields[field.key]?.defaultValue) ? fields[field.key].defaultValue : field.defaultValue} - onChange={(event) => setFields({ ...fields, [field.key]: { defaultValue: event.target.value } })} + onChange={event => setFields({ ...fields, [field.key]: { defaultValue: event.target.value } })} /> ); default: @@ -71,7 +75,7 @@ const InjectorContractForm = (props) => { fullWidth={true} style={{ marginTop: 5 }} value={!R.isNil(fields[field.key]?.defaultValue) ? fields[field.key].defaultValue : field.defaultValue} - onChange={(event) => setFields({ ...fields, [field.key]: { defaultValue: event.target.value } })} + onChange={event => setFields({ ...fields, [field.key]: { defaultValue: event.target.value } })} /> ); } @@ -80,7 +84,7 @@ const InjectorContractForm = (props) => {
    onSubmit(data, fields)} + onSubmit={data => onSubmit(data, fields)} validate={validate} mutators={{ setValue: ([field, value], state, { changeValue }) => { @@ -134,7 +138,7 @@ const InjectorContractForm = (props) => { setFields({ ...fields, [field.key]: { readOnly: event.target.checked } })} + onChange={event => setFields({ ...fields, [field.key]: { readOnly: event.target.checked } })} /> diff --git a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractForm.js b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractForm.js index a99c410d90..7231fdb166 100644 --- a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractForm.js +++ b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractForm.js @@ -1,6 +1,7 @@ +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import { useFormatter } from '../../../../../components/i18n'; import OldAttackPatternField from '../../../../../components/OldAttackPatternField'; diff --git a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractPopover.js b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractPopover.js index c8d3b56b1d..ce67150810 100644 --- a/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractPopover.js +++ b/openbas-front/src/admin/components/integrations/injectors/injector_contracts/InjectorContractPopover.js @@ -1,15 +1,16 @@ +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; +import * as R from 'ramda'; import { useState } from 'react'; import { useDispatch } from 'react-redux'; -import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; -import InjectorContractForm from './InjectorContractForm'; + +import { deleteInjectorContract, updateInjectorContract, updateInjectorContractMapping } from '../../../../../actions/InjectorContracts'; +import Drawer from '../../../../../components/common/Drawer'; +import Transition from '../../../../../components/common/Transition'; import { useFormatter } from '../../../../../components/i18n'; import { attackPatternOptions } from '../../../../../utils/Option'; -import Transition from '../../../../../components/common/Transition'; -import { deleteInjectorContract, updateInjectorContract, updateInjectorContractMapping } from '../../../../../actions/InjectorContracts'; import InjectorContractCustomForm from './InjectorContractCustomForm'; -import Drawer from '../../../../../components/common/Drawer'; +import InjectorContractForm from './InjectorContractForm'; const InjectorContractPopover = ({ injectorContract, killChainPhasesMap, attackPatternsMap, onUpdate }) => { const [openDelete, setOpenDelete] = useState(false); diff --git a/openbas-front/src/admin/components/lessons/CreateObjective.js b/openbas-front/src/admin/components/lessons/CreateObjective.js index 4126a82b6d..3945f3bca5 100644 --- a/openbas-front/src/admin/components/lessons/CreateObjective.js +++ b/openbas-front/src/admin/components/lessons/CreateObjective.js @@ -1,13 +1,14 @@ -import { Component } from 'react'; +import { Add } from '@mui/icons-material'; +import { Dialog, DialogContent, DialogTitle, IconButton } from '@mui/material'; +import { withStyles } from '@mui/styles'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; -import { withStyles } from '@mui/styles'; -import { Dialog, DialogContent, DialogTitle, IconButton } from '@mui/material'; -import { Add } from '@mui/icons-material'; +import { Component } from 'react'; + +import Transition from '../../../components/common/Transition'; import inject18n from '../../../components/i18n'; import { LessonContext } from '../common/Context'; import ObjectiveForm from './ObjectiveForm'; -import Transition from '../../../components/common/Transition'; const styles = () => ({ createButton: { diff --git a/openbas-front/src/admin/components/lessons/ObjectiveEvaluations.js b/openbas-front/src/admin/components/lessons/ObjectiveEvaluations.js index dc1ea9ae88..7e0161ddd0 100644 --- a/openbas-front/src/admin/components/lessons/ObjectiveEvaluations.js +++ b/openbas-front/src/admin/components/lessons/ObjectiveEvaluations.js @@ -1,12 +1,13 @@ -import { useContext, useState } from 'react'; -import { Box, Button, LinearProgress, List, ListItem, ListItemIcon, ListItemText, Slider, Typography } from '@mui/material'; import { HowToVoteOutlined } from '@mui/icons-material'; +import { Box, Button, LinearProgress, List, ListItem, ListItemIcon, ListItemText, Slider, Typography } from '@mui/material'; import * as R from 'ramda'; +import { useContext, useState } from 'react'; + import { useFormatter } from '../../../components/i18n'; +import Loader from '../../../components/Loader'; import { useHelper } from '../../../store'; import useDataLoader from '../../../utils/hooks/useDataLoader'; import { resolveUserName } from '../../../utils/String'; -import Loader from '../../../components/Loader'; import { LessonContext } from '../common/Context'; const ObjectiveEvaluations = ({ objectiveId, handleClose, isUpdatable }) => { @@ -35,7 +36,7 @@ const ObjectiveEvaluations = ({ objectiveId, handleClose, isUpdatable }) => { onFetchEvaluation(objectiveId); }); const currentUserEvaluation = R.head( - R.filter((n) => n.evaluation_user === me.user_id, evaluations), + R.filter(n => n.evaluation_user === me.user_id, evaluations), ); const submitEvaluation = () => { setSubmitting(true); @@ -70,7 +71,7 @@ const ObjectiveEvaluations = ({ objectiveId, handleClose, isUpdatable }) => {
    {evaluations.length > 0 ? ( - {evaluations.map((evaluation) => ( + {evaluations.map(evaluation => ( @@ -95,7 +96,8 @@ const ObjectiveEvaluations = ({ objectiveId, handleClose, isUpdatable }) => { - {evaluation.evaluation_score}% + {evaluation.evaluation_score} + % diff --git a/openbas-front/src/admin/components/lessons/ObjectiveForm.js b/openbas-front/src/admin/components/lessons/ObjectiveForm.js index 3ca507a35e..bf3d1efc07 100644 --- a/openbas-front/src/admin/components/lessons/ObjectiveForm.js +++ b/openbas-front/src/admin/components/lessons/ObjectiveForm.js @@ -1,7 +1,8 @@ -import { Component } from 'react'; +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import OldTextField from '../../../components/fields/OldTextField'; import inject18n from '../../../components/i18n'; diff --git a/openbas-front/src/admin/components/lessons/ObjectivePopover.js b/openbas-front/src/admin/components/lessons/ObjectivePopover.js index 96a2c71b32..d0e1c6cdd3 100644 --- a/openbas-front/src/admin/components/lessons/ObjectivePopover.js +++ b/openbas-front/src/admin/components/lessons/ObjectivePopover.js @@ -1,12 +1,13 @@ -import { Component } from 'react'; +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem } from '@mui/material'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; -import ObjectiveForm from './ObjectiveForm'; -import inject18n from '../../../components/i18n'; +import { Component } from 'react'; + import Transition from '../../../components/common/Transition'; +import inject18n from '../../../components/i18n'; import { LessonContext } from '../common/Context'; +import ObjectiveForm from './ObjectiveForm'; class ObjectivePopover extends Component { // Context diff --git a/openbas-front/src/admin/components/lessons/SendLessonsForm.js b/openbas-front/src/admin/components/lessons/SendLessonsForm.js index 0ffbe0ad6d..1468e3544e 100644 --- a/openbas-front/src/admin/components/lessons/SendLessonsForm.js +++ b/openbas-front/src/admin/components/lessons/SendLessonsForm.js @@ -1,10 +1,11 @@ -import { Component } from 'react'; +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import OldTextField from '../../../components/fields/OldTextField'; -import inject18n from '../../../components/i18n'; import RichTextField from '../../../components/fields/RichTextField'; +import inject18n from '../../../components/i18n'; class SendLessonsForm extends Component { validate(values) { diff --git a/openbas-front/src/admin/components/lessons/categories/CreateLessonsCategory.js b/openbas-front/src/admin/components/lessons/categories/CreateLessonsCategory.js index 700a0161c8..17f288a3eb 100644 --- a/openbas-front/src/admin/components/lessons/categories/CreateLessonsCategory.js +++ b/openbas-front/src/admin/components/lessons/categories/CreateLessonsCategory.js @@ -1,18 +1,19 @@ -import { forwardRef, useContext, useState } from 'react'; -import { Dialog, DialogContent, DialogTitle, ListItem, ListItemIcon, ListItemText, Slide } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; +import { Dialog, DialogContent, DialogTitle, ListItem, ListItemIcon, ListItemText, Slide } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { useFormatter } from '../../../../components/i18n'; -import LessonsCategoryForm from './LessonsCategoryForm'; +import { forwardRef, useContext, useState } from 'react'; + import ButtonCreate from '../../../../components/common/ButtonCreate'; +import { useFormatter } from '../../../../components/i18n'; import { LessonContext } from '../../common/Context'; +import LessonsCategoryForm from './LessonsCategoryForm'; const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ text: { fontSize: 15, color: theme.palette.primary.main, diff --git a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryAddTeams.js b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryAddTeams.js index c832ba45f2..83ec1f50fb 100644 --- a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryAddTeams.js +++ b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryAddTeams.js @@ -1,18 +1,19 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import * as R from 'ramda'; -import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, IconButton, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { Add, CastForEducationOutlined } from '@mui/icons-material'; +import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, IconButton, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { withStyles } from '@mui/styles'; -import SearchFilter from '../../../../components/SearchFilter'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; + +import Transition from '../../../../components/common/Transition'; import inject18n from '../../../../components/i18n'; -import CreateTeam from '../../components/teams/CreateTeam'; +import ItemTags from '../../../../components/ItemTags'; +import SearchFilter from '../../../../components/SearchFilter'; import { truncate } from '../../../../utils/String'; import TagsFilter from '../../common/filters/TagsFilter'; -import ItemTags from '../../../../components/ItemTags'; -import Transition from '../../../../components/common/Transition'; +import CreateTeam from '../../components/teams/CreateTeam'; -const styles = (theme) => ({ +const styles = theme => ({ createButton: { float: 'left', margin: '-15px 0 0 5px', @@ -79,8 +80,8 @@ class LessonsCategoryAddTeams extends Component { addAllTeams() { const { lessonsCategoryTeamsIds, teams } = this.props; const teamsToAdd = R.pipe( - R.map((n) => n.team_id), - R.filter((n) => !lessonsCategoryTeamsIds.includes(n)), + R.map(n => n.team_id), + R.filter(n => !lessonsCategoryTeamsIds.includes(n)), )(teams); this.setState({ teamsIds: teamsToAdd, @@ -89,7 +90,7 @@ class LessonsCategoryAddTeams extends Component { removeTeam(teamId) { this.setState({ - teamsIds: R.filter((u) => u !== teamId, this.state.teamsIds), + teamsIds: R.filter(u => u !== teamId, this.state.teamsIds), }); } @@ -119,7 +120,7 @@ class LessonsCategoryAddTeams extends Component { teamsMap, } = this.props; const { keyword, teamsIds, tags } = this.state; - const filterByKeyword = (n) => keyword === '' + const filterByKeyword = n => keyword === '' || (n.team_name || '').toLowerCase().indexOf(keyword.toLowerCase()) !== -1 || (n.team_description || '') @@ -127,9 +128,9 @@ class LessonsCategoryAddTeams extends Component { .indexOf(keyword.toLowerCase()) !== -1; const filteredTeams = R.pipe( R.filter( - (n) => tags.length === 0 + n => tags.length === 0 || R.any( - (filter) => R.includes(filter, n.team_tags), + filter => R.includes(filter, n.team_tags), R.pluck('id', tags), ), ), diff --git a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryForm.js b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryForm.js index 5c48fb9f96..1fe9ee5453 100644 --- a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryForm.js +++ b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryForm.js @@ -1,5 +1,6 @@ -import { Form } from 'react-final-form'; import { Button } from '@mui/material'; +import { Form } from 'react-final-form'; + import OldTextField from '../../../../components/fields/OldTextField'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryPopover.js b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryPopover.js index 8a938bd873..985b20c569 100644 --- a/openbas-front/src/admin/components/lessons/categories/LessonsCategoryPopover.js +++ b/openbas-front/src/admin/components/lessons/categories/LessonsCategoryPopover.js @@ -1,11 +1,12 @@ -import { forwardRef, useContext, useState } from 'react'; -import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import LessonsCategoryForm from './LessonsCategoryForm'; +import * as R from 'ramda'; +import { forwardRef, useContext, useState } from 'react'; + import { useFormatter } from '../../../../components/i18n'; import { LessonContext } from '../../common/Context'; +import LessonsCategoryForm from './LessonsCategoryForm'; const Transition = forwardRef((props, ref) => ( diff --git a/openbas-front/src/admin/components/lessons/categories/questions/CreateLessonsQuestion.js b/openbas-front/src/admin/components/lessons/categories/questions/CreateLessonsQuestion.js index 92b9c7b9cc..c660c1ca80 100644 --- a/openbas-front/src/admin/components/lessons/categories/questions/CreateLessonsQuestion.js +++ b/openbas-front/src/admin/components/lessons/categories/questions/CreateLessonsQuestion.js @@ -1,17 +1,18 @@ -import { forwardRef, useContext, useState } from 'react'; -import { IconButton, Dialog, DialogTitle, DialogContent, Slide, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { Add, ControlPointOutlined } from '@mui/icons-material'; +import { Dialog, DialogContent, DialogTitle, IconButton, ListItem, ListItemIcon, ListItemText, Slide } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { forwardRef, useContext, useState } from 'react'; + import { useFormatter } from '../../../../../components/i18n'; -import LessonsQuestionForm from './LessonsQuestionForm'; import { LessonContext } from '../../../common/Context'; +import LessonsQuestionForm from './LessonsQuestionForm'; const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ createButton: { float: 'left', margin: '-15px 0 0 5px', diff --git a/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionForm.js b/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionForm.js index 52bef68f77..b6d357a3c8 100644 --- a/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionForm.js +++ b/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionForm.js @@ -1,5 +1,6 @@ -import { Form } from 'react-final-form'; import { Button } from '@mui/material'; +import { Form } from 'react-final-form'; + import OldTextField from '../../../../../components/fields/OldTextField'; import { useFormatter } from '../../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionPopover.js b/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionPopover.js index 74a28c7f34..8b7ff38712 100644 --- a/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionPopover.js +++ b/openbas-front/src/admin/components/lessons/categories/questions/LessonsQuestionPopover.js @@ -1,10 +1,11 @@ -import { forwardRef, useContext, useState } from 'react'; -import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; -import LessonsQuestionForm from './LessonsQuestionForm'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; +import * as R from 'ramda'; +import { forwardRef, useContext, useState } from 'react'; + import { useFormatter } from '../../../../../components/i18n'; import { LessonContext } from '../../../common/Context'; +import LessonsQuestionForm from './LessonsQuestionForm'; const Transition = forwardRef((props, ref) => ( diff --git a/openbas-front/src/admin/components/lessons/exercises/AnswersByQuestionDialog.tsx b/openbas-front/src/admin/components/lessons/exercises/AnswersByQuestionDialog.tsx index b6702a2b82..3344a1cb6e 100644 --- a/openbas-front/src/admin/components/lessons/exercises/AnswersByQuestionDialog.tsx +++ b/openbas-front/src/admin/components/lessons/exercises/AnswersByQuestionDialog.tsx @@ -1,18 +1,18 @@ -import * as React from 'react'; import { Button, LinearProgress, Typography, useTheme } from '@mui/material'; -import Dialog from '../../../../components/common/Dialog'; +import * as React from 'react'; +import Dialog from '../../../../components/common/Dialog'; +import { useFormatter } from '../../../../components/i18n'; import type { LessonsAnswer, User } from '../../../../utils/api-types'; import { resolveUserName } from '../../../../utils/String'; -import { useFormatter } from '../../../../components/i18n'; interface Props { - open: boolean, - onClose: ()=>void, - question: string, - answers: LessonsAnswer[], - anonymized: boolean, - usersMap: Record + open: boolean; + onClose: () => void; + question: string; + answers: LessonsAnswer[]; + anonymized: boolean; + usersMap: Record; } const AnswersByQuestionDialog: React.FC = ({ open, onClose, question, answers, anonymized, usersMap }) => { @@ -24,7 +24,7 @@ const AnswersByQuestionDialog: React.FC = ({ open, onClose, question, ans open={open} handleClose={onClose} title={question} - maxWidth={'lg'} + maxWidth="lg" >
    @@ -33,7 +33,8 @@ const AnswersByQuestionDialog: React.FC = ({ open, onClose, question, ans if (anonymized) userName = t('Anonymized'); if (!anonymized && answer.lessons_answer_user) userName = resolveUserName(usersMap[answer.lessons_answer_user as string]); return ( -
    = ({ open, onClose, question, ans }} /> - {answer.lessons_answer_score}% + {answer.lessons_answer_score} + %
    {answer.lessons_answer_positive} @@ -67,7 +69,11 @@ const AnswersByQuestionDialog: React.FC = ({ open, onClose, question, ans
    ); })} - +
    diff --git a/openbas-front/src/admin/components/lessons/exercises/Lessons.tsx b/openbas-front/src/admin/components/lessons/exercises/Lessons.tsx index bcb3dd920b..de2be3b050 100644 --- a/openbas-front/src/admin/components/lessons/exercises/Lessons.tsx +++ b/openbas-front/src/admin/components/lessons/exercises/Lessons.tsx @@ -1,5 +1,3 @@ -import { useContext, useState } from 'react'; -import * as React from 'react'; import { BallotOutlined, ContactMailOutlined, @@ -9,7 +7,6 @@ import { SportsScoreOutlined, VisibilityOutlined, } from '@mui/icons-material'; -import * as R from 'ramda'; import { Alert, Button, @@ -31,17 +28,21 @@ import { useTheme, } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import ObjectiveEvaluations from '../ObjectiveEvaluations'; -import CreateLessonsCategory from '../categories/CreateLessonsCategory'; -import SendLessonsForm from '../SendLessonsForm'; -import LessonsObjectives from './LessonsObjectives'; -import LessonsCategories from './LessonsCategories'; +import * as R from 'ramda'; +import { useContext, useState } from 'react'; +import * as React from 'react'; + +import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; import type { Inject, LessonsAnswer, LessonsCategory, LessonsQuestion, LessonsSendInput, LessonsTemplate, Objective, Team, User } from '../../../../utils/api-types'; -import Transition from '../../../../components/common/Transition'; -import CreateLessonsTemplate from '../../components/lessons/CreateLessonsTemplate'; import { LessonContext } from '../../common/Context'; +import CreateLessonsTemplate from '../../components/lessons/CreateLessonsTemplate'; +import CreateLessonsCategory from '../categories/CreateLessonsCategory'; +import ObjectiveEvaluations from '../ObjectiveEvaluations'; +import SendLessonsForm from '../SendLessonsForm'; import AnswersByQuestionDialog from './AnswersByQuestionDialog'; +import LessonsCategories from './LessonsCategories'; +import LessonsObjectives from './LessonsObjectives'; const useStyles = makeStyles((theme: Theme) => ({ metric: { @@ -97,16 +98,16 @@ interface GenericSource { } interface Props { - source: GenericSource, - objectives: Objective[], - injects: Inject[], - teamsMap: Record, - teams: Team[], - lessonsCategories: LessonsCategory[], - lessonsQuestions: LessonsQuestion[], - lessonsAnswers: LessonsAnswer[], - lessonsTemplates: LessonsTemplate[], - usersMap: Record, + source: GenericSource; + objectives: Objective[]; + injects: Inject[]; + teamsMap: Record; + teams: Team[]; + lessonsCategories: LessonsCategory[]; + lessonsQuestions: LessonsQuestion[]; + lessonsAnswers: LessonsAnswer[]; + lessonsTemplates: LessonsTemplate[]; + usersMap: Record; } const Lessons: React.FC = ({ @@ -191,16 +192,19 @@ const Lessons: React.FC = ({
    - +
    {t('Overall objectives score')}
    -
    {source.score}%
    +
    + {source.score} + % +
    - +
    {t('Simulation logs')}
    @@ -211,7 +215,7 @@ const Lessons: React.FC = ({
    - +
    {t('Poll replies')}
    @@ -222,7 +226,7 @@ const Lessons: React.FC = ({
    - +
    {t('Messages')}
    @@ -253,12 +257,15 @@ const Lessons: React.FC = ({ source.end_date ? new Date(source.end_date) : new Date(), - )}{' '} + )} + {' '} {t('hours')} {t('Team')} - {source.users_number} {t('players')} + {source.users_number} + {' '} + {t('players')} @@ -270,21 +277,21 @@ const Lessons: React.FC = ({ {t('Questionnaire mode')} setOpenAnonymize(true)} name="anonymized" /> - } + )} label={t('Anonymize answers')} /> {t('Template')}
    - } + )} /> setMitigations(mitigations.map((a) => (a.mitigation_id !== result.mitigation_id ? a : result)))} - onDelete={(result) => setMitigations(mitigations.filter((a) => (a.mitigation_id !== result)))} + onUpdate={result => setMitigations(mitigations.map(a => (a.mitigation_id !== result.mitigation_id ? a : result)))} + onDelete={result => setMitigations(mitigations.filter(a => (a.mitigation_id !== result)))} /> ))} setMitigations([result, ...mitigations])} + onCreate={result => setMitigations([result, ...mitigations])} />
    ); diff --git a/openbas-front/src/admin/components/nav/LeftBar.tsx b/openbas-front/src/admin/components/nav/LeftBar.tsx index 87b0133430..020f91db22 100644 --- a/openbas-front/src/admin/components/nav/LeftBar.tsx +++ b/openbas-front/src/admin/components/nav/LeftBar.tsx @@ -1,6 +1,3 @@ -import { LegacyRef, MutableRefObject, ReactNode, useRef, useState } from 'react'; -import { Link, useLocation, useNavigate } from 'react-router-dom'; -import { Collapse, Divider, Drawer, ListItemIcon, ListItemText, MenuItem, MenuList, Popover, Toolbar, Tooltip, tooltipClasses } from '@mui/material'; import { AttachMoneyOutlined, BeenhereOutlined, @@ -28,32 +25,36 @@ import { SubscriptionsOutlined, TerminalOutlined, } from '@mui/icons-material'; -import { DramaMasks, NewspaperVariantMultipleOutline, PostOutline, SecurityNetwork, SelectGroup, Target } from 'mdi-material-ui'; +import { Collapse, Divider, Drawer, ListItemIcon, ListItemText, MenuItem, MenuList, Popover, Toolbar, Tooltip, tooltipClasses } from '@mui/material'; import { createStyles, makeStyles, styled, useTheme } from '@mui/styles'; -import { fileUri, MESSAGING$ } from '../../../utils/Environment'; -import { useFormatter } from '../../../components/i18n'; -import { useHelper } from '../../../store'; +import { DramaMasks, NewspaperVariantMultipleOutline, PostOutline, SecurityNetwork, SelectGroup, Target } from 'mdi-material-ui'; +import { LegacyRef, MutableRefObject, ReactNode, useRef, useState } from 'react'; +import { Link, useLocation, useNavigate } from 'react-router-dom'; + import type { UserHelper } from '../../../actions/helper'; +import { useFormatter } from '../../../components/i18n'; import type { Theme } from '../../../components/Theme'; +import { computeBannerSettings } from '../../../public/components/systembanners/utils'; import logoFiligranDark from '../../../static/images/logo_filigran_dark.png'; import logoFiligranLight from '../../../static/images/logo_filigran_light.png'; import logoFiligranTextDark from '../../../static/images/logo_filigran_text_dark.png'; import logoFiligranTextLight from '../../../static/images/logo_filigran_text_light.png'; -import useDimensions from '../../../utils/hooks/useDimensions'; +import { useHelper } from '../../../store'; +import { fileUri, MESSAGING$ } from '../../../utils/Environment'; import useAuth from '../../../utils/hooks/useAuth'; -import { computeBannerSettings } from '../../../public/components/systembanners/utils'; +import useDimensions from '../../../utils/hooks/useDimensions'; type entry = { - type?: string, - link: string, - label: string, - icon?: ReactNode, - granted?: boolean, - exact?: boolean, - disabled?: boolean, + type?: string; + link: string; + label: string; + icon?: ReactNode; + granted?: boolean; + exact?: boolean; + disabled?: boolean; }; -const useStyles = makeStyles((theme) => createStyles({ +const useStyles = makeStyles(theme => createStyles({ drawerPaper: { width: 55, minHeight: '100vh', @@ -198,116 +199,125 @@ const LeftBar = () => { const { dimension } = useDimensions(); const isMobile = dimension.width < 768; const generateSubMenu = (menu: string, entries: entry[]) => { - return navOpen ? ( - - - {entries.filter((entry) => entry.granted !== false).map((entry) => { - return ( - - + return navOpen + ? ( + + + {entries.filter(entry => entry.granted !== false).map((entry) => { + return ( + + + + {entry.icon && ( + + {entry.icon} + + )} + + + + + ); + })} + + + ) + : ( + handleSelectedMenuOpen(menu), + onMouseLeave: handleSelectedMenuClose, + sx: { + pointerEvents: 'auto', + }, + }, + }} + > + + {entries.filter(entry => entry.granted !== false).map((entry) => { + if (entry.disabled) { + return ( + + + + {entry.icon && ( + + {entry.icon} + + )} + + + + + ); + } + return ( - {entry.icon && - {entry.icon} - } + {entry.icon && ( + + {entry.icon} + + )} - - - ); - })} - - - ) : ( - handleSelectedMenuOpen(menu), - onMouseLeave: handleSelectedMenuClose, - sx: { - pointerEvents: 'auto', - }, - }, - }} - > - - {entries.filter((entry) => entry.granted !== false).map((entry) => { - if (entry.disabled) { - return ( - - - - {entry.icon && - {entry.icon} - } - - - - - ); - } - return ( - - {entry.icon && - {entry.icon} - } - - - ); - })} - - - ); + ); + })} + + + ); }; return ( { {navOpen && ( - + )} @@ -660,7 +670,7 @@ const LeftBar = () => { }} onClick={() => window.open('https://filigran.io/', '_blank')} > - + ((theme) => ({ +const useStyles = makeStyles(theme => ({ appBar: { width: '100%', zIndex: theme.zIndex.drawer + 1, @@ -67,11 +68,11 @@ const useStyles = makeStyles((theme) => ({ marginBottom: 20, }, xtmItem: { - display: 'block', - color: theme.palette.text?.primary, - textAlign: 'center', - padding: '15px 0 10px 0', - borderRadius: 4, + 'display': 'block', + 'color': theme.palette.text?.primary, + 'textAlign': 'center', + 'padding': '15px 0 10px 0', + 'borderRadius': 4, '&:hover': { backgroundColor: theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.05)' : 'rgba(0, 0, 0, 0.05)', }, @@ -239,9 +240,12 @@ const TopBar: React.FC = () => { - OCTI @@ -293,7 +297,8 @@ const TopBar: React.FC = () => { > - ({ createButton: { diff --git a/openbas-front/src/admin/components/payloads/PayloadForm.tsx b/openbas-front/src/admin/components/payloads/PayloadForm.tsx index ed59d41754..11842864dc 100644 --- a/openbas-front/src/admin/components/payloads/PayloadForm.tsx +++ b/openbas-front/src/admin/components/payloads/PayloadForm.tsx @@ -1,17 +1,18 @@ -import { FormEvent, FunctionComponent } from 'react'; -import { Controller, SubmitHandler, useFieldArray, useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { ControlPointOutlined, DeleteOutlined } from '@mui/icons-material'; import { Button, IconButton, InputLabel, List, ListItem, ListItemText, MenuItem, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { zodResolver } from '@hookform/resolvers/zod'; +import { FormEvent, FunctionComponent } from 'react'; +import { Controller, SubmitHandler, useFieldArray, useForm } from 'react-hook-form'; import { z } from 'zod'; -import { ControlPointOutlined, DeleteOutlined } from '@mui/icons-material'; -import PlatformField from '../../../components/PlatformField'; -import SelectField from '../../../components/fields/SelectField'; + import AttackPatternField from '../../../components/AttackPatternField'; import FileLoader from '../../../components/fields/FileLoader'; +import SelectField from '../../../components/fields/SelectField'; +import TagField from '../../../components/fields/TagField'; import { useFormatter } from '../../../components/i18n'; +import PlatformField from '../../../components/PlatformField'; import type { PayloadCreateInput } from '../../../utils/api-types'; -import TagField from '../../../components/fields/TagField'; import type { Option } from '../../../utils/Option'; const useStyles = makeStyles(() => ({ @@ -193,8 +194,8 @@ const PayloadForm: FunctionComponent = ({ inputProps={register('executable_arch')} InputLabelProps={{ required: true }} > - {t('x86_64')} - {t('arm64')} + {t('x86_64')} + {t('arm64')} )} /> diff --git a/openbas-front/src/admin/components/payloads/PayloadPopover.js b/openbas-front/src/admin/components/payloads/PayloadPopover.js index 0d890eb3fd..fc8c09bb9b 100644 --- a/openbas-front/src/admin/components/payloads/PayloadPopover.js +++ b/openbas-front/src/admin/components/payloads/PayloadPopover.js @@ -1,14 +1,15 @@ +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; +import * as R from 'ramda'; import { useState } from 'react'; import { useDispatch } from 'react-redux'; -import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; + import { deletePayload, duplicatePayload, updatePayload } from '../../../actions/Payload'; -import PayloadForm from './PayloadForm'; +import Drawer from '../../../components/common/Drawer'; +import Transition from '../../../components/common/Transition'; import { useFormatter } from '../../../components/i18n'; import { documentOptions, platformOptions } from '../../../utils/Option'; -import Transition from '../../../components/common/Transition'; -import Drawer from '../../../components/common/Drawer'; +import PayloadForm from './PayloadForm'; const PayloadPopover = ({ payload, documentsMap, onUpdate, onDelete, onDuplicate, disabled }) => { const [openDelete, setOpenDelete] = useState(false); diff --git a/openbas-front/src/admin/components/payloads/Payloads.tsx b/openbas-front/src/admin/components/payloads/Payloads.tsx index 716469556e..eaacf97f83 100644 --- a/openbas-front/src/admin/components/payloads/Payloads.tsx +++ b/openbas-front/src/admin/components/payloads/Payloads.tsx @@ -1,33 +1,34 @@ -import { CSSProperties, useMemo, useState } from 'react'; import { Chip, Grid, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { CSSProperties, useMemo, useState } from 'react'; + +import { fetchCollectors } from '../../../actions/Collector'; +import type { CollectorHelper } from '../../../actions/collectors/collector-helper'; +import { fetchDocuments } from '../../../actions/Document'; +import type { DocumentHelper } from '../../../actions/helper'; import { searchPayloads } from '../../../actions/Payload'; -import CreatePayload from './CreatePayload'; -import useDataLoader from '../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../store'; -import PayloadPopover from './PayloadPopover'; -import { initSorting } from '../../../components/common/queryable/Page'; -import { useFormatter } from '../../../components/i18n'; +import type { PayloadStore } from '../../../actions/payloads/Payload'; import Breadcrumbs from '../../../components/Breadcrumbs'; -import ItemTags from '../../../components/ItemTags'; -import PlatformIcon from '../../../components/PlatformIcon'; -import { fetchDocuments } from '../../../actions/Document'; -import { fetchCollectors } from '../../../actions/Collector'; import Drawer from '../../../components/common/Drawer'; -import ItemCopy from '../../../components/ItemCopy'; -import { emptyFilled } from '../../../utils/String'; -import { useQueryableWithLocalStorage } from '../../../components/common/queryable/useQueryableWithLocalStorage'; -import { buildSearchPagination } from '../../../components/common/queryable/QueryableUtils'; +import ExportButton from '../../../components/common/ExportButton'; +import { buildEmptyFilter } from '../../../components/common/queryable/filter/FilterUtils'; +import { initSorting } from '../../../components/common/queryable/Page'; import PaginationComponentV2 from '../../../components/common/queryable/pagination/PaginationComponentV2'; +import { buildSearchPagination } from '../../../components/common/queryable/QueryableUtils'; import SortHeadersComponentV2 from '../../../components/common/queryable/sort/SortHeadersComponentV2'; +import { useQueryableWithLocalStorage } from '../../../components/common/queryable/useQueryableWithLocalStorage'; +import { Header } from '../../../components/common/SortHeadersList'; +import { useFormatter } from '../../../components/i18n'; +import ItemCopy from '../../../components/ItemCopy'; +import ItemTags from '../../../components/ItemTags'; import PayloadIcon from '../../../components/PayloadIcon'; -import type { DocumentHelper } from '../../../actions/helper'; -import type { CollectorHelper } from '../../../actions/collectors/collector-helper'; +import PlatformIcon from '../../../components/PlatformIcon'; +import { useHelper } from '../../../store'; import { useAppDispatch } from '../../../utils/hooks'; -import type { PayloadStore } from '../../../actions/payloads/Payload'; -import { buildEmptyFilter } from '../../../components/common/queryable/filter/FilterUtils'; -import ExportButton from '../../../components/common/ExportButton'; -import { Header } from '../../../components/common/SortHeadersList'; +import useDataLoader from '../../../utils/hooks/useDataLoader'; +import { emptyFilled } from '../../../utils/String'; +import CreatePayload from './CreatePayload'; +import PayloadPopover from './PayloadPopover'; const useStyles = makeStyles(() => ({ itemHead: { @@ -115,12 +116,14 @@ const Payloads = () => { field: 'payload_type', label: 'Type', isSortable: false, - value: (payload: PayloadStore) => , + value: (payload: PayloadStore) => ( + + ), }, { field: 'payload_name', @@ -132,9 +135,13 @@ const Payloads = () => { field: 'payload_platforms', label: 'Platforms', isSortable: false, - value: (payload: PayloadStore) => <>{payload.payload_platforms?.map( - (platform) => , - )}, + value: (payload: PayloadStore) => ( + <> + {payload.payload_platforms?.map( + platform => , + )} + + ), }, { field: 'payload_description', @@ -146,32 +153,38 @@ const Payloads = () => { field: 'payload_tags', label: 'Tags', isSortable: false, - value: (payload: PayloadStore) => , + value: (payload: PayloadStore) => ( + + ), }, { field: 'payload_source', label: 'Source', isSortable: true, - value: (payload: PayloadStore) => , + value: (payload: PayloadStore) => ( + + ), }, { field: 'payload_status', label: 'Status', isSortable: false, - value: (payload: PayloadStore) => , + value: (payload: PayloadStore) => ( + + ), }, { field: 'payload_updated_at', @@ -243,13 +256,13 @@ const Payloads = () => { > - } + )} /> {payloads.map((payload: PayloadStore) => { @@ -280,9 +293,9 @@ const Payloads = () => { )} - {headers.map((header) => ( + {headers.map(header => (
    {
    ))}
    - } + )} /> setPayloads(payloads.map((a) => (a.payload_id !== result.payload_id ? a : result)))} + onUpdate={(result: PayloadStore) => setPayloads(payloads.map(a => (a.payload_id !== result.payload_id ? a : result)))} onDuplicate={(result: PayloadStore) => setPayloads([result, ...payloads])} - onDelete={(result: string) => setPayloads(payloads.filter((a) => (a.payload_id !== result)))} + onDelete={(result: string) => setPayloads(payloads.filter(a => (a.payload_id !== result)))} disabled={collector !== null} /> @@ -336,19 +349,19 @@ const Payloads = () => { {(selectedPayload?.payload_platforms ?? []).length === 0 ? ( ) : selectedPayload?.payload_platforms?.map( - (platform) => , + platform => , )} {(selectedPayload?.executable_arch) && ( - <> - - {t('Architecture')} - - {selectedPayload?.executable_arch} - + <> + + {t('Architecture')} + + {selectedPayload?.executable_arch} + )} { > {t('External ID')} - {selectedPayload?.payload_external_id && selectedPayload?.payload_external_id.length > 0 ?
    -              
    -            
    : '-'} + {selectedPayload?.payload_external_id && selectedPayload?.payload_external_id.length > 0 ? ( +
    +                
    +              
    + ) : '-'} { const { t } = useFormatter(); @@ -19,12 +20,12 @@ const Index = () => { dispatch(fetchOrganizations()); dispatch(meTokens()); }); - const { user, tokens, organizationsMap } = useHelper((helper) => ({ + const { user, tokens, organizationsMap } = useHelper(helper => ({ user: helper.getMe(), tokens: helper.getMeTokens(), organizationsMap: helper.getOrganizationsMap(), })); - const onRenew = (tokenId) => dispatch(renewToken(tokenId)); + const onRenew = tokenId => dispatch(renewToken(tokenId)); const onUpdate = (data) => { const inputValues = R.pipe( R.assoc( @@ -42,16 +43,16 @@ const Index = () => { )(data); return dispatch(updateMeProfile(inputValues)); }; - const onUpdateInformation = (data) => dispatch(updateMeInformation(data)); - const onUpdatePassword = (data) => dispatch( + const onUpdateInformation = data => dispatch(updateMeInformation(data)); + const onUpdatePassword = data => dispatch( updateMePassword(data.user_current_password, data.user_plain_password), ); const userOrganizationValue = organizationsMap[user.user_organization]; const userOrganization = userOrganizationValue ? { - id: userOrganizationValue.organization_id, - label: userOrganizationValue.organization_name, - } + id: userOrganizationValue.organization_id, + label: userOrganizationValue.organization_name, + } : null; const initialValues = R.pipe( R.assoc('user_organization', userOrganization), @@ -107,8 +108,10 @@ const Index = () => { {t( 'The OpenBAS API relies on the REST standard. The token must be passed into the HTTP header', - )}{' '} - {t('Authorization')}. + )} + {' '} + {t('Authorization')} + . { Content-Type: application/json {/* eslint-disable-next-line i18next/no-literal-string */}
    - Authorization: Bearer {userToken?.token_value} + Authorization: Bearer + {' '} + {userToken?.token_value}
    - } + )} /> ); })} - {userAdmin && { - setScenarios([result, ...scenarios]); - fetchStatistics(); - }} - /> - } + {userAdmin && ( + { + setScenarios([result, ...scenarios]); + fetchStatistics(); + }} + /> + )} ); }; diff --git a/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx b/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx index cb637743ad..f8d212fcac 100644 --- a/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx +++ b/openbas-front/src/admin/components/scenarios/ScenariosCard.tsx @@ -1,14 +1,15 @@ -import classNames from 'classnames'; import { Card, CardActionArea, CardContent } from '@mui/material'; -import { FunctionComponent, useEffect, useState } from 'react'; import { makeStyles } from '@mui/styles'; +import classNames from 'classnames'; +import { FunctionComponent, useEffect, useState } from 'react'; + +import { fetchScenarioStatistic } from '../../../actions/scenarios/scenario-actions'; +import { FilterHelpers } from '../../../components/common/queryable/filter/FilterHelpers'; +import { useFormatter } from '../../../components/i18n'; import ItemCategory from '../../../components/ItemCategory'; -import { scenarioCategories } from './constants'; import type { Theme } from '../../../components/Theme'; -import { useFormatter } from '../../../components/i18n'; import type { ScenarioStatistic, SearchPaginationInput } from '../../../utils/api-types'; -import { fetchScenarioStatistic } from '../../../actions/scenarios/scenario-actions'; -import { FilterHelpers } from '../../../components/common/queryable/filter/FilterHelpers'; +import { scenarioCategories } from './constants'; const useStyles = makeStyles((theme: Theme) => ({ card: { @@ -52,11 +53,12 @@ const ScenarioCard: FunctionComponent = ({ ); }; - const hasCategory = searchPaginationInput.filterGroup?.filters?.find((f) => f.key === CATEGORY_FILTER_KEY)?.values?.includes(category); + const hasCategory = searchPaginationInput.filterGroup?.filters?.find(f => f.key === CATEGORY_FILTER_KEY)?.values?.includes(category); return ( @@ -69,7 +71,9 @@ const ScenarioCard: FunctionComponent = ({ {t(scenarioCategories.get(category) ?? category)}
    - {count} {t('scenarios')} + {count} + {' '} + {t('scenarios')}
    @@ -98,7 +102,7 @@ const ScenariosCard: FunctionComponent = ({ }; const noCategory = () => { - const categoryFilter = searchPaginationInput.filterGroup?.filters?.find((f) => f.key === CATEGORY_FILTER_KEY); + const categoryFilter = searchPaginationInput.filterGroup?.filters?.find(f => f.key === CATEGORY_FILTER_KEY); if (categoryFilter) { return !categoryFilter.values || categoryFilter.values.length === 0; } @@ -118,7 +122,8 @@ const ScenariosCard: FunctionComponent = ({
    @@ -131,7 +136,9 @@ const ScenariosCard: FunctionComponent = ({ {t('All categories')}
    - {statistic?.scenarios_global_count ?? '-'} {t('scenarios')} + {statistic?.scenarios_global_count ?? '-'} + {' '} + {t('scenarios')}
    diff --git a/openbas-front/src/admin/components/scenarios/scenario/Index.tsx b/openbas-front/src/admin/components/scenarios/scenario/Index.tsx index f7e1c3560e..630ec9e3b9 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/Index.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/Index.tsx @@ -1,26 +1,27 @@ -import { FunctionComponent, lazy, Suspense, useState } from 'react'; -import { Link, Route, Routes, useLocation, useParams } from 'react-router-dom'; +import { UpdateOutlined } from '@mui/icons-material'; import { Alert, AlertTitle, Box, IconButton, Tab, Tabs, Tooltip } from '@mui/material'; -import cronstrue from 'cronstrue'; import { makeStyles, useTheme } from '@mui/styles'; -import { UpdateOutlined } from '@mui/icons-material'; -import Loader from '../../../../components/Loader'; +import cronstrue from 'cronstrue'; +import { FunctionComponent, lazy, Suspense, useState } from 'react'; +import { Link, Route, Routes, useLocation, useParams } from 'react-router-dom'; + +import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; +import { fetchScenario } from '../../../../actions/scenarios/scenario-actions'; +import type { ScenariosHelper } from '../../../../actions/scenarios/scenario-helper'; +import Breadcrumbs from '../../../../components/Breadcrumbs'; import { errorWrapper } from '../../../../components/Error'; -import { useAppDispatch } from '../../../../utils/hooks'; +import { useFormatter } from '../../../../components/i18n'; +import Loader from '../../../../components/Loader'; +import NotFound from '../../../../components/NotFound'; +import type { Theme } from '../../../../components/Theme'; import { useHelper } from '../../../../store'; -import type { ScenariosHelper } from '../../../../actions/scenarios/scenario-helper'; +import { parseCron, ParsedCron } from '../../../../utils/Cron'; +import { useAppDispatch } from '../../../../utils/hooks'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { fetchScenario } from '../../../../actions/scenarios/scenario-actions'; -import NotFound from '../../../../components/NotFound'; -import ScenarioHeader from './ScenarioHeader'; -import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; import useScenarioPermissions from '../../../../utils/Scenario'; import { DocumentContext, DocumentContextType, InjectContext, PermissionsContext, PermissionsContextType } from '../../common/Context'; -import { useFormatter } from '../../../../components/i18n'; -import Breadcrumbs from '../../../../components/Breadcrumbs'; -import { parseCron, ParsedCron } from '../../../../utils/Cron'; -import type { Theme } from '../../../../components/Theme'; import injectContextForScenario from './ScenarioContext'; +import ScenarioHeader from './ScenarioHeader'; const Scenario = lazy(() => import('./Scenario')); const ScenarioDefinition = lazy(() => import('./ScenarioDefinition')); diff --git a/openbas-front/src/admin/components/scenarios/scenario/Scenario.tsx b/openbas-front/src/admin/components/scenarios/scenario/Scenario.tsx index a798d0f7be..cf9c8fac2e 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/Scenario.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/Scenario.tsx @@ -1,39 +1,40 @@ -import { Link, useParams } from 'react-router-dom'; -import { useState } from 'react'; -import * as React from 'react'; +import { PlayArrowOutlined } from '@mui/icons-material'; import { Avatar, Button, Chip, Grid, Paper, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; -import { PlayArrowOutlined } from '@mui/icons-material'; import * as R from 'ramda'; -import { useAppDispatch } from '../../../../utils/hooks'; -import { useHelper } from '../../../../store'; -import octiDark from '../../../../static/images/xtm/octi_dark.png'; -import octiLight from '../../../../static/images/xtm/octi_light.png'; -import type { ScenariosHelper } from '../../../../actions/scenarios/scenario-helper'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; -import type { ExercisesHelper } from '../../../../actions/exercises/exercise-helper'; +import { useState } from 'react'; +import * as React from 'react'; +import { Link, useParams } from 'react-router-dom'; + import type { ExerciseStore } from '../../../../actions/exercises/Exercise'; -import ScenarioDistributionByExercise from './ScenarioDistributionByExercise'; -import { useFormatter } from '../../../../components/i18n'; +import type { ExercisesHelper } from '../../../../actions/exercises/exercise-helper'; +import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; +import { fetchScenarioExercises, searchScenarioExercises } from '../../../../actions/scenarios/scenario-actions'; +import type { ScenariosHelper } from '../../../../actions/scenarios/scenario-helper'; +import { initSorting } from '../../../../components/common/queryable/Page'; +import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; +import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; +import { useQueryableWithLocalStorage } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; import ExpandableMarkdown from '../../../../components/ExpandableMarkdown'; +import { useFormatter } from '../../../../components/i18n'; import ItemCategory from '../../../../components/ItemCategory'; import ItemMainFocus from '../../../../components/ItemMainFocus'; +import ItemSeverity from '../../../../components/ItemSeverity'; import ItemTags from '../../../../components/ItemTags'; +import Loader from '../../../../components/Loader'; import PlatformIcon from '../../../../components/PlatformIcon'; -import ItemSeverity from '../../../../components/ItemSeverity'; -import type { KillChainPhase } from '../../../../utils/api-types'; -import { fetchScenarioExercises, searchScenarioExercises } from '../../../../actions/scenarios/scenario-actions'; import type { Theme } from '../../../../components/Theme'; +import octiDark from '../../../../static/images/xtm/octi_dark.png'; +import octiLight from '../../../../static/images/xtm/octi_light.png'; +import { useHelper } from '../../../../store'; +import type { KillChainPhase } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; import { isEmptyField } from '../../../../utils/utils'; import type { EndpointStore } from '../../assets/endpoints/Endpoint'; -import { initSorting } from '../../../../components/common/queryable/Page'; import ExerciseList from '../../simulations/ExerciseList'; -import { useQueryableWithLocalStorage } from '../../../../components/common/queryable/useQueryableWithLocalStorage'; -import PaginationComponentV2 from '../../../../components/common/queryable/pagination/PaginationComponentV2'; import ExercisePopover from '../../simulations/simulation/ExercisePopover'; -import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; -import Loader from '../../../../components/Loader'; +import ScenarioDistributionByExercise from './ScenarioDistributionByExercise'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. @@ -87,7 +88,7 @@ const Scenario = ({ setOpenInstantiateSimulationAndStart }: { setOpenInstantiate setExercises(exercises.filter((e) => (e.exercise_id !== result)))} + onDelete={result => setExercises(exercises.filter(e => (e.exercise_id !== result)))} inList /> ); @@ -212,7 +213,7 @@ const Scenario = ({ setOpenInstantiateSimulationAndStart }: { setOpenInstantiate {loadingScenarioExercises && ()} - {!loadingScenarioExercises && ()} + {!loadingScenarioExercises && ()} {(scenarioExercises ?? 0).length > 0 && ( @@ -222,7 +223,7 @@ const Scenario = ({ setOpenInstantiateSimulationAndStart }: { setOpenInstantiate searchScenarioExercises(scenarioId, input)} + fetch={input => searchScenarioExercises(scenarioId, input)} searchPaginationInput={searchPaginationInput} setContent={setExercises} entityPrefix="exercise" @@ -257,11 +258,11 @@ const Scenario = ({ setOpenInstantiateSimulationAndStart }: { setOpenInstantiate
    )} {(scenarioExercises ?? 0).length === 0 && scenario.scenario_recurrence && ( -
    -
    - {t('This scenario is scheduled to run, results will appear soon.')} +
    +
    + {t('This scenario is scheduled to run, results will appear soon.')} +
    -
    )} ); diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioContext.ts b/openbas-front/src/admin/components/scenarios/scenario/ScenarioContext.ts index 3f4a3c8b81..31bed1cf25 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioContext.ts +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioContext.ts @@ -1,4 +1,3 @@ -import type { ImportTestSummary, Inject, InjectsImportInput, InjectTestStatus, SearchPaginationInput } from '../../../../utils/api-types'; import { addInjectForScenario, bulkDeleteInjectsForScenario, @@ -8,12 +7,13 @@ import { updateInjectActivationForScenario, updateInjectForScenario, } from '../../../../actions/Inject'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; import type { InjectOutputType, InjectStore } from '../../../../actions/injects/Inject'; +import { bulkTestInjects, searchScenarioInjectsSimple } from '../../../../actions/injects/inject-action'; +import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; import { dryImportXlsForScenario, fetchScenario, fetchScenarioTeams, importXlsForScenario } from '../../../../actions/scenarios/scenario-actions'; import { Page } from '../../../../components/common/queryable/Page'; -import { bulkTestInjects, searchScenarioInjectsSimple } from '../../../../actions/injects/inject-action'; +import type { ImportTestSummary, Inject, InjectsImportInput, InjectTestStatus, SearchPaginationInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; const injectContextForScenario = (scenario: ScenarioStore) => { const dispatch = useAppDispatch(); @@ -22,18 +22,18 @@ const injectContextForScenario = (scenario: ScenarioStore) => { searchInjects(input: SearchPaginationInput): Promise<{ data: Page }> { return searchScenarioInjectsSimple(scenario.scenario_id, input); }, - onAddInject(inject: Inject): Promise<{ result: string, entities: { injects: Record } }> { + onAddInject(inject: Inject): Promise<{ result: string; entities: { injects: Record } }> { return dispatch(addInjectForScenario(scenario.scenario_id, inject)); }, - onBulkUpdateInject(injectId: Inject['inject_id'], inject: Inject): Promise<{ result: string, entities: { injects: Record } }> { + onBulkUpdateInject(injectId: Inject['inject_id'], inject: Inject): Promise<{ result: string; entities: { injects: Record } }> { return dispatch(bulkUpdateInjectForScenario(scenario.scenario_id, injectId, inject)); }, - onUpdateInject(injectId: Inject['inject_id'], inject: Inject): Promise<{ result: string, entities: { injects: Record } }> { + onUpdateInject(injectId: Inject['inject_id'], inject: Inject): Promise<{ result: string; entities: { injects: Record } }> { return dispatch(updateInjectForScenario(scenario.scenario_id, injectId, inject)); }, onUpdateInjectActivation(injectId: Inject['inject_id'], injectEnabled: { inject_enabled: boolean }): Promise<{ - result: string, - entities: { injects: Record } + result: string; + entities: { injects: Record }; }> { return dispatch(updateInjectActivationForScenario(scenario.scenario_id, injectId, injectEnabled)); }, @@ -41,7 +41,7 @@ const injectContextForScenario = (scenario: ScenarioStore) => { return dispatch(deleteInjectScenario(scenario.scenario_id, injectId)); }, onImportInjectFromXls(importId: string, input: InjectsImportInput): Promise { - return importXlsForScenario(scenario.scenario_id, importId, input).then((response) => new Promise((resolve, _reject) => { + return importXlsForScenario(scenario.scenario_id, importId, input).then(response => new Promise((resolve, _reject) => { dispatch(fetchScenarioInjects(scenario.scenario_id)); dispatch(fetchScenario(scenario.scenario_id)); dispatch(fetchScenarioTeams(scenario.scenario_id)); @@ -49,13 +49,13 @@ const injectContextForScenario = (scenario: ScenarioStore) => { })); }, async onDryImportInjectFromXls(importId: string, input: InjectsImportInput): Promise { - return dryImportXlsForScenario(scenario.scenario_id, importId, input).then((result) => result.data); + return dryImportXlsForScenario(scenario.scenario_id, importId, input).then(result => result.data); }, onBulkDeleteInjects(injectIds: string[]): void { return dispatch(bulkDeleteInjectsForScenario(scenario.scenario_id, injectIds)); }, - bulkTestInjects(injectIds: string[]): Promise<{ uri: string, data: InjectTestStatus[] }> { - return bulkTestInjects(injectIds).then((result) => ({ + bulkTestInjects(injectIds: string[]): Promise<{ uri: string; data: InjectTestStatus[] }> { + return bulkTestInjects(injectIds).then(result => ({ uri: `/admin/scenarios/${scenario.scenario_id}/tests`, data: result.data, })); diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioDefinition.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioDefinition.tsx index 02fbabf36b..a0836978b4 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioDefinition.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioDefinition.tsx @@ -1,14 +1,15 @@ -import { useParams } from 'react-router-dom'; import { Grid, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { useHelper } from '../../../../store'; -import type { ScenariosHelper } from '../../../../actions/scenarios/scenario-helper'; +import { useParams } from 'react-router-dom'; + import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; +import type { ScenariosHelper } from '../../../../actions/scenarios/scenario-helper'; import { useFormatter } from '../../../../components/i18n'; +import { useHelper } from '../../../../store'; +import ScenarioArticles from './articles/ScenarioArticles'; +import ScenarioChallenges from './challenges/ScenarioChallenges'; import ScenarioTeams from './teams/ScenarioTeams'; import ScenarioVariables from './variables/ScenarioVariables'; -import ScenarioChallenges from './challenges/ScenarioChallenges'; -import ScenarioArticles from './articles/ScenarioArticles'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioDistributionByExercise.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioDistributionByExercise.tsx index 82eb8b0b04..a86635d98c 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioDistributionByExercise.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioDistributionByExercise.tsx @@ -1,11 +1,12 @@ -import Chart from 'react-apexcharts'; -import { FunctionComponent } from 'react'; import { useTheme } from '@mui/styles'; import type { ApexOptions } from 'apexcharts'; +import { FunctionComponent } from 'react'; +import Chart from 'react-apexcharts'; + import type { ExerciseSimpleStore } from '../../../../actions/exercises/Exercise'; +import Empty from '../../../../components/Empty'; import { useFormatter } from '../../../../components/i18n'; import type { Theme } from '../../../../components/Theme'; -import Empty from '../../../../components/Empty'; import { verticalBarsChartOptions } from '../../../../utils/Charts'; interface Props { @@ -40,23 +41,23 @@ const ScenarioDistributionByExercise: FunctionComponent = ({ const series = [ { name: t('Prevention'), - data: data.map((exercise) => ({ + data: data.map(exercise => ({ x: exercise.exercise_start_date ? new Date(exercise.exercise_start_date) : new Date(), - y: exercise.exercise_global_score?.filter((score) => score.type === 'PREVENTION').at(0)?.distribution?.[0]?.value ?? 0, + y: exercise.exercise_global_score?.filter(score => score.type === 'PREVENTION').at(0)?.distribution?.[0]?.value ?? 0, })), }, { name: t('Detection'), - data: data.map((exercise) => ({ + data: data.map(exercise => ({ x: exercise.exercise_start_date ? new Date(exercise.exercise_start_date) : new Date(), - y: exercise.exercise_global_score?.filter((score) => score.type === 'DETECTION').at(0)?.distribution?.[0]?.value ?? 0, + y: exercise.exercise_global_score?.filter(score => score.type === 'DETECTION').at(0)?.distribution?.[0]?.value ?? 0, })), }, { name: t('Human Response'), - data: data.map((exercise) => ({ + data: data.map(exercise => ({ x: exercise.exercise_start_date ? new Date(exercise.exercise_start_date) : new Date(), - y: exercise.exercise_global_score?.filter((score) => score.type === 'HUMAN_RESPONSE').at(0)?.distribution?.[0]?.value ?? 0, + y: exercise.exercise_global_score?.filter(score => score.type === 'HUMAN_RESPONSE').at(0)?.distribution?.[0]?.value ?? 0, })), }, ]; @@ -89,8 +90,7 @@ const ScenarioDistributionByExercise: FunctionComponent = ({ 'No data to display', )} /> - ) - } + )} ); }; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioExportDialog.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioExportDialog.tsx index 9038a39502..a8abbda41a 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioExportDialog.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioExportDialog.tsx @@ -1,5 +1,6 @@ import { Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material'; import { FunctionComponent, useState } from 'react'; + import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioHeader.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioHeader.tsx index 8cd0ab74e9..37b46c01d5 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioHeader.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioHeader.tsx @@ -1,23 +1,24 @@ -import { Link, useNavigate, useParams } from 'react-router-dom'; -import { useEffect } from 'react'; -import * as React from 'react'; +import { PlayArrowOutlined, Stop } from '@mui/icons-material'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, Tooltip, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; -import { PlayArrowOutlined, Stop } from '@mui/icons-material'; -import { useAppDispatch } from '../../../../utils/hooks'; -import { useHelper } from '../../../../store'; -import type { ScenariosHelper } from '../../../../actions/scenarios/scenario-helper'; -import { createRunningExerciseFromScenario, updateScenarioRecurrence } from '../../../../actions/scenarios/scenario-actions'; +import { useEffect } from 'react'; +import * as React from 'react'; +import { Link, useNavigate, useParams } from 'react-router-dom'; + import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; -import ScenarioPopover from './ScenarioPopover'; +import { createRunningExerciseFromScenario, updateScenarioRecurrence } from '../../../../actions/scenarios/scenario-actions'; +import type { ScenariosHelper } from '../../../../actions/scenarios/scenario-helper'; +import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; -import { parseCron, ParsedCron } from '../../../../utils/Cron'; -import ScenarioRecurringFormDialog from './ScenarioRecurringFormDialog'; -import { truncate } from '../../../../utils/String'; import type { Theme } from '../../../../components/Theme'; -import Transition from '../../../../components/common/Transition'; -import { MESSAGING$ } from '../../../../utils/Environment'; +import { useHelper } from '../../../../store'; import type { Exercise } from '../../../../utils/api-types'; +import { parseCron, ParsedCron } from '../../../../utils/Cron'; +import { MESSAGING$ } from '../../../../utils/Environment'; +import { useAppDispatch } from '../../../../utils/hooks'; +import { truncate } from '../../../../utils/String'; +import ScenarioPopover from './ScenarioPopover'; +import ScenarioRecurringFormDialog from './ScenarioRecurringFormDialog'; const useStyles = makeStyles(() => ({ title: { @@ -55,8 +56,8 @@ interface ScenarioHeaderProps { selectRecurring: string; setOpenScenarioRecurringFormDialog: React.Dispatch>; setOpenInstantiateSimulationAndStart: React.Dispatch>; - openScenarioRecurringFormDialog: boolean, - openInstantiateSimulationAndStart: boolean, + openScenarioRecurringFormDialog: boolean; + openInstantiateSimulationAndStart: boolean; noRepeat: boolean; } diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioPopover.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioPopover.tsx index 0121149935..1050b38655 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioPopover.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioPopover.tsx @@ -1,17 +1,18 @@ import { FunctionComponent, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; + +import type { TagHelper, UserHelper } from '../../../../actions/helper'; import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; import { deleteScenario, duplicateScenario, exportScenarioUri } from '../../../../actions/scenarios/scenario-actions'; import ButtonPopover from '../../../../components/common/ButtonPopover'; import DialogDelete from '../../../../components/common/DialogDelete'; -import ScenarioExportDialog from './ScenarioExportDialog'; -import useScenarioPermissions from '../../../../utils/Scenario'; import DialogDuplicate from '../../../../components/common/DialogDuplicate'; -import ScenarioUpdate from './ScenarioUpdate'; +import { useFormatter } from '../../../../components/i18n'; import { useHelper } from '../../../../store'; -import type { TagHelper, UserHelper } from '../../../../actions/helper'; +import { useAppDispatch } from '../../../../utils/hooks'; +import useScenarioPermissions from '../../../../utils/Scenario'; +import ScenarioExportDialog from './ScenarioExportDialog'; +import ScenarioUpdate from './ScenarioUpdate'; type ScenarioActionType = 'Duplicate' | 'Update' | 'Delete' | 'Export'; @@ -44,7 +45,7 @@ const ScenarioPopover: FunctionComponent = ({ const handleOpenDuplicate = () => setDuplicate(true); const handleCloseDuplicate = () => setDuplicate(false); const submitDuplicate = () => { - dispatch(duplicateScenario(scenario.scenario_id)).then((result: { result: string, entities: { scenarios: Record } }) => { + dispatch(duplicateScenario(scenario.scenario_id)).then((result: { result: string; entities: { scenarios: Record } }) => { handleCloseDuplicate(); navigate(`/admin/scenarios/${result.result}`); }); @@ -87,31 +88,39 @@ const ScenarioPopover: FunctionComponent = ({ <> {actions.length > 0 && } {actions.includes('Duplicate') - && } + /> + )} {actions.includes(('Update')) - && } + /> + )} {actions.includes('Delete') - && } + /> + )} {actions.includes('Export') - && } + /> + )} ); }; diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioRecurringFormDialog.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioRecurringFormDialog.tsx index 03b588a14f..13dddb8175 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioRecurringFormDialog.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioRecurringFormDialog.tsx @@ -1,33 +1,34 @@ +import { zodResolver } from '@hookform/resolvers/zod'; +import { Button, Dialog, DialogActions, DialogContent, DialogTitle, FormControl, FormControlLabel, InputLabel, MenuItem, Select, Stack, Switch } from '@mui/material'; +import { DateTimePicker, TimePicker } from '@mui/x-date-pickers'; import { useEffect } from 'react'; import * as React from 'react'; -import { Button, Dialog, DialogActions, DialogContent, DialogTitle, FormControl, FormControlLabel, InputLabel, MenuItem, Select, Stack, Switch } from '@mui/material'; -import { TimePicker, DateTimePicker } from '@mui/x-date-pickers'; import { Controller, useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; + +import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; import type { ScenarioRecurrenceInput } from '../../../../utils/api-types'; -import { zodImplement } from '../../../../utils/Zod'; import { generateDailyCron, generateMonthlyCron, generateWeeklyCron, parseCron } from '../../../../utils/Cron'; -import Transition from '../../../../components/common/Transition'; import { minutesInFuture } from '../../../../utils/Time'; +import { zodImplement } from '../../../../utils/Zod'; interface Props { - onSubmit: (cron: string, start: string, end?: string) => void, - onSelectRecurring: (selectRecurring: string) => void, - selectRecurring: string, - initialValues: ScenarioRecurrenceInput - open: boolean - setOpen: (open: boolean) => void, + onSubmit: (cron: string, start: string, end?: string) => void; + onSelectRecurring: (selectRecurring: string) => void; + selectRecurring: string; + initialValues: ScenarioRecurrenceInput; + open: boolean; + setOpen: (open: boolean) => void; } interface Recurrence { - startDate: string, - endDate?: string | null, - time: string | null, - onlyWeekday: boolean, - dayOfWeek?: 1 | 2 | 3 | 4 | 5 | 6 | 7, - weekOfMonth?: 1 | 2 | 3 | 4 | 5, + startDate: string; + endDate?: string | null; + time: string | null; + onlyWeekday: boolean; + dayOfWeek?: 1 | 2 | 3 | 4 | 5 | 6 | 7; + weekOfMonth?: 1 | 2 | 3 | 4 | 5; } const defaultFormValues = () => ({ @@ -168,7 +169,7 @@ const ScenarioRecurringFormDialog: React.FC = ({ onSubmit, selectRecurrin value={selectRecurring} label={t('Recurrence')} variant="standard" - onChange={(event) => onSelectRecurring(event.target.value)} + onChange={event => onSelectRecurring(event.target.value)} > {t('Does not repeat')} {t('Daily')} @@ -183,7 +184,7 @@ const ScenarioRecurringFormDialog: React.FC = ({ onSubmit, selectRecurrin views={['year', 'month', 'day']} value={field.value ? new Date(field.value) : null} minDate={new Date(new Date().setUTCHours(0, 0, 0, 0))} - onChange={(startDate) => field.onChange(startDate?.toISOString())} + onChange={startDate => field.onChange(startDate?.toISOString())} onAccept={() => { clearErrors('time'); }} @@ -200,69 +201,77 @@ const ScenarioRecurringFormDialog: React.FC = ({ onSubmit, selectRecurrin /> { ['daily'].includes(selectRecurring) - && ( - - } - label={t('Only weekday')} - />)} - /> + && ( + ( + + )} + label={t('Only weekday')} + /> + )} + /> + ) } { ['monthly'].includes(selectRecurring) - && ( - - {t('Week of month')} - - - )} - /> + && ( + ( + + {t('Week of month')} + + + )} + /> + ) } { ['weekly', 'monthly'].includes(selectRecurring) - && ( - - {t('Day of week')} - - - )} - /> + && ( + ( + + {t('Day of week')} + + + )} + /> + ) } = ({ onSubmit, selectRecurrin closeOnSelect={false} value={field.value ? new Date(field.value) : null} minTime={['noRepeat'].includes(selectRecurring) && new Date(new Date().setUTCHours(0, 0, 0, 0)).getTime() === new Date(getValues('startDate')).getTime() ? new Date() : undefined} - onChange={(time) => (field.onChange(time?.toISOString()))} + onChange={time => (field.onChange(time?.toISOString()))} slotProps={{ textField: { fullWidth: true, @@ -290,28 +299,30 @@ const ScenarioRecurringFormDialog: React.FC = ({ onSubmit, selectRecurrin /> { ['daily', 'weekly', 'monthly'].includes(selectRecurring) - && ( - { - return (endDate ? field.onChange(new Date(new Date(endDate).setUTCHours(0, 0, 0, 0)).toISOString()) : null); - }} - slotProps={{ - textField: { - fullWidth: true, - error: !!fieldState.error, - helperText: fieldState.error?.message, - }, - }} - label={t('End date')} - /> - )} - /> + && ( + ( + { + return (endDate ? field.onChange(new Date(new Date(endDate).setUTCHours(0, 0, 0, 0)).toISOString()) : null); + }} + slotProps={{ + textField: { + fullWidth: true, + error: !!fieldState.error, + helperText: fieldState.error?.message, + }, + }} + label={t('End date')} + /> + )} + /> + ) } diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioStatus.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioStatus.tsx index b83563a5a1..2f2808e176 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioStatus.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioStatus.tsx @@ -1,9 +1,10 @@ -import { FunctionComponent } from 'react'; -import { makeStyles } from '@mui/styles'; import { Chip } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { FunctionComponent } from 'react'; + import { useFormatter } from '../../../../components/i18n'; -import { inlineStylesColors } from '../../../../utils/Colors'; import type { Scenario } from '../../../../utils/api-types'; +import { inlineStylesColors } from '../../../../utils/Colors'; const useStyles = makeStyles(() => ({ chip: { diff --git a/openbas-front/src/admin/components/scenarios/scenario/ScenarioUpdate.tsx b/openbas-front/src/admin/components/scenarios/scenario/ScenarioUpdate.tsx index c242cd9dd5..9003b6786a 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/ScenarioUpdate.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/ScenarioUpdate.tsx @@ -1,15 +1,16 @@ import { Box, Tab, Tabs } from '@mui/material'; import { FunctionComponent, useState } from 'react'; import * as React from 'react'; -import ScenarioForm from '../ScenarioForm'; -import EmailParametersForm, { SettingUpdateInput } from '../../common/simulate/EmailParametersForm'; + +import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; +import { updateScenario, updateScenarioInformation } from '../../../../actions/scenarios/scenario-actions'; import Drawer from '../../../../components/common/Drawer'; import { useFormatter } from '../../../../components/i18n'; import type { ScenarioInformationInput, ScenarioInput } from '../../../../utils/api-types'; -import { updateScenario, updateScenarioInformation } from '../../../../actions/scenarios/scenario-actions'; import { useAppDispatch } from '../../../../utils/hooks'; -import type { ScenarioStore } from '../../../../actions/scenarios/Scenario'; import useScenarioPermissions from '../../../../utils/Scenario'; +import EmailParametersForm, { SettingUpdateInput } from '../../common/simulate/EmailParametersForm'; +import ScenarioForm from '../ScenarioForm'; interface Props { scenario: ScenarioStore; diff --git a/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx b/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx index cb666a8a7a..f9e8433300 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/articles/ScenarioArticles.tsx @@ -1,11 +1,12 @@ import { useParams } from 'react-router-dom'; -import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; + import { fetchScenarioArticles } from '../../../../../actions/channels/article-action'; -import Articles from '../../../common/articles/Articles'; -import { useAppDispatch } from '../../../../../utils/hooks'; import type { ArticlesHelper } from '../../../../../actions/channels/article-helper'; import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; +import { useHelper } from '../../../../../store'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import Articles from '../../../common/articles/Articles'; import { ArticleContext } from '../../../common/Context'; import articleContextForScenario from './articleContextForScenario'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/challenges/ScenarioChallenges.tsx b/openbas-front/src/admin/components/scenarios/scenario/challenges/ScenarioChallenges.tsx index a74aa3d99d..429c43a6a6 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/challenges/ScenarioChallenges.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/challenges/ScenarioChallenges.tsx @@ -1,10 +1,11 @@ import { useParams } from 'react-router-dom'; -import { useAppDispatch } from '../../../../../utils/hooks'; + +import { fetchScenarioChallenges } from '../../../../../actions/Challenge'; +import type { ChallengeHelper } from '../../../../../actions/helper'; import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; import { useHelper } from '../../../../../store'; -import type { ChallengeHelper } from '../../../../../actions/helper'; +import { useAppDispatch } from '../../../../../utils/hooks'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { fetchScenarioChallenges } from '../../../../../actions/Challenge'; import ContextualChallenges from '../../../common/challenges/ContextualChallenges'; import { ChallengeContext, ChallengeContextType } from '../../../common/Context'; diff --git a/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx b/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx index 8598643664..4e02d58a00 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/injects/ScenarioInjects.tsx @@ -1,21 +1,22 @@ import { FunctionComponent, useState } from 'react'; import { useParams } from 'react-router-dom'; -import { ArticleContext, TeamContext, ViewModeContext } from '../../../common/Context'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import { useHelper } from '../../../../../store'; -import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; + import type { ArticlesHelper } from '../../../../../actions/channels/article-helper'; import type { ChallengeHelper } from '../../../../../actions/helper'; -import type { VariablesHelper } from '../../../../../actions/variables/variable-helper'; +import { fetchScenarioInjectsSimple } from '../../../../../actions/injects/inject-action'; +import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; +import { fetchScenarioTeams } from '../../../../../actions/scenarios/scenario-actions'; import type { ScenariosHelper } from '../../../../../actions/scenarios/scenario-helper'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { fetchVariablesForScenario } from '../../../../../actions/variables/variable-actions'; -import { fetchScenarioTeams } from '../../../../../actions/scenarios/scenario-actions'; +import type { VariablesHelper } from '../../../../../actions/variables/variable-helper'; +import { useHelper } from '../../../../../store'; import type { Scenario } from '../../../../../utils/api-types'; -import articleContextForScenario from '../articles/articleContextForScenario'; -import teamContextForScenario from '../teams/teamContextForScenario'; -import { fetchScenarioInjectsSimple } from '../../../../../actions/injects/inject-action'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { ArticleContext, TeamContext, ViewModeContext } from '../../../common/Context'; import Injects from '../../../common/injects/Injects'; +import articleContextForScenario from '../articles/articleContextForScenario'; +import teamContextForScenario from '../teams/teamContextForScenario'; const ScenarioInjects: FunctionComponent = () => { // Standard hooks diff --git a/openbas-front/src/admin/components/scenarios/scenario/lessons/ScenarioLessons.tsx b/openbas-front/src/admin/components/scenarios/scenario/lessons/ScenarioLessons.tsx index 55a3289d5d..cad5086bc8 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/lessons/ScenarioLessons.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/lessons/ScenarioLessons.tsx @@ -1,19 +1,14 @@ import { useParams } from 'react-router-dom'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; -import Lessons from '../../../lessons/scenarios/Lessons'; -import { LessonContext, LessonContextType } from '../../../common/Context'; -import { fetchLessonsTemplates } from '../../../../../actions/Lessons'; -import { fetchScenarioInjects } from '../../../../../actions/Inject'; -import { useHelper } from '../../../../../store'; + +import { addScenarioEvaluation, fetchScenarioEvaluations, updateScenarioEvaluation } from '../../../../../actions/Evaluation'; import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; +import type { UserHelper } from '../../../../../actions/helper'; +import { fetchScenarioInjects } from '../../../../../actions/Inject'; import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; +import { fetchLessonsTemplates } from '../../../../../actions/Lessons'; import type { LessonsTemplatesHelper } from '../../../../../actions/lessons/lesson-helper'; -import type { ScenariosHelper } from '../../../../../actions/scenarios/scenario-helper'; -import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; -import type { UserHelper } from '../../../../../actions/helper'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { fetchPlayers } from '../../../../../actions/User'; +import { addScenarioObjective, deleteScenarioObjective, fetchScenarioObjectives, updateScenarioObjective } from '../../../../../actions/Objective'; +import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; import { addLessonsCategory, addLessonsQuestion, @@ -29,6 +24,11 @@ import { updateLessonsQuestion, updateScenarioLessons, } from '../../../../../actions/scenarios/scenario-actions'; +import type { ScenariosHelper } from '../../../../../actions/scenarios/scenario-helper'; +import { fetchTeams } from '../../../../../actions/teams/team-actions'; +import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; +import { fetchPlayers } from '../../../../../actions/User'; +import { useHelper } from '../../../../../store'; import type { EvaluationInput, LessonsCategoryCreateInput, @@ -38,10 +38,11 @@ import type { LessonsQuestionUpdateInput, ObjectiveInput, } from '../../../../../utils/api-types'; -import { addScenarioObjective, deleteScenarioObjective, fetchScenarioObjectives, updateScenarioObjective } from '../../../../../actions/Objective'; -import { addScenarioEvaluation, fetchScenarioEvaluations, updateScenarioEvaluation } from '../../../../../actions/Evaluation'; -import { fetchTeams } from '../../../../../actions/teams/team-actions'; import { usePermissions } from '../../../../../utils/Exercise'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { LessonContext, LessonContextType } from '../../../common/Context'; +import Lessons from '../../../lessons/scenarios/Lessons'; const ScenarioLessons = () => { const dispatch = useAppDispatch(); @@ -140,7 +141,8 @@ const ScenarioLessons = () => { return ( - { lessonsQuestions={lessonsQuestions} lessonsTemplates={lessonsTemplates} usersMap={usersMap} - > + > + ); }; diff --git a/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx b/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx index 13ae8f3a86..a15018ac49 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/teams/ScenarioTeams.tsx @@ -1,24 +1,25 @@ -import { useParams } from 'react-router-dom'; +import { Paper, Typography } from '@mui/material'; import { useContext, useEffect, useState } from 'react'; import * as React from 'react'; -import { Paper, Typography } from '@mui/material'; -import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { useAppDispatch } from '../../../../../utils/hooks'; +import { useParams } from 'react-router-dom'; + +import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; import { fetchScenarioTeams, } from '../../../../../actions/scenarios/scenario-actions'; import type { ScenariosHelper } from '../../../../../actions/scenarios/scenario-helper'; -import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; import type { TeamStore } from '../../../../../actions/teams/Team'; -import { PermissionsContext, TeamContext } from '../../../common/Context'; -import UpdateTeams from '../../../components/teams/UpdateTeams'; import { useFormatter } from '../../../../../components/i18n'; +import { useHelper } from '../../../../../store'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { PermissionsContext, TeamContext } from '../../../common/Context'; import ContextualTeams from '../../../components/teams/ContextualTeams'; +import UpdateTeams from '../../../components/teams/UpdateTeams'; import teamContextForScenario from './teamContextForScenario'; interface Props { - scenarioTeamsUsers: ScenarioStore['scenario_teams_users'], + scenarioTeamsUsers: ScenarioStore['scenario_teams_users']; } const ScenarioTeams: React.FC = ({ scenarioTeamsUsers }) => { @@ -47,11 +48,12 @@ const ScenarioTeams: React.FC = ({ scenarioTeamsUsers }) => { {t('Teams')} {permissions.canWrite - && team.team_id)} setTeams={(ts: TeamStore[]) => setTeams(ts)} - /> - } + /> + )}
    diff --git a/openbas-front/src/admin/components/scenarios/scenario/tests/ScenarioTests.tsx b/openbas-front/src/admin/components/scenarios/scenario/tests/ScenarioTests.tsx index 1578a71264..3863981ba3 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/tests/ScenarioTests.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/tests/ScenarioTests.tsx @@ -1,12 +1,13 @@ import { FunctionComponent } from 'react'; import { useParams } from 'react-router-dom'; + +import { fetchInjectTestStatus, searchScenarioInjectTests } from '../../../../../actions/inject_test/inject-test-actions'; import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; import type { InjectTestStatus } from '../../../../../utils/api-types'; -import { fetchInjectTestStatus, searchScenarioInjectTests } from '../../../../../actions/inject_test/inject-test-actions'; import InjectTestList from '../../../injects/InjectTestList'; const ScenarioTests: FunctionComponent = () => { - const { scenarioId, statusId } = useParams() as { scenarioId: ScenarioStore['scenario_id'], statusId: InjectTestStatus['status_id'] }; + const { scenarioId, statusId } = useParams() as { scenarioId: ScenarioStore['scenario_id']; statusId: InjectTestStatus['status_id'] }; return ( diff --git a/openbas-front/src/admin/components/scenarios/scenario/variables/ScenarioVariables.tsx b/openbas-front/src/admin/components/scenarios/scenario/variables/ScenarioVariables.tsx index 423a2d9e39..6bf02a9b4e 100644 --- a/openbas-front/src/admin/components/scenarios/scenario/variables/ScenarioVariables.tsx +++ b/openbas-front/src/admin/components/scenarios/scenario/variables/ScenarioVariables.tsx @@ -1,17 +1,18 @@ +import { Paper, Typography } from '@mui/material'; import { useContext } from 'react'; import { useParams } from 'react-router-dom'; -import { Paper, Typography } from '@mui/material'; -import Variables from '../../../components/variables/Variables'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; + +import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; import { addVariableForScenario, deleteVariableForScenario, fetchVariablesForScenario, updateVariableForScenario } from '../../../../../actions/variables/variable-actions'; import type { VariablesHelper } from '../../../../../actions/variables/variable-helper'; -import type { ScenarioStore } from '../../../../../actions/scenarios/Scenario'; -import { PermissionsContext, VariableContext, VariableContextType } from '../../../common/Context'; -import type { Variable, VariableInput } from '../../../../../utils/api-types'; import { useFormatter } from '../../../../../components/i18n'; +import { useHelper } from '../../../../../store'; +import type { Variable, VariableInput } from '../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { PermissionsContext, VariableContext, VariableContextType } from '../../../common/Context'; import CreateVariable from '../../../components/variables/CreateVariable'; +import Variables from '../../../components/variables/Variables'; const ScenarioVariables = () => { // Standard hooks diff --git a/openbas-front/src/admin/components/search/FullTextSearch.tsx b/openbas-front/src/admin/components/search/FullTextSearch.tsx index f4331438b1..bd6f907fa7 100644 --- a/openbas-front/src/admin/components/search/FullTextSearch.tsx +++ b/openbas-front/src/admin/components/search/FullTextSearch.tsx @@ -1,21 +1,22 @@ +import { KeyboardArrowRight } from '@mui/icons-material'; +import { TabPanelProps } from '@mui/lab'; +import { Box, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Tab, Tabs } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { CSSProperties, useEffect, useState } from 'react'; import * as React from 'react'; import { Link, useSearchParams } from 'react-router-dom'; -import { Box, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Tab, Tabs } from '@mui/material'; -import { makeStyles } from '@mui/styles'; -import { TabPanelProps } from '@mui/lab'; -import { KeyboardArrowRight } from '@mui/icons-material'; + import { fullTextSearch, fullTextSearchByClass } from '../../../actions/fullTextSearch-action'; -import type { FullTextSearchCountResult, FullTextSearchResult, SearchPaginationInput } from '../../../utils/api-types'; -import { useFormatter } from '../../../components/i18n'; import Breadcrumbs from '../../../components/Breadcrumbs'; -import { Header } from '../../../components/common/SortHeadersList'; -import useEntityLink from './useEntityLink'; -import useEntityIcon from '../../../utils/hooks/useEntityIcon'; -import type { Theme } from '../../../components/Theme'; import PaginationComponent from '../../../components/common/pagination/PaginationComponent'; -import ItemTags from '../../../components/ItemTags'; import { buildSearchPagination } from '../../../components/common/queryable/QueryableUtils'; +import { Header } from '../../../components/common/SortHeadersList'; +import { useFormatter } from '../../../components/i18n'; +import ItemTags from '../../../components/ItemTags'; +import type { Theme } from '../../../components/Theme'; +import type { FullTextSearchCountResult, FullTextSearchResult, SearchPaginationInput } from '../../../utils/api-types'; +import useEntityIcon from '../../../utils/hooks/useEntityIcon'; +import useEntityLink from './useEntityLink'; const useStyles = makeStyles((theme: Theme) => ({ container: { @@ -61,7 +62,7 @@ const inlineStyles: Record = { }, }; -const TabPanel = (props: TabPanelProps & { index: number, entity: string, searchPaginationInput: SearchPaginationInput }) => { +const TabPanel = (props: TabPanelProps & { index: number; entity: string; searchPaginationInput: SearchPaginationInput }) => { const { value, index, entity, searchPaginationInput } = props; // Standard hooks @@ -87,7 +88,7 @@ const TabPanel = (props: TabPanelProps & { index: number, entity: string, search {value === index.toString() && ( <> fullTextSearchByClass(entity, { ...input, ...searchPaginationInput })} + fetch={input => fullTextSearchByClass(entity, { ...input, ...searchPaginationInput })} searchPaginationInput={searchPaginationInput} setContent={setElements} searchEnable={false} @@ -100,10 +101,11 @@ const TabPanel = (props: TabPanelProps & { index: number, entity: string, search > - {fields.map((header) => ( -
    ( +
    @@ -111,11 +113,11 @@ const TabPanel = (props: TabPanelProps & { index: number, entity: string, search
    ))}
    - } + )} /> - {elements.map((result) => ( + {elements.map(result => ( - {fields.map((field) => ( + {fields.map(field => (
    ))}
    - } + )} /> @@ -187,9 +189,11 @@ const FullTextSearch = () => { return ( <> - { diff --git a/openbas-front/src/admin/components/settings/Index.tsx b/openbas-front/src/admin/components/settings/Index.tsx index f1b3e981d2..1785d9eeeb 100644 --- a/openbas-front/src/admin/components/settings/Index.tsx +++ b/openbas-front/src/admin/components/settings/Index.tsx @@ -1,14 +1,15 @@ import { Navigate, Route, Routes } from 'react-router-dom'; + +import { errorWrapper } from '../../../components/Error'; +import NotFound from '../../../components/NotFound'; +import AttackPatterns from './attack_patterns/AttackPatterns'; import XlsMappers from './data_ingestion/XlsMappers'; -import Parameters from './Parameters'; -import Users from './users/Users'; import Groups from './groups/Groups'; -import Tags from './tags/Tags'; -import AttackPatterns from './attack_patterns/AttackPatterns'; import KillChainPhases from './kill_chain_phases/KillChainPhases'; +import Parameters from './Parameters'; import Policies from './policies/Policies'; -import { errorWrapper } from '../../../components/Error'; -import NotFound from '../../../components/NotFound'; +import Tags from './tags/Tags'; +import Users from './users/Users'; const Index = () => ( diff --git a/openbas-front/src/admin/components/settings/Parameters.tsx b/openbas-front/src/admin/components/settings/Parameters.tsx index f29fdc9010..3c5ebe6e3f 100644 --- a/openbas-front/src/admin/components/settings/Parameters.tsx +++ b/openbas-front/src/admin/components/settings/Parameters.tsx @@ -1,7 +1,6 @@ -import { makeStyles } from '@mui/styles'; import { Button, Grid, List, ListItem, ListItemText, Paper, Switch, TextField, Typography } from '@mui/material'; -import ParametersForm from './ParametersForm'; -import { useFormatter } from '../../../components/i18n'; +import { makeStyles } from '@mui/styles'; + import { fetchPlatformParameters, updatePlatformDarkParameters, @@ -10,15 +9,17 @@ import { updatePlatformParameters, updatePlatformWhitemarkParameters, } from '../../../actions/Application'; -import useDataLoader from '../../../utils/hooks/useDataLoader'; +import type { LoggedHelper } from '../../../actions/helper'; +import Breadcrumbs from '../../../components/Breadcrumbs'; +import { useFormatter } from '../../../components/i18n'; import ItemBoolean from '../../../components/ItemBoolean'; -import ThemeForm from './ThemeForm'; -import { useAppDispatch } from '../../../utils/hooks'; import { useHelper } from '../../../store'; -import type { LoggedHelper } from '../../../actions/helper'; import type { PlatformSettings, SettingsEnterpriseEditionUpdateInput, SettingsPlatformWhitemarkUpdateInput, SettingsUpdateInput, ThemeInput } from '../../../utils/api-types'; -import Breadcrumbs from '../../../components/Breadcrumbs'; +import { useAppDispatch } from '../../../utils/hooks'; +import useDataLoader from '../../../utils/hooks/useDataLoader'; import EnterpriseEditionButton from '../common/entreprise_edition/EnterpriseEditionButton'; +import ParametersForm from './ParametersForm'; +import ThemeForm from './ThemeForm'; const useStyles = makeStyles(() => ({ container: { @@ -140,7 +141,9 @@ const Parameters = () => { label={ // eslint-disable-next-line no-nested-ternary !settings.platform_ai_enabled ? t('Disabled') : settings.platform_ai_has_token - ? settings.platform_ai_type : `${settings.platform_ai_type} - ${t('Missing token')}`} + ? settings.platform_ai_type + : `${settings.platform_ai_type} - ${t('Missing token')}` + } status={(settings.platform_ai_enabled) && (settings.platform_ai_has_token)} tooltip={settings.platform_ai_has_token ? `${settings.platform_ai_type} - ${settings.platform_ai_model}` : t('The token is missing in your platform configuration, please ask your Filigran representative to provide you with it or with on-premise deployment instructions. Your can open a support ticket to do so.')} /> diff --git a/openbas-front/src/admin/components/settings/ParametersForm.js b/openbas-front/src/admin/components/settings/ParametersForm.js index cd195870b1..f32b08b8f5 100644 --- a/openbas-front/src/admin/components/settings/ParametersForm.js +++ b/openbas-front/src/admin/components/settings/ParametersForm.js @@ -1,9 +1,10 @@ +import { Button, MenuItem } from '@mui/material'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; -import { MenuItem, Button } from '@mui/material'; + import OldSelectField from '../../../components/fields/OldSelectField'; -import inject18n from '../../../components/i18n'; import OldTextField from '../../../components/fields/OldTextField'; +import inject18n from '../../../components/i18n'; const ParametersForm = (props) => { const { t, onSubmit, initialValues } = props; diff --git a/openbas-front/src/admin/components/settings/SecurityMenu.tsx b/openbas-front/src/admin/components/settings/SecurityMenu.tsx index f68aee271f..e734ee3c36 100644 --- a/openbas-front/src/admin/components/settings/SecurityMenu.tsx +++ b/openbas-front/src/admin/components/settings/SecurityMenu.tsx @@ -1,5 +1,6 @@ -import * as React from 'react'; import { GroupsOutlined, LocalPoliceOutlined, PermIdentityOutlined } from '@mui/icons-material'; +import * as React from 'react'; + import RightMenu, { RightMenuEntry } from '../../../components/common/RightMenu'; const SecurityMenu: React.FC = () => { diff --git a/openbas-front/src/admin/components/settings/TaxonomiesMenu.tsx b/openbas-front/src/admin/components/settings/TaxonomiesMenu.tsx index c7194871dd..9f33d1ed08 100644 --- a/openbas-front/src/admin/components/settings/TaxonomiesMenu.tsx +++ b/openbas-front/src/admin/components/settings/TaxonomiesMenu.tsx @@ -1,9 +1,10 @@ +import { RouteOutlined, StyleOutlined } from '@mui/icons-material'; +import { Drawer, ListItemIcon, ListItemText, MenuItem, MenuList } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { LockPattern } from 'mdi-material-ui'; import * as React from 'react'; import { Link, useLocation } from 'react-router-dom'; -import { Drawer, MenuList, MenuItem, ListItemIcon, ListItemText } from '@mui/material'; -import { LockPattern } from 'mdi-material-ui'; -import { StyleOutlined, RouteOutlined } from '@mui/icons-material'; -import { makeStyles } from '@mui/styles'; + import { useFormatter } from '../../../components/i18n'; import type { Theme } from '../../../components/Theme'; @@ -37,7 +38,7 @@ const DefinitionMenu: React.FC = () => { { { ; diff --git a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternForm.js b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternForm.js index 259211352d..e7cffc821e 100644 --- a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternForm.js +++ b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternForm.js @@ -1,6 +1,7 @@ +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import OldTextField from '../../../../components/fields/OldTextField'; import { useFormatter } from '../../../../components/i18n'; import KillChainPhaseField from '../../../../components/KillChainPhaseField'; diff --git a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternPopover.js b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternPopover.js index f7cc03cff6..6446eab773 100644 --- a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternPopover.js +++ b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatternPopover.js @@ -1,14 +1,15 @@ +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; +import * as R from 'ramda'; import { useState } from 'react'; import { useDispatch } from 'react-redux'; -import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; + import { deleteAttackPattern, updateAttackPattern } from '../../../../actions/AttackPattern'; -import AttackPatternForm from './AttackPatternForm'; +import Drawer from '../../../../components/common/Drawer'; +import Transition from '../../../../components/common/Transition'; import { useFormatter } from '../../../../components/i18n'; import { killChainPhaseOptions } from '../../../../utils/Option'; -import Transition from '../../../../components/common/Transition'; -import Drawer from '../../../../components/common/Drawer'; +import AttackPatternForm from './AttackPatternForm'; const AttackPatternPopover = ({ attackPattern, killChainPhasesMap, onUpdate, onDelete }) => { const [openDelete, setOpenDelete] = useState(false); diff --git a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatterns.js b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatterns.js index 56f062cb50..91cf2c47fe 100644 --- a/openbas-front/src/admin/components/settings/attack_patterns/AttackPatterns.js +++ b/openbas-front/src/admin/components/settings/attack_patterns/AttackPatterns.js @@ -1,20 +1,21 @@ -import { useState } from 'react'; -import { useDispatch } from 'react-redux'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { LockPattern } from 'mdi-material-ui'; +import { useState } from 'react'; +import { useDispatch } from 'react-redux'; + import { searchAttackPatterns } from '../../../../actions/AttackPattern'; -import CreateAttackPattern from './CreateAttackPattern'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../../store'; -import AttackPatternPopover from './AttackPatternPopover'; -import TaxonomiesMenu from '../TaxonomiesMenu'; import { fetchKillChainPhases } from '../../../../actions/KillChainPhase'; +import Breadcrumbs from '../../../../components/Breadcrumbs'; import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; import { initSorting } from '../../../../components/common/queryable/Page'; import { useFormatter } from '../../../../components/i18n'; -import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { useHelper } from '../../../../store'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import TaxonomiesMenu from '../TaxonomiesMenu'; +import AttackPatternPopover from './AttackPatternPopover'; +import CreateAttackPattern from './CreateAttackPattern'; const useStyles = makeStyles(() => ({ container: { @@ -67,7 +68,7 @@ const AttackPatterns = () => { const classes = useStyles(); const dispatch = useDispatch(); const { t, nsdt } = useFormatter(); - const { killChainPhasesMap } = useHelper((helper) => ({ + const { killChainPhasesMap } = useHelper(helper => ({ killChainPhasesMap: helper.getKillChainPhasesMap(), })); useDataLoader(() => { @@ -129,18 +130,18 @@ const AttackPatterns = () => { - } + )} />   - {attackPatterns.map((attackPattern) => ( + {attackPatterns.map(attackPattern => ( {
    { @@ -172,21 +173,21 @@ const AttackPatterns = () => { {nsdt(attackPattern.attack_pattern_updated_at)}
    - } + )} /> setAttackPatterns(attackPatterns.map((a) => (a.attack_pattern_id !== result.attack_pattern_id ? a : result)))} - onDelete={(result) => setAttackPatterns(attackPatterns.filter((a) => (a.attack_pattern_id !== result)))} + onUpdate={result => setAttackPatterns(attackPatterns.map(a => (a.attack_pattern_id !== result.attack_pattern_id ? a : result)))} + onDelete={result => setAttackPatterns(attackPatterns.filter(a => (a.attack_pattern_id !== result)))} /> ))} setAttackPatterns([result, ...attackPatterns])} + onCreate={result => setAttackPatterns([result, ...attackPatterns])} />
    ); diff --git a/openbas-front/src/admin/components/settings/attack_patterns/CreateAttackPattern.js b/openbas-front/src/admin/components/settings/attack_patterns/CreateAttackPattern.js index fe8a007918..178d62a32b 100644 --- a/openbas-front/src/admin/components/settings/attack_patterns/CreateAttackPattern.js +++ b/openbas-front/src/admin/components/settings/attack_patterns/CreateAttackPattern.js @@ -1,14 +1,15 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import * as R from 'ramda'; +import { Add } from '@mui/icons-material'; import { Fab } from '@mui/material'; import { withStyles } from '@mui/styles'; -import { Add } from '@mui/icons-material'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; +import { connect } from 'react-redux'; + import { addAttackPattern } from '../../../../actions/AttackPattern'; -import AttackPatternForm from './AttackPatternForm'; -import inject18n from '../../../../components/i18n'; import Drawer from '../../../../components/common/Drawer'; +import inject18n from '../../../../components/i18n'; +import AttackPatternForm from './AttackPatternForm'; const styles = () => ({ createButton: { diff --git a/openbas-front/src/admin/components/settings/data_ingestion/AttributeUtils.ts b/openbas-front/src/admin/components/settings/data_ingestion/AttributeUtils.ts index 1c0a6af90c..1f92c1d931 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/AttributeUtils.ts +++ b/openbas-front/src/admin/components/settings/data_ingestion/AttributeUtils.ts @@ -1,12 +1,12 @@ const alphabet = (size = 0) => { const fn = () => Array.from(Array(26)) .map((_, i) => i + 65) - .map((x) => String.fromCharCode(x)); + .map(x => String.fromCharCode(x)); const letters: string[] = fn(); for (let step = 0; step < size; step += 1) { const additionalLetters = fn(); const firstLetter = additionalLetters[step]; - letters.push(...additionalLetters.map((l) => firstLetter.concat(l))); + letters.push(...additionalLetters.map(l => firstLetter.concat(l))); } return letters; }; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/ImportUploaderMapper.tsx b/openbas-front/src/admin/components/settings/data_ingestion/ImportUploaderMapper.tsx index 2649e352a1..2be29adb4c 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/ImportUploaderMapper.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/ImportUploaderMapper.tsx @@ -1,13 +1,14 @@ import { useNavigate } from 'react-router-dom'; -import ImportUploader from '../../../../components/common/ImportUploader'; + import { importMapper } from '../../../../actions/mapper/mapper-actions'; +import ImportUploader from '../../../../components/common/ImportUploader'; const ImportUploaderMapper = () => { // Standard hooks const navigate = useNavigate(); const handleUpload = async (formData: FormData) => { - importMapper(formData).then((result: { data: { [x: string]: string; } }) => { + importMapper(formData).then((result: { data: { [x: string]: string } }) => { if (!Object.prototype.hasOwnProperty.call(result, 'FINAL_FORM/form-error')) { navigate(0); } @@ -16,7 +17,7 @@ const ImportUploaderMapper = () => { return ( ); diff --git a/openbas-front/src/admin/components/settings/data_ingestion/XlsMapperPopover.tsx b/openbas-front/src/admin/components/settings/data_ingestion/XlsMapperPopover.tsx index 0da44df362..dd70a8289f 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/XlsMapperPopover.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/XlsMapperPopover.tsx @@ -1,14 +1,15 @@ import { FunctionComponent, useState } from 'react'; -import { PopoverEntry } from '../../../../components/common/ButtonPopover'; -import IconPopover from '../../../../components/common/IconPopover'; -import type { RawPaginationImportMapper } from '../../../../utils/api-types'; + import { deleteMapper, duplicateMapper, exportMapper } from '../../../../actions/mapper/mapper-actions'; +import { PopoverEntry } from '../../../../components/common/ButtonPopover'; import DialogDelete from '../../../../components/common/DialogDelete'; -import { useFormatter } from '../../../../components/i18n'; +import DialogDuplicate from '../../../../components/common/DialogDuplicate'; import Drawer from '../../../../components/common/Drawer'; -import XlsMapperUpdate from './xls_mapper/XlsMapperUpdate'; +import IconPopover from '../../../../components/common/IconPopover'; +import { useFormatter } from '../../../../components/i18n'; +import type { RawPaginationImportMapper } from '../../../../utils/api-types'; import { download } from '../../../../utils/utils'; -import DialogDuplicate from '../../../../components/common/DialogDuplicate'; +import XlsMapperUpdate from './xls_mapper/XlsMapperUpdate'; interface Props { mapper: RawPaginationImportMapper; @@ -66,7 +67,7 @@ const XlsMapperPopover: FunctionComponent = ({ ids_to_export: [mapper.import_mapper_id], export_mapper_name: mapper.import_mapper_name, }).then( - (result:{ data: string, filename: string }) => { + (result: { data: string; filename: string }) => { download(JSON.stringify(result.data, null, 2), result.filename, 'application/json'); }, ); diff --git a/openbas-front/src/admin/components/settings/data_ingestion/XlsMappers.tsx b/openbas-front/src/admin/components/settings/data_ingestion/XlsMappers.tsx index 602e0e9e6a..27d0bbb0f5 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/XlsMappers.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/XlsMappers.tsx @@ -1,20 +1,21 @@ -import { CSSProperties, useState } from 'react'; -import { makeStyles } from '@mui/styles'; -import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { TableViewOutlined } from '@mui/icons-material'; -import { useFormatter } from '../../../../components/i18n'; +import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { CSSProperties, useState } from 'react'; + +import { searchMappers } from '../../../../actions/mapper/mapper-actions'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; -import type { RawPaginationImportMapper, SearchPaginationInput } from '../../../../utils/api-types'; -import { searchMappers } from '../../../../actions/mapper/mapper-actions'; import { initSorting } from '../../../../components/common/queryable/Page'; +import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; import Empty from '../../../../components/Empty'; +import { useFormatter } from '../../../../components/i18n'; +import type { RawPaginationImportMapper, SearchPaginationInput } from '../../../../utils/api-types'; import DataIngestionMenu from '../DataIngestionMenu'; +import ImportUploaderMapper from './ImportUploaderMapper'; import XlsMapperCreation from './xls_mapper/XlsMapperCreation'; -import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import XlsMapperPopover from './XlsMapperPopover'; -import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils'; -import ImportUploaderMapper from './ImportUploaderMapper'; const useStyles = makeStyles(() => ({ container: { @@ -79,7 +80,7 @@ const XlsMappers = () => { searchPaginationInput={searchPaginationInput} setContent={setMappers} > - + { > { setSearchPaginationInput={setSearchPaginationInput} defaultSortAsc /> - } + )} /> { @@ -112,9 +113,9 @@ const XlsMappers = () => { - {headers.map((header) => ( + {headers.map(header => (
    {
    ))}
    - } + )} /> setMappers([result, ...mappers])} - onUpdate={(result) => setMappers(mappers.map((existing) => (existing.import_mapper_id !== result.import_mapper_id ? existing : result)))} - onDelete={(result) => setMappers(mappers.filter((existing) => (existing.import_mapper_id !== result)))} + onDuplicate={result => setMappers([result, ...mappers])} + onUpdate={result => setMappers(mappers.map(existing => (existing.import_mapper_id !== result.import_mapper_id ? existing : result)))} + onDelete={result => setMappers(mappers.filter(existing => (existing.import_mapper_id !== result)))} /> @@ -140,7 +141,7 @@ const XlsMappers = () => { } {!mappers ? () : null} - setMappers([result, ...mappers])} /> + setMappers([result, ...mappers])} />
    ); }; diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/MapperForm.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/MapperForm.tsx index 4038c896e5..ebf3542eca 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/MapperForm.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/MapperForm.tsx @@ -1,15 +1,16 @@ -import { Controller, SubmitHandler, useFieldArray, useForm } from 'react-hook-form'; -import { useState } from 'react'; -import * as React from 'react'; -import { Button, IconButton, TextField, Typography } from '@mui/material'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Add } from '@mui/icons-material'; +import { Button, IconButton, TextField, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { zodResolver } from '@hookform/resolvers/zod'; +import { useState } from 'react'; +import * as React from 'react'; +import { Controller, SubmitHandler, useFieldArray, useForm } from 'react-hook-form'; import { z } from 'zod'; -import type { ImportMapperAddInput } from '../../../../../utils/api-types'; + import { useFormatter } from '../../../../../components/i18n'; -import { zodImplement } from '../../../../../utils/Zod'; import RegexComponent from '../../../../../components/RegexComponent'; +import type { ImportMapperAddInput } from '../../../../../utils/api-types'; +import { zodImplement } from '../../../../../utils/Zod'; import RulesContractContent from './RulesContractContent'; import XlsMapperTestDialog from './XlsMapperTestDialog'; @@ -96,7 +97,7 @@ const MapperForm: React.FC = ({
    ( ({ rulesArray: { @@ -80,7 +81,7 @@ const RulesContractContent: React.FC = ({ const [injectorContractLabel, setInjectorContractLabel] = useState(undefined); const isMandatoryField = (fieldKey: string) => { - return ['title'].includes(fieldKey) || contractFields.find((f) => f.key === fieldKey)?.mandatory; + return ['title'].includes(fieldKey) || contractFields.find(f => f.key === fieldKey)?.mandatory; }; const addRules = (contractFieldKeys: string[]) => { @@ -127,12 +128,12 @@ const RulesContractContent: React.FC = ({ useEffect(() => { if (methods.getValues(`import_mapper_inject_importers.${index}.inject_importer_injector_contract`)) { directFetchInjectorContract(methods.getValues(`import_mapper_inject_importers.${index}.inject_importer_injector_contract`)).then((result: { - data: InjectorContractConverted + data: InjectorContractConverted; }) => { const injectorContract = result.data; setInjectorContractLabel(tPick(injectorContract.injector_contract_labels)); const tmp = injectorContract?.convertedContent?.fields - .filter((f) => !['checkbox', 'attachment', 'expectation'].includes(f.type)); + .filter(f => !['checkbox', 'attachment', 'expectation'].includes(f.type)); setContractFields(tmp); }); } @@ -143,9 +144,9 @@ const RulesContractContent: React.FC = ({ const injectorContract = result.data; setInjectorContractLabel(tPick(injectorContract.injector_contract_labels)); const tmp = injectorContract?.convertedContent?.fields - .filter((f) => !['checkbox', 'attachment', 'expectation'].includes(f.type)); + .filter(f => !['checkbox', 'attachment', 'expectation'].includes(f.type)); setContractFields(tmp); - const contractFieldKeys = tmp.map((f) => f.key); + const contractFieldKeys = tmp.map(f => f.key); rulesRemove(); addRules(contractFieldKeys); }); @@ -184,7 +185,10 @@ const RulesContractContent: React.FC = ({ >
    - #{index + 1} {injectorContractLabel ?? t('New representation')} + # + {index + 1} + {' '} + {injectorContractLabel ?? t('New representation')} @@ -236,45 +240,54 @@ const RulesContractContent: React.FC = ({ {rulesFields.map((ruleField, rulesIndex) => { let cogIcon; if (ruleField.rule_attribute_name === 'trigger_time') { - cogIcon = - - ; + cogIcon = ( + + + + ); } else if (ruleField.rule_attribute_name === 'teams') { - cogIcon = - - ; + cogIcon = ( + + + + ); } else { - cogIcon = - - ; + cogIcon = ( + + + + ); } return (
    {t(ruleField.rule_attribute_name[0].toUpperCase() + ruleField.rule_attribute_name.slice(1))} {isMandatoryField(ruleField.rule_attribute_name) - && * - } + && *} = ({
    {currentRuleIndex !== null - && + > {t('Attribute mapping configuration')} @@ -311,8 +325,9 @@ const RulesContractContent: React.FC = ({ label={t('Default value')} inputProps={methods.register(`import_mapper_inject_importers.${index}.inject_importer_rule_attributes.${currentRuleIndex}.rule_attribute_default_value`)} /> - {currentRuleIndex === rulesFields.findIndex((r) => r.rule_attribute_name === 'trigger_time') - &&
    + {currentRuleIndex === rulesFields.findIndex(r => r.rule_attribute_name === 'trigger_time') + && ( +
    = ({ />
    - } - {currentRuleIndex === rulesFields.findIndex((r) => r.rule_attribute_name === 'teams') - &&
    - r.rule_attribute_name === 'teams') + && ( +
    + + + - - - -
    - } + +
    + )}
    - } + )}
    ); - }) - } + })} @@ -383,10 +398,12 @@ const RulesContractContent: React.FC = ({ - diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperCreation.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperCreation.tsx index ece4e5cd98..60312df0f8 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperCreation.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperCreation.tsx @@ -1,12 +1,13 @@ +import { Add } from '@mui/icons-material'; +import { Fab } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useState } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import { Fab } from '@mui/material'; -import { Add } from '@mui/icons-material'; -import { useFormatter } from '../../../../../components/i18n'; -import type { ImportMapperAddInput, RawPaginationImportMapper } from '../../../../../utils/api-types'; + import { createMapper } from '../../../../../actions/mapper/mapper-actions'; import Drawer from '../../../../../components/common/Drawer'; +import { useFormatter } from '../../../../../components/i18n'; +import type { ImportMapperAddInput, RawPaginationImportMapper } from '../../../../../utils/api-types'; import MapperForm from './MapperForm'; const useStyles = makeStyles(() => ({ @@ -27,7 +28,7 @@ const XlsMapperCreation: React.FC = ({ onCreate }) => { const [open, setOpen] = useState(false); - const onSubmit = ((data: ImportMapperAddInput) => { + const onSubmit = (data: ImportMapperAddInput) => { createMapper(data).then( (result: { data: RawPaginationImportMapper }) => { onCreate?.(result.data); @@ -35,7 +36,7 @@ const XlsMapperCreation: React.FC = ({ onCreate }) => { }, ); setOpen(false); - }); + }; return ( <> diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperTestDialog.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperTestDialog.tsx index d16e2cff77..6384f63103 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperTestDialog.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperTestDialog.tsx @@ -1,10 +1,11 @@ import { FunctionComponent, useState } from 'react'; + +import { storeXlsFile } from '../../../../../actions/mapper/mapper-actions'; +import Dialog from '../../../../../components/common/Dialog'; import { useFormatter } from '../../../../../components/i18n'; -import ImportUploaderInjectFromXlsFile from '../../../common/injects/ImportUploaderInjectFromXlsFile'; import type { ImportMapperAddInput, ImportPostSummary } from '../../../../../utils/api-types'; import ImportUploaderInjectFromInjectsTest from '../../../common/injects/ImportUploaderInjectFromInjectsTest'; -import Dialog from '../../../../../components/common/Dialog'; -import { storeXlsFile } from '../../../../../actions/mapper/mapper-actions'; +import ImportUploaderInjectFromXlsFile from '../../../common/injects/ImportUploaderInjectFromXlsFile'; interface IngestionCsvMapperTestDialogProps { open: boolean; @@ -46,19 +47,21 @@ const XlsMapperTestDialog: FunctionComponent > <> {importId === null - && - } + /> + )} {importId !== null - && - } + /> + )} ); diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperUpdate.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperUpdate.tsx index 06ccddbe7c..e2c68e88e4 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperUpdate.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/XlsMapperUpdate.tsx @@ -1,9 +1,10 @@ import { FunctionComponent, useEffect, useState } from 'react'; -import MapperForm from './MapperForm'; + +import { ImportMapperStore } from '../../../../../actions/mapper/mapper'; import { fetchMapper, updateMapper } from '../../../../../actions/mapper/mapper-actions'; -import type { ImportMapperUpdateInput, RawPaginationImportMapper } from '../../../../../utils/api-types'; import Loader from '../../../../../components/Loader'; -import { ImportMapperStore } from '../../../../../actions/mapper/mapper'; +import type { ImportMapperUpdateInput, RawPaginationImportMapper } from '../../../../../utils/api-types'; +import MapperForm from './MapperForm'; interface XlsMapperUpdateComponentProps { xlsMapper: ImportMapperStore; @@ -19,10 +20,10 @@ const XlsMapperUpdateComponent: FunctionComponent const initialValues = { import_mapper_name: xlsMapper.import_mapper_name ?? '', import_mapper_inject_type_column: xlsMapper.import_mapper_inject_type_column ?? '', - import_mapper_inject_importers: xlsMapper.import_mapper_inject_importers?.map((i) => ({ + import_mapper_inject_importers: xlsMapper.import_mapper_inject_importers?.map(i => ({ inject_importer_injector_contract: i.inject_importer_injector_contract, inject_importer_type_value: i.inject_importer_type_value, - inject_importer_rule_attributes: i.inject_importer_rule_attributes?.map((r) => ({ + inject_importer_rule_attributes: i.inject_importer_rule_attributes?.map(r => ({ rule_attribute_name: r.rule_attribute_name, rule_attribute_columns: r.rule_attribute_columns, rule_attribute_default_value: r.rule_attribute_default_value, @@ -31,7 +32,7 @@ const XlsMapperUpdateComponent: FunctionComponent })) ?? [], }; - const onSubmit = ((data: ImportMapperUpdateInput) => { + const onSubmit = (data: ImportMapperUpdateInput) => { updateMapper(xlsMapper.import_mapper_id, data).then( (result: { data: RawPaginationImportMapper }) => { onUpdate?.(result.data); @@ -39,7 +40,7 @@ const XlsMapperUpdateComponent: FunctionComponent }, ); handleClose(); - }); + }; return ( ({ createButton: { @@ -77,7 +78,7 @@ CreateGroup.propTypes = { addGroup: PropTypes.func, }; -const select = (state) => ({ +const select = state => ({ organizations: state.referential.entities.organizations, }); diff --git a/openbas-front/src/admin/components/settings/groups/GroupForm.js b/openbas-front/src/admin/components/settings/groups/GroupForm.js index e6960b7067..d7c088f949 100644 --- a/openbas-front/src/admin/components/settings/groups/GroupForm.js +++ b/openbas-front/src/admin/components/settings/groups/GroupForm.js @@ -1,11 +1,12 @@ -import { Component } from 'react'; +import { InfoOutlined } from '@mui/icons-material'; +import { Button, Grid, Tooltip, Typography } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button, Grid, Tooltip, Typography } from '@mui/material'; -import { InfoOutlined } from '@mui/icons-material'; + import OldTextField from '../../../../components/fields/OldTextField'; -import inject18n from '../../../../components/i18n'; import SwitchField from '../../../../components/fields/SwitchField'; +import inject18n from '../../../../components/i18n'; class GroupForm extends Component { validate(values) { diff --git a/openbas-front/src/admin/components/settings/groups/GroupPopover.js b/openbas-front/src/admin/components/settings/groups/GroupPopover.js index 3f3ea22bad..165216dd4d 100644 --- a/openbas-front/src/admin/components/settings/groups/GroupPopover.js +++ b/openbas-front/src/admin/components/settings/groups/GroupPopover.js @@ -1,7 +1,4 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import * as R from 'ramda'; +import { MoreVert, PersonOutlined } from '@mui/icons-material'; import { Avatar, Box, @@ -29,19 +26,23 @@ import { Tabs, Typography, } from '@mui/material'; -import { MoreVert, PersonOutlined } from '@mui/icons-material'; import { withStyles } from '@mui/styles'; -import { deleteGroup, fetchGroup, updateGroupInformation, updateGroupUsers } from '../../../../actions/Group'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; +import { connect } from 'react-redux'; + import { addGrant, addGroupOrganization, deleteGrant, deleteGroupOrganization } from '../../../../actions/Grant'; -import GroupForm from './GroupForm'; -import SearchFilter from '../../../../components/SearchFilter'; -import inject18n from '../../../../components/i18n'; +import { deleteGroup, fetchGroup, updateGroupInformation, updateGroupUsers } from '../../../../actions/Group'; import { storeHelper } from '../../../../actions/Schema'; +import Drawer from '../../../../components/common/Drawer'; import Transition from '../../../../components/common/Transition'; +import inject18n from '../../../../components/i18n'; import ItemTags from '../../../../components/ItemTags'; -import TagsFilter from '../../common/filters/TagsFilter'; +import SearchFilter from '../../../../components/SearchFilter'; import { resolveUserName, truncate } from '../../../../utils/String'; -import Drawer from '../../../../components/common/Drawer'; +import TagsFilter from '../../common/filters/TagsFilter'; +import GroupForm from './GroupForm'; const styles = () => ({ box: { @@ -144,7 +145,7 @@ class GroupPopover extends Component { removeUser(userId) { this.setState({ - usersIds: R.filter((u) => u !== userId, this.state.usersIds), + usersIds: R.filter(u => u !== userId, this.state.usersIds), }); } @@ -267,7 +268,7 @@ class GroupPopover extends Component { group, ); const { keyword, tags } = this.state; - const filterByKeyword = (n) => keyword === '' + const filterByKeyword = n => keyword === '' || (n.user_email || '').toLowerCase().indexOf(keyword.toLowerCase()) !== -1 || (n.user_firstname || '').toLowerCase().indexOf(keyword.toLowerCase()) @@ -279,11 +280,11 @@ class GroupPopover extends Component { || (n.organization_name || '') .toLowerCase() .indexOf(keyword.toLowerCase()) !== -1 - || (n.organization_description || '') - .toLowerCase() - .indexOf(keyword.toLowerCase()) !== -1; + || (n.organization_description || '') + .toLowerCase() + .indexOf(keyword.toLowerCase()) !== -1; const filteredUsers = R.pipe( - R.map((u) => ({ + R.map(u => ({ organization_name: organizationsMap[u.user_organization]?.organization_name ?? '-', organization_description: @@ -292,9 +293,9 @@ class GroupPopover extends Component { ...u, })), R.filter( - (n) => tags.length === 0 + n => tags.length === 0 || R.any( - (filter) => R.includes(filter, n.user_tags), + filter => R.includes(filter, n.user_tags), R.pluck('id', tags), ), ), @@ -471,11 +472,11 @@ class GroupPopover extends Component { {this.props.scenarios.map((scenario) => { const grantPlanner = R.find( - (g) => g.grant_scenario === scenario.scenario_id + g => g.grant_scenario === scenario.scenario_id && g.grant_name === 'PLANNER', )(group.group_grants); const grantObserver = R.find( - (g) => g.grant_scenario === scenario.scenario_id + g => g.grant_scenario === scenario.scenario_id && g.grant_name === 'OBSERVER', )(group.group_grants); const grantPlannerId = R.propOr( @@ -539,11 +540,11 @@ class GroupPopover extends Component { {this.props.exercises.map((exercise) => { const grantPlanner = R.find( - (g) => g.grant_exercise === exercise.exercise_id + g => g.grant_exercise === exercise.exercise_id && g.grant_name === 'PLANNER', )(group.group_grants); const grantObserver = R.find( - (g) => g.grant_exercise === exercise.exercise_id + g => g.grant_exercise === exercise.exercise_id && g.grant_name === 'OBSERVER', )(group.group_grants); const grantPlannerId = R.propOr( diff --git a/openbas-front/src/admin/components/settings/groups/Groups.js b/openbas-front/src/admin/components/settings/groups/Groups.js index 9f95a48be2..adb7616b81 100644 --- a/openbas-front/src/admin/components/settings/groups/Groups.js +++ b/openbas-front/src/admin/components/settings/groups/Groups.js @@ -1,23 +1,24 @@ -import { useState } from 'react'; -import { makeStyles } from '@mui/styles'; +import { CheckCircleOutlined, GroupsOutlined } from '@mui/icons-material'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Tooltip } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; -import { CheckCircleOutlined, GroupsOutlined } from '@mui/icons-material'; -import { useFormatter } from '../../../../components/i18n'; -import { fetchUsers } from '../../../../actions/User'; -import { fetchOrganizations } from '../../../../actions/Organization'; -import CreateGroup from './CreateGroup'; -import { searchGroups } from '../../../../actions/Group'; + import { fetchExercises } from '../../../../actions/Exercise'; -import { fetchTags } from '../../../../actions/Tag'; -import GroupPopover from './GroupPopover'; -import SecurityMenu from '../SecurityMenu'; +import { searchGroups } from '../../../../actions/Group'; +import { fetchOrganizations } from '../../../../actions/Organization'; import { fetchScenarios } from '../../../../actions/scenarios/scenario-actions'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { initSorting } from '../../../../components/common/queryable/Page'; +import { fetchTags } from '../../../../actions/Tag'; +import { fetchUsers } from '../../../../actions/User'; import Breadcrumbs from '../../../../components/Breadcrumbs'; import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; +import { initSorting } from '../../../../components/common/queryable/Page'; +import { useFormatter } from '../../../../components/i18n'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import SecurityMenu from '../SecurityMenu'; +import CreateGroup from './CreateGroup'; +import GroupPopover from './GroupPopover'; const useStyles = makeStyles(() => ({ container: { @@ -144,18 +145,18 @@ const Groups = () => { - } + )} />   - {groups.map((group) => ( + {groups.map(group => ( {
    {group.group_name} @@ -239,21 +240,21 @@ const Groups = () => { {group.group_users_number}
    - } + )} /> setGroups(groups.map((g) => (g.group_id !== result.group_id ? g : result)))} - onDelete={(result) => setGroups(groups.filter((g) => (g.group_id !== result)))} + onUpdate={result => setGroups(groups.map(g => (g.group_id !== result.group_id ? g : result)))} + onDelete={result => setGroups(groups.filter(g => (g.group_id !== result)))} /> ))} setGroups([result, ...groups])} + onCreate={result => setGroups([result, ...groups])} />
    ); diff --git a/openbas-front/src/admin/components/settings/kill_chain_phases/CreateKillChainPhase.js b/openbas-front/src/admin/components/settings/kill_chain_phases/CreateKillChainPhase.js index 064f126af7..0112dec5b5 100644 --- a/openbas-front/src/admin/components/settings/kill_chain_phases/CreateKillChainPhase.js +++ b/openbas-front/src/admin/components/settings/kill_chain_phases/CreateKillChainPhase.js @@ -1,14 +1,15 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import * as R from 'ramda'; +import { Add } from '@mui/icons-material'; import { Fab } from '@mui/material'; import { withStyles } from '@mui/styles'; -import { Add } from '@mui/icons-material'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; +import { connect } from 'react-redux'; + import { addKillChainPhase } from '../../../../actions/KillChainPhase'; -import KillChainPhaseForm from './KillChainPhaseForm'; -import inject18n from '../../../../components/i18n'; import Drawer from '../../../../components/common/Drawer'; +import inject18n from '../../../../components/i18n'; +import KillChainPhaseForm from './KillChainPhaseForm'; const styles = () => ({ createButton: { @@ -78,7 +79,7 @@ CreateKillChainPhase.propTypes = { onCreate: PropTypes.func, }; -const select = (state) => ({ +const select = state => ({ organizations: state.referential.entities.organizations, }); diff --git a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhaseForm.js b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhaseForm.js index 9dc09e53fa..cba11a8ab4 100644 --- a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhaseForm.js +++ b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhaseForm.js @@ -1,7 +1,8 @@ -import { Component } from 'react'; +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import OldTextField from '../../../../components/fields/OldTextField'; import inject18n from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhasePopover.js b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhasePopover.js index 4982e15add..339159675a 100644 --- a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhasePopover.js +++ b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhasePopover.js @@ -1,14 +1,15 @@ -import { Component } from 'react'; +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; +import { Component } from 'react'; +import { connect } from 'react-redux'; + import { deleteKillChainPhase, updateKillChainPhase } from '../../../../actions/KillChainPhase'; -import KillChainPhaseForm from './KillChainPhaseForm'; -import inject18n from '../../../../components/i18n'; -import Transition from '../../../../components/common/Transition'; import Drawer from '../../../../components/common/Drawer'; +import Transition from '../../../../components/common/Transition'; +import inject18n from '../../../../components/i18n'; +import KillChainPhaseForm from './KillChainPhaseForm'; class KillChainPhasePopover extends Component { constructor(props) { diff --git a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhases.js b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhases.js index fecc6aa609..730888f6d0 100644 --- a/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhases.js +++ b/openbas-front/src/admin/components/settings/kill_chain_phases/KillChainPhases.js @@ -1,16 +1,17 @@ -import { useState } from 'react'; -import { List, ListItem, ListItemIcon, ListItemSecondaryAction, Chip, ListItemText } from '@mui/material'; -import { makeStyles } from '@mui/styles'; import { RouteOutlined } from '@mui/icons-material'; +import { Chip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { useState } from 'react'; + import { searchKillChainPhases } from '../../../../actions/KillChainPhase'; -import CreateKillChainPhase from './CreateKillChainPhase'; -import KillChainPhasePopover from './KillChainPhasePopover'; -import TaxonomiesMenu from '../TaxonomiesMenu'; -import { useFormatter } from '../../../../components/i18n'; +import Breadcrumbs from '../../../../components/Breadcrumbs'; import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; import { initSorting } from '../../../../components/common/queryable/Page'; -import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { useFormatter } from '../../../../components/i18n'; +import TaxonomiesMenu from '../TaxonomiesMenu'; +import CreateKillChainPhase from './CreateKillChainPhase'; +import KillChainPhasePopover from './KillChainPhasePopover'; const useStyles = makeStyles(() => ({ container: { @@ -121,18 +122,18 @@ const KillChainPhases = () => { - } + )} />   - {killChainPhases.map((killChainPhase) => ( + {killChainPhases.map(killChainPhase => ( {
    { {nsdt(killChainPhase.phase_created_at)}
    - } + )} /> setKillChainPhases(killChainPhases.map((k) => (k.phase_id !== result.phase_id ? k : result)))} - onDelete={(result) => setKillChainPhases(killChainPhases.filter((k) => (k.phase_id !== result)))} + onUpdate={result => setKillChainPhases(killChainPhases.map(k => (k.phase_id !== result.phase_id ? k : result)))} + onDelete={result => setKillChainPhases(killChainPhases.filter(k => (k.phase_id !== result)))} />
    ))} setKillChainPhases([result, ...killChainPhases])} + onCreate={result => setKillChainPhases([result, ...killChainPhases])} /> ); diff --git a/openbas-front/src/admin/components/settings/policies/Policies.tsx b/openbas-front/src/admin/components/settings/policies/Policies.tsx index 6a8f81dc99..810f104f3a 100644 --- a/openbas-front/src/admin/components/settings/policies/Policies.tsx +++ b/openbas-front/src/admin/components/settings/policies/Policies.tsx @@ -1,16 +1,17 @@ -import { FunctionComponent } from 'react'; import { Grid, Paper, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { useFormatter } from '../../../../components/i18n'; +import { FunctionComponent } from 'react'; + +import { fetchPlatformParameters, updatePlatformPolicies } from '../../../../actions/Application'; +import type { LoggedHelper } from '../../../../actions/helper'; import Breadcrumbs from '../../../../components/Breadcrumbs'; -import SecurityMenu from '../SecurityMenu'; -import PolicyForm from './PolicyForm'; +import { useFormatter } from '../../../../components/i18n'; +import { useHelper } from '../../../../store'; import type { PlatformSettings, PolicyInput } from '../../../../utils/api-types'; -import { fetchPlatformParameters, updatePlatformPolicies } from '../../../../actions/Application'; import { useAppDispatch } from '../../../../utils/hooks'; -import { useHelper } from '../../../../store'; -import type { LoggedHelper } from '../../../../actions/helper'; import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import SecurityMenu from '../SecurityMenu'; +import PolicyForm from './PolicyForm'; const useStyles = makeStyles(() => ({ container: { @@ -49,12 +50,14 @@ const Policies: FunctionComponent = () => { return (
    - - + {t('Login messages')} diff --git a/openbas-front/src/admin/components/settings/policies/PolicyForm.tsx b/openbas-front/src/admin/components/settings/policies/PolicyForm.tsx index 33895e9b5a..6f740c0f1a 100644 --- a/openbas-front/src/admin/components/settings/policies/PolicyForm.tsx +++ b/openbas-front/src/admin/components/settings/policies/PolicyForm.tsx @@ -1,7 +1,8 @@ +import { Button } from '@mui/material'; import { useEffect } from 'react'; import * as React from 'react'; -import { useForm, FormProvider, SubmitHandler } from 'react-hook-form'; -import { Button } from '@mui/material'; +import { FormProvider, SubmitHandler, useForm } from 'react-hook-form'; + import MarkDownFieldController from '../../../../components/fields/MarkDownFieldController'; import { useFormatter } from '../../../../components/i18n'; import type { PolicyInput } from '../../../../utils/api-types'; diff --git a/openbas-front/src/admin/components/settings/tags/CreateTag.js b/openbas-front/src/admin/components/settings/tags/CreateTag.js index 25dcd7428c..b21de6e661 100644 --- a/openbas-front/src/admin/components/settings/tags/CreateTag.js +++ b/openbas-front/src/admin/components/settings/tags/CreateTag.js @@ -1,14 +1,15 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import * as R from 'ramda'; -import { Fab } from '@mui/material'; import { Add } from '@mui/icons-material'; +import { Fab } from '@mui/material'; import { withStyles } from '@mui/styles'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; +import { connect } from 'react-redux'; + import { addTag } from '../../../../actions/Tag'; -import TagForm from './TagForm'; -import inject18n from '../../../../components/i18n'; import Drawer from '../../../../components/common/Drawer'; +import inject18n from '../../../../components/i18n'; +import TagForm from './TagForm'; const styles = () => ({ createButton: { diff --git a/openbas-front/src/admin/components/settings/tags/TagForm.js b/openbas-front/src/admin/components/settings/tags/TagForm.js index c678218e62..c0475ffe4e 100644 --- a/openbas-front/src/admin/components/settings/tags/TagForm.js +++ b/openbas-front/src/admin/components/settings/tags/TagForm.js @@ -1,9 +1,10 @@ -import { Component } from 'react'; +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; -import OldTextField from '../../../../components/fields/OldTextField'; + import DeprecatedColorPickerField from '../../../../components/DeprecatedColorPickerField'; +import OldTextField from '../../../../components/fields/OldTextField'; import inject18n from '../../../../components/i18n'; class TagForm extends Component { diff --git a/openbas-front/src/admin/components/settings/tags/TagPopover.js b/openbas-front/src/admin/components/settings/tags/TagPopover.js index 33f04262e4..7d431a693a 100644 --- a/openbas-front/src/admin/components/settings/tags/TagPopover.js +++ b/openbas-front/src/admin/components/settings/tags/TagPopover.js @@ -1,13 +1,14 @@ -import { forwardRef, Component } from 'react'; +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem, Slide } from '@mui/material'; import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem, Slide } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; +import { Component, forwardRef } from 'react'; +import { connect } from 'react-redux'; + import { deleteTag, updateTag } from '../../../../actions/Tag'; -import TagForm from './TagForm'; -import inject18n from '../../../../components/i18n'; import Drawer from '../../../../components/common/Drawer'; +import inject18n from '../../../../components/i18n'; +import TagForm from './TagForm'; const Transition = forwardRef((props, ref) => ( diff --git a/openbas-front/src/admin/components/settings/tags/Tags.js b/openbas-front/src/admin/components/settings/tags/Tags.js index e7d9378c1a..ad3de1330c 100644 --- a/openbas-front/src/admin/components/settings/tags/Tags.js +++ b/openbas-front/src/admin/components/settings/tags/Tags.js @@ -1,16 +1,17 @@ -import { useState } from 'react'; -import { makeStyles } from '@mui/styles'; -import { List, ListItem, ListItemIcon, ListItemText, ListItemSecondaryAction } from '@mui/material'; import { LabelOutlined } from '@mui/icons-material'; -import { useFormatter } from '../../../../components/i18n'; +import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { useState } from 'react'; + import { searchTags } from '../../../../actions/Tag'; -import CreateTag from './CreateTag'; -import TagPopover from './TagPopover'; -import TaxonomiesMenu from '../TaxonomiesMenu'; -import { initSorting } from '../../../../components/common/queryable/Page'; +import Breadcrumbs from '../../../../components/Breadcrumbs'; import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; -import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { initSorting } from '../../../../components/common/queryable/Page'; +import { useFormatter } from '../../../../components/i18n'; +import TaxonomiesMenu from '../TaxonomiesMenu'; +import CreateTag from './CreateTag'; +import TagPopover from './TagPopover'; const useStyles = makeStyles(() => ({ container: { @@ -103,18 +104,18 @@ const Tags = () => { - } + )} />   - {tags.map((tag) => ( + {tags.map(tag => ( {
    {tag.tag_name} @@ -133,20 +134,20 @@ const Tags = () => { {tag.tag_color}
    - } + )} /> setTags(tags.map((existingTag) => (existingTag.tag_id !== result.tag_id ? existingTag : result)))} - onDelete={(result) => setTags(tags.filter((existingTag) => (existingTag.tag_id !== result)))} + onUpdate={result => setTags(tags.map(existingTag => (existingTag.tag_id !== result.tag_id ? existingTag : result)))} + onDelete={result => setTags(tags.filter(existingTag => (existingTag.tag_id !== result)))} /> ))} setTags([result, ...tags])} + onCreate={result => setTags([result, ...tags])} /> ); diff --git a/openbas-front/src/admin/components/settings/users/CreateUser.js b/openbas-front/src/admin/components/settings/users/CreateUser.js index 1cd788ff4e..1b931b3bd0 100644 --- a/openbas-front/src/admin/components/settings/users/CreateUser.js +++ b/openbas-front/src/admin/components/settings/users/CreateUser.js @@ -1,14 +1,15 @@ -import { forwardRef, Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import * as R from 'ramda'; +import { Add } from '@mui/icons-material'; import { Fab, Slide } from '@mui/material'; import { withStyles } from '@mui/styles'; -import { Add } from '@mui/icons-material'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component, forwardRef } from 'react'; +import { connect } from 'react-redux'; + import { addUser } from '../../../../actions/User'; -import UserForm from './UserForm'; -import inject18n from '../../../../components/i18n'; import Drawer from '../../../../components/common/Drawer'; +import inject18n from '../../../../components/i18n'; +import UserForm from './UserForm'; const styles = () => ({ createButton: { diff --git a/openbas-front/src/admin/components/settings/users/UserForm.js b/openbas-front/src/admin/components/settings/users/UserForm.js index cd2a592631..74354290ac 100644 --- a/openbas-front/src/admin/components/settings/users/UserForm.js +++ b/openbas-front/src/admin/components/settings/users/UserForm.js @@ -1,11 +1,12 @@ +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import OldTextField from '../../../../components/fields/OldTextField'; -import { useFormatter } from '../../../../components/i18n'; import SwitchField from '../../../../components/fields/SwitchField'; -import TagField from '../../../../components/TagField'; +import { useFormatter } from '../../../../components/i18n'; import OrganizationField from '../../../../components/OrganizationField'; +import TagField from '../../../../components/TagField'; const UserForm = (props) => { const { onSubmit, initialValues, editing, handleClose } = props; diff --git a/openbas-front/src/admin/components/settings/users/UserPasswordForm.js b/openbas-front/src/admin/components/settings/users/UserPasswordForm.js index ce6afd872b..37621a56b8 100644 --- a/openbas-front/src/admin/components/settings/users/UserPasswordForm.js +++ b/openbas-front/src/admin/components/settings/users/UserPasswordForm.js @@ -1,7 +1,8 @@ -import { Component } from 'react'; +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import OldTextField from '../../../../components/fields/OldTextField'; import inject18n from '../../../../components/i18n'; diff --git a/openbas-front/src/admin/components/settings/users/UserPopover.js b/openbas-front/src/admin/components/settings/users/UserPopover.js index 917e294f00..bc8363207c 100644 --- a/openbas-front/src/admin/components/settings/users/UserPopover.js +++ b/openbas-front/src/admin/components/settings/users/UserPopover.js @@ -1,14 +1,15 @@ +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem, Slide } from '@mui/material'; +import * as R from 'ramda'; import { forwardRef, useState } from 'react'; import { useDispatch } from 'react-redux'; -import * as R from 'ramda'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem, Slide } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; + import { deleteUser, updateUser, updateUserPassword } from '../../../../actions/User'; -import UserForm from './UserForm'; +import Drawer from '../../../../components/common/Drawer'; import { useFormatter } from '../../../../components/i18n'; -import UserPasswordForm from './UserPasswordForm'; import { tagOptions } from '../../../../utils/Option'; -import Drawer from '../../../../components/common/Drawer'; +import UserForm from './UserForm'; +import UserPasswordForm from './UserPasswordForm'; const Transition = forwardRef((props, ref) => ( diff --git a/openbas-front/src/admin/components/settings/users/Users.js b/openbas-front/src/admin/components/settings/users/Users.js index 29848daa47..386a0c20fb 100644 --- a/openbas-front/src/admin/components/settings/users/Users.js +++ b/openbas-front/src/admin/components/settings/users/Users.js @@ -1,22 +1,23 @@ -import { useState } from 'react'; -import { useDispatch } from 'react-redux'; +import { CheckCircleOutlined, PersonOutlined } from '@mui/icons-material'; import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { CheckCircleOutlined, PersonOutlined } from '@mui/icons-material'; -import { searchUsers } from '../../../../actions/User'; +import { useState } from 'react'; +import { useDispatch } from 'react-redux'; + import { fetchOrganizations } from '../../../../actions/Organization'; -import ItemTags from '../../../../components/ItemTags'; -import CreateUser from './CreateUser'; import { fetchTags } from '../../../../actions/Tag'; -import useDataLoader from '../../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../../store'; -import UserPopover from './UserPopover'; -import SecurityMenu from '../SecurityMenu'; -import { useFormatter } from '../../../../components/i18n'; -import { initSorting } from '../../../../components/common/queryable/Page'; +import { searchUsers } from '../../../../actions/User'; import Breadcrumbs from '../../../../components/Breadcrumbs'; import PaginationComponent from '../../../../components/common/pagination/PaginationComponent'; import SortHeadersComponent from '../../../../components/common/pagination/SortHeadersComponent'; +import { initSorting } from '../../../../components/common/queryable/Page'; +import { useFormatter } from '../../../../components/i18n'; +import ItemTags from '../../../../components/ItemTags'; +import { useHelper } from '../../../../store'; +import useDataLoader from '../../../../utils/hooks/useDataLoader'; +import SecurityMenu from '../SecurityMenu'; +import CreateUser from './CreateUser'; +import UserPopover from './UserPopover'; const useStyles = makeStyles(() => ({ container: { @@ -72,7 +73,7 @@ const Users = () => { const classes = useStyles(); const dispatch = useDispatch(); const { t } = useFormatter(); - const { tagsMap, organizationsMap } = useHelper((helper) => ({ + const { tagsMap, organizationsMap } = useHelper(helper => ({ organizationsMap: helper.getOrganizationsMap(), tagsMap: helper.getTagsMap(), })); @@ -136,18 +137,18 @@ const Users = () => { - } + )} />   - {users.map((user) => ( + {users.map(user => ( {
    {user.user_email} @@ -178,22 +179,22 @@ const Users = () => {
    - } + )} /> setUsers(users.map((u) => (u.user_id !== result.user_id ? u : result)))} - onDelete={(result) => setUsers(users.filter((u) => (u.user_id !== result)))} + onUpdate={result => setUsers(users.map(u => (u.user_id !== result.user_id ? u : result)))} + onDelete={result => setUsers(users.filter(u => (u.user_id !== result)))} />
    ))} setUsers([result, ...users])} + onCreate={result => setUsers([result, ...users])} /> ); diff --git a/openbas-front/src/admin/components/simulations/ExerciseList.tsx b/openbas-front/src/admin/components/simulations/ExerciseList.tsx index e6c6499c37..339fca0a80 100644 --- a/openbas-front/src/admin/components/simulations/ExerciseList.tsx +++ b/openbas-front/src/admin/components/simulations/ExerciseList.tsx @@ -1,22 +1,23 @@ -import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { HubOutlined } from '@mui/icons-material'; +import { List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { CSSProperties, FunctionComponent } from 'react'; import * as React from 'react'; import { Link } from 'react-router-dom'; -import { makeStyles } from '@mui/styles'; -import ExerciseStatus from './simulation/ExerciseStatus'; -import ItemTags from '../../../components/ItemTags'; -import { useFormatter } from '../../../components/i18n'; + import type { ExerciseSimpleStore, ExerciseStore } from '../../../actions/exercises/Exercise'; -import AtomicTestingResult from '../atomic_testings/atomic_testing/AtomicTestingResult'; -import ItemTargets from '../../../components/ItemTargets'; -import type { ExerciseSimple } from '../../../utils/api-types'; -import useDataLoader from '../../../utils/hooks/useDataLoader'; import { fetchTags } from '../../../actions/Tag'; -import { useAppDispatch } from '../../../utils/hooks'; import { QueryableHelpers } from '../../../components/common/queryable/QueryableHelpers'; import SortHeadersComponentV2 from '../../../components/common/queryable/sort/SortHeadersComponentV2'; import { Header } from '../../../components/common/SortHeadersList'; +import { useFormatter } from '../../../components/i18n'; +import ItemTags from '../../../components/ItemTags'; +import ItemTargets from '../../../components/ItemTargets'; +import type { ExerciseSimple } from '../../../utils/api-types'; +import { useAppDispatch } from '../../../utils/hooks'; +import useDataLoader from '../../../utils/hooks/useDataLoader'; +import AtomicTestingResult from '../atomic_testings/atomic_testing/AtomicTestingResult'; +import ExerciseStatus from './simulation/ExerciseStatus'; const useStyles = makeStyles(() => ({ itemHead: { @@ -150,23 +151,25 @@ const ExerciseList: FunctionComponent = ({ return ( {hasHeader && queryableHelpers - &&  } - > + > - } + )} /> - } + + )} {exercises.map((exercise: ExerciseStore) => ( = ({ - {headers.map((header) => ( + {headers.map(header => (
    = ({
    ))} - } + )} />
    diff --git a/openbas-front/src/admin/components/simulations/Exercises.tsx b/openbas-front/src/admin/components/simulations/Exercises.tsx index 03c9b8b63e..c12681f645 100644 --- a/openbas-front/src/admin/components/simulations/Exercises.tsx +++ b/openbas-front/src/admin/components/simulations/Exercises.tsx @@ -1,24 +1,25 @@ -import { useState } from 'react'; import { ToggleButtonGroup } from '@mui/material'; -import { useFormatter } from '../../../components/i18n'; -import { useHelper } from '../../../store'; -import Breadcrumbs from '../../../components/Breadcrumbs'; -import ExerciseCreation from './simulation/ExerciseCreation'; +import { useState } from 'react'; + +import { searchExercises } from '../../../actions/Exercise'; +import type { ExerciseStore } from '../../../actions/exercises/Exercise'; import type { ExercisesHelper } from '../../../actions/exercises/exercise-helper'; import type { UserHelper } from '../../../actions/helper'; +import Breadcrumbs from '../../../components/Breadcrumbs'; +import ExportButton from '../../../components/common/ExportButton'; +import { buildEmptyFilter } from '../../../components/common/queryable/filter/FilterUtils'; import { initSorting } from '../../../components/common/queryable/Page'; +import PaginationComponentV2 from '../../../components/common/queryable/pagination/PaginationComponentV2'; +import { buildSearchPagination } from '../../../components/common/queryable/QueryableUtils'; +import { useQueryableWithLocalStorage } from '../../../components/common/queryable/useQueryableWithLocalStorage'; +import { useFormatter } from '../../../components/i18n'; +import { useHelper } from '../../../store'; +import type { FilterGroup } from '../../../utils/api-types'; import type { EndpointStore } from '../assets/endpoints/Endpoint'; import ExerciseList from './ExerciseList'; -import { searchExercises } from '../../../actions/Exercise'; import ImportUploaderExercise from './ImportUploaderExercise'; -import { buildSearchPagination } from '../../../components/common/queryable/QueryableUtils'; -import { useQueryableWithLocalStorage } from '../../../components/common/queryable/useQueryableWithLocalStorage'; -import PaginationComponentV2 from '../../../components/common/queryable/pagination/PaginationComponentV2'; +import ExerciseCreation from './simulation/ExerciseCreation'; import ExercisePopover from './simulation/ExercisePopover'; -import type { ExerciseStore } from '../../../actions/exercises/Exercise'; -import type { FilterGroup } from '../../../utils/api-types'; -import { buildEmptyFilter } from '../../../components/common/queryable/filter/FilterUtils'; -import ExportButton from '../../../components/common/ExportButton'; const Exercises = () => { // Standard hooks @@ -73,7 +74,7 @@ const Exercises = () => { setExercises(exercises.filter((e) => (e.exercise_id !== result)))} + onDelete={result => setExercises(exercises.filter(e => (e.exercise_id !== result)))} inList /> ); @@ -88,12 +89,12 @@ const Exercises = () => { entityPrefix="exercise" availableFilterNames={availableFilterNames} queryableHelpers={queryableHelpers} - topBarButtons={ + topBarButtons={( - } + )} /> { // Standard hooks @@ -9,7 +10,7 @@ const ImportUploaderExercise = () => { const navigate = useNavigate(); const handleUpload = async (formData: FormData) => { - await dispatch(importingExercise(formData)).then((result: { [x: string]: string; }) => { + await dispatch(importingExercise(formData)).then((result: { [x: string]: string }) => { if (!Object.prototype.hasOwnProperty.call(result, 'FINAL_FORM/form-error')) { navigate(0); } @@ -17,7 +18,7 @@ const ImportUploaderExercise = () => { }; return ( - + ); }; diff --git a/openbas-front/src/admin/components/simulations/simulation/AnimationMenu.tsx b/openbas-front/src/admin/components/simulations/simulation/AnimationMenu.tsx index e75a30393c..a13aa0d55a 100644 --- a/openbas-front/src/admin/components/simulations/simulation/AnimationMenu.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/AnimationMenu.tsx @@ -1,13 +1,14 @@ +import { FactCheckOutlined, MailOutlined, NoteAltOutlined, TheatersOutlined } from '@mui/icons-material'; +import { Drawer, ListItemIcon, ListItemText, MenuItem, MenuList } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import * as React from 'react'; import { Link, useLocation } from 'react-router-dom'; -import { Drawer, MenuList, MenuItem, ListItemText, ListItemIcon } from '@mui/material'; -import { TheatersOutlined, FactCheckOutlined, MailOutlined, NoteAltOutlined } from '@mui/icons-material'; -import { makeStyles } from '@mui/styles'; + import { useFormatter } from '../../../../components/i18n'; -import type { Exercise } from '../../../../utils/api-types'; import type { Theme } from '../../../../components/Theme'; +import type { Exercise } from '../../../../utils/api-types'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ drawer: { minHeight: '100vh', width: 200, diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseContext.ts b/openbas-front/src/admin/components/simulations/simulation/ExerciseContext.ts index c019807ba7..939dfb08db 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseContext.ts +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseContext.ts @@ -1,22 +1,22 @@ +import { fetchExercise, fetchExerciseTeams } from '../../../../actions/Exercise'; import type { ExerciseStore } from '../../../../actions/exercises/Exercise'; -import { useAppDispatch } from '../../../../utils/hooks'; -import type { ImportTestSummary, Inject, InjectsImportInput, InjectTestStatus, SearchPaginationInput } from '../../../../utils/api-types'; +import { dryImportXlsForExercise, importXlsForExercise } from '../../../../actions/exercises/exercise-action'; import { addInjectForExercise, bulkDeleteInjectsForExercise, + bulkUpdateInjectForExercise, deleteInjectForExercise, fetchExerciseInjects, injectDone, updateInjectActivationForExercise, - bulkUpdateInjectForExercise, updateInjectForExercise, updateInjectTriggerForExercise, } from '../../../../actions/Inject'; import type { InjectOutputType, InjectStore } from '../../../../actions/injects/Inject'; -import { dryImportXlsForExercise, importXlsForExercise } from '../../../../actions/exercises/exercise-action'; -import { fetchExercise, fetchExerciseTeams } from '../../../../actions/Exercise'; -import { Page } from '../../../../components/common/queryable/Page'; import { bulkTestInjects, searchExerciseInjectsSimple } from '../../../../actions/injects/inject-action'; +import { Page } from '../../../../components/common/queryable/Page'; +import type { ImportTestSummary, Inject, InjectsImportInput, InjectTestStatus, SearchPaginationInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; const injectContextForExercise = (exercise: ExerciseStore) => { const dispatch = useAppDispatch(); @@ -25,32 +25,32 @@ const injectContextForExercise = (exercise: ExerciseStore) => { searchInjects(input: SearchPaginationInput): Promise<{ data: Page }> { return searchExerciseInjectsSimple(exercise.exercise_id, input); }, - onAddInject(inject: Inject): Promise<{ result: string, entities: { injects: Record } }> { + onAddInject(inject: Inject): Promise<{ result: string; entities: { injects: Record } }> { return dispatch(addInjectForExercise(exercise.exercise_id, inject)); }, - onBulkUpdateInject(injectId: Inject['inject_id'], inject: Inject): Promise<{ result: string, entities: { injects: Record } }> { + onBulkUpdateInject(injectId: Inject['inject_id'], inject: Inject): Promise<{ result: string; entities: { injects: Record } }> { return dispatch(bulkUpdateInjectForExercise(exercise.exercise_id, injectId, inject)); }, - onUpdateInject(injectId: Inject['inject_id'], inject: Inject): Promise<{ result: string, entities: { injects: Record } }> { + onUpdateInject(injectId: Inject['inject_id'], inject: Inject): Promise<{ result: string; entities: { injects: Record } }> { return dispatch(updateInjectForExercise(exercise.exercise_id, injectId, inject)); }, - onUpdateInjectTrigger(injectId: Inject['inject_id']): Promise<{ result: string, entities: { injects: Record } }> { + onUpdateInjectTrigger(injectId: Inject['inject_id']): Promise<{ result: string; entities: { injects: Record } }> { return dispatch(updateInjectTriggerForExercise(exercise.exercise_id, injectId)); }, onUpdateInjectActivation(injectId: Inject['inject_id'], injectEnabled: { inject_enabled: boolean }): Promise<{ - result: string, - entities: { injects: Record } + result: string; + entities: { injects: Record }; }> { return dispatch(updateInjectActivationForExercise(exercise.exercise_id, injectId, injectEnabled)); }, - onInjectDone(injectId: Inject['inject_id']): Promise<{ result: string, entities: { injects: Record } }> { + onInjectDone(injectId: Inject['inject_id']): Promise<{ result: string; entities: { injects: Record } }> { return dispatch(injectDone(exercise.exercise_id, injectId)); }, onDeleteInject(injectId: Inject['inject_id']): Promise { return dispatch(deleteInjectForExercise(exercise.exercise_id, injectId)); }, onImportInjectFromXls(importId: string, input: InjectsImportInput): Promise { - return importXlsForExercise(exercise.exercise_id, importId, input).then((response) => new Promise((resolve, _reject) => { + return importXlsForExercise(exercise.exercise_id, importId, input).then(response => new Promise((resolve, _reject) => { dispatch(fetchExerciseInjects(exercise.exercise_id)); dispatch(fetchExercise(exercise.exercise_id)); dispatch(fetchExerciseTeams(exercise.exercise_id)); @@ -58,13 +58,13 @@ const injectContextForExercise = (exercise: ExerciseStore) => { })); }, async onDryImportInjectFromXls(importId: string, input: InjectsImportInput): Promise { - return dryImportXlsForExercise(exercise.exercise_id, importId, input).then((result) => result.data); + return dryImportXlsForExercise(exercise.exercise_id, importId, input).then(result => result.data); }, onBulkDeleteInjects(injectIds: string[]): void { return dispatch(bulkDeleteInjectsForExercise(exercise.exercise_id, injectIds)); }, - bulkTestInjects(injectIds: string[]): Promise<{ uri: string, data: InjectTestStatus[] }> { - return bulkTestInjects(injectIds).then((result) => ({ + bulkTestInjects(injectIds: string[]): Promise<{ uri: string; data: InjectTestStatus[] }> { + return bulkTestInjects(injectIds).then(result => ({ uri: `/admin/exercises/${exercise.exercise_id}/tests`, data: result.data, })); diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreation.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreation.tsx index 71dbdf3593..b0716a8fb6 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreation.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreation.tsx @@ -1,13 +1,14 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; + +import { addExercise } from '../../../../actions/Exercise'; +import type { ExerciseStore } from '../../../../actions/exercises/Exercise'; import ButtonCreate from '../../../../components/common/ButtonCreate'; import Drawer from '../../../../components/common/Drawer'; import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; import type { ExerciseCreateInput } from '../../../../utils/api-types'; -import { addExercise } from '../../../../actions/Exercise'; +import { useAppDispatch } from '../../../../utils/hooks'; import ExerciseCreationForm from './ExerciseCreationForm'; -import type { ExerciseStore } from '../../../../actions/exercises/Exercise'; const ExerciseCreation = () => { // Standard hooks @@ -16,7 +17,7 @@ const ExerciseCreation = () => { const navigate = useNavigate(); const dispatch = useAppDispatch(); const onSubmit = (data: ExerciseCreateInput) => { - dispatch(addExercise(data)).then((result: { result: string, entities: { scenarios: Record } }) => { + dispatch(addExercise(data)).then((result: { result: string; entities: { scenarios: Record } }) => { setOpen(false); navigate(`/admin/exercises/${result.result}`); }); diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx index eefe4d38d8..6bb00421cc 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseCreationForm.tsx @@ -1,15 +1,16 @@ -import { FunctionComponent } from 'react'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button, MenuItem } from '@mui/material'; +import { DateTimePicker as MuiDateTimePicker } from '@mui/x-date-pickers'; +import { FunctionComponent } from 'react'; import { Controller, SubmitHandler, useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import { DateTimePicker as MuiDateTimePicker } from '@mui/x-date-pickers'; -import { useFormatter } from '../../../../components/i18n'; + +import SelectField from '../../../../components/fields/SelectField'; import TagField from '../../../../components/fields/TagField'; +import TextField from '../../../../components/fields/TextField'; +import { useFormatter } from '../../../../components/i18n'; import type { ExerciseCreateInput } from '../../../../utils/api-types'; import { zodImplement } from '../../../../utils/Zod'; -import TextField from '../../../../components/fields/TextField'; -import SelectField from '../../../../components/fields/SelectField'; import { scenarioCategories } from '../../scenarios/constants'; interface Props { @@ -76,7 +77,7 @@ const ExerciseCreationForm: FunctionComponent = ({ = ({ = ({ = ({ helperText: errors.exercise_start_date?.message, }, }} - onChange={(date) => field.onChange(date?.toISOString())} + onChange={date => field.onChange(date?.toISOString())} ampm={false} format="yyyy-MM-dd HH:mm:ss" /> diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseDateForm.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseDateForm.tsx index 39d27abd45..a6fb541821 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseDateForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseDateForm.tsx @@ -1,14 +1,15 @@ -import { useState } from 'react'; -import * as React from 'react'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button, FormControlLabel, Stack, Switch } from '@mui/material'; import { DatePicker, TimePicker } from '@mui/x-date-pickers'; +import { useState } from 'react'; +import * as React from 'react'; import { Controller, SubmitHandler, useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import type { ExerciseUpdateStartDateInput } from '../../../../utils/api-types'; + import { useFormatter } from '../../../../components/i18n'; -import { zodImplement } from '../../../../utils/Zod'; +import type { ExerciseUpdateStartDateInput } from '../../../../utils/api-types'; import { minutesInFuture } from '../../../../utils/Time'; +import { zodImplement } from '../../../../utils/Zod'; interface Props { onSubmit: SubmitHandler; @@ -95,7 +96,7 @@ const ExerciseDateForm: React.FC = ({ (data) => { if (!checked) { return new Date(new Date().setHours(0, 0, 0, 0)).getTime() !== new Date(data.date).getTime() - || (new Date().getTime() + _MS_DELAY_TOO_CLOSE) < new Date(data.time).getTime(); + || (new Date().getTime() + _MS_DELAY_TOO_CLOSE) < new Date(data.time).getTime(); } return true; }, @@ -109,7 +110,7 @@ const ExerciseDateForm: React.FC = ({ if (!checked) { const time = new Date(data.time); return new Date(new Date(data.date).setHours(time.getHours(), time.getMinutes(), time.getSeconds(), 0)).getTime() - >= new Date(new Date().setHours(0, 0, 0, 0)).getTime(); + >= new Date(new Date().setHours(0, 0, 0, 0)).getTime(); } return true; }, @@ -136,7 +137,7 @@ const ExerciseDateForm: React.FC = ({ disabled={checked} minDate={new Date(new Date().setUTCHours(0, 0, 0, 0))} value={field.value ? new Date(field.value) : null} - onChange={(date) => field.onChange(date?.toISOString())} + onChange={date => field.onChange(date?.toISOString())} onAccept={() => { clearErrors('time'); }} @@ -165,7 +166,7 @@ const ExerciseDateForm: React.FC = ({ closeOnSelect={false} value={field.value ? new Date(field.value) : null} minTime={new Date(new Date().setUTCHours(0, 0, 0, 0)).getTime() === new Date(getValues('date')).getTime() ? new Date() : undefined} - onChange={(time) => (field.onChange(time?.toISOString()))} + onChange={time => (field.onChange(time?.toISOString()))} slotProps={{ textField: { fullWidth: true, @@ -180,12 +181,12 @@ const ExerciseDateForm: React.FC = ({
    {handleClose && ( - + )} diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseMainInformation.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseMainInformation.tsx index cb250eaaee..5abb77b99b 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseMainInformation.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseMainInformation.tsx @@ -1,17 +1,18 @@ -import * as React from 'react'; -import * as R from 'ramda'; import { Chip, Grid, Paper, Typography } from '@mui/material'; -import type { Exercise, KillChainPhase } from '../../../../utils/api-types'; +import * as R from 'ramda'; +import * as React from 'react'; + import ExpandableMarkdown from '../../../../components/ExpandableMarkdown'; -import ItemSeverity from '../../../../components/ItemSeverity'; +import { useFormatter } from '../../../../components/i18n'; import ItemCategory from '../../../../components/ItemCategory'; import ItemMainFocus from '../../../../components/ItemMainFocus'; +import ItemSeverity from '../../../../components/ItemSeverity'; import ItemTags from '../../../../components/ItemTags'; import PlatformIcon from '../../../../components/PlatformIcon'; -import { useFormatter } from '../../../../components/i18n'; +import type { Exercise, KillChainPhase } from '../../../../utils/api-types'; interface Props { - exercise: Exercise + exercise: Exercise; } const ExerciseMainInformation: React.FC = ({ exercise }) => { @@ -20,7 +21,7 @@ const ExerciseMainInformation: React.FC = ({ exercise }) => { return ( - + = ({ const handleCloseDuplicate = () => setOpenDuplicate(false); const submitDuplicate = () => { - dispatch(duplicateExercise(exercise.exercise_id)).then((result: { result: string, entities: { exercises: ExerciseStore } }) => { + dispatch(duplicateExercise(exercise.exercise_id)).then((result: { result: string; entities: { exercises: ExerciseStore } }) => { handleCloseDuplicate(); navigate(`/admin/exercises/${result.result}`); }); diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseStatus.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseStatus.tsx index 907cdc4c38..3cba121691 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseStatus.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseStatus.tsx @@ -1,8 +1,9 @@ -import { FunctionComponent } from 'react'; -import { makeStyles } from '@mui/styles'; import { Chip } from '@mui/material'; -import { useFormatter } from '../../../../components/i18n'; +import { makeStyles } from '@mui/styles'; +import { FunctionComponent } from 'react'; + import type { ExerciseStore } from '../../../../actions/exercises/Exercise'; +import { useFormatter } from '../../../../components/i18n'; import { inlineStylesColors } from '../../../../utils/Colors'; const useStyles = makeStyles(() => ({ diff --git a/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx b/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx index 47bb8f2bbe..2d39152295 100644 --- a/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/ExerciseUpdateForm.tsx @@ -1,15 +1,16 @@ -import { FunctionComponent } from 'react'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button, MenuItem } from '@mui/material'; +import { FunctionComponent } from 'react'; import { Controller, SubmitHandler, useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; + +import SelectField from '../../../../components/fields/SelectField'; +import TagField from '../../../../components/fields/TagField'; +import TextField from '../../../../components/fields/TextField'; import { useFormatter } from '../../../../components/i18n'; import type { ExerciseUpdateInput } from '../../../../utils/api-types'; import { zodImplement } from '../../../../utils/Zod'; -import TextField from '../../../../components/fields/TextField'; -import SelectField from '../../../../components/fields/SelectField'; import { scenarioCategories } from '../../scenarios/constants'; -import TagField from '../../../../components/fields/TagField'; interface Props { onSubmit: SubmitHandler; @@ -72,7 +73,7 @@ const ExerciseUpdateForm: FunctionComponent = ({ = ({ = ({ import('./overview/Exercise')); const Dryrun = lazy(() => import('./controls/Dryrun')); @@ -71,11 +72,13 @@ const IndexComponent: FunctionComponent<{ exercise: ExerciseType }> = ({ return ( -
    location.pathname.includes(el)) ? 200 : 0 }}> - location.pathname.includes(el)) ? 200 : 0 }}> + { diff --git a/openbas-front/src/admin/components/simulations/simulation/chat/Chat.js b/openbas-front/src/admin/components/simulations/simulation/chat/Chat.js index 994efa14f1..ae3820e127 100644 --- a/openbas-front/src/admin/components/simulations/simulation/chat/Chat.js +++ b/openbas-front/src/admin/components/simulations/simulation/chat/Chat.js @@ -1,7 +1,8 @@ import { makeStyles } from '@mui/styles'; import { useParams } from 'react-router-dom'; -import AnimationMenu from '../AnimationMenu'; + import { useFormatter } from '../../../../../components/i18n'; +import AnimationMenu from '../AnimationMenu'; const useStyles = makeStyles(() => ({ container: { diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/Comcheck.js b/openbas-front/src/admin/components/simulations/simulation/controls/Comcheck.js index d91fb702d1..38f157b401 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/Comcheck.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/Comcheck.js @@ -1,25 +1,26 @@ -import { useEffect, useState } from 'react'; +import { CastOutlined, CheckCircleOutlineOutlined, HistoryToggleOffOutlined, PersonOutlined } from '@mui/icons-material'; +import { Grid, LinearProgress, linearProgressClasses, List, ListItem, ListItemIcon, ListItemText, Paper, Typography } from '@mui/material'; import { makeStyles, styled } from '@mui/styles'; -import { List, ListItem, ListItemIcon, ListItemText, Grid, Paper, LinearProgress, linearProgressClasses, Typography } from '@mui/material'; +import { useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; -import { CastOutlined, CheckCircleOutlineOutlined, PersonOutlined, HistoryToggleOffOutlined } from '@mui/icons-material'; import { useParams } from 'react-router-dom'; -import { fetchPlayers } from '../../../../../actions/User'; + +import { fetchComcheck, fetchComcheckStatuses } from '../../../../../actions/Comcheck'; import { fetchOrganizations } from '../../../../../actions/Organization'; +import { fetchTags } from '../../../../../actions/Tag'; +import { fetchPlayers } from '../../../../../actions/User'; +import { useFormatter } from '../../../../../components/i18n'; import ItemTags from '../../../../../components/ItemTags'; -import TagsFilter from '../../../common/filters/TagsFilter'; import SearchFilter from '../../../../../components/SearchFilter'; -import { fetchTags } from '../../../../../actions/Tag'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { useHelper } from '../../../../../store'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import useSearchAnFilter from '../../../../../utils/SortingFiltering'; -import { fetchComcheck, fetchComcheckStatuses } from '../../../../../actions/Comcheck'; -import { useFormatter } from '../../../../../components/i18n'; -import ComcheckStatusState from './ComcheckStatusState'; -import ComcheckState from './ComcheckState'; import { progression } from '../../../../../utils/Time'; +import TagsFilter from '../../../common/filters/TagsFilter'; +import ComcheckState from './ComcheckState'; +import ComcheckStatusState from './ComcheckStatusState'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ parameters: { padding: '20px 15px 0 15px', float: 'left', @@ -226,7 +227,7 @@ const Comcheck = () => { dispatch(fetchComcheck(exerciseId, comcheckId)); dispatch(fetchComcheckStatuses(exerciseId, comcheckId)); }); - const players = statuses.map((s) => ({ + const players = statuses.map(s => ({ ...(usersMap[s.comcheckstatus_user] || {}), user_status_state: s.comcheckstatus_state, user_status_sent_date: s.comcheckstatus_sent_date, @@ -323,7 +324,7 @@ const Comcheck = () => { {filtering.buildHeader( 'user_email', @@ -362,10 +363,10 @@ const Comcheck = () => { headerStyles, )}
    - } + )} /> - {filtering.filterAndSort(players).map((user) => ( + {filtering.filterAndSort(players).map(user => ( {
    { />
    - } + )} /> ))} diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckForm.js b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckForm.js index d6071ff462..69fb059901 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckForm.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckForm.js @@ -1,13 +1,14 @@ -import { Component } from 'react'; +import { Button, MenuItem } from '@mui/material'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button, MenuItem } from '@mui/material'; -import OldTextField from '../../../../../components/fields/OldTextField'; -import OldSelectField from '../../../../../components/fields/OldSelectField'; -import inject18n from '../../../../../components/i18n'; + import DateTimePicker from '../../../../../components/DateTimePicker'; +import OldSelectField from '../../../../../components/fields/OldSelectField'; +import OldTextField from '../../../../../components/fields/OldTextField'; import RichTextField from '../../../../../components/fields/RichTextField'; +import inject18n from '../../../../../components/i18n'; class ComcheckForm extends Component { validate(values) { @@ -58,18 +59,19 @@ class ComcheckForm extends Component { multiple={true} displayEmpty={true} label={t('Teams')} - renderValue={(v) => (v.length === 0 ? ( - {t('All teams')} - ) : ( - v.map((a) => teamsbyId[a].team_name).join(', ') - )) - } + renderValue={v => (v.length === 0 + ? ( + {t('All teams')} + ) + : ( + v.map(a => teamsbyId[a].team_name).join(', ') + ))} style={{ marginTop: 20 }} > {t('All teams')} - {teams.map((team) => ( + {teams.map(team => ( ({ diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckStatusState.js b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckStatusState.js index 0af795732c..f7c9764489 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckStatusState.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/ComcheckStatusState.js @@ -1,8 +1,9 @@ -import { Component } from 'react'; -import * as R from 'ramda'; -import * as PropTypes from 'prop-types'; -import { withStyles } from '@mui/styles'; import { Chip } from '@mui/material'; +import { withStyles } from '@mui/styles'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; + import inject18n from '../../../../../components/i18n'; const styles = () => ({ diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/CreateControl.tsx b/openbas-front/src/admin/components/simulations/simulation/controls/CreateControl.tsx index e699cbb4f0..aba0900c02 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/CreateControl.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/controls/CreateControl.tsx @@ -1,26 +1,26 @@ /* eslint-disable no-template-curly-in-string */ +import { MarkEmailReadOutlined, VideoSettingsOutlined } from '@mui/icons-material'; +import { Button, Dialog, DialogContent, DialogTitle, Grid, SpeedDial, SpeedDialAction, SpeedDialIcon, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useState } from 'react'; - import * as React from 'react'; -import { SpeedDial, SpeedDialIcon, SpeedDialAction, Dialog, DialogTitle, DialogContent, Grid, Typography, Button } from '@mui/material'; -import { VideoSettingsOutlined, MarkEmailReadOutlined } from '@mui/icons-material'; -import { makeStyles } from '@mui/styles'; import { useNavigate } from 'react-router-dom'; -import ComcheckForm from './ComcheckForm'; -import DryrunForm from './DryrunForm'; -import { resolveUserName } from '../../../../../utils/String'; -import { isExerciseReadOnly, usePermissions } from '../../../../../utils/Exercise'; -import type { Theme } from '../../../../../components/Theme'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import type { ComcheckInput, Exercise } from '../../../../../utils/api-types'; + import { addComcheck } from '../../../../../actions/Comcheck'; import { addDryrun } from '../../../../../actions/Dryrun'; -import { useFormatter } from '../../../../../components/i18n'; -import Transition from '../../../../../components/common/Transition'; -import { useHelper } from '../../../../../store'; +import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; import type { UserHelper } from '../../../../../actions/helper'; import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; -import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; +import Transition from '../../../../../components/common/Transition'; +import { useFormatter } from '../../../../../components/i18n'; +import type { Theme } from '../../../../../components/Theme'; +import { useHelper } from '../../../../../store'; +import type { ComcheckInput, Exercise } from '../../../../../utils/api-types'; +import { isExerciseReadOnly, usePermissions } from '../../../../../utils/Exercise'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import { resolveUserName } from '../../../../../utils/String'; +import ComcheckForm from './ComcheckForm'; +import DryrunForm from './DryrunForm'; const useStyles = makeStyles(() => ({ createButton: { diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/Dryrun.js b/openbas-front/src/admin/components/simulations/simulation/controls/Dryrun.js index 6f85a0b265..bd7ce99a7b 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/Dryrun.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/Dryrun.js @@ -1,26 +1,27 @@ -import { makeStyles } from '@mui/styles'; +import { CastOutlined, CheckCircleOutlineOutlined, PersonOutlined } from '@mui/icons-material'; import { Chip, Grid, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useDispatch } from 'react-redux'; -import { CastOutlined, CheckCircleOutlineOutlined, PersonOutlined } from '@mui/icons-material'; import { useParams } from 'react-router-dom'; -import SearchFilter from '../../../../../components/SearchFilter'; + +import { fetchDryinjects } from '../../../../../actions/Dryinject'; +import { fetchDryrun } from '../../../../../actions/Dryrun'; import { fetchTags } from '../../../../../actions/Tag'; import { fetchPlayers } from '../../../../../actions/User'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { useFormatter } from '../../../../../components/i18n'; +import ItemStatus from '../../../../../components/ItemStatus'; +import SearchFilter from '../../../../../components/SearchFilter'; import { useHelper } from '../../../../../store'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import useSearchAnFilter from '../../../../../utils/SortingFiltering'; -import { fetchDryrun } from '../../../../../actions/Dryrun'; -import { useFormatter } from '../../../../../components/i18n'; -import DryrunStatus from './DryrunStatus'; -import { fetchDryinjects } from '../../../../../actions/Dryinject'; +import { resolveUserName } from '../../../../../utils/String'; import InjectIcon from '../../../common/injects/InjectIcon'; import InjectorContract from '../../../common/injects/InjectorContract'; import InjectStatusDetails from '../../../common/injects/InjectStatusDetails'; -import { resolveUserName } from '../../../../../utils/String'; import DryrunProgress from './DryrunProgress'; -import ItemStatus from '../../../../../components/ItemStatus'; +import DryrunStatus from './DryrunStatus'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ parameters: { padding: '20px 15px 0 15px', float: 'left', @@ -207,7 +208,7 @@ const Dryrun = () => { {t('Dryrun recipients')} - {users.map((user) => ( + {users.map(user => ( { {filtering.buildHeader( 'dryinject_type', @@ -320,7 +321,7 @@ const Dryrun = () => { headerStyles, )} - } + )} />   @@ -335,10 +336,10 @@ const Dryrun = () => { disabled={!dryinject.dryinject_inject.inject_enabled} > - +
    { float: 'left', }} > - {fndt(dryinject.dryinject_status?.status_date)} ( + {fndt(dryinject.dryinject_status?.status_date)} + {' '} + ( {dryinject.dryinject_status - && ( - dryinject.dryinject_status.status_execution / 1000 - ).toFixed(2)} - {t('s')}) + && ( + dryinject.dryinject_status.status_execution / 1000 + ).toFixed(2)} + {t('s')} + )
    - } + )} /> diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunForm.js b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunForm.js index 6b0d65e318..5fe56f0b32 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunForm.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunForm.js @@ -1,9 +1,10 @@ -import { Component } from 'react'; +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; -import inject18n from '../../../../../components/i18n'; + import OldTextField from '../../../../../components/fields/OldTextField'; +import inject18n from '../../../../../components/i18n'; import PlayerField from '../../../../../components/PlayerField'; class DryrunForm extends Component { diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunProgress.js b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunProgress.js index 9b25617549..06e6f6da66 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunProgress.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunProgress.js @@ -1,6 +1,7 @@ -import { useEffect, useState } from 'react'; -import { styled } from '@mui/styles'; import { LinearProgress, linearProgressClasses } from '@mui/material'; +import { styled } from '@mui/styles'; +import { useEffect, useState } from 'react'; + import { progression } from '../../../../../utils/Time'; const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ diff --git a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunStatus.js b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunStatus.js index 200cff970d..476e506b3c 100644 --- a/openbas-front/src/admin/components/simulations/simulation/controls/DryrunStatus.js +++ b/openbas-front/src/admin/components/simulations/simulation/controls/DryrunStatus.js @@ -1,8 +1,9 @@ -import { Component } from 'react'; -import * as R from 'ramda'; -import * as PropTypes from 'prop-types'; -import { withStyles } from '@mui/styles'; import { Chip } from '@mui/material'; +import { withStyles } from '@mui/styles'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; + import inject18n from '../../../../../components/i18n'; const styles = () => ({ @@ -39,19 +40,21 @@ class DryrunStatus extends Component { render() { const { t, finished, classes, variant } = this.props; const style = variant === 'list' ? classes.chipInList : classes.chip; - return finished ? ( - - ) : ( - - ); + return finished + ? ( + + ) + : ( + + ); } } diff --git a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlComChecks.tsx b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlComChecks.tsx index 8fbddf1048..b95cc3330a 100644 --- a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlComChecks.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlComChecks.tsx @@ -1,20 +1,21 @@ -import { FunctionComponent, useState } from 'react'; -import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; -import { Link } from 'react-router-dom'; import { DeleteOutlined, MarkEmailReadOutlined } from '@mui/icons-material'; +import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useState } from 'react'; +import { Link } from 'react-router-dom'; + +import { deleteComcheck, fetchComchecks } from '../../../../../actions/Comcheck'; +import type { ComCheckHelper } from '../../../../../actions/comchecks/comcheck-helper'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; -import { useFormatter } from '../../../../../components/i18n'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import ComcheckState from '../controls/ComcheckState'; +import DialogDelete from '../../../../../components/common/DialogDelete'; import Empty from '../../../../../components/Empty'; +import { useFormatter } from '../../../../../components/i18n'; import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { deleteComcheck, fetchComchecks } from '../../../../../actions/Comcheck'; -import type { ComCheckHelper } from '../../../../../actions/comchecks/comcheck-helper'; import type { Comcheck } from '../../../../../utils/api-types'; import { usePermissions } from '../../../../../utils/Exercise'; -import DialogDelete from '../../../../../components/common/DialogDelete'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import ComcheckState from '../controls/ComcheckState'; const useStyles = makeStyles(() => ({ item: { @@ -78,7 +79,7 @@ const ExerciseControlComChecks: FunctionComponent = ({
    = ({ style={{ width: '20%' }} > - {comcheck.comcheck_users_number}   + {comcheck.comcheck_users_number} + {' '} +  {t('players')}
    @@ -108,12 +111,11 @@ const ExerciseControlComChecks: FunctionComponent = ({ /> - } + )} /> setOpenComcheckDelete(comcheck.comcheck_id) - } + onClick={() => setOpenComcheckDelete(comcheck.comcheck_id)} aria-haspopup="true" size="large" disabled={permissions.readOnlyBypassStatus} diff --git a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlDryRuns.tsx b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlDryRuns.tsx index 86ce5e3aff..4176d6f50d 100644 --- a/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlDryRuns.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/definition/ExerciseControlDryRuns.tsx @@ -1,20 +1,21 @@ -import { FunctionComponent, useState } from 'react'; -import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; -import { Link } from 'react-router-dom'; import { DeleteOutlined, VideoSettingsOutlined } from '@mui/icons-material'; +import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import DryrunStatus from '../controls/DryrunStatus'; +import { FunctionComponent, useState } from 'react'; +import { Link } from 'react-router-dom'; + +import { deleteDryrun, fetchDryruns } from '../../../../../actions/Dryrun'; +import type { DryRunHelper } from '../../../../../actions/dryruns/dryrun-helper'; +import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import DialogDelete from '../../../../../components/common/DialogDelete'; import Empty from '../../../../../components/Empty'; import { useFormatter } from '../../../../../components/i18n'; import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { deleteDryrun, fetchDryruns } from '../../../../../actions/Dryrun'; -import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import type { DryRunHelper } from '../../../../../actions/dryruns/dryrun-helper'; import type { Dryrun } from '../../../../../utils/api-types'; import { usePermissions } from '../../../../../utils/Exercise'; -import DialogDelete from '../../../../../components/common/DialogDelete'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import DryrunStatus from '../controls/DryrunStatus'; const useStyles = makeStyles(() => ({ item: { @@ -78,7 +79,7 @@ const ExerciseControlDryRuns: FunctionComponent = ({
    = ({ className={classes.bodyItem} style={{ width: '15%' }} > - {/* eslint-disable-next-line i18next/no-literal-string */} - {dryrun.dryrun_speed}x + + {/* eslint-disable-next-line i18next/no-literal-string */} + {dryrun.dryrun_speed} + x +
    = ({ />
    - } + )} /> ({ paper: { @@ -63,16 +64,16 @@ const ExerciseSettings = () => { - } number={exercise.exercise_users_number ?? '-'}/> + } number={exercise.exercise_users_number ?? '-'} /> - } number={exercise.exercise_injects_statistics?.total_count ?? '-'}/> + } number={exercise.exercise_injects_statistics?.total_count ?? '-'} /> - } number={exercise.exercise_teams.length ?? '-'}/> + } number={exercise.exercise_teams.length ?? '-'} /> - } number={exercise.exercise_communications_number ?? '-'}/> + } number={exercise.exercise_communications_number ?? '-'} /> diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/CreateQuickInject.js b/openbas-front/src/admin/components/simulations/simulation/injects/CreateQuickInject.js index f7e5c48752..f0d1de0665 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/CreateQuickInject.js +++ b/openbas-front/src/admin/components/simulations/simulation/injects/CreateQuickInject.js @@ -1,18 +1,19 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import * as R from 'ramda'; +import { Add } from '@mui/icons-material'; import { Drawer, Fab } from '@mui/material'; import { withStyles, withTheme } from '@mui/styles'; -import { Add } from '@mui/icons-material'; -import inject18n from '../../../../../components/i18n'; -import QuickInject, { EMAIL_CONTRACT } from './QuickInject'; -import { storeHelper } from '../../../../../actions/Schema'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component } from 'react'; +import { connect } from 'react-redux'; + import { fetchExercises } from '../../../../../actions/Exercise'; -import { fetchTags } from '../../../../../actions/Tag'; import { fetchInjectorContract } from '../../../../../actions/InjectorContracts'; +import { storeHelper } from '../../../../../actions/Schema'; +import { fetchTags } from '../../../../../actions/Tag'; +import inject18n from '../../../../../components/i18n'; +import QuickInject, { EMAIL_CONTRACT } from './QuickInject'; -const styles = (theme) => ({ +const styles = theme => ({ createButton: { position: 'fixed', bottom: 30, @@ -58,7 +59,8 @@ class CreateQuickInject extends Component { {injectorContract - && + > - } + )} ); } diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx b/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx index 680740de67..74af0a9e7b 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/injects/ExerciseInjects.tsx @@ -1,32 +1,33 @@ -import { FunctionComponent, useState } from 'react'; -import { useParams } from 'react-router-dom'; import { BarChartOutlined, ReorderOutlined, ViewTimelineOutlined } from '@mui/icons-material'; import { Grid, Paper, ToggleButton, ToggleButtonGroup, Tooltip, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import type { Exercise } from '../../../../../utils/api-types'; -import { ArticleContext, TeamContext, ViewModeContext } from '../../../common/Context'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { FunctionComponent, useState } from 'react'; +import { useParams } from 'react-router-dom'; + +import { fetchExerciseArticles } from '../../../../../actions/channels/article-action'; +import type { ArticlesHelper } from '../../../../../actions/channels/article-helper'; import { fetchExerciseInjectExpectations, fetchExerciseTeams } from '../../../../../actions/Exercise'; import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; -import type { ArticlesHelper } from '../../../../../actions/channels/article-helper'; import type { ChallengeHelper } from '../../../../../actions/helper'; -import type { VariablesHelper } from '../../../../../actions/variables/variable-helper'; -import { fetchVariablesForExercise } from '../../../../../actions/variables/variable-actions'; +import { fetchExerciseInjectsSimple } from '../../../../../actions/injects/inject-action'; import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; -import { fetchExerciseArticles } from '../../../../../actions/channels/article-action'; -import articleContextForExercise from '../articles/articleContextForExercise'; -import teamContextForExercise from '../teams/teamContextForExercise'; -import InjectDistributionByType from '../../../common/injects/InjectDistributionByType'; +import { fetchVariablesForExercise } from '../../../../../actions/variables/variable-actions'; +import type { VariablesHelper } from '../../../../../actions/variables/variable-helper'; +import { useFormatter } from '../../../../../components/i18n'; +import { useHelper } from '../../../../../store'; +import type { Exercise } from '../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { ArticleContext, TeamContext, ViewModeContext } from '../../../common/Context'; import InjectDistributionByTeam from '../../../common/injects/InjectDistributionByTeam'; +import InjectDistributionByType from '../../../common/injects/InjectDistributionByType'; +import Injects from '../../../common/injects/Injects'; +import articleContextForExercise from '../articles/articleContextForExercise'; import ExerciseDistributionScoreByTeamInPercentage from '../overview/ExerciseDistributionScoreByTeamInPercentage'; import ExerciseDistributionScoreOverTimeByInjectorContract from '../overview/ExerciseDistributionScoreOverTimeByInjectorContract'; import ExerciseDistributionScoreOverTimeByTeam from '../overview/ExerciseDistributionScoreOverTimeByTeam'; import ExerciseDistributionScoreOverTimeByTeamInPercentage from '../overview/ExerciseDistributionScoreOverTimeByTeamInPercentage'; -import { useFormatter } from '../../../../../components/i18n'; -import { fetchExerciseInjectsSimple } from '../../../../../actions/injects/inject-action'; -import Injects from '../../../common/injects/Injects'; +import teamContextForExercise from '../teams/teamContextForExercise'; const useStyles = makeStyles(() => ({ paperChart: { @@ -81,118 +82,120 @@ const ExerciseInjects: FunctionComponent = () => { <> {(viewMode === 'list' || viewMode === 'chain') && ( - - - - - + + + + + )} {viewMode === 'distribution' && ( -
    - - - handleViewMode('list')} - selected={false} - aria-label="List view mode" - > - - - - - handleViewMode('chain')} - selected={false} - aria-label="Interactive view mode" - > - - - - - handleViewMode('distribution')} - selected={true} - aria-label="Distribution view mode" - > - - - - - - - - - {t('Distribution of injects by type')} - - - - - - - - {t('Distribution of injects by team')} - - - - - - - - {t('Distribution of expectations by inject type')} (%) - - - - - - - - {t('Distribution of expected total score by inject type')} - - - - - - - - {t('Distribution of expectations by team')} - - - - - - - - {t('Distribution of expected total score by team')} - - - - +
    + + + handleViewMode('list')} + selected={false} + aria-label="List view mode" + > + + + + + handleViewMode('chain')} + selected={false} + aria-label="Interactive view mode" + > + + + + + handleViewMode('distribution')} + selected={true} + aria-label="Distribution view mode" + > + + + + + + + + + {t('Distribution of injects by type')} + + + + + + + + {t('Distribution of injects by team')} + + + + + + + + {t('Distribution of expectations by inject type')} + {' '} + (%) + + + + + + + + {t('Distribution of expected total score by inject type')} + + + + + + + + {t('Distribution of expectations by team')} + + + + + + + + {t('Distribution of expected total score by team')} + + + + + - -
    +
    )}
    diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/InjectIndex.tsx b/openbas-front/src/admin/components/simulations/simulation/injects/InjectIndex.tsx index 057789594a..5f33dfb138 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/InjectIndex.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/injects/InjectIndex.tsx @@ -1,24 +1,25 @@ -import { FunctionComponent, Suspense, useEffect, useState } from 'react'; import { Box, Tab, Tabs } from '@mui/material'; -import { Link, Route, Routes, useLocation, useParams, useSearchParams } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; -import Loader from '../../../../../components/Loader'; +import { FunctionComponent, Suspense, useEffect, useState } from 'react'; +import { Link, Route, Routes, useLocation, useParams, useSearchParams } from 'react-router-dom'; + +import { fetchInjectResultDto } from '../../../../../actions/atomic_testings/atomic-testing-actions'; +import { fetchExercise } from '../../../../../actions/Exercise'; +import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; +import Breadcrumbs, { BreadcrumbsElement } from '../../../../../components/Breadcrumbs'; import { errorWrapper } from '../../../../../components/Error'; -import NotFound from '../../../../../components/NotFound'; import { useFormatter } from '../../../../../components/i18n'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import AtomicTesting from '../../../atomic_testings/atomic_testing/AtomicTesting'; -import AtomicTestingDetail from '../../../atomic_testings/atomic_testing/AtomicTestingDetail'; +import Loader from '../../../../../components/Loader'; +import NotFound from '../../../../../components/NotFound'; +import { useHelper } from '../../../../../store'; import type { Exercise as ExerciseType, InjectResultDTO } from '../../../../../utils/api-types'; -import { PermissionsContext, PermissionsContextType } from '../../../common/Context'; import { usePermissions } from '../../../../../utils/Exercise'; -import Breadcrumbs, { BreadcrumbsElement } from '../../../../../components/Breadcrumbs'; -import { useHelper } from '../../../../../store'; -import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; +import { useAppDispatch } from '../../../../../utils/hooks'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { fetchExercise } from '../../../../../actions/Exercise'; -import { fetchInjectResultDto } from '../../../../../actions/atomic_testings/atomic-testing-actions'; +import AtomicTesting from '../../../atomic_testings/atomic_testing/AtomicTesting'; +import AtomicTestingDetail from '../../../atomic_testings/atomic_testing/AtomicTestingDetail'; import { InjectResultDtoContext } from '../../../atomic_testings/InjectResultDtoContext'; +import { PermissionsContext, PermissionsContextType } from '../../../common/Context'; import InjectHeader from '../../../injects/InjectHeader'; const useStyles = makeStyles(() => ({ @@ -33,7 +34,7 @@ const useStyles = makeStyles(() => ({ }, })); -const InjectIndexComponent: FunctionComponent<{ exercise: ExerciseType, injectResult: InjectResultDTO }> = ({ +const InjectIndexComponent: FunctionComponent<{ exercise: ExerciseType; injectResult: InjectResultDTO }> = ({ exercise, injectResult, }) => { diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/QuickInject.js b/openbas-front/src/admin/components/simulations/simulation/injects/QuickInject.js index 921bdafe5c..4a9cac4cc3 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/QuickInject.js +++ b/openbas-front/src/admin/components/simulations/simulation/injects/QuickInject.js @@ -1,7 +1,13 @@ -import { forwardRef, Component } from 'react'; -import * as PropTypes from 'prop-types'; -import * as R from 'ramda'; -import { withStyles } from '@mui/styles'; +import { + ArrowDropDownOutlined, + ArrowDropUpOutlined, + AttachmentOutlined, + CastForEducationOutlined, + CloseRounded, + ControlPointOutlined, + DeleteOutlined, + HelpOutlineOutlined, +} from '@mui/icons-material'; import { Button, FormControlLabel, @@ -18,39 +24,34 @@ import { Switch, Typography, } from '@mui/material'; -import { Form } from 'react-final-form'; -import { connect } from 'react-redux'; -import { - ArrowDropDownOutlined, - ArrowDropUpOutlined, - AttachmentOutlined, - CastForEducationOutlined, - CloseRounded, - ControlPointOutlined, - DeleteOutlined, - HelpOutlineOutlined, -} from '@mui/icons-material'; +import { withStyles } from '@mui/styles'; import arrayMutators from 'final-form-arrays'; +import * as PropTypes from 'prop-types'; +import * as R from 'ramda'; +import { Component, forwardRef } from 'react'; +import { Form } from 'react-final-form'; import { FieldArray } from 'react-final-form-arrays'; -import inject18n from '../../../../../components/i18n'; -import { addInjectForExercise } from '../../../../../actions/Inject'; +import { connect } from 'react-redux'; + import { fetchDocuments } from '../../../../../actions/Document'; -import ItemTags from '../../../../../components/ItemTags'; +import { addInjectForExercise } from '../../../../../actions/Inject'; import { storeHelper } from '../../../../../actions/Schema'; -import TeamPopover from '../../../components/teams/TeamPopover'; -import ItemBoolean from '../../../../../components/ItemBoolean'; -import InjectAddTeams from '../../../common/injects/InjectAddTeams'; -import { isExerciseReadOnly, isExerciseUpdatable, secondsFromToNow } from '../../../../../utils/Exercise'; +import { fetchVariablesForExercise } from '../../../../../actions/variables/variable-actions'; +import MultipleFileLoader from '../../../../../components/fields/MultipleFileLoader'; +import OldSelectField from '../../../../../components/fields/OldSelectField'; import OldTextField from '../../../../../components/fields/OldTextField'; -import SwitchField from '../../../../../components/fields/SwitchField'; import RichTextField from '../../../../../components/fields/RichTextField'; -import MultipleFileLoader from '../../../../../components/fields/MultipleFileLoader'; -import DocumentType from '../../../components/documents/DocumentType'; +import SwitchField from '../../../../../components/fields/SwitchField'; +import inject18n from '../../../../../components/i18n'; +import ItemBoolean from '../../../../../components/ItemBoolean'; +import ItemTags from '../../../../../components/ItemTags'; +import { isExerciseReadOnly, isExerciseUpdatable, secondsFromToNow } from '../../../../../utils/Exercise'; +import InjectExpectations from '../../../common/injects/expectations/InjectExpectations'; +import InjectAddTeams from '../../../common/injects/InjectAddTeams'; import DocumentPopover from '../../../components/documents/DocumentPopover'; -import OldSelectField from '../../../../../components/fields/OldSelectField'; +import DocumentType from '../../../components/documents/DocumentType'; +import TeamPopover from '../../../components/teams/TeamPopover'; import AvailableVariablesDialog from '../variables/AvailableVariablesDialog'; -import InjectExpectations from '../../../common/injects/expectations/InjectExpectations'; -import { fetchVariablesForExercise } from '../../../../../actions/variables/variable-actions'; export const EMAIL_CONTRACT = '138ad8f8-32f8-4a22-8114-aaa12322bd09'; @@ -59,7 +60,7 @@ const Transition = forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; -const styles = (theme) => ({ +const styles = theme => ({ header: { backgroundColor: theme.palette.background.nav, padding: '20px 20px 20px 60px', @@ -269,7 +270,7 @@ class QuickInject extends Component { handleRemoveTeam(teamId) { this.setState({ - teamsIds: this.state.teamsIds.filter((a) => a !== teamId), + teamsIds: this.state.teamsIds.filter(a => a !== teamId), }); } @@ -282,7 +283,7 @@ class QuickInject extends Component { handleRemoveDocument(documentId) { this.setState({ documents: this.state.documents.filter( - (d) => d.document_id !== documentId, + d => d.document_id !== documentId, ), }); } @@ -293,11 +294,11 @@ class QuickInject extends Component { toggleAttachment(documentId) { this.setState({ - documents: this.state.documents.map((d) => (d.document_id === documentId + documents: this.state.documents.map(d => (d.document_id === documentId ? { - document_id: d.document_id, - document_attached: !d.document_attached, - } + document_id: d.document_id, + document_attached: !d.document_attached, + } : d)), }); } @@ -318,11 +319,13 @@ class QuickInject extends Component { teamsSortHeader(field, label, isSortable) { const { t } = this.props; const { teamsSortBy, teamsOrderAsc } = this.state; - const sortComponent = teamsOrderAsc ? ( - - ) : ( - - ); + const sortComponent = teamsOrderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    - ) : ( - - ); + const sortComponent = documentsOrderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    f.key) + .map(f => f.key) .includes('expectations'); if (hasExpectations) { finalData.expectations = this.state.expectations; } injectorContract.fields .filter( - (f) => !['teams', 'attachments', 'expectations'].includes( + f => !['teams', 'attachments', 'expectations'].includes( f.key, ), ) @@ -450,7 +455,7 @@ class QuickInject extends Component { if (injectorContract && Array.isArray(injectorContract.fields)) { injectorContract.fields .filter( - (f) => !['teams', 'attachments', 'expectations'].includes( + f => !['teams', 'attachments', 'expectations'].includes( f.key, ), ) @@ -471,28 +476,30 @@ class QuickInject extends Component { {renderedFields.map((field, position) => { switch (field.type) { case 'textarea': - return field.richText ? ( - - ) : ( - - ); + return field.richText + ? ( + + ) + : ( + + ); case 'number': return ( - {attachedDocs.map((doc) => ( - - - {doc.document_name} - - - ))} - - ) : ( - - )} + {attachedDocs.map(doc => ( + + + {doc.document_name} + + + ))} + + ) : ( + + )} {field.cardinality === 'n' && ( fields.remove(index)} @@ -641,100 +647,102 @@ class QuickInject extends Component {
    ); case 'select': - return field.cardinality === 'n' ? ( - v.map((a) => field.choices[a]).join(', ')} - name={field.key} - fullWidth={true} - style={{ marginTop: 20 }} - disabled={isExerciseReadOnly(exercise)} - > - {Object.entries(field.choices) - .sort((a, b) => a[1].localeCompare(b[1])) - .map(([k, v]) => ( - - - {field.expectation ? t(v || 'Unknown') : v} - - - ))} - - ) : ( - (field.expectation - ? t(field.choices[v] || 'Unknown') - : field.choices[v]) - } - name={field.key} - fullWidth={true} - style={{ marginTop: 20 }} - disabled={isExerciseReadOnly(exercise)} - > - {Object.entries(field.choices) - .sort((a, b) => a[1].localeCompare(b[1])) - .map(([k, v]) => ( - - - {field.expectation ? t(v || 'Unknown') : v} - - - ))} - - ); + return field.cardinality === 'n' + ? ( + v.map(a => field.choices[a]).join(', ')} + name={field.key} + fullWidth={true} + style={{ marginTop: 20 }} + disabled={isExerciseReadOnly(exercise)} + > + {Object.entries(field.choices) + .sort((a, b) => a[1].localeCompare(b[1])) + .map(([k, v]) => ( + + + {field.expectation ? t(v || 'Unknown') : v} + + + ))} + + ) + : ( + (field.expectation + ? t(field.choices[v] || 'Unknown') + : field.choices[v])} + name={field.key} + fullWidth={true} + style={{ marginTop: 20 }} + disabled={isExerciseReadOnly(exercise)} + > + {Object.entries(field.choices) + .sort((a, b) => a[1].localeCompare(b[1])) + .map(([k, v]) => ( + + + {field.expectation ? t(v || 'Unknown') : v} + + + ))} + + ); case 'dependency-select': // eslint-disable-next-line no-case-declarations const depValue = values[field.dependencyField]; // eslint-disable-next-line no-case-declarations const choices = field.choices[depValue] ?? {}; - return field.cardinality === 'n' ? ( - v.map((a) => choices[a]).join(', ')} - name={field.key} - fullWidth={true} - style={{ marginTop: 20 }} - disabled={isExerciseReadOnly(exercise)} - > - {Object.entries(choices) - .sort((a, b) => a[1].localeCompare(b[1])) - .map(([k, v]) => ( - - {v} - - ))} - - ) : ( - (field.expectation ? t(choices[v] || 'Unknown') : choices[v]) - } - name={field.key} - fullWidth={true} - style={{ marginTop: 20 }} - > - {Object.entries(choices) - .sort((a, b) => a[1].localeCompare(b[1])) - .map(([k, v]) => ( - - - {field.expectation ? t(v || 'Unknown') : v} - - - ))} - - ); + return field.cardinality === 'n' + ? ( + v.map(a => choices[a]).join(', ')} + name={field.key} + fullWidth={true} + style={{ marginTop: 20 }} + disabled={isExerciseReadOnly(exercise)} + > + {Object.entries(choices) + .sort((a, b) => a[1].localeCompare(b[1])) + .map(([k, v]) => ( + + {v} + + ))} + + ) + : ( + (field.expectation ? t(choices[v] || 'Unknown') : choices[v])} + name={field.key} + fullWidth={true} + style={{ marginTop: 20 }} + > + {Object.entries(choices) + .sort((a, b) => a[1].localeCompare(b[1])) + .map(([k, v]) => ( + + + {field.expectation ? t(v || 'Unknown') : v} + + + ))} + + ); default: return ( !builtInFields.includes(f.key) && !f.expectation) + .filter(f => !builtInFields.includes(f.key) && !f.expectation) .forEach((field) => { if (field.cardinality && field.cardinality === '1') { let defaultValue = R.head(field.defaultValue); @@ -810,8 +818,8 @@ class QuickInject extends Component { } = this.state; // -- TEAMS -- const teams = teamsIds - .map((a) => teamsMap[a]) - .filter((a) => a !== undefined); + .map(a => teamsMap[a]) + .filter(a => a !== undefined); const sortTeams = R.sortWith( teamsOrderAsc ? [R.ascend(R.prop(teamsSortBy))] @@ -819,18 +827,18 @@ class QuickInject extends Component { ); const sortedTeams = sortTeams(teams); const hasTeams = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('teams'); // -- DOCUMENTS -- const docs = documents - .map((d) => (documentsMap[d.document_id] + .map(d => (documentsMap[d.document_id] ? { - ...documentsMap[d.document_id], - document_attached: d.document_attached, - } + ...documentsMap[d.document_id], + document_attached: d.document_attached, + } : undefined)) - .filter((d) => d !== undefined); - const attachedDocs = docs.filter((n) => n.document_attached); + .filter(d => d !== undefined); + const attachedDocs = docs.filter(n => n.document_attached); const sortDocuments = R.sortWith( documentsOrderAsc ? [R.ascend(R.prop(documentsSortBy))] @@ -838,17 +846,17 @@ class QuickInject extends Component { ); const sortedDocuments = sortDocuments(docs); const hasAttachments = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('attachments'); // -- EXPECTATIONS -- const hasExpectations = injectorContract.fields - .map((f) => f.key) + .map(f => f.key) .includes('expectations'); const predefinedExpectations = injectorContract.fields.filter( - (f) => f.key === 'expectations', - ).flatMap((f) => f.predefinedExpectations); + f => f.key === 'expectations', + ).flatMap(f => f.predefinedExpectations); const expectationsNotManual = injectorContract.fields.filter( - (f) => f.expectation === true, + f => f.expectation === true, ); const initialValues = {}; // Enrich initialValues with default contract value @@ -858,7 +866,7 @@ class QuickInject extends Component { 'expectations', ]; injectorContract.fields - .filter((f) => !builtInFields.includes(f.key)) + .filter(f => !builtInFields.includes(f.key)) .forEach((field) => { if (!initialValues[field.key]) { if (field.cardinality && field.cardinality === '1') { @@ -870,7 +878,7 @@ class QuickInject extends Component { }); // Specific processing for some fields injectorContract.fields - .filter((f) => !builtInFields.includes(f.key)) + .filter(f => !builtInFields.includes(f.key)) .forEach((field) => { if ( field.type === 'textarea' @@ -962,14 +970,14 @@ class QuickInject extends Component { classes={{ root: classes.allTeams }} > - } + )} label={{t('All teams')}} /> @@ -992,7 +1000,7 @@ class QuickInject extends Component { {this.teamsSortHeader( 'team_name', @@ -1015,7 +1023,7 @@ class QuickInject extends Component { true, )}
    - } + )} />   @@ -1030,7 +1038,7 @@ class QuickInject extends Component {
    - } + )} />   @@ -1071,7 +1079,7 @@ class QuickInject extends Component { ) : (
    - {sortedTeams.map((team) => ( + {sortedTeams.map(team => (
    - } + )} /> {isExerciseUpdatable(exercise) - ? () :   } + ? ( + + ) :   } ))} @@ -1164,7 +1174,7 @@ class QuickInject extends Component { {this.renderFields( injectorContract.fields .filter( - (f) => !builtInFields.includes(f.key) && !f.expectation, + f => !builtInFields.includes(f.key) && !f.expectation, ) .filter((f) => { // Filter display if linked fields @@ -1207,7 +1217,8 @@ class QuickInject extends Component { {(hasExpectations || expectationsNotManual.length > 0) - && <> + && ( + <> {t('Inject expectations')} @@ -1245,14 +1256,15 @@ class QuickInject extends Component { )} {hasExpectations - && 0) ? expectations : predefinedExpectations} handleExpectations={this.handleExpectations.bind(this)} - /> - } + /> + )} - } + )}
    {t('Inject documents')} @@ -1275,7 +1287,7 @@ class QuickInject extends Component { {this.documentsSortHeader( 'document_name', @@ -1298,11 +1310,11 @@ class QuickInject extends Component { true, )}
    - } + )} />   - {sortedDocuments.map((document) => ( + {sortedDocuments.map(document => (
    - } + )} /> !a.inject_document_attached) - .map((d) => d.document_id)} + .filter(a => !a.inject_document_attached) + .map(d => d.document_id)} handleAddDocuments={this.handleAddDocuments.bind(this)} hasAttachments={hasAttachments} /> diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/asset_groups/InjectAddAssetGroups.tsx b/openbas-front/src/admin/components/simulations/simulation/injects/asset_groups/InjectAddAssetGroups.tsx index e63803b36e..8901691030 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/asset_groups/InjectAddAssetGroups.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/injects/asset_groups/InjectAddAssetGroups.tsx @@ -1,9 +1,10 @@ +import { ControlPointOutlined } from '@mui/icons-material'; +import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { FunctionComponent, useContext, useState } from 'react'; -import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; -import { ControlPointOutlined } from '@mui/icons-material'; -import type { Theme } from '../../../../../../components/Theme'; + import { useFormatter } from '../../../../../../components/i18n'; +import type { Theme } from '../../../../../../components/Theme'; import AssetGroupDialogAdding from '../../../../assets/asset_groups/AssetGroupDialogAdding'; import { PermissionsContext } from '../../../../common/Context'; diff --git a/openbas-front/src/admin/components/simulations/simulation/injects/endpoints/InjectAddEndpoints.tsx b/openbas-front/src/admin/components/simulations/simulation/injects/endpoints/InjectAddEndpoints.tsx index c9cccb77a9..226017cf77 100644 --- a/openbas-front/src/admin/components/simulations/simulation/injects/endpoints/InjectAddEndpoints.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/injects/endpoints/InjectAddEndpoints.tsx @@ -1,7 +1,8 @@ -import { FunctionComponent, useContext, useState } from 'react'; -import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; +import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useContext, useState } from 'react'; + import { useFormatter } from '../../../../../../components/i18n'; import type { Theme } from '../../../../../../components/Theme'; import EndpointsDialogAdding from '../../../../assets/endpoints/EndpointsDialogAdding'; @@ -63,8 +64,14 @@ const InjectAddEndpoints: FunctionComponent = ({ classes={{ primary: classes.text }} /> - diff --git a/openbas-front/src/admin/components/simulations/simulation/lessons/ExerciseLessons.tsx b/openbas-front/src/admin/components/simulations/simulation/lessons/ExerciseLessons.tsx index cf0eb1d041..402efaaf52 100644 --- a/openbas-front/src/admin/components/simulations/simulation/lessons/ExerciseLessons.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/lessons/ExerciseLessons.tsx @@ -1,29 +1,8 @@ import { useParams } from 'react-router-dom'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { LessonContext, LessonContextType } from '../../../common/Context'; -import type { - EvaluationInput, - Exercise, - LessonsCategoryCreateInput, - LessonsCategoryTeamsInput, - LessonsCategoryUpdateInput, - LessonsQuestionCreateInput, - LessonsQuestionUpdateInput, - LessonsSendInput, - ObjectiveInput, -} from '../../../../../utils/api-types'; -import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; -import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; -import type { LessonsTemplatesHelper } from '../../../../../actions/lessons/lesson-helper'; -import type { ScenariosHelper } from '../../../../../actions/scenarios/scenario-helper'; -import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; -import type { UserHelper } from '../../../../../actions/helper'; -import { fetchLessonsTemplates } from '../../../../../actions/Lessons'; -import { fetchExerciseInjects } from '../../../../../actions/Inject'; + +import { addExerciseEvaluation, fetchExerciseEvaluations, updateExerciseEvaluation } from '../../../../../actions/Evaluation'; import { fetchExerciseTeams, updateExerciseLessons } from '../../../../../actions/Exercise'; -import Lessons from '../../../lessons/exercises/Lessons'; +import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; import { addLessonsCategory, addLessonsQuestion, @@ -41,10 +20,32 @@ import { updateLessonsCategoryTeams, updateLessonsQuestion, } from '../../../../../actions/exercises/exercise-action'; -import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; -import { usePermissions } from '../../../../../utils/Exercise'; +import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; +import type { UserHelper } from '../../../../../actions/helper'; +import { fetchExerciseInjects } from '../../../../../actions/Inject'; +import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; +import { fetchLessonsTemplates } from '../../../../../actions/Lessons'; +import type { LessonsTemplatesHelper } from '../../../../../actions/lessons/lesson-helper'; import { addExerciseObjective, deleteExerciseObjective, fetchExerciseObjectives, updateExerciseObjective } from '../../../../../actions/Objective'; -import { addExerciseEvaluation, fetchExerciseEvaluations, updateExerciseEvaluation } from '../../../../../actions/Evaluation'; +import type { ScenariosHelper } from '../../../../../actions/scenarios/scenario-helper'; +import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; +import { useHelper } from '../../../../../store'; +import type { + EvaluationInput, + Exercise, + LessonsCategoryCreateInput, + LessonsCategoryTeamsInput, + LessonsCategoryUpdateInput, + LessonsQuestionCreateInput, + LessonsQuestionUpdateInput, + LessonsSendInput, + ObjectiveInput, +} from '../../../../../utils/api-types'; +import { usePermissions } from '../../../../../utils/Exercise'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { LessonContext, LessonContextType } from '../../../common/Context'; +import Lessons from '../../../lessons/exercises/Lessons'; const ExerciseLessons = () => { const dispatch = useAppDispatch(); @@ -151,7 +152,8 @@ const ExerciseLessons = () => { return ( - { lessonsAnswers={lessonsAnswers} lessonsTemplates={lessonsTemplates} usersMap={usersMap} - > + > + ); }; diff --git a/openbas-front/src/admin/components/simulations/simulation/logs/LogForm.js b/openbas-front/src/admin/components/simulations/simulation/logs/LogForm.js index 80f1ab2693..2967c030cb 100644 --- a/openbas-front/src/admin/components/simulations/simulation/logs/LogForm.js +++ b/openbas-front/src/admin/components/simulations/simulation/logs/LogForm.js @@ -1,7 +1,8 @@ -import { Component } from 'react'; +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import OldTextField from '../../../../../components/fields/OldTextField'; import inject18n from '../../../../../components/i18n'; import TagField from '../../../../../components/TagField'; diff --git a/openbas-front/src/admin/components/simulations/simulation/logs/LogPopover.js b/openbas-front/src/admin/components/simulations/simulation/logs/LogPopover.js index 16f11d4d57..060f077be0 100644 --- a/openbas-front/src/admin/components/simulations/simulation/logs/LogPopover.js +++ b/openbas-front/src/admin/components/simulations/simulation/logs/LogPopover.js @@ -1,16 +1,17 @@ -import { Component } from 'react'; +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem } from '@mui/material'; import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import * as R from 'ramda'; -import { Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, Button, IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; -import { updateLog, deleteLog } from '../../../../../actions/Log'; -import LogForm from './LogForm'; -import inject18n from '../../../../../components/i18n'; -import Transition from '../../../../../components/common/Transition'; +import { Component } from 'react'; +import { connect } from 'react-redux'; + +import { deleteLog, updateLog } from '../../../../../actions/Log'; import { storeHelper } from '../../../../../actions/Schema'; +import Transition from '../../../../../components/common/Transition'; +import inject18n from '../../../../../components/i18n'; import { isExerciseReadOnly } from '../../../../../utils/Exercise'; import { tagOptions } from '../../../../../utils/Option'; +import LogForm from './LogForm'; class LogPopover extends Component { constructor(props) { diff --git a/openbas-front/src/admin/components/simulations/simulation/logs/Logs.js b/openbas-front/src/admin/components/simulations/simulation/logs/Logs.js index c688a9aee5..80c95d9e43 100644 --- a/openbas-front/src/admin/components/simulations/simulation/logs/Logs.js +++ b/openbas-front/src/admin/components/simulations/simulation/logs/Logs.js @@ -1,21 +1,22 @@ -import { useEffect, useRef, useState } from 'react'; -import { makeStyles, useTheme } from '@mui/styles'; import { EditOutlined, ExpandMoreOutlined, RateReviewOutlined } from '@mui/icons-material'; import { Accordion, AccordionDetails, AccordionSummary, Card, CardContent, CardHeader, IconButton, Typography } from '@mui/material'; -import { useParams } from 'react-router-dom'; -import { useDispatch } from 'react-redux'; +import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; +import { useEffect, useRef, useState } from 'react'; +import { useDispatch } from 'react-redux'; +import { useParams } from 'react-router-dom'; + +import { addLog, fetchLogs } from '../../../../../actions/Log'; +import { fetchExerciseObjectives } from '../../../../../actions/Objective'; import { useFormatter } from '../../../../../components/i18n'; +import ItemTags from '../../../../../components/ItemTags'; import { useHelper } from '../../../../../store'; +import { isExerciseUpdatable } from '../../../../../utils/Exercise'; import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { addLog, fetchLogs } from '../../../../../actions/Log'; -import LogPopover from './LogPopover'; import { resolveUserName } from '../../../../../utils/String'; -import ItemTags from '../../../../../components/ItemTags'; -import LogForm from './LogForm'; -import { isExerciseUpdatable } from '../../../../../utils/Exercise'; import AnimationMenu from '../AnimationMenu'; -import { fetchExerciseObjectives } from '../../../../../actions/Objective'; +import LogForm from './LogForm'; +import LogPopover from './LogPopover'; const useStyles = makeStyles(() => ({ card: { @@ -78,22 +79,22 @@ const Logs = () => { }; return (
    - +
    {t('Simulation logs')} {isExerciseUpdatable(exercise, true) && ( - - - + + + )} - {logs.map((log) => ( + {logs.map(log => ( { padding: '7px 10px 2px 15px', borderBottom: `1px solid ${theme.palette.divider}`, }} - action={} - title={ + action={} + title={(
    {   - {t('added an entry on')} {nsdt(log.log_created_at)} + {t('added an entry on')} + {' '} + {nsdt(log.log_created_at)}
    { textTransform: 'none', }} > - +
    - } + )} /> {log.log_title} @@ -145,30 +148,30 @@ const Logs = () => {
    ))} {isExerciseUpdatable(exercise, true) && ( - 0 ? '30' : '5'}px 0 30px 0` }} - expanded={openCreateLog} - onChange={handleToggleWrite} - variant="outlined" - > - }> - - + 0 ? '30' : '5'}px 0 30px 0` }} + expanded={openCreateLog} + onChange={handleToggleWrite} + variant="outlined" + > + }> + +      - {t('Write an entry')} - - - - setOpenCreateLog(false)} - /> - - + {t('Write an entry')} + + + + setOpenCreateLog(false)} + /> + + )} -
    -
    +
    +
    ); diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/Communication.js b/openbas-front/src/admin/components/simulations/simulation/mails/Communication.js index 3c6dc3afb3..44356cb3a5 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/Communication.js +++ b/openbas-front/src/admin/components/simulations/simulation/mails/Communication.js @@ -1,13 +1,14 @@ -import { useState } from 'react'; -import { makeStyles, useTheme } from '@mui/styles'; -import { Avatar, Card, CardHeader, CardContent, IconButton, Button } from '@mui/material'; +import { AttachFileRounded, ExpandLess, ExpandMore } from '@mui/icons-material'; +import { Avatar, Button, Card, CardContent, CardHeader, IconButton } from '@mui/material'; import { lightBlue } from '@mui/material/colors'; -import { ExpandLess, ExpandMore, AttachFileRounded } from '@mui/icons-material'; -import parse from 'html-react-parser'; +import { makeStyles, useTheme } from '@mui/styles'; import DOMPurify from 'dompurify'; +import parse from 'html-react-parser'; +import { useState } from 'react'; + import { useFormatter } from '../../../../../components/i18n'; -import { resolveUserNames, truncate } from '../../../../../utils/String'; import TruncatedText from '../../../../../components/TruncatedText'; +import { resolveUserNames, truncate } from '../../../../../utils/String'; const useStyles = makeStyles(() => ({ card: { @@ -46,24 +47,24 @@ const Communication = (props) => { variant="outlined" > {Array.from(communication.communication_from)[0].toUpperCase()} - } - action={ + )} + action={(
    {expand ? : }
    - } - title={ + )} + title={( - } + )} subheader={ communication.communication_animation ? ( @@ -91,7 +92,9 @@ const Communication = (props) => { color: theme.palette.text.secondary, }} > - {t('on')} {nsdt(communication.communication_sent_at)} + {t('on')} + {' '} + {nsdt(communication.communication_sent_at)} ) : ( diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/CommunicationForm.js b/openbas-front/src/admin/components/simulations/simulation/mails/CommunicationForm.js index 2950c6b0f8..44c470e855 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/CommunicationForm.js +++ b/openbas-front/src/admin/components/simulations/simulation/mails/CommunicationForm.js @@ -1,9 +1,10 @@ -import { Form } from 'react-final-form'; import { Button } from '@mui/material'; -import { useFormatter } from '../../../../../components/i18n'; +import { Form } from 'react-final-form'; + import OldTextField from '../../../../../components/fields/OldTextField'; import RichTextField from '../../../../../components/fields/RichTextField'; import FileField from '../../../../../components/FileField'; +import { useFormatter } from '../../../../../components/i18n'; const CommunicationForm = ({ onSubmit, handleClose, initialValues }) => { const { t } = useFormatter(); diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/Inject.js b/openbas-front/src/admin/components/simulations/simulation/mails/Inject.js index cb4ee8c0b0..083480904c 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/Inject.js +++ b/openbas-front/src/admin/components/simulations/simulation/mails/Inject.js @@ -1,21 +1,22 @@ -import { useState } from 'react'; -import * as R from 'ramda'; +import { ReplyOutlined } from '@mui/icons-material'; +import { Button, Dialog, DialogContent, DialogTitle, Grid, Paper, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import { useParams } from 'react-router-dom'; -import { Grid, Typography, Paper, Dialog, DialogTitle, DialogContent, Button } from '@mui/material'; -import { ReplyOutlined } from '@mui/icons-material'; + +import { fetchInjectCommunications } from '../../../../../actions/Communication'; import { executeInject, fetchExerciseInjects } from '../../../../../actions/Inject'; +import { fetchPlayers } from '../../../../../actions/User'; +import Transition from '../../../../../components/common/Transition'; import { useFormatter } from '../../../../../components/i18n'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import ItemTags from '../../../../../components/ItemTags'; +import Loader from '../../../../../components/Loader'; import { useHelper } from '../../../../../store'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import AnimationMenu from '../AnimationMenu'; -import Loader from '../../../../../components/Loader'; -import { fetchInjectCommunications } from '../../../../../actions/Communication'; -import ItemTags from '../../../../../components/ItemTags'; -import { fetchPlayers } from '../../../../../actions/User'; import Communication from './Communication'; -import Transition from '../../../../../components/common/Transition'; import CommunicationForm from './CommunicationForm'; const useStyles = makeStyles(() => ({ @@ -56,7 +57,7 @@ const Inject = () => { R.descend(R.prop('communication_received_at')), ]); // Rendering - const handleOpenReply = (communicationId) => setReply(communicationId); + const handleOpenReply = communicationId => setReply(communicationId); const handleCloseReply = () => setReply(null); const onSubmitReply = (topic, data) => { let body = data.communication_content; @@ -68,8 +69,8 @@ const Inject = () => {
    From: ${lastCommunication.communication_from - .replaceAll('<', '<') - .replaceAll('>', '>')}
    + .replaceAll('<', '<') + .replaceAll('>', '>')}
    Sent: ${fldt(lastCommunication.communication_sent_at)}
    Subject: ${lastCommunication.communication_subject}
    @@ -78,11 +79,11 @@ const Inject = () => {
    ${ - lastCommunication.communication_content - && lastCommunication.communication_content.length > 10 - ? lastCommunication.communication_content.replaceAll('\n', '
    ') - : lastCommunication.communication_content_html -} + lastCommunication.communication_content + && lastCommunication.communication_content.length > 10 + ? lastCommunication.communication_content.replaceAll('\n', '
    ') + : lastCommunication.communication_content_html + }
    `; @@ -104,10 +105,10 @@ const Inject = () => { if (inject && communications) { // Group communication by subject const communicationsWithMails = R.map( - (n) => R.assoc( + n => R.assoc( 'communication_mails', R.map( - (o) => (usersMap[o] ? usersMap[o].user_email : '').toLowerCase(), + o => (usersMap[o] ? usersMap[o].user_email : '').toLowerCase(), n.communication_users, ), n, @@ -115,25 +116,25 @@ const Inject = () => { communications, ); const topics = R.pipe( - R.filter((n) => !n.communication_subject.toLowerCase().includes('re: ')), - R.map((n) => R.assoc( + R.filter(n => !n.communication_subject.toLowerCase().includes('re: ')), + R.map(n => R.assoc( 'communication_communications', sortCommunications( R.filter( - (o) => o.communication_subject.toLowerCase().includes('re: ') - && ((o.communication_animation - && R.any( - (p) => o.communication_to - .toLowerCase() - .includes(p.toLowerCase()), - n.communication_mails, - )) - || R.any( - (p) => o.communication_from - .toLowerCase() - .includes(p.toLowerCase()), - n.communication_mails, - )), + o => o.communication_subject.toLowerCase().includes('re: ') + && ((o.communication_animation + && R.any( + p => o.communication_to + .toLowerCase() + .includes(p.toLowerCase()), + n.communication_mails, + )) + || R.any( + p => o.communication_from + .toLowerCase() + .includes(p.toLowerCase()), + n.communication_mails, + )), communicationsWithMails, ), ), @@ -144,7 +145,7 @@ const Inject = () => { let topic = null; const defaultContent = ''; if (reply) { - topic = R.head(R.filter((n) => n.communication_id === reply, topics)); + topic = R.head(R.filter(n => n.communication_id === reply, topics)); defaultSubject = `Re: ${topic.communication_subject}`; } return ( @@ -206,7 +207,7 @@ const Inject = () => {
    {topics.map((currentTopic) => { const topicUsers = currentTopic.communication_users.map( - (userId) => usersMap[userId] ?? {}, + userId => usersMap[userId] ?? {}, ); return (
    @@ -218,7 +219,7 @@ const Inject = () => { {currentTopic.communication_communications.toReversed().map( (communication) => { const communicationUsers = communication.communication_users.map( - (userId) => usersMap[userId] ?? {}, + userId => usersMap[userId] ?? {}, ); return ( { communication_subject: defaultSubject, communication_content: defaultContent, }} - onSubmit={(data) => onSubmitReply(topic, data)} + onSubmit={data => onSubmitReply(topic, data)} handleClose={handleCloseReply} /> diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByInject.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByInject.tsx index a205812f68..43de14d022 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByInject.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByInject.tsx @@ -1,18 +1,19 @@ import { useTheme } from '@mui/styles'; +import * as R from 'ramda'; import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; -import * as R from 'ramda'; -import Empty from '../../../../../components/Empty'; + import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import { fetchExerciseInjects } from '../../../../../actions/Inject'; +import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; +import Empty from '../../../../../components/Empty'; import { useFormatter } from '../../../../../components/i18n'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { horizontalBarsChartOptions } from '../../../../../utils/Charts'; import type { Theme } from '../../../../../components/Theme'; -import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; -import { fetchExerciseInjects } from '../../../../../actions/Inject'; +import { useHelper } from '../../../../../store'; import type { Inject } from '../../../../../utils/api-types'; +import { horizontalBarsChartOptions } from '../../../../../utils/Charts'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; interface Props { exerciseId: ExerciseStore['exercise_id']; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByPlayer.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByPlayer.tsx index daa55ede4f..6ff4d91921 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByPlayer.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByPlayer.tsx @@ -1,21 +1,22 @@ import { useTheme } from '@mui/styles'; +import * as R from 'ramda'; import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; -import * as R from 'ramda'; -import Empty from '../../../../../components/Empty'; + +import { fetchExerciseCommunications } from '../../../../../actions/Communication'; +import type { CommunicationHelper } from '../../../../../actions/communications/communication-helper'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import type { UserHelper } from '../../../../../actions/helper'; +import { fetchPlayers } from '../../../../../actions/User'; +import Empty from '../../../../../components/Empty'; import { useFormatter } from '../../../../../components/i18n'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { horizontalBarsChartOptions } from '../../../../../utils/Charts'; import type { Theme } from '../../../../../components/Theme'; +import { useHelper } from '../../../../../store'; import type { Communication, User } from '../../../../../utils/api-types'; +import { horizontalBarsChartOptions } from '../../../../../utils/Charts'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { resolveUserName } from '../../../../../utils/String'; -import type { CommunicationHelper } from '../../../../../actions/communications/communication-helper'; -import { fetchExerciseCommunications } from '../../../../../actions/Communication'; -import type { UserHelper } from '../../../../../actions/helper'; -import { fetchPlayers } from '../../../../../actions/User'; interface Props { exerciseId: ExerciseStore['exercise_id']; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByTeam.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByTeam.tsx index 743a39ded5..aa09e00c23 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByTeam.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionByTeam.tsx @@ -1,19 +1,20 @@ import { useTheme } from '@mui/styles'; +import * as R from 'ramda'; import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; -import * as R from 'ramda'; -import Empty from '../../../../../components/Empty'; + +import { fetchExerciseTeams } from '../../../../../actions/Exercise'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; +import Empty from '../../../../../components/Empty'; import { useFormatter } from '../../../../../components/i18n'; -import { useAppDispatch } from '../../../../../utils/hooks'; +import type { Theme } from '../../../../../components/Theme'; import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import type { Team } from '../../../../../utils/api-types'; import { horizontalBarsChartOptions } from '../../../../../utils/Charts'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { computeTeamsColors } from '../overview/DistributionUtils'; -import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; -import { fetchExerciseTeams } from '../../../../../actions/Exercise'; -import type { Theme } from '../../../../../components/Theme'; -import type { Team } from '../../../../../utils/api-types'; interface Props { exerciseId: ExerciseStore['exercise_id']; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeChart.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeChart.tsx index 31e985e2d5..c865b99a84 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeChart.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeChart.tsx @@ -1,18 +1,19 @@ +import { Theme } from '@mui/material'; import { useTheme } from '@mui/styles'; +import * as R from 'ramda'; import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; -import * as R from 'ramda'; -import { Theme } from '@mui/material'; -import Empty from '../../../../../components/Empty'; + +import { fetchExerciseCommunications } from '../../../../../actions/Communication'; +import type { CommunicationHelper } from '../../../../../actions/communications/communication-helper'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import Empty from '../../../../../components/Empty'; import { useFormatter } from '../../../../../components/i18n'; -import { useAppDispatch } from '../../../../../utils/hooks'; import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { fetchExerciseCommunications } from '../../../../../actions/Communication'; -import type { CommunicationHelper } from '../../../../../actions/communications/communication-helper'; import type { Communication } from '../../../../../utils/api-types'; import { areaChartOptions } from '../../../../../utils/Charts'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; interface Props { exerciseId: ExerciseStore['exercise_id']; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx index b9009f5c42..c550cdf708 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/mails/MailDistributionOverTimeLine.tsx @@ -1,20 +1,21 @@ +import { Theme } from '@mui/material'; import { useTheme } from '@mui/styles'; +import * as R from 'ramda'; import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; -import * as R from 'ramda'; -import { Theme } from '@mui/material'; -import Empty from '../../../../../components/Empty'; + +import { fetchExerciseTeams } from '../../../../../actions/Exercise'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import type { TeamStore } from '../../../../../actions/teams/Team'; +import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; +import Empty from '../../../../../components/Empty'; import { useFormatter } from '../../../../../components/i18n'; -import { useAppDispatch } from '../../../../../utils/hooks'; import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import type { Communication } from '../../../../../utils/api-types'; import { lineChartOptions } from '../../../../../utils/Charts'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { getTeamsColors } from '../../../common/injects/teams/utils'; -import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; -import { fetchExerciseTeams } from '../../../../../actions/Exercise'; -import type { TeamStore } from '../../../../../actions/teams/Team'; interface Props { exerciseId: ExerciseStore['exercise_id']; diff --git a/openbas-front/src/admin/components/simulations/simulation/mails/Mails.js b/openbas-front/src/admin/components/simulations/simulation/mails/Mails.js index 3341feaa73..b77ed5585d 100644 --- a/openbas-front/src/admin/components/simulations/simulation/mails/Mails.js +++ b/openbas-front/src/admin/components/simulations/simulation/mails/Mails.js @@ -1,25 +1,26 @@ -import { useState } from 'react'; -import { makeStyles } from '@mui/styles'; +import { BarChartOutlined, KeyboardArrowRight, ReorderOutlined } from '@mui/icons-material'; import { Chip, Grid, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, ToggleButton, ToggleButtonGroup, Tooltip, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { useState } from 'react'; import { useDispatch } from 'react-redux'; import { Link, useParams } from 'react-router-dom'; -import { BarChartOutlined, KeyboardArrowRight, ReorderOutlined } from '@mui/icons-material'; + +import { fetchExerciseInjects } from '../../../../../actions/Inject'; +import { useFormatter } from '../../../../../components/i18n'; import ItemTags from '../../../../../components/ItemTags'; import SearchFilter from '../../../../../components/SearchFilter'; +import { useHelper } from '../../../../../store'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import useSearchAnFilter from '../../../../../utils/SortingFiltering'; import TagsFilter from '../../../common/filters/TagsFilter'; -import { fetchExerciseInjects } from '../../../../../actions/Inject'; import InjectIcon from '../../../common/injects/InjectIcon'; -import useSearchAnFilter from '../../../../../utils/SortingFiltering'; -import { useFormatter } from '../../../../../components/i18n'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../../../store'; import AnimationMenu from '../AnimationMenu'; import CreateQuickInject from '../injects/CreateQuickInject'; +import MailDistributionByInject from './MailDistributionByInject'; +import MailDistributionByPlayer from './MailDistributionByPlayer'; +import MailDistributionByTeam from './MailDistributionByTeam'; import MailDistributionOverTimeChart from './MailDistributionOverTimeChart'; import MailDistributionOverTimeLine from './MailDistributionOverTimeLine'; -import MailDistributionByTeam from './MailDistributionByTeam'; -import MailDistributionByPlayer from './MailDistributionByPlayer'; -import MailDistributionByInject from './MailDistributionByInject'; const useStyles = makeStyles(() => ({ itemHead: { @@ -198,7 +199,7 @@ const Mails = () => { }); const sortedInjects = filtering .filterAndSort(injects) - .filter((i) => i.inject_communications_number > 0); + .filter(i => i.inject_communications_number > 0); // Rendering return (
    @@ -211,7 +212,7 @@ const Mails = () => { > setViewMode('list')} selected={viewMode === 'list'} aria-label="List view mode" @@ -221,7 +222,7 @@ const Mails = () => { setViewMode('distribution')} selected={viewMode === 'distribution'} aria-label="Distribution view mode" @@ -231,199 +232,199 @@ const Mails = () => { {viewMode === 'distribution' && ( - <> - - - - {t('Sent mails over time')} - - - - - - - - {t('Sent mails over time')} - - - - - - - - {t('Distribution of mails by team')} - - - - - - - - {t('Distribution of mails by player')} - - - - - - - - {t('Distribution of mails by inject')} - - - - + <> + + + + {t('Sent mails over time')} + + + + + + + + {t('Sent mails over time')} + + + + + + + + {t('Distribution of mails by team')} + + + + + + + + {t('Distribution of mails by player')} + + + + + + + + {t('Distribution of mails by inject')} + + + + + - - + )} {viewMode === 'list' && ( - <> -
    - -
    -
    - -
    -
    - - - - -   - - - - {filtering.buildHeader( - 'inject_title', - 'Title', - false, - headerStyles, - )} - {filtering.buildHeader( - 'inject_users_number', - 'Players', - true, - headerStyles, - )} - {filtering.buildHeader( - 'inject_sent_at', - 'Sent at', - true, - headerStyles, - )} - {filtering.buildHeader( - 'inject_communications_not_ack_number', - 'Mails not read', - true, - headerStyles, - )} - {filtering.buildHeader( - 'inject_communications_number', - 'Total mails', - true, - headerStyles, - )} - {filtering.buildHeader( - 'inject_tags', - 'Tags', - true, - headerStyles, - )} -
    - } + <> +
    + -   - - {sortedInjects.map((inject) => { - return ( - - - - - -
    - {inject.inject_title} -
    -
    - {inject.inject_users_number} -
    -
    - {fndt(inject.inject_sent_at)} -
    -
    - -
    -
    - -
    -
    - +
    +
    + +
    +
    + + + + +   + + + + {filtering.buildHeader( + 'inject_title', + 'Title', + false, + headerStyles, + )} + {filtering.buildHeader( + 'inject_users_number', + 'Players', + true, + headerStyles, + )} + {filtering.buildHeader( + 'inject_sent_at', + 'Sent at', + true, + headerStyles, + )} + {filtering.buildHeader( + 'inject_communications_not_ack_number', + 'Mails not read', + true, + headerStyles, + )} + {filtering.buildHeader( + 'inject_communications_number', + 'Total mails', + true, + headerStyles, + )} + {filtering.buildHeader( + 'inject_tags', + 'Tags', + true, + headerStyles, + )} +
    + )} + /> +   +
    + {sortedInjects.map((inject) => { + return ( + + + + + +
    + {inject.inject_title} +
    +
    + {inject.inject_users_number} +
    +
    + {fndt(inject.inject_sent_at)} +
    +
    + +
    +
    + +
    +
    + +
    -
    - } - /> - - - - - ); - })} - - - + )} + /> + + + + + ); + })} + + + )}
    ); diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/DistributionUtils.ts b/openbas-front/src/admin/components/simulations/simulation/overview/DistributionUtils.ts index bd32df4223..85a824a90a 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/DistributionUtils.ts +++ b/openbas-front/src/admin/components/simulations/simulation/overview/DistributionUtils.ts @@ -1,8 +1,9 @@ import * as R from 'ramda'; + import type { TeamStore } from '../../../../../actions/teams/Team'; -import { colors } from '../../../../../utils/Charts'; import type { Theme } from '../../../../../components/Theme'; import type { Organization } from '../../../../../utils/api-types'; +import { colors } from '../../../../../utils/Charts'; const mapIndexed = R.addIndex(R.map); export const computeTeamsColors = (teams: TeamStore[], theme: Theme) => R.pipe( diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/Exercise.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/Exercise.tsx index 3c32c7629f..e15ab0df28 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/Exercise.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/Exercise.tsx @@ -1,25 +1,26 @@ -import { useEffect, useState } from 'react'; -import { useParams } from 'react-router-dom'; import { Grid, Paper, Typography } from '@mui/material'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router-dom'; + import type { ExerciseStore, InjectExpectationResultsByAttackPatternStore } from '../../../../../actions/exercises/Exercise'; -import ExerciseDistribution from './ExerciseDistribution'; -import ResponsePie from '../../../common/injects/ResponsePie'; -import ExerciseMainInformation from '../ExerciseMainInformation'; import { fetchExerciseExpectationResult, fetchExerciseInjectExpectationResults, searchExerciseInjects } from '../../../../../actions/exercises/exercise-action'; -import type { ExpectationResultsByType } from '../../../../../utils/api-types'; -import MitreMatrix from '../../../common/matrix/MitreMatrix'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; import { fetchExerciseInjects } from '../../../../../actions/Inject'; +import { initSorting } from '../../../../../components/common/queryable/Page'; +import { buildSearchPagination } from '../../../../../components/common/queryable/QueryableUtils'; +import { useQueryableWithLocalStorage } from '../../../../../components/common/queryable/useQueryableWithLocalStorage'; import { useFormatter } from '../../../../../components/i18n'; import { useHelper } from '../../../../../store'; -import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; +import type { ExpectationResultsByType } from '../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import InjectDtoList from '../../../atomic_testings/InjectDtoList'; -import { useQueryableWithLocalStorage } from '../../../../../components/common/queryable/useQueryableWithLocalStorage'; -import { buildSearchPagination } from '../../../../../components/common/queryable/QueryableUtils'; -import { initSorting } from '../../../../../components/common/queryable/Page'; +import ResponsePie from '../../../common/injects/ResponsePie'; +import MitreMatrix from '../../../common/matrix/MitreMatrix'; +import ExerciseMainInformation from '../ExerciseMainInformation'; +import ExerciseDistribution from './ExerciseDistribution'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. @@ -60,8 +61,8 @@ const Exercise = () => { if (injectResults) { resultAttackPatternIds = R.uniq( injectResults - .filter((injectResult) => !!injectResult.inject_attack_pattern) - .flatMap((injectResult) => injectResult.inject_attack_pattern) as unknown as string[], + .filter(injectResult => !!injectResult.inject_attack_pattern) + .flatMap(injectResult => injectResult.inject_attack_pattern) as unknown as string[], ); } @@ -106,8 +107,8 @@ const Exercise = () => { searchExerciseInjects(exerciseId, input)} - goTo={(injectId) => `/admin/exercises/${exerciseId}/injects/${injectId}`} + fetchInjects={input => searchExerciseInjects(exerciseId, input)} + goTo={injectId => `/admin/exercises/${exerciseId}/injects/${injectId}`} queryableHelpers={queryableHelpers} searchPaginationInput={searchPaginationInput} /> diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistribution.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistribution.tsx index c617fa3d05..04622b5a12 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistribution.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistribution.tsx @@ -1,28 +1,29 @@ import { Grid, Paper, Typography } from '@mui/material'; -import { FunctionComponent, useState } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; -import { useFormatter } from '../../../../../components/i18n'; +import { FunctionComponent, useState } from 'react'; + +import { fetchExercise, fetchExerciseInjectExpectations, fetchExerciseTeams } from '../../../../../actions/Exercise'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; +import { fetchExerciseInjects } from '../../../../../actions/Inject'; +import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; +import { useFormatter } from '../../../../../components/i18n'; +import Loader from '../../../../../components/Loader'; +import type { Theme } from '../../../../../components/Theme'; +import arrowDark from '../../../../../static/images/misc/arrow_dark.png'; +import arrowLight from '../../../../../static/images/misc/arrow_light.png'; +import { useHelper } from '../../../../../store'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import ExerciseDistributionByInjectorContract from './ExerciseDistributionByInjectorContract'; import ExerciseDistributionScoreByInject from './ExerciseDistributionScoreByInject'; -import ExerciseDistributionScoreByPlayer from './ExerciseDistributionScoreByPlayer'; import ExerciseDistributionScoreByOrganization from './ExerciseDistributionScoreByOrganization'; -import ExerciseDistributionScoreOverTimeByInjectorContract from './ExerciseDistributionScoreOverTimeByInjectorContract'; -import ExerciseDistributionByInjectorContract from './ExerciseDistributionByInjectorContract'; -import ExerciseDistributionScoreOverTimeByTeam from './ExerciseDistributionScoreOverTimeByTeam'; +import ExerciseDistributionScoreByPlayer from './ExerciseDistributionScoreByPlayer'; import ExerciseDistributionScoreByTeam from './ExerciseDistributionScoreByTeam'; import ExerciseDistributionScoreByTeamInPercentage from './ExerciseDistributionScoreByTeamInPercentage'; +import ExerciseDistributionScoreOverTimeByInjectorContract from './ExerciseDistributionScoreOverTimeByInjectorContract'; +import ExerciseDistributionScoreOverTimeByTeam from './ExerciseDistributionScoreOverTimeByTeam'; import ExerciseDistributionScoreOverTimeByTeamInPercentage from './ExerciseDistributionScoreOverTimeByTeamInPercentage'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { fetchExercise, fetchExerciseInjectExpectations, fetchExerciseTeams } from '../../../../../actions/Exercise'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import { fetchExerciseInjects } from '../../../../../actions/Inject'; -import { useHelper } from '../../../../../store'; -import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; -import arrowDark from '../../../../../static/images/misc/arrow_dark.png'; -import arrowLight from '../../../../../static/images/misc/arrow_light.png'; -import type { Theme } from '../../../../../components/Theme'; -import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; -import Loader from '../../../../../components/Loader'; const useStyles = makeStyles(() => ({ paperChart: { @@ -35,7 +36,7 @@ const useStyles = makeStyles(() => ({ interface Props { exerciseId: ExerciseStore['exercise_id']; - isReport?: boolean, + isReport?: boolean; } const ExerciseDistribution: FunctionComponent = ({ @@ -86,7 +87,7 @@ const ExerciseDistribution: FunctionComponent = ({ return
    ; } return ( - + {t('Distribution of score by team (in % of expectations)')} diff --git a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionByInjectorContract.tsx b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionByInjectorContract.tsx index 9439862a37..d3d54972eb 100644 --- a/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionByInjectorContract.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/overview/ExerciseDistributionByInjectorContract.tsx @@ -1,15 +1,16 @@ -import Chart from 'react-apexcharts'; -import { FunctionComponent } from 'react'; import { useTheme } from '@mui/styles'; import * as R from 'ramda'; +import { FunctionComponent } from 'react'; +import Chart from 'react-apexcharts'; + +import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import type { InjectExpectationStore, InjectStore } from '../../../../../actions/injects/Inject'; +import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; import Empty from '../../../../../components/Empty'; -import { horizontalBarsChartOptions } from '../../../../../utils/Charts'; import { useFormatter } from '../../../../../components/i18n'; import type { Theme } from '../../../../../components/Theme'; import { useHelper } from '../../../../../store'; -import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; -import type { InjectExpectationStore, InjectStore } from '../../../../../actions/injects/Inject'; -import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; +import { horizontalBarsChartOptions } from '../../../../../utils/Charts'; interface Props { exerciseId: ExerciseStore['exercise_id']; @@ -48,7 +49,7 @@ const ExerciseDistributionByInjectorContract: FunctionComponent = ({ const totalScoreByInjectorContractData = [ { name: t('Total score'), - data: sortedInjectorContractsByTotalScore.map((i: InjectStore & { inject_total_score: number, }) => ({ + data: sortedInjectorContractsByTotalScore.map((i: InjectStore & { inject_total_score: number }) => ({ x: tPick(i.inject_injector_contract?.injector_contract_labels), y: i.inject_total_score, fillColor: i.inject_injector_contract?.injector_contract_content_parsed?.config?.color, @@ -60,7 +61,7 @@ const ExerciseDistributionByInjectorContract: FunctionComponent = ({ <> {sortedInjectorContractsByTotalScore.length > 0 ? ( = ({ <> {injectsTotalScores.length > 0 ? ( = ({ <> {organizationsTotalScores.length > 0 ? ( = ({ <> {usersTotalScores.length > 0 ? ( = ({ <> {teamsTotalScores.length > 0 ? ( = ({ <> {teamsTotalScores.length > 0 ? ( ({ + const { injectsMap, injectExpectations }: { injectsMap: InjectStore[]; injectExpectations: InjectExpectationStore[] } = useHelper((helper: InjectHelper) => ({ injectsMap: helper.getInjectsMap(), injectExpectations: helper.getExerciseInjectExpectations(exerciseId), })); @@ -52,7 +53,7 @@ const ExerciseDistributionScoreOverTimeByInjectorContract: FunctionComponent]) => ({ + R.map((n: [string, Array]) => ({ name: tPick(n[1][0].inject_expectation_inject.inject_injector_contract?.injector_contract_labels), color: n[1][0].inject_injector_contract?.injector_contract_content_parsed?.config?.color, data: n[1].map((i: InjectExpectation & { inject_expectation_cumulated_score: number }) => ({ @@ -66,7 +67,7 @@ const ExerciseDistributionScoreOverTimeByInjectorContract: FunctionComponent {injectsTypesScores.length > 0 ? ( = ({ <> {teamsScores.length > 0 ? ( ]) => ({ name: teamsMap[n[0]]?.team_name, color: teamsColors[n[0]], - data: n[1].map((i) => ({ + data: n[1].map(i => ({ x: i.inject_expectation_updated_at, y: i.inject_expectation_percent_score, })), @@ -85,7 +86,7 @@ const ExerciseDistributionScoreOverTimeByTeamInPercentage: FunctionComponent {teamsTotalScores.length > 0 ? ( ; handleCancel: () => void; editing?: boolean; - initialValues?: Report, + initialValues?: Report; } const ExerciseReportForm: React.FC = ({ onSubmit, @@ -74,7 +73,7 @@ const ExerciseReportForm: React.FC = ({ const { t } = useFormatter(); const findReportInfo = (type: string) => { - return initialValues?.report_informations?.find((info) => info.report_informations_type === type)?.report_informations_display ?? true; + return initialValues?.report_informations?.find(info => info.report_informations_type === type)?.report_informations_display ?? true; }; const initialModulesValues: Record = {}; @@ -136,12 +135,12 @@ const ExerciseReportForm: React.FC = ({ return ( - } + )} label={t(moduleConfig.label)} /> ); diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportPage.tsx b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportPage.tsx index 629ae56a92..8c22a7ac7e 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportPage.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReportPage.tsx @@ -1,41 +1,39 @@ +import { Alert, Button, Paper, ToggleButtonGroup, Typography } from '@mui/material'; import { useEffect, useState } from 'react'; import * as React from 'react'; import { Link, useParams } from 'react-router-dom'; -import { Alert, Button, Paper, ToggleButtonGroup, Typography } from '@mui/material'; - import { updateReportForExercise, updateReportInjectCommentForExercise } from '../../../../../actions/reports/report-actions'; +import ExportPdfButton from '../../../../../components/ExportPdfButton'; +import { useFormatter } from '../../../../../components/i18n'; +import Loader from '../../../../../components/Loader'; import type { Exercise, LessonsQuestion, Report, ReportInput } from '../../../../../utils/api-types'; +import { usePermissions } from '../../../../../utils/Exercise'; import { useAppDispatch } from '../../../../../utils/hooks'; -import Loader from '../../../../../components/Loader'; -import { useFormatter } from '../../../../../components/i18n'; - +import { ReportContext, ReportContextType } from '../../../common/Context'; +import ResponsePie from '../../../common/injects/ResponsePie'; +import ReportComment from '../../../components/reports/ReportComment'; import ReportPopover from '../../../components/reports/ReportPopover'; -import { ReportContextType, ReportContext } from '../../../common/Context'; +import AnswersByQuestionDialog from '../../../lessons/exercises/AnswersByQuestionDialog'; +import LessonsCategories from '../../../lessons/exercises/LessonsCategories'; +import ExerciseMainInformation from '../ExerciseMainInformation'; +import ExerciseDistribution from '../overview/ExerciseDistribution'; import ExerciseReportForm from './ExerciseReportForm'; -import { usePermissions } from '../../../../../utils/Exercise'; -import ExportPdfButton from '../../../../../components/ExportPdfButton'; -import useExerciseReportData from './useExerciseReportData'; import getExerciseReportPdfDocDefinition from './getExerciseReportPdfDoc'; -import ReportInformationType from './ReportInformationType'; -import ExerciseMainInformation from '../ExerciseMainInformation'; -import ResponsePie from '../../../common/injects/ResponsePie'; import InjectReportResult from './InjectReportResult'; -import LessonsCategories from '../../../lessons/exercises/LessonsCategories'; -import ExerciseDistribution from '../overview/ExerciseDistribution'; -import AnswersByQuestionDialog from '../../../lessons/exercises/AnswersByQuestionDialog'; -import ReportComment from '../../../components/reports/ReportComment'; +import ReportInformationType from './ReportInformationType'; +import useExerciseReportData from './useExerciseReportData'; const ExerciseReportPage: React.FC = () => { // Standard hooks const dispatch = useAppDispatch(); const { t, tPick, fldt } = useFormatter(); - const { exerciseId, reportId } = useParams() as { exerciseId: Exercise['exercise_id'], reportId: Report['report_id'] }; + const { exerciseId, reportId } = useParams() as { exerciseId: Exercise['exercise_id']; reportId: Report['report_id'] }; const { loading, report, displayModule, setReloadReportDataCount, reportData } = useExerciseReportData(reportId, exerciseId); const [selectedQuestion, setSelectedQuestion] = useState(null); const selectedQuestionAnswers = selectedQuestion && selectedQuestion.lessonsquestion_id - ? reportData.lessonsAnswers.filter((answer) => answer.lessons_answer_question === selectedQuestion.lessonsquestion_id) + ? reportData.lessonsAnswers.filter(answer => answer.lessons_answer_question === selectedQuestion.lessonsquestion_id) : []; const permissions = usePermissions(exerciseId); @@ -47,7 +45,7 @@ const ExerciseReportPage: React.FC = () => { // Context const context: ReportContextType = { onUpdateReport: (_reportId: Report['report_id'], data: ReportInput) => dispatch(updateReportForExercise(exerciseId, reportId, data)) - .then(() => setReloadReportDataCount((prev:number) => prev + 1)), + .then(() => setReloadReportDataCount((prev: number) => prev + 1)), renderReportForm: (onSubmitForm, onHandleCancel, _report) => { return ( { )); if (loading) { - return ; + return ; } if (!report) { return {t('This report is not available')}; @@ -89,48 +87,51 @@ const ExerciseReportPage: React.FC = () => { - getExerciseReportPdfDocDefinition({ report, reportData, displayModule, tPick, fldt, t })}/> - {permissions.canWrite && } + getExerciseReportPdfDocDefinition({ report, reportData, displayModule, tPick, fldt, t })} /> + {permissions.canWrite && }
    -
    {report.report_name}
    {displayModule(ReportInformationType.MAIN_INFORMATION) - &&
    + && ( +
    {t('General information')} - -
    - } + +
    + )} {displayModule(ReportInformationType.SCORE_DETAILS) - &&
    + && ( +
    {t('Results')} - + -
    - } +
    + )} {displayModule(ReportInformationType.INJECT_RESULT) - && ( - dispatch(updateReportInjectCommentForExercise(exerciseId, report.report_id, value))} - /> - ) - } + && ( + dispatch(updateReportInjectCommentForExercise(exerciseId, report.report_id, value))} + /> + )} {displayModule(ReportInformationType.GLOBAL_OBSERVATION) - && (
    + && ( +
    {t('Global observation')} @@ -138,11 +139,11 @@ const ExerciseReportPage: React.FC = () => { -
    ) - - } +
    + )} {displayModule(ReportInformationType.PLAYER_SURVEYS) - && { teams={reportData.teams} setSelectedQuestion={setSelectedQuestion} isReport - /> - } + /> + )} {displayModule(ReportInformationType.EXERCISE_DETAILS) - && - } + && } setSelectedQuestion(null)} diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReports.tsx b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReports.tsx index 6442972585..ae7e800661 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReports.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/reports/ExerciseReports.tsx @@ -1,23 +1,24 @@ +import { Add } from '@mui/icons-material'; +import { Fab } from '@mui/material'; import { useContext, useState } from 'react'; import * as React from 'react'; import { useNavigate } from 'react-router-dom'; -import { Fab } from '@mui/material'; -import { Add } from '@mui/icons-material'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../../../store'; -import { useAppDispatch } from '../../../../../utils/hooks'; + import { addReportForExercise, deleteReportForExercise, fetchReportsForExercise, updateReportForExercise } from '../../../../../actions/reports/report-actions'; import type { ReportsHelper } from '../../../../../actions/reports/report-helper'; -import Reports from '../../../components/reports/Reports'; -import { PermissionsContext, ReportContextType, ReportContext } from '../../../common/Context'; -import type { Report, ReportInput } from '../../../../../utils/api-types'; -import ExerciseReportForm from './ExerciseReportForm'; import Dialog from '../../../../../components/common/Dialog'; import { useFormatter } from '../../../../../components/i18n'; +import { useHelper } from '../../../../../store'; +import type { Report, ReportInput } from '../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { PermissionsContext, ReportContext, ReportContextType } from '../../../common/Context'; +import Reports from '../../../components/reports/Reports'; +import ExerciseReportForm from './ExerciseReportForm'; interface ReportListProps { - exerciseId: string, - exerciseName: string, + exerciseId: string; + exerciseName: string; } const ExerciseReports: React.FC = ({ exerciseId, exerciseName }) => { @@ -26,7 +27,7 @@ const ExerciseReports: React.FC = ({ exerciseId, exerciseName } const dispatch = useAppDispatch(); const navigate = useNavigate(); - const navigateToReportPage = (reportId:string) => navigate(`/reports/${reportId}/exercise/${exerciseId}`); + const navigateToReportPage = (reportId: string) => navigate(`/reports/${reportId}/exercise/${exerciseId}`); const [openCreate, setOpenCreate] = useState(false); const handleOpenCreate = () => setOpenCreate(true); @@ -58,7 +59,7 @@ const ExerciseReports: React.FC = ({ exerciseId, exerciseName } return ( - + {permissions.canWrite && ( <> = ({ }) => { // Standard hooks const { t, fldt, tPick } = useFormatter(); - const findInjectCommentsByInjectId = (injectId: InjectResultDTO['inject_id']) => (injectsComments ?? []).find((c) => c.inject_id === injectId) ?? null; + const findInjectCommentsByInjectId = (injectId: InjectResultDTO['inject_id']) => (injectsComments ?? []).find(c => c.inject_id === injectId) ?? null; const saveComment = (injectId: ReportInjectComment['inject_id'], value: string) => { onCommentSubmit({ inject_id: injectId, report_inject_comment: value }); @@ -62,11 +62,13 @@ const InjectReportResult: React.FC = ({ label: 'Comments', render: (inject: InjectResultDTO) => { const currentInjectComment = findInjectCommentsByInjectId(inject.inject_id); - return saveComment(inject.inject_id, value)} - />; + return ( + saveComment(inject.inject_id, value)} + /> + ); }, }, ]; @@ -82,26 +84,32 @@ const InjectReportResult: React.FC = ({
    - {columns.map((col) => ( + {columns.map(col => ( {t(col.label)} ))} + > + {' '} + {t(col.label)} + {' '} + + + ))} - {injects.map((inject) => ( + {injects.map(inject => ( - {columns.map((col) => ( + {columns.map(col => ( {col.render(inject)} - )) - } + + ))} ))} diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/getExerciseReportPdfDoc.ts b/openbas-front/src/admin/components/simulations/simulation/reports/getExerciseReportPdfDoc.ts index 775bf13db5..d707fc4405 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/getExerciseReportPdfDoc.ts +++ b/openbas-front/src/admin/components/simulations/simulation/reports/getExerciseReportPdfDoc.ts @@ -1,11 +1,12 @@ import { toPng } from 'html-to-image'; import type { Content, ContentTable, TDocumentDefinitions } from 'pdfmake/interfaces'; + +import LogoText from '../../../../../static/images/logo_text_light.png'; import type { InjectResultDTO, LessonsAnswer, Report } from '../../../../../utils/api-types'; +import { resolveUserName } from '../../../../../utils/String'; import convertMarkdownToPdfMake from './convertMarkdownToPdfMake'; -import { ExerciseReportData } from './useExerciseReportData'; import ReportInformationType from './ReportInformationType'; -import { resolveUserName } from '../../../../../utils/String'; -import LogoText from '../../../../../static/images/logo_text_light.png'; +import { ExerciseReportData } from './useExerciseReportData'; const getBase64ImageFromURL = (url: string) => { return new Promise((resolve, reject) => { @@ -33,9 +34,9 @@ const getBase64ImageFromURL = (url: string) => { }); }; -const tableCustomLayout = (displayColumnLine:boolean, paddingTop:number) => ({ +const tableCustomLayout = (displayColumnLine: boolean, paddingTop: number) => ({ hLineWidth: () => 0.5, - vLineWidth: (i:number, node: ContentTable) => { + vLineWidth: (i: number, node: ContentTable) => { if (displayColumnLine || (i === 0 || i === node.table.body[0].length)) { return 0.5; } @@ -57,12 +58,12 @@ const imageBorder = { }; interface Props { - report: Report, - reportData: ExerciseReportData, - displayModule: (moduleType: ReportInformationType)=>boolean, + report: Report; + reportData: ExerciseReportData; + displayModule: (moduleType: ReportInformationType) => boolean; tPick: (input: Record | undefined) => string; - fldt: (input: string | undefined)=> string; - t: (input: string | undefined)=> string; + fldt: (input: string | undefined) => string; + t: (input: string | undefined) => string; } const getExerciseReportPdfDocDefinition = async ({ @@ -88,7 +89,7 @@ const getExerciseReportPdfDocDefinition = async ({ 'exercise_distribution_total_score_by_player', 'exercise_distribution_total_score_by_inject', ]; - const fetchPromises = [getBase64ImageFromURL(LogoText).then((img) => ({ + const fetchPromises = [getBase64ImageFromURL(LogoText).then(img => ({ key: 'openBAS_logo', img, }))]; @@ -108,7 +109,7 @@ const getExerciseReportPdfDocDefinition = async ({ }); // Inject Result page - const findCommentsByInjectId = (injectId: InjectResultDTO['inject_id']) => (report?.report_injects_comments ?? []).find((c) => c.inject_id === injectId)?.report_inject_comment ?? null; + const findCommentsByInjectId = (injectId: InjectResultDTO['inject_id']) => (report?.report_injects_comments ?? []).find(c => c.inject_id === injectId)?.report_inject_comment ?? null; const injectResultPage = (imagesMap: Map) => ([ { text: t('Injects results'), tocItem: ['mainToc'], pageBreak: 'before', style: 'header' }, { @@ -116,7 +117,7 @@ const getExerciseReportPdfDocDefinition = async ({ table: { widths: ['auto', 'auto', 'auto', 'auto', 'auto', 190], body: [ - [t('Type'), t('Title'), t('Execution date'), t('Scores'), t('Targets'), t('Comments')].map((title) => ({ + [t('Type'), t('Title'), t('Execution date'), t('Scores'), t('Targets'), t('Comments')].map(title => ({ text: title, style: 'tableTitle', })), @@ -126,7 +127,7 @@ const getExerciseReportPdfDocDefinition = async ({ { text: inject.inject_title }, { text: fldt(inject.inject_status?.tracking_sent_date) || 'N/A' }, { image: imagesMap.get(`inject_${inject.inject_id}`), width: 60 }, - { text: inject.inject_targets.map((target) => target.name).join(', ') }, + { text: inject.inject_targets.map(target => target.name).join(', ') }, { stack: convertMarkdownToPdfMake(findCommentsByInjectId(inject.inject_id) || '') }, ]; }), @@ -155,9 +156,9 @@ const getExerciseReportPdfDocDefinition = async ({ return [ { text: t('Exercise details'), tocItem: ['mainToc'], pageBreak: 'before', style: 'header' }, - ...doubleColumns.flatMap((columns) => ( + ...doubleColumns.flatMap(columns => ( { - columns: columns.flatMap((col) => ( + columns: columns.flatMap(col => ( { width: '*', stack: [ @@ -202,17 +203,17 @@ const getExerciseReportPdfDocDefinition = async ({ // Players Surveys page const playersSurveysPage = () => [ { text: t('Player surveys'), tocItem: ['mainToc'], pageBreak: 'before', style: 'header' }, - ...reportData.lessonsCategories.sort((lesson) => lesson.lessons_category_order || 0).map((category) => { + ...reportData.lessonsCategories.sort(lesson => lesson.lessons_category_order || 0).map((category) => { const lessonQuestions = reportData.lessonsQuestions - .filter((q) => (category.lessons_category_questions || []).includes(q.lessonsquestion_id)) + .filter(q => (category.lessons_category_questions || []).includes(q.lessonsquestion_id)) .sort((a, b) => (a.lessons_question_order || 0) - (b.lessons_question_order || 0)); return ([ { text: [t('Category'), ` : ${category.lessons_category_name}`], style: 'markdownHeaderH1' }, - { text: [t('Targeted teams'), ` : ${(category.lessons_category_teams || []).map((teamId) => reportData.teams.find((team) => team.team_id === teamId)?.team_name).join(', ') || '-'}`] }, + { text: [t('Targeted teams'), ` : ${(category.lessons_category_teams || []).map(teamId => reportData.teams.find(team => team.team_id === teamId)?.team_name).join(', ') || '-'}`] }, ...lessonQuestions.flatMap((question) => { const lessonsAnswers = (question.lessons_question_answers || []) - .map((answerId) => reportData.lessonsAnswers.find((answer) => answer.lessonsanswer_id === answerId)); + .map(answerId => reportData.lessonsAnswers.find(answer => answer.lessonsanswer_id === answerId)); const totalScore = (lessonsAnswers || []).reduce((sum, answer) => sum + (answer?.lessons_answer_score || 0), 0); const getUserName = (answer: LessonsAnswer): string => { if (reportData.exercise.exercise_lessons_anonymized) return t('Anonymized'); @@ -224,24 +225,25 @@ const getExerciseReportPdfDocDefinition = async ({ { text: [t('Total score'), ` : ${totalScore}`] }, (lessonsAnswers.length > 0 ? { - table: { - widths: ['auto', 'auto', '*', '*'], - margin: [0, 2, 0, 0], - body: [ - [t('User'), t('Score'), t('What worked well'), t('What didn\'t work well')].map((title) => ({ - text: title, - style: 'tableTitle', - })), - ...(lessonsAnswers || []).map((answer) => ([ - answer && getUserName(answer), - answer?.lessons_answer_score, - answer?.lessons_answer_positive, - answer?.lessons_answer_negative, - ])), - ], - }, - layout: tableCustomLayout(true, 6), - } : { text: t('Answers : N/A') }), + table: { + widths: ['auto', 'auto', '*', '*'], + margin: [0, 2, 0, 0], + body: [ + [t('User'), t('Score'), t('What worked well'), t('What didn\'t work well')].map(title => ({ + text: title, + style: 'tableTitle', + })), + ...(lessonsAnswers || []).map(answer => ([ + answer && getUserName(answer), + answer?.lessons_answer_score, + answer?.lessons_answer_positive, + answer?.lessons_answer_negative, + ])), + ], + }, + layout: tableCustomLayout(true, 6), + } + : { text: t('Answers : N/A') }), ]; }), '\n', @@ -280,46 +282,52 @@ const getExerciseReportPdfDocDefinition = async ({ reportData.exercise.exercise_start_date ? { text: fldt(reportData.exercise.exercise_start_date), margin: [0, 10, 0, 0] } : {}, reportData.exercise.exercise_teams?.length && reportData.exercise.exercise_teams?.length > 0 ? { - text: [{ text: t('Teams') }, { text: ` : ${reportData.exercise.exercise_teams?.map((teamId_1) => reportData.teams.find((team_1) => team_1.team_id === teamId_1)?.team_name).join(', ')}` }], - margin: [0, 0, 0, 150], - } : {}, + text: [{ text: t('Teams') }, { text: ` : ${reportData.exercise.exercise_teams?.map(teamId_1 => reportData.teams.find(team_1 => team_1.team_id === teamId_1)?.team_name).join(', ')}` }], + margin: [0, 0, 0, 150], + } + : {}, '\n', imagesMap.has('score_details') ? { - table: { - body: [ - [ - { - image: imagesMap.get('score_details'), - width: 530, - }, + table: { + body: [ + [ + { + image: imagesMap.get('score_details'), + width: 530, + }, + ], ], - ], - }, - layout: imageBorder, - } : {}, + }, + layout: imageBorder, + } + : {}, '\n', - imagesMap.has('main_information') ? { - table: { - body: [ - [ - { - image: imagesMap.get('main_information'), - width: 530, - }, - ], - ], - }, - layout: imageBorder, - } : {}, + imagesMap.has('main_information') + ? { + table: { + body: [ + [ + { + image: imagesMap.get('main_information'), + width: 530, + }, + ], + ], + }, + layout: imageBorder, + } + : {}, // Table of Contents Page - ...((displayInjectResultPage || displayGlobalObservation || displayPlayerSurveys || displayExerciseDetails) ? [{ - toc: { - id: 'mainToc', - title: { text: t('Table of contents'), style: 'header', margin: [0, 0, 0, 20] }, - }, - pageBreak: 'before', - }] : []), + ...((displayInjectResultPage || displayGlobalObservation || displayPlayerSurveys || displayExerciseDetails) + ? [{ + toc: { + id: 'mainToc', + title: { text: t('Table of contents'), style: 'header', margin: [0, 0, 0, 20] }, + }, + pageBreak: 'before', + }] + : []), // Inject Results Page displayInjectResultPage ? injectResultPage(imagesMap) : {}, @@ -327,9 +335,9 @@ const getExerciseReportPdfDocDefinition = async ({ // Global Information Page ...(displayGlobalObservation ? [ - { text: t('Global observation'), tocItem: ['mainToc'], pageBreak: 'before', style: 'header' }, - { stack: convertMarkdownToPdfMake(report.report_global_observation || ' -') }, - ] + { text: t('Global observation'), tocItem: ['mainToc'], pageBreak: 'before', style: 'header' }, + { stack: convertMarkdownToPdfMake(report.report_global_observation || ' -') }, + ] : []), // Player surveys page diff --git a/openbas-front/src/admin/components/simulations/simulation/reports/useExerciseReportData.ts b/openbas-front/src/admin/components/simulations/simulation/reports/useExerciseReportData.ts index 7e2446b4e6..63342775bc 100644 --- a/openbas-front/src/admin/components/simulations/simulation/reports/useExerciseReportData.ts +++ b/openbas-front/src/admin/components/simulations/simulation/reports/useExerciseReportData.ts @@ -1,22 +1,21 @@ import { Dispatch, SetStateAction, useEffect, useState } from 'react'; -import { useHelper } from '../../../../../store'; -import type { ReportsHelper } from '../../../../../actions/reports/report-helper'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { fetchReport } from '../../../../../actions/reports/report-actions'; -import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; -import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; -import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; -import ReportInformationType from './ReportInformationType'; + import { fetchExercise, fetchExerciseTeams } from '../../../../../actions/Exercise'; import { - fetchPlayersByExercise, exerciseInjectsResultDTO, fetchExerciseExpectationResult, fetchLessonsAnswers, fetchLessonsCategories, fetchLessonsQuestions, + fetchPlayersByExercise, } from '../../../../../actions/exercises/exercise-action'; -import { useAppDispatch } from '../../../../../utils/hooks'; +import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; +import type { UserHelper } from '../../../../../actions/helper'; +import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; +import { fetchReport } from '../../../../../actions/reports/report-actions'; +import type { ReportsHelper } from '../../../../../actions/reports/report-helper'; +import type { TeamsHelper } from '../../../../../actions/teams/team-helper'; +import { useHelper } from '../../../../../store'; import type { Exercise, ExpectationResultsByType, @@ -29,26 +28,28 @@ import type { Team, User, } from '../../../../../utils/api-types'; -import type { UserHelper } from '../../../../../actions/helper'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import ReportInformationType from './ReportInformationType'; export interface ExerciseReportData { - injects: InjectResultDTO[], - exerciseExpectationResults: ExpectationResultsByType[], - exercise: Exercise, - lessonsCategories: LessonsCategory[], - lessonsQuestions: LessonsQuestion[], - lessonsAnswers: LessonsAnswer[], - teams: Team[], - teamsMap: Record, - usersMap: Record, + injects: InjectResultDTO[]; + exerciseExpectationResults: ExpectationResultsByType[]; + exercise: Exercise; + lessonsCategories: LessonsCategory[]; + lessonsQuestions: LessonsQuestion[]; + lessonsAnswers: LessonsAnswer[]; + teams: Team[]; + teamsMap: Record; + usersMap: Record; } interface ReturnType { - loading: boolean, - report: Report, - displayModule: (moduleType: ReportInformationType)=>boolean, - setReloadReportDataCount: Dispatch> - reportData: ExerciseReportData + loading: boolean; + report: Report; + displayModule: (moduleType: ReportInformationType) => boolean; + setReloadReportDataCount: Dispatch>; + reportData: ExerciseReportData; } const useExerciseReportData = (reportId: Report['report_id'], exerciseId: Exercise['exercise_id']): ReturnType => { @@ -86,7 +87,7 @@ const useExerciseReportData = (reportId: Report['report_id'], exerciseId: Exerci useDataLoader(() => { dispatch(fetchReport(reportId)).then(() => { - setReloadReportDataCount((prev) => prev + 1); + setReloadReportDataCount(prev => prev + 1); }); }); @@ -105,11 +106,11 @@ const useExerciseReportData = (reportId: Report['report_id'], exerciseId: Exerci ); } if (displayModule(ReportInformationType.SCORE_DETAILS)) { - fetchPromises.push(fetchExerciseExpectationResult(exerciseId).then((result) => setResults(result.data))); + fetchPromises.push(fetchExerciseExpectationResult(exerciseId).then(result => setResults(result.data))); } if (displayModule(ReportInformationType.INJECT_RESULT)) { - fetchPromises.push(exerciseInjectsResultDTO(exerciseId).then((result) => setInjects(result.data))); + fetchPromises.push(exerciseInjectsResultDTO(exerciseId).then(result => setInjects(result.data))); } Promise.all(fetchPromises).then(() => { setLoading(false); diff --git a/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx b/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx index d0baa05c0b..177271bfe1 100644 --- a/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/teams/ExerciseTeams.tsx @@ -1,22 +1,23 @@ -import { useParams } from 'react-router-dom'; +import { Paper, Typography } from '@mui/material'; import { useContext, useEffect, useState } from 'react'; import * as React from 'react'; -import { Paper, Typography } from '@mui/material'; -import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import { PermissionsContext, TeamContext } from '../../../common/Context'; -import UpdateTeams from '../../../components/teams/UpdateTeams'; -import type { TeamStore } from '../../../../../actions/teams/Team'; +import { useParams } from 'react-router-dom'; + import { fetchExerciseTeams } from '../../../../../actions/Exercise'; import type { ExerciseStore } from '../../../../../actions/exercises/Exercise'; import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; -import ContextualTeams from '../../../components/teams/ContextualTeams'; +import type { TeamStore } from '../../../../../actions/teams/Team'; import { useFormatter } from '../../../../../components/i18n'; +import { useHelper } from '../../../../../store'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { PermissionsContext, TeamContext } from '../../../common/Context'; +import ContextualTeams from '../../../components/teams/ContextualTeams'; +import UpdateTeams from '../../../components/teams/UpdateTeams'; import teamContextForExercise from './teamContextForExercise'; interface Props { - exerciseTeamsUsers: ExerciseStore['exercise_teams_users'], + exerciseTeamsUsers: ExerciseStore['exercise_teams_users']; } const ExerciseTeams: React.FC = ({ exerciseTeamsUsers }) => { @@ -45,11 +46,12 @@ const ExerciseTeams: React.FC = ({ exerciseTeamsUsers }) => { {t('Teams')} {permissions.canWrite - && team.team_id)} setTeams={(ts: TeamStore[]) => setTeams(ts)} - /> - } + /> + )}
    diff --git a/openbas-front/src/admin/components/simulations/simulation/tests/ExerciseTests.tsx b/openbas-front/src/admin/components/simulations/simulation/tests/ExerciseTests.tsx index 98cc54bc64..9cc195c359 100644 --- a/openbas-front/src/admin/components/simulations/simulation/tests/ExerciseTests.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/tests/ExerciseTests.tsx @@ -1,11 +1,12 @@ import { FunctionComponent } from 'react'; import { useParams } from 'react-router-dom'; -import type { Exercise, InjectTestStatus } from '../../../../../utils/api-types'; + import { fetchInjectTestStatus, searchExerciseInjectTests } from '../../../../../actions/inject_test/inject-test-actions'; +import type { Exercise, InjectTestStatus } from '../../../../../utils/api-types'; import InjectTestList from '../../../injects/InjectTestList'; const ExerciseTests: FunctionComponent = () => { - const { exerciseId, statusId } = useParams() as { exerciseId: Exercise['exercise_id'], statusId: InjectTestStatus['status_id'] }; + const { exerciseId, statusId } = useParams() as { exerciseId: Exercise['exercise_id']; statusId: InjectTestStatus['status_id'] }; return ( diff --git a/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeArea.tsx b/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeArea.tsx index 3716da7af3..21917c461b 100644 --- a/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeArea.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeArea.tsx @@ -1,13 +1,14 @@ import { useTheme } from '@mui/styles'; +import * as R from 'ramda'; import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; -import * as R from 'ramda'; + +import type { InjectStore } from '../../../../../actions/injects/Inject'; import Empty from '../../../../../components/Empty'; import { useFormatter } from '../../../../../components/i18n'; -import { areaChartOptions } from '../../../../../utils/Charts'; import type { Theme } from '../../../../../components/Theme'; -import type { InjectStore } from '../../../../../actions/injects/Inject'; import type { Inject } from '../../../../../utils/api-types'; +import { areaChartOptions } from '../../../../../utils/Charts'; interface Props { injects: Inject[]; diff --git a/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeLine.tsx b/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeLine.tsx index 56a1319a8b..186ec41adf 100644 --- a/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeLine.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/timeline/InjectOverTimeLine.tsx @@ -1,13 +1,14 @@ import { useTheme } from '@mui/styles'; +import * as R from 'ramda'; import { FunctionComponent } from 'react'; import Chart from 'react-apexcharts'; -import * as R from 'ramda'; + +import type { InjectStore } from '../../../../../actions/injects/Inject'; import Empty from '../../../../../components/Empty'; import { useFormatter } from '../../../../../components/i18n'; -import { lineChartOptions } from '../../../../../utils/Charts'; import type { Theme } from '../../../../../components/Theme'; -import type { InjectStore } from '../../../../../actions/injects/Inject'; import type { Inject } from '../../../../../utils/api-types'; +import { lineChartOptions } from '../../../../../utils/Charts'; interface Props { injects: Inject[]; diff --git a/openbas-front/src/admin/components/simulations/simulation/timeline/TimelineOverview.tsx b/openbas-front/src/admin/components/simulations/simulation/timeline/TimelineOverview.tsx index 5dd6d1d7ff..f939ae1002 100644 --- a/openbas-front/src/admin/components/simulations/simulation/timeline/TimelineOverview.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/timeline/TimelineOverview.tsx @@ -1,32 +1,33 @@ -import { useState } from 'react'; -import { makeStyles } from '@mui/styles'; +import { PreviewOutlined } from '@mui/icons-material'; import { Grid, List, ListItem, ListItemButton, ListItemIcon, ListItemSecondaryAction, ListItemText, Paper, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { useState } from 'react'; import { Link, useParams } from 'react-router-dom'; -import { PreviewOutlined } from '@mui/icons-material'; + +import { fetchExerciseTeams } from '../../../../../actions/Exercise'; +import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; +import { fetchExerciseInjects, updateInjectForExercise } from '../../../../../actions/Inject'; +import type { InjectStore } from '../../../../../actions/injects/Inject'; +import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; +import Empty from '../../../../../components/Empty'; import { useFormatter } from '../../../../../components/i18n'; +import ItemStatus from '../../../../../components/ItemStatus'; +import ProgressBarCountdown from '../../../../../components/ProgressBarCountdown'; +import SearchFilter from '../../../../../components/SearchFilter'; +import Timeline from '../../../../../components/Timeline'; import { useHelper } from '../../../../../store'; -import Empty from '../../../../../components/Empty'; +import type { Exercise, Inject } from '../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../utils/hooks'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import useSearchAnFilter from '../../../../../utils/SortingFiltering'; +import { isNotEmptyField } from '../../../../../utils/utils'; +import TagsFilter from '../../../common/filters/TagsFilter'; import InjectIcon from '../../../common/injects/InjectIcon'; import InjectPopover from '../../../common/injects/InjectPopover'; -import ProgressBarCountdown from '../../../../../components/ProgressBarCountdown'; +import UpdateInject from '../../../common/injects/UpdateInject'; import AnimationMenu from '../AnimationMenu'; import InjectOverTimeArea from './InjectOverTimeArea'; import InjectOverTimeLine from './InjectOverTimeLine'; -import UpdateInject from '../../../common/injects/UpdateInject'; -import ItemStatus from '../../../../../components/ItemStatus'; -import type { InjectHelper } from '../../../../../actions/injects/inject-helper'; -import type { ExercisesHelper } from '../../../../../actions/exercises/exercise-helper'; -import type { Exercise, Inject } from '../../../../../utils/api-types'; -import { fetchExerciseInjects, updateInjectForExercise } from '../../../../../actions/Inject'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import Timeline from '../../../../../components/Timeline'; -import SearchFilter from '../../../../../components/SearchFilter'; -import TagsFilter from '../../../common/filters/TagsFilter'; -import useSearchAnFilter from '../../../../../utils/SortingFiltering'; -import { isNotEmptyField } from '../../../../../utils/utils'; -import type { InjectStore } from '../../../../../actions/injects/Inject'; -import { fetchExerciseTeams } from '../../../../../actions/Exercise'; const useStyles = makeStyles(() => ({ root: { @@ -134,7 +135,8 @@ const TimelineOverview = () => { injects={filteredInjects} teams={teams} onSelectInject={(id: string) => setSelectedInjectId(id)} - > + > +
    @@ -168,7 +170,7 @@ const TimelineOverview = () => { />
    { {fndt(inject.inject_date)}
    - } + )} /> { />
    { fontSize: 12, }} > - {fndt(inject.inject_status?.tracking_sent_date)} ( + {fndt(inject.inject_status?.tracking_sent_date)} + {' '} + ( {inject.inject_status && inject.inject_status.tracking_total_execution_time && (inject.inject_status.tracking_total_execution_time / 1000).toFixed(2)} - {t('s')}) + {t('s')} + )
    - } + )} /> diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js b/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js index 6a12b3f872..538544cfb1 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js +++ b/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js @@ -1,22 +1,23 @@ -import { forwardRef, useState } from 'react'; +import { List, ListItem, ListItemIcon, ListItemText, Slide } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { useParams } from 'react-router-dom'; -import { useDispatch } from 'react-redux'; import * as R from 'ramda'; -import { List, ListItem, ListItemIcon, ListItemText, Slide } from '@mui/material'; -import AnimationMenu from '../AnimationMenu'; -import { useHelper } from '../../../../../store'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; -import { fetchExerciseInjects } from '../../../../../actions/Inject'; +import { forwardRef, useState } from 'react'; +import { useDispatch } from 'react-redux'; +import { useParams } from 'react-router-dom'; + import { fetchExerciseInjectExpectations } from '../../../../../actions/Exercise'; -import SearchFilter from '../../../../../components/SearchFilter'; -import Loader from '../../../../../components/Loader'; +import { fetchExerciseInjects } from '../../../../../actions/Inject'; import { useFormatter } from '../../../../../components/i18n'; +import ItemTags from '../../../../../components/ItemTags'; +import Loader from '../../../../../components/Loader'; +import SearchFilter from '../../../../../components/SearchFilter'; +import { useHelper } from '../../../../../store'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; +import { isNotEmptyField } from '../../../../../utils/utils'; import TagsFilter from '../../../common/filters/TagsFilter'; import InjectIcon from '../../../common/injects/InjectIcon'; -import ItemTags from '../../../../../components/ItemTags'; +import AnimationMenu from '../AnimationMenu'; import TeamOrAssetLine from './common/TeamOrAssetLine'; -import { isNotEmptyField } from '../../../../../utils/utils'; const Transition = forwardRef((props, ref) => ( @@ -41,13 +42,13 @@ const Validations = () => { const [tags, setTags] = useState([]); const { fndt } = useFormatter(); const [keyword, setKeyword] = useState(''); - const handleSearch = (value) => setKeyword(value); + const handleSearch = value => setKeyword(value); const handleAddTag = (value) => { if (value) { setTags(R.uniq(R.append(value, tags))); } }; - const handleRemoveTag = (value) => setTags(R.filter((n) => n.id !== value, tags)); + const handleRemoveTag = value => setTags(R.filter(n => n.id !== value, tags)); // Fetching data const { exercise, @@ -64,26 +65,26 @@ const Validations = () => { dispatch(fetchExerciseInjectExpectations(exerciseId)); dispatch(fetchExerciseInjects(exerciseId)); }); - const filterByKeyword = (n) => keyword === '' + const filterByKeyword = n => keyword === '' || (n.inject_expectation_inject?.inject_title || '') .toLowerCase() .indexOf(keyword.toLowerCase()) !== -1 - || (n.inject_expectation_inject?.inject_description || '') - .toLowerCase() - .indexOf(keyword.toLowerCase()) !== -1; + || (n.inject_expectation_inject?.inject_description || '') + .toLowerCase() + .indexOf(keyword.toLowerCase()) !== -1; const sort = R.sortWith([R.descend(R.prop('inject_expectation_created_at'))]); const sortedInjectExpectations = R.pipe( R.uniqBy(R.prop('inject_expectation_id')), - R.map((n) => R.assoc( + R.map(n => R.assoc( 'inject_expectation_inject', injectsMap[n.inject_expectation_inject] || {}, n, )), - R.filter((n) => n.inject_expectation_type === 'MANUAL'), + R.filter(n => n.inject_expectation_type === 'MANUAL'), R.filter( - (n) => tags.length === 0 + n => tags.length === 0 || R.any( - (filter) => R.includes(filter, n.inject_expectation_inject?.inject_tags), + filter => R.includes(filter, n.inject_expectation_inject?.inject_tags), R.pluck('id', tags), ), ), @@ -158,17 +159,17 @@ const Validations = () => {
    {inject.inject_title} @@ -180,7 +181,7 @@ const Validations = () => {
    - } + )} /> diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/common/TeamOrAssetLine.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/common/TeamOrAssetLine.tsx index 655b2af3de..cbcbb9726e 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/common/TeamOrAssetLine.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/common/TeamOrAssetLine.tsx @@ -1,32 +1,33 @@ -import { FunctionComponent } from 'react'; -import { List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { CastForEducationOutlined, DnsOutlined, LanOutlined } from '@mui/icons-material'; +import { List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import ChannelExpectation from '../expectations/ChannelExpectation'; -import ChallengeExpectation from '../expectations/ChallengeExpectation'; -import TechnicalExpectationAsset from '../expectations/TechnicalExpectationAsset'; -import TechnicalExpectationAssetGroup from '../expectations/TechnicalExpectationAssetGroup'; -import ManualExpectations from '../expectations/ManualExpectations'; -import type { EndpointStore } from '../../../../assets/endpoints/Endpoint'; -import type { AssetGroupStore } from '../../../../assets/asset_groups/AssetGroup'; -import type { Inject, Team } from '../../../../../../utils/api-types'; -import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; -import { useAppDispatch } from '../../../../../../utils/hooks'; -import { useHelper } from '../../../../../../store'; -import useDataLoader from '../../../../../../utils/hooks/useDataLoader'; -import { fetchChannels } from '../../../../../../actions/channels/channel-action'; -import { fetchExerciseTeams } from '../../../../../../actions/Exercise'; -import { fetchExerciseChallenges } from '../../../../../../actions/Challenge'; -import { fetchEndpoints } from '../../../../../../actions/assets/endpoint-actions'; +import { FunctionComponent } from 'react'; + import { fetchAssetGroups } from '../../../../../../actions/asset_groups/assetgroup-action'; import type { AssetGroupsHelper } from '../../../../../../actions/asset_groups/assetgroup-helper'; import type { EndpointHelper } from '../../../../../../actions/assets/asset-helper'; -import type { ChallengeHelper } from '../../../../../../actions/helper'; +import { fetchEndpoints } from '../../../../../../actions/assets/endpoint-actions'; +import { fetchExerciseChallenges } from '../../../../../../actions/Challenge'; +import { fetchExerciseArticles } from '../../../../../../actions/channels/article-action'; import type { ArticlesHelper } from '../../../../../../actions/channels/article-helper'; +import { fetchChannels } from '../../../../../../actions/channels/channel-action'; import type { ChannelsHelper } from '../../../../../../actions/channels/channel-helper'; -import type { TeamsHelper } from '../../../../../../actions/teams/team-helper'; -import { fetchExerciseArticles } from '../../../../../../actions/channels/article-action'; import type { Contract } from '../../../../../../actions/contract/contract'; +import { fetchExerciseTeams } from '../../../../../../actions/Exercise'; +import type { ChallengeHelper } from '../../../../../../actions/helper'; +import type { TeamsHelper } from '../../../../../../actions/teams/team-helper'; +import { useHelper } from '../../../../../../store'; +import type { Inject, Team } from '../../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../../utils/hooks'; +import useDataLoader from '../../../../../../utils/hooks/useDataLoader'; +import type { AssetGroupStore } from '../../../../assets/asset_groups/AssetGroup'; +import type { EndpointStore } from '../../../../assets/endpoints/Endpoint'; +import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; +import ChallengeExpectation from '../expectations/ChallengeExpectation'; +import ChannelExpectation from '../expectations/ChannelExpectation'; +import ManualExpectations from '../expectations/ManualExpectations'; +import TechnicalExpectationAsset from '../expectations/TechnicalExpectationAsset'; +import TechnicalExpectationAssetGroup from '../expectations/TechnicalExpectationAssetGroup'; const useStyles = makeStyles(() => ({ item: { @@ -116,11 +117,11 @@ const TeamOrAssetLine: FunctionComponent = ({ {!!assetGroup && } {team?.team_name || asset?.asset_name || assetGroup?.asset_group_name} - } + )} /> @@ -152,7 +153,7 @@ const TeamOrAssetLine: FunctionComponent = ({ ); } if (assetGroup) { - const relatedExpectations = expectationsByInject.filter((e) => assetGroup.asset_group_assets?.includes(e.inject_expectation_asset ?? '')) ?? []; + const relatedExpectations = expectationsByInject.filter(e => assetGroup.asset_group_assets?.includes(e.inject_expectation_asset ?? '')) ?? []; return ( = ({ return (
    ); } return ( - + ); })}
    diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChallengeExpectation.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChallengeExpectation.tsx index 5aee483a1c..58e5bead52 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChallengeExpectation.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChallengeExpectation.tsx @@ -1,5 +1,6 @@ -import { FunctionComponent } from 'react'; import { EmojiEventsOutlined } from '@mui/icons-material'; +import { FunctionComponent } from 'react'; + import type { Challenge } from '../../../../../../utils/api-types'; import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; import ExpectationLine from './ExpectationLine'; @@ -14,7 +15,8 @@ const ChallengeExpectation: FunctionComponent = ({ challenge, }) => { return ( - } diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChannelExpectation.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChannelExpectation.tsx index 37015826e2..00251d4e7a 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChannelExpectation.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ChannelExpectation.tsx @@ -1,4 +1,5 @@ import { FunctionComponent } from 'react'; + import type { Article, Channel } from '../../../../../../utils/api-types'; import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; import ChannelIcon from '../../../../components/channels/ChannelIcon'; @@ -16,7 +17,8 @@ const ChannelExpectation: FunctionComponent = ({ expectation, }) => { return ( - } diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/DetectionPreventionExpectationsValidationForm.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/DetectionPreventionExpectationsValidationForm.tsx index 8dc2447baf..0b030e3fdd 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/DetectionPreventionExpectationsValidationForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/DetectionPreventionExpectationsValidationForm.tsx @@ -1,23 +1,24 @@ -import { FunctionComponent } from 'react'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button, TextField as MuiTextField, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { FunctionComponent } from 'react'; import { Controller, useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import { makeStyles } from '@mui/styles'; -import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; -import { useFormatter } from '../../../../../../components/i18n'; + +import type { SecurityPlatformHelper } from '../../../../../../actions/assets/asset-helper'; +import { fetchSecurityPlatforms } from '../../../../../../actions/assets/securityPlatform-actions'; import { updateInjectExpectation } from '../../../../../../actions/Exercise'; -import { useAppDispatch } from '../../../../../../utils/hooks'; import ExpandableText from '../../../../../../components/common/ExpendableText'; -import type { Theme } from '../../../../../../components/Theme'; -import { zodImplement } from '../../../../../../utils/Zod'; -import type { InjectExpectationResult, SecurityPlatform } from '../../../../../../utils/api-types'; import SecurityPlatformField from '../../../../../../components/fields/SecurityPlatformField'; +import { useFormatter } from '../../../../../../components/i18n'; +import ItemResult from '../../../../../../components/ItemResult'; +import type { Theme } from '../../../../../../components/Theme'; import { useHelper } from '../../../../../../store'; -import type { SecurityPlatformHelper } from '../../../../../../actions/assets/asset-helper'; +import type { InjectExpectationResult, SecurityPlatform } from '../../../../../../utils/api-types'; +import { useAppDispatch } from '../../../../../../utils/hooks'; import useDataLoader from '../../../../../../utils/hooks/useDataLoader'; -import { fetchSecurityPlatforms } from '../../../../../../actions/assets/securityPlatform-actions'; -import ItemResult from '../../../../../../components/ItemResult'; +import { zodImplement } from '../../../../../../utils/Zod'; +import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; const useStyles = makeStyles((theme: Theme) => ({ marginTop_2: { @@ -42,13 +43,13 @@ const DetectionPreventionExpectationsValidationForm: FunctionComponent; } = useHelper((helper: SecurityPlatformHelper) => ({ + const { securityPlatformsMap }: { securityPlatformsMap: Record } = useHelper((helper: SecurityPlatformHelper) => ({ securityPlatformsMap: helper.getSecurityPlatformsMap(), })); useDataLoader(() => { dispatch(fetchSecurityPlatforms()); }); - const onSubmit = (data: { expectation_score: number, security_platform: string }) => { + const onSubmit = (data: { expectation_score: number; security_platform: string }) => { dispatch(updateInjectExpectation(expectation.inject_expectation_id, { ...data, source_id: data.security_platform, @@ -63,9 +64,9 @@ const DetectionPreventionExpectationsValidationForm: FunctionComponent({ + } = useForm<{ expectation_score: number; security_platform: string }>({ mode: 'onTouched', - resolver: zodResolver(zodImplement<{ expectation_score: number, security_platform: string }>().with({ + resolver: zodResolver(zodImplement<{ expectation_score: number; security_platform: string }>().with({ expectation_score: z.coerce.number(), security_platform: z.string().min(1, { message: t('Should not be empty') }), })), diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ExpectationLine.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ExpectationLine.tsx index f9816ffcc1..2e2d4ba752 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ExpectationLine.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ExpectationLine.tsx @@ -1,8 +1,9 @@ -import { FunctionComponent, ReactElement } from 'react'; import { ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; +import { FunctionComponent, ReactElement } from 'react'; + import type { Theme } from '../../../../../../components/Theme'; +import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; import ResultChip from './ResultChip'; const useStyles = makeStyles((theme: Theme) => ({ @@ -59,17 +60,21 @@ const ExpectationLine: FunctionComponent = ({ {icon}
    -
    {info}
    +
    + {' '} + {info} + {' '} +
    {title}
    - } + )} /> diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectations.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectations.tsx index ff391f3470..2b0af877b4 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectations.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectations.tsx @@ -1,5 +1,4 @@ -import { FunctionComponent, useState } from 'react'; -import * as React from 'react'; +import { AssignmentTurnedIn, ExpandMore, PersonOutlined } from '@mui/icons-material'; import { Accordion, AccordionDetails, @@ -15,24 +14,26 @@ import { Tooltip, Typography, } from '@mui/material'; -import { AssignmentTurnedIn, ExpandMore, PersonOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; -import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; -import { useFormatter } from '../../../../../../components/i18n'; -import type { Theme } from '../../../../../../components/Theme'; +import { FunctionComponent, useState } from 'react'; +import * as React from 'react'; + +import type { UserHelper } from '../../../../../../actions/helper'; +import { fetchUsers } from '../../../../../../actions/User'; import colorStyles from '../../../../../../components/Color'; import Drawer from '../../../../../../components/common/Drawer'; -import ManualExpectationsValidationForm from './ManualExpectationsValidationForm'; import ExpandableText from '../../../../../../components/common/ExpendableText'; -import type { Inject, User } from '../../../../../../utils/api-types'; import Paper from '../../../../../../components/common/Paper'; -import { computeColorStyle, computeLabel, resolveUserName, truncate } from '../../../../../../utils/String'; +import { useFormatter } from '../../../../../../components/i18n'; +import type { Theme } from '../../../../../../components/Theme'; import { useHelper } from '../../../../../../store'; -import type { UserHelper } from '../../../../../../actions/helper'; +import type { Inject, User } from '../../../../../../utils/api-types'; import { useAppDispatch } from '../../../../../../utils/hooks'; import useDataLoader from '../../../../../../utils/hooks/useDataLoader'; -import { fetchUsers } from '../../../../../../actions/User'; +import { computeColorStyle, computeLabel, resolveUserName, truncate } from '../../../../../../utils/String'; +import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; +import ManualExpectationsValidationForm from './ManualExpectationsValidationForm'; const useStyles = makeStyles((theme: Theme) => ({ item: { @@ -91,7 +92,7 @@ const ManualExpectations: FunctionComponent = ({ const [expanded, setExpanded] = useState(false); const { usersMap }: { - usersMap: Record + usersMap: Record; } = useHelper((helper: UserHelper) => { return ({ usersMap: helper.getUsersMap(), @@ -115,9 +116,9 @@ const ManualExpectations: FunctionComponent = ({ setExpanded(isExpanded ? panel : false); }; - const parentExpectation = expectations.filter((e) => !e.inject_expectation_user)[0]; - const childrenExpectations = expectations.filter((e) => e.inject_expectation_user); - const validatedCount = expectations.filter((v) => !R.isEmpty(v.inject_expectation_results)).length; + const parentExpectation = expectations.filter(e => !e.inject_expectation_user)[0]; + const childrenExpectations = expectations.filter(e => e.inject_expectation_user); + const validatedCount = expectations.filter(v => !R.isEmpty(v.inject_expectation_results)).length; const isAllValidated = validatedCount === expectations.length; const label = isAllValidated diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectationsValidationForm.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectationsValidationForm.tsx index a51148edaa..86bf8827ac 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectationsValidationForm.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ManualExpectationsValidationForm.tsx @@ -1,23 +1,24 @@ -import { FunctionComponent, useEffect } from 'react'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Button, Chip, Grid, MenuItem, Select, Slider, TextField as MuiTextField, Typography } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; +import { FunctionComponent, useEffect } from 'react'; import { useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import { makeStyles, useTheme } from '@mui/styles'; -import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; -import { useFormatter } from '../../../../../../components/i18n'; + import { updateInjectExpectation } from '../../../../../../actions/Exercise'; -import { useAppDispatch } from '../../../../../../utils/hooks'; -import type { Theme } from '../../../../../../components/Theme'; -import { zodImplement } from '../../../../../../utils/Zod'; -import type { TeamsHelper } from '../../../../../../actions/teams/team-helper'; import type { UserHelper } from '../../../../../../actions/helper'; +import { fetchTeams } from '../../../../../../actions/teams/team-actions'; +import type { TeamsHelper } from '../../../../../../actions/teams/team-helper'; +import { fetchUsers } from '../../../../../../actions/User'; +import { useFormatter } from '../../../../../../components/i18n'; +import type { Theme } from '../../../../../../components/Theme'; import { useHelper } from '../../../../../../store'; import type { Team, User } from '../../../../../../utils/api-types'; -import { computeColorStyle, computeLabel, resolveUserName, truncate } from '../../../../../../utils/String'; +import { useAppDispatch } from '../../../../../../utils/hooks'; import useDataLoader from '../../../../../../utils/hooks/useDataLoader'; -import { fetchUsers } from '../../../../../../actions/User'; -import { fetchTeams } from '../../../../../../actions/teams/team-actions'; +import { computeColorStyle, computeLabel, resolveUserName, truncate } from '../../../../../../utils/String'; +import { zodImplement } from '../../../../../../utils/Zod'; +import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; const useStyles = makeStyles((theme: Theme) => ({ marginTop_2: { @@ -51,8 +52,8 @@ const ManualExpectationsValidationForm: FunctionComponent = ({ expect const { t } = useFormatter(); const theme = useTheme(); const { teamsMap, usersMap }: { - teamsMap: Record, - usersMap: Record + teamsMap: Record; + usersMap: Record; } = useHelper((helper: TeamsHelper & UserHelper) => { return ({ teamsMap: helper.getTeamsMap(), @@ -115,7 +116,8 @@ const ManualExpectationsValidationForm: FunctionComponent = ({ expect classes={{ root: classes.chipInList }} style={computeColorStyle(expectation.inject_expectation_status)} label={t(computeLabel(expectation.inject_expectation_status))} - />)} + /> + )} {withSummary && ({expectation.inject_expectation_user ? t('Player') : t('Team')})} {withSummary && targetLabel(expectation)} @@ -140,14 +142,14 @@ const ManualExpectationsValidationForm: FunctionComponent = ({ expect diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ResultChip.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ResultChip.tsx index 5d158ea886..cc2e103146 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ResultChip.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/ResultChip.tsx @@ -1,7 +1,8 @@ import { Chip } from '@mui/material'; -import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; +import { FunctionComponent } from 'react'; + import colorStyles from '../../../../../../components/Color'; import { useFormatter } from '../../../../../../components/i18n'; import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx index edfe2fe376..3fd9b82f31 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/validation/expectations/TechnicalExpectationAsset.tsx @@ -1,17 +1,18 @@ -import { FunctionComponent, useState } from 'react'; +import { KeyboardArrowRightOutlined } from '@mui/icons-material'; import { Alert, Button, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { KeyboardArrowRightOutlined } from '@mui/icons-material'; import * as R from 'ramda'; -import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; -import ExpectationLine from './ExpectationLine'; +import { FunctionComponent, useState } from 'react'; + +import type { Contract } from '../../../../../../actions/contract/contract'; import Drawer from '../../../../../../components/common/Drawer'; import { useFormatter } from '../../../../../../components/i18n'; import type { Theme } from '../../../../../../components/Theme'; -import { typeIcon } from '../../../../common/injects/expectations/ExpectationUtils'; -import { truncate } from '../../../../../../utils/String'; import type { InjectExpectationResult } from '../../../../../../utils/api-types'; -import type { Contract } from '../../../../../../actions/contract/contract'; +import { truncate } from '../../../../../../utils/String'; +import type { InjectExpectationsStore } from '../../../../common/injects/expectations/Expectation'; +import { typeIcon } from '../../../../common/injects/expectations/ExpectationUtils'; +import ExpectationLine from './ExpectationLine'; const useStyles = makeStyles((theme: Theme) => ({ buttons: { @@ -80,9 +81,11 @@ const TechnicalExpectationAsset: FunctionComponent = ({ className={classes.marginBottom_2} > {selected == null - && <> + && ( + <> {!R.isEmpty(expectation.inject_expectation_results) - && <> + && ( + <> {t('Source')}} /> {t('Result')}} /> @@ -92,7 +95,7 @@ const TechnicalExpectationAsset: FunctionComponent = ({ component="div" disablePadding > - {expectation.inject_expectation_results?.map((result) => ( + {expectation.inject_expectation_results?.map(result => ( = ({ ))}
    - } + )} {R.isEmpty(expectation.inject_expectation_results) && t('Pending result')} - } + )} {selected !== null - &&
    +            && (
    +              
                     {toJsonFormat(selected.result)}
                   
    - } + )}
    {selected != null - && - } + )}
    - } + )} /> {groupedExpectations.map((e: InjectExpectationsStore) => ( diff --git a/openbas-front/src/admin/components/simulations/simulation/variables/AvailableVariablesDialog.tsx b/openbas-front/src/admin/components/simulations/simulation/variables/AvailableVariablesDialog.tsx index 613abef4be..f8f1f2e96e 100644 --- a/openbas-front/src/admin/components/simulations/simulation/variables/AvailableVariablesDialog.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/variables/AvailableVariablesDialog.tsx @@ -1,16 +1,17 @@ +import { CopyAllOutlined } from '@mui/icons-material'; +import { TabContext, TabList, TabPanel } from '@mui/lab'; import { Alert, Button, Dialog, DialogActions, DialogContent, List, ListItem, ListItemButton, ListItemText, Tab } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { FunctionComponent, useState } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; import { Link } from 'react-router-dom'; -import { TabContext, TabList, TabPanel } from '@mui/lab'; -import { CopyAllOutlined } from '@mui/icons-material'; + +import type { Contract } from '../../../../../actions/contract/contract'; +import type { UserHelper } from '../../../../../actions/helper'; import Transition from '../../../../../components/common/Transition'; import { useFormatter } from '../../../../../components/i18n'; -import type { Variable } from '../../../../../utils/api-types'; import { useHelper } from '../../../../../store'; -import type { UserHelper } from '../../../../../actions/helper'; -import type { Contract } from '../../../../../actions/contract/contract'; +import type { Variable } from '../../../../../utils/api-types'; import { copyToClipboard } from '../../../../../utils/utils'; interface VariableChildItemProps { @@ -80,7 +81,7 @@ interface AvailableVariablesDialogProps { } const AvailableVariablesDialog: FunctionComponent< -AvailableVariablesDialogProps + AvailableVariablesDialogProps > = ({ open, handleClose, variables, injectorContract, uriVariable }) => { const classes = useStyles(); const { t } = useFormatter(); @@ -112,11 +113,13 @@ AvailableVariablesDialogProps label={t('Builtin variables')} value="1" /> - {uriVariable && } + {uriVariable && ( + + )} - {uriVariable && - - {t('Please follow this link to')} - {/* TODO: validate when migrate to new react router version */} - {/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */} - {/* @ts-ignore */} - - - - {variables.map((variable) => ( -
    - -
    - ))} -
    -
    } + {uriVariable && ( + + + {t('Please follow this link to')} + {/* TODO: validate when migrate to new react router version */} + {/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */} + {/* @ts-ignore */} + + + + {variables.map(variable => ( +
    + +
    + ))} +
    +
    + )}
    diff --git a/openbas-front/src/admin/components/simulations/simulation/variables/ExerciseVariables.tsx b/openbas-front/src/admin/components/simulations/simulation/variables/ExerciseVariables.tsx index fcbaed4dec..fa118235d9 100644 --- a/openbas-front/src/admin/components/simulations/simulation/variables/ExerciseVariables.tsx +++ b/openbas-front/src/admin/components/simulations/simulation/variables/ExerciseVariables.tsx @@ -1,16 +1,17 @@ +import { Paper, Typography } from '@mui/material'; import { useContext } from 'react'; import { useParams } from 'react-router-dom'; -import { Paper, Typography } from '@mui/material'; + +import { addVariableForExercise, deleteVariableForExercise, fetchVariablesForExercise, updateVariableForExercise } from '../../../../../actions/variables/variable-actions'; +import type { VariablesHelper } from '../../../../../actions/variables/variable-helper'; +import { useFormatter } from '../../../../../components/i18n'; import { useHelper } from '../../../../../store'; import type { Exercise, Variable, VariableInput } from '../../../../../utils/api-types'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { useAppDispatch } from '../../../../../utils/hooks'; -import Variables from '../../../components/variables/Variables'; -import type { VariablesHelper } from '../../../../../actions/variables/variable-helper'; -import { addVariableForExercise, deleteVariableForExercise, fetchVariablesForExercise, updateVariableForExercise } from '../../../../../actions/variables/variable-actions'; +import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { PermissionsContext, VariableContext, VariableContextType } from '../../../common/Context'; import CreateVariable from '../../../components/variables/CreateVariable'; -import { useFormatter } from '../../../../../components/i18n'; +import Variables from '../../../components/variables/Variables'; const ExerciseVariables = () => { // Standard hooks diff --git a/openbas-front/src/admin/components/teams/Index.tsx b/openbas-front/src/admin/components/teams/Index.tsx index 7d176d17da..9983450a7b 100644 --- a/openbas-front/src/admin/components/teams/Index.tsx +++ b/openbas-front/src/admin/components/teams/Index.tsx @@ -1,6 +1,7 @@ -import { Suspense, lazy } from 'react'; import { makeStyles } from '@mui/styles'; +import { lazy, Suspense } from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; + import { errorWrapper } from '../../../components/Error'; import Loader from '../../../components/Loader'; import NotFound from '../../../components/NotFound'; @@ -26,7 +27,7 @@ const Index = () => { {/* Not found */} - }/> + } /> diff --git a/openbas-front/src/admin/components/teams/Organizations.tsx b/openbas-front/src/admin/components/teams/Organizations.tsx index d5f28151a7..9cc942ac85 100644 --- a/openbas-front/src/admin/components/teams/Organizations.tsx +++ b/openbas-front/src/admin/components/teams/Organizations.tsx @@ -1,27 +1,28 @@ -import { CSSProperties } from 'react'; -import { makeStyles } from '@mui/styles'; +import { DomainOutlined, FileDownloadOutlined } from '@mui/icons-material'; import { IconButton, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, Tooltip } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import { CSSProperties } from 'react'; import { CSVLink } from 'react-csv'; -import { DomainOutlined, FileDownloadOutlined } from '@mui/icons-material'; import { useSearchParams } from 'react-router-dom'; -import { useFormatter } from '../../../components/i18n'; + +import type { OrganizationHelper, TagHelper, UserHelper } from '../../../actions/helper'; import { fetchOrganizations } from '../../../actions/Organization'; -import ItemTags from '../../../components/ItemTags'; -import { truncate } from '../../../utils/String'; -import CreateOrganization from './organizations/CreateOrganization'; -import OrganizationPopover from './organizations/OrganizationPopover'; import { fetchTags } from '../../../actions/Tag'; +import Breadcrumbs from '../../../components/Breadcrumbs'; +import { useFormatter } from '../../../components/i18n'; +import ItemTags from '../../../components/ItemTags'; import SearchFilter from '../../../components/SearchFilter'; -import TagsFilter from '../common/filters/TagsFilter'; +import type { Theme } from '../../../components/Theme'; +import { useHelper } from '../../../store'; +import type { Organization } from '../../../utils/api-types'; import { exportData } from '../../../utils/Environment'; -import Breadcrumbs from '../../../components/Breadcrumbs'; import { useAppDispatch } from '../../../utils/hooks'; import useDataLoader from '../../../utils/hooks/useDataLoader'; -import { useHelper } from '../../../store'; -import type { OrganizationHelper, TagHelper, UserHelper } from '../../../actions/helper'; -import type { Theme } from '../../../components/Theme'; import useSearchAnFilter from '../../../utils/SortingFiltering'; -import type { Organization } from '../../../utils/api-types'; +import { truncate } from '../../../utils/String'; +import TagsFilter from '../common/filters/TagsFilter'; +import CreateOrganization from './organizations/CreateOrganization'; +import OrganizationPopover from './organizations/OrganizationPopover'; const useStyles = makeStyles((theme: Theme) => ({ parameters: { @@ -182,7 +183,7 @@ const Organizations = () => { > {filtering.buildHeader( 'organization_name', @@ -203,11 +204,11 @@ const Organizations = () => { inlineStylesHeaders, )} - } + )} />   - {sortedOrganizations.map((organization) => ( + {sortedOrganizations.map(organization => ( {
    { />
    - } + )} /> ({ itemHead: { @@ -171,13 +172,13 @@ const Players = () => { > - } + )} /> {players.map((player: PlayerOutput) => ( @@ -190,9 +191,9 @@ const Players = () => { - {headers.map((header) => ( + {headers.map(header => (
    {
    ))} - } + )} /> setPlayers(players.map((p) => (p.user_id !== result.user_id ? p : result)))} - onDelete={(result) => setPlayers(players.filter((p) => (p.user_id !== result)))} + onUpdate={result => setPlayers(players.map(p => (p.user_id !== result.user_id ? p : result)))} + onDelete={result => setPlayers(players.filter(p => (p.user_id !== result)))} /> ))} {isPlanner - && setPlayers([result, ...players])} - /> - } + && ( + setPlayers([result, ...players])} + /> + )} ); }; diff --git a/openbas-front/src/admin/components/teams/Teams.tsx b/openbas-front/src/admin/components/teams/Teams.tsx index b8cf109021..0253c2b112 100644 --- a/openbas-front/src/admin/components/teams/Teams.tsx +++ b/openbas-front/src/admin/components/teams/Teams.tsx @@ -1,18 +1,18 @@ -import TeamsComponent from '../components/teams/Teams'; -import { PermissionsContext, PermissionsContextType, TeamContext, type TeamContextType } from '../common/Context'; -import { useHelper } from '../../../store'; import type { UserHelper } from '../../../actions/helper'; import type { TeamStore } from '../../../actions/teams/Team'; -import type { SearchPaginationInput, Team, TeamOutput, User } from '../../../utils/api-types'; -import type { TeamsHelper } from '../../../actions/teams/team-helper'; -import type { UserStore } from './players/Player'; import { updateTeamPlayers } from '../../../actions/teams/team-actions'; -import { useAppDispatch } from '../../../utils/hooks'; +import type { TeamsHelper } from '../../../actions/teams/team-helper'; import { Page } from '../../../components/common/queryable/Page'; +import { useHelper } from '../../../store'; +import type { SearchPaginationInput, Team, TeamOutput, User } from '../../../utils/api-types'; +import { useAppDispatch } from '../../../utils/hooks'; +import { PermissionsContext, PermissionsContextType, TeamContext, type TeamContextType } from '../common/Context'; +import TeamsComponent from '../components/teams/Teams'; +import type { UserStore } from './players/Player'; const Teams = () => { const dispatch = useAppDispatch(); - const { user, teams }: { user: User, teams: TeamStore[] } = useHelper((helper: UserHelper & TeamsHelper) => ({ + const { user, teams }: { user: User; teams: TeamStore[] } = useHelper((helper: UserHelper & TeamsHelper) => ({ user: helper.getMe(), teams: helper.getTeams(), })); @@ -28,12 +28,12 @@ const Teams = () => { const teamContext: TeamContextType = { onAddUsersTeam(teamId: Team['team_id'], userIds: UserStore['user_id'][]): Promise { return dispatch(updateTeamPlayers(teamId, { - team_users: [...(teams.find((t) => t.team_id === teamId)?.team_users || []), ...userIds], + team_users: [...(teams.find(t => t.team_id === teamId)?.team_users || []), ...userIds], })); }, onRemoveUsersTeam(teamId: TeamStore['team_id'], userIds: UserStore['user_id'][]): Promise { return dispatch(updateTeamPlayers(teamId, { - team_users: [...(teams.find((t) => t.team_id === teamId)?.team_users?.filter((u) => !userIds.includes(u)) || [])], + team_users: [...(teams.find(t => t.team_id === teamId)?.team_users?.filter(u => !userIds.includes(u)) || [])], })); }, searchTeams(_: SearchPaginationInput): Promise<{ data: Page }> { diff --git a/openbas-front/src/admin/components/teams/organizations/CreateOrganization.js b/openbas-front/src/admin/components/teams/organizations/CreateOrganization.js index fcf3a85524..2805431897 100644 --- a/openbas-front/src/admin/components/teams/organizations/CreateOrganization.js +++ b/openbas-front/src/admin/components/teams/organizations/CreateOrganization.js @@ -1,13 +1,14 @@ -import { forwardRef, Component } from 'react'; +import { Add } from '@mui/icons-material'; +import { Dialog, DialogContent, DialogTitle, Fab, Slide } from '@mui/material'; +import { withStyles } from '@mui/styles'; import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import * as R from 'ramda'; -import { withStyles } from '@mui/styles'; -import { Fab, Dialog, DialogTitle, DialogContent, Slide } from '@mui/material'; -import { Add } from '@mui/icons-material'; -import OrganizationForm from './OrganizationForm'; +import { Component, forwardRef } from 'react'; +import { connect } from 'react-redux'; + import { addOrganization } from '../../../../actions/Organization'; import inject18n from '../../../../components/i18n'; +import OrganizationForm from './OrganizationForm'; const Transition = forwardRef((props, ref) => ( @@ -42,7 +43,7 @@ class CreateOrganization extends Component { )(data); return this.props .addOrganization(inputValues) - .then((result) => (result.result ? this.handleClose() : result)); + .then(result => (result.result ? this.handleClose() : result)); } render() { diff --git a/openbas-front/src/admin/components/teams/organizations/OrganizationForm.js b/openbas-front/src/admin/components/teams/organizations/OrganizationForm.js index 3ab0e9a2bc..ae4d88d63d 100644 --- a/openbas-front/src/admin/components/teams/organizations/OrganizationForm.js +++ b/openbas-front/src/admin/components/teams/organizations/OrganizationForm.js @@ -1,7 +1,8 @@ -import { Component } from 'react'; +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; +import { Component } from 'react'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import OldTextField from '../../../../components/fields/OldTextField'; import inject18n from '../../../../components/i18n'; import TagField from '../../../../components/TagField'; diff --git a/openbas-front/src/admin/components/teams/organizations/OrganizationPopover.js b/openbas-front/src/admin/components/teams/organizations/OrganizationPopover.js index e080983b7a..c7375a57f5 100644 --- a/openbas-front/src/admin/components/teams/organizations/OrganizationPopover.js +++ b/openbas-front/src/admin/components/teams/organizations/OrganizationPopover.js @@ -1,13 +1,14 @@ -import { forwardRef, Component } from 'react'; +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Menu, MenuItem, Slide } from '@mui/material'; import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import * as R from 'ramda'; -import { Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, Button, IconButton, Slide, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; -import { updateOrganization, deleteOrganization } from '../../../../actions/Organization'; -import OrganizationForm from './OrganizationForm'; +import { Component, forwardRef } from 'react'; +import { connect } from 'react-redux'; + +import { deleteOrganization, updateOrganization } from '../../../../actions/Organization'; import inject18n from '../../../../components/i18n'; import { tagOptions } from '../../../../utils/Option'; +import OrganizationForm from './OrganizationForm'; const Transition = forwardRef((props, ref) => ( diff --git a/openbas-front/src/admin/components/teams/players/CreatePlayer.tsx b/openbas-front/src/admin/components/teams/players/CreatePlayer.tsx index 757a7e8a79..6d114975cb 100644 --- a/openbas-front/src/admin/components/teams/players/CreatePlayer.tsx +++ b/openbas-front/src/admin/components/teams/players/CreatePlayer.tsx @@ -1,18 +1,19 @@ -import { FunctionComponent, useState } from 'react'; -import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; +import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useState } from 'react'; + import { addPlayer } from '../../../../actions/User'; -import PlayerForm from './PlayerForm'; -import { useFormatter } from '../../../../components/i18n'; +import ButtonCreate from '../../../../components/common/ButtonCreate'; import Dialog from '../../../../components/common/Dialog'; -import { useAppDispatch } from '../../../../utils/hooks'; +import Drawer from '../../../../components/common/Drawer'; +import { useFormatter } from '../../../../components/i18n'; import type { Theme } from '../../../../components/Theme'; import type { PlayerInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; import { Option } from '../../../../utils/Option'; import type { PlayerInputForm, UserStore } from './Player'; -import ButtonCreate from '../../../../components/common/ButtonCreate'; -import Drawer from '../../../../components/common/Drawer'; +import PlayerForm from './PlayerForm'; const useStyles = makeStyles((theme: Theme) => ({ text: { @@ -49,7 +50,7 @@ const CreatePlayer: FunctionComponent = ({ user_tags: data.user_tags?.map((tag: Option) => tag.id), }; return dispatch(addPlayer(inputValues)).then( - (result: { result: string, entities: { users: Record } }) => { + (result: { result: string; entities: { users: Record } }) => { if (result.result) { if (onCreate) { const created = result.entities.users[result.result]; diff --git a/openbas-front/src/admin/components/teams/players/Player.d.ts b/openbas-front/src/admin/components/teams/players/Player.d.ts index b7481fa335..1d663726c1 100644 --- a/openbas-front/src/admin/components/teams/players/Player.d.ts +++ b/openbas-front/src/admin/components/teams/players/Player.d.ts @@ -2,7 +2,7 @@ import type { PlayerInput, User } from '../../../../utils/api-types'; import { Option } from '../../../../utils/Option'; export type PlayerInputForm = Omit< -PlayerInput, + PlayerInput, 'user_organization' | 'user_country' | 'user_tags' > & { user_organization: Option | undefined; diff --git a/openbas-front/src/admin/components/teams/players/PlayerForm.tsx b/openbas-front/src/admin/components/teams/players/PlayerForm.tsx index 89d6a7ce44..2f293e2558 100644 --- a/openbas-front/src/admin/components/teams/players/PlayerForm.tsx +++ b/openbas-front/src/admin/components/teams/players/PlayerForm.tsx @@ -1,15 +1,16 @@ +import { InfoOutlined } from '@mui/icons-material'; +import { Button, InputAdornment, Tooltip } from '@mui/material'; import { FunctionComponent } from 'react'; import { Form } from 'react-final-form'; -import { Button, InputAdornment, Tooltip } from '@mui/material'; import { z } from 'zod'; -import { InfoOutlined } from '@mui/icons-material'; + +import CountryField from '../../../../components/CountryField'; import OldTextField from '../../../../components/fields/OldTextField'; import { useFormatter } from '../../../../components/i18n'; -import TagField from '../../../../components/TagField'; import OrganizationField from '../../../../components/OrganizationField'; -import CountryField from '../../../../components/CountryField'; -import type { PlayerInputForm } from './Player'; +import TagField from '../../../../components/TagField'; import { schemaValidator } from '../../../../utils/Zod'; +import type { PlayerInputForm } from './Player'; interface PlayerFormProps { initialValues: Partial; diff --git a/openbas-front/src/admin/components/teams/players/PlayerPopover.tsx b/openbas-front/src/admin/components/teams/players/PlayerPopover.tsx index 0334cbc97e..b66f8dd6be 100644 --- a/openbas-front/src/admin/components/teams/players/PlayerPopover.tsx +++ b/openbas-front/src/admin/components/teams/players/PlayerPopover.tsx @@ -1,20 +1,21 @@ +import { MoreVert } from '@mui/icons-material'; +import { Button, Dialog as MuiDialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; import { FunctionComponent, useContext, useState } from 'react'; import * as React from 'react'; -import { Button, Dialog as MuiDialog, DialogActions, DialogContent, DialogContentText, IconButton, Menu, MenuItem } from '@mui/material'; -import { MoreVert } from '@mui/icons-material'; + +import type { OrganizationHelper, TagHelper, UserHelper } from '../../../../actions/helper'; import { deletePlayer, updatePlayer } from '../../../../actions/User'; -import PlayerForm from './PlayerForm'; -import { useFormatter } from '../../../../components/i18n'; -import { useAppDispatch } from '../../../../utils/hooks'; +import DialogDelete from '../../../../components/common/DialogDelete'; +import Drawer from '../../../../components/common/Drawer'; import Transition from '../../../../components/common/Transition'; +import { useFormatter } from '../../../../components/i18n'; +import { useHelper } from '../../../../store'; import type { PlayerInput } from '../../../../utils/api-types'; +import { useAppDispatch } from '../../../../utils/hooks'; import { countryOption, Option, organizationOption, tagOptions } from '../../../../utils/Option'; -import { useHelper } from '../../../../store'; -import type { OrganizationHelper, TagHelper, UserHelper } from '../../../../actions/helper'; -import type { PlayerInputForm, UserStore } from './Player'; import { TeamContext } from '../../common/Context'; -import DialogDelete from '../../../../components/common/DialogDelete'; -import Drawer from '../../../../components/common/Drawer'; +import type { PlayerInputForm, UserStore } from './Player'; +import PlayerForm from './PlayerForm'; interface PlayerPopoverProps { user: UserStore; @@ -76,7 +77,7 @@ const PlayerPopover: FunctionComponent = ({ user_tags: data.user_tags?.map((tag: Option) => tag.id), }; return dispatch(updatePlayer(user.user_id, inputValues)) - .then((result: { result: string, entities: { users: Record } }) => { + .then((result: { result: string; entities: { users: Record } }) => { if (onUpdate) { const updated = result.entities.users[result.result]; onUpdate(updated); diff --git a/openbas-front/src/app.tsx b/openbas-front/src/app.tsx index d627eee017..00cb28db59 100644 --- a/openbas-front/src/app.tsx +++ b/openbas-front/src/app.tsx @@ -1,11 +1,12 @@ import { Provider } from 'react-redux'; import { Route, Routes } from 'react-router-dom'; import { HistoryRouter as Router } from 'redux-first-history/rr6'; -import { history, store } from './store'; + +import NotFound from './components/NotFound'; import RedirectManager from './components/RedirectManager'; import Root from './root'; +import { history, store } from './store'; import { APP_BASE_PATH } from './utils/Action'; -import NotFound from './components/NotFound'; const App = () => ( @@ -14,7 +15,7 @@ const App = () => ( } /> {/* Not found */} - }/> + } /> diff --git a/openbas-front/src/components/AppIntlProvider.js b/openbas-front/src/components/AppIntlProvider.js index 07f91aa662..a437a0f09b 100644 --- a/openbas-front/src/components/AppIntlProvider.js +++ b/openbas-front/src/components/AppIntlProvider.js @@ -1,20 +1,22 @@ -import { useEffect } from 'react'; -import * as PropTypes from 'prop-types'; -import { IntlProvider } from 'react-intl'; -import moment from 'moment'; -import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'; -import { LocalizationProvider } from '@mui/x-date-pickers'; -import frLocale from 'date-fns/locale/fr'; -import enLocale from 'date-fns/locale/en-US'; -import esLocale from 'date-fns/locale/es'; -import cnLocale from 'date-fns/locale/zh-CN'; import 'cronstrue/locales/fr'; import 'cronstrue/locales/en'; import 'cronstrue/locales/es'; import 'cronstrue/locales/zh_CN'; + +import { LocalizationProvider } from '@mui/x-date-pickers'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'; +import enLocale from 'date-fns/locale/en-US'; +import esLocale from 'date-fns/locale/es'; +import frLocale from 'date-fns/locale/fr'; +import cnLocale from 'date-fns/locale/zh-CN'; +import moment from 'moment'; +import * as PropTypes from 'prop-types'; +import { useEffect } from 'react'; +import { IntlProvider } from 'react-intl'; + +import { useHelper } from '../store'; import locale, { DEFAULT_LANG } from '../utils/BrowserLanguage'; import i18n from '../utils/Localization'; -import { useHelper } from '../store'; const localeMap = { en: enLocale, diff --git a/openbas-front/src/components/AppThemeProvider.tsx b/openbas-front/src/components/AppThemeProvider.tsx index cd61fa0717..63a2af6091 100644 --- a/openbas-front/src/components/AppThemeProvider.tsx +++ b/openbas-front/src/components/AppThemeProvider.tsx @@ -1,14 +1,15 @@ -import { ReactNode, useEffect, useState } from 'react'; -import * as React from 'react'; +import { enUS, esES, frFR, Localization, zhCN } from '@mui/material/locale'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import { ThemeOptions } from '@mui/material/styles/createTheme'; -import { zhCN, frFR, enUS, esES, Localization } from '@mui/material/locale'; -import themeDark from './ThemeDark'; -import themeLight from './ThemeLight'; -import { useHelper } from '../store'; +import { ReactNode, useEffect, useState } from 'react'; +import * as React from 'react'; + import type { LoggedHelper } from '../actions/helper'; +import { useHelper } from '../store'; import type { PlatformSettings } from '../utils/api-types'; import { useFormatter } from './i18n'; +import themeDark from './ThemeDark'; +import themeLight from './ThemeLight'; interface Props { children: ReactNode; @@ -27,9 +28,9 @@ const AppThemeProvider: React.FC = ({ const [muiLocale, setMuiLocale] = useState(enUS); const { locale } = useFormatter(); const { theme, dark, light }: { - theme: string, - dark: PlatformSettings['platform_dark_theme'], - light: PlatformSettings['platform_light_theme'] + theme: string; + dark: PlatformSettings['platform_dark_theme']; + light: PlatformSettings['platform_light_theme']; } = useHelper((helper: LoggedHelper) => { const me = helper.getMe(); const settings = helper.getPlatformSettings(); diff --git a/openbas-front/src/components/AttackPatternField.tsx b/openbas-front/src/components/AttackPatternField.tsx index aed6527cbf..f60ae40b63 100644 --- a/openbas-front/src/components/AttackPatternField.tsx +++ b/openbas-front/src/components/AttackPatternField.tsx @@ -1,20 +1,21 @@ -import { useState, FunctionComponent } from 'react'; -import * as R from 'ramda'; import { AddOutlined, RouteOutlined } from '@mui/icons-material'; -import { Box, Dialog, DialogTitle, DialogContent, Autocomplete, TextField, IconButton } from '@mui/material'; +import { Autocomplete, Box, Dialog, DialogContent, DialogTitle, IconButton, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { useFormatter } from './i18n'; +import * as R from 'ramda'; +import { FunctionComponent, useState } from 'react'; + +import type { AttackPatternHelper } from '../actions/attack_patterns/attackpattern-helper'; +import { addAttackPattern, fetchAttackPatterns } from '../actions/AttackPattern'; +import type { UserHelper } from '../actions/helper'; +import type { KillChainPhaseHelper } from '../actions/kill_chain_phases/killchainphase-helper'; +import { fetchKillChainPhases } from '../actions/KillChainPhase'; import AttackPatternForm from '../admin/components/settings/attack_patterns/AttackPatternForm'; -import { fetchAttackPatterns, addAttackPattern } from '../actions/AttackPattern'; +import { useHelper } from '../store'; import type { AttackPattern, AttackPatternCreateInput } from '../utils/api-types'; import { useAppDispatch } from '../utils/hooks'; import useDataLoader from '../utils/hooks/useDataLoader'; -import { fetchKillChainPhases } from '../actions/KillChainPhase'; -import { useHelper } from '../store'; -import type { AttackPatternHelper } from '../actions/attack_patterns/attackpattern-helper'; -import type { KillChainPhaseHelper } from '../actions/kill_chain_phases/killchainphase-helper'; -import type { UserHelper } from '../actions/helper'; import { Option } from '../utils/Option'; +import { useFormatter } from './i18n'; const useStyles = makeStyles(() => ({ icon: { @@ -72,12 +73,12 @@ const AttackPatternField: FunctionComponent = ({ setAttackPatternCreation(false); }; - const onSubmit = ((data: AttackPatternCreateInputForm) => { + const onSubmit = (data: AttackPatternCreateInputForm) => { const inputValues: AttackPatternCreateInput = { ...data, - attack_pattern_kill_chain_phases: data.attack_pattern_kill_chain_phases?.map((k) => k.id), + attack_pattern_kill_chain_phases: data.attack_pattern_kill_chain_phases?.map(k => k.id), }; - dispatch(addAttackPattern(inputValues)).then((result: { result: string, entities: { attackpatterns: Record } }) => { + dispatch(addAttackPattern(inputValues)).then((result: { result: string; entities: { attackpatterns: Record } }) => { if (result.result) { const newAttackPattern = result.entities.attackpatterns[result.result]; const newAttackPatterns = [...fieldValues, useExternalId ? newAttackPattern.attack_pattern_external_id : newAttackPattern.attack_pattern_id]; @@ -86,7 +87,7 @@ const AttackPatternField: FunctionComponent = ({ } return result; }); - }); + }; const attackPatternsOptions = attackPatterns.map( (n: AttackPattern) => { @@ -116,7 +117,7 @@ const AttackPatternField: FunctionComponent = ({ noOptionsText={t('No available options')} disableClearable renderInput={ - (params) => ( + params => ( = ({ /> ) } - value={attackPatternsOptions.filter((a: { id: string, label: string }) => fieldValues?.includes(a.id)) ?? null} + value={attackPatternsOptions.filter((a: { id: string; label: string }) => fieldValues?.includes(a.id)) ?? null} onChange={(_event, pattern) => { - onChange(pattern.map((p) => p.id)); + onChange(pattern.map(p => p.id)); }} renderOption={(props, option) => ( diff --git a/openbas-front/src/components/Autocomplete.js b/openbas-front/src/components/Autocomplete.js index 6bb98328c9..8954065105 100644 --- a/openbas-front/src/components/Autocomplete.js +++ b/openbas-front/src/components/Autocomplete.js @@ -1,6 +1,6 @@ -import { Field } from 'react-final-form'; -import { TextField, IconButton, Autocomplete as MuiAutocomplete } from '@mui/material'; import { AddOutlined } from '@mui/icons-material'; +import { Autocomplete as MuiAutocomplete, IconButton, TextField } from '@mui/material'; +import { Field } from 'react-final-form'; const renderAutocomplete = ({ label, @@ -33,7 +33,7 @@ const renderAutocomplete = ({ {...inputProps} {...others} isOptionEqualToValue={(option, value) => value === undefined || value === '' || option.id === value.id} - renderInput={(params) => ( + renderInput={params => ( ({ container: { @@ -57,18 +58,18 @@ const useStyles = makeStyles(() => ({ })); interface Props { - injects: InjectOutputType[], - exerciseOrScenarioId: string, - onSelectedInject(inject?: InjectOutputType): void, + injects: InjectOutputType[]; + exerciseOrScenarioId: string; + onSelectedInject(inject?: InjectOutputType): void; openCreateInjectDrawer(data: { - inject_depends_duration_days: number, - inject_depends_duration_minutes: number, - inject_depends_duration_hours: number - }): void, - onUpdateInject: (data: Inject[]) => void - onCreate: (result: { result: string, entities: { injects: Record } }) => void, - onUpdate: (result: { result: string, entities: { injects: Record } }) => void, - onDelete: (result: string) => void, + inject_depends_duration_days: number; + inject_depends_duration_minutes: number; + inject_depends_duration_hours: number; + }): void; + onUpdateInject: (data: Inject[]) => void; + onCreate: (result: { result: string; entities: { injects: Record } }) => void; + onUpdate: (result: { result: string; entities: { injects: Record } }) => void; + onDelete: (result: string) => void; } const ChainedTimelineFlow: FunctionComponent = ({ @@ -171,12 +172,12 @@ const ChainedTimelineFlow: FunctionComponent = ({ */ const calculateBoundingBox = (currentNode: NodeInject, nodesAvailable: NodeInject[]) => { if (currentNode.data.inject?.inject_depends_on) { - const nodesId = currentNode.data.inject?.inject_depends_on.map((value) => value.dependency_relationship?.inject_parent_id); - const dependencies = nodesAvailable.filter((dependencyNode) => nodesId.includes(dependencyNode.id)); - const minX = Math.min(currentNode.position.x, ...dependencies.map((value) => value.data.boundingBox!.topLeft.x)); - const minY = Math.min(currentNode.position.y, ...dependencies.map((value) => value.data.boundingBox!.topLeft.y)); - const maxX = Math.max(currentNode.position.x + nodeWidthClearance, ...dependencies.map((value) => value.data.boundingBox!.bottomRight.x)); - const maxY = Math.max(currentNode.position.y + nodeHeightClearance, ...dependencies.map((value) => value.data.boundingBox!.bottomRight.y)); + const nodesId = currentNode.data.inject?.inject_depends_on.map(value => value.dependency_relationship?.inject_parent_id); + const dependencies = nodesAvailable.filter(dependencyNode => nodesId.includes(dependencyNode.id)); + const minX = Math.min(currentNode.position.x, ...dependencies.map(value => value.data.boundingBox!.topLeft.x)); + const minY = Math.min(currentNode.position.y, ...dependencies.map(value => value.data.boundingBox!.topLeft.y)); + const maxX = Math.max(currentNode.position.x + nodeWidthClearance, ...dependencies.map(value => value.data.boundingBox!.bottomRight.x)); + const maxY = Math.max(currentNode.position.y + nodeHeightClearance, ...dependencies.map(value => value.data.boundingBox!.bottomRight.y)); return { topLeft: { x: minX, y: minY }, bottomRight: { x: maxX, y: maxY }, @@ -196,11 +197,11 @@ const ChainedTimelineFlow: FunctionComponent = ({ let reorganizedInjects = nodeInjects; nodeInjects.forEach((node, i) => { - let childrens = reorganizedInjects.slice(i).filter((nextNode) => nextNode.id !== node.id - && nextNode.data.inject?.inject_depends_on !== undefined - && nextNode.data.inject?.inject_depends_on !== null - && nextNode.data.inject!.inject_depends_on - .find((dependsOn) => dependsOn.dependency_relationship?.inject_parent_id === node.id) !== undefined); + let childrens = reorganizedInjects.slice(i).filter(nextNode => nextNode.id !== node.id + && nextNode.data.inject?.inject_depends_on !== undefined + && nextNode.data.inject?.inject_depends_on !== null + && nextNode.data.inject!.inject_depends_on + .find(dependsOn => dependsOn.dependency_relationship?.inject_parent_id === node.id) !== undefined); childrens = childrens.sort((a, b) => a.data.inject!.inject_depends_duration - b.data.inject!.inject_depends_duration); @@ -214,13 +215,13 @@ const ChainedTimelineFlow: FunctionComponent = ({ const nodeInjectData = nodeInject.data; const previousNodes = reorganizedInjects.slice(0, index) - .filter((previousNode) => previousNode.data.boundingBox !== undefined - && nodeInjectData.boundingBox !== undefined - && nodeInjectData.boundingBox?.topLeft.x >= previousNode.data.boundingBox.topLeft.x - && nodeInjectData.boundingBox?.topLeft.x < previousNode.data.boundingBox.bottomRight.x); + .filter(previousNode => previousNode.data.boundingBox !== undefined + && nodeInjectData.boundingBox !== undefined + && nodeInjectData.boundingBox?.topLeft.x >= previousNode.data.boundingBox.topLeft.x + && nodeInjectData.boundingBox?.topLeft.x < previousNode.data.boundingBox.bottomRight.x); const arrayOfY = previousNodes - .map((previousNode) => (previousNode.data.boundingBox?.bottomRight.y ? previousNode.data.boundingBox?.bottomRight.y : 0)); + .map(previousNode => (previousNode.data.boundingBox?.bottomRight.y ? previousNode.data.boundingBox?.bottomRight.y : 0)); const maxY = Math.max(0, ...arrayOfY); nodeInjectPosition.y = 0; @@ -237,9 +238,9 @@ const ChainedTimelineFlow: FunctionComponent = ({ nodeInjectPosition.y = previousNodes.length === 0 ? 0 : maxY; } if (nodeInject.data.inject?.inject_depends_on) { - const nodesId = nodeInject.data.inject?.inject_depends_on.map((value) => value.dependency_relationship?.inject_parent_id); - const dependencies = reorganizedInjects.filter((dependencyNode) => nodesId.includes(dependencyNode.id)); - const minY = dependencies.length > 0 ? Math.min(...dependencies.map((value) => value.data.boundingBox!.topLeft.y)) : 0; + const nodesId = nodeInject.data.inject?.inject_depends_on.map(value => value.dependency_relationship?.inject_parent_id); + const dependencies = reorganizedInjects.filter(dependencyNode => nodesId.includes(dependencyNode.id)); + const minY = dependencies.length > 0 ? Math.min(...dependencies.map(value => value.data.boundingBox!.topLeft.y)) : 0; nodeInjectPosition.y = nodeInjectPosition.y < minY ? minY : nodeInjectPosition.y; } @@ -251,7 +252,7 @@ const ChainedTimelineFlow: FunctionComponent = ({ }; const updateEdges = () => { - const newEdges = injects.filter((inject) => inject.inject_depends_on !== null && inject.inject_depends_on !== undefined) + const newEdges = injects.filter(inject => inject.inject_depends_on !== null && inject.inject_depends_on !== undefined) .flatMap((inject) => { const results = []; if (inject.inject_depends_on !== undefined) { @@ -294,7 +295,7 @@ const ChainedTimelineFlow: FunctionComponent = ({ theme.palette.mode === 'dark' ? '#09101e' : '#e5e5e5', - isTargeted: injects.find((anyInject) => anyInject.inject_id === inject.inject_id) !== undefined, + isTargeted: injects.find(anyInject => anyInject.inject_id === inject.inject_id) !== undefined, isTargeting: inject.inject_depends_on !== undefined, inject, fixedY: 0, @@ -304,9 +305,9 @@ const ChainedTimelineFlow: FunctionComponent = ({ topLeft: { x: (inject.inject_depends_duration / 60) * (gapSize / minutesPerGapAllowed[minutesPerGapIndex]), y: 0 }, bottomRight: { x: (inject.inject_depends_duration / 60) * (gapSize / minutesPerGapAllowed[minutesPerGapIndex]) + nodeWidthClearance, y: nodeHeightClearance }, }, - targets: inject.inject_assets!.map((asset) => assets[asset]?.asset_name) - .concat(inject.inject_asset_groups!.map((assetGroup) => assetGroups[assetGroup]?.asset_group_name)) - .concat(inject.inject_teams!.map((team) => teams[team]?.team_name)), + targets: inject.inject_assets!.map(asset => assets[asset]?.asset_name) + .concat(inject.inject_asset_groups!.map(assetGroup => assetGroups[assetGroup]?.asset_group_name)) + .concat(inject.inject_teams!.map(team => teams[team]?.team_name)), exerciseOrScenarioId, onCreate, onUpdate, @@ -319,7 +320,7 @@ const ChainedTimelineFlow: FunctionComponent = ({ })); if (currentUpdatedNode !== null) { - injectsNodes.find((inject) => inject.id === currentUpdatedNode.id)!.position.x = currentUpdatedNode.position.x; + injectsNodes.find(inject => inject.id === currentUpdatedNode.id)!.position.x = currentUpdatedNode.position.x; } setCurrentUpdatedNode(null); @@ -368,7 +369,8 @@ const ChainedTimelineFlow: FunctionComponent = ({ inject_id: node.id, inject_depends_duration: convertCoordinatesToTime(node.position), inject_depends_on: injectFromMap.inject_depends_on !== null - ? injectFromMap.inject_depends_on : null, + ? injectFromMap.inject_depends_on + : null, }; onUpdateInject([inject]); setCurrentUpdatedNode(node); @@ -380,7 +382,7 @@ const ChainedTimelineFlow: FunctionComponent = ({ * Small function to do some stuff when draggind is starting */ const nodeDragStart = () => { - const nodesList = nodes.filter((currentNode) => currentNode.type !== 'phantom'); + const nodesList = nodes.filter(currentNode => currentNode.type !== 'phantom'); setNodes(nodesList); }; @@ -403,8 +405,8 @@ const ChainedTimelineFlow: FunctionComponent = ({ }; const connect = (connection: Connection) => { - const inject = injects.find((currentInject) => currentInject.inject_id === connection.target); - const injectParent = injects.find((currentInject) => currentInject.inject_id === connection.source); + const inject = injects.find(currentInject => currentInject.inject_id === connection.target); + const injectParent = injects.find(currentInject => currentInject.inject_id === connection.source); if (inject !== undefined && injectParent !== undefined && inject.inject_depends_duration > injectParent.inject_depends_duration) { const newDependsOn: InjectDependency = { dependency_relationship: { @@ -441,12 +443,12 @@ const ChainedTimelineFlow: FunctionComponent = ({ setDraggingOnGoing(true); const { position } = node; const { data } = node; - const dependsOn = nodes.find((currentNode) => (data.inject?.inject_depends_on !== null - && data.inject?.inject_depends_on!.find((value) => value.dependency_relationship?.inject_parent_id === currentNode.id))); + const dependsOn = nodes.find(currentNode => (data.inject?.inject_depends_on !== null + && data.inject?.inject_depends_on!.find(value => value.dependency_relationship?.inject_parent_id === currentNode.id))); const dependsTo = nodes - .filter((currentNode) => (currentNode.data.inject?.inject_depends_on !== undefined - && currentNode.data.inject?.inject_depends_on !== null - && currentNode.data.inject?.inject_depends_on.find((value) => value.dependency_relationship?.inject_parent_id === node.id) !== undefined)) + .filter(currentNode => (currentNode.data.inject?.inject_depends_on !== undefined + && currentNode.data.inject?.inject_depends_on !== null + && currentNode.data.inject?.inject_depends_on.find(value => value.dependency_relationship?.inject_parent_id === node.id) !== undefined)) .sort((a, b) => a.data.inject!.inject_depends_duration - b.data.inject!.inject_depends_duration)[0]; const aSecond = gapSize / (minutesPerGapAllowed[minutesPerGapIndex] * 60); if (dependsOn?.position && position.x <= dependsOn?.position.x) { @@ -535,7 +537,7 @@ const ChainedTimelineFlow: FunctionComponent = ({ * @param incrementIndex increment or decrement the index to get the current minutesPerGap */ const updateMinutesPerGap = (incrementIndex: number) => { - const nodesList = nodes.filter((currentNode) => currentNode.type !== 'phantom'); + const nodesList = nodes.filter(currentNode => currentNode.type !== 'phantom'); setNodes(nodesList); setDraggingOnGoing(true); setMinutesPerGapIndex(minutesPerGapIndex + incrementIndex); @@ -544,7 +546,7 @@ const ChainedTimelineFlow: FunctionComponent = ({ const onReconnectEnd = (event: React.MouseEvent, edge: Edge, handleType: 'source' | 'target', connectionState: Omit) => { if (!connectionState.isValid) { - const inject = injects.find((currentInject) => currentInject.inject_id === edge.target); + const inject = injects.find(currentInject => currentInject.inject_id === edge.target); if (inject !== undefined) { const injectToUpdate = { ...injectsMap[inject.inject_id], @@ -556,15 +558,15 @@ const ChainedTimelineFlow: FunctionComponent = ({ } } else if (handleType === 'source') { const updates = []; - const injectToRemove = injects.find((currentInject) => currentInject.inject_id === edge.target); - const injectToUpdate = injects.find((currentInject) => currentInject.inject_id === connectionState.toNode?.id); + const injectToRemove = injects.find(currentInject => currentInject.inject_id === edge.target); + const injectToUpdate = injects.find(currentInject => currentInject.inject_id === connectionState.toNode?.id); - const parent = injects.find((currentInject) => currentInject.inject_id === connectionState.fromNode?.id); + const parent = injects.find(currentInject => currentInject.inject_id === connectionState.fromNode?.id); if (parent !== undefined - && injectToUpdate !== undefined - && injectToRemove !== undefined - && parent.inject_depends_duration < injectToUpdate.inject_depends_duration) { + && injectToUpdate !== undefined + && injectToRemove !== undefined + && parent.inject_depends_duration < injectToUpdate.inject_depends_duration) { const injectToRemoveEdge = { ...injectsMap[injectToRemove.inject_id], inject_injector_contract: injectToRemove.inject_injector_contract.injector_contract_id, @@ -597,8 +599,8 @@ const ChainedTimelineFlow: FunctionComponent = ({ onUpdateInject(updates); } } else { - const inject = injects.find((currentInject) => currentInject.inject_id === edge.target); - const parent = injects.find((currentInject) => currentInject.inject_id === connectionState.toNode?.id); + const inject = injects.find(currentInject => currentInject.inject_id === edge.target); + const parent = injects.find(currentInject => currentInject.inject_id === connectionState.toNode?.id); if (inject !== undefined && parent !== undefined && parent.inject_depends_duration < inject.inject_depends_duration) { const newDependsOn: InjectDependency = { dependency_relationship: { @@ -668,7 +670,9 @@ const ChainedTimelineFlow: FunctionComponent = ({ onReconnectEnd={onReconnectEnd} edgesReconnectable={true} > -
    = ({ showFitView={false} showZoom={false} showInteractive={false} - orientation={'horizontal'} + orientation="horizontal" >
    reactFlow.fitView({ duration: 500 })} > - +
    @@ -705,7 +709,7 @@ const ChainedTimelineFlow: FunctionComponent = ({ disabled={minutesPerGapAllowed.length - 1 === minutesPerGapIndex} onClick={() => updateMinutesPerGap(1)} > - +
    @@ -715,7 +719,7 @@ const ChainedTimelineFlow: FunctionComponent = ({ disabled={minutesPerGapIndex === 0} onClick={() => updateMinutesPerGap(-1)} > - + @@ -740,8 +744,7 @@ const ChainedTimelineFlow: FunctionComponent = ({ /> - ) : null - } + ) : null} ); }; diff --git a/openbas-front/src/components/CheckboxField.js b/openbas-front/src/components/CheckboxField.js index b80153cc76..17a230c3ed 100644 --- a/openbas-front/src/components/CheckboxField.js +++ b/openbas-front/src/components/CheckboxField.js @@ -1,5 +1,5 @@ +import { Checkbox as MuiCheckbox, FormControl, FormControlLabel, FormGroup, FormHelperText } from '@mui/material'; import { Field } from 'react-final-form'; -import { FormGroup, FormControlLabel, Checkbox as MuiCheckbox, FormHelperText, FormControl } from '@mui/material'; const renderCheckbox = ({ label, @@ -12,7 +12,7 @@ const renderCheckbox = ({ { @@ -20,7 +20,7 @@ const renderCheckbox = ({ }} {...others} /> - } + )} disabled={disabled} label={label} /> @@ -32,7 +32,7 @@ const renderCheckbox = ({ /** * @deprecated The component use old form libnary react-final-form */ -const CheckboxField = (props) => ( +const CheckboxField = props => ( ); diff --git a/openbas-front/src/components/ColorPickerField.tsx b/openbas-front/src/components/ColorPickerField.tsx index 5486e9ae76..c1f3db0f4a 100644 --- a/openbas-front/src/components/ColorPickerField.tsx +++ b/openbas-front/src/components/ColorPickerField.tsx @@ -1,17 +1,17 @@ +import { ColorLensOutlined } from '@mui/icons-material'; +import { IconButton, InputAdornment, Popover, TextField as MuiTextField, TextFieldProps } from '@mui/material'; import * as React from 'react'; -import { TextField as MuiTextField, IconButton, Popover, InputAdornment, TextFieldProps } from '@mui/material'; // @ts-expect-error react-color does not have types import { SketchPicker } from 'react-color'; -import { ColorLensOutlined } from '@mui/icons-material'; import { Control, useController } from 'react-hook-form'; type Props = Omit & { - control: Control, - name: string + control: Control; + name: string; }; interface Color { - hex: string + hex: string; } const ColorPickerField: React.FC = (props) => { diff --git a/openbas-front/src/components/Countdown.js b/openbas-front/src/components/Countdown.js index 4b1704a18d..c21ae73dad 100644 --- a/openbas-front/src/components/Countdown.js +++ b/openbas-front/src/components/Countdown.js @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react'; + import { splitDuration } from '../utils/Time'; const Countdown = ({ date, paused }) => { @@ -34,7 +35,13 @@ const Countdown = ({ date, paused }) => { }); return ( - {duration.days}:{duration.hours}:{duration.minutes}:{duration.seconds} + {duration.days} + : + {duration.hours} + : + {duration.minutes} + : + {duration.seconds} ); }; diff --git a/openbas-front/src/components/CountryField.js b/openbas-front/src/components/CountryField.js index e1fca7a10b..c13fc9d364 100644 --- a/openbas-front/src/components/CountryField.js +++ b/openbas-front/src/components/CountryField.js @@ -1,11 +1,12 @@ -import { Component } from 'react'; -import * as R from 'ramda'; import { FlagOutlined } from '@mui/icons-material'; import { Box } from '@mui/material'; import { withStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { Component } from 'react'; + +import { countryOptions } from '../utils/Option'; import Autocomplete from './Autocomplete'; import inject18n from './i18n'; -import { countryOptions } from '../utils/Option'; const styles = () => ({ icon: { diff --git a/openbas-front/src/components/CustomTimelineBackground.tsx b/openbas-front/src/components/CustomTimelineBackground.tsx index baee5803c1..6e24d2e78f 100644 --- a/openbas-front/src/components/CustomTimelineBackground.tsx +++ b/openbas-front/src/components/CustomTimelineBackground.tsx @@ -1,13 +1,13 @@ -import { CSSProperties, memo, useRef } from 'react'; +import { useTheme } from '@mui/styles'; +import { type BackgroundProps, type ReactFlowState, useStore } from '@xyflow/react'; import cc from 'classcat'; +import { CSSProperties, memo, useRef } from 'react'; import { shallow } from 'zustand/shallow'; -import { useStore, type ReactFlowState, type BackgroundProps } from '@xyflow/react'; -import { useTheme } from '@mui/styles'; import type { Theme } from './Theme'; interface Props extends BackgroundProps { - minutesPerGap: number, + minutesPerGap: number; } const selector = (s: ReactFlowState) => ({ transform: s.transform, patternId: `pattern-${s.rfId}` }); @@ -66,9 +66,11 @@ function BackgroundComponent({ patternUnits="userSpaceOnUse" patternTransform={`translate(-${patternOffset[0]},-${patternOffset[1]})`} > - - + ); } diff --git a/openbas-front/src/components/CustomTimelinePanel.tsx b/openbas-front/src/components/CustomTimelinePanel.tsx index 8b20a9864e..49abba5714 100644 --- a/openbas-front/src/components/CustomTimelinePanel.tsx +++ b/openbas-front/src/components/CustomTimelinePanel.tsx @@ -1,10 +1,11 @@ -import { CSSProperties, memo, useEffect, useState } from 'react'; -import { shallow } from 'zustand/shallow'; -import { useStore, type ReactFlowState, type BackgroundProps, Panel, Viewport } from '@xyflow/react'; import { makeStyles, useTheme } from '@mui/styles'; +import { type BackgroundProps, Panel, type ReactFlowState, useStore, Viewport } from '@xyflow/react'; import moment from 'moment-timezone'; -import type { Theme } from './Theme'; +import { CSSProperties, memo, useEffect, useState } from 'react'; +import { shallow } from 'zustand/shallow'; + import { useFormatter } from './i18n'; +import type { Theme } from './Theme'; const selector = (s: ReactFlowState) => ({ transform: s.transform, patternId: `pattern-${s.rfId}` }); @@ -22,15 +23,15 @@ const useStyles = makeStyles(() => ({ })); interface Props extends BackgroundProps { - minutesPerGap: number, - gap?: number | [number, number], - viewportData?: Viewport, - startDate: string | undefined, + minutesPerGap: number; + gap?: number | [number, number]; + viewportData?: Viewport; + startDate: string | undefined; } interface TimelineDates { - parsedDate: string, - dateIndex: number, + parsedDate: string; + dateIndex: number; } /** @@ -80,7 +81,8 @@ function BackgroundComponent({ newParsedDates.push({ parsedDate: viewportData === undefined || viewportData?.zoom > 0.5 - ? `${fld(date.toDate())} - ${ft(date.toDate())}` : `${vnsdt(date.toDate())}`, + ? `${fld(date.toDate())} - ${ft(date.toDate())}` + : `${vnsdt(date.toDate())}`, dateIndex: Math.round((date.unix() - beginningDate.unix()) / (minutesPerGap * 3 * 60)), }); } diff --git a/openbas-front/src/components/CustomTooltip.js b/openbas-front/src/components/CustomTooltip.js index 3da0bce881..72ba49021f 100644 --- a/openbas-front/src/components/CustomTooltip.js +++ b/openbas-front/src/components/CustomTooltip.js @@ -1,5 +1,5 @@ -import { useState } from 'react'; import { Tooltip } from '@mui/material'; +import { useState } from 'react'; export default function CustomTooltip({ children, ...rest }) { const [renderTooltip, setRenderTooltip] = useState(false); diff --git a/openbas-front/src/components/DateTimePicker.js b/openbas-front/src/components/DateTimePicker.js index 826e0380a5..d176a2dc0d 100644 --- a/openbas-front/src/components/DateTimePicker.js +++ b/openbas-front/src/components/DateTimePicker.js @@ -1,6 +1,6 @@ -import { useIntl } from 'react-intl'; import { DateTimePicker as MuiDateTimePicker } from '@mui/x-date-pickers'; import { Field } from 'react-final-form'; +import { useIntl } from 'react-intl'; const dateFormatsMap = { 'en-us': 'yyyy-MM-dd', @@ -27,10 +27,9 @@ const DateTimePickerBase = ({ onBlur={() => onBlur(value ? new Date(value).toISOString() : null)} inputFormat={dateFormatsMap[intl.locale] || 'yyyy-MM-dd'} error={error && touched} - onChange={(date) => (Date.parse(date) + onChange={date => (Date.parse(date) ? inputProps.onChange(date.toISOString()) - : inputProps.onChange(null)) - } + : inputProps.onChange(null))} slotProps={{ textField: { ...textFieldProps, @@ -45,7 +44,7 @@ const DateTimePickerBase = ({ /** * @deprecated The component use old form libnary react-final-form */ -const DateTimePicker = (props) => ( +const DateTimePicker = props => ( ); diff --git a/openbas-front/src/components/DeprecatedColorPickerField.js b/openbas-front/src/components/DeprecatedColorPickerField.js index 57c265116f..38289e7efd 100644 --- a/openbas-front/src/components/DeprecatedColorPickerField.js +++ b/openbas-front/src/components/DeprecatedColorPickerField.js @@ -1,8 +1,8 @@ +import { ColorLensOutlined } from '@mui/icons-material'; +import { IconButton, InputAdornment, Popover, TextField as MuiTextField } from '@mui/material'; import { useState } from 'react'; -import { Field } from 'react-final-form'; -import { TextField as MuiTextField, IconButton, Popover, InputAdornment } from '@mui/material'; import { SketchPicker } from 'react-color'; -import { ColorLensOutlined } from '@mui/icons-material'; +import { Field } from 'react-final-form'; const ColorPickerFieldBase = ({ label, @@ -28,7 +28,7 @@ const ColorPickerFieldBase = ({ setAnchorEl(event.currentTarget)} + onClick={event => setAnchorEl(event.currentTarget)} disabled={others.disabled} > @@ -52,7 +52,7 @@ const ColorPickerFieldBase = ({ > handleChange(color)} + onChangeComplete={color => handleChange(color)} /> @@ -62,7 +62,7 @@ const ColorPickerFieldBase = ({ /** * @deprecated The component use old form libnary react-final-form */ -const DeprecatedColorPickerField = (props) => ( +const DeprecatedColorPickerField = props => ( ); diff --git a/openbas-front/src/components/DocumentField.js b/openbas-front/src/components/DocumentField.js index 69ec447ca5..535ea43a15 100644 --- a/openbas-front/src/components/DocumentField.js +++ b/openbas-front/src/components/DocumentField.js @@ -1,13 +1,14 @@ -import { Component } from 'react'; -import * as R from 'ramda'; import { Box } from '@mui/material'; import { withStyles } from '@mui/styles'; -import { connect } from 'react-redux'; import { FileOutline } from 'mdi-material-ui'; +import * as R from 'ramda'; +import { Component } from 'react'; +import { connect } from 'react-redux'; + import { addDocument, fetchDocuments } from '../actions/Document'; +import { storeHelper } from '../actions/Schema'; import Autocomplete from './Autocomplete'; import inject18n from './i18n'; -import { storeHelper } from '../actions/Schema'; const styles = () => ({ icon: { @@ -37,7 +38,7 @@ class DocumentField extends Component { render() { const { t, name, documents, classes } = this.props; const documentsOptions = R.map( - (n) => ({ + n => ({ id: n.document_id, label: n.document_name, }), diff --git a/openbas-front/src/components/Error.js b/openbas-front/src/components/Error.js index 624841e0fa..3b77ad9ad2 100644 --- a/openbas-front/src/components/Error.js +++ b/openbas-front/src/components/Error.js @@ -1,6 +1,7 @@ -import * as React from 'react'; -import * as PropTypes from 'prop-types'; import { Alert, AlertTitle } from '@mui/material'; +import * as PropTypes from 'prop-types'; +import * as React from 'react'; + import { useFormatter } from './i18n'; class ErrorBoundaryComponent extends React.Component { @@ -38,7 +39,7 @@ const SimpleError = () => { export const errorWrapper = (Component) => { // eslint-disable-next-line react/display-name - return (routeProps) => ( + return routeProps => ( }> diff --git a/openbas-front/src/components/ExerciseField.js b/openbas-front/src/components/ExerciseField.js index 3773b87a6b..ab8afaef7d 100644 --- a/openbas-front/src/components/ExerciseField.js +++ b/openbas-front/src/components/ExerciseField.js @@ -1,11 +1,12 @@ -import { useDispatch } from 'react-redux'; import { Kayaking } from '@mui/icons-material'; import { Box } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import Autocomplete from './Autocomplete'; -import useDataLoader from '../utils/hooks/useDataLoader'; -import { useHelper } from '../store'; +import { useDispatch } from 'react-redux'; + import { fetchExercises } from '../actions/Exercise'; +import { useHelper } from '../store'; +import useDataLoader from '../utils/hooks/useDataLoader'; +import Autocomplete from './Autocomplete'; const useStyles = makeStyles(() => ({ icon: { @@ -28,12 +29,12 @@ const useStyles = makeStyles(() => ({ const ExerciseField = (props) => { const classes = useStyles(); const dispatch = useDispatch(); - const exercises = useHelper((helper) => helper.getExercises()); + const exercises = useHelper(helper => helper.getExercises()); useDataLoader(() => { dispatch(fetchExercises()); }); const { name, onKeyDown, style, label, placeholder } = props; - const exerciseOptions = (exercises || []).map((n) => ({ + const exerciseOptions = (exercises || []).map(n => ({ id: n.exercise_id, label: n.exercise_name, })); diff --git a/openbas-front/src/components/ExpandableHtml.js b/openbas-front/src/components/ExpandableHtml.js index caa4fa9cac..4b716bbaa6 100644 --- a/openbas-front/src/components/ExpandableHtml.js +++ b/openbas-front/src/components/ExpandableHtml.js @@ -1,8 +1,9 @@ -import { useState } from 'react'; -import * as PropTypes from 'prop-types'; -import parse from 'html-react-parser'; -import { ExpandMore, ExpandLess } from '@mui/icons-material'; +import { ExpandLess, ExpandMore } from '@mui/icons-material'; import { IconButton } from '@mui/material'; +import parse from 'html-react-parser'; +import * as PropTypes from 'prop-types'; +import { useState } from 'react'; + import { truncate } from '../utils/String'; const ExpandableHtml = (props) => { diff --git a/openbas-front/src/components/ExpandableMarkdown.tsx b/openbas-front/src/components/ExpandableMarkdown.tsx index 56971e4aaa..e008afac3a 100644 --- a/openbas-front/src/components/ExpandableMarkdown.tsx +++ b/openbas-front/src/components/ExpandableMarkdown.tsx @@ -1,6 +1,7 @@ -import { FunctionComponent, useState } from 'react'; import { ExpandLess, ExpandMore } from '@mui/icons-material'; import { IconButton } from '@mui/material'; +import { FunctionComponent, useState } from 'react'; + import { emptyFilled, truncate } from '../utils/String'; import MarkdownDisplay from './MarkdownDisplay'; @@ -8,7 +9,7 @@ interface ExpandableMarkdownProps { source?: string | null; limit?: number; showAll?: boolean; - markdownDOMId?: string, + markdownDOMId?: string; } const ExpandableMarkdown: FunctionComponent = ({ @@ -23,11 +24,11 @@ const ExpandableMarkdown: FunctionComponent = ({ return (
    {shouldBeTruncated && ( -
    - - {expand ? : } - -
    +
    + + {expand ? : } + +
    )}
    { diff --git a/openbas-front/src/components/ExportPdfButton.tsx b/openbas-front/src/components/ExportPdfButton.tsx index 2d6e2fdc6c..6e85e1d415 100644 --- a/openbas-front/src/components/ExportPdfButton.tsx +++ b/openbas-front/src/components/ExportPdfButton.tsx @@ -1,22 +1,22 @@ -import { useState } from 'react'; -import * as React from 'react'; import { Dialog, ToggleButton, Tooltip } from '@mui/material'; import { FilePdfBox } from 'mdi-material-ui'; import pdfMake from 'pdfmake/build/pdfmake'; import pdfFonts from 'pdfmake/build/vfs_fonts'; - -import { useDispatch } from 'react-redux'; import type { TDocumentDefinitions } from 'pdfmake/interfaces'; -import { useFormatter } from './i18n'; -import Loader from './Loader'; -import { useHelper } from '../store'; +import { useState } from 'react'; +import * as React from 'react'; +import { useDispatch } from 'react-redux'; + import type { UserHelper } from '../actions/helper'; +import { useHelper } from '../store'; import { MESSAGING$ } from '../utils/Environment'; +import { useFormatter } from './i18n'; +import Loader from './Loader'; pdfMake.vfs = pdfFonts.pdfMake.vfs; interface Props { - getPdfDocDefinition: ()=> Promise, + getPdfDocDefinition: () => Promise; pdfName: string; } @@ -65,12 +65,12 @@ const ExportPdfButton: React.FC = ({ getPdfDocDefinition, pdfName }) => { return (
    - + { diff --git a/openbas-front/src/components/FileField.js b/openbas-front/src/components/FileField.js index 8466ae3685..5ee5c41bd8 100644 --- a/openbas-front/src/components/FileField.js +++ b/openbas-front/src/components/FileField.js @@ -1,10 +1,11 @@ -import { useCallback } from 'react'; +import { Button, FormHelperText } from '@mui/material'; import * as R from 'ramda'; -import { Field } from 'react-final-form'; +import { useCallback } from 'react'; import { useDropzone } from 'react-dropzone'; -import { Button, FormHelperText } from '@mui/material'; -import { useFormatter } from './i18n'; +import { Field } from 'react-final-form'; + import { bytesFormat } from '../utils/Number'; +import { useFormatter } from './i18n'; const FileFieldInput = ({ input, dropZoneProps, filters, ...props }) => { const { t } = useFormatter(); @@ -12,7 +13,7 @@ const FileFieldInput = ({ input, dropZoneProps, filters, ...props }) => { (files) => { const isErroredFile = files.length > 0 && files.filter( - (f) => !filters || R.any((n) => f.type.includes(n), filters), + f => !filters || R.any(n => f.type.includes(n), filters), ).length === 0; if (!isErroredFile) { input.onChange(files); @@ -27,17 +28,20 @@ const FileFieldInput = ({ input, dropZoneProps, filters, ...props }) => { }); const isErroredFile = acceptedFiles.length > 0 && acceptedFiles.filter( - (f) => !filters || R.any((n) => f.type.includes(n), filters), + f => !filters || R.any(n => f.type.includes(n), filters), ).length === 0; const files = isErroredFile ? [ - - {t('This file type is not accepted here.')} - , - ] - : acceptedFiles.map((file) => ( + + {t('This file type is not accepted here.')} + , + ] + : acceptedFiles.map(file => ( - {file.path} -{bytesFormat(file.size).number} + {file.path} + {' '} + - + {bytesFormat(file.size).number} {bytesFormat(file.size).symbol} )); @@ -59,10 +63,11 @@ const FileField = ({ name, ...props }) => ( (touched && error ? ( - {error} - ) : null) - } + render={({ meta: { touched, error } }) => (touched && error + ? ( + {error} + ) + : null)} /> ); diff --git a/openbas-front/src/components/InjectContractComponent.tsx b/openbas-front/src/components/InjectContractComponent.tsx index fd8dabea8a..ec666d5e89 100644 --- a/openbas-front/src/components/InjectContractComponent.tsx +++ b/openbas-front/src/components/InjectContractComponent.tsx @@ -1,15 +1,16 @@ -import { FunctionComponent, useEffect, useState } from 'react'; -import * as React from 'react'; import { Autocomplete, SelectChangeEvent, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent, useEffect, useState } from 'react'; +import * as React from 'react'; import { FieldError } from 'react-hook-form'; + +import type { InjectorContractStore } from '../actions/injector_contracts/InjectorContract'; +import { searchInjectorContracts } from '../actions/InjectorContracts'; +import InjectIcon from '../admin/components/common/injects/InjectIcon'; import type { FilterGroup } from '../utils/api-types'; +import { isNotEmptyField } from '../utils/utils'; import { initSorting, Page } from './common/queryable/Page'; import { useFormatter } from './i18n'; -import InjectIcon from '../admin/components/common/injects/InjectIcon'; -import { isNotEmptyField } from '../utils/utils'; -import { searchInjectorContracts } from '../actions/InjectorContracts'; -import type { InjectorContractStore } from '../actions/injector_contracts/InjectorContract'; const useStyles = makeStyles(() => ({ icon: { @@ -46,7 +47,7 @@ const InjectContractComponent: FunctionComponent = ({ const selectChangeEvent = event as SelectChangeEvent; const val = selectChangeEvent?.target.value ?? ''; return contracts.filter( - (type) => type.injector_contract_id.includes(val) + type => type.injector_contract_id.includes(val) || tPick(type.injector_contract_labels).includes(val), ); }; @@ -88,9 +89,9 @@ const InjectContractComponent: FunctionComponent = ({ openOnFocus autoHighlight noOptionsText={t('No available options')} - getOptionLabel={(option) => tPick(option.injector_contract_labels)} + getOptionLabel={option => tPick(option.injector_contract_labels)} renderInput={ - (params) => ( + params => ( = ({ ) } options={contracts} - value={contracts.find((i) => i.injector_contract_id === value) ?? null} + value={contracts.find(i => i.injector_contract_id === value) ?? null} onChange={(_event, injectorContract) => { setValue(injectorContract?.injector_contract_id); onChange(injectorContract?.injector_contract_id); }} - onInputChange={(event) => searchContract(event)} + onInputChange={event => searchContract(event)} renderOption={(props, option) => (
  • diff --git a/openbas-front/src/components/ItemBoolean.js b/openbas-front/src/components/ItemBoolean.js index f92d34c120..14e3735a9a 100644 --- a/openbas-front/src/components/ItemBoolean.js +++ b/openbas-front/src/components/ItemBoolean.js @@ -1,7 +1,8 @@ -import * as PropTypes from 'prop-types'; -import { withStyles, useTheme } from '@mui/styles'; import { Chip, CircularProgress, Tooltip } from '@mui/material'; +import { useTheme, withStyles } from '@mui/styles'; +import * as PropTypes from 'prop-types'; import { compose } from 'ramda'; + import inject18n from './i18n'; const styles = () => ({ @@ -34,7 +35,7 @@ const styles = () => ({ }, }); -const computeInlineStyles = (theme) => ({ +const computeInlineStyles = theme => ({ green: { backgroundColor: 'rgba(76, 175, 80, 0.08)', color: '#4caf50', diff --git a/openbas-front/src/components/ItemCategory.tsx b/openbas-front/src/components/ItemCategory.tsx index b37467b415..5a863daca2 100644 --- a/openbas-front/src/components/ItemCategory.tsx +++ b/openbas-front/src/components/ItemCategory.tsx @@ -1,6 +1,6 @@ -import { FunctionComponent } from 'react'; import { AdsClickOutlined, AppsOutlined, BlurLinearOutlined, CrisisAlertOutlined, NewspaperOutlined, TourOutlined } from '@mui/icons-material'; import { AirFilter, CarShiftPattern, CrosshairsQuestion, DatabaseEyeOutline } from 'mdi-material-ui'; +import { FunctionComponent } from 'react'; interface ItemCategoryProps { category: string; @@ -11,7 +11,7 @@ interface ItemCategoryProps { const renderIcon = (category: string, size: 'small' | 'medium' | 'large' | 'inherit' | undefined) => { switch (category) { case 'global-crisis': - return ; + return ; case 'attack-scenario': return ; case 'media-pressure': diff --git a/openbas-front/src/components/ItemCopy.tsx b/openbas-front/src/components/ItemCopy.tsx index bc139a4634..e1636cd153 100644 --- a/openbas-front/src/components/ItemCopy.tsx +++ b/openbas-front/src/components/ItemCopy.tsx @@ -1,14 +1,15 @@ -import { FunctionComponent } from 'react'; import { ContentCopyOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; -import { useFormatter } from './i18n'; +import { FunctionComponent } from 'react'; + +import { truncate } from '../utils/String'; import { copyToClipboard } from '../utils/utils'; +import { useFormatter } from './i18n'; import type { Theme } from './Theme'; -import { truncate } from '../utils/String'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ containerInline: { position: 'relative', padding: '2px 25px 2px 5px', @@ -27,18 +28,18 @@ const useStyles = makeStyles((theme) => ({ textOverflow: 'ellipsis', }, icon: { - position: 'absolute', - right: 0, - cursor: 'pointer', + 'position': 'absolute', + 'right': 0, + 'cursor': 'pointer', '&:hover': { color: theme.palette.primary.main, }, }, iconInline: { - position: 'absolute', - right: 5, - top: 4, - cursor: 'pointer', + 'position': 'absolute', + 'right': 5, + 'top': 4, + 'cursor': 'pointer', '&:hover': { color: theme.palette.primary.main, }, diff --git a/openbas-front/src/components/ItemMainFocus.tsx b/openbas-front/src/components/ItemMainFocus.tsx index 8d199ef58c..bf5f713bf9 100644 --- a/openbas-front/src/components/ItemMainFocus.tsx +++ b/openbas-front/src/components/ItemMainFocus.tsx @@ -1,6 +1,6 @@ -import { FunctionComponent } from 'react'; import { AccountBalanceOutlined, FireTruckOutlined, ImportantDevicesOutlined, KeyboardVoiceOutlined, QuizOutlined } from '@mui/icons-material'; import { BookOpenBlankVariantOutline, FilterMultipleOutline } from 'mdi-material-ui'; +import { FunctionComponent } from 'react'; interface ItemMainFocusProps { mainFocus: string; @@ -11,7 +11,7 @@ interface ItemMainFocusProps { const renderIcon = (mainFocus: string, size: 'small' | 'medium' | 'large' | 'inherit' | undefined) => { switch (mainFocus) { case 'endpoint-protection': - return ; + return ; case 'web-filtering': return ; case 'incident-response': diff --git a/openbas-front/src/components/ItemNumberDifference.js b/openbas-front/src/components/ItemNumberDifference.js index 36159ba8ea..a3ec40da2c 100644 --- a/openbas-front/src/components/ItemNumberDifference.js +++ b/openbas-front/src/components/ItemNumberDifference.js @@ -1,11 +1,12 @@ -import { Component } from 'react'; -import { compose } from 'ramda'; -import * as PropTypes from 'prop-types'; +import { ArrowDownwardOutlined, ArrowForwardOutlined, ArrowUpwardOutlined } from '@mui/icons-material'; import { withStyles } from '@mui/styles'; -import { ArrowUpwardOutlined, ArrowDownwardOutlined, ArrowForwardOutlined } from '@mui/icons-material'; +import * as PropTypes from 'prop-types'; +import { compose } from 'ramda'; +import { Component } from 'react'; + import inject18n from './i18n'; -const styles = (theme) => ({ +const styles = theme => ({ diff: { float: 'left', margin: '23px 0 0 10px', @@ -56,7 +57,11 @@ class ItemNumberDifference extends Component { />
    {difference ?? ''}
    {description && ( -
    ({t(description)})
    +
    + ( + {t(description)} + ) +
    )}
    ); @@ -71,7 +76,11 @@ class ItemNumberDifference extends Component { />
    {difference}
    {description && ( -
    ({t(description)})
    +
    + ( + {t(description)} + ) +
    )}
  • ); @@ -84,7 +93,11 @@ class ItemNumberDifference extends Component { />
    {difference}
    {description && ( -
    ({t(description)})
    +
    + ( + {t(description)} + ) +
    )}
    ); diff --git a/openbas-front/src/components/ItemResult.tsx b/openbas-front/src/components/ItemResult.tsx index 6788f166a5..1d394fda00 100644 --- a/openbas-front/src/components/ItemResult.tsx +++ b/openbas-front/src/components/ItemResult.tsx @@ -1,6 +1,6 @@ -import { FunctionComponent } from 'react'; import { Chip, Tooltip } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent } from 'react'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. @@ -59,7 +59,7 @@ interface ItemStatusProps { label: string; status?: string | null; variant?: 'inList'; - isInject?: boolean, + isInject?: boolean; } const computeStatusStyle = (status: string | undefined | null) => { diff --git a/openbas-front/src/components/ItemSeverity.tsx b/openbas-front/src/components/ItemSeverity.tsx index e4848c816a..3f4c07c990 100644 --- a/openbas-front/src/components/ItemSeverity.tsx +++ b/openbas-front/src/components/ItemSeverity.tsx @@ -1,6 +1,6 @@ -import { FunctionComponent } from 'react'; import { Chip } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent } from 'react'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. diff --git a/openbas-front/src/components/ItemStatus.tsx b/openbas-front/src/components/ItemStatus.tsx index 781c944f27..8f95869103 100644 --- a/openbas-front/src/components/ItemStatus.tsx +++ b/openbas-front/src/components/ItemStatus.tsx @@ -1,6 +1,7 @@ -import { FunctionComponent } from 'react'; import { Chip, Tooltip } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent } from 'react'; + import { useFormatter } from './i18n'; // Deprecated - https://mui.com/system/styles/basics/ @@ -64,7 +65,7 @@ interface ItemStatusProps { label: string; status?: string | null; variant?: 'inList'; - isInject?: boolean, + isInject?: boolean; } const computeStatusStyle = (status: string | undefined | null) => { diff --git a/openbas-front/src/components/ItemTags.js b/openbas-front/src/components/ItemTags.js index 3727a0fcb8..51b14d718f 100644 --- a/openbas-front/src/components/ItemTags.js +++ b/openbas-front/src/components/ItemTags.js @@ -1,12 +1,13 @@ -import { forwardRef } from 'react'; +import { Chip, Slide, Tooltip } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; -import { makeStyles, useTheme } from '@mui/styles'; -import { Chip, Slide, Tooltip } from '@mui/material'; -import { hexToRGB } from '../utils/Colors'; -import { useFormatter } from './i18n'; +import { forwardRef } from 'react'; + import { useHelper } from '../store'; +import { hexToRGB } from '../utils/Colors'; import { getLabelOfRemainingItems, getRemainingItemsCount, getVisibleItems, truncate } from '../utils/String'; +import { useFormatter } from './i18n'; const Transition = forwardRef((props, ref) => ( @@ -50,7 +51,7 @@ const ItemTags = (props) => { } const resolvedTags = useHelper((helper) => { const allTags = helper.getTags() ?? []; - return allTags.filter((tag) => (tags ?? []).includes(tag.tag_id)); + return allTags.filter(tag => (tags ?? []).includes(tag.tag_id)); }); const orderedTags = R.sortWith([R.ascend(R.prop('tag_name'))], resolvedTags); @@ -62,37 +63,38 @@ const ItemTags = (props) => {
    {visibleTags.length > 0 ? (visibleTags.map( - (tag, index) => ( - - - - - - ), - )) : ( - - )} + (tag, index) => ( + + + + + + ), + )) : ( + + )} {remainingTagsCount && remainingTagsCount > 0 && ( ({ interface Props { targets: InjectTargetWithResult[] | undefined; - variant?: string, + variant?: string; } const ItemTargets: FunctionComponent = ({ @@ -41,17 +42,17 @@ const ItemTargets: FunctionComponent = ({ const remainingTargetsCount = getRemainingItemsCount(targets, visibleTargets); if (!targets || targets.length === 0) { - return ; + return ; } const getIcon = (type: string) => { if (type === 'ASSETS') { - return ; + return ; } if (type === 'ASSETS_GROUPS') { - return ; + return ; } - return ; // Teams + return ; // Teams }; return ( diff --git a/openbas-front/src/components/KillChainPhaseField.js b/openbas-front/src/components/KillChainPhaseField.js index 099a06fd41..0bf0684608 100644 --- a/openbas-front/src/components/KillChainPhaseField.js +++ b/openbas-front/src/components/KillChainPhaseField.js @@ -1,14 +1,15 @@ -import { Component } from 'react'; -import * as R from 'ramda'; import { RouteOutlined } from '@mui/icons-material'; -import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; +import { Box, Dialog, DialogContent, DialogTitle } from '@mui/material'; import { withStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { Component } from 'react'; import { connect } from 'react-redux'; + +import { addKillChainPhase, fetchKillChainPhases } from '../actions/KillChainPhase'; +import { storeHelper } from '../actions/Schema'; import KillChainPhaseForm from '../admin/components/settings/kill_chain_phases/KillChainPhaseForm'; -import { fetchKillChainPhases, addKillChainPhase } from '../actions/KillChainPhase'; import Autocomplete from './Autocomplete'; import inject18n from './i18n'; -import { storeHelper } from '../actions/Schema'; const styles = () => ({ icon: { @@ -75,7 +76,7 @@ class KillChainPhaseField extends Component { userAdmin, } = this.props; const killChainPhasesOptions = killChainPhases.map( - (n) => ({ + n => ({ id: n.phase_id, label: `[${n.phase_kill_chain_name}] ${n.phase_name}`, }), diff --git a/openbas-front/src/components/Loader.js b/openbas-front/src/components/Loader.js index 34d495f514..21566f4c60 100644 --- a/openbas-front/src/components/Loader.js +++ b/openbas-front/src/components/Loader.js @@ -1,7 +1,7 @@ -import { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { withStyles } from '@mui/styles'; import { CircularProgress } from '@mui/material'; +import { withStyles } from '@mui/styles'; +import * as PropTypes from 'prop-types'; +import { Component } from 'react'; const styles = () => ({ container: { diff --git a/openbas-front/src/components/MarkdownDisplay.tsx b/openbas-front/src/components/MarkdownDisplay.tsx index 05cab5e890..21e99cf7bb 100644 --- a/openbas-front/src/components/MarkdownDisplay.tsx +++ b/openbas-front/src/components/MarkdownDisplay.tsx @@ -1,14 +1,15 @@ -import Markdown from 'react-markdown'; -import remarkParse from 'remark-parse'; -import remarkFlexibleMarkers from 'remark-flexible-markers'; import { useTheme } from '@mui/styles'; import { FunctionComponent, SyntheticEvent, useState } from 'react'; +import Markdown from 'react-markdown'; +import type { PluggableList } from 'react-markdown/lib'; +import remarkFlexibleMarkers from 'remark-flexible-markers'; import remarkGfm from 'remark-gfm'; -import type { Theme } from './Theme'; +import remarkParse from 'remark-parse'; + import { truncate } from '../utils/String'; import ExternalLinkPopover from './ExternalLinkPopover'; import FieldOrEmpty from './FieldOrEmpty'; -import type { PluggableList } from 'react-markdown/lib'; +import type { Theme } from './Theme'; export const MarkDownComponents = ( theme: Theme, @@ -59,7 +60,7 @@ interface MarkdownWithRedirectionWarningProps { } const MarkdownDisplay: FunctionComponent< -MarkdownWithRedirectionWarningProps + MarkdownWithRedirectionWarningProps > = ({ content, expand, @@ -167,7 +168,7 @@ MarkdownWithRedirectionWarningProps } return ( -
    browseLinkWarning(event)} style={{ wordBreak: 'break-word' }}> +
    browseLinkWarning(event)} style={{ wordBreak: 'break-word' }}> {remarkGfmPlugin ? remarkGfmMarkdownElement() : markdownElement()}
    { diff --git a/openbas-front/src/components/OldAttackPatternField.js b/openbas-front/src/components/OldAttackPatternField.js index 8a6e674255..9403189bc4 100644 --- a/openbas-front/src/components/OldAttackPatternField.js +++ b/openbas-front/src/components/OldAttackPatternField.js @@ -1,14 +1,15 @@ -import { Component } from 'react'; -import * as R from 'ramda'; import { RouteOutlined } from '@mui/icons-material'; -import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; +import { Box, Dialog, DialogContent, DialogTitle } from '@mui/material'; import { withStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { Component } from 'react'; import { connect } from 'react-redux'; + +import { addAttackPattern, fetchAttackPatterns } from '../actions/AttackPattern'; +import { storeHelper } from '../actions/Schema'; import AttackPatternForm from '../admin/components/settings/attack_patterns/AttackPatternForm'; -import { fetchAttackPatterns, addAttackPattern } from '../actions/AttackPattern'; import Autocomplete from './Autocomplete'; import inject18n from './i18n'; -import { storeHelper } from '../actions/Schema'; const styles = () => ({ icon: { diff --git a/openbas-front/src/components/OrganizationField.js b/openbas-front/src/components/OrganizationField.js index f244028833..7ecb5ecb01 100644 --- a/openbas-front/src/components/OrganizationField.js +++ b/openbas-front/src/components/OrganizationField.js @@ -1,14 +1,15 @@ -import { Component } from 'react'; -import * as R from 'ramda'; import { DomainOutlined } from '@mui/icons-material'; -import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; +import { Box, Dialog, DialogContent, DialogTitle } from '@mui/material'; import { withStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { Component } from 'react'; import { connect } from 'react-redux'; + +import { addOrganization, fetchOrganizations } from '../actions/Organization'; +import { storeHelper } from '../actions/Schema'; import OrganizationForm from '../admin/components/teams/organizations/OrganizationForm'; -import { fetchOrganizations, addOrganization } from '../actions/Organization'; import Autocomplete from './Autocomplete'; import inject18n from './i18n'; -import { storeHelper } from '../actions/Schema'; const styles = () => ({ icon: { @@ -65,7 +66,7 @@ class OrganizationField extends Component { render() { const { t, name, organizations, classes } = this.props; const organizationsOptions = R.map( - (n) => ({ + n => ({ id: n.organization_id, label: n.organization_name, }), diff --git a/openbas-front/src/components/PayloadIcon.tsx b/openbas-front/src/components/PayloadIcon.tsx index f978559113..cd16764803 100644 --- a/openbas-front/src/components/PayloadIcon.tsx +++ b/openbas-front/src/components/PayloadIcon.tsx @@ -1,7 +1,7 @@ -import { FunctionComponent } from 'react'; +import { DnsOutlined, SubscriptionsOutlined } from '@mui/icons-material'; import { Tooltip } from '@mui/material'; import { ApplicationCogOutline, Console, FileImportOutline, LanConnect } from 'mdi-material-ui'; -import { DnsOutlined, SubscriptionsOutlined } from '@mui/icons-material'; +import { FunctionComponent } from 'react'; interface PayloadIconProps { payloadType: string; diff --git a/openbas-front/src/components/PlatformField.tsx b/openbas-front/src/components/PlatformField.tsx index 53d3d8a554..301de8e636 100644 --- a/openbas-front/src/components/PlatformField.tsx +++ b/openbas-front/src/components/PlatformField.tsx @@ -1,10 +1,11 @@ -import { FunctionComponent } from 'react'; -import { Box, Autocomplete, TextField } from '@mui/material'; +import { Autocomplete, Box, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent } from 'react'; import { FieldError } from 'react-hook-form'; + +import type { Option } from '../utils/Option'; import { useFormatter } from './i18n'; import PlatformIcon from './PlatformIcon'; -import type { Option } from '../utils/Option'; const useStyles = makeStyles(() => ({ icon: { @@ -53,7 +54,7 @@ const PlatformField: FunctionComponent = ({ autoHighlight noOptionsText={t('No available options')} renderInput={ - (params) => ( + params => ( = ({ /> ) } - value={platformsOptions.filter((p) => value?.map((v) => v.id)?.includes(p.id)) ?? null} + value={platformsOptions.filter(p => value?.map(v => v.id)?.includes(p.id)) ?? null} onChange={(_event, platform) => { onChange(platform); }} diff --git a/openbas-front/src/components/PlatformIcon.tsx b/openbas-front/src/components/PlatformIcon.tsx index a2fe6d7806..d22115e099 100644 --- a/openbas-front/src/components/PlatformIcon.tsx +++ b/openbas-front/src/components/PlatformIcon.tsx @@ -1,21 +1,22 @@ -import { FunctionComponent } from 'react'; -import { useTheme } from '@mui/styles'; import { PaletteMode, Tooltip } from '@mui/material'; -import type { Theme } from './Theme'; -import windowsDark from '../static/images/platforms/windows-dark.png'; -import windowsLight from '../static/images/platforms/windows-light.png'; -import linuxDark from '../static/images/platforms/linux-dark.png'; -import linuxLight from '../static/images/platforms/linux-light.png'; +import { useTheme } from '@mui/styles'; +import { FunctionComponent } from 'react'; + import browserDark from '../static/images/platforms/browser-dark.png'; import browserLight from '../static/images/platforms/browser-light.png'; +import internalDark from '../static/images/platforms/internal-dark.png'; +import internalLight from '../static/images/platforms/internal-light.png'; +import linuxDark from '../static/images/platforms/linux-dark.png'; +import linuxLight from '../static/images/platforms/linux-light.png'; import macosDark from '../static/images/platforms/macos-dark.png'; import macosLight from '../static/images/platforms/macos-light.png'; import serviceDark from '../static/images/platforms/service-dark.png'; import serviceLight from '../static/images/platforms/service-light.png'; -import internalDark from '../static/images/platforms/internal-dark.png'; -import internalLight from '../static/images/platforms/internal-light.png'; import unknownDark from '../static/images/platforms/unknown-dark.png'; import unknownLight from '../static/images/platforms/unknown-light.png'; +import windowsDark from '../static/images/platforms/windows-dark.png'; +import windowsLight from '../static/images/platforms/windows-light.png'; +import type { Theme } from './Theme'; interface PlatformIconProps { platform: string; diff --git a/openbas-front/src/components/PlayerField.js b/openbas-front/src/components/PlayerField.js index f8c352865a..0fc912be4f 100644 --- a/openbas-front/src/components/PlayerField.js +++ b/openbas-front/src/components/PlayerField.js @@ -1,15 +1,16 @@ -import { Component } from 'react'; -import * as R from 'ramda'; import { PersonOutlined } from '@mui/icons-material'; -import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; +import { Box, Dialog, DialogContent, DialogTitle } from '@mui/material'; import { withStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { Component } from 'react'; import { connect } from 'react-redux'; -import PlayerForm from '../admin/components/teams/players/PlayerForm'; + +import { storeHelper } from '../actions/Schema'; import { addPlayer, fetchPlayers } from '../actions/User'; +import PlayerForm from '../admin/components/teams/players/PlayerForm'; +import { resolveUserName } from '../utils/String'; import Autocomplete from './Autocomplete'; import inject18n from './i18n'; -import { storeHelper } from '../actions/Schema'; -import { resolveUserName } from '../utils/String'; const styles = () => ({ icon: { @@ -76,7 +77,7 @@ class PlayerField extends Component { noMargin, } = this.props; const usersOptions = R.map( - (n) => ({ + n => ({ id: n.user_id, label: resolveUserName(n), }), diff --git a/openbas-front/src/components/ProgressBarCountdown.js b/openbas-front/src/components/ProgressBarCountdown.js index 7a8696a5ba..72e1265519 100644 --- a/openbas-front/src/components/ProgressBarCountdown.js +++ b/openbas-front/src/components/ProgressBarCountdown.js @@ -1,5 +1,5 @@ -import { useEffect, useState } from 'react'; import { LinearProgress } from '@mui/material'; +import { useEffect, useState } from 'react'; const now = Math.round(Date.now() / 1000); diff --git a/openbas-front/src/components/RedirectManager.tsx b/openbas-front/src/components/RedirectManager.tsx index 7e146e9743..b6f3820d77 100644 --- a/openbas-front/src/components/RedirectManager.tsx +++ b/openbas-front/src/components/RedirectManager.tsx @@ -1,6 +1,7 @@ import { useEffect } from 'react'; import * as React from 'react'; import { useNavigate } from 'react-router-dom'; + import { MESSAGING$ } from '../utils/Environment'; interface Props { @@ -12,7 +13,7 @@ const RedirectManager: React.FC = ({ children }) => { useEffect(() => { const subscription = MESSAGING$.redirect.subscribe({ - next: (url) => navigate(url), + next: url => navigate(url), }); return () => subscription.unsubscribe(); diff --git a/openbas-front/src/components/RegexComponent.tsx b/openbas-front/src/components/RegexComponent.tsx index 785b94fc5b..77e28e20f3 100644 --- a/openbas-front/src/components/RegexComponent.tsx +++ b/openbas-front/src/components/RegexComponent.tsx @@ -1,6 +1,7 @@ -import * as React from 'react'; import { Autocomplete, TextField } from '@mui/material'; +import * as React from 'react'; import { FieldError } from 'react-hook-form'; + import alphabet from '../admin/components/settings/data_ingestion/AttributeUtils'; import { useFormatter } from './i18n'; @@ -34,7 +35,7 @@ const RegexComponent: React.FC = ({ autoHighlight noOptionsText={t('No available options')} renderInput={ - (params) => ( + params => ( = ({ ) } options={regexOptions} - value={regexOptions.find((r) => r === value) ?? null} + value={regexOptions.find(r => r === value) ?? null} onChange={(_event, newValue) => { setValue(newValue); onChange(newValue); diff --git a/openbas-front/src/components/SearchFilter.tsx b/openbas-front/src/components/SearchFilter.tsx index b3a33f1554..0a63c5825b 100644 --- a/openbas-front/src/components/SearchFilter.tsx +++ b/openbas-front/src/components/SearchFilter.tsx @@ -1,9 +1,10 @@ -import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import { TextField, InputAdornment } from '@mui/material'; import { Search } from '@mui/icons-material'; -import { useFormatter } from './i18n'; +import { InputAdornment, TextField } from '@mui/material'; +import { makeStyles } from '@mui/styles'; +import * as React from 'react'; + import { debounce } from '../utils/utils'; +import { useFormatter } from './i18n'; import type { Theme } from './Theme'; const useStyles = makeStyles((theme: Theme) => ({ @@ -45,15 +46,15 @@ const useStyles = makeStyles((theme: Theme) => ({ backgroundColor: theme.palette.background.default, }, searchInput: { - transition: theme.transitions.create('width'), - width: 200, + 'transition': theme.transitions.create('width'), + 'width': 200, '&:focus': { width: 350, }, }, searchInputSmall: { - transition: theme.transitions.create('width'), - width: 150, + 'transition': theme.transitions.create('width'), + 'width': 150, '&:focus': { width: 250, }, @@ -61,13 +62,13 @@ const useStyles = makeStyles((theme: Theme) => ({ })); interface Props { - keyword?: string, - onChange?: (value?: string) => void, - onSubmit?: (value?: string) => void, - variant?: string, - fullWidth?: boolean, - placeholder?: string, - debounceMs?: number, + keyword?: string; + onChange?: (value?: string) => void; + onSubmit?: (value?: string) => void; + variant?: string; + fullWidth?: boolean; + placeholder?: string; + debounceMs?: number; } const SearchInput: React.FC = ({ diff --git a/openbas-front/src/components/TagField.js b/openbas-front/src/components/TagField.js index d99ab5c0c9..6187323882 100644 --- a/openbas-front/src/components/TagField.js +++ b/openbas-front/src/components/TagField.js @@ -1,14 +1,15 @@ -import { Component } from 'react'; -import * as R from 'ramda'; import { LabelOutlined } from '@mui/icons-material'; -import { Box, Dialog, DialogTitle, DialogContent } from '@mui/material'; +import { Box, Dialog, DialogContent, DialogTitle } from '@mui/material'; import { withStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { Component } from 'react'; import { connect } from 'react-redux'; + +import { storeHelper } from '../actions/Schema'; +import { addTag, fetchTags } from '../actions/Tag'; import TagForm from '../admin/components/settings/tags/TagForm'; -import { fetchTags, addTag } from '../actions/Tag'; import Autocomplete from './Autocomplete'; import inject18n from './i18n'; -import { storeHelper } from '../actions/Schema'; const styles = () => ({ icon: { @@ -77,7 +78,7 @@ class TagField extends Component { disabled, } = this.props; const tagsOptions = R.map( - (n) => ({ + n => ({ id: n.tag_id, label: n.tag_name, color: n.tag_color, diff --git a/openbas-front/src/components/ThemeDark.ts b/openbas-front/src/components/ThemeDark.ts index 3809a79920..e4236d03dd 100644 --- a/openbas-front/src/components/ThemeDark.ts +++ b/openbas-front/src/components/ThemeDark.ts @@ -1,8 +1,8 @@ -import type { ExtendedThemeOptions } from './Theme'; -import LogoText from '../static/images/logo_text_dark.png'; import LogoCollapsed from '../static/images/logo_dark.png'; -import { fileUri } from '../utils/Environment'; +import LogoText from '../static/images/logo_text_dark.png'; import { hexToRGB } from '../utils/Colors'; +import { fileUri } from '../utils/Environment'; +import type { ExtendedThemeOptions } from './Theme'; const EE_COLOR = '#00f1bd'; @@ -152,12 +152,12 @@ const ThemeDark = ( scrollbarWidth: 'thin', }, body: { - scrollbarColor: `${background || THEME_DARK_DEFAULT_BACKGROUND} ${accent || THEME_DARK_DEFAULT_ACCENT}`, - scrollbarWidth: 'thin', - html: { + 'scrollbarColor': `${background || THEME_DARK_DEFAULT_BACKGROUND} ${accent || THEME_DARK_DEFAULT_ACCENT}`, + 'scrollbarWidth': 'thin', + 'html': { WebkitFontSmoothing: 'auto', }, - a: { + 'a': { color: primary || THEME_DARK_DEFAULT_PRIMARY, }, 'input:-webkit-autofill': { @@ -170,12 +170,12 @@ const ThemeDark = ( borderTopLeftRadius: 'inherit', borderTopRightRadius: 'inherit', }, - pre: { + 'pre': { fontFamily: 'Consolas, monaco, monospace', color: '#ffffff !important', background: `${accent || '#01478d'} !important`, }, - code: { + 'code': { fontFamily: 'Consolas, monaco, monospace', color: '#ffffff !important', background: `${accent || '#01478d'} !important`, @@ -184,10 +184,10 @@ const ThemeDark = ( fontWeight: 400, }, '.w-md-editor': { - boxShadow: 'none', - background: 'transparent', - borderBottom: '1px solid rgba(255, 255, 255, 0.7) !important', - transition: 'borderBottom .3s', + 'boxShadow': 'none', + 'background': 'transparent', + 'borderBottom': '1px solid rgba(255, 255, 255, 0.7) !important', + 'transition': 'borderBottom .3s', '&:hover': { borderBottom: '2px solid #ffffff !important', }, @@ -196,8 +196,8 @@ const ThemeDark = ( }, }, '.error .w-md-editor': { - border: '0 !important', - borderBottom: '2px solid #f44336 !important', + 'border': '0 !important', + 'borderBottom': '2px solid #f44336 !important', '&:hover': { border: '0 !important', borderBottom: '2px solid #f44336 !important', diff --git a/openbas-front/src/components/ThemeLight.ts b/openbas-front/src/components/ThemeLight.ts index ebe5ee83bf..9ca9dac3c3 100644 --- a/openbas-front/src/components/ThemeLight.ts +++ b/openbas-front/src/components/ThemeLight.ts @@ -1,7 +1,7 @@ -import LogoText from '../static/images/logo_text_light.png'; import LogoCollapsed from '../static/images/logo_light.png'; -import { fileUri } from '../utils/Environment'; +import LogoText from '../static/images/logo_text_light.png'; import { hexToRGB } from '../utils/Colors'; +import { fileUri } from '../utils/Environment'; import type { ExtendedThemeOptions } from './Theme'; const EE_COLOR = '#0c7e69'; @@ -147,12 +147,12 @@ const ThemeLight = ( scrollbarWidth: 'thin', }, body: { - scrollbarColor: `${accent || THEME_LIGHT_DEFAULT_ACCENT} ${paper || THEME_LIGHT_DEFAULT_PAPER}`, - scrollbarWidth: 'thin', - html: { + 'scrollbarColor': `${accent || THEME_LIGHT_DEFAULT_ACCENT} ${paper || THEME_LIGHT_DEFAULT_PAPER}`, + 'scrollbarWidth': 'thin', + 'html': { WebkitFontSmoothing: 'auto', }, - a: { + 'a': { color: primary || THEME_LIGHT_DEFAULT_PRIMARY, }, 'input:-webkit-autofill': { @@ -165,12 +165,12 @@ const ThemeLight = ( borderTopLeftRadius: 'inherit', borderTopRightRadius: 'inherit', }, - pre: { + 'pre': { fontFamily: 'Consolas, monaco, monospace', color: '#000000 !important', background: `${accent || '#c0dfff'} !important`, }, - code: { + 'code': { fontFamily: 'Consolas, monaco, monospace', color: '#000000 !important', background: `${accent || THEME_LIGHT_DEFAULT_ACCENT} !important`, @@ -179,10 +179,10 @@ const ThemeLight = ( fontWeight: 400, }, '.w-md-editor': { - boxShadow: 'none', - background: 'transparent', - borderBottom: '1px solid rgba(0, 0, 0, 0.87) !important', - transition: 'borderBottom .3s', + 'boxShadow': 'none', + 'background': 'transparent', + 'borderBottom': '1px solid rgba(0, 0, 0, 0.87) !important', + 'transition': 'borderBottom .3s', '&:hover': { borderBottom: '2px solid #000000 !important', }, @@ -191,8 +191,8 @@ const ThemeLight = ( }, }, '.error .w-md-editor': { - border: '0 !important', - borderBottom: '2px solid #f44336 !important', + 'border': '0 !important', + 'borderBottom': '2px solid #f44336 !important', '&:hover': { border: '0 !important', borderBottom: '2px solid #f44336 !important', diff --git a/openbas-front/src/components/Timeline.tsx b/openbas-front/src/components/Timeline.tsx index d706182d8c..475f97d46a 100644 --- a/openbas-front/src/components/Timeline.tsx +++ b/openbas-front/src/components/Timeline.tsx @@ -1,16 +1,17 @@ -import { Fragment, FunctionComponent } from 'react'; -import { makeStyles, useTheme } from '@mui/styles'; import { CastForEducationOutlined, CastOutlined } from '@mui/icons-material'; +import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; -import type { Inject, Team } from '../utils/api-types'; +import { Fragment, FunctionComponent } from 'react'; + import type { InjectStore } from '../actions/injects/Inject'; import InjectIcon from '../admin/components/common/injects/InjectIcon'; -import { splitDuration } from '../utils/Time'; -import type { Theme } from './Theme'; -import { useFormatter } from './i18n'; +import type { Inject, Team } from '../utils/api-types'; import useSearchAnFilter from '../utils/SortingFiltering'; import { truncate } from '../utils/String'; +import { splitDuration } from '../utils/Time'; import { isNotEmptyField } from '../utils/utils'; +import { useFormatter } from './i18n'; +import type { Theme } from './Theme'; const useStyles = makeStyles(() => ({ container: { @@ -85,9 +86,9 @@ const useStyles = makeStyles(() => ({ })); interface Props { - injects: InjectStore[], - teams: Team[], - onSelectInject: (injectId: string) => void, + injects: InjectStore[]; + teams: Team[]; + onSelectInject: (injectId: string) => void; } const Timeline: FunctionComponent = ({ injects, onSelectInject, teams }) => { @@ -98,7 +99,7 @@ const Timeline: FunctionComponent = ({ injects, onSelectInject, teams }) // Retrieve data const getInjectsPerTeam = (teamId: string) => { - return injects.filter((i) => i.inject_teams?.includes(teamId)); + return injects.filter(i => i.inject_teams?.includes(teamId)); }; const injectsPerTeam = R.mergeAll( @@ -111,18 +112,18 @@ const Timeline: FunctionComponent = ({ injects, onSelectInject, teams }) // Build map of technical Injects or without team /* eslint-disable @typescript-eslint/no-explicit-any */ - const injectsWithoutTeamMap = injects.reduce((acc: { [x: string]: any[]; }, inject: InjectStore) => { + const injectsWithoutTeamMap = injects.reduce((acc: { [x: string]: any[] }, inject: InjectStore) => { let keys: any[] = []; if (!allTeamInjectIds.has(inject.inject_id)) { if ( inject.inject_injector_contract?.convertedContent - && 'fields' in inject.inject_injector_contract.convertedContent - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - && inject.inject_injector_contract.convertedContent.fields.some( - (field: any) => field.key === 'teams', - ) + && 'fields' in inject.inject_injector_contract.convertedContent + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + && inject.inject_injector_contract.convertedContent.fields.some( + (field: any) => field.key === 'teams', + ) ) { keys = ['No teams']; } else if (inject.inject_type !== null) { @@ -203,121 +204,121 @@ const Timeline: FunctionComponent = ({ injects, onSelectInject, teams }) ? '1px dashed rgba(0, 0, 0, 0.15)' : '1px dashed rgba(255, 255, 255, 0.15)'; - return <> - {injects.length > 0 && sortedTeams.length > 0 ? ( -
    -
    - {sortedTeams.map((team) => ( -
    -
    - {team.team_name.startsWith('openbas_') ? ( - - ) : ( - - )} + return ( + <> + {injects.length > 0 && sortedTeams.length > 0 ? ( +
    +
    + {sortedTeams.map(team => ( +
    +
    + {team.team_name.startsWith('openbas_') ? ( + + ) : ( + + )}    - {team.team_name.startsWith('openbas_') - ? t(team.team_name) - : truncate(team.team_name, 20)} -
    -
    - ))} -
    -
    - {sortedTeams.map((team, index) => { - const injectsGroupedByTick = byTick( - filtering.filterAndSort(injectsMap[team.team_id] ?? []), - ); - return ( -
    - {Object.keys(injectsGroupedByTick).map((key, i) => { - const injectGroupPosition = (parseFloat(key) * 100) / totalDuration; - return ( -
    - {injectsGroupedByTick[key].map((inject: InjectStore) => { - const duration = splitDuration(inject.inject_depends_duration || 0); - const tooltipContent = ( - - {inject.inject_title} -
    - - {`${duration.days} ${t('d')}, ${duration.hours} ${t('h')}, ${duration.minutes} ${t('m')}`} - -
    - ); - return ( - handleSelectInject(inject.inject_id)} - done={inject.inject_status !== null} - disabled={!inject.inject_enabled} - size="small" - variant='timeline' - tooltip={tooltipContent} - /> - ); - }) - } -
    - ); - })} + {team.team_name.startsWith('openbas_') + ? t(team.team_name) + : truncate(team.team_name, 20)} +
    - ); - })} -
    - {ticks.map((tick, index) => { - const duration = splitDuration(tick); + ))} +
    +
    + {sortedTeams.map((team, index) => { + const injectsGroupedByTick = byTick( + filtering.filterAndSort(injectsMap[team.team_id] ?? []), + ); return (
    -
    - {index % 5 === 0 - ? `${duration.days} + {Object.keys(injectsGroupedByTick).map((key, i) => { + const injectGroupPosition = (parseFloat(key) * 100) / totalDuration; + return ( +
    + {injectsGroupedByTick[key].map((inject: InjectStore) => { + const duration = splitDuration(inject.inject_depends_duration || 0); + const tooltipContent = ( + + {inject.inject_title} +
    + + {`${duration.days} ${t('d')}, ${duration.hours} ${t('h')}, ${duration.minutes} ${t('m')}`} + +
    + ); + return ( + handleSelectInject(inject.inject_id)} + done={inject.inject_status !== null} + disabled={!inject.inject_enabled} + size="small" + variant="timeline" + tooltip={tooltipContent} + /> + ); + })} +
    + ); + })} +
    + ); + })} +
    + {ticks.map((tick, index) => { + const duration = splitDuration(tick); + return ( +
    +
    + {index % 5 === 0 + ? `${duration.days} ${t('d')}, ${duration.hours} ${t('h')}, ${duration.minutes} ${t('m')}` - : ''} -
    -
    - {index % 5 === 0 - ? `${duration.days} + : ''} +
    +
    + {index % 5 === 0 + ? `${duration.days} ${t('d')}, ${duration.hours} ${t('h')}, ${duration.minutes} ${t('m')}` - : ''} + : ''} +
    -
    - ); - })} + ); + })} +
    -
    - ) : null - } - ; + ) : null} + + ); }; export default Timeline; diff --git a/openbas-front/src/components/TruncatedText.js b/openbas-front/src/components/TruncatedText.js index 1924f38d21..ab8e4b9881 100644 --- a/openbas-front/src/components/TruncatedText.js +++ b/openbas-front/src/components/TruncatedText.js @@ -1,5 +1,6 @@ -import * as PropTypes from 'prop-types'; import { Tooltip } from '@mui/material'; +import * as PropTypes from 'prop-types'; + import { truncate } from '../utils/String'; const TruncatedText = (props) => { diff --git a/openbas-front/src/components/common/ButtonCreate.tsx b/openbas-front/src/components/common/ButtonCreate.tsx index d82ef5a8dc..8047523967 100644 --- a/openbas-front/src/components/common/ButtonCreate.tsx +++ b/openbas-front/src/components/common/ButtonCreate.tsx @@ -1,7 +1,7 @@ -import { FunctionComponent } from 'react'; import { Add } from '@mui/icons-material'; import { Fab } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { FunctionComponent } from 'react'; const useStyles = makeStyles(() => ({ createButton: { @@ -12,7 +12,7 @@ const useStyles = makeStyles(() => ({ })); interface Props { - onClick: () => void + onClick: () => void; } const ButtonCreate: FunctionComponent = ({ diff --git a/openbas-front/src/components/common/ButtonPopover.tsx b/openbas-front/src/components/common/ButtonPopover.tsx index ba8451ad12..0e292f2b54 100644 --- a/openbas-front/src/components/common/ButtonPopover.tsx +++ b/openbas-front/src/components/common/ButtonPopover.tsx @@ -1,7 +1,8 @@ -import { IconButton, Menu, MenuItem, ToggleButton, ToggleButtonProps } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; +import { IconButton, Menu, MenuItem, ToggleButton, ToggleButtonProps } from '@mui/material'; import { FunctionComponent, useState } from 'react'; import * as React from 'react'; + import { useFormatter } from '../i18n'; export interface PopoverEntry { @@ -33,35 +34,37 @@ const ButtonPopover: FunctionComponent = ({ return ( <> {variant === 'toggle' - && { ev.stopPropagation(); setAnchorEl(ev.currentTarget); }} style={{ ...buttonProps }} disabled={disabled} - > + > - } + )} {variant === 'icon' - && { ev.stopPropagation(); setAnchorEl(ev.currentTarget); }} style={{ ...buttonProps }} disabled={disabled} - > + > - } + )} ({ diff --git a/openbas-front/src/components/common/CodeBlock.tsx b/openbas-front/src/components/common/CodeBlock.tsx index a7c3a919d9..b9923cbd35 100644 --- a/openbas-front/src/components/common/CodeBlock.tsx +++ b/openbas-front/src/components/common/CodeBlock.tsx @@ -1,8 +1,8 @@ +import { Theme } from '@mui/material'; +import { useTheme } from '@mui/styles'; import { FunctionComponent } from 'react'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; import { a11yDark, coy } from 'react-syntax-highlighter/dist/esm/styles/prism'; -import { useTheme } from '@mui/styles'; -import { Theme } from '@mui/material'; interface CodeBlockProps { code: string; diff --git a/openbas-front/src/components/common/CustomFileUploader.tsx b/openbas-front/src/components/common/CustomFileUploader.tsx index 7fc0ac6195..b2868a9be6 100644 --- a/openbas-front/src/components/common/CustomFileUploader.tsx +++ b/openbas-front/src/components/common/CustomFileUploader.tsx @@ -1,12 +1,13 @@ -import { FormEvent, FunctionComponent, useEffect, useState } from 'react'; import { Box, Button, InputLabel } from '@mui/material'; import { Theme } from '@mui/material/styles/createTheme'; import { makeStyles } from '@mui/styles'; import classNames from 'classnames'; +import { FormEvent, FunctionComponent, useEffect, useState } from 'react'; import { FieldError, FieldErrors, FieldErrorsImpl, Merge } from 'react-hook-form'; -import VisuallyHiddenInput from './VisuallyHiddenInput'; -import { useFormatter } from '../i18n'; + import { truncate } from '../../utils/String'; +import { useFormatter } from '../i18n'; +import VisuallyHiddenInput from './VisuallyHiddenInput'; interface CustomFileUploadProps { name: string; @@ -17,13 +18,13 @@ interface CustomFileUploadProps { sizeLimit?: number; // in bytes } -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ box: { - width: '100%', - marginTop: '0.2rem', - paddingBottom: '0.35rem', - borderBottom: `0.1rem solid ${theme.palette.grey['400']}`, - cursor: 'default', + 'width': '100%', + 'marginTop': '0.2rem', + 'paddingBottom': '0.35rem', + 'borderBottom': `0.1rem solid ${theme.palette.grey['400']}`, + 'cursor': 'default', '&:hover': { borderBottom: '0.1rem solid white', }, @@ -87,7 +88,7 @@ const CustomFileUploader: FunctionComponent = ({ // check the file type; user might still provide something bypassing 'accept' // this will work only if accept is using MIME types only - const acceptedList = acceptMimeTypes?.split(',').map((a) => a.trim()) || []; + const acceptedList = acceptMimeTypes?.split(',').map(a => a.trim()) || []; if ( acceptedList.length > 0 && !!file?.type diff --git a/openbas-front/src/components/common/Dialog.tsx b/openbas-front/src/components/common/Dialog.tsx index 3d1dc4f4e7..e5ec3d496e 100644 --- a/openbas-front/src/components/common/Dialog.tsx +++ b/openbas-front/src/components/common/Dialog.tsx @@ -1,6 +1,7 @@ -import { Dialog as DialogMUI, DialogTitle, DialogContent, Breakpoint } from '@mui/material'; +import { Breakpoint, Dialog as DialogMUI, DialogContent, DialogTitle } from '@mui/material'; import { FunctionComponent } from 'react'; import * as React from 'react'; + import Transition from './Transition'; interface DialogProps { diff --git a/openbas-front/src/components/common/DialogDelete.tsx b/openbas-front/src/components/common/DialogDelete.tsx index 92120c916f..6c395d0441 100644 --- a/openbas-front/src/components/common/DialogDelete.tsx +++ b/openbas-front/src/components/common/DialogDelete.tsx @@ -1,7 +1,8 @@ -import { FunctionComponent } from 'react'; import { Button, Dialog as DialogMUI, DialogActions, DialogContent, DialogContentText } from '@mui/material'; -import Transition from './Transition'; +import { FunctionComponent } from 'react'; + import { useFormatter } from '../i18n'; +import Transition from './Transition'; interface DialogDeleteProps { open: boolean; diff --git a/openbas-front/src/components/common/DialogDuplicate.tsx b/openbas-front/src/components/common/DialogDuplicate.tsx index 8afb63f718..5fd43f104c 100644 --- a/openbas-front/src/components/common/DialogDuplicate.tsx +++ b/openbas-front/src/components/common/DialogDuplicate.tsx @@ -1,5 +1,6 @@ -import { FunctionComponent } from 'react'; import { Button, Dialog as DialogMUI, DialogActions, DialogContent, DialogContentText } from '@mui/material'; +import { FunctionComponent } from 'react'; + import { useFormatter } from '../i18n'; import Transition from './Transition'; diff --git a/openbas-front/src/components/common/DialogTest.tsx b/openbas-front/src/components/common/DialogTest.tsx index b3b4b97270..113ad6cf8c 100644 --- a/openbas-front/src/components/common/DialogTest.tsx +++ b/openbas-front/src/components/common/DialogTest.tsx @@ -1,5 +1,6 @@ +import { Alert, Button, Dialog, DialogActions, DialogContent, DialogContentText } from '@mui/material'; import { FunctionComponent } from 'react'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, Alert } from '@mui/material'; + import { useFormatter } from '../i18n'; import Transition from './Transition'; diff --git a/openbas-front/src/components/common/DialogWithCross.tsx b/openbas-front/src/components/common/DialogWithCross.tsx index be9e93aa1e..cdc302e85a 100644 --- a/openbas-front/src/components/common/DialogWithCross.tsx +++ b/openbas-front/src/components/common/DialogWithCross.tsx @@ -1,10 +1,11 @@ -import { Dialog as DialogMUI, DialogTitle, DialogContent, IconButton, Breakpoint } from '@mui/material'; import { Close } from '@mui/icons-material'; +import { Breakpoint, Dialog as DialogMUI, DialogContent, DialogTitle, IconButton } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { FunctionComponent } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import Transition from './Transition'; + import type { Theme } from '../Theme'; +import Transition from './Transition'; const useStyles = makeStyles((theme: Theme) => ({ header: { diff --git a/openbas-front/src/components/common/Drawer.tsx b/openbas-front/src/components/common/Drawer.tsx index 04702d059f..668929da45 100644 --- a/openbas-front/src/components/common/Drawer.tsx +++ b/openbas-front/src/components/common/Drawer.tsx @@ -1,11 +1,12 @@ +import { Close } from '@mui/icons-material'; import { Drawer as DrawerMUI, IconButton, type PaperProps, Typography } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { CSSProperties, FunctionComponent } from 'react'; import * as React from 'react'; -import { Close } from '@mui/icons-material'; -import { makeStyles } from '@mui/styles'; -import type { Theme } from '../Theme'; -import useAuth from '../../utils/hooks/useAuth'; + import { computeBannerSettings } from '../../public/components/systembanners/utils'; +import useAuth from '../../utils/hooks/useAuth'; +import type { Theme } from '../Theme'; const useStyles = makeStyles((theme: Theme) => ({ drawerPaperHalf: { @@ -53,9 +54,9 @@ interface DrawerProps { | React.ReactElement | null; variant?: 'full' | 'half'; - PaperProps?: PaperProps - disableEnforceFocus?: boolean - containerStyle?: CSSProperties + PaperProps?: PaperProps; + disableEnforceFocus?: boolean; + containerStyle?: CSSProperties; } const Drawer: FunctionComponent = ({ diff --git a/openbas-front/src/components/common/ExpendableText.tsx b/openbas-front/src/components/common/ExpendableText.tsx index ac28392e81..db4dd18852 100644 --- a/openbas-front/src/components/common/ExpendableText.tsx +++ b/openbas-front/src/components/common/ExpendableText.tsx @@ -1,6 +1,7 @@ -import { FunctionComponent, useState } from 'react'; import { ExpandLess, ExpandMore } from '@mui/icons-material'; import { IconButton } from '@mui/material'; +import { FunctionComponent, useState } from 'react'; + import { truncate } from '../../utils/String'; interface Props { diff --git a/openbas-front/src/components/common/ExportButton.tsx b/openbas-front/src/components/common/ExportButton.tsx index 52450400d8..67f6a2609a 100644 --- a/openbas-front/src/components/common/ExportButton.tsx +++ b/openbas-front/src/components/common/ExportButton.tsx @@ -1,10 +1,11 @@ -import { ToggleButton, Tooltip } from '@mui/material'; import { FileDownloadOutlined } from '@mui/icons-material'; +import { ToggleButton, Tooltip } from '@mui/material'; import { CSVLink } from 'react-csv'; + +import type { TagHelper } from '../../actions/helper'; +import { useHelper } from '../../store'; import { exportData } from '../../utils/Environment'; import { useFormatter } from '../i18n'; -import { useHelper } from '../../store'; -import type { TagHelper } from '../../actions/helper'; export interface ExportProps { exportType: string; @@ -29,30 +30,33 @@ const ExportButton = ({ totalElements, exportProps }: Props return ( <> {totalElements > 0 - ? - - - - - - - : - - - - - } + ? ( + + + + + + + + ) + : ( + + + + + + )} ); }; diff --git a/openbas-front/src/components/common/IconPopover.tsx b/openbas-front/src/components/common/IconPopover.tsx index e05bcdff98..2e28584cd4 100644 --- a/openbas-front/src/components/common/IconPopover.tsx +++ b/openbas-front/src/components/common/IconPopover.tsx @@ -1,6 +1,7 @@ -import { IconButton, Menu, MenuItem } from '@mui/material'; import { MoreVert } from '@mui/icons-material'; +import { IconButton, Menu, MenuItem } from '@mui/material'; import { FunctionComponent, useState } from 'react'; + import { useFormatter } from '../i18n'; import { PopoverEntry } from './ButtonPopover'; @@ -24,7 +25,7 @@ const IconPopover: FunctionComponent = ({ ev.stopPropagation(); setAnchorEl(ev.currentTarget); }} - aria-label={'Xls mapper menu'} + aria-label="Xls mapper menu" aria-haspopup="true" size="large" > @@ -37,7 +38,8 @@ const IconPopover: FunctionComponent = ({ > {entries.map((entry) => { return ( - { entry.action(); diff --git a/openbas-front/src/components/common/ImportUploader.tsx b/openbas-front/src/components/common/ImportUploader.tsx index 4fec09adc3..698230dbf6 100644 --- a/openbas-front/src/components/common/ImportUploader.tsx +++ b/openbas-front/src/components/common/ImportUploader.tsx @@ -1,9 +1,10 @@ -import { ChangeEvent, FunctionComponent, useRef, useState } from 'react'; -import { CircularProgress, CircularProgressProps, IconButton, ToggleButton, Tooltip } from '@mui/material'; import { CloudUploadOutlined } from '@mui/icons-material'; -import { useFormatter } from '../i18n'; -import { useHelper } from '../../store'; +import { CircularProgress, CircularProgressProps, IconButton, ToggleButton, Tooltip } from '@mui/material'; +import { ChangeEvent, FunctionComponent, useRef, useState } from 'react'; + import type { UserHelper } from '../../actions/helper'; +import { useHelper } from '../../store'; +import { useFormatter } from '../i18n'; interface Props { title: string; @@ -63,8 +64,11 @@ const ImportUploader: FunctionComponent = ({ ) : ( ({ diff --git a/openbas-front/src/components/common/Paper.tsx b/openbas-front/src/components/common/Paper.tsx index d4ce61507e..486f056817 100644 --- a/openbas-front/src/components/common/Paper.tsx +++ b/openbas-front/src/components/common/Paper.tsx @@ -1,5 +1,5 @@ -import { makeStyles } from '@mui/styles'; import { Paper as PaperMui } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { FunctionComponent } from 'react'; import * as React from 'react'; diff --git a/openbas-front/src/components/common/RightMenu.tsx b/openbas-front/src/components/common/RightMenu.tsx index 2bab9b586f..492e89eb3a 100644 --- a/openbas-front/src/components/common/RightMenu.tsx +++ b/openbas-front/src/components/common/RightMenu.tsx @@ -1,11 +1,12 @@ +import { Drawer, ListItemIcon, ListItemText, MenuItem, MenuList } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { FunctionComponent } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import { Drawer, ListItemIcon, ListItemText, MenuItem, MenuList } from '@mui/material'; import { Link, useLocation } from 'react-router-dom'; -import type { Theme } from '../Theme'; -import { useFormatter } from '../i18n'; + import { isNotEmptyField } from '../../utils/utils'; +import { useFormatter } from '../i18n'; +import type { Theme } from '../Theme'; const useStyles = makeStyles((theme: Theme) => ({ drawer: { diff --git a/openbas-front/src/components/common/SelectList.tsx b/openbas-front/src/components/common/SelectList.tsx index 940b349470..8eedd5d7ac 100644 --- a/openbas-front/src/components/common/SelectList.tsx +++ b/openbas-front/src/components/common/SelectList.tsx @@ -1,6 +1,7 @@ import { Box, Chip, Grid, List, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { useMemo } from 'react'; import * as React from 'react'; + import { truncate } from '../../utils/String'; export interface SelectListIcon { @@ -45,7 +46,7 @@ const SelectList = ({ const getName = (v: T) => v[`${prefix}_name`]; const selectedIds = useMemo( - () => selectedValues.map((v) => getId(v)), + () => selectedValues.map(v => getId(v)), [selectedValues, prefix], ); @@ -69,9 +70,9 @@ const SelectList = ({ {elements.icon.value()} - {elements.headers.map((header) => ( + {elements.headers.map(header => ( ({ ))} - } + )} /> ); diff --git a/openbas-front/src/components/common/SortHeadersList.tsx b/openbas-front/src/components/common/SortHeadersList.tsx index 94400df12a..21c4a9d071 100644 --- a/openbas-front/src/components/common/SortHeadersList.tsx +++ b/openbas-front/src/components/common/SortHeadersList.tsx @@ -1,8 +1,9 @@ -import { CSSProperties, FunctionComponent, useState } from 'react'; -import * as React from 'react'; import { ArrowDropDownOutlined, ArrowDropUpOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; import * as R from 'ramda'; +import { CSSProperties, FunctionComponent, useState } from 'react'; +import * as React from 'react'; + import { useFormatter } from '../i18n'; const useStyles = makeStyles(() => ({ @@ -59,11 +60,13 @@ const SortHeadersList: FunctionComponent = ({ }; const sortComponent = (asc: boolean) => { - return asc ? ( - - ) : ( - - ); + return asc + ? ( + + ) + : ( + + ); }; const sortHeader = (header: Header, style: CSSProperties) => { diff --git a/openbas-front/src/components/common/TopMenu.tsx b/openbas-front/src/components/common/TopMenu.tsx index a6a2cc35f4..daf04a2c52 100644 --- a/openbas-front/src/components/common/TopMenu.tsx +++ b/openbas-front/src/components/common/TopMenu.tsx @@ -1,11 +1,12 @@ +import { Button } from '@mui/material'; import { makeStyles } from '@mui/styles'; import { FunctionComponent } from 'react'; import { Link, useLocation } from 'react-router-dom'; -import { Button } from '@mui/material'; + import { useFormatter } from '../i18n'; import type { Theme } from '../Theme'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ button: { marginRight: theme.spacing(2), padding: '0 5px 0 5px', @@ -24,7 +25,7 @@ export interface TopMenuEntry { label: string; } -const TopMenu: FunctionComponent<{ entries: TopMenuEntry[], contextual?: boolean }> = ({ +const TopMenu: FunctionComponent<{ entries: TopMenuEntry[]; contextual?: boolean }> = ({ entries, contextual, }) => { diff --git a/openbas-front/src/components/common/Transition.tsx b/openbas-front/src/components/common/Transition.tsx index 9c59a93167..9096182754 100644 --- a/openbas-front/src/components/common/Transition.tsx +++ b/openbas-front/src/components/common/Transition.tsx @@ -1,7 +1,7 @@ -import { JSXElementConstructor } from 'react'; -import * as React from 'react'; import { Slide } from '@mui/material'; import type { TransitionProps } from '@mui/material/transitions'; +import { JSXElementConstructor } from 'react'; +import * as React from 'react'; const Transition = React.forwardRef( ( @@ -10,7 +10,7 @@ const Transition = React.forwardRef( ...props }: TransitionProps & { children: React.ReactElement< - unknown, + unknown, string | JSXElementConstructor >; }, diff --git a/openbas-front/src/components/common/chaining/ChainingUtils.tsx b/openbas-front/src/components/common/chaining/ChainingUtils.tsx index 6946df710e..f736cfabb4 100644 --- a/openbas-front/src/components/common/chaining/ChainingUtils.tsx +++ b/openbas-front/src/components/common/chaining/ChainingUtils.tsx @@ -4,7 +4,7 @@ const fromInjectDependencyToLabel = (dependency: InjectDependency) => { let label = ''; if (dependency.dependency_condition?.conditions !== undefined) { label = dependency.dependency_condition.conditions - .map((value) => `${value.key} is ${value.value ? 'Success' : 'Failure'}`) + .map(value => `${value.key} is ${value.value ? 'Success' : 'Failure'}`) .join(dependency.dependency_condition.mode === 'and' ? ' AND ' : ' OR '); } diff --git a/openbas-front/src/components/common/chips/ChipUtils.tsx b/openbas-front/src/components/common/chips/ChipUtils.tsx index a81d89ba8f..3b36969aad 100644 --- a/openbas-front/src/components/common/chips/ChipUtils.tsx +++ b/openbas-front/src/components/common/chips/ChipUtils.tsx @@ -1,7 +1,12 @@ const convertOperatorToIcon = (t: (text: string) => string, operator?: string) => { switch (operator) { case 'is': - return <> {t('is')}; + return ( + <> +  + {t('is')} + + ); default: return null; } diff --git a/openbas-front/src/components/common/chips/ClickableChip.tsx b/openbas-front/src/components/common/chips/ClickableChip.tsx index e89b7d1760..3469324119 100644 --- a/openbas-front/src/components/common/chips/ClickableChip.tsx +++ b/openbas-front/src/components/common/chips/ClickableChip.tsx @@ -1,9 +1,10 @@ -import { FunctionComponent, useRef, useState } from 'react'; import { Box, Chip, SelectChangeEvent, Tooltip } from '@mui/material'; import { makeStyles } from '@mui/styles'; import classNames from 'classnames'; -import type { Theme } from '../../Theme'; +import { FunctionComponent, useRef, useState } from 'react'; + import { useFormatter } from '../../i18n'; +import type { Theme } from '../../Theme'; import convertOperatorToIcon from './ChipUtils'; import ClickableChipPopover from './ClickableChipPopover'; @@ -29,7 +30,7 @@ const useStyles = makeStyles((theme: Theme) => ({ textOverflow: 'ellipsis', }, interactive: { - cursor: 'pointer', + 'cursor': 'pointer', '&:hover': { textDecorationLine: 'underline', }, @@ -45,11 +46,11 @@ export interface Element { interface Props { onChange: (newElement: Element) => void; pristine: boolean; - selectedElement: Element, - availableKeys: string[], - availableOperators: string[], - availableValues: string[], - onDelete?: () => void, + selectedElement: Element; + availableKeys: string[]; + availableOperators: string[]; + availableValues: string[]; + onDelete?: () => void; } const ClickableChip: FunctionComponent = ({ @@ -111,18 +112,33 @@ const ClickableChip: FunctionComponent = ({ return opts.map((o, idx) => { let or = <>; if (idx > 0) { - or =
    - {t('OR')} -
    ; + or = ( +
    + {t('OR')} +
    + ); } - return (
    {or} {o}
    ); + return ( +
    + {or} + + {' '} + {o} + +
    + ); }); } - return ( {t('undefined')}); + return ( + + {' '} + {t('undefined')} + + ); }; const filterValues = (isTooltip: boolean) => { @@ -134,13 +150,15 @@ const ClickableChip: FunctionComponent = ({ > {t(selectedElement.key)} - 1 ? classes.interactive : undefined} onClick={() => handleClickOpen(availableOperators, 'operator', selectedElement.operator)} > {convertOperatorToIcon(t, selectedElement.operator)} - 1 ? classes.interactive : undefined} onClick={() => handleClickOpen(availableValues, 'value', selectedElement.value)} > @@ -166,15 +184,16 @@ const ClickableChip: FunctionComponent = ({ />
    {chipRef?.current - && - } + /> + )} ); }; diff --git a/openbas-front/src/components/common/chips/ClickableChipPopover.tsx b/openbas-front/src/components/common/chips/ClickableChipPopover.tsx index c876387892..50d6822b9a 100644 --- a/openbas-front/src/components/common/chips/ClickableChipPopover.tsx +++ b/openbas-front/src/components/common/chips/ClickableChipPopover.tsx @@ -1,5 +1,5 @@ -import { FunctionComponent } from 'react'; import { MenuItem, Popover, Select, SelectChangeEvent } from '@mui/material'; +import { FunctionComponent } from 'react'; interface Props { handleChangeValue: (event: SelectChangeEvent) => void; @@ -7,7 +7,7 @@ interface Props { onClose: () => void; anchorEl?: HTMLElement; availableValues: string[]; - element?: string, + element?: string; } const ClickableChipPopover: FunctionComponent = ({ @@ -33,7 +33,7 @@ const ClickableChipPopover: FunctionComponent = ({ onChange={handleChangeValue} style={{ marginBottom: 15 }} > - {availableValues?.map((value) => ( + {availableValues?.map(value => ( {value} diff --git a/openbas-front/src/components/common/chips/ClickableModeChip.tsx b/openbas-front/src/components/common/chips/ClickableModeChip.tsx index 75acf79c25..86e8d0ea52 100644 --- a/openbas-front/src/components/common/chips/ClickableModeChip.tsx +++ b/openbas-front/src/components/common/chips/ClickableModeChip.tsx @@ -1,6 +1,7 @@ -import { FunctionComponent } from 'react'; import { makeStyles } from '@mui/styles'; import classNames from 'classnames'; +import { FunctionComponent } from 'react'; + import { useFormatter } from '../../i18n'; import type { Theme } from '../../Theme'; @@ -14,7 +15,7 @@ const useStyles = makeStyles((theme: Theme) => ({ alignItems: 'center', }, hasClickEvent: { - cursor: 'pointer', + 'cursor': 'pointer', '&:hover': { backgroundColor: theme.palette.action?.disabled, textDecorationLine: 'underline', diff --git a/openbas-front/src/components/common/pagination/PaginationComponent.tsx b/openbas-front/src/components/common/pagination/PaginationComponent.tsx index 8f5840e0d8..e5b3d099ad 100644 --- a/openbas-front/src/components/common/pagination/PaginationComponent.tsx +++ b/openbas-front/src/components/common/pagination/PaginationComponent.tsx @@ -1,18 +1,19 @@ import { Button, Chip, TablePagination, ToggleButtonGroup } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useEffect, useState } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import SearchFilter from '../../SearchFilter'; -import type { Page } from '../queryable/Page'; -import type { Filter, SearchPaginationInput } from '../../../utils/api-types'; -import ExportButton, { ExportProps } from '../ExportButton'; -import mitreAttack from '../../../static/images/misc/attack.png'; -import Drawer from '../Drawer'; + +import type { AttackPatternStore } from '../../../actions/attack_patterns/AttackPattern'; import MitreFilter, { MITRE_FILTER_KEY } from '../../../admin/components/common/filters/MitreFilter'; +import mitreAttack from '../../../static/images/misc/attack.png'; +import type { Filter, SearchPaginationInput } from '../../../utils/api-types'; import { useFormatter } from '../../i18n'; +import SearchFilter from '../../SearchFilter'; +import Drawer from '../Drawer'; +import ExportButton, { ExportProps } from '../ExportButton'; import { FilterHelpers } from '../queryable/filter/FilterHelpers'; import { isEmptyFilter } from '../queryable/filter/FilterUtils'; -import type { AttackPatternStore } from '../../../actions/attack_patterns/AttackPattern'; +import type { Page } from '../queryable/Page'; const useStyles = makeStyles(() => ({ container: { @@ -51,7 +52,7 @@ interface Props { availableFilters?: string[]; helpers?: FilterHelpers; children?: React.ReactElement | null; - attackPatterns?: AttackPatternStore[], + attackPatterns?: AttackPatternStore[]; } /** diff --git a/openbas-front/src/components/common/pagination/SortHeadersComponent.tsx b/openbas-front/src/components/common/pagination/SortHeadersComponent.tsx index 591dd90391..65cbef7a0a 100644 --- a/openbas-front/src/components/common/pagination/SortHeadersComponent.tsx +++ b/openbas-front/src/components/common/pagination/SortHeadersComponent.tsx @@ -1,8 +1,9 @@ -import { CSSProperties, FunctionComponent, useState } from 'react'; import { ArrowDropDownOutlined, ArrowDropUpOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; -import { useFormatter } from '../../i18n'; +import { CSSProperties, FunctionComponent, useState } from 'react'; + import type { SearchPaginationInput } from '../../../utils/api-types'; +import { useFormatter } from '../../i18n'; const useStyles = makeStyles(() => ({ sortableHeaderItem: { diff --git a/openbas-front/src/components/common/queryable/QueryableHelpers.ts b/openbas-front/src/components/common/queryable/QueryableHelpers.ts index 0bc6a79b39..167ee7838b 100644 --- a/openbas-front/src/components/common/queryable/QueryableHelpers.ts +++ b/openbas-front/src/components/common/queryable/QueryableHelpers.ts @@ -1,7 +1,7 @@ -import { TextSearchHelpers } from './textSearch/TextSearchHelpers'; -import { PaginationHelpers } from './pagination/PaginationHelpers'; import { FilterHelpers } from './filter/FilterHelpers'; +import { PaginationHelpers } from './pagination/PaginationHelpers'; import { SortHelpers } from './sort/SortHelpers'; +import { TextSearchHelpers } from './textSearch/TextSearchHelpers'; import { UriHelpers } from './uri/UriHelpers'; export interface QueryableHelpers { diff --git a/openbas-front/src/components/common/queryable/QueryableUtils.ts b/openbas-front/src/components/common/queryable/QueryableUtils.ts index 4a2580f37f..8db9b9a71b 100644 --- a/openbas-front/src/components/common/queryable/QueryableUtils.ts +++ b/openbas-front/src/components/common/queryable/QueryableUtils.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; + import type { SearchPaginationInput } from '../../../utils/api-types'; import { ROWS_PER_PAGE_OPTIONS } from './pagination/usPaginationState'; diff --git a/openbas-front/src/components/common/queryable/filter/FilterAutocomplete.tsx b/openbas-front/src/components/common/queryable/filter/FilterAutocomplete.tsx index cec850bba6..a261dce9b4 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterAutocomplete.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterAutocomplete.tsx @@ -1,12 +1,13 @@ -import { Autocomplete as MuiAutocomplete, IconButton, TextField, Tooltip } from '@mui/material'; import { FilterListOffOutlined } from '@mui/icons-material'; -import { useState, CSSProperties, FunctionComponent } from 'react'; +import { Autocomplete as MuiAutocomplete, IconButton, TextField, Tooltip } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import { CSSProperties, FunctionComponent, useState } from 'react'; + import type { Filter, FilterGroup } from '../../../../utils/api-types'; -import { FilterHelpers } from './FilterHelpers'; -import { buildEmptyFilter } from './FilterUtils'; import { Option } from '../../../../utils/Option'; import { useFormatter } from '../../../i18n'; +import { FilterHelpers } from './FilterHelpers'; +import { buildEmptyFilter } from './FilterUtils'; const useStyles = makeStyles(() => ({ container: { @@ -48,7 +49,7 @@ const FilterAutocomplete: FunctionComponent = ({ }; const computeOptions = () => { - return options.filter((o) => !filterGroup?.filters?.map((f) => f.key).includes(o.id)); + return options.filter(o => !filterGroup?.filters?.map(f => f.key).includes(o.id)); }; return ( @@ -69,7 +70,7 @@ const FilterAutocomplete: FunctionComponent = ({ } setInputValue(newValue); }} - renderInput={(params) => ( + renderInput={params => ( = ({ }; const isEmpty = (values?: string[]) => { - return R.isEmpty(values) || values?.some((v) => R.isEmpty(v)); + return R.isEmpty(values) || values?.some(v => R.isEmpty(v)); }; const chipVariant = isEmpty(filter.values) && !['empty', 'not_empty'].includes(filter.operator ?? 'eq') @@ -41,39 +42,40 @@ const FilterChip: FunctionComponent = ({ return ( <> - } + )} > - } + )} onDelete={handleRemoveFilter} sx={{ borderRadius: 1 }} ref={chipRef} /> {chipRef?.current - && - } + /> + )} ); }; diff --git a/openbas-front/src/components/common/queryable/filter/FilterChipPopover.tsx b/openbas-front/src/components/common/queryable/filter/FilterChipPopover.tsx index b045df90c3..80e9c7ed04 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterChipPopover.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterChipPopover.tsx @@ -1,10 +1,11 @@ -import { FunctionComponent } from 'react'; import { MenuItem, Popover, Select, SelectChangeEvent } from '@mui/material'; +import { FunctionComponent } from 'react'; + +import type { Filter, PropertySchemaDTO } from '../../../../utils/api-types'; import { useFormatter } from '../../../i18n'; +import { FilterChipPopoverInput } from './FilterChipPopoverInput'; import { FilterHelpers } from './FilterHelpers'; -import type { Filter, PropertySchemaDTO } from '../../../../utils/api-types'; import { availableOperators, OperatorKeyValues } from './FilterUtils'; -import { FilterChipPopoverInput } from './FilterChipPopoverInput'; import ScenarioStatusFilter from './specific/ScenarioStatusFilter'; interface Props { @@ -48,13 +49,13 @@ const FilterChipPopover: FunctionComponent = ({ onChange={handleChangeOperator} style={{ marginBottom: 15 }} > - {operators.map((value) => ( + {operators.map(value => ( {t(OperatorKeyValues[value])} ))} - {} + ); }; diff --git a/openbas-front/src/components/common/queryable/filter/FilterChipPopoverInput.tsx b/openbas-front/src/components/common/queryable/filter/FilterChipPopoverInput.tsx index 02f4a7b7b2..144896f9cd 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterChipPopoverInput.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterChipPopoverInput.tsx @@ -1,8 +1,9 @@ import { Autocomplete, Checkbox, TextField } from '@mui/material'; -import { FunctionComponent, useEffect } from 'react'; import { DateTimePicker } from '@mui/x-date-pickers'; -import { useFormatter } from '../../../i18n'; +import { FunctionComponent, useEffect } from 'react'; + import type { Filter, PropertySchemaDTO } from '../../../../utils/api-types'; +import { useFormatter } from '../../../i18n'; import { FilterHelpers } from './FilterHelpers'; import useSearchOptions from './useSearchOptions'; import wordsToExcludeFromTranslation from './WordsToExcludeFromTranslation'; @@ -67,7 +68,7 @@ export const BasicSelectInput: FunctionComponent { const isIncluded = filter.values?.includes(optionId); const newValues = isIncluded - ? (filter.values?.filter((v) => v !== optionId) ?? []) + ? (filter.values?.filter(v => v !== optionId) ?? []) : [...(filter.values ?? []), optionId]; helpers.handleAddMultipleValueFilter(filter.key, newValues); }; @@ -80,9 +81,9 @@ export const BasicSelectInput: FunctionComponent option.label ?? ''} + getOptionLabel={option => option.label ?? ''} onInputChange={(_, search) => searchOptions(filter.key, search)} - renderInput={(paramsInput) => ( + renderInput={paramsInput => ( ({ mode: { @@ -31,7 +32,7 @@ const useStyles = makeStyles((theme: Theme) => ({ textOverflow: 'ellipsis', }, label: { - cursor: 'pointer', + 'cursor': 'pointer', '&:hover': { textDecorationLine: 'underline', }, @@ -67,20 +68,36 @@ const FilterChipValues: FunctionComponent = ({ return opts.map((o, idx) => { let or = <>; if (idx > 0) { - or =
    - {t('OR')} -
    ; + or = ( +
    + {t('OR')} +
    + ); } if (propertySchema?.schema_property_type.includes('instant')) { return ( - <>{or} {fldt(o.label)} + <> + {or} + + {' '} + {fldt(o.label)} + + ); } - return (<>{or} {o.label}); + return ( + <> + {or} + + {' '} + {o.label} + + + ); }); }; @@ -94,7 +111,8 @@ const FilterChipValues: FunctionComponent = ({ onClick={handleOpen} > {t(filter.key)} - {' '} + + {' '} {operator === 'empty' ? t('is empty') : t('is not empty')} diff --git a/openbas-front/src/components/common/queryable/filter/FilterChips.tsx b/openbas-front/src/components/common/queryable/filter/FilterChips.tsx index e8c9d8c237..f27a18dcce 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterChips.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterChips.tsx @@ -1,9 +1,10 @@ -import { Fragment, FunctionComponent } from 'react'; import { Box } from '@mui/material'; -import { FilterHelpers } from './FilterHelpers'; +import { Fragment, FunctionComponent } from 'react'; + import type { Filter, FilterGroup, PropertySchemaDTO } from '../../../../utils/api-types'; -import FilterChip from './FilterChip'; import ClickableModeChip from '../../chips/ClickableModeChip'; +import FilterChip from './FilterChip'; +import { FilterHelpers } from './FilterHelpers'; interface Props { propertySchemas: PropertySchemaDTO[]; @@ -20,10 +21,10 @@ const FilterChips: FunctionComponent = ({ helpers, pristine, }) => { - const filters = filterGroup?.filters?.filter((f) => availableFilterNames.length === 0 || availableFilterNames.includes(f.key)) ?? []; + const filters = filterGroup?.filters?.filter(f => availableFilterNames.length === 0 || availableFilterNames.includes(f.key)) ?? []; const propertySchema = (filter: Filter) => { - return propertySchemas.find((p) => p.schema_property_name === filter.key); + return propertySchemas.find(p => p.schema_property_name === filter.key); }; const handleSwitchMode = () => helpers.handleSwitchMode(); @@ -57,8 +58,7 @@ const FilterChips: FunctionComponent = ({ /> ); - }) - } + })} ); }; diff --git a/openbas-front/src/components/common/queryable/filter/FilterField.tsx b/openbas-front/src/components/common/queryable/filter/FilterField.tsx index 6e70d6545d..3dd39ecf34 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterField.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterField.tsx @@ -1,11 +1,12 @@ import { CSSProperties, FunctionComponent, useEffect, useState } from 'react'; -import { availableOperators } from './FilterUtils'; -import { useFormatter } from '../../../i18n'; + import type { FilterGroup, PropertySchemaDTO } from '../../../../utils/api-types'; +import { useFormatter } from '../../../i18n'; +import FilterAutocomplete, { OptionPropertySchema } from './FilterAutocomplete'; import FilterChips from './FilterChips'; -import useFilterableProperties from './useFilterableProperties'; import { FilterHelpers } from './FilterHelpers'; -import FilterAutocomplete, { OptionPropertySchema } from './FilterAutocomplete'; +import { availableOperators } from './FilterUtils'; +import useFilterableProperties from './useFilterableProperties'; interface Props { entityPrefix: string; @@ -31,7 +32,7 @@ const FilterField: FunctionComponent = ({ useEffect(() => { useFilterableProperties(entityPrefix, availableFilterNames).then((propertySchemas: PropertySchemaDTO[]) => { - const newOptions = propertySchemas.map((property) => ( + const newOptions = propertySchemas.map(property => ( { id: property.schema_property_name, label: t(property.schema_property_name), operator: availableOperators(property)[0] } as OptionPropertySchema )); setOptions(newOptions); diff --git a/openbas-front/src/components/common/queryable/filter/FilterUtils.tsx b/openbas-front/src/components/common/queryable/filter/FilterUtils.tsx index 9300f5c5ba..11cec549f4 100644 --- a/openbas-front/src/components/common/queryable/filter/FilterUtils.tsx +++ b/openbas-front/src/components/common/queryable/filter/FilterUtils.tsx @@ -1,4 +1,5 @@ import * as R from 'ramda'; + import type { Filter, FilterGroup, PropertySchemaDTO } from '../../../../utils/api-types'; export const emptyFilterGroup: FilterGroup = { @@ -25,14 +26,14 @@ export const buildFilter = (key: string, values: string[], operator: Filter['ope }; export const isExistFilter = (filterGroup: FilterGroup, key: string) => { - return filterGroup.filters?.some((f) => f.key === key); + return filterGroup.filters?.some(f => f.key === key); }; export const isEmptyFilter = (filterGroup: FilterGroup, key: string) => { if (R.isEmpty(filterGroup.filters)) { return true; } - return !filterGroup.filters?.find((f) => f.key === key) || R.isEmpty(filterGroup.filters?.find((f) => f.key === key)?.values); + return !filterGroup.filters?.find(f => f.key === key) || R.isEmpty(filterGroup.filters?.find(f => f.key === key)?.values); }; // -- OPERATOR -- @@ -44,13 +45,33 @@ export const convertOperatorToIcon = (t: (text: string) => string, operator: Fil case 'not_eq': return <> ≠; case 'not_contains': - return <> {t('not contains')}; + return ( + <> +  + {t('not contains')} + + ); case 'contains': - return <> {t('contains')}; + return ( + <> +  + {t('contains')} + + ); case 'starts_with': - return <> {t('starts with')}; + return ( + <> +  + {t('starts with')} + + ); case 'not_starts_with': - return <> {t('not starts with')}; + return ( + <> +  + {t('not starts with')} + + ); case 'gt': return <> >; case 'gte': @@ -60,9 +81,19 @@ export const convertOperatorToIcon = (t: (text: string) => string, operator: Fil case 'lte': return <> ≤; case 'empty': - return <> {t('is empty')}; + return ( + <> +  + {t('is empty')} + + ); case 'not_empty': - return <> {t('is not empty')}; + return ( + <> +  + {t('is not empty')} + + ); default: return null; } diff --git a/openbas-front/src/components/common/queryable/filter/filtersManageStateUtils.ts b/openbas-front/src/components/common/queryable/filter/filtersManageStateUtils.ts index e1d3e35c4f..43028412b1 100644 --- a/openbas-front/src/components/common/queryable/filter/filtersManageStateUtils.ts +++ b/openbas-front/src/components/common/queryable/filter/filtersManageStateUtils.ts @@ -19,9 +19,9 @@ export const handleAddFilterWithEmptyValueUtil = (filterGroup: FilterGroup, filt const filters = isExistFilter(filterGroup, filter.key) ? filterGroup.filters ?? [] : [ - ...filterGroup.filters ?? [], - filter, - ]; + ...filterGroup.filters ?? [], + filter, + ]; return { ...filterGroup, filters, @@ -29,20 +29,20 @@ export const handleAddFilterWithEmptyValueUtil = (filterGroup: FilterGroup, filt }; export const handleAddSingleValueFilterUtil = (filters: FilterGroup, key: string, value: string) => { - return updateFilters(filters, (f) => (f.key === key ? { ...f, values: [value] } : f)); + return updateFilters(filters, f => (f.key === key ? { ...f, values: [value] } : f)); }; export const handleAddMultipleValueFilterUtil = (filters: FilterGroup, key: string, values: string[]) => { - return updateFilters(filters, (f) => (f.key === key ? { ...f, values } : f)); + return updateFilters(filters, f => (f.key === key ? { ...f, values } : f)); }; export const handleChangeOperatorFiltersUtil = (filters: FilterGroup, key: string, operator: Filter['operator']) => { - return updateFilters(filters, (f) => (f.key === key ? { ...f, operator, values: operator && ['empty', 'not_empty'].includes(operator) ? [] : f.values } : f)); + return updateFilters(filters, f => (f.key === key ? { ...f, operator, values: operator && ['empty', 'not_empty'].includes(operator) ? [] : f.values } : f)); }; export const handleRemoveFilterUtil = (filters: FilterGroup, key: string) => { return { ...filters, - filters: filters.filters?.filter((f) => f.key !== key), + filters: filters.filters?.filter(f => f.key !== key), }; }; diff --git a/openbas-front/src/components/common/queryable/filter/specific/ScenarioStatusFilter.tsx b/openbas-front/src/components/common/queryable/filter/specific/ScenarioStatusFilter.tsx index 5c9adc2f2b..9a12ab4e56 100644 --- a/openbas-front/src/components/common/queryable/filter/specific/ScenarioStatusFilter.tsx +++ b/openbas-front/src/components/common/queryable/filter/specific/ScenarioStatusFilter.tsx @@ -1,13 +1,14 @@ import { Autocomplete, MenuItem, Select, TextField } from '@mui/material'; import { FunctionComponent } from 'react'; -import { useFormatter } from '../../../../i18n'; + import { SCENARIO_NOT_SCHEDULED_STATUS, SCENARIO_SCHEDULED_STATUS } from '../../../../../admin/components/scenarios/scenario/ScenarioStatus'; import type { PropertySchemaDTO } from '../../../../../utils/api-types'; -import { OperatorKeyValues } from '../FilterUtils'; -import { FilterHelpers } from '../FilterHelpers'; import { Option } from '../../../../../utils/Option'; +import { useFormatter } from '../../../../i18n'; +import { FilterHelpers } from '../FilterHelpers'; +import { OperatorKeyValues } from '../FilterUtils'; -const ScenarioStatusFilter: FunctionComponent<{ propertySchema: PropertySchemaDTO, helpers: FilterHelpers }> = ({ +const ScenarioStatusFilter: FunctionComponent<{ propertySchema: PropertySchemaDTO; helpers: FilterHelpers }> = ({ propertySchema, helpers, }) => { @@ -35,7 +36,7 @@ const ScenarioStatusFilter: FunctionComponent<{ propertySchema: PropertySchemaDT fullWidth style={{ marginBottom: 15 }} > - {operators.map((value) => ( + {operators.map(value => ( {t(OperatorKeyValues[value])} @@ -47,12 +48,12 @@ const ScenarioStatusFilter: FunctionComponent<{ propertySchema: PropertySchemaDT autoHighlight noOptionsText={t('No available options')} options={options} - getOptionLabel={(option) => option.label ?? ''} + getOptionLabel={option => option.label ?? ''} isOptionEqualToValue={(option, v) => option.id === v.id} onChange={(_event, newValue) => { onChange(newValue); }} - renderInput={(paramsInput) => ( + renderInput={paramsInput => ( Promise = (entity_prefix: string, filterNames: string[]) => { if (filterNames.length === 0) { return Promise.resolve([]); } const javaClass = convertJsonClassToJavaClass(entity_prefix); - return filterableProperties(javaClass, filterNames).then(((result: { data: PropertySchemaDTO[] }) => { + return filterableProperties(javaClass, filterNames).then((result: { data: PropertySchemaDTO[] }) => { return result.data; - })); + }); }; export default useFilterableProperties; diff --git a/openbas-front/src/components/common/queryable/filter/useFiltersState.tsx b/openbas-front/src/components/common/queryable/filter/useFiltersState.tsx index 7aa7dfd6d6..e47c467947 100644 --- a/openbas-front/src/components/common/queryable/filter/useFiltersState.tsx +++ b/openbas-front/src/components/common/queryable/filter/useFiltersState.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from 'react'; -import { emptyFilterGroup } from './FilterUtils'; + +import type { Filter, FilterGroup } from '../../../../utils/api-types'; import { FilterHelpers } from './FilterHelpers'; import { handleAddFilterWithEmptyValueUtil, @@ -9,11 +10,11 @@ import { handleRemoveFilterUtil, handleSwitchMode, } from './filtersManageStateUtils'; -import type { Filter, FilterGroup } from '../../../../utils/api-types'; +import { emptyFilterGroup } from './FilterUtils'; interface Props { - filters: FilterGroup, - latestAddFilterId?: string + filters: FilterGroup; + latestAddFilterId?: string; } const useFiltersState = ( @@ -27,35 +28,35 @@ const useFiltersState = ( const helpers: FilterHelpers = { // Switch filter group operator handleSwitchMode: () => { - setFiltersState((prevState) => ({ + setFiltersState(prevState => ({ ...prevState, filters: handleSwitchMode(prevState.filters), })); }, // Add Filter handleAddFilterWithEmptyValue: (filter: Filter) => { - setFiltersState((prevState) => ({ + setFiltersState(prevState => ({ ...prevState, filters: handleAddFilterWithEmptyValueUtil(prevState.filters, filter), })); }, // Add value to a filter handleAddSingleValueFilter: (key: string, value: string) => { - setFiltersState((prevState) => ({ + setFiltersState(prevState => ({ ...prevState, filters: handleAddSingleValueFilterUtil(prevState.filters, key, value), })); }, // Add multiple value to a filter handleAddMultipleValueFilter: (key: string, values: string[]) => { - setFiltersState((prevState) => ({ + setFiltersState(prevState => ({ ...prevState, filters: handleAddMultipleValueFilterUtil(prevState.filters, key, values), })); }, // Change operator in filter handleChangeOperatorFilters: (key: string, operator: Filter['operator']) => { - setFiltersState((prevState) => ({ + setFiltersState(prevState => ({ ...prevState, filters: handleChangeOperatorFiltersUtil(prevState.filters, key, operator), })); @@ -66,7 +67,7 @@ const useFiltersState = ( }, // Remove a Filter handleRemoveFilterByKey: (key: string) => { - setFiltersState((prevState) => ({ + setFiltersState(prevState => ({ ...prevState, filters: handleRemoveFilterUtil(prevState.filters, key), })); diff --git a/openbas-front/src/components/common/queryable/filter/useRetrieveOptions.tsx b/openbas-front/src/components/common/queryable/filter/useRetrieveOptions.tsx index 598700cf35..47f4c85e03 100644 --- a/openbas-front/src/components/common/queryable/filter/useRetrieveOptions.tsx +++ b/openbas-front/src/components/common/queryable/filter/useRetrieveOptions.tsx @@ -1,11 +1,12 @@ import { useState } from 'react'; + +import { searchAttackPatternsByIdAsOption } from '../../../../actions/AttackPattern'; import { searchInjectorByIdAsOptions } from '../../../../actions/injectors/injector-action'; -import { Option } from '../../../../utils/Option'; import { searchKillChainPhasesByIdAsOption } from '../../../../actions/kill_chain_phases/killChainPhase-action'; -import { searchTagByIdAsOption } from '../../../../actions/tags/tag-action'; -import { searchScenarioByIdAsOption } from '../../../../actions/scenarios/scenario-actions'; -import { searchAttackPatternsByIdAsOption } from '../../../../actions/AttackPattern'; import { searchOrganizationByIdAsOptions } from '../../../../actions/organizations/organization-actions'; +import { searchScenarioByIdAsOption } from '../../../../actions/scenarios/scenario-actions'; +import { searchTagByIdAsOption } from '../../../../actions/tags/tag-action'; +import { Option } from '../../../../utils/Option'; const useRetrieveOptions = () => { const [options, setOptions] = useState([]); @@ -54,7 +55,7 @@ const useRetrieveOptions = () => { }); break; default: - setOptions(ids.map((id) => ({ id, label: id }))); + setOptions(ids.map(id => ({ id, label: id }))); break; } }; diff --git a/openbas-front/src/components/common/queryable/filter/useSearchOptions.tsx b/openbas-front/src/components/common/queryable/filter/useSearchOptions.tsx index bdbee8aaa5..e00e135d55 100644 --- a/openbas-front/src/components/common/queryable/filter/useSearchOptions.tsx +++ b/openbas-front/src/components/common/queryable/filter/useSearchOptions.tsx @@ -1,12 +1,13 @@ import { useState } from 'react'; + +import { searchAttackPatternsByNameAsOption } from '../../../../actions/AttackPattern'; import { searchInjectorsByNameAsOption } from '../../../../actions/injectors/injector-action'; -import { Option } from '../../../../utils/Option'; import { searchKillChainPhasesByNameAsOption } from '../../../../actions/kill_chain_phases/killChainPhase-action'; -import { searchTagAsOption } from '../../../../actions/tags/tag-action'; +import { searchOrganizationsByNameAsOption } from '../../../../actions/organizations/organization-actions'; import { searchScenarioAsOption, searchScenarioCategoryAsOption } from '../../../../actions/scenarios/scenario-actions'; -import { searchAttackPatternsByNameAsOption } from '../../../../actions/AttackPattern'; +import { searchTagAsOption } from '../../../../actions/tags/tag-action'; +import { Option } from '../../../../utils/Option'; import { useFormatter } from '../../../i18n'; -import { searchOrganizationsByNameAsOption } from '../../../../actions/organizations/organization-actions'; const useSearchOptions = () => { // Standard hooks @@ -54,12 +55,12 @@ const useSearchOptions = () => { break; case 'scenario_category': searchScenarioCategoryAsOption(search).then((response: { data: Option[] }) => { - setOptions(response.data.map((d) => ({ id: d.id, label: t(d.label) }))); + setOptions(response.data.map(d => ({ id: d.id, label: t(d.label) }))); }); break; case 'user_organization': searchOrganizationsByNameAsOption(search).then((response: { data: Option[] }) => { - setOptions(response.data.map((d) => ({ id: d.id, label: t(d.label) }))); + setOptions(response.data.map(d => ({ id: d.id, label: t(d.label) }))); }); break; default: diff --git a/openbas-front/src/components/common/queryable/pagination/PaginationComponentV2.tsx b/openbas-front/src/components/common/queryable/pagination/PaginationComponentV2.tsx index 497bd02fcb..d85dda280b 100644 --- a/openbas-front/src/components/common/queryable/pagination/PaginationComponentV2.tsx +++ b/openbas-front/src/components/common/queryable/pagination/PaginationComponentV2.tsx @@ -1,22 +1,23 @@ import { Box, Button, Chip } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useEffect, useState } from 'react'; import * as React from 'react'; -import { makeStyles } from '@mui/styles'; -import type { Page } from '../Page'; -import type { Filter, PropertySchemaDTO, SearchPaginationInput } from '../../../../utils/api-types'; -import mitreAttack from '../../../../static/images/misc/attack.png'; -import Drawer from '../../Drawer'; + +import type { AttackPatternStore } from '../../../../actions/attack_patterns/AttackPattern'; +import InjectorContractSwitchFilter from '../../../../admin/components/common/filters/InjectorContractSwitchFilter'; import MitreFilter, { MITRE_FILTER_KEY } from '../../../../admin/components/common/filters/MitreFilter'; +import mitreAttack from '../../../../static/images/misc/attack.png'; +import type { Filter, PropertySchemaDTO, SearchPaginationInput } from '../../../../utils/api-types'; import { useFormatter } from '../../../i18n'; +import ClickableModeChip from '../../chips/ClickableModeChip'; +import Drawer from '../../Drawer'; +import FilterAutocomplete, { OptionPropertySchema } from '../filter/FilterAutocomplete'; +import FilterChips from '../filter/FilterChips'; import { availableOperators, isEmptyFilter } from '../filter/FilterUtils'; -import type { AttackPatternStore } from '../../../../actions/attack_patterns/AttackPattern'; +import useFilterableProperties from '../filter/useFilterableProperties'; +import type { Page } from '../Page'; import { QueryableHelpers } from '../QueryableHelpers'; import TextSearchComponent from '../textSearch/TextSearchComponent'; -import FilterAutocomplete, { OptionPropertySchema } from '../filter/FilterAutocomplete'; -import useFilterableProperties from '../filter/useFilterableProperties'; -import FilterChips from '../filter/FilterChips'; -import ClickableModeChip from '../../chips/ClickableModeChip'; -import InjectorContractSwitchFilter from '../../../../admin/components/common/filters/InjectorContractSwitchFilter'; import TablePaginationComponentV2 from './TablePaginationComponentV2'; const useStyles = makeStyles(() => ({ @@ -47,8 +48,8 @@ interface Props { availableFilterNames?: string[]; queryableHelpers: QueryableHelpers; topBarButtons?: React.ReactElement | null; - attackPatterns?: AttackPatternStore[], - reloadContentCount?: number + attackPatterns?: AttackPatternStore[]; + reloadContentCount?: number; } const PaginationComponentV2 = ({ @@ -74,8 +75,8 @@ const PaginationComponentV2 = ({ useEffect(() => { if (entityPrefix) { useFilterableProperties(entityPrefix, availableFilterNames).then((propertySchemas: PropertySchemaDTO[]) => { - const newOptions = propertySchemas.filter((property) => property.schema_property_name !== MITRE_FILTER_KEY) - .map((property) => ( + const newOptions = propertySchemas.filter(property => property.schema_property_name !== MITRE_FILTER_KEY) + .map(property => ( { id: property.schema_property_name, label: t(property.schema_property_name), operator: availableOperators(property)[0] } as OptionPropertySchema )); setOptions(newOptions); @@ -183,10 +184,18 @@ const PaginationComponentV2 = ({ > {'Attack Pattern'} = {computeAttackPatternNameForFilter()}} + label={( + <> + {t('Attack Pattern')} + {' '} + = + {' '} + {computeAttackPatternNameForFilter()} + + )} onDelete={() => queryableHelpers.filterHelpers.handleRemoveFilterByKey(MITRE_FILTER_KEY)} /> - {(searchPaginationInput.filterGroup?.filters?.filter((f) => availableFilterNames?.filter((n) => n !== MITRE_FILTER_KEY).includes(f.key)).length ?? 0) > 0 && ( + {(searchPaginationInput.filterGroup?.filters?.filter(f => availableFilterNames?.filter(n => n !== MITRE_FILTER_KEY).includes(f.key)).length ?? 0) > 0 && ( ({ n !== MITRE_FILTER_KEY)} + availableFilterNames={availableFilterNames?.filter(n => n !== MITRE_FILTER_KEY)} helpers={queryableHelpers.filterHelpers} pristine={pristine} /> diff --git a/openbas-front/src/components/common/queryable/pagination/TablePaginationComponent.tsx b/openbas-front/src/components/common/queryable/pagination/TablePaginationComponent.tsx index 5f7dad910b..7730f963bc 100644 --- a/openbas-front/src/components/common/queryable/pagination/TablePaginationComponent.tsx +++ b/openbas-front/src/components/common/queryable/pagination/TablePaginationComponent.tsx @@ -1,9 +1,10 @@ import { TablePagination, ToggleButtonGroup } from '@mui/material'; -import * as React from 'react'; import { makeStyles } from '@mui/styles'; -import { ROWS_PER_PAGE_OPTIONS } from './usPaginationState'; +import * as React from 'react'; + import ExportButton, { ExportProps } from '../../ExportButton'; import { PaginationHelpers } from './PaginationHelpers'; +import { ROWS_PER_PAGE_OPTIONS } from './usPaginationState'; const useStyles = makeStyles(() => ({ container: { diff --git a/openbas-front/src/components/common/queryable/pagination/TablePaginationComponentV2.tsx b/openbas-front/src/components/common/queryable/pagination/TablePaginationComponentV2.tsx index c03a45daa5..36f000ef23 100644 --- a/openbas-front/src/components/common/queryable/pagination/TablePaginationComponentV2.tsx +++ b/openbas-front/src/components/common/queryable/pagination/TablePaginationComponentV2.tsx @@ -1,8 +1,9 @@ import { TablePagination } from '@mui/material'; import { FunctionComponent } from 'react'; import * as React from 'react'; -import { ROWS_PER_PAGE_OPTIONS } from './usPaginationState'; + import { PaginationHelpers } from './PaginationHelpers'; +import { ROWS_PER_PAGE_OPTIONS } from './usPaginationState'; interface Props { page: number; diff --git a/openbas-front/src/components/common/queryable/pagination/usPaginationState.tsx b/openbas-front/src/components/common/queryable/pagination/usPaginationState.tsx index 9445ef1bc1..6cff771108 100644 --- a/openbas-front/src/components/common/queryable/pagination/usPaginationState.tsx +++ b/openbas-front/src/components/common/queryable/pagination/usPaginationState.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from 'react'; import * as React from 'react'; + import { PaginationHelpers } from './PaginationHelpers'; export const ROWS_PER_PAGE_OPTIONS = [20, 50, 100]; diff --git a/openbas-front/src/components/common/queryable/sort/SortHeadersComponentV2.tsx b/openbas-front/src/components/common/queryable/sort/SortHeadersComponentV2.tsx index 6a4a4779d3..96439a8fa4 100644 --- a/openbas-front/src/components/common/queryable/sort/SortHeadersComponentV2.tsx +++ b/openbas-front/src/components/common/queryable/sort/SortHeadersComponentV2.tsx @@ -1,9 +1,10 @@ -import { CSSProperties, FunctionComponent } from 'react'; import { ArrowDropDownOutlined, ArrowDropUpOutlined } from '@mui/icons-material'; import { makeStyles } from '@mui/styles'; -import { SortHelpers } from './SortHelpers'; +import { CSSProperties, FunctionComponent } from 'react'; + import { useFormatter } from '../../../i18n'; import { Header } from '../../SortHeadersList'; +import { SortHelpers } from './SortHelpers'; const useStyles = makeStyles(() => ({ sortableHeaderItem: { @@ -46,7 +47,7 @@ const SortHeadersComponentV2: FunctionComponent = ({ const classes = useStyles(); const sortComponent = (asc: boolean) => { - return asc ? () : (); + return asc ? () : (); }; const sortHeader = (header: Header, style: CSSProperties) => { diff --git a/openbas-front/src/components/common/queryable/sort/useSortState.tsx b/openbas-front/src/components/common/queryable/sort/useSortState.tsx index 10aae48de6..85ccc69f4a 100644 --- a/openbas-front/src/components/common/queryable/sort/useSortState.tsx +++ b/openbas-front/src/components/common/queryable/sort/useSortState.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react'; + import type { SortField } from '../../../../utils/api-types'; import { SortHelpers } from './SortHelpers'; diff --git a/openbas-front/src/components/common/queryable/textSearch/TextSearchComponent.tsx b/openbas-front/src/components/common/queryable/textSearch/TextSearchComponent.tsx index 6a12adc6cb..c340be1237 100644 --- a/openbas-front/src/components/common/queryable/textSearch/TextSearchComponent.tsx +++ b/openbas-front/src/components/common/queryable/textSearch/TextSearchComponent.tsx @@ -1,4 +1,5 @@ import { FunctionComponent } from 'react'; + import SearchFilter from '../../../SearchFilter'; import { TextSearchHelpers } from './TextSearchHelpers'; diff --git a/openbas-front/src/components/common/queryable/textSearch/useTextSearchState.tsx b/openbas-front/src/components/common/queryable/textSearch/useTextSearchState.tsx index 18e9791e32..c59edcbfd4 100644 --- a/openbas-front/src/components/common/queryable/textSearch/useTextSearchState.tsx +++ b/openbas-front/src/components/common/queryable/textSearch/useTextSearchState.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react'; + import { TextSearchHelpers } from './TextSearchHelpers'; const useTextSearchState = (initTextSearch: string = '', onChange?: (textSearch: string, page: number) => void): TextSearchHelpers => { diff --git a/openbas-front/src/components/common/queryable/uri/useUriState.tsx b/openbas-front/src/components/common/queryable/uri/useUriState.tsx index 29b4216ce1..0b756f8303 100644 --- a/openbas-front/src/components/common/queryable/uri/useUriState.tsx +++ b/openbas-front/src/components/common/queryable/uri/useUriState.tsx @@ -1,11 +1,12 @@ import * as qs from 'qs'; -import { useSearchParams } from 'react-router-dom'; -import { useEffect, useState } from 'react'; import * as R from 'ramda'; +import { useEffect, useState } from 'react'; +import { useSearchParams } from 'react-router-dom'; import { z } from 'zod'; -import { UriHelpers } from './UriHelpers'; + import type { SearchPaginationInput } from '../../../../utils/api-types'; import { buildSearchPagination, SearchPaginationInputSchema } from '../QueryableUtils'; +import { UriHelpers } from './UriHelpers'; export const retrieveFromUri = (localStorageKey: string, searchParams: URLSearchParams): SearchPaginationInput | null => { const encodedParams = searchParams.get('query') || ''; diff --git a/openbas-front/src/components/common/queryable/useQueryableWithLocalStorage.tsx b/openbas-front/src/components/common/queryable/useQueryableWithLocalStorage.tsx index 167f5a3dd4..475800b7ab 100644 --- a/openbas-front/src/components/common/queryable/useQueryableWithLocalStorage.tsx +++ b/openbas-front/src/components/common/queryable/useQueryableWithLocalStorage.tsx @@ -1,15 +1,16 @@ -import { useLocalStorage } from 'usehooks-ts'; +import * as R from 'ramda'; import { useEffect, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; -import * as R from 'ramda'; -import useFiltersState from './filter/useFiltersState'; +import { useLocalStorage } from 'usehooks-ts'; + import type { FilterGroup, SearchPaginationInput, SortField } from '../../../utils/api-types'; -import useTextSearchState from './textSearch/useTextSearchState'; +import useFiltersState from './filter/useFiltersState'; import usPaginationState from './pagination/usPaginationState'; import { QueryableHelpers } from './QueryableHelpers'; +import { buildSearchPagination } from './QueryableUtils'; import useSortState from './sort/useSortState'; +import useTextSearchState from './textSearch/useTextSearchState'; import useUriState, { retrieveFromUri } from './uri/useUriState'; -import { buildSearchPagination } from './QueryableUtils'; const buildUseQueryable = ( localStorageKey: string | null, diff --git a/openbas-front/src/components/fields/DocumentField.tsx b/openbas-front/src/components/fields/DocumentField.tsx index 454c70acbd..4708aabe5b 100644 --- a/openbas-front/src/components/fields/DocumentField.tsx +++ b/openbas-front/src/components/fields/DocumentField.tsx @@ -1,14 +1,15 @@ -import { CSSProperties, FunctionComponent } from 'react'; import { Autocomplete as MuiAutocomplete, Box, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { FieldErrors } from 'react-hook-form'; import { FileOutline } from 'mdi-material-ui'; +import { CSSProperties, FunctionComponent } from 'react'; +import { FieldErrors } from 'react-hook-form'; + +import { fetchDocuments } from '../../actions/Document'; +import type { DocumentHelper } from '../../actions/helper'; +import { useHelper } from '../../store'; +import type { Document } from '../../utils/api-types'; import { useAppDispatch } from '../../utils/hooks'; import useDataLoader from '../../utils/hooks/useDataLoader'; -import type { Document } from '../../utils/api-types'; -import { useHelper } from '../../store'; -import type { DocumentHelper } from '../../actions/helper'; -import { fetchDocuments } from '../../actions/Document'; const useStyles = makeStyles(() => ({ icon: { @@ -58,15 +59,15 @@ const DocumentField: FunctionComponent = ({ // Form // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - const documentsOptions = documents.filter((n) => (extensions.length > 0 ? extensions.includes(n.document_name.split('.').pop()) : true)) + const documentsOptions = documents.filter(n => (extensions.length > 0 ? extensions.includes(n.document_name.split('.').pop()) : true)) .map( - (n) => ({ + n => ({ id: n.document_id, label: n.document_name, }), ); const valueResolver = () => { - return documentsOptions.filter((document) => fieldValue === document.id).at(0); + return documentsOptions.filter(document => fieldValue === document.id).at(0); }; return ( @@ -92,7 +93,7 @@ const DocumentField: FunctionComponent = ({ )} isOptionEqualToValue={(option, value) => option.id === value.id} - renderInput={(params) => ( + renderInput={params => ( ({ @@ -22,9 +23,9 @@ const useStyles = makeStyles((theme: Theme) => ({ fontSize: 13, }, item: { - paddingLeft: 10, - height: 50, - cursor: 'pointer', + 'paddingLeft': 10, + 'height': 50, + 'cursor': 'pointer', '&:hover': { backgroundColor: theme.palette.action?.hover, }, @@ -79,11 +80,11 @@ const inlineStyles: Record = { }; interface Props { - initialValue?: { id?: string, label?: string }; + initialValue?: { id?: string; label?: string }; extensions?: string[]; label: string; name: string; - setFieldValue: (field: string, value: { id?: string, label?: string } | undefined) => void; + setFieldValue: (field: string, value: { id?: string; label?: string } | undefined) => void; /* For mandatory fields */ InputLabelProps?: { required: boolean }; error?: boolean; @@ -109,7 +110,7 @@ const FileLoader: React.FC = ({ // Fetching data const { documents }: { - documents: [RawDocument], + documents: [RawDocument]; } = useHelper((helper: DocumentHelper) => ({ documents: helper.getDocuments(), })); @@ -119,7 +120,7 @@ const FileLoader: React.FC = ({ useEffect(() => { if (initialValue?.id && documents.length > 0) { - const resolvedDocument = documents.find((doc) => doc.document_id === initialValue.id); + const resolvedDocument = documents.find(doc => doc.document_id === initialValue.id); if (resolvedDocument) { setSelectedDocument(resolvedDocument); } @@ -167,64 +168,66 @@ const FileLoader: React.FC = ({ className={`${classes.title} ${InputLabelProps?.required && error ? classes.errorText : ''}`} > {label} - {InputLabelProps?.required && *} + {InputLabelProps?.required && *} {!selectedDocument && ( - - - - - - + + + + + + )} {InputLabelProps?.required && error && ( - {t('Should not be empty')} - + + {t('Should not be empty')} + )} {selectedDocument && ( - - - - - -
    - {selectedDocument.document_name} -
    -
    - -
    -
    - -
    - - } - /> - - + + + + +
    + {selectedDocument.document_name} +
    +
    + +
    +
    + +
    + + )} /> -
    -
    )} + + + + + )}
    {open && ( = ({ onAddDocument={setSelectedDocument} extensions={extensions} > - )} + + )} ); }; diff --git a/openbas-front/src/components/fields/FileTransferDialog.tsx b/openbas-front/src/components/fields/FileTransferDialog.tsx index 6bb8e90973..a8637ffd39 100644 --- a/openbas-front/src/components/fields/FileTransferDialog.tsx +++ b/openbas-front/src/components/fields/FileTransferDialog.tsx @@ -1,19 +1,20 @@ -import { useEffect, useState } from 'react'; -import * as React from 'react'; -import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { DescriptionOutlined } from '@mui/icons-material'; +import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, List, ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import SearchFilter from '../SearchFilter'; +import { useEffect, useState } from 'react'; +import * as React from 'react'; + +import type { DocumentHelper, UserHelper } from '../../actions/helper'; import TagsFilter from '../../admin/components/common/filters/TagsFilter'; -import type { RawDocument } from '../../utils/api-types'; -import ItemTags from '../ItemTags'; import CreateDocument from '../../admin/components/components/documents/CreateDocument'; import { useHelper } from '../../store'; -import type { DocumentHelper, UserHelper } from '../../actions/helper'; -import type { Theme } from '../Theme'; -import { useFormatter } from '../i18n'; +import type { RawDocument } from '../../utils/api-types'; import { truncate } from '../../utils/String'; import Transition from '../common/Transition'; +import { useFormatter } from '../i18n'; +import ItemTags from '../ItemTags'; +import SearchFilter from '../SearchFilter'; +import type { Theme } from '../Theme'; const useStyles = makeStyles((theme: Theme) => ({ box: { @@ -26,9 +27,9 @@ const useStyles = makeStyles((theme: Theme) => ({ margin: '0 10px 10px 0', }, item: { - paddingLeft: 10, - height: 50, - cursor: 'pointer', + 'paddingLeft': 10, + 'height': 50, + 'cursor': 'pointer', '&:hover': { backgroundColor: theme.palette.action?.hover, }, @@ -61,13 +62,13 @@ const FileTransferDialog: React.FC = ({ const { t } = useFormatter(); const [keyword, setKeyword] = useState(''); - const [tags, setTags] = useState<{ id: string, label: string, color: string }[]>([]); + const [tags, setTags] = useState<{ id: string; label: string; color: string }[]>([]); const [selectedDocuments, setSelectedDocuments] = useState([]); // Fetching data const { documents, userAdmin }: { - documents: [RawDocument], - userAdmin: string + documents: [RawDocument]; + userAdmin: string; } = useHelper((helper: DocumentHelper & UserHelper) => ({ documents: helper.getDocuments(), userAdmin: helper.getMe()?.user_admin, @@ -86,7 +87,7 @@ const FileTransferDialog: React.FC = ({ setKeyword(value || ''); }; - const handleAddTag = (value: { id: string, label: string, color: string }) => { + const handleAddTag = (value: { id: string; label: string; color: string }) => { if (!tags.includes(value)) { setTags([...tags, value]); } @@ -102,7 +103,7 @@ const FileTransferDialog: React.FC = ({ }; const handleAddDocument = (document: RawDocument) => { - if (!selectedDocuments.some((doc) => doc.document_id === document.document_id)) { + if (!selectedDocuments.some(doc => doc.document_id === document.document_id)) { setSelectedDocuments([...selectedDocuments, document]); } if (!multiple && onAddDocument) { @@ -119,31 +120,31 @@ const FileTransferDialog: React.FC = ({ }; const handleRemoveDocument = (document: RawDocument) => { - setSelectedDocuments(selectedDocuments.filter((doc) => doc.document_id !== document.document_id)); + setSelectedDocuments(selectedDocuments.filter(doc => doc.document_id !== document.document_id)); }; const filterByExtensions = (document: RawDocument) => { return extensions?.length === 0 - || extensions?.map((ext) => ext.toLowerCase()).includes(document.document_name?.split('.').pop()?.toLowerCase() || ''); + || extensions?.map(ext => ext.toLowerCase()).includes(document.document_name?.split('.').pop()?.toLowerCase() || ''); }; const filterByKeyword = (document: RawDocument) => { return keyword === '' - || document.document_name?.toLowerCase().includes(keyword.toLowerCase()) - || document.document_description?.toLowerCase().includes(keyword.toLowerCase()) - || document.document_type?.toLowerCase().includes(keyword.toLowerCase()); + || document.document_name?.toLowerCase().includes(keyword.toLowerCase()) + || document.document_description?.toLowerCase().includes(keyword.toLowerCase()) + || document.document_type?.toLowerCase().includes(keyword.toLowerCase()); }; const filterByTag = (document: RawDocument) => { - return tags.length === 0 || tags.every((tag) => document.document_tags?.includes(tag.id)); + return tags.length === 0 || tags.every(tag => document.document_tags?.includes(tag.id)); }; const filteredDocuments = documents.filter((document) => { const isInitialValue = document.document_id && initialDocumentIds?.includes(document.document_id); return !isInitialValue - && filterByExtensions(document) - && filterByKeyword(document) - && filterByTag(document); + && filterByExtensions(document) + && filterByKeyword(document) + && filterByTag(document); }).slice(0, 10); return ( @@ -191,7 +192,7 @@ const FileTransferDialog: React.FC = ({ onClick={() => handleAddDocument(document)} > - + = ({ {multiple && ( - {selectedDocuments.map((document) => ( + {selectedDocuments.map(document => ( = ({ - {multiple && ()} + {multiple && ( + + )} ); diff --git a/openbas-front/src/components/fields/MarkDownField.tsx b/openbas-front/src/components/fields/MarkDownField.tsx index e378fc14b2..f3b0d289bb 100644 --- a/openbas-front/src/components/fields/MarkDownField.tsx +++ b/openbas-front/src/components/fields/MarkDownField.tsx @@ -1,8 +1,9 @@ +import { Typography } from '@mui/material'; +import { ICommand } from '@uiw/react-md-editor'; +import MDEditor, { commands } from '@uiw/react-md-editor/nohighlight'; import { useState } from 'react'; import * as React from 'react'; -import MDEditor, { commands } from '@uiw/react-md-editor/nohighlight'; -import { ICommand } from '@uiw/react-md-editor'; -import { Typography } from '@mui/material'; + import { useFormatter } from '../i18n'; interface Props { @@ -34,7 +35,7 @@ const MarkDownField: React.FC = ({ keyCommand: 'preview', buttonProps: { 'aria-label': 'write', - style: { backgroundColor: 'transparent' }, + 'style': { backgroundColor: 'transparent' }, }, icon: (
    = ({ keyCommand: 'preview', buttonProps: { 'aria-label': 'preview', - style: { backgroundColor: 'transparent' }, + 'style': { backgroundColor: 'transparent' }, }, icon: (
    = ({ disabled, }} preview={isEdit ? 'edit' : 'preview'} - onChange={(val) => onChange(val || '')} + onChange={val => onChange(val || '')} onBlur={onBlur} commands={[ writeCommand, previewCommand, - ...(isEdit ? [ - { ...commands.title, buttonProps: { disabled } }, - { ...commands.bold, buttonProps: { disabled } }, - { ...commands.italic, buttonProps: { disabled } }, - { ...commands.strikethrough, buttonProps: { disabled } }, - { ...commands.divider }, - { ...commands.link, buttonProps: { disabled } }, - { ...commands.quote, buttonProps: { disabled } }, - { ...commands.code, buttonProps: { disabled } }, - { ...commands.image, buttonProps: { disabled } }, - { ...commands.divider, buttonProps: { disabled } }, - { ...commands.unorderedListCommand, buttonProps: { disabled } }, - { ...commands.orderedListCommand, buttonProps: { disabled } }, - { ...commands.checkedListCommand, buttonProps: { disabled } }, - ] : []), + ...(isEdit + ? [ + { ...commands.title, buttonProps: { disabled } }, + { ...commands.bold, buttonProps: { disabled } }, + { ...commands.italic, buttonProps: { disabled } }, + { ...commands.strikethrough, buttonProps: { disabled } }, + { ...commands.divider }, + { ...commands.link, buttonProps: { disabled } }, + { ...commands.quote, buttonProps: { disabled } }, + { ...commands.code, buttonProps: { disabled } }, + { ...commands.image, buttonProps: { disabled } }, + { ...commands.divider, buttonProps: { disabled } }, + { ...commands.unorderedListCommand, buttonProps: { disabled } }, + { ...commands.orderedListCommand, buttonProps: { disabled } }, + { ...commands.checkedListCommand, buttonProps: { disabled } }, + ] + : []), ]} extraCommands={[]} - />); + /> + ); }; export default MarkDownField; diff --git a/openbas-front/src/components/fields/MarkDownFieldController.tsx b/openbas-front/src/components/fields/MarkDownFieldController.tsx index 87f27ea001..de1e736635 100644 --- a/openbas-front/src/components/fields/MarkDownFieldController.tsx +++ b/openbas-front/src/components/fields/MarkDownFieldController.tsx @@ -1,6 +1,7 @@ +import { Box, FormHelperText, InputLabel } from '@mui/material'; import * as React from 'react'; import { useController, useFormContext } from 'react-hook-form'; -import { Box, FormHelperText, InputLabel } from '@mui/material'; + import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; import MarkDownField from './MarkDownField'; diff --git a/openbas-front/src/components/fields/MultipleFileLoader.tsx b/openbas-front/src/components/fields/MultipleFileLoader.tsx index 2d88b8423f..415a09319a 100644 --- a/openbas-front/src/components/fields/MultipleFileLoader.tsx +++ b/openbas-front/src/components/fields/MultipleFileLoader.tsx @@ -1,15 +1,16 @@ -import { FunctionComponent, useContext, useState } from 'react'; -import { ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { ControlPointOutlined } from '@mui/icons-material'; +import { ListItem, ListItemIcon, ListItemText } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import { useFormatter } from '../i18n'; +import { FunctionComponent, useContext, useState } from 'react'; + import { fetchDocuments } from '../../actions/Document'; -import useDataLoader from '../../utils/hooks/useDataLoader'; +import { PermissionsContext } from '../../admin/components/common/Context'; +import type { RawDocument } from '../../utils/api-types'; import { useAppDispatch } from '../../utils/hooks'; +import useDataLoader from '../../utils/hooks/useDataLoader'; +import { useFormatter } from '../i18n'; import type { Theme } from '../Theme'; -import { PermissionsContext } from '../../admin/components/common/Context'; import FileTransferDialog from './FileTransferDialog'; -import type { RawDocument } from '../../utils/api-types'; const useStyles = makeStyles((theme: Theme) => ({ item: { @@ -25,7 +26,7 @@ const useStyles = makeStyles((theme: Theme) => ({ interface Props { hasAttachments?: boolean; - handleAddDocuments: (documents: { document_id: string, document_attached: boolean }[]) => void; + handleAddDocuments: (documents: { document_id: string; document_attached: boolean }[]) => void; initialDocumentIds: string[]; } @@ -49,7 +50,7 @@ const MultipleFileLoader: FunctionComponent = ({ const handleOpen = () => setOpen(true); const submitAddDocuments = (documents: RawDocument[]) => { - handleAddDocuments(documents.filter((doc) => doc.document_id !== undefined) + handleAddDocuments(documents.filter(doc => doc.document_id !== undefined) .map((document: RawDocument) => ({ document_id: document.document_id!, document_attached: hasAttachments, diff --git a/openbas-front/src/components/fields/OldMarkDownField.tsx b/openbas-front/src/components/fields/OldMarkDownField.tsx index 995e223fad..376ad5125c 100644 --- a/openbas-front/src/components/fields/OldMarkDownField.tsx +++ b/openbas-front/src/components/fields/OldMarkDownField.tsx @@ -1,10 +1,11 @@ -import * as React from 'react'; +import { FormHelperText, InputLabel, useTheme } from '@mui/material'; import MDEditor, { commands } from '@uiw/react-md-editor/nohighlight'; +import * as React from 'react'; import { Field, FieldInputProps, FieldMetaState } from 'react-final-form'; -import { FormHelperText, InputLabel, useTheme } from '@mui/material'; + +import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; import { useFormatter } from '../i18n'; import type { Theme } from '../Theme'; -import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; interface Props { label: string; @@ -44,7 +45,7 @@ const MarkDownFieldBase: React.FC = ({ disabled, }} preview="edit" - onChange={(data) => onChange(data)} + onChange={data => onChange(data)} commands={[ { ...commands.title, buttonProps: { disabled } }, { ...commands.bold, buttonProps: { disabled } }, diff --git a/openbas-front/src/components/fields/SecurityPlatformField.tsx b/openbas-front/src/components/fields/SecurityPlatformField.tsx index 6bff9c54d3..37f7103793 100644 --- a/openbas-front/src/components/fields/SecurityPlatformField.tsx +++ b/openbas-front/src/components/fields/SecurityPlatformField.tsx @@ -1,13 +1,14 @@ -import { CSSProperties, FunctionComponent } from 'react'; import { Autocomplete as MuiAutocomplete, Box, TextField } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; +import { CSSProperties, FunctionComponent } from 'react'; import { FieldErrors } from 'react-hook-form'; + +import type { SecurityPlatformHelper } from '../../actions/assets/asset-helper'; +import { fetchSecurityPlatforms } from '../../actions/assets/securityPlatform-actions'; +import { useHelper } from '../../store'; +import type { SecurityPlatform } from '../../utils/api-types'; import { useAppDispatch } from '../../utils/hooks'; import useDataLoader from '../../utils/hooks/useDataLoader'; -import type { SecurityPlatform } from '../../utils/api-types'; -import { useHelper } from '../../store'; -import { fetchSecurityPlatforms } from '../../actions/assets/securityPlatform-actions'; -import type { SecurityPlatformHelper } from '../../actions/assets/asset-helper'; import type { Theme } from '../Theme'; const useStyles = makeStyles(() => ({ @@ -39,7 +40,7 @@ interface Props { const securityPlatformsToOptions = (securityPlatforms: SecurityPlatform[], filterOptions: (securityPlatform: SecurityPlatform) => boolean) => { return securityPlatforms .filter(filterOptions) - .map((n) => ({ + .map(n => ({ id: n.asset_id, label: n.asset_name, logo_dark: n.security_platform_logo_dark, @@ -63,7 +64,7 @@ const SecurityPlatformField: FunctionComponent = ({ const dispatch = useAppDispatch(); // Fetching data - const { securityPlatforms }: { securityPlatforms: SecurityPlatform[]; } = useHelper((helper: SecurityPlatformHelper) => ({ + const { securityPlatforms }: { securityPlatforms: SecurityPlatform[] } = useHelper((helper: SecurityPlatformHelper) => ({ securityPlatforms: helper.getSecurityPlatforms(), })); useDataLoader(() => { @@ -73,7 +74,7 @@ const SecurityPlatformField: FunctionComponent = ({ // Form const securityPlatformsOptions = securityPlatformsToOptions(securityPlatforms, filterOptions); - const selectedValue = securityPlatformsOptions.find((option) => option.id === fieldValue) || null; + const selectedValue = securityPlatformsOptions.find(option => option.id === fieldValue) || null; return (
    @@ -105,7 +106,7 @@ const SecurityPlatformField: FunctionComponent = ({ ); }} isOptionEqualToValue={(option, value) => option.id === value.id} - renderInput={(params) => ( + renderInput={params => ( ( +const SliderField = props => ( ); diff --git a/openbas-front/src/components/fields/SwitchField.js b/openbas-front/src/components/fields/SwitchField.js index 14b2fda512..69c5b9044b 100644 --- a/openbas-front/src/components/fields/SwitchField.js +++ b/openbas-front/src/components/fields/SwitchField.js @@ -1,5 +1,5 @@ +import { FormControl, FormControlLabel, FormGroup, FormHelperText, Switch as MuiSwitch } from '@mui/material'; import { Field } from 'react-final-form'; -import { FormGroup, FormControlLabel, Switch as MuiSwitch, FormHelperText, FormControl } from '@mui/material'; const renderSwitch = ({ label, @@ -11,7 +11,7 @@ const renderSwitch = ({ { @@ -19,7 +19,7 @@ const renderSwitch = ({ }} {...others} /> - } + )} label={label} /> @@ -27,7 +27,7 @@ const renderSwitch = ({ ); -const SwitchField = (props) => ( +const SwitchField = props => ( ); diff --git a/openbas-front/src/components/fields/TagField.tsx b/openbas-front/src/components/fields/TagField.tsx index 030f65fc30..684925d767 100644 --- a/openbas-front/src/components/fields/TagField.tsx +++ b/openbas-front/src/components/fields/TagField.tsx @@ -1,17 +1,18 @@ -import { CSSProperties, FunctionComponent, useState } from 'react'; -import * as R from 'ramda'; import { AddOutlined, LabelOutlined } from '@mui/icons-material'; import { Autocomplete as MuiAutocomplete, Box, Dialog, DialogContent, DialogTitle, IconButton, TextField } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import * as R from 'ramda'; +import { CSSProperties, FunctionComponent, useState } from 'react'; import { FieldErrors } from 'react-hook-form'; -import { useAppDispatch } from '../../utils/hooks'; -import useDataLoader from '../../utils/hooks/useDataLoader'; -import type { Tag } from '../../utils/api-types'; -import { useHelper } from '../../store'; + import type { TagHelper, UserHelper } from '../../actions/helper'; -import { useFormatter } from '../i18n'; import { addTag, fetchTags } from '../../actions/Tag'; import TagForm from '../../admin/components/settings/tags/TagForm'; +import { useHelper } from '../../store'; +import type { Tag } from '../../utils/api-types'; +import { useAppDispatch } from '../../utils/hooks'; +import useDataLoader from '../../utils/hooks/useDataLoader'; +import { useFormatter } from '../i18n'; const useStyles = makeStyles(() => ({ icon: { @@ -66,19 +67,19 @@ const TagField: FunctionComponent = ({ // Form const tagsOptions = tags.map( - (n) => ({ + n => ({ id: n.tag_id, label: n.tag_name, color: n.tag_color, }), ); const values = () => { - return tagsOptions.filter((tag) => fieldValue.includes(tag.id)); + return tagsOptions.filter(tag => fieldValue.includes(tag.id)); }; const onSubmit = (data: Tag) => { dispatch(addTag(data)) - .then((result: { entities: { tags: Record }, result: string }) => { + .then((result: { entities: { tags: Record }; result: string }) => { if (result.result) { const newTag = result.entities.tags[result.result]; const newTags = R.append( @@ -108,7 +109,7 @@ const TagField: FunctionComponent = ({ clearOnEscape={false} options={tagsOptions} onChange={(_, value) => { - fieldOnChange(value.map((v) => v.id)); + fieldOnChange(value.map(v => v.id)); }} renderOption={(props, option) => ( @@ -119,7 +120,7 @@ const TagField: FunctionComponent = ({ )} isOptionEqualToValue={(option, value) => option.id === value.id} - renderInput={(params) => ( + renderInput={params => ( { @@ -9,13 +10,13 @@ const TextFieldBase = ({ askAi, control, setValue, ...props }) => { {...props} InputProps={{ endAdornment: askAi && ( - setValue(props.inputProps.name, val)} - format="text" - disabled={props.disabled} - /> + setValue(props.inputProps.name, val)} + format="text" + disabled={props.disabled} + /> ), }} /> diff --git a/openbas-front/src/components/i18n.js b/openbas-front/src/components/i18n.js index ab9e4a719d..53ef748f91 100644 --- a/openbas-front/src/components/i18n.js +++ b/openbas-front/src/components/i18n.js @@ -1,6 +1,7 @@ -import { Component } from 'react'; -import { useIntl, injectIntl } from 'react-intl'; import moment from 'moment-timezone'; +import { Component } from 'react'; +import { injectIntl, useIntl } from 'react-intl'; + import { bytesFormat, numberFormat } from '../utils/Number'; export const isNone = (date) => { @@ -27,7 +28,7 @@ const inject18n = (WrappedComponent) => { numberFormat(number).symbol }`; }; - const formatBytes = (number) => `${this.props.intl.formatNumber(bytesFormat(number).number)}${ + const formatBytes = number => `${this.props.intl.formatNumber(bytesFormat(number).number)}${ bytesFormat(number).symbol }`; const longDate = (date) => { @@ -147,7 +148,7 @@ const inject18n = (WrappedComponent) => { {...this.props} {...{ t: translate }} {...{ - tPick: (label) => label[this.props.intl.locale] + tPick: label => label[this.props.intl.locale] ?? label[this.props.intl.defaultLocale], }} {...{ n: formatNumber }} @@ -184,7 +185,7 @@ export const useFormatter = () => { numberFormat(number).symbol }`; }; - const formatBytes = (number) => `${intl.formatNumber(bytesFormat(number).number)}${ + const formatBytes = number => `${intl.formatNumber(bytesFormat(number).number)}${ bytesFormat(number).symbol }`; const longDate = (date) => { @@ -309,7 +310,7 @@ export const useFormatter = () => { return { t: translate, locale: intl.locale ?? intl.defaultLocale, - tPick: (label) => (label ? label[intl.locale] ?? label[intl.defaultLocale] : ''), + tPick: label => (label ? label[intl.locale] ?? label[intl.defaultLocale] : ''), n: formatNumber, b: formatBytes, fld: longDate, diff --git a/openbas-front/src/components/nodes/NodeInject.tsx b/openbas-front/src/components/nodes/NodeInject.tsx index 19fd1cfb34..a979c5eedb 100644 --- a/openbas-front/src/components/nodes/NodeInject.tsx +++ b/openbas-front/src/components/nodes/NodeInject.tsx @@ -1,19 +1,20 @@ -import { memo } from 'react'; -import * as React from 'react'; -import { Handle, NodeProps, Position, Node, OnConnect, XYPosition } from '@xyflow/react'; -import { makeStyles, useTheme } from '@mui/styles'; import { Tooltip } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; +import { Handle, Node, NodeProps, OnConnect, Position, XYPosition } from '@xyflow/react'; import moment from 'moment'; -import type { Theme } from '../Theme'; -import { isNotEmptyField } from '../../utils/utils'; +import { memo } from 'react'; +import * as React from 'react'; + +import type { InjectOutputType, InjectStore } from '../../actions/injects/Inject'; import InjectIcon from '../../admin/components/common/injects/InjectIcon'; import InjectPopover from '../../admin/components/common/injects/InjectPopover'; -import type { InjectOutputType, InjectStore } from '../../actions/injects/Inject'; +import { isNotEmptyField } from '../../utils/utils'; import { useFormatter } from '../i18n'; +import type { Theme } from '../Theme'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ node: { position: 'relative', border: @@ -78,27 +79,27 @@ const useStyles = makeStyles((theme) => ({ })); export type NodeInject = Node<{ - background?: string, - color?: string, - key: string, - label: string, - description?: string, - isTargeted?: boolean, - isTargeting?: boolean, - onConnectInjects?: OnConnect - inject?: InjectOutputType, - fixedY?: number, - startDate?: string, - targets: string[], + background?: string; + color?: string; + key: string; + label: string; + description?: string; + isTargeted?: boolean; + isTargeting?: boolean; + onConnectInjects?: OnConnect; + inject?: InjectOutputType; + fixedY?: number; + startDate?: string; + targets: string[]; boundingBox?: { - topLeft: XYPosition, - bottomRight: XYPosition - }, - exerciseOrScenarioId: string, - onSelectedInject(inject?: InjectOutputType): void, - onCreate: (result: { result: string, entities: { injects: Record } }) => void, - onUpdate: (result: { result: string, entities: { injects: Record } }) => void, - onDelete: (result: string) => void, + topLeft: XYPosition; + bottomRight: XYPosition; + }; + exerciseOrScenarioId: string; + onSelectedInject(inject?: InjectOutputType): void; + onCreate: (result: { result: string; entities: { injects: Record } }) => void; + onUpdate: (result: { result: string; entities: { injects: Record } }) => void; + onDelete: (result: string) => void; } >; @@ -167,11 +168,14 @@ const NodeInjectComponent = ({ data }: NodeProps) => { } return ( -
    ) => { type={ data.inject?.inject_injector_contract?.injector_contract_payload ? data.inject?.inject_injector_contract?.injector_contract_payload?.payload_collector_type - || data.inject?.inject_injector_contract?.injector_contract_payload?.payload_type + || data.inject?.inject_injector_contract?.injector_contract_payload?.payload_type : data.inject?.inject_type - } + } />
    { data.startDate !== undefined ? (
    {convertToAbsoluteTime(data.startDate, data.inject!.inject_depends_duration)}
    + > + {convertToAbsoluteTime(data.startDate, data.inject!.inject_depends_duration)} +
    ) : (
    {convertToRelativeTime(data.inject!.inject_depends_duration)}
    + > + {convertToRelativeTime(data.inject!.inject_depends_duration)} +
    )} @@ -223,13 +231,23 @@ const NodeInjectComponent = ({ data }: NodeProps) => {
    {(data.isTargeted ? ( - ) : null)} + /> + ) : null)} {(data.isTargeting ? ( - ) : null)} + /> + ) : null)}
    ); }; diff --git a/openbas-front/src/components/nodes/NodePhantom.tsx b/openbas-front/src/components/nodes/NodePhantom.tsx index c2481c0b3d..d29f06cfb2 100644 --- a/openbas-front/src/components/nodes/NodePhantom.tsx +++ b/openbas-front/src/components/nodes/NodePhantom.tsx @@ -1,23 +1,24 @@ -import { FunctionComponent, memo } from 'react'; -import { makeStyles } from '@mui/styles'; import { AddCircleOutline } from '@mui/icons-material'; +import { makeStyles } from '@mui/styles'; +import { FunctionComponent, memo } from 'react'; + import type { Theme } from '../Theme'; const useStyles = makeStyles(() => ({ node: { - border: '2px dashed rgba(255, 255, 255, 0.12)', - borderLeft: '2px solid rgba(255, 255, 255, 0.3)', - borderRadius: 4, - width: 50, - height: 50, - padding: '8px 5px 5px 5px', - display: 'flex', - alignItems: 'center', - flexWrap: 'wrap', - textAlign: 'center', - backgroundColor: '#09101e', - color: 'white', - cursor: 'none !important', + 'border': '2px dashed rgba(255, 255, 255, 0.12)', + 'borderLeft': '2px solid rgba(255, 255, 255, 0.3)', + 'borderRadius': 4, + 'width': 50, + 'height': 50, + 'padding': '8px 5px 5px 5px', + 'display': 'flex', + 'alignItems': 'center', + 'flexWrap': 'wrap', + 'textAlign': 'center', + 'backgroundColor': '#09101e', + 'color': 'white', + 'cursor': 'none !important', '&:hover': { backgroundColor: '#0d1626', }, @@ -36,8 +37,8 @@ const useStyles = makeStyles(() => ({ })); interface Props { - time: string, - newNodeSize: number, + time: string; + newNodeSize: number; } /** @@ -55,7 +56,7 @@ const NodePhantomComponent: FunctionComponent = (props) => {
    - +
    diff --git a/openbas-front/src/components/nodes/index.ts b/openbas-front/src/components/nodes/index.ts index 8bca70559e..a5c3aeaec1 100644 --- a/openbas-front/src/components/nodes/index.ts +++ b/openbas-front/src/components/nodes/index.ts @@ -1,4 +1,5 @@ import { NodeTypes } from '@xyflow/react'; + import NodeInjectExport from './NodeInject'; const nodeTypes: NodeTypes = { diff --git a/openbas-front/src/components/scalebar/ScaleBar.tsx b/openbas-front/src/components/scalebar/ScaleBar.tsx index 5069a5ecbf..3c841fd995 100644 --- a/openbas-front/src/components/scalebar/ScaleBar.tsx +++ b/openbas-front/src/components/scalebar/ScaleBar.tsx @@ -1,10 +1,11 @@ -import { FunctionComponent } from 'react'; import { makeStyles, useTheme } from '@mui/styles'; +import { FunctionComponent } from 'react'; + import { useFormatter } from '../i18n'; -import { Scale } from './Tick'; import type { Theme } from '../Theme'; +import { Scale } from './Tick'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ scaleBar: { position: 'relative', }, @@ -103,13 +104,15 @@ const ScaleBar: FunctionComponent = ({ {expectationExpectedScore < 100 && (
    {expectationExpectedScore} -
    )} +
    + )}
    {scale.min.label}
    {scale.ticks[0].label}
    - )} + + )}
    ); diff --git a/openbas-front/src/index.tsx b/openbas-front/src/index.tsx index d35d7ee92b..4bcb40ab20 100644 --- a/openbas-front/src/index.tsx +++ b/openbas-front/src/index.tsx @@ -1,13 +1,15 @@ -import { StrictMode } from 'react'; import '@fontsource/ibm-plex-sans'; import '@fontsource/geologica'; -import { createRoot } from 'react-dom/client'; import '@xyflow/react/dist/style.css'; -import App from './app'; import './static/css/index.css'; import './static/css/CKEditorDark.css'; import './static/css/CKEditorLight.css'; +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +import App from './app'; + const container = document.getElementById('root'); if (container) { const root = createRoot(container); diff --git a/openbas-front/src/private/Index.tsx b/openbas-front/src/private/Index.tsx index d2e5b9101e..715739f85a 100644 --- a/openbas-front/src/private/Index.tsx +++ b/openbas-front/src/private/Index.tsx @@ -1,13 +1,14 @@ -import { Route, Routes } from 'react-router-dom'; import { makeStyles } from '@mui/styles'; -import TopBar from './components/nav/TopBar'; -import Dashboard from './components/Dashboard'; -import useDataLoader from '../utils/hooks/useDataLoader'; +import { Route, Routes } from 'react-router-dom'; + import { errorWrapper } from '../components/Error'; -import type { Theme } from '../components/Theme'; import NotFound from '../components/NotFound'; +import type { Theme } from '../components/Theme'; +import useDataLoader from '../utils/hooks/useDataLoader'; +import Dashboard from './components/Dashboard'; +import TopBar from './components/nav/TopBar'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ root: { minWidth: 1280, height: '100%', @@ -33,7 +34,7 @@ const Index = () => { {/* Not found */} - }/> + } />
    diff --git a/openbas-front/src/private/components/Dashboard.js b/openbas-front/src/private/components/Dashboard.js index bdf25f21da..11d5f336cc 100644 --- a/openbas-front/src/private/components/Dashboard.js +++ b/openbas-front/src/private/components/Dashboard.js @@ -1,6 +1,7 @@ +import { withStyles, withTheme } from '@mui/styles'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; -import { withStyles, withTheme } from '@mui/styles'; + import inject18n, { useFormatter } from '../../components/i18n'; const styles = () => ({ diff --git a/openbas-front/src/private/components/nav/TopBar.tsx b/openbas-front/src/private/components/nav/TopBar.tsx index b6afedff0f..97c8e274bc 100644 --- a/openbas-front/src/private/components/nav/TopBar.tsx +++ b/openbas-front/src/private/components/nav/TopBar.tsx @@ -1,15 +1,16 @@ +import { AccountCircleOutlined } from '@mui/icons-material'; +import { AppBar, IconButton, Menu, MenuItem, MenuProps, Toolbar } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; import { useState } from 'react'; import * as React from 'react'; -import { AppBar, Toolbar, IconButton, Menu, MenuProps, MenuItem } from '@mui/material'; import { Link } from 'react-router-dom'; -import { AccountCircleOutlined } from '@mui/icons-material'; -import { makeStyles, useTheme } from '@mui/styles'; + import { logout } from '../../../actions/Application'; import { useFormatter } from '../../../components/i18n'; -import { useAppDispatch } from '../../../utils/hooks'; import type { Theme } from '../../../components/Theme'; +import { useAppDispatch } from '../../../utils/hooks'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ appBar: { width: '100%', zIndex: theme.zIndex.drawer + 1, diff --git a/openbas-front/src/public/Index.tsx b/openbas-front/src/public/Index.tsx index b20c019a4b..4005ade1f5 100644 --- a/openbas-front/src/public/Index.tsx +++ b/openbas-front/src/public/Index.tsx @@ -1,11 +1,12 @@ -import { lazy, Suspense } from 'react'; +import { makeStyles } from '@mui/styles'; import * as PropTypes from 'prop-types'; +import { lazy, Suspense } from 'react'; import { Route, Routes } from 'react-router-dom'; -import { makeStyles } from '@mui/styles'; + import { errorWrapper } from '../components/Error'; -import Reset from './components/login/Reset'; -import type { Theme } from '../components/Theme'; import Loader from '../components/Loader'; +import type { Theme } from '../components/Theme'; +import Reset from './components/login/Reset'; const Login = lazy(() => import('./components/login/Login')); const Comcheck = lazy(() => import('./components/comcheck/Comcheck')); @@ -14,7 +15,7 @@ const Challenges = lazy(() => import('./components/challenges/Challenges')); const ExerciseViewLessons = lazy(() => import('./components/lessons/ExerciseViewLessons')); const ScenarioViewLessons = lazy(() => import('./components/lessons/ScenarioViewLessons')); -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ root: { minWidth: 1280, height: '100%', diff --git a/openbas-front/src/public/Root.tsx b/openbas-front/src/public/Root.tsx index 8ec9554b2c..32b1233f2b 100644 --- a/openbas-front/src/public/Root.tsx +++ b/openbas-front/src/public/Root.tsx @@ -1,7 +1,8 @@ import { CssBaseline } from '@mui/material'; import { StyledEngineProvider } from '@mui/material/styles'; -import ConnectedThemeProvider from '../components/AppThemeProvider'; + import ConnectedIntlProvider from '../components/AppIntlProvider'; +import ConnectedThemeProvider from '../components/AppThemeProvider'; import Index from './Index'; const Root = () => ( diff --git a/openbas-front/src/public/components/challenges/Challenges.js b/openbas-front/src/public/components/challenges/Challenges.js index 376327b4ce..d8b52322f7 100644 --- a/openbas-front/src/public/components/challenges/Challenges.js +++ b/openbas-front/src/public/components/challenges/Challenges.js @@ -1,6 +1,6 @@ import { useQueryParameter } from '../../../utils/Environment'; -import ChallengesPreview from './ChallengesPreview'; import ChallengesPlayer from './ChallengesPlayer'; +import ChallengesPreview from './ChallengesPreview'; const Challenges = () => { const [preview] = useQueryParameter(['preview']); diff --git a/openbas-front/src/public/components/challenges/ChallengesPlayer.js b/openbas-front/src/public/components/challenges/ChallengesPlayer.js index e306718df6..f37f08edf4 100644 --- a/openbas-front/src/public/components/challenges/ChallengesPlayer.js +++ b/openbas-front/src/public/components/challenges/ChallengesPlayer.js @@ -1,55 +1,56 @@ -import { useEffect, useState } from 'react'; -import { Form } from 'react-final-form'; -import { useDispatch } from 'react-redux'; -import { makeStyles, useTheme } from '@mui/styles'; -import { Link, useParams } from 'react-router-dom'; import { + ArrowDropDownOutlined, + ArrowDropUpOutlined, + AttachmentOutlined, + CrisisAlertOutlined, + DescriptionOutlined, + EmojiEventsOutlined, + OutlinedFlagOutlined, + PendingActionsOutlined, + SportsScoreOutlined, +} from '@mui/icons-material'; +import { + Alert, + Avatar, Button, - Typography, - Grid, Card, - CardHeader, - Avatar, - CardContent, CardActionArea, - Tooltip, + CardContent, + CardHeader, Chip, Dialog, - DialogTitle, DialogContent, - Alert, - List, + DialogTitle, + Grid, IconButton, + List, ListItem, ListItemIcon, ListItemText, + Tooltip, + Typography, } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; -import { - ArrowDropDownOutlined, - ArrowDropUpOutlined, - AttachmentOutlined, - CrisisAlertOutlined, - DescriptionOutlined, - EmojiEventsOutlined, - OutlinedFlagOutlined, - SportsScoreOutlined, - PendingActionsOutlined, -} from '@mui/icons-material'; -import { validateChallenge, fetchPlayerChallenges } from '../../../actions/Challenge'; -import { useHelper } from '../../../store'; -import { useQueryParameter } from '../../../utils/Environment'; -import { useFormatter } from '../../../components/i18n'; -import { usePermissions } from '../../../utils/Exercise'; +import { useEffect, useState } from 'react'; +import { Form } from 'react-final-form'; +import { useDispatch } from 'react-redux'; +import { Link, useParams } from 'react-router-dom'; + import { fetchMe } from '../../../actions/Application'; +import { fetchPlayerChallenges, validateChallenge } from '../../../actions/Challenge'; import { fetchPlayerDocuments } from '../../../actions/Document'; -import Loader from '../../../components/Loader'; +import DocumentType from '../../../admin/components/components/documents/DocumentType'; +import Transition from '../../../components/common/Transition'; import Empty from '../../../components/Empty'; import ExpandableMarkdown from '../../../components/ExpandableMarkdown'; -import DocumentType from '../../../admin/components/components/documents/DocumentType'; -import ItemTags from '../../../components/ItemTags'; import OldTextField from '../../../components/fields/OldTextField'; -import Transition from '../../../components/common/Transition'; +import { useFormatter } from '../../../components/i18n'; +import ItemTags from '../../../components/ItemTags'; +import Loader from '../../../components/Loader'; +import { useHelper } from '../../../store'; +import { useQueryParameter } from '../../../utils/Environment'; +import { usePermissions } from '../../../utils/Exercise'; const useStyles = makeStyles(() => ({ root: { @@ -164,7 +165,7 @@ const ChallengesPlayer = () => { const [documentsSortBy, setDocumentsSortBy] = useState('document_name'); const [documentsOrderAsc, setDocumentsOrderAsc] = useState(true); const { exerciseId } = useParams(); - const { challengesReader, documentsMap } = useHelper((helper) => ({ + const { challengesReader, documentsMap } = useHelper(helper => ({ challengesReader: helper.getChallengesReader(exerciseId), documentsMap: helper.getDocumentsMap(), })); @@ -189,11 +190,13 @@ const ChallengesPlayer = () => { setDocumentsOrderAsc(!documentsSortBy); }; const documentsSortHeader = (field, label, isSortable) => { - const sortComponent = documentsOrderAsc ? ( - - ) : ( - - ); + const sortComponent = documentsOrderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    { setCurrentChallengeEntry( R.head( challengeEntries.filter( - (n) => n.challenge_detail.challenge_id === cid, + n => n.challenge_detail.challenge_id === cid, ), ), ); @@ -325,18 +328,17 @@ const ChallengesPlayer = () => { sx={{ width: '100%', height: '100%' }} > setCurrentChallengeEntry(challengeEntry) - } + onClick={() => setCurrentChallengeEntry(challengeEntry)} > - } + )} title={challenge.challenge_name} subheader={challenge.challenge_category} - action={ + action={( { > - } + )} /> { {documentsSortHeader('document_name', 'Name', true)} {documentsSortHeader('document_type', 'Type', true)} {documentsSortHeader('document_tags', 'Tags', true)}
    - } + )} /> {(currentChallenge?.challenge_documents || []).map( @@ -470,7 +472,7 @@ const ChallengesPlayer = () => {
    { />
    - } + )} /> ); @@ -517,12 +519,12 @@ const ChallengesPlayer = () => { )} {invalidResult() && ( - setCurrentResult(null)} - > - {t('Flag is not correct! Try again...')} - + setCurrentResult(null)} + > + {t('Flag is not correct! Try again...')} + )}
    )} {noResult() && ( - submit(currentChallenge?.challenge_id, data) - } - validate={validate} - mutators={{ - setValue: ([field, value], state, { changeValue }) => { - changeValue(state, field, () => value); - }, - }} - > - {({ handleSubmit, submitting, errors }) => ( - - -
    - - -
    - - )} - +
    submit(currentChallenge?.challenge_id, data)} + validate={validate} + mutators={{ + setValue: ([field, value], state, { changeValue }) => { + changeValue(state, field, () => value); + }, + }} + > + {({ handleSubmit, submitting, errors }) => ( + + +
    + + +
    + + )} + )} diff --git a/openbas-front/src/public/components/challenges/ChallengesPreview.js b/openbas-front/src/public/components/challenges/ChallengesPreview.js index 69a91d6050..c28a3caf2c 100644 --- a/openbas-front/src/public/components/challenges/ChallengesPreview.js +++ b/openbas-front/src/public/components/challenges/ChallengesPreview.js @@ -1,53 +1,54 @@ -import { useEffect, useState } from 'react'; -import { Form } from 'react-final-form'; -import { useDispatch } from 'react-redux'; -import { makeStyles, useTheme } from '@mui/styles'; -import { Link, useParams } from 'react-router-dom'; import { + ArrowDropDownOutlined, + ArrowDropUpOutlined, + AttachmentOutlined, + CrisisAlertOutlined, + DescriptionOutlined, + EmojiEventsOutlined, + OutlinedFlagOutlined, + SportsScoreOutlined, +} from '@mui/icons-material'; +import { + Alert, + Avatar, Button, - Typography, - Grid, Card, - CardHeader, - Avatar, - CardContent, CardActionArea, - Tooltip, + CardContent, + CardHeader, Chip, Dialog, - DialogTitle, DialogContent, - Alert, + DialogTitle, + Grid, List, ListItem, ListItemIcon, ListItemText, + Tooltip, + Typography, } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; -import { - ArrowDropDownOutlined, - ArrowDropUpOutlined, - AttachmentOutlined, - CrisisAlertOutlined, - DescriptionOutlined, - EmojiEventsOutlined, - OutlinedFlagOutlined, - SportsScoreOutlined, -} from '@mui/icons-material'; -import { tryChallenge, fetchObserverChallenges } from '../../../actions/Challenge'; -import { useHelper } from '../../../store'; -import { useQueryParameter } from '../../../utils/Environment'; -import { useFormatter } from '../../../components/i18n'; -import { usePermissions } from '../../../utils/Exercise'; +import { useEffect, useState } from 'react'; +import { Form } from 'react-final-form'; +import { useDispatch } from 'react-redux'; +import { Link, useParams } from 'react-router-dom'; + import { fetchMe } from '../../../actions/Application'; +import { fetchObserverChallenges, tryChallenge } from '../../../actions/Challenge'; import { fetchPlayerDocuments } from '../../../actions/Document'; -import Loader from '../../../components/Loader'; +import DocumentType from '../../../admin/components/components/documents/DocumentType'; +import Transition from '../../../components/common/Transition'; import Empty from '../../../components/Empty'; import ExpandableMarkdown from '../../../components/ExpandableMarkdown'; -import DocumentType from '../../../admin/components/components/documents/DocumentType'; -import ItemTags from '../../../components/ItemTags'; import OldTextField from '../../../components/fields/OldTextField'; -import Transition from '../../../components/common/Transition'; +import { useFormatter } from '../../../components/i18n'; +import ItemTags from '../../../components/ItemTags'; +import Loader from '../../../components/Loader'; +import { useHelper } from '../../../store'; +import { useQueryParameter } from '../../../utils/Environment'; +import { usePermissions } from '../../../utils/Exercise'; const useStyles = makeStyles(() => ({ root: { @@ -162,7 +163,7 @@ const ChallengesPreview = () => { const [documentsSortBy, setDocumentsSortBy] = useState('document_name'); const [documentsOrderAsc, setDocumentsOrderAsc] = useState(true); const { exerciseId } = useParams(); - const { challengesReader, documentsMap } = useHelper((helper) => ({ + const { challengesReader, documentsMap } = useHelper(helper => ({ challengesReader: helper.getChallengesReader(exerciseId), documentsMap: helper.getDocumentsMap(), })); @@ -183,11 +184,13 @@ const ChallengesPreview = () => { setDocumentsOrderAsc(!documentsSortBy); }; const documentsSortHeader = (field, label, isSortable) => { - const sortComponent = documentsOrderAsc ? ( - - ) : ( - - ); + const sortComponent = documentsOrderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    { onClick={() => setCurrentChallenge(challenge)} > - } + )} title={challenge.challenge_name} subheader={challenge.challenge_category} /> @@ -399,13 +402,13 @@ const ChallengesPreview = () => { {documentsSortHeader('document_name', 'Name', true)} {documentsSortHeader('document_type', 'Type', true)} {documentsSortHeader('document_tags', 'Tags', true)}
    - } + )} /> {(currentChallenge?.challenge_documents || []).map( @@ -424,7 +427,7 @@ const ChallengesPreview = () => {
    { />
    - } + )} /> ); @@ -487,8 +490,7 @@ const ChallengesPreview = () => { {currentResult === null && (
    submit(currentChallenge?.challenge_id, data) - } + onSubmit={data => submit(currentChallenge?.challenge_id, data)} validate={validate} mutators={{ setValue: ([field, value], state, { changeValue }) => { diff --git a/openbas-front/src/public/components/channels/Channel.js b/openbas-front/src/public/components/channels/Channel.js index 4eea933fd0..9109737e4b 100644 --- a/openbas-front/src/public/components/channels/Channel.js +++ b/openbas-front/src/public/components/channels/Channel.js @@ -1,6 +1,6 @@ import { useQueryParameter } from '../../../utils/Environment'; -import ChannelPreview from './ChannelPreview'; import ChannelPlayer from './ChannelPlayer'; +import ChannelPreview from './ChannelPreview'; const Channel = () => { const [preview] = useQueryParameter(['preview']); diff --git a/openbas-front/src/public/components/channels/ChannelMicroblogging.js b/openbas-front/src/public/components/channels/ChannelMicroblogging.js index fa2e55e70d..a8ea08fde3 100644 --- a/openbas-front/src/public/components/channels/ChannelMicroblogging.js +++ b/openbas-front/src/public/components/channels/ChannelMicroblogging.js @@ -1,11 +1,12 @@ -import { makeStyles, useTheme } from '@mui/styles'; -import { Typography, Grid, Card, CardHeader, CardContent, Avatar, CardMedia, Button } from '@mui/material'; import { ChatBubbleOutlineOutlined, FavoriteBorderOutlined, ShareOutlined } from '@mui/icons-material'; +import { Avatar, Button, Card, CardContent, CardHeader, CardMedia, Grid, Typography } from '@mui/material'; +import { makeStyles, useTheme } from '@mui/styles'; + +import Empty from '../../../components/Empty'; +import ExpandableMarkdown from '../../../components/ExpandableMarkdown'; import { useFormatter } from '../../../components/i18n'; import { useHelper } from '../../../store'; -import ExpandableMarkdown from '../../../components/ExpandableMarkdown'; import { useQueryParameter } from '../../../utils/Environment'; -import Empty from '../../../components/Empty'; const useStyles = makeStyles(() => ({ container: { @@ -42,7 +43,7 @@ const ChannelMicroblogging = ({ channelReader }) => { channel_information: channel, } = channelReader; const baseUri = `/api/player/${exercise?.exercise_id ?? scenario?.scenario_id}`; - const { documentsMap } = useHelper((helper) => ({ + const { documentsMap } = useHelper(helper => ({ documentsMap: helper.getDocumentsMap(), })); const logo = isDark ? channel.channel_logo_dark : channel.channel_logo_light; @@ -88,10 +89,10 @@ const ChannelMicroblogging = ({ channelReader }) => { )} {articles.map((article) => { const docs = article.article_documents - .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) - .filter((d) => d !== undefined) + .map(docId => (documentsMap[docId] ? documentsMap[docId] : undefined)) + .filter(d => d !== undefined) .filter( - (d) => d.document_type.includes('image/') + d => d.document_type.includes('image/') || d.document_type.includes('video/'), ); let columns = 12; @@ -110,11 +111,11 @@ const ChannelMicroblogging = ({ channelReader }) => { sx={{ width: '100%' }} > {(article.article_author || t('Unknown')).charAt(0)} - } + )} title={article.article_author || t('Unknown')} subheader={fldt(article.article_virtual_publication)} /> @@ -125,7 +126,7 @@ const ChannelMicroblogging = ({ channelReader }) => { controlled={true} /> - {docs.map((doc) => ( + {docs.map(doc => ( {doc.document_type.includes('image/') && ( ( @@ -49,15 +50,15 @@ const ChannelNewspaper = ({ channelReader }) => { channel_information: channel, } = channelReader; const baseUri = `/api/player/${exercise?.exercise_id ?? scenario?.scenario_id}`; - const { documentsMap } = useHelper((helper) => ({ + const { documentsMap } = useHelper(helper => ({ documentsMap: helper.getDocumentsMap(), })); const logo = isDark ? channel.channel_logo_dark : channel.channel_logo_light; const firstArticle = R.head(articles) || null; const firstArticleImages = (firstArticle?.article_documents || []) - .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) - .filter((d) => d !== undefined) - .filter((d) => d.document_type.includes('image/')); + .map(docId => (documentsMap[docId] ? documentsMap[docId] : undefined)) + .filter(d => d !== undefined) + .filter(d => d.document_type.includes('image/')); let firstArticleColumns = 12; if (firstArticleImages.length === 2) { firstArticleColumns = 6; @@ -82,18 +83,18 @@ const ChannelNewspaper = ({ channelReader }) => { )} {channel.channel_mode !== 'logo' && ( - - {channel.channel_name} - + + {channel.channel_name} + )} { sx={{ width: '100%', height: '100%' }} > {(firstArticle.article_author || t('Unknown')).charAt(0)} - } + )} title={firstArticle.article_author || t('Unknown')} subheader={fldt(firstArticle.article_virtual_publication)} /> - {firstArticleImages.map((doc) => ( + {firstArticleImages.map(doc => ( { {headArticles.map((article, index) => { const images = article.article_documents - .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) - .filter((d) => d !== undefined) - .filter((d) => d.document_type.includes('image/')); + .map(docId => (documentsMap[docId] ? documentsMap[docId] : undefined)) + .filter(d => d !== undefined) + .filter(d => d.document_type.includes('image/')); let columns = 12; if (images.length === 2) { columns = 6; @@ -216,16 +217,16 @@ const ChannelNewspaper = ({ channelReader }) => { style={{ marginTop: index > 0 ? 20 : 0 }} > {(article.article_author || t('Unknown')).charAt(0)} - } + )} title={article.article_author || t('Unknown')} subheader={fldt(article.article_virtual_publication)} /> - {images.map((doc) => ( + {images.map(doc => ( { {otherArticles.map((article) => { const images = article.article_documents - .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) - .filter((d) => d !== undefined) - .filter((d) => d.document_type.includes('image/')); + .map(docId => (documentsMap[docId] ? documentsMap[docId] : undefined)) + .filter(d => d !== undefined) + .filter(d => d.document_type.includes('image/')); let columns = 12; if (images.length === 2) { columns = 6; @@ -308,16 +309,16 @@ const ChannelNewspaper = ({ channelReader }) => { sx={{ width: '100%', height: '100%' }} > {(article.article_author || t('Unknown')).charAt(0)} - } + )} title={article.article_author || t('Unknown')} subheader={fldt(article.article_virtual_publication)} /> - {images.map((doc) => ( + {images.map(doc => ( { {currentArticle?.article_name} - {t('By')} {currentArticle?.article_author || t('Unknown')},{' '} + {t('By')} + {' '} + {currentArticle?.article_author || t('Unknown')} + , + {' '} {fldt(currentArticle?.article_virtual_publication)} ({ root: { @@ -29,7 +30,7 @@ const ChannelPlayer = () => { const { t } = useFormatter(); const [userId, articleId] = useQueryParameter(['user', 'article']); const { channelId, exerciseId } = useParams(); - const { channelReader } = useHelper((helper) => ({ + const { channelReader } = useHelper(helper => ({ channelReader: helper.getChannelReader(channelId), })); const { channel_information: channel, channel_exercise: exercise } = channelReader ?? {}; diff --git a/openbas-front/src/public/components/channels/ChannelPreview.js b/openbas-front/src/public/components/channels/ChannelPreview.js index 77ff094916..001cd2dad3 100644 --- a/openbas-front/src/public/components/channels/ChannelPreview.js +++ b/openbas-front/src/public/components/channels/ChannelPreview.js @@ -1,19 +1,20 @@ +import { Button } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useEffect } from 'react'; import { useDispatch } from 'react-redux'; -import { makeStyles } from '@mui/styles'; import { Link, useParams } from 'react-router-dom'; -import { Button } from '@mui/material'; + +import { fetchMe } from '../../../actions/Application'; import { fetchObserverChannel } from '../../../actions/channels/channel-action'; +import { fetchPlayerDocuments } from '../../../actions/Document'; +import { useFormatter } from '../../../components/i18n'; +import Loader from '../../../components/Loader'; import { useHelper } from '../../../store'; import { useQueryParameter } from '../../../utils/Environment'; -import ChannelNewspaper from './ChannelNewspaper'; +import { usePermissions } from '../../../utils/Exercise'; import ChannelMicroblogging from './ChannelMicroblogging'; +import ChannelNewspaper from './ChannelNewspaper'; import ChannelTvChannel from './ChannelTvChannel'; -import { useFormatter } from '../../../components/i18n'; -import { usePermissions } from '../../../utils/Exercise'; -import { fetchMe } from '../../../actions/Application'; -import { fetchPlayerDocuments } from '../../../actions/Document'; -import Loader from '../../../components/Loader'; const useStyles = makeStyles(() => ({ root: { @@ -29,7 +30,7 @@ const ChannelPreview = () => { const { t } = useFormatter(); const [userId, articleId] = useQueryParameter(['user', 'article']); const { channelId, exerciseId } = useParams(); - const { channelReader } = useHelper((helper) => ({ + const { channelReader } = useHelper(helper => ({ channelReader: helper.getChannelReader(channelId), })); const { channel_information: channel, channel_exercise: exercise } = channelReader ?? {}; diff --git a/openbas-front/src/public/components/channels/ChannelTvChannel.js b/openbas-front/src/public/components/channels/ChannelTvChannel.js index e5d58da8a3..8f92ae54c5 100644 --- a/openbas-front/src/public/components/channels/ChannelTvChannel.js +++ b/openbas-front/src/public/components/channels/ChannelTvChannel.js @@ -1,11 +1,12 @@ +import { ChatBubbleOutlineOutlined, FavoriteBorderOutlined, ShareOutlined } from '@mui/icons-material'; +import { Avatar, Button, Card, CardContent, CardHeader, CardMedia, Grid, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; -import { Typography, Grid, Card, CardHeader, CardContent, Avatar, CardMedia, Button } from '@mui/material'; -import { ChatBubbleOutlineOutlined, FavoriteBorderOutlined, ShareOutlined } from '@mui/icons-material'; -import { useFormatter } from '../../../components/i18n'; + import Empty from '../../../components/Empty'; -import { useHelper } from '../../../store'; import ExpandableMarkdown from '../../../components/ExpandableMarkdown'; +import { useFormatter } from '../../../components/i18n'; +import { useHelper } from '../../../store'; import { useQueryParameter } from '../../../utils/Environment'; const useStyles = makeStyles(() => ({ @@ -42,15 +43,15 @@ const ChannelTvChannel = ({ channelReader }) => { channel_information: channel, } = channelReader; const baseUri = `/api/player/${exercise?.exercise_id ?? scenario?.scenario_id}`; - const { documentsMap } = useHelper((helper) => ({ + const { documentsMap } = useHelper(helper => ({ documentsMap: helper.getDocumentsMap(), })); const logo = isDark ? channel.channel_logo_dark : channel.channel_logo_light; const firstArticle = R.head(articles) || null; const firstArticleVideos = (firstArticle?.article_documents || []) - .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) - .filter((d) => d !== undefined) - .filter((d) => d.document_type.includes('video/')); + .map(docId => (documentsMap[docId] ? documentsMap[docId] : undefined)) + .filter(d => d !== undefined) + .filter(d => d.document_type.includes('video/')); let firstArticleColumns = 12; if (firstArticleVideos.length === 2) { firstArticleColumns = 6; @@ -110,16 +111,16 @@ const ChannelTvChannel = ({ channelReader }) => { sx={{ width: '100%', height: '100%' }} > {(firstArticle.article_author || t('Unknown')).charAt(0)} - } + )} title={firstArticle.article_author || t('Unknown')} subheader={fldt(firstArticle.article_virtual_publication)} /> - {firstArticleVideos.map((doc) => ( + {firstArticleVideos.map(doc => ( { {headArticles.map((article, index) => { const videos = article.article_documents - .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) - .filter((d) => d !== undefined) - .filter((d) => d.document_type.includes('video/')); + .map(docId => (documentsMap[docId] ? documentsMap[docId] : undefined)) + .filter(d => d !== undefined) + .filter(d => d.document_type.includes('video/')); let columns = 12; if (videos.length === 2) { columns = 6; @@ -192,16 +193,16 @@ const ChannelTvChannel = ({ channelReader }) => { style={{ marginTop: index > 0 ? 20 : 0 }} > {(article.article_author || t('Unknown')).charAt(0)} - } + )} title={article.article_author || t('Unknown')} subheader={fldt(article.article_virtual_publication)} /> - {videos.map((doc) => ( + {videos.map(doc => ( { {otherArticles.map((article) => { const videos = article.article_documents - .map((docId) => (documentsMap[docId] ? documentsMap[docId] : undefined)) - .filter((d) => d !== undefined) - .filter((d) => d.document_type.includes('video/')); + .map(docId => (documentsMap[docId] ? documentsMap[docId] : undefined)) + .filter(d => d !== undefined) + .filter(d => d.document_type.includes('video/')); let columns = 12; if (videos.length === 2) { columns = 6; @@ -274,16 +275,16 @@ const ChannelTvChannel = ({ channelReader }) => { sx={{ width: '100%', height: '100%' }} > {(article.article_author || t('Unknown')).charAt(0)} - } + )} title={article.article_author || t('Unknown')} subheader={fldt(article.article_virtual_publication)} /> - {videos.map((doc) => ( + {videos.map(doc => ( { const dispatch = useDispatch(); const { fldt, t } = useFormatter(); const { statusId } = useParams(); - const status = useHelper((helper) => helper.getComcheckStatus(statusId)); + const status = useHelper(helper => helper.getComcheckStatus(statusId)); useEffect(() => { dispatch(fetchComcheckStatus(statusId)); }, []); @@ -79,8 +80,10 @@ const Comcheck = () => {
    -            {t('Verification done at')}{' '}
    -            {fldt(status?.comcheckstatus_receive_date)}.
    +            {t('Verification done at')}
    +            {' '}
    +            {fldt(status?.comcheckstatus_receive_date)}
    +            .
               
    diff --git a/openbas-front/src/public/components/lessons/ExerciseViewLessons.tsx b/openbas-front/src/public/components/lessons/ExerciseViewLessons.tsx index 2b2fe1db38..7adad43a8e 100644 --- a/openbas-front/src/public/components/lessons/ExerciseViewLessons.tsx +++ b/openbas-front/src/public/components/lessons/ExerciseViewLessons.tsx @@ -1,12 +1,9 @@ import { useEffect } from 'react'; import { useParams } from 'react-router-dom'; -import { useQueryParameter } from '../../../utils/Environment'; -import { usePermissions } from '../../../utils/Exercise'; -import { useAppDispatch } from '../../../utils/hooks'; -import LessonsPlayer from './LessonsPlayer'; -import LessonsPreview from './LessonsPreview'; + import { fetchMe } from '../../../actions/Application'; import { fetchExercise, fetchPlayerExercise } from '../../../actions/Exercise'; +import type { ExerciseStore } from '../../../actions/exercises/Exercise'; import { addLessonsAnswers, fetchLessonsAnswers, @@ -16,12 +13,16 @@ import { fetchPlayerLessonsCategories, fetchPlayerLessonsQuestions, } from '../../../actions/exercises/exercise-action'; -import { ViewLessonContext, ViewLessonContextType } from '../../../admin/components/common/Context'; -import type { Exercise } from '../../../utils/api-types'; import type { ExercisesHelper } from '../../../actions/exercises/exercise-helper'; import type { UserHelper } from '../../../actions/helper'; -import type { ExerciseStore } from '../../../actions/exercises/Exercise'; +import { ViewLessonContext, ViewLessonContextType } from '../../../admin/components/common/Context'; import { useHelper } from '../../../store'; +import type { Exercise } from '../../../utils/api-types'; +import { useQueryParameter } from '../../../utils/Environment'; +import { usePermissions } from '../../../utils/Exercise'; +import { useAppDispatch } from '../../../utils/hooks'; +import LessonsPlayer from './LessonsPlayer'; +import LessonsPreview from './LessonsPreview'; const ExerciseViewLessons = () => { const dispatch = useAppDispatch(); diff --git a/openbas-front/src/public/components/lessons/LessonsPlayer.js b/openbas-front/src/public/components/lessons/LessonsPlayer.js index a9fd25763e..cc1a01f2be 100644 --- a/openbas-front/src/public/components/lessons/LessonsPlayer.js +++ b/openbas-front/src/public/components/lessons/LessonsPlayer.js @@ -1,16 +1,17 @@ -import { useContext, useState } from 'react'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, Grid, Paper, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; -import { Link } from 'react-router-dom'; +import { useContext, useState } from 'react'; import { Form } from 'react-final-form'; -import { Button, Dialog, DialogActions, DialogContent, DialogContentText, Grid, Paper, Typography } from '@mui/material'; -import { useFormatter } from '../../../components/i18n'; -import Loader from '../../../components/Loader'; +import { Link } from 'react-router-dom'; + +import { ViewLessonContext } from '../../../admin/components/common/Context'; +import Transition from '../../../components/common/Transition'; import Empty from '../../../components/Empty'; -import SliderField from '../../../components/fields/SliderField'; import OldTextField from '../../../components/fields/OldTextField'; -import Transition from '../../../components/common/Transition'; -import { ViewLessonContext } from '../../../admin/components/common/Context'; +import SliderField from '../../../components/fields/SliderField'; +import { useFormatter } from '../../../components/i18n'; +import Loader from '../../../components/Loader'; const useStyles = makeStyles(() => ({ root: { @@ -49,10 +50,10 @@ const LessonsPlayer = (props) => { } = useContext(ViewLessonContext); const submitForm = (data) => { - const idsArray = Array.from(new Set(Object.keys(data).map((key) => key.split('_')[0]))); + const idsArray = Array.from(new Set(Object.keys(data).map(key => key.split('_')[0]))); return Promise.all( lessonsQuestions - .filter((question) => idsArray.includes(question.lessonsquestion_id)) // Filter questions + .filter(question => idsArray.includes(question.lessonsquestion_id)) // Filter questions .map((question) => { const answerData = { lessons_answer_score: data[`${question.lessonsquestion_id}_score`], @@ -68,199 +69,215 @@ const LessonsPlayer = (props) => { }; const sortCategories = R.sortWith([R.ascend(R.prop('lessons_category_order'))]); const sortQuestions = R.sortWith([R.ascend(R.prop('lessons_question_order'))]); - const sortedCategories = sortCategories(R.filter((n) => n.lessons_category_users.includes(source.finalUserId), lessonsCategories)); + const sortedCategories = sortCategories(R.filter(n => n.lessons_category_users.includes(source.finalUserId), lessonsCategories)); - const initialValues = R.pipe(R.map((n) => ({ + const initialValues = R.pipe(R.map(n => ({ [`${n.lessons_answer_question}_score`]: n.lessons_answer_score || 0, [`${n.lessons_answer_question}_positive`]: n.lessons_answer_positive || 0, [`${n.lessons_answer_question}_negative`]: n.lessons_answer_negative || 0, })), R.mergeAll)(lessonsAnswers); if (source) { - return (
    - {permissions.isLoggedIn && permissions.canRead && ()} - {permissions.isLoggedIn && permissions.canRead && ()} -
    -
    - logo + return ( +
    + {permissions.isLoggedIn && permissions.canRead && ( + + )} + {permissions.isLoggedIn && permissions.canRead && ( + + )} +
    +
    + logo +
    + + {source.name} + + + {source.subtitle} + + {lessonsCategories.length === 0 && ( +
    + +
    + )}
    - - {source.name} - - - {source.subtitle} - - {lessonsCategories.length === 0 && (
    - -
    )} -
    - - {({ handleSubmit, submitting }) => { - return ( - {sortedCategories.map((category) => { - const questions = sortQuestions(lessonsQuestions.filter((n) => n.lessons_question_category === category.lessonscategory_id)); - return (
    - - {category.lessons_category_name} - - {questions.map((question) => { - return ( - { + return ( + + {sortedCategories.map((category) => { + const questions = sortQuestions(lessonsQuestions.filter(n => n.lessons_question_category === category.lessonscategory_id)); + return ( +
    - - - {t('Question')} - - - - {question.lessons_question_content} - - - - {question.lessons_question_explanation || t('No explanation')} - - - - - {t('Global evaluation')} - - - {t('Your overall evaluation about this question.')} - - 0} - name={`${question.lessonsquestion_id}_score`} - step={10} - min={0} - max={100} - defaultValue={0} - /> - - - - {t('What worked well')} - - 0} - style={{ marginTop: 10 }} - name={`${question.lessonsquestion_id}_positive`} - label={t('Comment (optional)')} - multiline - rows={2} - fullWidth - /> - - - - {t("What didn't work well")} - - 0} - style={{ marginTop: 10 }} - name={`${question.lessonsquestion_id}_negative`} - label={t('Comment (optional)')} - multiline - fullWidth - rows={2} - /> - - - ); + + {category.lessons_category_name} + + {questions.map((question) => { + return ( + + + + + {t('Question')} + + + + {question.lessons_question_content} + + + + {question.lessons_question_explanation || t('No explanation')} + + + + + {t('Global evaluation')} + + + {t('Your overall evaluation about this question.')} + + 0} + name={`${question.lessonsquestion_id}_score`} + step={10} + min={0} + max={100} + defaultValue={0} + /> + + + + {t('What worked well')} + + 0} + style={{ marginTop: 10 }} + name={`${question.lessonsquestion_id}_positive`} + label={t('Comment (optional)')} + multiline + rows={2} + fullWidth + /> + + + + {t('What didn\'t work well')} + + 0} + style={{ marginTop: 10 }} + name={`${question.lessonsquestion_id}_negative`} + label={t('Comment (optional)')} + multiline + fullWidth + rows={2} + /> + + + + ); + })} +
    + ); })} -
    ); - })} - {sortedCategories.length > 0 && (
    - -
    )} - setOpenValidate(false)} - PaperProps={{ elevation: 1 }} - > - - - {t('Do you want to submit your answers? You will not be able to change them later.')} - - - - - +
    + )} + setOpenValidate(false)} + PaperProps={{ elevation: 1 }} > - {t('Submit')} - - - - ); - }} - -
    ); + + + {t('Do you want to submit your answers? You will not be able to change them later.')} + + + + + + + + + ); + }} + +
    + ); } - return ; + return ; }; export default LessonsPlayer; diff --git a/openbas-front/src/public/components/lessons/LessonsPreview.js b/openbas-front/src/public/components/lessons/LessonsPreview.js index b48e110e6c..7238fc3ac1 100644 --- a/openbas-front/src/public/components/lessons/LessonsPreview.js +++ b/openbas-front/src/public/components/lessons/LessonsPreview.js @@ -1,13 +1,14 @@ +import { Button, Grid, Paper, Typography } from '@mui/material'; import { makeStyles, useTheme } from '@mui/styles'; import * as R from 'ramda'; -import { Link } from 'react-router-dom'; import { Form } from 'react-final-form'; -import { Button, Grid, Paper, Typography } from '@mui/material'; -import { useFormatter } from '../../../components/i18n'; -import Loader from '../../../components/Loader'; +import { Link } from 'react-router-dom'; + import Empty from '../../../components/Empty'; -import SliderField from '../../../components/fields/SliderField'; import OldTextField from '../../../components/fields/OldTextField'; +import SliderField from '../../../components/fields/SliderField'; +import { useFormatter } from '../../../components/i18n'; +import Loader from '../../../components/Loader'; const useStyles = makeStyles(() => ({ root: { @@ -45,7 +46,7 @@ const LessonsPreview = (props) => { const validate = (values) => { const errors = {}; const requiredFields = R.flatten( - lessonsQuestions.map((question) => [ + lessonsQuestions.map(question => [ `${question.lessonsquestion_id}_score`, ]), ); @@ -70,30 +71,30 @@ const LessonsPreview = (props) => { return (
    {permissions.isLoggedIn && permissions.canRead && source.isPlayerViewAvailable && ( - + )} {permissions.isLoggedIn && permissions.canRead && ( - + )}
    - logo + logo
    { {source.subtitle} {lessonsCategories.length === 0 && ( -
    - -
    +
    + +
    )}
    { {sortedCategories.map((category) => { const questions = sortQuestions( lessonsQuestions.filter( - (n) => n.lessons_question_category === category.lessonscategory_id, + n => n.lessons_question_category === category.lessonscategory_id, ), ); return ( @@ -171,7 +172,7 @@ const LessonsPreview = (props) => { {question.lessons_question_explanation - || t('No explanation')} + || t('No explanation')} @@ -209,7 +210,7 @@ const LessonsPreview = (props) => { - {t("What didn't work well")} + {t('What didn\'t work well')} {
    ); } - return ; + return ; }; export default LessonsPreview; diff --git a/openbas-front/src/public/components/lessons/ScenarioViewLessons.tsx b/openbas-front/src/public/components/lessons/ScenarioViewLessons.tsx index b64afebe2f..5893a605ba 100644 --- a/openbas-front/src/public/components/lessons/ScenarioViewLessons.tsx +++ b/openbas-front/src/public/components/lessons/ScenarioViewLessons.tsx @@ -1,16 +1,17 @@ import { useEffect } from 'react'; import { useParams } from 'react-router-dom'; -import { useQueryParameter } from '../../../utils/Environment'; -import LessonsPreview from './LessonsPreview'; -import { useHelper } from '../../../store'; + import { fetchMe } from '../../../actions/Application'; -import { ViewLessonContext, ViewLessonContextType } from '../../../admin/components/common/Context'; -import { useAppDispatch } from '../../../utils/hooks'; -import type { ScenarioStore } from '../../../actions/scenarios/Scenario'; import type { UserHelper } from '../../../actions/helper'; -import type { ScenariosHelper } from '../../../actions/scenarios/scenario-helper'; +import type { ScenarioStore } from '../../../actions/scenarios/Scenario'; import { fetchLessonsCategories, fetchLessonsQuestions, fetchScenario } from '../../../actions/scenarios/scenario-actions'; +import type { ScenariosHelper } from '../../../actions/scenarios/scenario-helper'; +import { ViewLessonContext, ViewLessonContextType } from '../../../admin/components/common/Context'; +import { useHelper } from '../../../store'; +import { useQueryParameter } from '../../../utils/Environment'; +import { useAppDispatch } from '../../../utils/hooks'; import useScenarioPermissions from '../../../utils/Scenario'; +import LessonsPreview from './LessonsPreview'; const ScenarioViewLessons = () => { const dispatch = useAppDispatch(); diff --git a/openbas-front/src/public/components/login/Login.js b/openbas-front/src/public/components/login/Login.js index 49ac534302..aa76cdb106 100644 --- a/openbas-front/src/public/components/login/Login.js +++ b/openbas-front/src/public/components/login/Login.js @@ -1,23 +1,24 @@ -import { useEffect, useState } from 'react'; -import * as PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import { useTheme, withStyles } from '@mui/styles'; import { Box, Checkbox, Paper } from '@mui/material'; +import { useTheme, withStyles } from '@mui/styles'; +import * as PropTypes from 'prop-types'; import * as R from 'ramda'; +import { useEffect, useState } from 'react'; import Markdown from 'react-markdown'; -import logoDark from '../../../static/images/logo_text_dark.png'; -import logoLight from '../../../static/images/logo_text_light.png'; -import byFiligranDark from '../../../static/images/by_filigran_dark.png'; -import byFiligranLight from '../../../static/images/by_filigran_light.png'; +import { connect } from 'react-redux'; + import { askToken, checkKerberos, fetchPlatformParameters } from '../../../actions/Application'; -import LoginForm from './LoginForm'; -import inject18n from '../../../components/i18n'; import { storeHelper } from '../../../actions/Schema'; -import Reset from './Reset'; -import LoginError from './LoginError'; -import LoginSSOButton from './LoginSSOButton'; +import inject18n from '../../../components/i18n'; +import byFiligranDark from '../../../static/images/by_filigran_dark.png'; +import byFiligranLight from '../../../static/images/by_filigran_light.png'; +import logoDark from '../../../static/images/logo_text_dark.png'; +import logoLight from '../../../static/images/logo_text_light.png'; import { fileUri } from '../../../utils/Environment'; import { isNotEmptyField } from '../../../utils/utils'; +import LoginError from './LoginError'; +import LoginForm from './LoginForm'; +import LoginSSOButton from './LoginSSOButton'; +import Reset from './Reset'; const styles = () => ({ container: { @@ -80,7 +81,7 @@ const Login = (props) => { props.fetchPlatformParameters(); props.checkKerberos(); }, []); - const onSubmit = (data) => props.askToken(data.username, data.password); + const onSubmit = data => props.askToken(data.username, data.password); let loginHeight = 320; if ((isOpenId || isSaml2) && isLocal) { loginHeight = 440; @@ -93,7 +94,7 @@ const Login = (props) => { : parameters?.platform_light_theme?.logo_login_url; const isWhitemarkEnable = parameters.platform_whitemark === 'true' - && parameters.platform_enterprise_edition === 'true'; + && parameters.platform_enterprise_edition === 'true'; // POLICIES const loginMessage = parameters.platform_policies?.platform_login_message; @@ -114,7 +115,9 @@ const Login = (props) => { }; return ( -
    { {!isWhitemarkEnable && (
    @@ -149,23 +153,26 @@ const Login = (props) => { edge="start" onChange={handleChange} style={{ margin: 0 }} - > + > + )} {(!isConsentMessage || (isConsentMessage && checked)) && ( <> {isLocal && !reset && ( - - - - + + + + )} - {isLocal && reset && setReset(false)}/>} + {isLocal && reset && setReset(false)} />} { > {(isOpenId || isSaml2) && [...(openidProviders ?? []), ...(saml2Providers ?? [])].map( - (provider) => ( + provider => ( { /> ), )} - + )} diff --git a/openbas-front/src/public/components/login/LoginError.tsx b/openbas-front/src/public/components/login/LoginError.tsx index cb1aa7765c..b3bffbf662 100644 --- a/openbas-front/src/public/components/login/LoginError.tsx +++ b/openbas-front/src/public/components/login/LoginError.tsx @@ -1,5 +1,6 @@ import { FunctionComponent } from 'react'; import { useLocation } from 'react-router-dom'; + import Message from '../../../components/Message'; import { MESSAGING$ } from '../../../utils/Environment'; diff --git a/openbas-front/src/public/components/login/LoginForm.js b/openbas-front/src/public/components/login/LoginForm.js index f512b4ffc0..8224bf19b1 100644 --- a/openbas-front/src/public/components/login/LoginForm.js +++ b/openbas-front/src/public/components/login/LoginForm.js @@ -1,6 +1,7 @@ +import { Button } from '@mui/material'; import * as PropTypes from 'prop-types'; import { Form } from 'react-final-form'; -import { Button } from '@mui/material'; + import OldTextField from '../../../components/fields/OldTextField'; import inject18n from '../../../components/i18n'; diff --git a/openbas-front/src/public/components/login/LoginSSOButton.tsx b/openbas-front/src/public/components/login/LoginSSOButton.tsx index 3bfc1d5ea8..46c0737717 100644 --- a/openbas-front/src/public/components/login/LoginSSOButton.tsx +++ b/openbas-front/src/public/components/login/LoginSSOButton.tsx @@ -1,6 +1,7 @@ -import { FunctionComponent } from 'react'; import { VpnKeyOutlined } from '@mui/icons-material'; import { Button } from '@mui/material'; +import { FunctionComponent } from 'react'; + import { useFormatter } from '../../../components/i18n'; interface LoginSSOButtonProperties { diff --git a/openbas-front/src/public/components/login/Reset.js b/openbas-front/src/public/components/login/Reset.js index 4a48c5a7a5..6a8689a221 100644 --- a/openbas-front/src/public/components/login/Reset.js +++ b/openbas-front/src/public/components/login/Reset.js @@ -1,11 +1,12 @@ +import { Button, Paper } from '@mui/material'; +import { makeStyles } from '@mui/styles'; import { useState } from 'react'; -import { useDispatch } from 'react-redux'; -import { Paper, Button } from '@mui/material'; import { Form } from 'react-final-form'; -import { makeStyles } from '@mui/styles'; +import { useDispatch } from 'react-redux'; + import { askReset, resetPassword, validateResetToken } from '../../../actions/Application'; -import { useFormatter } from '../../../components/i18n'; import OldTextField from '../../../components/fields/OldTextField'; +import { useFormatter } from '../../../components/i18n'; const useStyles = makeStyles(() => ({ container: { @@ -47,7 +48,7 @@ const Reset = ({ onCancel }) => { } }); }; - const onSubmitValidatePassword = (data) => dispatch(resetPassword(token, data)); + const onSubmitValidatePassword = data => dispatch(resetPassword(token, data)); return (
    @@ -55,7 +56,7 @@ const Reset = ({ onCancel }) => { {step === STEP_ASK_RESET && ( validateFields(t, values, ['username'])} + validate={values => validateFields(t, values, ['username'])} > {({ handleSubmit, submitting, pristine }) => ( @@ -83,7 +84,7 @@ const Reset = ({ onCancel }) => { {step === STEP_VALIDATE_TOKEN && ( validateFields(t, values, ['code'])} + validate={values => validateFields(t, values, ['code'])} > {({ handleSubmit, submitting, pristine }) => ( @@ -111,8 +112,7 @@ const Reset = ({ onCancel }) => { {step === STEP_RESET_PASSWORD && ( validateFields(t, values, ['password', 'password_validation']) - } + validate={values => validateFields(t, values, ['password', 'password_validation'])} > {({ handleSubmit, submitting, pristine }) => ( diff --git a/openbas-front/src/public/components/systembanners/SystemBanners.tsx b/openbas-front/src/public/components/systembanners/SystemBanners.tsx index bb6f302a9a..cceb1c75b6 100644 --- a/openbas-front/src/public/components/systembanners/SystemBanners.tsx +++ b/openbas-front/src/public/components/systembanners/SystemBanners.tsx @@ -1,8 +1,9 @@ -import { makeStyles } from '@mui/styles'; import { ReportProblem } from '@mui/icons-material'; -import { isEmptyField, recordEntries, recordKeys } from '../../../utils/utils'; -import type { Theme } from '../../../components/Theme'; +import { makeStyles } from '@mui/styles'; + import { useFormatter } from '../../../components/i18n'; +import type { Theme } from '../../../components/Theme'; +import { isEmptyField, recordEntries, recordKeys } from '../../../utils/utils'; export const SYSTEM_BANNER_HEIGHT_PER_MESSAGE = 18; @@ -49,8 +50,8 @@ const useStyles = makeStyles((theme: Theme) => ({ const SystemBanners = (settings: { settings: { - platform_banner_by_level: Record<'debug' | 'info' | 'warn' | 'error' | 'fatal', string[]>, - } + platform_banner_by_level: Record<'debug' | 'info' | 'warn' | 'error' | 'fatal', string[]>; + }; }) => { // Standard hooks const { t } = useFormatter(); @@ -80,7 +81,7 @@ const SystemBanners = (settings: { {settings.settings.platform_banner_by_level[key].map((message) => { return (
    - + {t(message)} diff --git a/openbas-front/src/reducers/App.js b/openbas-front/src/reducers/App.js index 542bbae027..37c4f81c83 100644 --- a/openbas-front/src/reducers/App.js +++ b/openbas-front/src/reducers/App.js @@ -1,4 +1,5 @@ import Immutable from 'seamless-immutable'; + import * as Constants from '../constants/ActionTypes'; const app = (state = Immutable({}), action = {}) => { diff --git a/openbas-front/src/reducers/Referential.js b/openbas-front/src/reducers/Referential.js index a6bb81a971..2d18f6b461 100644 --- a/openbas-front/src/reducers/Referential.js +++ b/openbas-front/src/reducers/Referential.js @@ -1,5 +1,6 @@ -import Immutable from 'seamless-immutable'; import * as R from 'ramda'; +import Immutable from 'seamless-immutable'; + import * as Constants from '../constants/ActionTypes'; export const entitiesInitializer = Immutable({ diff --git a/openbas-front/src/reducers/Root.ts b/openbas-front/src/reducers/Root.ts index e355f888c4..3adc153e86 100644 --- a/openbas-front/src/reducers/Root.ts +++ b/openbas-front/src/reducers/Root.ts @@ -1,5 +1,6 @@ import { combineReducers } from 'redux'; import { IHistoryContext } from 'redux-first-history'; + import app from './App'; import referential from './Referential'; diff --git a/openbas-front/src/root.tsx b/openbas-front/src/root.tsx index 72a3ec165d..970b7aebd3 100644 --- a/openbas-front/src/root.tsx +++ b/openbas-front/src/root.tsx @@ -1,19 +1,20 @@ -import { lazy, Suspense, useEffect } from 'react'; +import { CssBaseline } from '@mui/material'; +import { StyledEngineProvider } from '@mui/material/styles'; import * as R from 'ramda'; +import { lazy, Suspense, useEffect } from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; -import { StyledEngineProvider } from '@mui/material/styles'; -import { CssBaseline } from '@mui/material'; -import { useHelper } from './store'; + import { fetchMe, fetchPlatformParameters } from './actions/Application'; -import NotFound from './components/NotFound'; -import ConnectedThemeProvider from './components/AppThemeProvider'; +import type { LoggedHelper } from './actions/helper'; import ConnectedIntlProvider from './components/AppIntlProvider'; +import ConnectedThemeProvider from './components/AppThemeProvider'; import { errorWrapper } from './components/Error'; -import { useAppDispatch } from './utils/hooks'; -import type { LoggedHelper } from './actions/helper'; import Loader from './components/Loader'; -import { UserContext } from './utils/hooks/useAuth'; import Message from './components/Message'; +import NotFound from './components/NotFound'; +import { useHelper } from './store'; +import { useAppDispatch } from './utils/hooks'; +import { UserContext } from './utils/hooks/useAuth'; const RootPublic = lazy(() => import('./public/Root')); const IndexPrivate = lazy(() => import('./private/Index')); @@ -58,8 +59,10 @@ const Root = () => { }> - - : } + + : } /> diff --git a/openbas-front/src/store.ts b/openbas-front/src/store.ts index a480321ee3..9fb532ea93 100644 --- a/openbas-front/src/store.ts +++ b/openbas-front/src/store.ts @@ -1,14 +1,15 @@ -import * as R from 'ramda'; +import { composeWithDevTools } from '@redux-devtools/extension'; import { createBrowserHistory } from 'history'; +import * as R from 'ramda'; +import { useSelector } from 'react-redux'; import { applyMiddleware, createStore } from 'redux'; +import { createReduxHistoryContext } from 'redux-first-history'; import thunk from 'redux-thunk'; -import { useSelector } from 'react-redux'; import Immutable from 'seamless-immutable'; -import { createReduxHistoryContext } from 'redux-first-history'; -import { composeWithDevTools } from '@redux-devtools/extension'; -import createRootReducer from './reducers/Root'; -import { entitiesInitializer } from './reducers/Referential'; + import { storeHelper } from './actions/Schema'; +import { entitiesInitializer } from './reducers/Referential'; +import createRootReducer from './reducers/Root'; // Default application state const initialState = { @@ -40,7 +41,7 @@ const initStore = () => { // TODO type selector object // eslint-disable-next-line @typescript-eslint/no-explicit-any -export const useHelper = (selector: any) => useSelector((state) => selector(storeHelper(state)), R.equals); +export const useHelper = (selector: any) => useSelector(state => selector(storeHelper(state)), R.equals); export const store = initStore(); diff --git a/openbas-front/src/utils/Action.ts b/openbas-front/src/utils/Action.ts index 716f7b4506..03487b333d 100644 --- a/openbas-front/src/utils/Action.ts +++ b/openbas-front/src/utils/Action.ts @@ -1,16 +1,17 @@ -import Immutable from 'seamless-immutable'; -import { FORM_ERROR } from 'final-form'; -import * as R from 'ramda'; import { AxiosError } from 'axios'; +import { FORM_ERROR } from 'final-form'; import type { Schema } from 'normalizr'; -import { Dispatch } from 'redux'; +import * as R from 'ramda'; import { createIntl, createIntlCache } from 'react-intl'; +import { Dispatch } from 'redux'; +import Immutable from 'seamless-immutable'; + +import { LANG } from '../components/AppIntlProvider'; import * as Constants from '../constants/ActionTypes'; import { DATA_FETCH_ERROR } from '../constants/ActionTypes'; import { api } from '../network'; -import { MESSAGING$ } from './Environment'; import { store } from '../store'; -import { LANG } from '../components/AppIntlProvider'; +import { MESSAGING$ } from './Environment'; import i18n from './Localization'; const isEmptyPath = R.isNil(window.BASE_PATH) || R.isEmpty(window.BASE_PATH); diff --git a/openbas-front/src/utils/BrowserLanguage.js b/openbas-front/src/utils/BrowserLanguage.js index 29a2e768c6..0fd58aec90 100644 --- a/openbas-front/src/utils/BrowserLanguage.js +++ b/openbas-front/src/utils/BrowserLanguage.js @@ -23,8 +23,8 @@ const detectedLocale = R.pipe( R.values(), // Get values of the properties R.flatten(), // flatten all arrays R.reject(R.isNil), // Remove undefined values - R.map((x) => x.substr(0, 2)), - R.find((x) => R.includes(x, availableLanguages)), // Returns first language matched in languages + R.map(x => x.substr(0, 2)), + R.find(x => R.includes(x, availableLanguages)), // Returns first language matched in languages ); export default detectedLocale(window.navigator) || DEFAULT_LANG; // If no locale is detected, fallback to 'en' diff --git a/openbas-front/src/utils/Charts.js b/openbas-front/src/utils/Charts.js index 6d05b08deb..dce7bb0f8a 100644 --- a/openbas-front/src/utils/Charts.js +++ b/openbas-front/src/utils/Charts.js @@ -1,6 +1,6 @@ import * as C from '@mui/material/colors'; -export const colors = (temp) => [ +export const colors = temp => [ C.red[temp], C.pink[temp], C.purple[temp], @@ -50,13 +50,13 @@ export const colors = (temp) => [ * * @param {Theme} theme */ -const simpleLabelTooltip = (theme) => ({ seriesIndex, w }) => (` +const simpleLabelTooltip = theme => ({ seriesIndex, w }) => (`
    ${w.config.labels[seriesIndex]}
    `); -export const resultColors = (temp) => [ +export const resultColors = temp => [ C.deepPurple[temp], C.indigo[temp], C.lightBlue[temp], @@ -135,7 +135,7 @@ export const lineChartOptions = ( tickAmount, tickPlacement: 'on', labels: { - formatter: (value) => (xFormatter ? xFormatter(value) : value), + formatter: value => (xFormatter ? xFormatter(value) : value), style: { fontSize: '12px', fontFamily: '"IBM Plex Sans", sans-serif', @@ -147,7 +147,7 @@ export const lineChartOptions = ( }, yaxis: { labels: { - formatter: (value) => (yFormatter ? yFormatter(value) : value), + formatter: value => (yFormatter ? yFormatter(value) : value), style: { fontSize: '14px', fontFamily: '"IBM Plex Sans", sans-serif', @@ -224,7 +224,7 @@ export const areaChartOptions = ( tickAmount, tickPlacement: 'on', labels: { - formatter: (value) => (xFormatter ? xFormatter(value) : value), + formatter: value => (xFormatter ? xFormatter(value) : value), style: { fontSize: '12px', fontFamily: '"IBM Plex Sans", sans-serif', @@ -236,7 +236,7 @@ export const areaChartOptions = ( }, yaxis: { labels: { - formatter: (value) => (yFormatter ? yFormatter(value) : value), + formatter: value => (yFormatter ? yFormatter(value) : value), style: { fontSize: '14px', fontFamily: '"IBM Plex Sans", sans-serif', @@ -341,7 +341,7 @@ export const verticalBarsChartOptions = ( tickAmount, tickPlacement: 'on', labels: { - formatter: (value) => (xFormatter ? xFormatter(value) : value), + formatter: value => (xFormatter ? xFormatter(value) : value), style: { fontSize: '12px', fontFamily: '"IBM Plex Sans", sans-serif', @@ -361,7 +361,7 @@ export const verticalBarsChartOptions = ( }, yaxis: { labels: { - formatter: (value) => (yFormatter ? yFormatter(value) : value), + formatter: value => (yFormatter ? yFormatter(value) : value), style: { fontFamily: '"IBM Plex Sans", sans-serif', }, @@ -465,7 +465,7 @@ export const horizontalBarsChartOptions = ( xaxis: { categories: categories ?? [], labels: { - formatter: (value) => (xFormatter ? xFormatter(value) : value), + formatter: value => (xFormatter ? xFormatter(value) : value), style: { fontFamily: '"IBM Plex Sans", sans-serif', }, @@ -477,7 +477,7 @@ export const horizontalBarsChartOptions = ( }, yaxis: { labels: { - formatter: (value) => (yFormatter ? yFormatter(value) : value), + formatter: value => (yFormatter ? yFormatter(value) : value), style: { fontFamily: '"IBM Plex Sans", sans-serif', }, @@ -650,7 +650,7 @@ export const polarAreaChartOptions = ( }, yaxis: { labels: { - formatter: (value) => (formatter ? formatter(value) : value), + formatter: value => (formatter ? formatter(value) : value), style: { fontFamily: '"IBM Plex Sans", sans-serif', }, @@ -709,7 +709,7 @@ export const donutChartOptions = ({ const temp = theme.palette.mode === 'dark' ? 400 : 600; let dataLabelsColors = labels.map(() => theme.palette.text.primary); if (chartColors.length > 0) { - dataLabelsColors = chartColors.map((n) => (n === '#ffffff' ? '#000000' : theme.palette.text.primary)); + dataLabelsColors = chartColors.map(n => (n === '#ffffff' ? '#000000' : theme.palette.text.primary)); } let chartFinalColors = chartColors; if (chartFinalColors.length === 0) { diff --git a/openbas-front/src/utils/Cron.ts b/openbas-front/src/utils/Cron.ts index 59dbc6706d..4cadc4253d 100644 --- a/openbas-front/src/utils/Cron.ts +++ b/openbas-front/src/utils/Cron.ts @@ -17,11 +17,11 @@ const generateMonthlyCron = (w: number, d: number, h: number, m: number) => { }; interface ParsedCron { - w: number | null, - d: number | null, - h: number, - m: number, - owd: boolean, + w: number | null; + d: number | null; + h: number; + m: number; + owd: boolean; } const parseCron = (cron: string): ParsedCron => { diff --git a/openbas-front/src/utils/Environment.js b/openbas-front/src/utils/Environment.js index 4607d8b777..f28e771039 100644 --- a/openbas-front/src/utils/Environment.js +++ b/openbas-front/src/utils/Environment.js @@ -1,15 +1,15 @@ -import { Subject, timer } from 'rxjs'; -import { debounce } from 'rxjs/operators'; import * as R from 'ramda'; import { useMemo } from 'react'; import { useLocation } from 'react-router-dom'; +import { Subject, timer } from 'rxjs'; +import { debounce } from 'rxjs/operators'; // Service bus const MESSENGER$ = new Subject().pipe(debounce(() => timer(500))); export const MESSAGING$ = { messages: MESSENGER$, notifyError: (text, sticky = false) => MESSENGER$.next([{ type: 'error', text, sticky }]), - notifySuccess: (text) => MESSENGER$.next([{ type: 'message', text }]), + notifySuccess: text => MESSENGER$.next([{ type: 'message', text }]), toggleNav: new Subject(), redirect: new Subject(), }; @@ -25,7 +25,7 @@ export class ApplicationError extends Error { export const useQueryParameter = (parameters) => { const { search } = useLocation(); const query = useMemo(() => new URLSearchParams(search), [search]); - return parameters.map((p) => query.get(p)); + return parameters.map(p => query.get(p)); }; // Network @@ -33,10 +33,10 @@ const isEmptyPath = R.isNil(window.BASE_PATH) || R.isEmpty(window.BASE_PATH); const contextPath = isEmptyPath || window.BASE_PATH === '/' ? '' : window.BASE_PATH; export const APP_BASE_PATH = isEmptyPath || contextPath.startsWith('/') ? contextPath : `/${contextPath}`; -export const fileUri = (fileImport) => `${APP_BASE_PATH}${fileImport}`; // No slash here, will be replace by the builder +export const fileUri = fileImport => `${APP_BASE_PATH}${fileImport}`; // No slash here, will be replace by the builder // Export -const escape = (value) => value?.toString().replaceAll('"', '""'); +const escape = value => value?.toString().replaceAll('"', '""'); export const exportData = ( type, keys, @@ -47,7 +47,7 @@ export const exportData = ( scenariosMap, ) => { return data - .map((d) => R.pick(keys, d)) + .map(d => R.pick(keys, d)) .map((d) => { let entry = d; @@ -58,21 +58,21 @@ export const exportData = ( if (entry[`${type}_tags`]) { entry = R.assoc( `${type}_tags`, - entry[`${type}_tags`].map((t) => tagsMap[t]?.tag_name), + entry[`${type}_tags`].map(t => tagsMap[t]?.tag_name), entry, ); } if (entry[`${type}_exercises`]) { entry = R.assoc( `${type}_exercises`, - entry[`${type}_exercises`].map((e) => exercisesMap[e]?.exercise_name), + entry[`${type}_exercises`].map(e => exercisesMap[e]?.exercise_name), entry, ); } if (entry[`${type}_scenarios`]) { entry = R.assoc( `${type}_scenarios`, - entry[`${type}_scenarios`].map((e) => scenariosMap[e]?.scenario_name), + entry[`${type}_scenarios`].map(e => scenariosMap[e]?.scenario_name), entry, ); } diff --git a/openbas-front/src/utils/Exercise.js b/openbas-front/src/utils/Exercise.js index 62fdba3bf9..455e460925 100644 --- a/openbas-front/src/utils/Exercise.js +++ b/openbas-front/src/utils/Exercise.js @@ -1,4 +1,5 @@ import * as R from 'ramda'; + import { useHelper } from '../store'; export const isExerciseReadOnly = (exercise, overrideStatus = false) => { diff --git a/openbas-front/src/utils/Localization.js b/openbas-front/src/utils/Localization.js index b055683651..f6acaef5de 100644 --- a/openbas-front/src/utils/Localization.js +++ b/openbas-front/src/utils/Localization.js @@ -4,45 +4,45 @@ const i18n = { messages: { fr: { 'Email address': 'Adresse email', - Password: 'Mot de passe', + 'Password': 'Mot de passe', 'Password validation': 'Validation du mot de passe', 'Change your password': 'Changer votre mot de passe', - 'I forgot my password': "J'ai oublié mon mot de passe", + 'I forgot my password': 'J\'ai oublié mon mot de passe', 'Send reset code': 'Envoyer le code', 'Enter code': 'Entrer le code', - 'Back to login': "Retour à l'identification", - Login: 'Nom d\'utilisateur', - 'Sign in': "S'identifier", - 'Login with github': "S'identifier avec github", + 'Back to login': 'Retour à l\'identification', + 'Login': 'Nom d\'utilisateur', + 'Sign in': 'S\'identifier', + 'Login with github': 'S\'identifier avec github', 'You probably need a public email in your github account': - "Vous avez probablement besoin d'une adresse e-mail publique dans votre compte github", + 'Vous avez probablement besoin d\'une adresse e-mail publique dans votre compte github', 'Should be a valid email address': 'Doit être une adresse e-mail valide', - 'Login with microsoft': "S'identifier avec microsoft", + 'Login with microsoft': 'S\'identifier avec microsoft', 'Corporate login': 'Connexion d\'entreprise', - Continue: 'Continuer', - Dashboard: 'Tableau de bord', - Players: 'Joueurs', - Organizations: 'Organisations', - Documents: 'Documents', - Integrations: 'Intégrations', - Settings: 'Paramètres', - Profile: 'Profil', - Logout: 'Se déconnecter', - Firstname: 'Prénom', - Lastname: 'Nom de famille', - Organization: 'Organisation', - Language: 'Langue', - Injects: 'Stimulis', - Messages: 'Messages', - Mails: 'Mails', - Timeline: 'Chronologie', - Definition: 'Définition', - Results: 'Résultats', - Channels: 'Canaux', - Submit: 'Soumettre', - Country: 'Pays', - Flag: 'Flag', - Flags: 'Flags', + 'Continue': 'Continuer', + 'Dashboard': 'Tableau de bord', + 'Players': 'Joueurs', + 'Organizations': 'Organisations', + 'Documents': 'Documents', + 'Integrations': 'Intégrations', + 'Settings': 'Paramètres', + 'Profile': 'Profil', + 'Logout': 'Se déconnecter', + 'Firstname': 'Prénom', + 'Lastname': 'Nom de famille', + 'Organization': 'Organisation', + 'Language': 'Langue', + 'Injects': 'Stimulis', + 'Messages': 'Messages', + 'Mails': 'Mails', + 'Timeline': 'Chronologie', + 'Definition': 'Définition', + 'Results': 'Résultats', + 'Channels': 'Canaux', + 'Submit': 'Soumettre', + 'Country': 'Pays', + 'Flag': 'Flag', + 'Flags': 'Flags', 'Flag type': 'Type de flag', 'Flag is correct! It has been successfully submitted.': 'Le flag est correct! Il a été soumis avec succès.', @@ -64,32 +64,32 @@ const i18n = { 'Inject context': 'Contexte du stimuli', 'added an entry on': 'a ajouté une entrée le', 'This file type is not accepted here.': - "Ce type de fichier n'est pas accepté ici", + 'Ce type de fichier n\'est pas accepté ici', 'Distribution of score by team (in % of expectations)': 'Distribution du score par équipe (en % des attendus)', 'Select all': 'Sélectionner tout', 'Do you want to anonymize lessons learned questionnaire?': - "Souhaitez-vous anonymiser le questionnaire de retour d'expérience ?", + 'Souhaitez-vous anonymiser le questionnaire de retour d\'expérience ?', 'You will not be able to change this setting later.': 'Vous ne serez plus en mesure de modifier ce paramètre après.', 'Search these results': 'Rechercher ces résultats', - Stop: 'Arrêter', - Name: 'Nom', - Subtitle: 'Sous-titre', - Notes: 'Notes', + 'Stop': 'Arrêter', + 'Name': 'Nom', + 'Subtitle': 'Sous-titre', + 'Notes': 'Notes', 'Please note that if you change the "Reply to" address, the email interaction functionality in the platform will be disabled.': 'Veuillez noter que si vous modifiez l\'adresse « Répondre à », la fonctionnalité d\'interaction par mail dans la plateforme sera désactivée.', 'If you remove the default email address, the email reception for this simulation / scenario will be disabled.': 'Si vous supprimez l\'adresse e-mail par défaut, la réception des e-mails pour cette simulation / ce scénario sera désactivée.', 'Start date': 'Date de début', 'End date': 'Date de fin', - To: 'A', - From: 'De', + 'To': 'A', + 'From': 'De', 'Reply to': 'Répondre à', - Tags: 'Tags', - Reply: 'Répondre', - newspaper: 'Journal', - tv: 'Chaîne de télévision', - Anonymize: 'Anonymiser', - microblogging: 'Microblogging', + 'Tags': 'Tags', + 'Reply': 'Répondre', + 'newspaper': 'Journal', + 'tv': 'Chaîne de télévision', + 'Anonymize': 'Anonymiser', + 'microblogging': 'Microblogging', 'Targeted players': 'Joueurs ciblés', 'Inject details': 'Détails du stimuli', 'Export injects': 'Exporter les stimulis', @@ -115,7 +115,7 @@ const i18n = { 'Phone number (landline)': 'Numéro de téléphone (fixe)', 'PGP public key': 'Clé publique PGP', 'Create a new organization': 'Créer une nouvelle organisation', - 'Update the organization': "Modifier l'organisation", + 'Update the organization': 'Modifier l\'organisation', 'Do you want to delete this organization?': 'Souhaitez-vous supprimer cette organisation ?', 'Mail sent to': 'Mail envoyé à', @@ -123,10 +123,10 @@ const i18n = { 'Score des équipes dans le temps (en % des attendus)', 'Distribution of total score by inject type': 'Distribution du score total par type de stimuli', - on: 'le', - Manual: 'Manuel', + 'on': 'le', + 'Manual': 'Manuel', 'Total score': 'Score total', - Parameters: 'Configuration', + 'Parameters': 'Configuration', 'Default theme': 'Thème par défaut', 'Default language': 'Langue par défaut', 'Background color': 'Couleur d\'arrière plan', @@ -140,17 +140,17 @@ const i18n = { 'Logo URL (login)': 'URL du logo (login)', 'Do you want to trigger this inject now?': 'Souhaitez-vous déclencher ce stimuli maintenant ?', - Administrator: 'Administrateur', + 'Administrator': 'Administrateur', 'Trigger now': 'Déclencher maintenant', - Automatic: 'Automatique', + 'Automatic': 'Automatique', 'Passwords do no match': 'Les mots de passe ne correspondent pas', - 'Update the user password': "Modifier le mot de passe de l'utilisateur", + 'Update the user password': 'Modifier le mot de passe de l\'utilisateur', 'Update password': 'Modifier le mot de passe', 'Current password': 'Mot de passe actuel', 'New password': 'Nouveau mot de passe', - Security: 'Sécurité', - Users: 'Utilisateurs', - Groups: 'Groupes', + 'Security': 'Sécurité', + 'Users': 'Utilisateurs', + 'Groups': 'Groupes', 'Create a new group': 'Créer un groupe', 'Create a new tag': 'Créer un nouveau tag', 'Do you want to delete this tag?': 'Souhaitez-vous supprimer ce tag ?', @@ -163,19 +163,19 @@ const i18n = { 'Do you want to delete this group?': 'Souhaitez-vous supprimer ce groupe ?', 'No tag': 'Aucun tag', - 'Update the user': "Modifier l'utilisateur", + 'Update the user': 'Modifier l\'utilisateur', 'Read/Write': 'Lecture/Ecriture', 'Read Only': 'Lecture Seule', 'Update the group': 'Modifier le groupe', - Value: 'Valeur', - Color: 'Couleur', - Cancel: 'Annuler', - Back: 'Retour', - Next: 'Suivant', - Create: 'Créer', - Launch: 'Lancer', - Update: 'Modifier', - Duplicate: 'Dupliquer', + 'Value': 'Valeur', + 'Color': 'Couleur', + 'Cancel': 'Annuler', + 'Back': 'Retour', + 'Next': 'Suivant', + 'Create': 'Créer', + 'Launch': 'Lancer', + 'Update': 'Modifier', + 'Duplicate': 'Dupliquer', 'Do you want to duplicate this scenario:': 'Voulez-vous dupliquer ce scénario : ', 'Do you want to delete this scenario:': 'Voulez-vous supprimer ce scénario : ', 'Do you want to duplicate this simulation:': 'Voulez-vous dupliquer cette simulation : ', @@ -184,73 +184,73 @@ const i18n = { 'Do you want to delete this atomic testing:': 'Voulez-vous supprimer cet atomic testing : ', 'Do you want to duplicate this inject:': 'Voulez-vous dupliquer ce stimuli : ', 'Do you want to delete this inject:': 'Voulez-vous supprimer ce stimuli : ', - Delete: 'Supprimer', - Edition: 'Edition', - Confirmation: 'Confirmation', - Search: 'Rechercher', - Required: 'Obligatoire', + 'Delete': 'Supprimer', + 'Edition': 'Edition', + 'Confirmation': 'Confirmation', + 'Search': 'Rechercher', + 'Required': 'Obligatoire', 'Technical targets': 'Cibles techniques', 'Platform name': 'Nom de la plateforme', 'Components version': 'Version des composants', 'Sent at': 'Envoyé le', 'Mails not read': 'Mails non lus', 'Total mails': 'Mails totaux', - Dark: 'Sombre', - Light: 'Clair', + 'Dark': 'Sombre', + 'Light': 'Clair', 'This field is required.': 'Ce champ est requis.', - 'The element has been updated': "L'élément a été modifié.", - 'The element already exists': "L'élément existe déjà.", + 'The element has been updated': 'L\'élément a été modifié.', + 'The element already exists': 'L\'élément existe déjà.', 'Manage the users of this group': 'Gérer les utilisateurs de ce groupe', 'Create a new document': 'Créer un nouveau document', - Close: 'Fermer', + 'Close': 'Fermer', 'Export to XLS': 'Exporter en XLS', 'Export to image': 'Exporter en image', 'Export to PDF': 'Exporter en PDF', 'Export to CSV': 'Exporter en CSV', - Copy: 'Copier', - Start: 'Démarrer', + 'Copy': 'Copier', + 'Start': 'Démarrer', 'Start now': 'Démarrer maintenant', - Status: 'Statut', - Information: 'Information', - Control: 'Contrôle', - Scheduled: 'Planifié', - Finished: 'Terminé', - Execution: 'Exécution', - Dryrun: 'Simulation', - Comcheck: 'Vérification', - Send: 'Envoyer', - Remove: 'Retirer', - Add: 'Ajouter', - Scenario: 'Scénario', - Title: 'Titre', - Enabled: 'Activé', - Deleted: 'Supprimé', - Disabled: 'Désactivé', - Days: 'Jours', - Hours: 'Heures', - Minutes: 'Minutes', - Seconds: 'Secondes', + 'Status': 'Statut', + 'Information': 'Information', + 'Control': 'Contrôle', + 'Scheduled': 'Planifié', + 'Finished': 'Terminé', + 'Execution': 'Exécution', + 'Dryrun': 'Simulation', + 'Comcheck': 'Vérification', + 'Send': 'Envoyer', + 'Remove': 'Retirer', + 'Add': 'Ajouter', + 'Scenario': 'Scénario', + 'Title': 'Titre', + 'Enabled': 'Activé', + 'Deleted': 'Supprimé', + 'Disabled': 'Désactivé', + 'Days': 'Jours', + 'Hours': 'Heures', + 'Minutes': 'Minutes', + 'Seconds': 'Secondes', 'Try the inject': 'Tester le stimuli', - File: 'Fichier', - Simulations: 'Simulations', - Simulation: 'Simulation', - Exercise: 'Simulation', - Scenarios: 'Scenarios', - Severity: 'Severité', - Platforms: 'Plateformes', - Detection: 'Détection', - Detections: 'Détections', - Asset: 'Actif', - Assets: 'Actifs', + 'File': 'Fichier', + 'Simulations': 'Simulations', + 'Simulation': 'Simulation', + 'Exercise': 'Simulation', + 'Scenarios': 'Scenarios', + 'Severity': 'Severité', + 'Platforms': 'Plateformes', + 'Detection': 'Détection', + 'Detections': 'Détections', + 'Asset': 'Actif', + 'Assets': 'Actifs', 'Dynamic assets': 'Actifs dynamiques', - Active: 'Actif', - Inactive: 'Inactif', - Persons: 'Personnes', - Taxonomies: 'Taxonomies', - 'Attack patterns': "Motifs d'attaque", - AttackPatterns: "Motifs-d'attaque", + 'Active': 'Actif', + 'Inactive': 'Inactif', + 'Persons': 'Personnes', + 'Taxonomies': 'Taxonomies', + 'Attack patterns': 'Motifs d\'attaque', + 'AttackPatterns': 'Motifs-d\'attaque', 'Kill chain phases': 'Phases de kill chain', - KillChainPhases: 'Phases-de-kill-chain', + 'KillChainPhases': 'Phases-de-kill-chain', 'This field is mandatory': 'Ce champ est requis', 'Remove from the context': 'Retirer de ce contexte', 'Select a file': 'Sélectionner un fichier', @@ -267,8 +267,8 @@ const i18n = { 'Add target teams': 'Ajouter des équipes cibles', 'Trigger after': 'Se déclenche après', 'Create a new inject': 'Créer un nouveau stimuli', - 'Remove from the team': "Retirer de l'équipe", - 'Update the team': "Modifier l'équipe", + 'Remove from the team': 'Retirer de l\'équipe', + 'Update the team': 'Modifier l\'équipe', 'Update the simulation': 'Modifier la simulation', 'Update the scenario': 'Modifier le scenario', 'Update the inject': 'Modifier le stimuli', @@ -278,9 +278,9 @@ const i18n = { 'Add players in this team': 'Ajouter des joueurs dans cette équipe', 'Create a new team': 'Créer une nouvelle équipe', 'Remove from the inject': 'Retirer du stimuli', - 'Remove from the element': "Retirer de l'élément", + 'Remove from the element': 'Retirer de l\'élément', 'Do you want to remove the team from the inject?': - "Souhaitez-vous retirer l'équipe du stimuli ?", + 'Souhaitez-vous retirer l\'équipe du stimuli ?', 'Do you want to delete this simulation?': 'Souhaitez-vous supprimer cette simulation ?', 'Number of injects': 'Nombre de stimulis', @@ -289,7 +289,7 @@ const i18n = { 'No injects to send in this platform.': 'Aucun stimuli à envoyer dans cette plateforme.', 'Before starting the simulation, you can launch a comcheck to validate player email addresses and a dryrun to send injects to the animation team.': - "Avant de démarrer la simulation, vous pouvez lancer une vérification pour valider les adresses emails et une simulation pour envoyer les stimulis à l'équipe d’animation.", + 'Avant de démarrer la simulation, vous pouvez lancer une vérification pour valider les adresses emails et une simulation pour envoyer les stimulis à l\'équipe d’animation.', 'Apply a template': 'Appliquer un template', 'Auto assign': 'Auto assignation', 'Auto observer': 'Auto observateur', @@ -301,7 +301,7 @@ const i18n = { 'The new users will automatically be assigned to this group.': 'Les nouveaux utilisateurs seront automatiquement assignés à ce groupe.', 'This group will have observer permission on new simulations.': - "Ce groupe aura la permission d'observateur sur les nouvelles simulations.", + 'Ce groupe aura la permission d\'observateur sur les nouvelles simulations.', 'This group will have planner permission on new simulations.': 'Ce groupe aura la permission de planificateur sur les nouvelles simulations.', 'Processed injects': 'Stimulis traités', @@ -314,39 +314,39 @@ const i18n = { 'Add media pressure in this inject': 'Ajouter de la pression médiatique dans ce stimuli', 'Kill chain phase': 'Phase de kill chain', - Created: 'Créé', - Updated: 'Mis à jour', + 'Created': 'Créé', + 'Updated': 'Mis à jour', 'External ID': 'ID externe', - 'Update the attack pattern': "Modifier le motif d'attaque", - 'Create a new attack pattern': "Créer un nouveau motif d'attaque", + 'Update the attack pattern': 'Modifier le motif d\'attaque', + 'Create a new attack pattern': 'Créer un nouveau motif d\'attaque', 'Do you want to delete this attack pattern?': 'Voulez-vous supprimer ce modèle d\'attaque ?', 'Create a new kill chain phase': 'Créer une nouvelle phase de kill chain', 'Phase name': 'Nom de la phase', 'Kill chain name': 'Nom de la kill chain', 'Update the kill chain phase': 'Modifier la phase de la kill chain', 'Do you want to delete this kill chain phase?': 'Voulez-vous supprimer cette kill chain ?', - External: 'Externe', - openbas_email: 'Email', - openbas_ovh_sms: 'SMS (OVH)', - openbas_mastodon: 'Mastodon', - openbas_lade: 'Airbus LADE', - openbas_gnu_social: 'GNU Social', - openbas_twitter: 'Twitter', - openbas_http: 'Requête HTTP', - openbas_manual: 'Manuel (rappel)', - openbas_caldera: 'Caldera', - openbas_atomic_red_team: 'Atomic Red Team', - Subject: 'Sujet du mail', - Body: 'Corps du mail', - Encrypted: 'Chiffrer ce mail', - Attachments: 'Pièces jointes', - Attachment: 'Pièce jointe', - Content: 'Contenu', - Teams: 'Equipes', - Version: 'Version', + 'External': 'Externe', + 'openbas_email': 'Email', + 'openbas_ovh_sms': 'SMS (OVH)', + 'openbas_mastodon': 'Mastodon', + 'openbas_lade': 'Airbus LADE', + 'openbas_gnu_social': 'GNU Social', + 'openbas_twitter': 'Twitter', + 'openbas_http': 'Requête HTTP', + 'openbas_manual': 'Manuel (rappel)', + 'openbas_caldera': 'Caldera', + 'openbas_atomic_red_team': 'Atomic Red Team', + 'Subject': 'Sujet du mail', + 'Body': 'Corps du mail', + 'Encrypted': 'Chiffrer ce mail', + 'Attachments': 'Pièces jointes', + 'Attachment': 'Pièce jointe', + 'Content': 'Contenu', + 'Teams': 'Equipes', + 'Version': 'Version', 'Filigran support key': 'Clé de support Filigran', 'Remove Filigran logos': 'Retirer les logos Filigran', - Contextual: 'Contextuelle', + 'Contextual': 'Contextuelle', 'Send email': 'Envoyer le mail', 'Add documents in this media pressure': 'Ajouter des documents à cette pression médiatique', @@ -357,51 +357,51 @@ const i18n = { 'Raw request data': 'Données brutes de la requête', 'Media pressure to publish': 'Pression médiatique à publier', 'Form request data': 'Données de formulaire de la requête', - Key: 'Clé', - Headers: 'En-têtes', - team: 'Equipe', - attachment: 'Document', + 'Key': 'Clé', + 'Headers': 'En-têtes', + 'team': 'Equipe', + 'attachment': 'Document', 'Executed in': 'Exécuté en', 'Use basic authentication': 'Utiliser une authentification basique', 'Only in this context': 'Seulement dans ce contexte', - Medias: 'Médias', - Tools: 'Outils', - Success: 'Succès', - m: 'm', - h: 'h', - d: 'j', + 'Medias': 'Médias', + 'Tools': 'Outils', + 'Success': 'Succès', + 'm': 'm', + 'h': 'h', + 'd': 'j', 'Do you want to change the status of this simulation?': 'Souhaitez-vous changer le statut de cette simulation ?', 'will be started, do you want to continue?': 'va démarrer, voulez-vous continuer ?', 'Injects will be paused, do you want to continue?': 'Les stimulis seront interrompues. Voulez-vous continuer ?', 'data will be reset, do you want to restart?': 'les données seront réinitialisées, souhaitez-vous redémarrer ?', - Confirm: 'Confirmer', - Text: 'Texte', - 'Sender email address': "Adresse email de l'expéditeur", + 'Confirm': 'Confirmer', + 'Text': 'Texte', + 'Sender email address': 'Adresse email de l\'expéditeur', 'Creation date': 'Date de création', 'Next inject': 'Prochain stimuli', 'Dangerous zone': 'Zone sensible', - 'Invalid user or password': "Nom d'utilisateur ou mot de passe incorrect", - Default: 'Défaut', - Mandatory: 'Requis', - Optional: 'Optionnel', - text: 'Champ texte', - textarea: 'Zone de texte', - tuple: 'Duo clef valeur', - checkbox: 'Case à cocher', + 'Invalid user or password': 'Nom d\'utilisateur ou mot de passe incorrect', + 'Default': 'Défaut', + 'Mandatory': 'Requis', + 'Optional': 'Optionnel', + 'text': 'Champ texte', + 'textarea': 'Zone de texte', + 'tuple': 'Duo clef valeur', + 'checkbox': 'Case à cocher', 'Do you want to try this inject?': 'Souhaitez-vous tester ce stimuli ?', 'Do you want to launch this inject?': 'Souhaitez-vous lancer ce stimuli ?', 'The inject will only be sent to you.': 'Le stimuli sera uniquement envoyé à vous même.', - Try: 'Tester', - Disable: 'Désactiver', + 'Try': 'Tester', + 'Disable': 'Désactiver', 'Do you want to disable this inject:': 'Voulez-vous désactiver ce stimuli : ', 'Do you want to test this inject:': 'Voulez-vous tester ce stimuli : ', - Enable: 'Activer', + 'Enable': 'Activer', 'Mark as done': 'Marquer comme fait', 'Do you want to mark this inject as done?': 'Souhaitez-vous marquer ce stimuli comme fait ?', - Mark: 'Marquer', + 'Mark': 'Marquer', 'Do you want to disable this inject?': 'Souhaitez-vous désactiver ce stimuli ?', 'Do you want to enable this inject?': @@ -410,41 +410,41 @@ const i18n = { 'Souhaitez-vous désactiver cette équipe ?', 'Do you want to enable this team?': 'Souhaitez-vous activer cette équipe ?', - Trigger: 'Déclencheur', + 'Trigger': 'Déclencheur', 'Manual launch': 'Lancement manuel', 'Manage content': 'Gérer le contenu', - Controls: 'Contrôles', - Planning: 'Planification', - Comchecks: 'Vérifications', - Dryruns: 'Simulations', + 'Controls': 'Contrôles', + 'Planning': 'Planification', + 'Comchecks': 'Vérifications', + 'Dryruns': 'Simulations', 'Messages header': 'En-tête des messages', 'Messages footer': 'Pied des messages', 'Send a new comcheck': 'Envoyer une nouvelle vérification', 'Launch a new dryrun': 'Démarrer une nouvelle simulation', - Hello: 'Bonjour', - Statistics: 'Statistiques', - Reports: 'Rapports', + 'Hello': 'Bonjour', + 'Statistics': 'Statistiques', + 'Reports': 'Rapports', '[${exercise.name}] Communication check': '[${exercise.name}] Vérification des moyens de communication', 'This is a communication check before the beginning of the simulation. Please click on the following link in order to confirm you successfully received this message: ${comcheck.url}.': 'Ceci est une vérification des moyens de communication avant le début de la simulation. Merci de bien vouloir cliquer sur le lien ci-dessous afin de confirmer que vous avez reçu ce message avec succès : ${comcheck.url}.', 'We would like thank your for your participation in this simulation. You are kindly requested to fill this lessons learned questionnaire: ${lessons_uri}.': - "Nous souhaitons vous remercier pour votre participation à la simulation. Vous êtes cordialement invités à remplir le formulaire de retour d'expérience : ${lessons_uri}.", + 'Nous souhaitons vous remercier pour votre participation à la simulation. Vous êtes cordialement invités à remplir le formulaire de retour d\'expérience : ${lessons_uri}.', '[${exercise.name}] Lessons learned questionnaire': - "[${exercise.name}] Questionnaire de retour d'expérience", + '[${exercise.name}] Questionnaire de retour d\'expérience', 'Best regards': 'Bien cordialement', - 'The simulation control team': "L'équipe d'animation de la simulation", + 'The simulation control team': 'L\'équipe d\'animation de la simulation', 'Do you want to launch a new dryrun?': 'Souhaitez-vous lancer une nouvelle simulation ?', 'Add tags to this simulation': 'Ajouter des tags à cette simulation', 'Add tags to this scenario': 'Ajouter des tags à ce scenario', 'No comcheck in this simulation.': 'Aucune vérification dans cette simulation', - 'There is nothing to see here...': "Il n'y a rien à voir ici...", + 'There is nothing to see here...': 'Il n\'y a rien à voir ici...', 'Send the lessons learned questionnaire': - "Envoyer le questionnaire de retour d'expérience", - Comments: 'Commentaires', + 'Envoyer le questionnaire de retour d\'expérience', + 'Comments': 'Commentaires', 'Comment (optional)': 'Commentaire (optionnel)', - "What didn't work well": "Ce qui n'a pas bien fonctionné", + 'What didn\'t work well': 'Ce qui n\'a pas bien fonctionné', 'What worked well': 'Ce qui a bien fonctionné', 'Answers : N/A': 'Réponses : N/A', 'Global evaluation': 'Evaluation globale', @@ -452,25 +452,25 @@ const i18n = { 'Votre évaluation générale à propos de cette question.', 'Do you want to submit your answers? You will not be able to change them later.': 'Souhaitez-vous soumettre vos réponses ? Vous ne pourrez pas les changer plus tard.', - Check: 'Vérification', - Preview: 'Aperçu', - None: 'Aucune', - message: 'Message', - Pending: 'En attente', - State: 'Etat', - 'Sent date': "Date d'envoi", + 'Check': 'Vérification', + 'Preview': 'Aperçu', + 'None': 'Aucune', + 'message': 'Message', + 'Pending': 'En attente', + 'State': 'Etat', + 'Sent date': 'Date d\'envoi', 'Received date': 'Date de réception', 'Communication check': 'Vérification des moyens de communication', - Running: 'En cours', - Failure: 'Echec', - Expired: 'Expiré', + 'Running': 'En cours', + 'Failure': 'Echec', + 'Expired': 'Expiré', 'Expired after': 'Expiré après', - Anonymized: 'Anonymisé', + 'Anonymized': 'Anonymisé', 'No media pressure entry in this channel yet.': 'Encore aucune entrée de pression médiatique dans ce média.', 'Your communication check is': 'Votre test de communication est', - successful: 'un succès', - answers: 'réponses', + 'successful': 'un succès', + 'answers': 'réponses', 'of which': 'dont', 'contain comments': 'contiennent des commentaires', 'Verification done at': 'Vérification faite le', @@ -485,23 +485,23 @@ const i18n = { 'Update the poll': 'Modifier le sondage', 'Simulation logs': 'Journal de la simulation', 'Poll replies': 'Réponses au sondage', - Overview: 'Aperçu', - Objectives: 'Objectifs', + 'Overview': 'Aperçu', + 'Objectives': 'Objectifs', 'Create a new objective': 'Créer un nouvel objectif', - 'Update the objective': "Modifier l'objectif", + 'Update the objective': 'Modifier l\'objectif', 'Do you want to delete this objective?': 'Souhaitez-vous supprimer cet objectif ?', 'Write an entry': 'Ecrire une entrée', 'Do you want to delete this log?': 'Souhaitez-vous supprimer cette entrée ?', 'Objective achievement evalution': - "Evaluation de l'atteinte de l'objectif", - Evaluate: 'Evaluer', + 'Evaluation de l\'atteinte de l\'objectif', + 'Evaluate': 'Evaluer', 'My evaluation': 'Mon évaluation', - Priority: 'Priorité', - Polls: 'Sondages', + 'Priority': 'Priorité', + 'Polls': 'Sondages', 'Create a new poll': 'Créer un nouveau sondage', - 'Update the log': "Modifier l'entrée", + 'Update the log': 'Modifier l\'entrée', 'Create a new user': 'Créer un nouvel utilisateur', 'Dryrun recipients': 'Destinataires de la simulation', 'Create a new report': 'Créer un nouveau rapport', @@ -511,39 +511,39 @@ const i18n = { 'Update the report': 'Modifier le rapport', 'An error occurred during PDF generation.': 'Une erreur s\'est produite lors de la génération du PDF.', 'Table of contents': 'Sommaire', - token: 'Token du compte', - status: 'Statut', + 'token': 'Token du compte', + 'status': 'Statut', 'Inject documents': 'Documents du stimuli', 'Add documents': 'Ajouter des documents', 'Add documents in this inject': 'Ajouter des documents dans ce stimuli', - Yes: 'Oui', - No: 'Non', + 'Yes': 'Oui', + 'No': 'Non', 'Not applicable': 'Non applicable', 'Enable attachment': 'Activer la pièce jointe', 'Disable attachment': 'Désativer la pièce jointe', 'Do you want to remove the document from the element?': 'Souhaitez-vous retirer ce document de cet élément ?', 'Import a simulation': 'Importer une simulation', - Export: 'Exporter', + 'Export': 'Exporter', 'Export the simulation': 'Exporter cette simulation', 'Export the scenario': 'Exporter ce scenario', 'Do you want to delete the scenario?': 'Voulez-vous supprimer ce scénario?', 'A simulation will be launched based on this scenario and will start immediately. Are you sure you want to proceed?': 'Une simulation sera lancée à partir de ce scénario et commencera immédiatement. Êtes-vous sûr de vouloir continuer ?', 'Reset to default values': 'Réinitialiser les valeurs par défaut', - Elements: 'Eléments', + 'Elements': 'Eléments', 'Scenario (including attached files)': 'Scénario (fichiers joints inclus)', 'Send an email': 'Envoyer un email', 'Send a SMS': 'Envoyer un SMS', 'To fill': 'A remplir', - Username: "Nom d'utilisateur", - Unknown: 'Inconnu', + 'Username': 'Nom d\'utilisateur', + 'Unknown': 'Inconnu', 'No value': 'Aucune valeur', 'Primary color (dark)': 'Couleur primaire (sombre)', 'Secondary color (dark)': 'Couleur secondaire (sombre)', 'Primary color (light)': 'Couleur primaire (clair)', 'Secondary color (light)': 'Couleur secondaire (clair)', - logo: 'Logo seulement', + 'logo': 'Logo seulement', 'Title only': 'Titre seulement', 'logo-title': 'Logo et titre', 'Dark theme': 'Thème sombre', @@ -562,43 +562,43 @@ const i18n = { 'Used challenges (in injects)': 'Défis utilisés (dans les stimulis)', 'No challenge are used in the injects of this simulation.': 'Aucun défi n\'est utilisé dans les stimulis de cette simulation.', 'Create a new media pressure': 'Créer une nouvelle pression médiatique', - 'Collaborative lessons learned': "Retour d'expérience collaboratif", - Answers: 'Réponses', + 'Collaborative lessons learned': 'Retour d\'expérience collaboratif', + 'Answers': 'Réponses', 'Categories and questions': 'Catégories et questions', - Questions: 'Questions', + 'Questions': 'Questions', 'Clear out': 'Vider', 'Objective achievement evaluation': - "Evaluation de l'atteinte de l'objectif", + 'Evaluation de l\'atteinte de l\'objectif', 'Crisis intensity (injects by hour)': 'Intensité de la crise (stimulis par heure)', 'Apply a lessons learned template': - "Appliquer un template de retour d'expérience", + 'Appliquer un template de retour d\'expérience', 'Questionnaire mode': 'Mode du questionnaire', 'Anonymize answers': 'Anonymiser les réponses', 'No explanation': 'Aucune explication', 'Add target teams in this lessons learned category': - "Ajouter des équipes cibles à cette catégorie de retour d'expérience", + 'Ajouter des équipes cibles à cette catégorie de retour d\'expérience', 'Sending the questionnaire will emit an email to each player with a unique link to access and fill it.': 'Envoyer le questionnaire va émettre un email à chaque joueur avec un lien unique pour y accéder et le remplir.', 'Do you want to empty lessons learned categories and questions?': - "Souhaitez-vous vider les catégories et les questions de retour d'expérience ?", + 'Souhaitez-vous vider les catégories et les questions de retour d\'expérience ?', 'Do you want to reset lessons learned answers?': - "Souhaitez-vous réinitialiser les réponses du retour d'expérience ?", - Reset: 'Réinitialiser', - Campaign: 'Campagne', - Duration: 'Durée', + 'Souhaitez-vous réinitialiser les réponses du retour d\'expérience ?', + 'Reset': 'Réinitialiser', + 'Campaign': 'Campagne', + 'Duration': 'Durée', 'Send the questionnaire': 'Envoyer le questionnaire', 'Reset answers': 'Réinitialiser les réponses', - hours: 'heures', + 'hours': 'heures', 'Expiration time': 'Temps d\'expiration', - Apply: 'Appliquer', - players: 'joueurs', - Explanation: 'Explication', - Category: 'Catégorie', + 'Apply': 'Appliquer', + 'players': 'joueurs', + 'Explanation': 'Explication', + 'Category': 'Catégorie', 'Create a new challenge': 'Créer un nouveau challenge', - Channel: 'Média', - Author: 'Auteur', - 'Max number of attempts': "Nombre maximum d'essais", + 'Channel': 'Média', + 'Author': 'Auteur', + 'Max number of attempts': 'Nombre maximum d\'essais', 'Add documents in this challenge': 'Ajouter un document à ce challenge', 'At least one flag is required for a challenge.': 'Au moins un flag est requis pour un challenge.', @@ -612,9 +612,9 @@ const i18n = { 'Souhaitez-vous retirer cette pression médiatique de ce stimuli ?', 'Do you want to remove this challenge from the inject?': 'Souhaitez-vous retirer ce challenge de ce stimuli ?', - VALUE: 'Texte', - VALUE_CASE: 'Texte (sensible à la casse)', - REGEXP: 'Expression régulière', + 'VALUE': 'Texte', + 'VALUE_CASE': 'Texte (sensible à la casse)', + 'REGEXP': 'Expression régulière', 'No category': 'Aucune catégorie', 'No challenge in this simulation yet.': 'Encore aucun challenge dans cette simulation.', @@ -638,25 +638,25 @@ const i18n = { 'Add expectation in this inject': 'Ajouter des attendus dans ce stimuli', 'Update the expectation': 'Modifier l\'attendu', 'Do you want to delete this expectation ?': 'Voulez vous supprimer cet attendu ?', - 'Number of expectations': "Nombre d'attendus", + 'Number of expectations': 'Nombre d\'attendus', 'Inject expectations': 'Attendus du stimuli', 'Manual expectations': 'Attendus manuels', 'Expectations of ': 'Attendus de ', - MANUAL: 'Manuel', - ARTICLE: 'Automatique - Déclenché lorsque l\'équipe a lu l\'article', - DETECTION: 'Automatique - Detection: Déclenché lorsque l\'injection est traitée', - PREVENTION: 'Automatique - Prevention: Déclenché lorsque l\'injection est traitée', - TYPE_ARTICLE: 'Article', - TYPE_CHALLENGE: 'Défi', - TYPE_DETECTION: 'Detection', - TYPE_MANUAL: 'Manuel', - TYPE_PREVENTION: 'Prevention', - TYPE_HUMAN_RESPONSE: 'Réponse humaine', - FAILED: 'Echoué', - VALIDATED: 'Validé', - Done: 'Fait', - Draft: 'Brouillon ', - Failed: 'Echoué', + 'MANUAL': 'Manuel', + 'ARTICLE': 'Automatique - Déclenché lorsque l\'équipe a lu l\'article', + 'DETECTION': 'Automatique - Detection: Déclenché lorsque l\'injection est traitée', + 'PREVENTION': 'Automatique - Prevention: Déclenché lorsque l\'injection est traitée', + 'TYPE_ARTICLE': 'Article', + 'TYPE_CHALLENGE': 'Défi', + 'TYPE_DETECTION': 'Detection', + 'TYPE_MANUAL': 'Manuel', + 'TYPE_PREVENTION': 'Prevention', + 'TYPE_HUMAN_RESPONSE': 'Réponse humaine', + 'FAILED': 'Echoué', + 'VALIDATED': 'Validé', + 'Done': 'Fait', + 'Draft': 'Brouillon ', + 'Failed': 'Echoué', 'This page is coming soon': 'Cette page arrive bientôt', 'Pending result': 'Résultat en attente', 'Validation mode': 'Type de validation', @@ -693,25 +693,25 @@ const i18n = { 'Sent injects over time': 'Stimulis envoyés dans le temps', 'Sent mails over time': 'Emails envoyés dans le temps', 'No data to display or the simulation has not started yet': - "Aucune donnée disponible ou la simulation n'a pas encore commencé", - 'Back to administration': "Retour à l'administration", + 'Aucune donnée disponible ou la simulation n\'a pas encore commencé', + 'Back to administration': 'Retour à l\'administration', 'Teams scores over time': 'Score des équipes dans le temps', 'Inject types scores over time': 'Score des types de stimuli dans le temps', 'The animation team can validate the team reaction': - "L'équipe d'animation peut valider la réaction de l'équipe", - Description: 'Description', + 'L\'équipe d\'animation peut valider la réaction de l\'équipe', + 'Description': 'Description', 'No description': 'Aucune description', 'Only injects with manual validation': 'Seulement les stimulis avec validation manuelle', 'Pending reading': 'Lecture en attente', 'Pending submission': 'Soumission en attente', 'Pending validation': 'Validation en attente', - Validations: 'Validations', - Type: 'Type', - Validate: 'Valider', - Validated: 'Validé', - Error: 'Erreur', + 'Validations': 'Validations', + 'Type': 'Type', + 'Validate': 'Valider', + 'Validated': 'Validé', + 'Error': 'Erreur', 'This page is not found on this OpenBAS application.': 'Cette page est introuvable sur l\'application OpenBAS.', 'You must be logged to access this page': 'Vous devez être connecté pour accéder à cette page', // Validation Type @@ -722,15 +722,15 @@ const i18n = { 'Challenge validation': 'Validation du défi', 'Media pressure read': 'Pression médiatique', // Challenges - Challenges: 'Challenges', + 'Challenges': 'Challenges', // Variables 'Available variables': 'Variables disponibles', - Variables: 'Variables', + 'Variables': 'Variables', 'Create a new variable': 'Créer une nouvelle variable', 'Do you want to delete the variable ?': 'Voulez vous supprimer cette variable ?', 'Update the variable': 'Mettre à jour la variable', 'Invalid input. Please use only letters or underscores, and ensure the field is not empty.': - "Saisie invalide. Merci d'utiliser uniquement des lettres ou des tirets bas, et de vous assurer que le champ n'est pas vide.", + 'Saisie invalide. Merci d\'utiliser uniquement des lettres ou des tirets bas, et de vous assurer que le champ n\'est pas vide.', 'Builtin variables': 'Variables intégrées', 'Custom variables': 'Variables personnalisées', 'Please follow this link to': 'Merci de suivre ce lien pour', @@ -741,43 +741,43 @@ const i18n = { 'Edit code': 'Edition', 'Live code': 'Code en temps réel', 'Preview code': 'Prévisualisation', - Shares: 'Nombre de partages', - Likes: 'Nombre de likes', + 'Shares': 'Nombre de partages', + 'Likes': 'Nombre de likes', 'Read more': 'Lire plus', 'JAVA Virtual Machine': 'Machine virtuelle JAVA', 'Latest stable build': 'Dernière version stable', 'API specifications': 'Spécifications de l\'API', - Theme: 'Thème', + 'Theme': 'Thème', 'OpenBAS platform': 'Plateforme OpenBAS', 'Enable Enterprise Edition': 'Activer l\'édition enterprise', - PostgreSQL: 'PostgreSQL', + 'PostgreSQL': 'PostgreSQL', 'Token key': 'Token', - Example: 'Exemple', - Score: 'Score', + 'Example': 'Exemple', + 'Score': 'Score', 'Success score': 'Score de réussite', - Scores: 'Scores', + 'Scores': 'Scores', 'Expected score': 'Score attendu', 'Score must be greater than 0': 'Le score doit être supérieur à 0', 'Score must be less than or equal to 100': 'Le score doit être inférieur ou égal à 100', - Message: 'Message', + 'Message': 'Message', 'New control': 'Nouveau contrôle', 'Percent of reached score': 'Pourcentage du score atteint', - Pause: 'Pause', - Resume: 'Reprendre', - injects: 'injects', - Paused: 'En pause', - Canceled: 'Annulé', - Partial: 'Partiel', + 'Pause': 'Pause', + 'Resume': 'Reprendre', + 'injects': 'injects', + 'Paused': 'En pause', + 'Canceled': 'Annulé', + 'Partial': 'Partiel', 'Quick inject definition': 'Définition rapide de l’injection', - Order: 'Ordre', - Details: 'Détails', - Team: 'Equipe', - Player: 'Jouer', - player: 'jouer', - Template: 'Modèle', - Questionnaire: 'Questionnaire', - User: 'Utilisateur', - Modules: 'Modules', + 'Order': 'Ordre', + 'Details': 'Détails', + 'Team': 'Equipe', + 'Player': 'Jouer', + 'player': 'jouer', + 'Template': 'Modèle', + 'Questionnaire': 'Questionnaire', + 'User': 'Utilisateur', + 'Modules': 'Modules', 'Access reports': 'Accéder aux rapports', 'General information': 'Informations générales', 'There is no report for this simulation yet': 'Il n\'y a pas encore de rapport pour cette simulation', @@ -795,28 +795,28 @@ const i18n = { 'Lessons learned objectives': 'Objectifs des leçons apprises', 'Lessons learned statistics': 'Statistiques des leçons apprises', 'Lessons learned details': 'Détails des leçons apprises', - Logos: 'Logos', - toggle: 'Basculer', - Collapse: 'Réduire', - Animation: 'Animation', + 'Logos': 'Logos', + 'toggle': 'Basculer', + 'Collapse': 'Réduire', + 'Animation': 'Animation', 'API access': 'Accès à l’API', - RENEW: 'RENOUVELER', - Granted: 'Accordé', - submitted: 'Soumis', - failed: 'Échoué', - Question: 'Question', - By: 'Par', + 'RENEW': 'RENOUVELER', + 'Granted': 'Accordé', + 'submitted': 'Soumis', + 'failed': 'Échoué', + 'Question': 'Question', + 'By': 'Par', 'Should not be empty': 'Ne doit pas être vide', // Assets - Endpoints: 'Endpoints', - asset: 'actif', - Rules: 'Règles', - Rule: 'Règle', + 'Endpoints': 'Endpoints', + 'asset': 'actif', + 'Rules': 'Règles', + 'Rule': 'Règle', 'Teams of players': 'Equipes de joueurs', 'Create a new endpoint': 'Créer un nouvel endpoint', 'Update the endpoint': 'Modifier l\'endpoint', 'Do you want to delete the endpoint ?': 'Souhaitez-vous supprimer cet endpoint ?', - Hostname: 'Nom d\'hôte', + 'Hostname': 'Nom d\'hôte', 'Ip Addresses': 'Addresse Ips', 'Ip Address': 'Addresse Ip', 'Ip Address {index}': 'Addresse Ip {index}', @@ -826,7 +826,7 @@ const i18n = { 'MAC Addresses': 'Adresses MAC', 'Please provide one MAC address per line.': 'Veuillez fournir une adresse MAC par ligne.', 'Invalid MAC address': 'Mac adresse non valide', - Platform: 'Plateforme', + 'Platform': 'Plateforme', 'Platform(s)': 'Plateforme(s)', 'Collected by': 'Collecté par', 'Targeted asets': 'Actifs ciblés', @@ -836,8 +836,8 @@ const i18n = { 'By default, only assets compliant with the injector are displayed': 'Par défaut, seuls les actifs conformes à l\'injecteur sont affichés', // Asset groups 'Asset groups': 'Groupe d\'assets', - AssetGroup: 'Groupe-d-assets', - AssetGroups: 'Groupes-d-assets', + 'AssetGroup': 'Groupe-d-assets', + 'AssetGroups': 'Groupes-d-assets', 'Filter allowing assets to be added dynamically to this group': 'Filtre permettant d\'ajouter dynamiquement des actifs à ce groupe', 'Create a new asset group': 'Créer un nouvel asset group', 'Update the asset group': 'Modifier l\'asset group', @@ -849,166 +849,166 @@ const i18n = { 'Add asset groups': 'Ajouter des groupes d\'assets', 'Add asset groups in this inject': 'Ajouter des groupes d\'assets dans ce stimuli', 'Media pressure': 'Pression médiatique', - Home: 'Accueil', + 'Home': 'Accueil', 'Atomic testings': 'Tests atomiques', - Components: 'Composants', - Skills: 'Compétences', - Mitigations: 'Endiguements', + 'Components': 'Composants', + 'Skills': 'Compétences', + 'Mitigations': 'Endiguements', 'Search the platform': 'Rechercher dans la plateforme', 'Advanced search': 'Recherche avancée', - Notifications: 'Notifications', + 'Notifications': 'Notifications', 'Filigran eXtended Threat Management': 'Filigran eXtended Threat Management', 'Platform connected': 'Plateforme connectée', 'Get OpenCTI now': 'Obtenir OpenCTI maintenant', 'Current platform': 'Plateforme courante', - Personas: 'Personas', + 'Personas': 'Personas', 'The country code and mobile phone number provided is invalid. Please provide a valid number': 'L\'indicatif du pays et le numéro de téléphone mobile fournis ne sont pas valides. Veuillez fournir un numéro valide', - phone_number_tooltip: 'Le numéro de téléphone devrait commencer par un signe plus ( + )\n' + 'phone_number_tooltip': 'Le numéro de téléphone devrait commencer par un signe plus ( + )\n' + 'Il peut contenir des espaces ou des tirets ( – ) ou des parenthèses.\n', 'Instantiate a simulation': 'Créer une nouvelle simulation', 'Do you want to delete the asset group ?': 'Voulez-vous supprimer le groupe d\'actifs ?', // -- FILTERS -- 'Add filter': 'Ajout d\'un filtre', 'Clear filters': 'Supprimer les filtres', - AND: 'ET', - OR: 'OU', + 'AND': 'ET', + 'OR': 'OU', // Asset - asset_tags: 'Tags', + 'asset_tags': 'Tags', // Asset Group - asset_group_name: 'Nom', - asset_group_description: 'Description', - asset_group_tags: 'Tags', + 'asset_group_name': 'Nom', + 'asset_group_description': 'Description', + 'asset_group_tags': 'Tags', // Endpoint - endpoint_hostname: 'Nom d\'hôte', - endpoint_ips: 'Addresse Ips', - endpoint_platform: 'Platforme', - endpoint_arch: 'Architecture', - endpoint_agent_version: 'Version de l\'agent', + 'endpoint_hostname': 'Nom d\'hôte', + 'endpoint_ips': 'Addresse Ips', + 'endpoint_platform': 'Platforme', + 'endpoint_arch': 'Architecture', + 'endpoint_agent_version': 'Version de l\'agent', // Inject - inject_kill_chain_phases: 'Phase de kill chain', - inject_injector_contract: 'Injector', - inject_platforms: 'Plateformes', - inject_tags: 'Tags', - inject_title: 'Titre', - inject_type: 'Type', - inject_updated_at: 'Mis à jour à', + 'inject_kill_chain_phases': 'Phase de kill chain', + 'inject_injector_contract': 'Injector', + 'inject_platforms': 'Plateformes', + 'inject_tags': 'Tags', + 'inject_title': 'Titre', + 'inject_type': 'Type', + 'inject_updated_at': 'Mis à jour à', // Injector Contract - injector_contract_kill_chain_phases: 'Phase de kill chain', - injector_contract_injector: 'Injector', - injector_contract_labels: 'Label', - injector_contract_platforms: 'Platforms', - injector_contract_arch: 'Architecture', + 'injector_contract_kill_chain_phases': 'Phase de kill chain', + 'injector_contract_injector': 'Injector', + 'injector_contract_labels': 'Label', + 'injector_contract_platforms': 'Platforms', + 'injector_contract_arch': 'Architecture', // Scenario - scenario_category: 'Catégorie', - scenario_kill_chain_phases: 'Phase de kill chain', - scenario_name: 'Nom', - scenario_platforms: 'Plateformes', - scenario_recurrence: 'Récurrence', - scenario_severity: 'Sévérité', - scenario_tags: 'Tags', - scenario_updated_at: 'Mis à jour à', + 'scenario_category': 'Catégorie', + 'scenario_kill_chain_phases': 'Phase de kill chain', + 'scenario_name': 'Nom', + 'scenario_platforms': 'Plateformes', + 'scenario_recurrence': 'Récurrence', + 'scenario_severity': 'Sévérité', + 'scenario_tags': 'Tags', + 'scenario_updated_at': 'Mis à jour à', // Exercise - exercise_kill_chain_phases: 'Phase de kill chain', - exercise_name: 'Nom', - exercise_scenario: 'Scenario', - exercise_status: 'Statut', - exercise_start_date: 'Date de début', - exercise_tags: 'Tags', - exercise_updated_at: 'Mis à jour à', + 'exercise_kill_chain_phases': 'Phase de kill chain', + 'exercise_name': 'Nom', + 'exercise_scenario': 'Scenario', + 'exercise_status': 'Statut', + 'exercise_start_date': 'Date de début', + 'exercise_tags': 'Tags', + 'exercise_updated_at': 'Mis à jour à', // Payload - payload_attack_patterns: 'Modèles d\'attaque', - payload_name: 'Nom', - payload_description: 'Description', - payload_platforms: 'Plateformes', - payload_source: 'Source', - payload_status: 'Statut', - payload_tags: 'Tags', - payload_updated_at: 'Mis à jour à', - executable_arch: 'Architecture', + 'payload_attack_patterns': 'Modèles d\'attaque', + 'payload_name': 'Nom', + 'payload_description': 'Description', + 'payload_platforms': 'Plateformes', + 'payload_source': 'Source', + 'payload_status': 'Statut', + 'payload_tags': 'Tags', + 'payload_updated_at': 'Mis à jour à', + 'executable_arch': 'Architecture', // Team - team_tags: 'Tags', + 'team_tags': 'Tags', // User - user_email: 'Email', - user_firstname: 'Prénom', - user_lastname: 'Nom de famille', - user_organization: 'Organisation', - user_tags: 'Tags', - Unverified: 'Non vérifié', - Verified: 'Vérifié', - Recurrence: 'Récurrence', + 'user_email': 'Email', + 'user_firstname': 'Prénom', + 'user_lastname': 'Nom de famille', + 'user_organization': 'Organisation', + 'user_tags': 'Tags', + 'Unverified': 'Non vérifié', + 'Verified': 'Vérifié', + 'Recurrence': 'Récurrence', 'Does not repeat': 'Ne se répète pas', - Daily: 'Quotidien', - Weekly: 'Hebdomadaire', - Monthly: 'Mensuel', + 'Daily': 'Quotidien', + 'Weekly': 'Hebdomadaire', + 'Monthly': 'Mensuel', 'Set daily recurrence': 'Définir la récurrence quotidienne', 'Set weekly recurrence': 'Définir la récurrence hebdomadaire', 'Set monthly recurrence': 'Définir la récurrence mensuelle', 'Week of month': 'Semaine du mois', - First: 'Première', - Second: 'Deuxième', - Third: 'Troisième', - Fourth: 'Quatrième', + 'First': 'Première', + 'Second': 'Deuxième', + 'Third': 'Troisième', + 'Fourth': 'Quatrième', 'Day of week': 'Jour de la semaine', - Monday: 'Lundi', - Tuesday: 'Mardi', - Wednesday: 'Mercredi', - Thursday: 'Jeudi', - Friday: 'Vendredi', - Saturday: 'Samedi', - Sunday: 'Dimanche', - Scheduling_time: 'Heure', - Save: 'Enregistrer', + 'Monday': 'Lundi', + 'Tuesday': 'Mardi', + 'Wednesday': 'Mercredi', + 'Thursday': 'Jeudi', + 'Friday': 'Vendredi', + 'Saturday': 'Samedi', + 'Sunday': 'Dimanche', + 'Scheduling_time': 'Heure', + 'Save': 'Enregistrer', 'Launch a simulation or start a recurring simuation from this scenario': 'Lancer une simulation ou démarrer une simulation récurrente à partir de ce scénario', - recurrence_The: 'Le', - recurrence_at: 'à', - recurrence_from: 'du', - recurrence_to: 'au', - recurrence_starting_from: 'à partir du', - recurrence_Last: 'Dernière', + 'recurrence_The': 'Le', + 'recurrence_at': 'à', + 'recurrence_from': 'du', + 'recurrence_to': 'au', + 'recurrence_starting_from': 'à partir du', + 'recurrence_Last': 'Dernière', 'No scheduling': 'Pas de planification', - Scheduling: 'Planification', + 'Scheduling': 'Planification', 'End date need to be stricly after start date': '', 'The time and start date do not match, as the time provided is either too close to the current moment or in the past': 'Il y a un décalage entre l\'heure et la date de début (l\'heure est soit trop proche de maintenant, soit dans le passé)', 'Only weekday': 'Seulement la semaine', // Atomic Testing - 'Attack started': "Début de l'attaque", - 'Attack ended': "Fin de l'attaque", + 'Attack started': 'Début de l\'attaque', + 'Attack ended': 'Fin de l\'attaque', 'Attack Detected': 'Attaque détectée', 'Validation Success': 'Attaque réussie', 'Attack Blocked': 'Attaque bloquée', 'Attack Not Detected': 'Attaque non détectée', - 'Validation Failed': "Échec de l'attaque", + 'Validation Failed': 'Échec de l\'attaque', 'Attack Unblocked': 'Attaque débloquée', 'Waiting Response': 'En attente', 'Unknown result': 'Résultat inconnu', - 'Inject Execution Status': "Statut d'exécution injecté", + 'Inject Execution Status': 'Statut d\'exécution injecté', 'Global score': 'Score global', 'Execution date': 'Date d\'exécution', 'Execution details': 'Détails d\'exécution', - 'Last Start Execution Date': "Dernière date de début d'exécution", + 'Last Start Execution Date': 'Dernière date de début d\'exécution', 'No targets available': 'Aucune cible disponible', 'No target data available': 'Aucune donnée de cible disponible', 'Targets response': 'Réponse des cibles', 'Update the atomic testing': 'Mettre à jour le test atomique', 'Create a new atomic test': 'Créer un nouveau test atomique', 'Mitre Filter': 'Filtre Mitre', - techniques: 'Techniques', + 'techniques': 'Techniques', 'Unknown Data': 'Données inconnues', 'No data available': 'Aucune donnée disponible (répété)', - Expectations: 'Objectifs', - 'Execution logs': "Logs d'exécution", - Target: 'Cible', - Traces: 'Traces', + 'Expectations': 'Objectifs', + 'Execution logs': 'Logs d\'exécution', + 'Target': 'Cible', + 'Traces': 'Traces', 'Tracking Sent Date': 'Date d\'envoi', 'Tracking Ack Date': 'Date de réception', 'Tracking End Date': 'Date de fin', 'Tracking Total Execution': 'Durée totale d\'exécution', - Time: 'Temps', + 'Time': 'Temps', 'Tracking Total Count': 'Nombre total d\'exécutions', 'Tracking Total Error': 'Nombre total d\'échecs', 'Tracking Total Success': 'Nombre total de succès', 'global-crisis': 'Crise mondiale', - 'attack-scenario': "Scénario d'attaque", + 'attack-scenario': 'Scénario d\'attaque', 'media-pressure': 'Pression médiatique', 'data-exfiltration': 'Exfiltration de données', 'capture-the-flag': 'Capture de drapeau', @@ -1018,80 +1018,80 @@ const i18n = { 'endpoint-protection': 'Protection des points de terminaison', 'web-filtering': 'Filtrage web', 'incident-response': 'Réponse aux incidents', - 'standard-operating-procedure': "Procédures d'exploitation standard", + 'standard-operating-procedure': 'Procédures d\'exploitation standard', 'crisis-communication': 'Communication de crise', 'strategic-reaction': 'Réaction stratégique', 'managed assets': 'actifs gérés', 'Search by target name': 'Recherche par nom de cible', - Contains: 'Contient', - contains: 'contient', + 'Contains': 'Contient', + 'contains': 'contient', 'Not contains': 'Ne contient pas', 'not contains': 'ne contient pas', - Equals: 'Egal', - equals: 'egal', + 'Equals': 'Egal', + 'equals': 'egal', 'Not equals': 'Pas égal', 'not equals': 'pas égal', 'Starts with': 'Commence par', 'starts with': 'commence par', 'Not starts with': 'Ne Commence pas par', 'not starts with': 'ne commence pas par', - Empty: 'Vide', + 'Empty': 'Vide', 'is empty': 'est vide', 'Not empty': 'Non vide', - 'is not empty': "n'est pas vide", - and: 'et', - Agents: 'Agents', + 'is not empty': 'n\'est pas vide', + 'and': 'et', + 'Agents': 'Agents', 'Learn more information about how to setup simulation agents': 'En savoir plus sur la configuration des agents de simulation', 'in the documentation': 'dans la documentation', 'Here, you can download and install simulation agents available in your executors. Depending on the integrations you have enabled, some of them may be unavailable.': 'Vous pouvez ici télécharger et installer les agents de simulation disponibles pour vos exécuteurs. Selon les intégrations que vous avez activées, certains agents peuvent ne pas être disponibles.', - 'Installation path': "Chemin d'installation", - Architecture: 'Architecture', - AMD64: 'AMD64', - ARM64: 'ARM64', - Download: 'Télécharger', - documentation: 'documentation', + 'Installation path': 'Chemin d\'installation', + 'Architecture': 'Architecture', + 'AMD64': 'AMD64', + 'ARM64': 'ARM64', + 'Download': 'Télécharger', + 'documentation': 'documentation', 'IP Addresses': 'Adresses IP', 'Kill Chain Phases': 'Phases de la Kill Chain', - 'Attack Patterns': "Modèles d'attaque", - Targets: 'Cibles', + 'Attack Patterns': 'Modèles d\'attaque', + 'Targets': 'Cibles', 'Results by target': 'Résultats par cible', - Configuration: 'Configuration', + 'Configuration': 'Configuration', 'No logs available': 'Aucun journal disponible', 'Add documents in this media pressure article': 'Ajouter des documents dans cet article de pression médiatique', - 'Update the media pressure article': "Mettre à jour l'article de pression médiatique", + 'Update the media pressure article': 'Mettre à jour l\'article de pression médiatique', 'Create an article': 'Créer un article', 'Create a new media pressure article': 'Créer un nouvel article de pression médiatique', 'Create an inject': 'Créer un stimuli', - 'Enable AI powered platform': "Activer la plateforme alimentée par l'IA", - 'Filigran Enterprise agreement': "Accord d'entreprise Filigran", - 'I have read and agree to the': "J'ai lu et j'accepte les", + 'Enable AI powered platform': 'Activer la plateforme alimentée par l\'IA', + 'Filigran Enterprise agreement': 'Accord d\'entreprise Filigran', + 'I have read and agree to the': 'J\'ai lu et j\'accepte les', 'OpenBASEE license terms': 'termes de la licence OpenBASEE', 'Kill Chain Phase': 'Kill chain d\'intrusion', - 'Ask AI': "Demander à l'IA", + 'Ask AI': 'Demander à l\'IA', 'Generate a message': 'Générer un message', 'Generate an article': 'Générer un article', 'Make it shorter': 'Raccourcir', 'Make it longer': 'Allonger', 'Change tone': 'Changer le ton', - Summarize: 'Résumer', - Explain: 'Expliquer', - Retry: 'Réessayer', + 'Summarize': 'Résumer', + 'Explain': 'Expliquer', + 'Retry': 'Réessayer', 'Select options': 'Sélectionner des options', - Tone: 'Ton', - Formal: 'Formel', - Informal: 'Informel', - Authoritative: 'Autoritaire', - Assertive: 'Assuré', - Bitter: 'Amer', - Arrogant: 'Arrogant', - Aggressive: 'Agressif', - Sarcastic: 'Sarcastique', + 'Tone': 'Ton', + 'Formal': 'Formel', + 'Informal': 'Informel', + 'Authoritative': 'Autoritaire', + 'Assertive': 'Assuré', + 'Bitter': 'Amer', + 'Arrogant': 'Arrogant', + 'Aggressive': 'Agressif', + 'Sarcastic': 'Sarcastique', 'Number of paragraphs': 'Nombre de paragraphes', - Context: 'Contexte', - Generate: 'Générer', - Tactical: 'Tactique', - Operational: 'Opérationnel', - Strategic: 'Stratégique', + 'Context': 'Contexte', + 'Generate': 'Générer', + 'Tactical': 'Tactique', + 'Operational': 'Opérationnel', + 'Strategic': 'Stratégique', 'Select an inject in the left panel': 'Sélectionner un stimuli dans le panneau de gauche', 'Inject content': 'Injecter le contenu', 'List view': 'Vue en liste', @@ -1100,41 +1100,41 @@ const i18n = { 'validations needed': 'validations nécessaires', 'Add tags': 'Ajouter des étiquettes', '24 hours': '24 heures', - 'Asset Groups': "Groupes d'actifs", - Values: 'Valeurs', + 'Asset Groups': 'Groupes d\'actifs', + 'Values': 'Valeurs', 'No available options': 'Aucune option disponible', - selected: 'sélectionné', + 'selected': 'sélectionné', 'Update objects': 'Mettre à jour les objets', - 'Action type': "Type d'action", - Replace: 'Remplacer', - Field: 'Champ', + 'Action type': 'Type d\'action', + 'Replace': 'Remplacer', + 'Field': 'Champ', 'Create a new payload': 'Créer une nouvelle charge utile', 'Windows Command Line': 'Ligne de commande Windows', 'Windows Powershell': 'Windows Powershell', 'Update the payload': 'Mettre à jour la charge utile', - Payloads: 'Charges utiles', + 'Payloads': 'Charges utiles', 'Do you want to duplicate this payload?': 'Voulez-vous dupliquer cette charge utile ?', 'Number of simulations': 'Nombre de simulations', - 'Performance Overview': "Vue d'ensemble des performances", + 'Performance Overview': 'Vue d\'ensemble des performances', 'Top simulation categories': 'Principales catégories de simulation', - 'Top attack patterns': "Principaux modèles d'attaque", + 'Top attack patterns': 'Principaux modèles d\'attaque', 'Last simulations': 'Dernières simulations', - Collectors: 'Collecteurs', + 'Collectors': 'Collecteurs', 'Updated at': 'Mis à jour à', - Executors: 'Exécuteurs', - Injectors: 'Injecteurs', - InjectorContracts: "Contrats d'injecteur", - 'Create a new injector contract': "Créer un nouveau contrat d'injecteur", + 'Executors': 'Exécuteurs', + 'Injectors': 'Injecteurs', + 'InjectorContracts': 'Contrats d\'injecteur', + 'Create a new injector contract': 'Créer un nouveau contrat d\'injecteur', 'SelectField the template': 'Sélectionner le modèle de champ', - 'Create the injector contract': "Créer le contrat d'injecteur", + 'Create the injector contract': 'Créer le contrat d\'injecteur', 'Read only': 'Lecture seule', 'Default value': 'Valeur par défaut', - 'Update the injector contract': "Mettre à jour le contrat d'injection", - 'Supporting adding new contracts': "Supporte l'ajout de nouveaux contrats", + 'Update the injector contract': 'Mettre à jour le contrat d\'injection', + 'Supporting adding new contracts': 'Supporte l\'ajout de nouveaux contrats', 'Create a new mitigation': 'Créer une nouvelle atténuation', - 'Update the mitigation': "Mettre à jour l'atténuation", + 'Update the mitigation': 'Mettre à jour l\'atténuation', 'Do you want to delete this mitigation?': 'Voulez-vous supprimer cette atténuation ?', - People: 'Personnes', + 'People': 'Personnes', 'Install simulation agents': 'Installer des agents de simulation', 'Modify the scheduling': 'Modifier la planification', 'Not scheduled': 'Non programmé', @@ -1149,107 +1149,107 @@ const i18n = { 'Endpoint Protection': 'Protection des points de terminaison', 'Web Filtering': 'Filtrage web', 'Incident Response': 'Réponse aux incidents', - 'Standard Operating Procedures': "Procédures d'exploitation standard", + 'Standard Operating Procedures': 'Procédures d\'exploitation standard', 'Crisis Communication': 'Communication de crise', 'Strategic Reaction': 'Réaction stratégique', - Low: 'Faible', - Medium: 'Moyen', - High: 'Élevé', - Critical: 'Critique', - scenarios: 'scénarios', + 'Low': 'Faible', + 'Medium': 'Moyen', + 'High': 'Élevé', + 'Critical': 'Critique', + 'scenarios': 'scénarios', 'Phase short name': 'Nom court de la phase', 'External Id': 'Id externe', - 'Disable Enterprise Edition': "Désactiver l'édition Enterprise", - Enterprise: 'Entreprise', - Community: 'Communauté', - 'AI Powered': "Alimenté par l'IA", + 'Disable Enterprise Edition': 'Désactiver l\'édition Enterprise', + 'Enterprise': 'Entreprise', + 'Community': 'Communauté', + 'AI Powered': 'Alimenté par l\'IA', 'Missing token': 'Jeton manquant', - RabbitMQ: 'RabbitMQ', - backlabel: 'étiquette de retour', - backuri: 'uri de retour', + 'RabbitMQ': 'RabbitMQ', + 'backlabel': 'étiquette de retour', + 'backuri': 'uri de retour', 'Injects Results': 'Résultats des stimulis', 'Import injects': 'Importer des stimulis', 'Browse the link': 'Parcourir le lien', - EE: 'EE', + 'EE': 'EE', 'Error or prevented': 'Erreur ou empêché', 'Attack Executed': 'Attaque exécutée', - Accept: 'Accepter', - YYYY: 'AAAA', + 'Accept': 'Accepter', + 'YYYY': 'AAAA', 'Copied to clipboard': 'Copié dans le presse-papiers', 'OpenBAS EE license terms': 'Conditions de licence OpenBAS EE', 'Main focus': 'Focus principal', 'All categories': 'Toutes les catégories', - 'Install Windows Agent': "Installer l'agent Windows", - 'Install Linux Agent': "Installer l'agent Linux", - 'Install MacOS Agent': "Installer l'agent MacOS", - 'Install Browser Agent': "Installer l'agent navigateur", + 'Install Windows Agent': 'Installer l\'agent Windows', + 'Install Linux Agent': 'Installer l\'agent Linux', + 'Install MacOS Agent': 'Installer l\'agent MacOS', + 'Install Browser Agent': 'Installer l\'agent navigateur', 'Install a simulation agent': 'Installer un agent de simulation', - 'To install the agent please follow the': "Pour installer l'agent, veuillez suivre le", - 'Step 1 - Install the agent': "Étape 1 - Installer l'agent", - 'Installing the agent is requiring local administrator privileges.': "L'installation de l'agent nécessite des privilèges d'administrateur local.", - 'You can whether directly copy and paste the following Powershell snippet in an elevated prompt or download the .ps1 script (and execute it as an administrator).': "Vous pouvez soit copier et coller directement l'extrait PowerShell suivant dans une invite de commandes élevée, soit télécharger le script .ps1 (et l'exécuter en tant qu'administrateur).", - 'You can whether directly copy and paste the following bash snippet in a root console or download the .sh script (and execute it as root).': "Vous pouvez soit copier et coller directement l'extrait bash suivant dans une console root, soit télécharger le script .sh (et l'exécuter en tant que root).", - 'For the moment, the following snippet or script will not add the agent at boot. Please be sure to add it in rc.local or other files to make it persistent. We will release proper packages in the near future.': "Pour le moment, l'extrait ou le script suivant n'ajoutera pas l'agent au démarrage. Veuillez l'ajouter dans rc.local ou dans d'autres fichiers pour le rendre persistant. Nous publierons des packages appropriés dans un avenir proche.", - 'The agent will never execute directly any payload.': "L'agent n'exécutera jamais directement de charge utile.", - 'You will need to add proper antivirus exclusions for this agent (to ensure Caldera injects execution to work properly). It may not be necessary in the future but this is generally a good practice to ensure the agent will be always available.': "Vous devrez ajouter des exclusions antivirus appropriées pour cet agent (pour garantir que l'exécution des injections par Caldera fonctionne correctement). Cela pourrait ne pas être nécessaire à l'avenir, mais c'est généralement une bonne pratique pour s'assurer que l'agent sera toujours disponible.", + 'To install the agent please follow the': 'Pour installer l\'agent, veuillez suivre le', + 'Step 1 - Install the agent': 'Étape 1 - Installer l\'agent', + 'Installing the agent is requiring local administrator privileges.': 'L\'installation de l\'agent nécessite des privilèges d\'administrateur local.', + 'You can whether directly copy and paste the following Powershell snippet in an elevated prompt or download the .ps1 script (and execute it as an administrator).': 'Vous pouvez soit copier et coller directement l\'extrait PowerShell suivant dans une invite de commandes élevée, soit télécharger le script .ps1 (et l\'exécuter en tant qu\'administrateur).', + 'You can whether directly copy and paste the following bash snippet in a root console or download the .sh script (and execute it as root).': 'Vous pouvez soit copier et coller directement l\'extrait bash suivant dans une console root, soit télécharger le script .sh (et l\'exécuter en tant que root).', + 'For the moment, the following snippet or script will not add the agent at boot. Please be sure to add it in rc.local or other files to make it persistent. We will release proper packages in the near future.': 'Pour le moment, l\'extrait ou le script suivant n\'ajoutera pas l\'agent au démarrage. Veuillez l\'ajouter dans rc.local ou dans d\'autres fichiers pour le rendre persistant. Nous publierons des packages appropriés dans un avenir proche.', + 'The agent will never execute directly any payload.': 'L\'agent n\'exécutera jamais directement de charge utile.', + 'You will need to add proper antivirus exclusions for this agent (to ensure Caldera injects execution to work properly). It may not be necessary in the future but this is generally a good practice to ensure the agent will be always available.': 'Vous devrez ajouter des exclusions antivirus appropriées pour cet agent (pour garantir que l\'exécution des injections par Caldera fonctionne correctement). Cela pourrait ne pas être nécessaire à l\'avenir, mais c\'est généralement une bonne pratique pour s\'assurer que l\'agent sera toujours disponible.', 'Step 2 - Add antivirus exclusions': 'Étape 2 - Ajouter des exclusions antivirus', - Linux: 'Linux', - Windows: 'Windows', - MacOS: 'MacOS', - OpenCTI: 'OpenCTI', - OpenBAS: 'OpenBAS', - OpenERM: 'OpenERM', - OpenMTD: 'OpenMTD', - Authorization: 'Autorisation', - English: 'Anglais', - French: 'Français', - Chinese: 'Chinois', - Chat: 'Discussion', - Source: 'Source', - Result: 'Résultat', + 'Linux': 'Linux', + 'Windows': 'Windows', + 'MacOS': 'MacOS', + 'OpenCTI': 'OpenCTI', + 'OpenBAS': 'OpenBAS', + 'OpenERM': 'OpenERM', + 'OpenMTD': 'OpenMTD', + 'Authorization': 'Autorisation', + 'English': 'Anglais', + 'French': 'Français', + 'Chinese': 'Chinois', + 'Chat': 'Discussion', + 'Source': 'Source', + 'Result': 'Résultat', 'Last execution date': 'Dernière date d\'exécution', - Configure: 'Configurer', + 'Configure': 'Configurer', 'Missing content': 'Contenu manquant', 'INJECT EXECUTED': 'STIMULI EXECUTE', 'Select the template': 'Sélectionnez le modèle', 'Supporting payloads': 'Charges utiles prises en charge', 'Command Line': 'Ligne de commande', 'Command Lines': 'Lignes de commande', - Executable: 'Exécutable', + 'Executable': 'Exécutable', 'File Drop': 'Dépôt de fichier', 'DNS Resolution': 'Résolution DNS', 'Network Traffic': 'Trafic réseau', 'Select the type': 'Sélectionnez le type', 'Create the payload': 'Créer la charge utile', 'Command executor': 'Exécuteur de commandes', - PowerShell: 'PowerShell', + 'PowerShell': 'PowerShell', 'Command Prompt': 'Invite de commandes', - Bash: 'Bash', - Sh: 'Sh', - Command: 'Commande', + 'Bash': 'Bash', + 'Sh': 'Sh', + 'Command': 'Commande', 'Executable file': 'Fichier exécutable', 'File to drop': 'Fichier à déposer', - 'One hostname by line': "Un nom d'hôte par ligne", - Arguments: 'Arguments', + 'One hostname by line': 'Un nom d\'hôte par ligne', + 'Arguments': 'Arguments', 'Default Value': 'Valeur par défaut', - Prerequisites: 'Prérequis', + 'Prerequisites': 'Prérequis', 'Get command': 'Obtenir la commande', 'Check command': 'Vérifier la commande', 'Cleanup executor': 'Exécuteur de nettoyage', 'Cleanup command': 'Commande de nettoyage', - Document: 'Document', + 'Document': 'Document', // Policies 'Platform login message': 'Messages de connexion', 'Platform consent message': 'Message de consentement à la plate-forme', 'Platform consent confirm text': 'Texte de confirmation du consentement à la plate-forme', - Write: 'Ecriture', + 'Write': 'Ecriture', // Timeline 'Hide timeline': 'Cacher la chronologie', 'Show Timeline': 'Afficher la chronologie', - COMMUNITY: 'Community', - FILIGRAN: 'Filigran', - VERIFIED: 'Verified', - UNVERIFIED: 'Unverified', + 'COMMUNITY': 'Community', + 'FILIGRAN': 'Filigran', + 'VERIFIED': 'Verified', + 'UNVERIFIED': 'Unverified', // ---Xls mapper 'Create a xls mapper': 'Créer un mapper xls', 'Mapper name': 'Nom du mapper', @@ -1271,7 +1271,7 @@ const i18n = { 'Trigger time': 'Heure de lancement', 'Attribute mapping configuration': 'Configuration d\'attribut de mapper', 'The imported file contains absolute dates (ex.: 9h30). A starting date must be provided for the Scenario to be build': 'Le fichier importé contient des dates absolues (ex.: 9h30). Une date de début doit être fournie pour que le scénario puisse être créé', - Test: 'Tester', + 'Test': 'Tester', 'Replay test': 'Rejouer le test', 'Delete test': 'Supprimer le test', 'Do you want to test this inject?': @@ -1285,73 +1285,73 @@ const i18n = { 'Only SMS and emails related injects will be tested': 'Uniquement les stimulis de types email et SMS seront testés', 'Do you want to delete this XLS mapper ?': 'Voulez-vous supprimer ce mappage XLS ?', 'Do you want to duplicate this XLS mapper :': 'Voulez-vous dupliquer ce mappage XLS :', - Expectation_name: 'Nom de l\'attendu', - Expectation_description: 'Description de l\'attendu', - Expectation_score: 'Score de l\'attendu', - ABSOLUTE_TIME_WITHOUT_START_DATE: 'L\'import contient des injects qui se déclenche à une certaine heure de la journée (ex: 9h30) mais le scenario n\'a pas de date de départ. Veuillez spécifier une date de départ.', - Trigger_time: 'Temps de déclenchement', + 'Expectation_name': 'Nom de l\'attendu', + 'Expectation_description': 'Description de l\'attendu', + 'Expectation_score': 'Score de l\'attendu', + 'ABSOLUTE_TIME_WITHOUT_START_DATE': 'L\'import contient des injects qui se déclenche à une certaine heure de la journée (ex: 9h30) mais le scenario n\'a pas de date de départ. Veuillez spécifier une date de départ.', + 'Trigger_time': 'Temps de déclenchement', 'This expression will be used to find a match in the specified column to determine the inject type. Regular Expressions can be used.': 'Cette expression est utilisé pour déterminer si il y a correspondance avec la colonne spécifié. L\'utilisation d\'expression régulière est possible.', 'By default we accept iso date (YYYY-MM-DDThh:mm:ss[.mmm]TZD), but you can specify your own date format in ISO notation (for instance DD.MM.YYYY hh\'h\'mm)': 'Par défaut nous acceptons la date iso (AAAA-MM-JJ hh:mm:ss[.mmm]TZD), mais vous pouvez spécifiez votre propre format de date en notation ISO (par exemple JJ.MM.AAAA hh\'h\'mm)', // -- Lessons -- 'Lessons learned': 'Expérience', 'Create a new lessons learned template': - "Créer un nouveau template de retour d'expérience", + 'Créer un nouveau template de retour d\'expérience', 'Update the lessons learned template': - "Modifier le template de retour d'expérience", + 'Modifier le template de retour d\'expérience', 'Do you want to delete this lessons learned template?': - "Souhaitez-vous supprimer ce template de retour d'expérience ?", + 'Souhaitez-vous supprimer ce template de retour d\'expérience ?', 'Create a new lessons learned category': - "Créer une catégorie de retour d'expérience", + 'Créer une catégorie de retour d\'expérience', 'Update the lessons learned category': - "Modifier une catégorie de retour d'expérience", + 'Modifier une catégorie de retour d\'expérience', 'Do you want to delete this lessons learned category?': - "Souhaitez-vous supprimer cette catégorie de retour d'expérience ?", + 'Souhaitez-vous supprimer cette catégorie de retour d\'expérience ?', 'Create a new lessons learned question': - "Créer une nouvelle question de retour d'expérience", + 'Créer une nouvelle question de retour d\'expérience', 'Update the lessons learned question': - "Modifier la question de retour d'expérience", + 'Modifier la question de retour d\'expérience', 'Do you want to delete this lessons learned question?': - "Souhaitez-vous supprimer cette question de retour d'expérience ?", - x86_64: 'x86_64', - arm64: 'arm64', + 'Souhaitez-vous supprimer cette question de retour d\'expérience ?', + 'x86_64': 'x86_64', + 'arm64': 'arm64', 'Invalid IP addresses': 'Adresses IP invalides', 'Invalid MAC addresses': 'Adresses MAC invalides', 'Create a new security platform': 'Créer une nouvelle plateforme de sécurité', - EDR: 'EDR', - XDR: 'XDR', - SIEM: 'SIEM', - SOAR: 'SOAR', - NDR: 'NDR', - ISPM: 'ISPM', + 'EDR': 'EDR', + 'XDR': 'XDR', + 'SIEM': 'SIEM', + 'SOAR': 'SOAR', + 'NDR': 'NDR', + 'ISPM': 'ISPM', 'Logo light': 'Logo clair', 'Logo dark': 'Logo sombre', 'Update the security platform': 'Mettre à jour la plateforme de sécurité', 'Security Platforms': 'Plateformes de sécurité', 'Content should not be empty': 'Le contenu ne doit pas être vide', - Timezone: 'Fuseau horaire', - Log: 'Journal', + 'Timezone': 'Fuseau horaire', + 'Log': 'Journal', 'Your file should be a XLS': 'Votre fichier doit être un XLS', - 'Launch import': "Lancer l'importation", + 'Launch import': 'Lancer l\'importation', 'Show timeline': 'Afficher la chronologie', 'Selected payload': 'Charge utile sélectionnée', - Prevention: 'Prévention', - 'Start date should be at least today': "La date de début doit être au moins aujourd'hui", + 'Prevention': 'Prévention', + 'Start date should be at least today': 'La date de début doit être au moins aujourd\'hui', 'Update the xls mapper': 'Mettre à jour le mappeur xls', 'Data ingestion': 'Ingestion de données', 'XLS mappers': 'Mappeurs XLS', 'Rule attributes columns': 'Colonnes des attributs de la règle', 'Testing XLS mapper': 'Test du mappeur XLS', - Policies: 'Politiques', + 'Policies': 'Politiques', 'Login messages': 'Messages de connexion', 'Export this list': 'Exporter cette liste', 'Should be a valid XLS file': 'Doit être un fichier XLS valide', - 'This file is not in the specified format': "Ce fichier n'est pas dans le format spécifié", + 'This file is not in the specified format': 'Ce fichier n\'est pas dans le format spécifié', 'This file is too large': 'Ce fichier est trop volumineux', 'Associated file': 'Fichier associé', 'Select your file': 'Sélectionnez votre fichier', 'Add document': 'Ajouter un document', - 'I have read and comply with the above statement': "J'ai lu et j'accepte la déclaration ci-dessus", - 'Date should be at least today': "La date doit être au moins aujourd'hui", + 'I have read and comply with the above statement': 'J\'ai lu et j\'accepte la déclaration ci-dessus', + 'Date should be at least today': 'La date doit être au moins aujourd\'hui', 'Security platform': 'Plateforme de sécurité', 'Security platforms': 'Plateformes de sécurité', 'Do you want to delete the security platform?': 'Voulez-vous supprimer cette plateforme de sécurité ?', @@ -1370,24 +1370,24 @@ const i18n = { 'Fit view': 'Ajuster la vue', 'Increase time interval': 'Augmenter l\'intervalle de temps', 'Reduce time interval': 'Réduire l\'intervalle de temps', - "Can't be tested": 'Ne peut pas être testé', + 'Can\'t be tested': 'Ne peut pas être testé', 'Simulation is currently unavailable or you do not have sufficient permissions to access it.': 'La simulation est actuellement indisponible ou vous n\'avez pas les autorisations nécessaires pour y accéder.', 'Scenario is currently unavailable or you do not have sufficient permissions to access it.': 'Le scenario est actuellement indisponible ou vous n\'avez pas les autorisations nécessaires pour y accéder.', 'New simulation successfully created and started. Click {here} to view the simulation.': 'Nouvelle simulation créée et démarrée avec succès. Cliquez {here} pour voir la simulation.', - here: 'ici', + 'here': 'ici', 'This scenario has never run, schedule or run it now!': 'Ce scénario n\'a jamais été exécuté, planifiez-le ou exécutez-le maintenant !', 'Something went wrong. Please refresh the page or try again later.': 'Une erreur s\'est produite. Veuillez actualiser la page ou réessayer plus tard.', 'Targeting Players only': 'Cibler uniquement les joueurs', 'Test Details': 'Détails du test', - Tests: 'Tests', - Warning: 'Avertissement', + 'Tests': 'Tests', + 'Warning': 'Avertissement', 'Launch simulation now': 'Lancer la simulation maintenant', 'Launch now': 'Lancer maintenant', 'All teams value': 'Valeur de toutes les équipes', - Parent: 'Parent', - Inject: 'Stimuli', - Condition: 'Condition', - Childrens: 'Enfants', + 'Parent': 'Parent', + 'Inject': 'Stimuli', + 'Condition': 'Condition', + 'Childrens': 'Enfants', 'Interactive view': 'Vue interactive', 'Execution successful': 'Exécution réussie', 'Internal error': 'Erreur interne', @@ -1395,19 +1395,19 @@ const i18n = { 'The element has been successfully deleted': 'L\'élément a été supprimé avec succès', 'No data to display': 'Aucune donnée à afficher', 'Add condition': 'Ajouter une condition', - is: 'est', - undefined: 'non défini', + 'is': 'est', + 'undefined': 'non défini', }, zh: { 'Email address': 'email地址', - Password: '密码', + 'Password': '密码', 'Password validation': '密码验证', 'Change your password': '修改密码', 'I forgot my password': '我忘记了密码', 'Send reset code': '发送重置代码', 'Enter code': '输入代码', 'Back to login': '返回登录', - Login: '登录', + 'Login': '登录', 'Sign in': '登录', 'Login with github': '使用github登录', 'You probably need a public email in your github account': @@ -1415,30 +1415,30 @@ const i18n = { 'Should be a valid email address': '应为有效邮件地址', 'Login with microsoft': '使用microsoft登录', 'Corporate login': '企业登录', - Continue: '继续', - Dashboard: '仪表盘', - Players: '选手', - Organizations: '组织', - Documents: '文档', - Integrations: '集成', - Settings: '设置', - Profile: '配置', - Logout: '登出', - Firstname: '名', - Lastname: '姓', - Organization: '组织', - Language: '语言', - Injects: '注入', - Messages: '信息', - Mails: '邮件', - Timeline: '时间轴', - Definition: '定义', - Results: '结果', - Channels: '频道', - Submit: '提交', - Country: '国家', - Flag: 'Flag', - Flags: 'Flag组', + 'Continue': '继续', + 'Dashboard': '仪表盘', + 'Players': '选手', + 'Organizations': '组织', + 'Documents': '文档', + 'Integrations': '集成', + 'Settings': '设置', + 'Profile': '配置', + 'Logout': '登出', + 'Firstname': '名', + 'Lastname': '姓', + 'Organization': '组织', + 'Language': '语言', + 'Injects': '注入', + 'Messages': '信息', + 'Mails': '邮件', + 'Timeline': '时间轴', + 'Definition': '定义', + 'Results': '结果', + 'Channels': '频道', + 'Submit': '提交', + 'Country': '国家', + 'Flag': 'Flag', + 'Flags': 'Flag组', 'Flag type': 'Flag类型', 'Flag is correct! It has been successfully submitted.': 'Flag正确!已成功提交.', @@ -1469,22 +1469,22 @@ const i18n = { 'You will not be able to change this setting later.': '你后续将无法更改此设定.', 'Search these results': '搜索这些结果', - Stop: '停止', - Name: '名称', - Subtitle: '小标题', - Notes: '笔记', + 'Stop': '停止', + 'Name': '名称', + 'Subtitle': '小标题', + 'Notes': '笔记', 'Please note that if you change the "Reply to" address, the email interaction functionality in the platform will be disabled.': '请注意,如果您更改了\'回复 \'地址,平台中的电子邮件互动功能将被禁用。', 'Start date': '开始日期', 'End date': '结束日期', - To: '收件人', - From: '发件人', + 'To': '收件人', + 'From': '发件人', 'Reply to': '回复', - Tags: '标签', - Reply: '答复', - newspaper: '报刊', - tv: '电视', - Anonymize: '匿名', - microblogging: '微博', + 'Tags': '标签', + 'Reply': '答复', + 'newspaper': '报刊', + 'tv': '电视', + 'Anonymize': '匿名', + 'microblogging': '微博', 'Targeted players': '目标选手', 'Inject details': '注入详情', 'Export injects': '导出注入', @@ -1518,10 +1518,10 @@ const i18n = { '不同时期的团队得分(以%表示)', 'Distribution of total score by inject type': '按注入类型的总分分布情况', - on: '关于', - Manual: '手动', + 'on': '关于', + 'Manual': '手动', 'Total score': '总分', - Parameters: '配置', + 'Parameters': '配置', 'Default theme': '默认主题', 'Default language': '默认语言', 'Background color': '背景颜色', @@ -1535,17 +1535,17 @@ const i18n = { 'Logo URL (login)': 'logo URL (登录)', 'Do you want to trigger this inject now?': '你想现在触发这个注入么 ?', - Administrator: '管理员', + 'Administrator': '管理员', 'Trigger now': '现在触发', - Automatic: '自动化', + 'Automatic': '自动化', 'Passwords do no match': '密码不匹配', 'Update the user password': '更新用户密码', 'Update password': '更新密码', 'Current password': '当前密码', 'New password': '新密码', - Security: '安全性', - Users: '用户', - Groups: '组', + 'Security': '安全性', + 'Users': '用户', + 'Groups': '组', 'Create a new group': '创建新组', 'Create a new tag': '创建新标签', 'Do you want to delete this tag?': '你想删除这个标签么?', @@ -1562,15 +1562,15 @@ const i18n = { 'Read/Write': '读/写', 'Read Only': '只读', 'Update the group': '更新组', - Value: '值', - Color: '颜色', - Cancel: '取消', - Back: '前一个', - Next: '下一个', - Create: '创建', - Launch: '启动', - Update: '更新', - Duplicate: '重复', + 'Value': '值', + 'Color': '颜色', + 'Cancel': '取消', + 'Back': '前一个', + 'Next': '下一个', + 'Create': '创建', + 'Launch': '启动', + 'Update': '更新', + 'Duplicate': '重复', 'Do you want to duplicate this scenario:': '你想复制这个场景么: ', 'Do you want to delete this scenario:': '你想删除这个场景么: ', 'Do you want to duplicate this simulation:': '你想复制这个模拟么 : ', @@ -1578,73 +1578,73 @@ const i18n = { 'Do you want to duplicate this atomic testing:': '你想复制这个自动测试么 : ', 'Do you want to delete this atomic testing:': '你想删除这个自动测试么: ', 'Do you want to duplicate this inject:': '你想删除这个注入么 : ', - Delete: '删除', - Edition: '版本', - Confirmation: '确认', - Search: '搜索', - Required: '必需', + 'Delete': '删除', + 'Edition': '版本', + 'Confirmation': '确认', + 'Search': '搜索', + 'Required': '必需', 'Technical targets': '技术目标', 'Platform name': '平台名称', 'Components version': '组件版本', 'Sent at': '发送至', 'Mails not read': '邮件未读', 'Total mails': '总计邮件', - Dark: '深色', - Light: '浅色', + 'Dark': '深色', + 'Light': '浅色', 'This field is required.': '该字段必填.', 'The element already exists': '元素已存在.', 'Manage the users of this group': '管理组内用户', 'Create a new document': '创建新文档', - Close: '关闭', + 'Close': '关闭', 'Export to XLS': '导出为XLS', 'Export to image': '导出为图片', 'Export to PDF': '导出为PDF', 'Export to CSV': '导出为CSV', - Copy: '复制', - Start: '开始', + 'Copy': '复制', + 'Start': '开始', 'Start now': '现在开始', - Status: '状态', - Information: '信息', - Control: '控制', - Scheduled: '已计划', - Finished: '已完成', - Execution: '执行', - Dryrun: '运行中', - Comcheck: '通信检查', - Send: '发送', - Remove: '移除', - Add: '添加', - Scenario: '场景', - Title: '标题', - Enabled: '启用', - Deleted: '已删除', - Disabled: '禁用', - Days: '天', - Hours: '小时', + 'Status': '状态', + 'Information': '信息', + 'Control': '控制', + 'Scheduled': '已计划', + 'Finished': '已完成', + 'Execution': '执行', + 'Dryrun': '运行中', + 'Comcheck': '通信检查', + 'Send': '发送', + 'Remove': '移除', + 'Add': '添加', + 'Scenario': '场景', + 'Title': '标题', + 'Enabled': '启用', + 'Deleted': '已删除', + 'Disabled': '禁用', + 'Days': '天', + 'Hours': '小时', 'Expiration time': '过期时间', - Minutes: '分钟', - Seconds: '秒', + 'Minutes': '分钟', + 'Seconds': '秒', 'Try the inject': '尝试注入', - File: '文件', - Simulations: '模拟组', - Simulation: '模拟', - Exercise: '练习', - Scenarios: '场景', - Severity: '严重性', - Platforms: '平台', - Detection: '检测', - Detections: '检测', - Asset: '资产', - Assets: '资产组', + 'File': '文件', + 'Simulations': '模拟组', + 'Simulation': '模拟', + 'Exercise': '练习', + 'Scenarios': '场景', + 'Severity': '严重性', + 'Platforms': '平台', + 'Detection': '检测', + 'Detections': '检测', + 'Asset': '资产', + 'Assets': '资产组', 'Dynamic assets': '动态资产', - Active: '激活', - Inactive: '未激活', - Persons: '人员', - Taxonomies: '分类法', + 'Active': '激活', + 'Inactive': '未激活', + 'Persons': '人员', + 'Taxonomies': '分类法', 'Attack patterns': '攻击模式', - AttackPatterns: '攻击模式', + 'AttackPatterns': '攻击模式', 'Kill chain phases': '杀伤链阶段', - KillChainPhases: '杀伤链阶段', + 'KillChainPhases': '杀伤链阶段', 'This field is mandatory': '该字段为必填字段', 'Remove from the context': '从内容中移除', 'Select a file': '选择一个文件', @@ -1708,8 +1708,8 @@ const i18n = { 'Add media pressure in this inject': '在此注入中加入媒体', 'Kill chain phase': '杀伤链阶段', - Created: '已创建', - Updated: '已更新', + 'Created': '已创建', + 'Updated': '已更新', 'External ID': '外部ID', 'Update the attack pattern': '更新攻击模式', 'Create a new attack pattern': '创建新攻击模式', @@ -1717,28 +1717,28 @@ const i18n = { 'Phase name': '阶段名称', 'Kill chain name': '杀伤链名称', 'Update the kill chain phase': '更新杀伤链阶段', - External: '外部', - openbas_email: 'Email', - openbas_ovh_sms: 'SMS (OVH)', - openbas_mastodon: 'Mastodon', - openbas_lade: 'Airbus LADE', - openbas_gnu_social: 'GNU Social', - openbas_twitter: 'Twitter', - openbas_http: 'HTTP', - openbas_manual: '手册 (提示)', - openbas_caldera: 'Caldera', - openbas_atomic_red_team: 'Atomic Red Team', - Subject: '邮件主题', - Body: '邮件正文', - Encrypted: '已加密', - Attachments: '附件', - Attachment: '附件', - Content: '内容', - Teams: '团队', - Version: '版本', + 'External': '外部', + 'openbas_email': 'Email', + 'openbas_ovh_sms': 'SMS (OVH)', + 'openbas_mastodon': 'Mastodon', + 'openbas_lade': 'Airbus LADE', + 'openbas_gnu_social': 'GNU Social', + 'openbas_twitter': 'Twitter', + 'openbas_http': 'HTTP', + 'openbas_manual': '手册 (提示)', + 'openbas_caldera': 'Caldera', + 'openbas_atomic_red_team': 'Atomic Red Team', + 'Subject': '邮件主题', + 'Body': '邮件正文', + 'Encrypted': '已加密', + 'Attachments': '附件', + 'Attachment': '附件', + 'Content': '内容', + 'Teams': '团队', + 'Version': '版本', 'Filigran support key': 'Filigran支持密钥', 'Remove Filigran logos': '移除Filigran logo', - Contextual: '背景', + 'Contextual': '背景', 'Send email': '发送邮件', 'Add documents in this media pressure': '将文档添加到媒体', @@ -1749,49 +1749,49 @@ const i18n = { 'Raw request data': '原始请求数据', 'Media pressure to publish': '要发布的媒体', 'Form request data': '申请表数据', - Key: '密钥', - Headers: '头部', - team: '团队', - attachment: '附件', + 'Key': '密钥', + 'Headers': '头部', + 'team': '团队', + 'attachment': '附件', 'Executed in': '已执行', 'Use basic authentication': '使用basic认证', 'Only in this context': '只有在这种情况下', - Medias: '媒体', - Tools: '工具', - Success: '成功', - m: 'm', - h: 'h', - d: 'd', + 'Medias': '媒体', + 'Tools': '工具', + 'Success': '成功', + 'm': 'm', + 'h': 'h', + 'd': 'd', 'Do you want to change the status of this simulation?': '你想要改变这个模拟状态么?', 'will be started, do you want to continue?': '将要开始,你想要继续么?', 'Injects will be paused, do you want to continue?': '注入将会暂停. 你想要继续么?', 'data will be reset, do you want to restart?': '数据将重置, 你想要继续么?', - Confirm: '确认', - Text: '文本', + 'Confirm': '确认', + 'Text': '文本', 'Sender email address': '发送者邮箱地址', 'Creation date': '创建日期', 'Next inject': '下个注入', 'Dangerous zone': '危险区域', 'Invalid user or password': '用户名或密码错误', - Default: '默认', - Mandatory: '必填', - Optional: '可选', - text: '文本', - textarea: '文本区域', - tuple: '元组', - checkbox: '复选框', + 'Default': '默认', + 'Mandatory': '必填', + 'Optional': '可选', + 'text': '文本', + 'textarea': '文本区域', + 'tuple': '元组', + 'checkbox': '复选框', 'Do you want to try this inject?': '你想要尝试这个注入么 ?', 'Do you want to launch this inject?': '你想要启动这个注入么?', 'The inject will only be sent to you.': '注入只会发送给你.', - Try: '尝试', - Disable: '禁用', - Enable: '启用', + 'Try': '尝试', + 'Disable': '禁用', + 'Enable': '启用', 'Mark as done': '标记已完成', 'Do you want to mark this inject as done?': '你想要标记这个注入已完成么 ?', - Mark: '标记', + 'Mark': '标记', 'Do you want to disable this inject?': '你想要禁用这个注入么 ?', 'Do you want to enable this inject?': @@ -1800,20 +1800,20 @@ const i18n = { '你想要禁用这个团队么?', 'Do you want to enable this team?': '你想要启用这个团队么 ?', - Trigger: '触发', + 'Trigger': '触发', 'Manual launch': '手动启动', 'Manage content': '管理内容', - Controls: '控制', - Planning: '计划', - Comchecks: '检查', - Dryruns: '运行', + 'Controls': '控制', + 'Planning': '计划', + 'Comchecks': '检查', + 'Dryruns': '运行', 'Messages header': '消息头', 'Messages footer': '消息页脚', 'Send a new comcheck': '发送新通信检查', 'Launch a new dryrun': '启动新运行', - Hello: '你好', - Statistics: '统计', - Reports: '报告', + 'Hello': '你好', + 'Statistics': '统计', + 'Reports': '报告', '[${exercise.name}] Communication check': '[${exercise.name}]通信检查', 'This is a communication check before the beginning of the simulation. Please click on the following link in order to confirm you successfully received this message: ${comcheck.url}.': @@ -1832,9 +1832,9 @@ const i18n = { 'There is nothing to see here...': '这里没有要看的了...', 'Send the lessons learned questionnaire': '发送经验教训调查问卷', - Comments: '评论', + 'Comments': '评论', 'Comment (optional)': '评论 (可选)', - "What didn't work well": '效果不佳的地方', + 'What didn\'t work well': '效果不佳的地方', 'What worked well': '效果较好地方', 'Answers : N/A': '没有答案', 'Global evaluation': '总体评价', @@ -1842,25 +1842,25 @@ const i18n = { '您对本问题的总体评价.', 'Do you want to submit your answers? You will not be able to change them later.': '提交你的回答么 ? 你将不能更改它们.', - Check: '检查', - Preview: '预览', - None: '无', - message: '消息', - Pending: '执行中', - State: '状态', + 'Check': '检查', + 'Preview': '预览', + 'None': '无', + 'message': '消息', + 'Pending': '执行中', + 'State': '状态', 'Sent date': '发送日期', 'Received date': '接收日期', 'Communication check': '通信检查', - Running: '运行中', - Failure: '失败', - Expired: '过期', + 'Running': '运行中', + 'Failure': '失败', + 'Expired': '过期', 'Expired after': '过期时间', - Anonymized: '匿名', + 'Anonymized': '匿名', 'No media pressure entry in this channel yet.': '这个频道中还没有媒体项.', 'Your communication check is': '你的通信检查是', - successful: '成功', - answers: '回答', + 'successful': '成功', + 'answers': '回答', 'of which': '其中', 'contain comments': '包含评论', 'Verification done at': '核查在', @@ -1875,8 +1875,8 @@ const i18n = { 'Update the poll': '更新投票', 'Simulation logs': '模拟日志', 'Poll replies': '投票回复', - Overview: '概览', - Objectives: '目标', + 'Overview': '概览', + 'Objectives': '目标', 'Create a new objective': '创建新目标', 'Update the objective': '更新目标', 'Do you want to delete this objective?': @@ -1886,10 +1886,10 @@ const i18n = { '你想要删除这个日志么?', 'Objective achievement evalution': '目标完成评估', - Evaluate: '评估', + 'Evaluate': '评估', 'My evaluation': '我的评估', - Priority: '优先级', - Polls: '投票', + 'Priority': '优先级', + 'Polls': '投票', 'Create a new poll': '创建新投票', 'Update the log': '更新日志', 'Create a new user': '创建新用户', @@ -1902,39 +1902,39 @@ const i18n = { 'An error occurred during PDF generation.': 'PDF 生成过程中发生错误。', 'Table of contents': '目录', - token: '令牌', - status: '状态', + 'token': '令牌', + 'status': '状态', 'Inject documents': '注入文档', 'Add documents': '添加文档', 'Add documents in this inject': '添加文档到这个注入', - Yes: '是', - No: '否', + 'Yes': '是', + 'No': '否', 'Not applicable': '不适用', 'Enable attachment': '启用附件', 'Disable attachment': '禁用附件', 'Do you want to remove the document from the element?': '你想要从元素移除文档么?', 'Import a simulation': '导入模拟', - Export: '导出', + 'Export': '导出', 'Export the simulation': '导出模拟', 'Export the scenario': '导出场景', 'Do you want to delete the scenario?': '你想要删除场景么?', 'A simulation will be launched based on this scenario and will start immediately. Are you sure you want to proceed?': '基于此场景的模拟将立即启动。您确定要继续吗?', 'Reset to default values': '恢复默认值', - Elements: '元素', + 'Elements': '元素', 'Scenario (including attached files)': '场景 (包含附件)', 'Send an email': '发送邮件', 'Send a SMS': '发送短信', 'To fill': '填写', - Username: '用户名', - Unknown: '未知', + 'Username': '用户名', + 'Unknown': '未知', 'No value': '无值', 'Primary color (dark)': '主要颜色(深色)', 'Secondary color (dark)': '次要颜色 (深色)', 'Primary color (light)': '主要颜色 (浅色)', 'Secondary color (light)': '次要颜色 (浅色)', - logo: 'Logo', + 'logo': 'Logo', 'Title only': '仅标题', 'logo-title': 'Logo标题', 'Dark theme': '深色主题', @@ -1952,9 +1952,9 @@ const i18n = { '你想要删除这个挑战么?', 'Create a new media pressure': '创建一个新媒体', 'Collaborative lessons learned': '合作获取的经验教训', - Answers: '回答', + 'Answers': '回答', 'Categories and questions': '分类和问题', - Questions: '问题', + 'Questions': '问题', 'Clear out': '空', 'Objective achievement evaluation': '目标完成评估', @@ -1973,19 +1973,19 @@ const i18n = { '你想要清空经验教训分类和问题么?', 'Do you want to reset lessons learned answers?': '你想要重置经验教训回答么 ?', - Reset: '重置', - Campaign: '活动', - Duration: '持续时间', + 'Reset': '重置', + 'Campaign': '活动', + 'Duration': '持续时间', 'Send the questionnaire': '发送调查问卷', 'Reset answers': '重置回答', - hours: '小时', - Apply: '应用', - players: '选手', - Explanation: '说明', - Category: '分类', + 'hours': '小时', + 'Apply': '应用', + 'players': '选手', + 'Explanation': '说明', + 'Category': '分类', 'Create a new challenge': '创建一个新挑战', - Channel: '频道', - Author: '作者', + 'Channel': '频道', + 'Author': '作者', 'Max number of attempts': '最大尝试数', 'Add documents in this challenge': '添加文档到这个挑战', 'At least one flag is required for a challenge.': @@ -2000,9 +2000,9 @@ const i18n = { '你想要从注入移除这个媒体么?', 'Do you want to remove this challenge from the inject?': '你想要从注入移除这个挑战么?', - VALUE: '值', - VALUE_CASE: '值 (区分大小写)', - REGEXP: '正则表达式', + 'VALUE': '值', + 'VALUE_CASE': '值 (区分大小写)', + 'REGEXP': '正则表达式', 'No category': '无分类', 'No challenge in this simulation yet.': '模拟中还没有挑战.', @@ -2027,21 +2027,21 @@ const i18n = { 'Inject expectations': '注入期望', 'Manual expectations': '手动期望', 'Expectations of ': '期望', - MANUAL: '手动', - ARTICLE: '自动 - 团队阅读文章后触发', - DETECTION: '自动 - 检测:处理注入时触发', - PREVENTION: '自动 - 预防:处理注入时触发', - TYPE_ARTICLE: '文章', - TYPE_CHALLENGE: '挑战', - TYPE_DETECTION: '检测', - TYPE_MANUAL: '手动', - TYPE_PREVENTION: '预防', - TYPE_HUMAN_RESPONSE: '人工响应', - FAILED: '失败', - VALIDATED: '验证', - Done: '完成', - Draft: '草稿 ', - Failed: '已失败', + 'MANUAL': '手动', + 'ARTICLE': '自动 - 团队阅读文章后触发', + 'DETECTION': '自动 - 检测:处理注入时触发', + 'PREVENTION': '自动 - 预防:处理注入时触发', + 'TYPE_ARTICLE': '文章', + 'TYPE_CHALLENGE': '挑战', + 'TYPE_DETECTION': '检测', + 'TYPE_MANUAL': '手动', + 'TYPE_PREVENTION': '预防', + 'TYPE_HUMAN_RESPONSE': '人工响应', + 'FAILED': '失败', + 'VALIDATED': '验证', + 'Done': '完成', + 'Draft': '草稿 ', + 'Failed': '已失败', 'This page is coming soon': '该页面即将推出', 'Pending result': '待定结果', 'Validation mode': '验证模式', @@ -2083,25 +2083,25 @@ const i18n = { '时间段注入类型分数', 'The animation team can validate the team reaction': '动作团队可以验证团队反应', - Description: '描述', + 'Description': '描述', 'No description': '无描述', 'Only injects with manual validation': '仅限使用手动验证的注入', 'Pending reading': '待读', 'Pending submission': '待提交', 'Pending validation': '待验证', - Validations: '验证', - Type: '类型', - Validate: '验证', - Validated: '已验证', - Error: '错误', + 'Validations': '验证', + 'Type': '类型', + 'Validate': '验证', + 'Validated': '已验证', + 'Error': '错误', 'This page is not found on this OpenBAS application.': 'OpenBAS应用程序中未找到该页.', 'You must be logged to access this page': '你必须登录后查看本页', // Challenges - Challenges: '挑战', + 'Challenges': '挑战', // Variables 'Available variables': '可用变量', - Variables: '变量', + 'Variables': '变量', 'Create a new variable': '创建新变量', 'Do you want to delete the variable ?': '你想要删除这个变量么?', 'Update the variable': '更新变量', @@ -2117,40 +2117,40 @@ const i18n = { 'Edit code': '编辑代码', 'Live code': '实时代码', 'Preview code': '预览代码', - Shares: '分享', - Likes: '类似', + 'Shares': '分享', + 'Likes': '类似', 'Read more': '阅读更多', 'JAVA Virtual Machine': 'JAVA虚拟机', 'Latest stable build': '最新稳定编译', 'API specifications': 'API说明', - Theme: '主题', + 'Theme': '主题', 'OpenBAS platform': 'OpenBAS平台', 'Enable Enterprise Edition': '启用企业版', - PostgreSQL: 'PostgreSQL', + 'PostgreSQL': 'PostgreSQL', 'Token key': '令牌密钥', - Example: '示例', - Score: '分数', + 'Example': '示例', + 'Score': '分数', 'Success score': '成功分数', - Scores: '分数', + 'Scores': '分数', 'Score must be greater than 0': '分数必须大于0', 'Score must be less than or equal to 100': '分数必须小于或等于100', - Message: '消息', + 'Message': '消息', 'New control': '新控制', 'Percent of reached score': '达到分数百分比', - Pause: '暂停', - Resume: '恢复', - injects: '注入', - Paused: '已暂停', - Canceled: '已取消', - Partial: '部分', + 'Pause': '暂停', + 'Resume': '恢复', + 'injects': '注入', + 'Paused': '已暂停', + 'Canceled': '已取消', + 'Partial': '部分', 'Quick inject definition': '快速注入定义', - Order: '订阅', - Details: '细节', - Team: '团队', - Template: '模板', - Questionnaire: '调查问卷', - User: '用户', - Modules: '模块', + 'Order': '订阅', + 'Details': '细节', + 'Team': '团队', + 'Template': '模板', + 'Questionnaire': '调查问卷', + 'User': '用户', + 'Modules': '模块', 'Access reports': '访问报告', 'General information': '通用信息', 'Do you want to delete this report ?': '您想删除此报告吗?', @@ -2168,27 +2168,27 @@ const i18n = { 'Lessons learned objectives': '经验教训目标', 'Lessons learned statistics': '经验教训统计', 'Lessons learned details': '经验教训详情', - Logos: 'Logo', - toggle: '切换', - Collapse: '折叠', - Animation: '动画', + 'Logos': 'Logo', + 'toggle': '切换', + 'Collapse': '折叠', + 'Animation': '动画', 'API access': 'API访问', - RENEW: '更新', - Granted: '已批准', - submitted: '已提交', - failed: '已失败', - Question: '问题', - By: '由', + 'RENEW': '更新', + 'Granted': '已批准', + 'submitted': '已提交', + 'failed': '已失败', + 'Question': '问题', + 'By': '由', 'Should not be empty': '不能为空', // Assets - Endpoints: '终端', - Rules: '规则', - Rule: '规则', + 'Endpoints': '终端', + 'Rules': '规则', + 'Rule': '规则', 'Teams of players': '选手团队', 'Create a new endpoint': '创建新终端', 'Update the endpoint': '更新终端', 'Do you want to delete the endpoint ?': '你想删除终端么?', - Hostname: '主机名', + 'Hostname': '主机名', 'Ip Addresses': 'IP地址组', 'Ip Address': 'IP地址', 'Ip Address {index}': 'IP地址 {index}', @@ -2198,7 +2198,7 @@ const i18n = { 'MAC Addresses': 'MAC地址', 'Please provide one MAC address per line.': '请每行提供一个MAC地址.', 'Invalid MAC address': 'Mac地址不正确', - Platform: '平台', + 'Platform': '平台', 'Collected by': '收集者', 'Targeted asets': '目标资产', 'Add assets': '添加资产', @@ -2207,8 +2207,8 @@ const i18n = { 'By default, only assets compliant with the injector are displayed': '默认情况下,只显示符合注入器要求的资产', // Asset groups 'Asset groups': '资产组', - AssetGroup: '资产组', - AssetGroups: '资产组', + 'AssetGroup': '资产组', + 'AssetGroups': '资产组', 'Filter allowing assets to be added dynamically to this group': '允许将资产动态添加到该组的过滤器', 'Create a new asset group': '创建一个新资产组', 'Update the asset group': '更新资产组', @@ -2220,118 +2220,118 @@ const i18n = { 'Add asset groups': '添加资产组', 'Add asset groups in this inject': '添加资产组到注入', 'Media pressure': '媒体', - Home: '主页', + 'Home': '主页', 'Atomic testings': '自动测试', - Components: '组件', - Skills: '技能', - Mitigations: '缓解', + 'Components': '组件', + 'Skills': '技能', + 'Mitigations': '缓解', 'Search the platform': '搜索平台', 'Advanced search': '高级搜索', - Notifications: '通知', + 'Notifications': '通知', 'Filigran eXtended Threat Management': 'Filigran扩展威胁管理', 'Platform connected': '平台已连接', 'Get OpenCTI now': '现在获取OpenCTI', 'Current platform': '当前平台', - Personas: '角色', + 'Personas': '角色', 'The country code and mobile phone number provided is invalid. Please provide a valid number': '所提供的国家代码和手机号码无效。请提供有效号码', - phone_number_tooltip: '电话号码应以加号 ( + )开头\n' + 'phone_number_tooltip': '电话号码应以加号 ( + )开头\n' + '它可以包含空格、连字符( - ) 或括号.\n', 'Instantiate a simulation': '实例化模拟', // -- FILTERS -- 'Add filter': '添加过滤器', 'Clear filters': '清除过滤器', - AND: '和', - OR: '或', + 'AND': '和', + 'OR': '或', // Asset Group - asset_group_name: '名称', - asset_group_description: '描述', - asset_group_tags: '标签', + 'asset_group_name': '名称', + 'asset_group_description': '描述', + 'asset_group_tags': '标签', // Endpoint - endpoint_hostname: '终端主机名', - endpoint_ips: 'IP地址', - endpoint_platform: '平台', - endpoint_arch: '架构', - endpoint_agent_version: 'agent版本', + 'endpoint_hostname': '终端主机名', + 'endpoint_ips': 'IP地址', + 'endpoint_platform': '平台', + 'endpoint_arch': '架构', + 'endpoint_agent_version': 'agent版本', // Inject - inject_kill_chain_phases: '杀伤链阶段', - inject_injector_contract: '注入器', - inject_platforms: '平台', - inject_tags: '标签', - inject_title: '标题', - inject_type: '类型', - inject_updated_at: '更新于', + 'inject_kill_chain_phases': '杀伤链阶段', + 'inject_injector_contract': '注入器', + 'inject_platforms': '平台', + 'inject_tags': '标签', + 'inject_title': '标题', + 'inject_type': '类型', + 'inject_updated_at': '更新于', // Injector Contract - injector_contract_kill_chain_phases: '杀伤链阶段', - injector_contract_injector: '注入器', - injector_contract_labels: '标签', - injector_contract_platforms: '平台', + 'injector_contract_kill_chain_phases': '杀伤链阶段', + 'injector_contract_injector': '注入器', + 'injector_contract_labels': '标签', + 'injector_contract_platforms': '平台', // Scenario - scenario_category: '类别', - scenario_kill_chain_phases: '杀伤链阶段', - scenario_name: '名称', - scenario_platforms: '平台', - scenario_recurrence: '重复性', - scenario_severity: '严重性', - scenario_tags: '标签', - scenario_updated_at: '更新于', + 'scenario_category': '类别', + 'scenario_kill_chain_phases': '杀伤链阶段', + 'scenario_name': '名称', + 'scenario_platforms': '平台', + 'scenario_recurrence': '重复性', + 'scenario_severity': '严重性', + 'scenario_tags': '标签', + 'scenario_updated_at': '更新于', // Exercise - exercise_kill_chain_phases: '杀伤链阶段', - exercise_name: '名称', - exercise_scenario: '场景', - exercise_status: '状态', - exercise_start_date: '开始日期', - exercise_tags: '标签', - exercise_updated_at: '更新于', + 'exercise_kill_chain_phases': '杀伤链阶段', + 'exercise_name': '名称', + 'exercise_scenario': '场景', + 'exercise_status': '状态', + 'exercise_start_date': '开始日期', + 'exercise_tags': '标签', + 'exercise_updated_at': '更新于', // Payload - payload_attack_patterns: '攻击模式', - payload_name: '名称', - payload_description: '描述', - payload_platforms: '平台', - payload_source: '来源', - payload_status: '状态', - payload_tags: '标签', - payload_updated_at: '更新于', + 'payload_attack_patterns': '攻击模式', + 'payload_name': '名称', + 'payload_description': '描述', + 'payload_platforms': '平台', + 'payload_source': '来源', + 'payload_status': '状态', + 'payload_tags': '标签', + 'payload_updated_at': '更新于', // Team - team_tags: '标签', + 'team_tags': '标签', // User - user_email: '电子邮件', - user_firstname: '名字', - user_lastname: '姓氏', - user_organization: '组织', - user_tags: '标签', + 'user_email': '电子邮件', + 'user_firstname': '名字', + 'user_lastname': '姓氏', + 'user_organization': '组织', + 'user_tags': '标签', - Recurrence: '重复', + 'Recurrence': '重复', 'Does not repeat': '不要重复', - Daily: '每日', - Weekly: '每周', - Monthly: '每月', + 'Daily': '每日', + 'Weekly': '每周', + 'Monthly': '每月', 'Set daily recurrence': '设置每日重复', 'Set weekly recurrence': '设置每周重复', 'Set monthly recurrence': '设置每月重复', 'Week of month': '月中的周', - First: '第一', - Second: '第二', - Third: '第三', - Fourth: '第四', + 'First': '第一', + 'Second': '第二', + 'Third': '第三', + 'Fourth': '第四', 'Day of week': '周中的日', - Monday: '星期一', - Tuesday: '星期二', - Wednesday: '星期三', - Thursday: '星期四', - Friday: '星期五', - Saturday: '星期六', - Sunday: '星期日', - Scheduling_time: '时间', - Save: '保存', + 'Monday': '星期一', + 'Tuesday': '星期二', + 'Wednesday': '星期三', + 'Thursday': '星期四', + 'Friday': '星期五', + 'Saturday': '星期六', + 'Sunday': '星期日', + 'Scheduling_time': '时间', + 'Save': '保存', 'Launch a simulation or start a recurring simuation from this scenario': '从该场景启动模拟或重复模拟', - recurrence_The: '这', - recurrence_at: '在', - recurrence_from: '从', - recurrence_to: '至', - recurrence_starting_from: '开始于', - recurrence_Last: '最后', + 'recurrence_The': '这', + 'recurrence_at': '在', + 'recurrence_from': '从', + 'recurrence_to': '至', + 'recurrence_starting_from': '开始于', + 'recurrence_Last': '最后', 'No scheduling': '无计划', - Scheduling: '计划中', + 'Scheduling': '计划中', 'End date need to be stricly after start date': '结束日期必须严格晚于开始日期', 'The time and start date do not match, as the time provided is either too close to the current moment or in the past': '时间和开始日期不匹配,因为所提供的时间要么太接近当前时刻,要么已经过去', 'Only weekday': '仅工作日', @@ -2356,18 +2356,18 @@ const i18n = { 'Update the atomic testing': '更新自动测试', 'Create a new atomic test': '创建新自动测试', 'Mitre Filter': 'Mitre过滤器', - techniques: '技术', + 'techniques': '技术', 'Unknown Data': '未知数据', 'No data available': '无可用数据', - Expectations: '目标', + 'Expectations': '目标', 'Execution logs': '目标日志', - Target: '目标', - Traces: '跟踪', + 'Target': '目标', + 'Traces': '跟踪', 'Tracking Sent Date': '跟踪发送日期', 'Tracking Ack Date': '跟踪响应日期', 'Tracking End Date': '跟踪结束日期', 'Tracking Total Execution': '跟踪总体执行情况', - Time: '时间', + 'Time': '时间', 'Tracking Total Count': '跟踪总计数', 'Tracking Total Error': '跟踪总错误', 'Tracking Total Success': '跟踪总成功', @@ -2387,38 +2387,38 @@ const i18n = { 'strategic-reaction': '战略行动', 'managed assets': '管理资产', 'Search by target name': '使用目标名搜索', - Contains: '包含', - contains: '包含', + 'Contains': '包含', + 'contains': '包含', 'Not contains': '不包含', 'not contains': '不包含', - Equals: '等于', - equals: '等于', + 'Equals': '等于', + 'equals': '等于', 'Not equals': '不等于', 'not equals': '不等于', 'Starts with': '开始于', 'starts with': '开始于', 'Not starts with': '不开始于', 'not starts with': '不开始于', - Empty: '空', + 'Empty': '空', 'is empty': '为空', 'Not empty': '不为空', 'is not empty': '不为空', - and: '和', - Agents: 'Agent', + 'and': '和', + 'Agents': 'Agent', 'Learn more information about how to setup simulation agents': '了解更多如何设置模拟agent', 'in the documentation': '参见文档', 'Installation path': '安装路径', - Architecture: '架构', - AMD64: 'AMD64', - ARM64: 'ARM64', - Download: '下载', - documentation: '文档', + 'Architecture': '架构', + 'AMD64': 'AMD64', + 'ARM64': 'ARM64', + 'Download': '下载', + 'documentation': '文档', 'IP Addresses': 'IP地址', 'Kill Chain Phases': '杀伤链阶段', 'Attack Patterns': '攻击模式', - Targets: '目标', + 'Targets': '目标', 'Results by target': '目标结果', - Configuration: '配置', + 'Configuration': '配置', 'No logs available': '无可用日志', 'Add documents in this media pressure article': '添加文档到媒体文章', 'Update the media pressure article': '更新媒体文章', @@ -2436,25 +2436,25 @@ const i18n = { 'Make it shorter': '变得简介', 'Make it longer': '变得更长', 'Change tone': '改变语气', - Summarize: '总结', - Explain: '解释', - Retry: '重试', + 'Summarize': '总结', + 'Explain': '解释', + 'Retry': '重试', 'Select options': '选择选项', - Tone: '语气', - Formal: '正式', - Informal: '非正式', - Authoritative: '权威', - Assertive: '自信', - Bitter: '痛苦', - Arrogant: '傲慢', - Aggressive: '强势', - Sarcastic: '讽刺', + 'Tone': '语气', + 'Formal': '正式', + 'Informal': '非正式', + 'Authoritative': '权威', + 'Assertive': '自信', + 'Bitter': '痛苦', + 'Arrogant': '傲慢', + 'Aggressive': '强势', + 'Sarcastic': '讽刺', 'Number of paragraphs': '段落数', - Context: '背景', - Generate: '生成', - Tactical: '战术', - Operational: '运营', - Strategic: '战略', + 'Context': '背景', + 'Generate': '生成', + 'Tactical': '战术', + 'Operational': '运营', + 'Strategic': '战略', 'Select an inject in the left panel': '在左侧面板中选择注入', 'Inject content': '注入内容', 'List view': '列表视图', @@ -2464,28 +2464,28 @@ const i18n = { 'Add tags': '添加标签', '24 hours': '24小时', 'Asset Groups': '资产组', - Values: '值', + 'Values': '值', 'No available options': '无可用选项', - selected: '已选择', + 'selected': '已选择', 'Update objects': '更新对象', 'Action type': '行动类型', - Replace: '替换', - Field: '字段', + 'Replace': '替换', + 'Field': '字段', 'Create a new payload': '创建新载荷', 'Windows Command Line': 'Windows命令行', 'Windows Powershell': 'Windows Powershell', 'Update the payload': '更新载荷', - Payloads: '载荷', + 'Payloads': '载荷', 'Number of simulations': '模拟数量', 'Performance Overview': '性能概述', 'Top simulation categories': '热门模拟类别', 'Top attack patterns': '热门攻击模式', 'Last simulations': '最后模拟', - Collectors: '收集器', + 'Collectors': '收集器', 'Updated at': '更新于', - Executors: '执行者', - Injectors: '注入者', - InjectorContracts: '注入者合约', + 'Executors': '执行者', + 'Injectors': '注入者', + 'InjectorContracts': '注入者合约', 'Create a new injector contract': '创建新注入者合约', 'SelectField the template': '选择字段模板', 'Create the injector contract': '创建注入者合约', @@ -2495,7 +2495,7 @@ const i18n = { 'Supporting adding new contracts': '支持添加新合约', 'Create a new mitigation': '创建新缓解', 'Update the mitigation': '更新缓解', - People: '人', + 'People': '人', 'Install simulation agents': '安装模拟agent', 'Modify the scheduling': '更改计划', 'Not scheduled': '未计划', @@ -2513,29 +2513,29 @@ const i18n = { 'Standard Operating Procedures': '标准处理流程', 'Crisis Communication': '危机沟通', 'Strategic Reaction': '战略响应', - Low: '低', - Medium: '中', - High: '高', - Critical: '严重', - scenarios: '场景', + 'Low': '低', + 'Medium': '中', + 'High': '高', + 'Critical': '严重', + 'scenarios': '场景', 'Phase short name': '阶段简称', 'External Id': '外部ID', 'Disable Enterprise Edition': '禁用企业模式', - Enterprise: '企业版', - Community: '社区版', + 'Enterprise': '企业版', + 'Community': '社区版', 'AI Powered': 'AI增强', 'Missing token': '缺少令牌', - RabbitMQ: 'RabbitMQ', - backlabel: '后台标签', - backuri: '后台URI', + 'RabbitMQ': 'RabbitMQ', + 'backlabel': '后台标签', + 'backuri': '后台URI', 'Injects Results': '注入结果', 'Import injects': '导入注入', 'Browse the link': '浏览链接', - EE: 'EE', + 'EE': 'EE', 'Error or prevented': '错误或阻止', 'Attack Executed': '攻击已执行', - Accept: '接受', - YYYY: 'YYYY', + 'Accept': '接受', + 'YYYY': 'YYYY', 'Copied to clipboard': '复制到剪贴板', 'OpenBAS EE license terms': 'OpenBAS EE许可协议', 'Main focus': '重点', @@ -2546,63 +2546,63 @@ const i18n = { 'Install Browser Agent': '安装浏览器Agent', 'Install a simulation agent': '安装模拟Agent', 'To install the agent please follow the': '要安装Agent请参考', - Linux: 'Linux', - Windows: 'Windows', - MacOS: 'MacOS', - OpenCTI: 'OpenCTI', - OpenBAS: 'OpenBAS', - OpenERM: 'OpenERM', - OpenMTD: 'OpenMTD', - Authorization: '授权', - English: '英语', - French: '法语', - Chinese: '中国人', - Chat: '聊天', - Source: '来源', - Result: '结果', + 'Linux': 'Linux', + 'Windows': 'Windows', + 'MacOS': 'MacOS', + 'OpenCTI': 'OpenCTI', + 'OpenBAS': 'OpenBAS', + 'OpenERM': 'OpenERM', + 'OpenMTD': 'OpenMTD', + 'Authorization': '授权', + 'English': '英语', + 'French': '法语', + 'Chinese': '中国人', + 'Chat': '聊天', + 'Source': '来源', + 'Result': '结果', 'Last execution date': '最后执行日期', - Configure: '配置', + 'Configure': '配置', 'Missing content': '缺少内容', 'INJECT EXECUTED': '注入已执行', 'Select the template': '选择模板', 'Supporting payloads': '支持载荷', 'Command Line': '命令行', 'Command Lines': '命令行', - Executable: '可执行', + 'Executable': '可执行', 'File Drop': '文件投放', 'DNS Resolution': 'DNS解析', 'Network Traffic': '网络流量', 'Select the type': '选择类型', 'Create the payload': '创建载荷', 'Command executor': '命令执行器', - PowerShell: 'PowerShell', + 'PowerShell': 'PowerShell', 'Command Prompt': '命令提示符', - Bash: 'Bash', - Sh: 'Sh', - Command: '命令', + 'Bash': 'Bash', + 'Sh': 'Sh', + 'Command': '命令', 'Executable file': '可执行文件', 'File to drop': '要投放文件', 'One hostname by line': '每行一个主机名', - Arguments: '参数', + 'Arguments': '参数', 'Default Value': '默认值', - Prerequisites: '前提条件', + 'Prerequisites': '前提条件', 'Get command': '获取命令', 'Check command': '检查命令', 'Cleanup executor': '清理执行器', 'Cleanup command': '清理命令', - Document: '文档', + 'Document': '文档', // Policies 'Platform login message': '平台登录信息', 'Platform consent message': '平台许可信息', 'Platform consent confirm text': '平台许可确认文本', - Write: '写', + 'Write': '写', // Timeline 'Hide timeline': '隐藏时间线', 'Show Timeline': '显示时间线', - COMMUNITY: '社区', - FILIGRAN: 'Filigran', - VERIFIED: '已验证', - UNVERIFIED: '未验证', + 'COMMUNITY': '社区', + 'FILIGRAN': 'Filigran', + 'VERIFIED': '已验证', + 'UNVERIFIED': '未验证', // ---Xls mapper 'Create a xls mapper': '创建xls映射', 'Mapper name': '映射名称', @@ -2623,14 +2623,14 @@ const i18n = { 'Do you want to delete this representation?': '你想要删除这个代表么?', 'Trigger time': '触发器时间', 'Attribute mapping configuration': '属性映射配置', - Test: '测试', + 'Test': '测试', 'Do you want to delete this XLS mapper ?': '你想要删除 XLS映射么 ?', 'Do you want to duplicate this XLS mapper :': '您想复制此 XLS 映射器吗:', - Expectation_name: '期望名称', - Expectation_description: '期望描述', - Expectation_score: '期望分数', - ABSOLUTE_TIME_WITHOUT_START_DATE: '导入内容包含在一天中的某个时间(如上午 9:30)触发的注入,但方案没有开始日期。请指定开始日期.', - Trigger_time: '触发器时间', + 'Expectation_name': '期望名称', + 'Expectation_description': '期望描述', + 'Expectation_score': '期望分数', + 'ABSOLUTE_TIME_WITHOUT_START_DATE': '导入内容包含在一天中的某个时间(如上午 9:30)触发的注入,但方案没有开始日期。请指定开始日期.', + 'Trigger_time': '触发器时间', 'This expression will be used to find a match in the specified column to determine the inject type. Regular Expressions can be used.': '该表达式将用于在指定列中查找匹配项,以确定注入类型。可使用正则表达式.', 'By default we accept iso date (YYYY-MM-DDThh:mm:ss[.mmm]TZD), but you can specify your own date format in ISO notation (for instance DD.MM.YYYY hh\'h\'mm)': '默认情况下,我们接受 ISO 日期(YYYY-MM-DDThh:mm:ss[.mmmm]TZD),但您也可以指定自己的 ISO 日期格式(例如 DD.MM.YYYY hh\'h\'mm)', // -- Lessons -- @@ -2653,36 +2653,36 @@ const i18n = { '更新经验教训问题', 'Do you want to delete this lessons learned question?': '你想要删除这个经验教训问题么?', - x86_64: 'x86_64', - arm64: 'arm64', + 'x86_64': 'x86_64', + 'arm64': 'arm64', 'Invalid IP addresses': '无效IP地址', 'Invalid MAC addresses': '无效MAC地址', 'Create a new security platform': '创建一个新的安全平台', - EDR: 'EDR', - XDR: 'XDR', - SIEM: 'SIEM', - SOAR: 'SOAR', - NDR: 'NDR', - ISPM: 'ISPM', + 'EDR': 'EDR', + 'XDR': 'XDR', + 'SIEM': 'SIEM', + 'SOAR': 'SOAR', + 'NDR': 'NDR', + 'ISPM': 'ISPM', 'Logo light': '浅色Logo', 'Logo dark': '深色Logo', 'Update the security platform': '更新安全平台', 'Security Platforms': '安全平台', 'Content should not be empty': '内容不可为空', - Timezone: '时区', - Log: '日志', + 'Timezone': '时区', + 'Log': '日志', 'Your file should be a XLS': '你的文件应该为XLS', 'Launch import': '启动导入', 'Show timeline': '显示时间线', 'Selected payload': '已选择载荷', - Prevention: '防止', + 'Prevention': '防止', 'Start date should be at least today': '开始日期至少是今天', 'Update the xls mapper': '更新XLS映射', 'Data ingestion': '数据获取', 'XLS mappers': 'XLS映射', 'Rule attributes columns': '规则属性列', 'Testing XLS mapper': '测试XLS映射策略', - Policies: '策略', + 'Policies': '策略', 'Login messages': '登录消息', 'Export this list': '导入这个列表', 'Should be a valid XLS file': '应为有效XLS文件', @@ -2705,7 +2705,7 @@ const i18n = { 'Simulation is currently unavailable or you do not have sufficient permissions to access it.': '模拟当前不可用,或您没有足够的权限进行访问。', 'Scenario is currently unavailable or you do not have sufficient permissions to access it.': '"场景当前不可用,或您没有足够的权限进行访问。', 'New simulation successfully created and started. Click {here} to view the simulation.': '新模拟已成功创建并启动。点击{here}查看模拟。', - here: '此处', + 'here': '此处', 'This scenario has never run, schedule or run it now!': '此场景从未运行,立即安排或运行它吧!', 'Something went wrong. Please refresh the page or try again later.': '发生错误。请刷新页面或稍后再试。', 'Unknown result': '未知结果', @@ -2720,17 +2720,17 @@ const i18n = { 'Replay test': '重放测试', 'Delete test': '删除测试', 'Replay all tests': '重放所有测试', - Tests: '测试', - Warning: '警告', + 'Tests': '测试', + 'Warning': '警告', 'Launch simulation now': '立即启动模拟', 'Launch now': '立即启动', 'All teams value': '所有团队的值', 'The score set for the team will also be applied to all players in the team': '为团队设置的分数也将应用于团队中的所有玩家', - Player: '玩家', - Parent: '父母', - Inject: '父母', - Condition: '条件', - Childrens: '儿童', + 'Player': '玩家', + 'Parent': '父母', + 'Inject': '父母', + 'Condition': '条件', + 'Childrens': '儿童', 'Interactive view': '交互式视图', 'Execution successful': '执行成功', 'The element has been successfully updated': '元素已成功更新', @@ -2738,129 +2738,129 @@ const i18n = { 'Internal error': '内部错误 ', 'No data to display': '没有可显示的数据', 'Add condition': '添加条件', - is: '是', - undefined: '未定义', + 'is': '是', + 'undefined': '未定义', }, en: { - openbas_email: 'Email', - openbas_ovh_sms: 'SMS (OVH)', - openbas_mastodon: 'Mastodon', - openbas_manual: 'Manual (reminder)', - openbas_caldera: 'Caldera', - openbas_lade: 'Airbus LADE', - openbas_gnu_social: 'GNU Social', - openbas_twitter: 'Twitter', - openbas_http: 'HTTP Request', - openbas_atomic_red_team: 'Atomic Red Team', - Subject: 'Email subject', - Body: 'Email body', - Encrypted: 'Encrypt this email', - Attachments: 'Attachments', - team: 'Team', - text: 'Text fields', - textarea: 'Text area', - tuple: 'Key value pair', - checkbox: 'Checkbox', - attachment: 'Document', - message: 'Message', - token: 'Account token', - status: 'Status', - Running: 'On-going', - newspaper: 'Newspaper', - tv: 'TV channel', - microblogging: 'Microblogging', - logo: 'Logo only', + 'openbas_email': 'Email', + 'openbas_ovh_sms': 'SMS (OVH)', + 'openbas_mastodon': 'Mastodon', + 'openbas_manual': 'Manual (reminder)', + 'openbas_caldera': 'Caldera', + 'openbas_lade': 'Airbus LADE', + 'openbas_gnu_social': 'GNU Social', + 'openbas_twitter': 'Twitter', + 'openbas_http': 'HTTP Request', + 'openbas_atomic_red_team': 'Atomic Red Team', + 'Subject': 'Email subject', + 'Body': 'Email body', + 'Encrypted': 'Encrypt this email', + 'Attachments': 'Attachments', + 'team': 'Team', + 'text': 'Text fields', + 'textarea': 'Text area', + 'tuple': 'Key value pair', + 'checkbox': 'Checkbox', + 'attachment': 'Document', + 'message': 'Message', + 'token': 'Account token', + 'status': 'Status', + 'Running': 'On-going', + 'newspaper': 'Newspaper', + 'tv': 'TV channel', + 'microblogging': 'Microblogging', + 'logo': 'Logo only', 'logo-title': 'Logo and title', - VALUE: 'Text', - VALUE_CASE: 'Text (case-sensitive)', - REGEXP: 'Regular expression', + 'VALUE': 'Text', + 'VALUE_CASE': 'Text (case-sensitive)', + 'REGEXP': 'Regular expression', '-': 'None', - MANUAL: 'Manual', - ARTICLE: 'Automatic - Triggered when target reads the articles', - DETECTION: 'Automatic - Detection: Triggered when inject is processed', - PREVENTION: 'Automatic - Prevention: Triggered when inject is processed', - TYPE_ARTICLE: 'Article', - TYPE_CHALLENGE: 'Challenge', - TYPE_DETECTION: 'Detection', - TYPE_MANUAL: 'Manual', - TYPE_PREVENTION: 'Prevention', - TYPE_HUMAN_RESPONSE: 'Human response', - FAILED: 'Failed', - VALIDATED: 'Validated', + 'MANUAL': 'Manual', + 'ARTICLE': 'Automatic - Triggered when target reads the articles', + 'DETECTION': 'Automatic - Detection: Triggered when inject is processed', + 'PREVENTION': 'Automatic - Prevention: Triggered when inject is processed', + 'TYPE_ARTICLE': 'Article', + 'TYPE_CHALLENGE': 'Challenge', + 'TYPE_DETECTION': 'Detection', + 'TYPE_MANUAL': 'Manual', + 'TYPE_PREVENTION': 'Prevention', + 'TYPE_HUMAN_RESPONSE': 'Human response', + 'FAILED': 'Failed', + 'VALIDATED': 'Validated', 'Ip Address': 'Ip Address', 'Ip Address {index}': 'Ip Address {index}', - phone_number_tooltip: 'Phone number should start with a plus sign ( + )\n' + 'phone_number_tooltip': 'Phone number should start with a plus sign ( + )\n' + 'It may contain white spaces or hyphens ( – ) or parenthesis.\n', - Exercise: 'Simulation', - Scheduling_time: 'Time', + 'Exercise': 'Simulation', + 'Scheduling_time': 'Time', // -- FILTERS -- // Asset - asset_tags: 'Tags', + 'asset_tags': 'Tags', // Asset Group - asset_group_name: 'Name', - asset_group_description: 'Description', - asset_group_tags: 'Tags', + 'asset_group_name': 'Name', + 'asset_group_description': 'Description', + 'asset_group_tags': 'Tags', // Endpoint - endpoint_hostname: 'Hostname', - endpoint_ips: 'IP addresses', - endpoint_platform: 'Platform', - endpoint_arch: 'Architecture', - endpoint_agent_version: 'Agent version', + 'endpoint_hostname': 'Hostname', + 'endpoint_ips': 'IP addresses', + 'endpoint_platform': 'Platform', + 'endpoint_arch': 'Architecture', + 'endpoint_agent_version': 'Agent version', // Inject - inject_kill_chain_phases: 'Kill chain phase', - inject_injector_contract: 'Injector', - inject_platforms: 'Platforms', - inject_tags: 'Tags', - inject_title: 'Title', - inject_type: 'Type', - inject_updated_at: 'Updated at', + 'inject_kill_chain_phases': 'Kill chain phase', + 'inject_injector_contract': 'Injector', + 'inject_platforms': 'Platforms', + 'inject_tags': 'Tags', + 'inject_title': 'Title', + 'inject_type': 'Type', + 'inject_updated_at': 'Updated at', // Injector Contract - injector_contract_kill_chain_phases: 'Kill chain phase', - injector_contract_injector: 'Injector', - injector_contract_labels: 'Label', - injector_contract_platforms: 'Platforms', - injector_contract_arch: 'Architecture', + 'injector_contract_kill_chain_phases': 'Kill chain phase', + 'injector_contract_injector': 'Injector', + 'injector_contract_labels': 'Label', + 'injector_contract_platforms': 'Platforms', + 'injector_contract_arch': 'Architecture', // Scenario - scenario_category: 'Category', - scenario_kill_chain_phases: 'Kill chain phase', - scenario_name: 'Name', - scenario_platforms: 'Platforms', - scenario_recurrence: 'Recurrence', - scenario_severity: 'Severity', - scenario_tags: 'Tags', - scenario_updated_at: 'Updated at', + 'scenario_category': 'Category', + 'scenario_kill_chain_phases': 'Kill chain phase', + 'scenario_name': 'Name', + 'scenario_platforms': 'Platforms', + 'scenario_recurrence': 'Recurrence', + 'scenario_severity': 'Severity', + 'scenario_tags': 'Tags', + 'scenario_updated_at': 'Updated at', // Exercise - exercise_kill_chain_phases: 'Kill chain phase', - exercise_name: 'Name', - exercise_scenario: 'Scenario', - exercise_status: 'Status', - exercise_start_date: 'Start date', - exercise_tags: 'Tags', - exercise_updated_at: 'Updated at', + 'exercise_kill_chain_phases': 'Kill chain phase', + 'exercise_name': 'Name', + 'exercise_scenario': 'Scenario', + 'exercise_status': 'Status', + 'exercise_start_date': 'Start date', + 'exercise_tags': 'Tags', + 'exercise_updated_at': 'Updated at', // Payload - payload_attack_patterns: 'Attack patterns', - payload_name: 'Name', - payload_description: 'Description', - payload_platforms: 'Platforms', - payload_source: 'Source', - payload_status: 'Status', - payload_tags: 'Tags', - payload_updated_at: 'Updated', - executable_arch: 'Architecture', + 'payload_attack_patterns': 'Attack patterns', + 'payload_name': 'Name', + 'payload_description': 'Description', + 'payload_platforms': 'Platforms', + 'payload_source': 'Source', + 'payload_status': 'Status', + 'payload_tags': 'Tags', + 'payload_updated_at': 'Updated', + 'executable_arch': 'Architecture', // Team - team_tags: 'Tags', + 'team_tags': 'Tags', // User - user_email: 'Email', - user_firstname: 'Firstname', - user_lastname: 'Lastname', - user_organization: 'Organization', - user_tags: 'Tags', - recurrence_The: 'The', - recurrence_at: 'at', - recurrence_from: 'from', - recurrence_to: 'to', - recurrence_starting_from: 'starting from', - recurrence_Last: 'Last', + 'user_email': 'Email', + 'user_firstname': 'Firstname', + 'user_lastname': 'Lastname', + 'user_organization': 'Organization', + 'user_tags': 'Tags', + 'recurrence_The': 'The', + 'recurrence_at': 'at', + 'recurrence_from': 'from', + 'recurrence_to': 'to', + 'recurrence_starting_from': 'starting from', + 'recurrence_Last': 'Last', 'global-crisis': 'Global Crisis', 'attack-scenario': 'Attack Scenario', 'media-pressure': 'Media Pressure', @@ -2875,16 +2875,16 @@ const i18n = { 'standard-operating-procedure': 'Standard Operating Procedures', 'crisis-communication': 'Crisis Communication', 'strategic-reaction': 'Strategic Reaction', - COMMUNITY: 'Community', - FILIGRAN: 'Filigran', - VERIFIED: 'Verified', - UNVERIFIED: 'Unverified', + 'COMMUNITY': 'Community', + 'FILIGRAN': 'Filigran', + 'VERIFIED': 'Verified', + 'UNVERIFIED': 'Unverified', // - XLS Mapper - Expectation_name: 'Expectation name', - Expectation_description: 'Expectation description', - Expectation_score: 'Expectation score', - Trigger_time: 'Trigger time', - ABSOLUTE_TIME_WITHOUT_START_DATE: 'Your import contains injects triggered only with the time of the day (e.g.: 9:30) but there is no launch date specified for this scenario. Please specify a launch date for this scenario.', + 'Expectation_name': 'Expectation name', + 'Expectation_description': 'Expectation description', + 'Expectation_score': 'Expectation score', + 'Trigger_time': 'Trigger time', + 'ABSOLUTE_TIME_WITHOUT_START_DATE': 'Your import contains injects triggered only with the time of the day (e.g.: 9:30) but there is no launch date specified for this scenario. Please specify a launch date for this scenario.', // Bulk actions 'Do you want to delete these {count} injects?': 'Do you want to delete these {count} injects?', 'Do you want to test these {count} injects?': diff --git a/openbas-front/src/utils/Option.ts b/openbas-front/src/utils/Option.ts index 2e693f6bf6..a149d74ddd 100644 --- a/openbas-front/src/utils/Option.ts +++ b/openbas-front/src/utils/Option.ts @@ -1,14 +1,15 @@ import * as R from 'ramda'; + import countriesJson from '../static/geo/countries.json'; -import type { AttackPattern, Exercise, KillChainPhase, Organization, Scenario, Tag, Document } from './api-types'; +import type { AttackPattern, Document, Exercise, KillChainPhase, Organization, Scenario, Tag } from './api-types'; interface Countries { features: [{ properties: { - ISO3: string, - NAME: string, - } - }] + ISO3: string; + NAME: string; + }; + }]; } // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -24,10 +25,10 @@ export const documentOptions = ( document_ids: string[] | undefined, documentsMap: Record, ) => (document_ids ?? []) - .map((documentId) => documentsMap[documentId]) - .filter((documentItem) => documentItem !== undefined) + .map(documentId => documentsMap[documentId]) + .filter(documentItem => documentItem !== undefined) .map( - (documentItem) => ({ + documentItem => ({ id: documentItem.document_id, label: documentItem.document_name, }) as Option, @@ -37,10 +38,10 @@ export const tagOptions = ( tag_ids: string[] | undefined, tagsMap: Record, ) => (tag_ids ?? []) - .map((tagId) => tagsMap[tagId]) - .filter((tagItem) => tagItem !== undefined) + .map(tagId => tagsMap[tagId]) + .filter(tagItem => tagItem !== undefined) .map( - (tagItem) => ({ + tagItem => ({ id: tagItem.tag_id, label: tagItem.tag_name, color: tagItem.tag_color, @@ -64,8 +65,8 @@ export const attackPatternOptions = ( attackPatternsMap: Record, killChainPhasesMap: Record, ) => (attack_pattern_ids ?? []) - .map((attackPatternId) => attackPatternsMap[attackPatternId]) - .filter((attackPatternItem) => attackPatternItem !== undefined) + .map(attackPatternId => attackPatternsMap[attackPatternId]) + .filter(attackPatternItem => attackPatternItem !== undefined) .map( (attackPatternItem) => { const killChainPhase = R.head(attackPatternItem.attack_pattern_kill_chain_phases); @@ -81,10 +82,10 @@ export const killChainPhaseOptions = ( kill_chain_phase_ids: string[] | undefined, killChainPhasesMap: Record, ) => (kill_chain_phase_ids ?? []) - .map((killChainPhaseId) => killChainPhasesMap[killChainPhaseId]) - .filter((killChainPhaseItem) => killChainPhaseItem !== undefined) + .map(killChainPhaseId => killChainPhasesMap[killChainPhaseId]) + .filter(killChainPhaseItem => killChainPhaseItem !== undefined) .map( - (killChainPhaseItem) => ({ + killChainPhaseItem => ({ id: killChainPhaseItem.phase_id, label: `[${killChainPhaseItem.phase_kill_chain_name}] ${killChainPhaseItem.phase_name}`, }) as Option, @@ -94,10 +95,10 @@ export const exerciseOptions = ( exercise_ids: string[], exercisesMap: Record, ) => (exercise_ids ?? []) - .map((exerciseId) => exercisesMap[exerciseId]) - .filter((exerciseItem) => exerciseItem !== undefined) + .map(exerciseId => exercisesMap[exerciseId]) + .filter(exerciseItem => exerciseItem !== undefined) .map( - (exerciseItem) => ({ + exerciseItem => ({ id: exerciseItem.exercise_id, label: exerciseItem.exercise_name, }) as Option, @@ -107,10 +108,10 @@ export const scenarioOptions = ( scenario_ids: string[], scenariosMap: Record, ) => (scenario_ids ?? []) - .map((scenarioId) => scenariosMap[scenarioId]) - .filter((scenarioItem) => scenarioItem !== undefined) + .map(scenarioId => scenariosMap[scenarioId]) + .filter(scenarioItem => scenarioItem !== undefined) .map( - (scenarioItem) => ({ + scenarioItem => ({ id: scenarioItem.scenario_id, label: scenarioItem.scenario_name, }) as Option, @@ -126,14 +127,14 @@ export const organizationOption = ( const value = organizationsMap[organizationId]; return value ? ({ - id: value.organization_id, - label: value.organization_name, - } as Option) + id: value.organization_id, + label: value.organization_name, + } as Option) : undefined; }; export const countryOptions = () => countries.features.map( - (n) => ({ + n => ({ id: n.properties.ISO3, label: n.properties.NAME, }) as Option, @@ -144,7 +145,7 @@ export const countryOption = (iso3: string | undefined) => { return undefined; } const country = R.head( - countries.features.filter((n) => n.properties.ISO3 === iso3), + countries.features.filter(n => n.properties.ISO3 === iso3), ); return { id: country.properties.ISO3, diff --git a/openbas-front/src/utils/Scenario.tsx b/openbas-front/src/utils/Scenario.tsx index f4bb278835..453641bbad 100644 --- a/openbas-front/src/utils/Scenario.tsx +++ b/openbas-front/src/utils/Scenario.tsx @@ -1,7 +1,8 @@ import * as R from 'ramda'; -import { useHelper } from '../store'; -import type { ScenariosHelper } from '../actions/scenarios/scenario-helper'; + import type { LoggedHelper, UserHelper } from '../actions/helper'; +import type { ScenariosHelper } from '../actions/scenarios/scenario-helper'; +import { useHelper } from '../store'; const useScenarioPermissions = (scenarioId: string, fullScenario = null) => { const { scenario, me, logged } = useHelper((helper: ScenariosHelper & UserHelper & LoggedHelper) => { @@ -22,11 +23,11 @@ const useScenarioPermissions = (scenarioId: string, fullScenario = null) => { }; } const canRead = logged.admin - || (scenario || fullScenario).scenario_observers?.includes(me.user_id); + || (scenario || fullScenario).scenario_observers?.includes(me.user_id); const canWrite = logged.admin - || (scenario || fullScenario).scenario_planners?.includes(me.user_id); + || (scenario || fullScenario).scenario_planners?.includes(me.user_id); const canPlay = logged.admin - || (scenario || fullScenario).scenario_users?.includes(me.user_id); + || (scenario || fullScenario).scenario_users?.includes(me.user_id); return { canRead, canWrite, diff --git a/openbas-front/src/utils/SortingFiltering.js b/openbas-front/src/utils/SortingFiltering.js index 067a1e97b5..e5081d454e 100644 --- a/openbas-front/src/utils/SortingFiltering.js +++ b/openbas-front/src/utils/SortingFiltering.js @@ -1,6 +1,7 @@ -import { useState } from 'react'; -import * as R from 'ramda'; import { ArrowDropDownOutlined, ArrowDropUpOutlined } from '@mui/icons-material'; +import * as R from 'ramda'; +import { useState } from 'react'; + import { useFormatter } from '../components/i18n'; const useSearchAnFilter = ( @@ -20,19 +21,21 @@ const useSearchAnFilter = ( setTags(R.uniq(R.append(value, tags))); }; const handleRemoveTag = (value) => { - const remainingTags = R.filter((n) => n.id !== value, tags); + const remainingTags = R.filter(n => n.id !== value, tags); setTags(remainingTags); }; - const handleSearch = (value) => setKeyword(value); + const handleSearch = value => setKeyword(value); const reverseBy = (field) => { setOrder({ sortBy: field, orderAsc: !order.orderAsc }); }; const buildHeader = (field, label, isSortable, styles) => { - const sortComponent = order.orderAsc ? ( - - ) : ( - - ); + const sortComponent = order.orderAsc + ? ( + + ) + : ( + + ); if (isSortable) { return (
    reverseBy(field)}> @@ -51,9 +54,9 @@ const useSearchAnFilter = ( const filterByKeyword = (e) => { const isEmptyKeyword = keyword === ''; const isKnownColumn = searchColumns - .map((d) => e[`${schema ? `${schema}_` : ''}${d}`] || '') - .map((data) => (typeof data === 'object' ? JSON.stringify(data) : data)) - .map((info) => info.toLowerCase().indexOf(keyword.toLowerCase()) !== -1) + .map(d => e[`${schema ? `${schema}_` : ''}${d}`] || '') + .map(data => (typeof data === 'object' ? JSON.stringify(data) : data)) + .map(info => info.toLowerCase().indexOf(keyword.toLowerCase()) !== -1) .reduce((a, b) => a || b); return isEmptyKeyword || isKnownColumn; }; @@ -65,9 +68,9 @@ const useSearchAnFilter = ( return defaultSortKey ? R.pipe( R.filter( - (n) => tags.length === 0 + n => tags.length === 0 || R.any( - (filter) => R.includes(filter, n[`${schema}_tags`] || []), + filter => R.includes(filter, n[`${schema}_tags`] || []), R.pluck('id', tags), ), ), diff --git a/openbas-front/src/utils/String.js b/openbas-front/src/utils/String.js index a9ad73a527..fb9fc1a27e 100644 --- a/openbas-front/src/utils/String.js +++ b/openbas-front/src/utils/String.js @@ -1,5 +1,5 @@ -import { isNotEmptyField } from './utils'; import colorStyles from '../components/Color'; +import { isNotEmptyField } from './utils'; export const truncate = (str, limit) => { if (str === undefined || str === null || str.length <= limit) { @@ -35,7 +35,7 @@ export const resolveUserNames = (users, withEmailAddress = false) => { .join(', '); }; -export const emptyFilled = (str) => (isNotEmptyField(str) ? str : '-'); +export const emptyFilled = str => (isNotEmptyField(str) ? str : '-'); // Extract the first two items as visible chips export const getVisibleItems = (items, limit) => { @@ -45,7 +45,7 @@ export const getVisibleItems = (items, limit) => { // Generate label with name of remaining items export const getLabelOfRemainingItems = (items, start, property) => { return items?.slice(start, items?.length).map( - (item) => item[property], + item => item[property], ).join(', '); }; diff --git a/openbas-front/src/utils/Time.js b/openbas-front/src/utils/Time.js index 67119bb90d..f1716c3ccb 100644 --- a/openbas-front/src/utils/Time.js +++ b/openbas-front/src/utils/Time.js @@ -4,10 +4,10 @@ export const ONE_MINUTE = 60 * 1000; export const FIVE_SECONDS = 5000; export const ONE_SECOND = 1000; -export const utcDate = (date) => (date ? moment(date).utc() : moment().utc()); +export const utcDate = date => (date ? moment(date).utc() : moment().utc()); export const now = () => utcDate().toISOString(); -const minTwoDigits = (n) => (n < 10 ? '0' : '') + n; +const minTwoDigits = n => (n < 10 ? '0' : '') + n; export const splitDuration = (duration = 0) => { let delta = duration; @@ -26,15 +26,15 @@ export const splitDuration = (duration = 0) => { }; }; -export const yearFormat = (date) => utcDate(date).format('YYYY'); -export const monthFormat = (date) => utcDate(date).format('YYYY-MM'); -export const dayFormat = (date) => utcDate(date).format('YYYY-MM-DD'); -export const timeFormat = (date) => utcDate(date).format('YYYY-MM-DD HH:mm'); +export const yearFormat = date => utcDate(date).format('YYYY'); +export const monthFormat = date => utcDate(date).format('YYYY-MM'); +export const dayFormat = date => utcDate(date).format('YYYY-MM-DD'); +export const timeFormat = date => utcDate(date).format('YYYY-MM-DD HH:mm'); -export const minutesInFuture = (minutes) => moment().utc().add(minutes, 'minutes'); -export const minutesAgo = (minutes) => moment().utc().subtract(minutes, 'minutes'); -export const hoursAgo = (hours) => moment().utc().subtract(hours, 'hours'); -export const daysAgo = (days) => moment().utc().subtract(days, 'days'); +export const minutesInFuture = minutes => moment().utc().add(minutes, 'minutes'); +export const minutesAgo = minutes => moment().utc().subtract(minutes, 'minutes'); +export const hoursAgo = hours => moment().utc().subtract(hours, 'hours'); +export const daysAgo = days => moment().utc().subtract(days, 'days'); export const getMonday = (d) => { const day = d.getDay(); @@ -50,10 +50,10 @@ export const groupBy = (elements, field, duration) => { const formatted = elements.map((elem) => { return { date: moment(elem[field]).startOf(duration).format('YYYY-MM-DD'), count: 1 }; }); - const dates = formatted.map((elem) => elem.date); + const dates = formatted.map(elem => elem.date); const uniqueDates = dates.filter((date, index) => dates.indexOf(date) === index); return uniqueDates.map((date) => { - const count = formatted.filter((elem) => elem.date === date).reduce((c) => c + 1, 0); + const count = formatted.filter(elem => elem.date === date).reduce(c => c + 1, 0); return { date: duration === 'week' ? dayFormat(getMonday(new Date(date))) : monthFormat(date), value: count }; }); }; diff --git a/openbas-front/src/utils/Zod.ts b/openbas-front/src/utils/Zod.ts index f9440b9e7e..752b00dec7 100644 --- a/openbas-front/src/utils/Zod.ts +++ b/openbas-front/src/utils/Zod.ts @@ -1,5 +1,5 @@ -import { z, ZodError, ZodType } from 'zod'; import { setIn } from 'final-form'; +import { z, ZodError, ZodType } from 'zod'; type ZodImplements = { [key in keyof Model]-?: undefined extends Model[key] diff --git a/openbas-front/src/utils/ai/ResponseDialog.tsx b/openbas-front/src/utils/ai/ResponseDialog.tsx index 67d114b455..55b6a53708 100644 --- a/openbas-front/src/utils/ai/ResponseDialog.tsx +++ b/openbas-front/src/utils/ai/ResponseDialog.tsx @@ -1,16 +1,18 @@ -import { FunctionComponent, useRef, useEffect } from 'react'; -import { CKEditor } from '@ckeditor/ckeditor5-react'; -import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField } from '@mui/material'; -import { LoadingButton } from '@mui/lab'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import Editor from 'ckeditor5-custom-build/build/ckeditor'; import 'ckeditor5-custom-build/build/translations/fr'; import 'ckeditor5-custom-build/build/translations/zh-cn'; + +import { CKEditor } from '@ckeditor/ckeditor5-react'; +import { LoadingButton } from '@mui/lab'; +import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField } from '@mui/material'; // As we can ask AI after and follow up, there is a dependency lifecycle here that can be accepted // TODO: Cleanup a bit in upcoming version // eslint-disable-next-line import/no-cycle import MDEditor, { commands } from '@uiw/react-md-editor/nohighlight'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import Editor from 'ckeditor5-custom-build/build/ckeditor'; +import { FunctionComponent, useEffect, useRef } from 'react'; + // eslint-disable-next-line import/no-cycle import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; import { useFormatter } from '../../components/i18n'; @@ -30,7 +32,7 @@ interface ResponseDialogProps { followUpActions: { key: string; label: string; - }[] + }[]; } const ResponseDialog: FunctionComponent = ({ @@ -86,7 +88,7 @@ const ResponseDialog: FunctionComponent = ({ rows={Math.round(height / 23)} value={content} multiline={true} - onChange={(event) => setContent(event.target.value)} + onChange={event => setContent(event.target.value)} fullWidth={true} InputProps={{ endAdornment: ( @@ -127,7 +129,7 @@ const ResponseDialog: FunctionComponent = ({ disabled: isDisabled, }} preview="edit" - onChange={(data) => setContent(data ?? '')} + onChange={data => setContent(data ?? '')} commands={[ { ...commands.title, buttonProps: { disabled: isDisabled } }, { ...commands.bold, buttonProps: { disabled: isDisabled } }, @@ -160,7 +162,7 @@ const ResponseDialog: FunctionComponent = ({ )}
    - + {t('Generative AI is a beta feature as we are currently fine-tuning our models. Consider checking important information.')} diff --git a/openbas-front/src/utils/flows/algorithms/d3-hierarchy.ts b/openbas-front/src/utils/flows/algorithms/d3-hierarchy.ts index c6c0d0e963..17d35a3264 100644 --- a/openbas-front/src/utils/flows/algorithms/d3-hierarchy.ts +++ b/openbas-front/src/utils/flows/algorithms/d3-hierarchy.ts @@ -1,5 +1,6 @@ -import { type Node, getIncomers } from '@xyflow/react'; +import { getIncomers, type Node } from '@xyflow/react'; import { type HierarchyPointNode, stratify, tree } from 'd3-hierarchy'; + import type { Direction, LayoutAlgorithm } from './index'; // D3 Hierarchy doesn't support layouting in different directions, but we can @@ -76,7 +77,7 @@ const d3HierarchyLayout: LayoutAlgorithm = async (nodes, edges, options) => { }; const hierarchy = stratify() - .id((d) => d.id) + .id(d => d.id) .parentId(getParentId)([rootNode, ...initialNodes]); // We create a map of the laid out nodes here to avoid multiple traversals when diff --git a/openbas-front/src/utils/flows/algorithms/dagre.ts b/openbas-front/src/utils/flows/algorithms/dagre.ts index f877955b5f..18fbfb7b14 100644 --- a/openbas-front/src/utils/flows/algorithms/dagre.ts +++ b/openbas-front/src/utils/flows/algorithms/dagre.ts @@ -1,4 +1,5 @@ import dagre from '@dagrejs/dagre'; + import { type LayoutAlgorithm } from '.'; const dagreGraph = new dagre.graphlib.Graph().setDefaultEdgeLabel(() => ({})); diff --git a/openbas-front/src/utils/flows/algorithms/index.ts b/openbas-front/src/utils/flows/algorithms/index.ts index c216cfd79c..8c27a4f65e 100644 --- a/openbas-front/src/utils/flows/algorithms/index.ts +++ b/openbas-front/src/utils/flows/algorithms/index.ts @@ -1,7 +1,7 @@ -import { type Node, type Edge } from '@xyflow/react'; +import { type Edge, type Node } from '@xyflow/react'; -import dagre from './dagre'; import d3Hierarchy from './d3-hierarchy'; +import dagre from './dagre'; // the layout direction (T = top, R = right, B = bottom, L = left, TB = top to bottom, ...) export type Direction = 'TB' | 'LR' | 'RL' | 'BT'; diff --git a/openbas-front/src/utils/flows/useAutoLayout.ts b/openbas-front/src/utils/flows/useAutoLayout.ts index b1eea19eac..e3e423beeb 100644 --- a/openbas-front/src/utils/flows/useAutoLayout.ts +++ b/openbas-front/src/utils/flows/useAutoLayout.ts @@ -1,9 +1,9 @@ +import { type Edge, type Node, useNodesInitialized, useReactFlow, useStore } from '@xyflow/react'; import { useEffect } from 'react'; -import { type Node, type Edge, useReactFlow, useNodesInitialized, useStore } from '@xyflow/react'; -import { getSourceHandlePosition, getTargetHandlePosition } from './utils'; -import layoutAlgorithms, { type LayoutAlgorithmOptions } from './algorithms'; import type { InjectExpectationsStore } from '../../admin/components/common/injects/expectations/Expectation'; +import layoutAlgorithms, { type LayoutAlgorithmOptions } from './algorithms'; +import { getSourceHandlePosition, getTargetHandlePosition } from './utils'; export type LayoutOptions = { algorithm: keyof typeof layoutAlgorithms; @@ -12,7 +12,7 @@ export type LayoutOptions = { function useAutoLayout(options: LayoutOptions, targetResults: InjectExpectationsStore[]) { const { getNodes, getEdges, setNodes, setEdges } = useReactFlow(); const elements = useStore( - (state) => ({ + state => ({ nodeMap: state.nodeLookup, edgeMap: state.edges.reduce( (acc, edge) => acc.set(edge.id, edge), diff --git a/openbas-front/src/utils/flows/utils.ts b/openbas-front/src/utils/flows/utils.ts index f6d2005828..60094671c6 100644 --- a/openbas-front/src/utils/flows/utils.ts +++ b/openbas-front/src/utils/flows/utils.ts @@ -1,4 +1,5 @@ import { Position } from '@xyflow/react'; + import { Direction } from './algorithms'; // eslint-disable-next-line consistent-return diff --git a/openbas-front/src/utils/hooks/useAI.ts b/openbas-front/src/utils/hooks/useAI.ts index d099f8d0c0..21d01a8374 100644 --- a/openbas-front/src/utils/hooks/useAI.ts +++ b/openbas-front/src/utils/hooks/useAI.ts @@ -17,7 +17,7 @@ import useAuth from './useAuth'; const useAI = (): { configured?: boolean | null; - enabled?: boolean | null + enabled?: boolean | null; } => { const { settings } = useAuth(); return { enabled: settings.platform_ai_enabled, configured: settings.platform_ai_has_token }; diff --git a/openbas-front/src/utils/hooks/useAuth.ts b/openbas-front/src/utils/hooks/useAuth.ts index dc1d682381..e5859394e8 100644 --- a/openbas-front/src/utils/hooks/useAuth.ts +++ b/openbas-front/src/utils/hooks/useAuth.ts @@ -1,8 +1,9 @@ import { createContext, useContext } from 'react'; + import type { PlatformSettings } from '../api-types'; export interface User { - id?: string | null, + id?: string | null; } export interface UserContextType { diff --git a/openbas-front/src/utils/hooks/useDataLoader.js b/openbas-front/src/utils/hooks/useDataLoader.js index a5c7da0251..546635be50 100644 --- a/openbas-front/src/utils/hooks/useDataLoader.js +++ b/openbas-front/src/utils/hooks/useDataLoader.js @@ -1,5 +1,6 @@ import { normalize, schema } from 'normalizr'; import { useEffect } from 'react'; + import { DATA_DELETE_SUCCESS } from '../../constants/ActionTypes'; import { store } from '../../store'; import { buildUri } from '../Action'; @@ -35,7 +36,7 @@ const useDataLoader = (loader = () => {}, refetchArg = []) => { }, EVENT_TRY_DELAY); sseClient.addEventListener('open', () => { pristine = false; - [...listeners.keys()].forEach((load) => load()); + [...listeners.keys()].forEach(load => load()); }); sseClient.addEventListener('message', (event) => { const data = JSON.parse(event.data); diff --git a/openbas-front/src/utils/hooks/useEntityToggle.ts b/openbas-front/src/utils/hooks/useEntityToggle.ts index c2cd158587..787e31c165 100644 --- a/openbas-front/src/utils/hooks/useEntityToggle.ts +++ b/openbas-front/src/utils/hooks/useEntityToggle.ts @@ -1,6 +1,6 @@ +import * as R from 'ramda'; import { useState } from 'react'; import * as React from 'react'; -import * as R from 'ramda'; export interface UseEntityToggle { selectedElements: Record; @@ -25,7 +25,7 @@ const useEntityToggle = >( {}, ); const [deSelectedElements, setDeSelectedElements] = useState< - Record + Record >({}); const [selectAll, setSelectAll] = useState(false); const onToggleEntity = ( @@ -39,18 +39,18 @@ const useEntityToggle = >( } if (Array.isArray(entity)) { const currentIds = R.values(selectedElements).map((n: Record) => n[`${prefix}_id`]); - const givenIds = entity.map((n) => n[`${prefix}_id`]); - const addedIds = givenIds.filter((n) => !currentIds.includes(n)); + const givenIds = entity.map(n => n[`${prefix}_id`]); + const addedIds = givenIds.filter(n => !currentIds.includes(n)); let newSelectedElements = { ...selectedElements, ...R.indexBy( R.prop(`${prefix}_id`), - entity.filter((n) => addedIds.includes(n[`${prefix}_id`])), + entity.filter(n => addedIds.includes(n[`${prefix}_id`])), ), }; if (forceRemove.length > 0) { newSelectedElements = R.omit( - forceRemove.map((n) => n[`${prefix}_id`]), + forceRemove.map(n => n[`${prefix}_id`]), newSelectedElements, ); } diff --git a/openbas-front/src/utils/hooks/useExportToXLS.ts b/openbas-front/src/utils/hooks/useExportToXLS.ts index 8fd37e65fa..b635bf9f6a 100644 --- a/openbas-front/src/utils/hooks/useExportToXLS.ts +++ b/openbas-front/src/utils/hooks/useExportToXLS.ts @@ -1,6 +1,6 @@ +import fileDownload from 'js-file-download'; import { useCallback } from 'react'; import * as XLSX from 'xlsx'; -import fileDownload from 'js-file-download'; interface UseExportToXLSProps { data: T[]; diff --git a/openbas-front/src/utils/injector_contract/InjectorContractUtils.ts b/openbas-front/src/utils/injector_contract/InjectorContractUtils.ts index 04a924ed19..cb0bc29700 100644 --- a/openbas-front/src/utils/injector_contract/InjectorContractUtils.ts +++ b/openbas-front/src/utils/injector_contract/InjectorContractUtils.ts @@ -1,4 +1,5 @@ import * as R from 'ramda'; + import type { AttackPatternStore } from '../../actions/attack_patterns/AttackPattern'; import type { InjectorContractOutput } from '../api-types'; diff --git a/openbas-front/src/utils/utils.ts b/openbas-front/src/utils/utils.ts index 3e1f912811..746f824e57 100644 --- a/openbas-front/src/utils/utils.ts +++ b/openbas-front/src/utils/utils.ts @@ -1,7 +1,8 @@ import * as R from 'ramda'; -import { MESSAGING$ } from './Environment'; -import { useHelper } from '../store'; + import type { LoggedHelper } from '../actions/helper'; +import { useHelper } from '../store'; +import { MESSAGING$ } from './Environment'; export const export_max_size = 50000; @@ -76,7 +77,7 @@ export const readFileContent = (file: File): Promise => { } }; - reader.onerror = (error) => reject(error); + reader.onerror = error => reject(error); reader.readAsText(file); }); }; diff --git a/openbas-front/tests_e2e/fixtures/assetFixtures.ts b/openbas-front/tests_e2e/fixtures/assetFixtures.ts index 832954b5d0..7e767f12c7 100644 --- a/openbas-front/tests_e2e/fixtures/assetFixtures.ts +++ b/openbas-front/tests_e2e/fixtures/assetFixtures.ts @@ -1,4 +1,5 @@ import { Page } from '@playwright/test'; + import AssetFormPage from '../model/assets/asset-form.page'; const fillLinuxAssetBase = async (page: Page, name: string, ip: string) => { diff --git a/openbas-front/tests_e2e/fixtures/baseFixtures.ts b/openbas-front/tests_e2e/fixtures/baseFixtures.ts index 3eaf024957..80dc9f0e27 100644 --- a/openbas-front/tests_e2e/fixtures/baseFixtures.ts +++ b/openbas-front/tests_e2e/fixtures/baseFixtures.ts @@ -1,8 +1,8 @@ /* eslint-disable @typescript-eslint/no-explicit-any, no-underscore-dangle */ +import { test as baseTest } from '@playwright/test'; +import * as crypto from 'crypto'; import * as fs from 'fs'; import * as path from 'path'; -import * as crypto from 'crypto'; -import { test as baseTest } from '@playwright/test'; const istanbulCLIOutput = path.join(process.cwd(), '.nyc_output'); diff --git a/openbas-front/tests_e2e/tests/assets/create-asset.spec.ts b/openbas-front/tests_e2e/tests/assets/create-asset.spec.ts index 361ef9f8aa..84cacc8a14 100644 --- a/openbas-front/tests_e2e/tests/assets/create-asset.spec.ts +++ b/openbas-front/tests_e2e/tests/assets/create-asset.spec.ts @@ -1,9 +1,10 @@ import { expect } from '@playwright/test'; + +import fillLinuxAssetBase from '../../fixtures/assetFixtures'; import { test } from '../../fixtures/baseFixtures'; -import appUrl from '../../utils/url'; -import AssetsPage from '../../model/assets/assets.page'; import AssetFormPage from '../../model/assets/asset-form.page'; -import fillLinuxAssetBase from '../../fixtures/assetFixtures'; +import AssetsPage from '../../model/assets/assets.page'; +import appUrl from '../../utils/url'; test('Create an asset', async ({ page }) => { // -- PREPARE -- diff --git a/openbas-front/tests_e2e/tests/assets/delete-asset.spec.ts b/openbas-front/tests_e2e/tests/assets/delete-asset.spec.ts index f60f5b82f4..4711c87d79 100644 --- a/openbas-front/tests_e2e/tests/assets/delete-asset.spec.ts +++ b/openbas-front/tests_e2e/tests/assets/delete-asset.spec.ts @@ -1,9 +1,10 @@ import { expect } from '@playwright/test'; + +import fillLinuxAssetBase from '../../fixtures/assetFixtures'; import { test } from '../../fixtures/baseFixtures'; -import appUrl from '../../utils/url'; -import AssetsPage from '../../model/assets/assets.page'; import AssetFormPage from '../../model/assets/asset-form.page'; -import fillLinuxAssetBase from '../../fixtures/assetFixtures'; +import AssetsPage from '../../model/assets/assets.page'; +import appUrl from '../../utils/url'; test('Delete an asset', async ({ page }) => { // -- PREPARE -- diff --git a/openbas-front/tests_e2e/tests/assets/update-asset.spec.ts b/openbas-front/tests_e2e/tests/assets/update-asset.spec.ts index f39e5fae69..d9147afc75 100644 --- a/openbas-front/tests_e2e/tests/assets/update-asset.spec.ts +++ b/openbas-front/tests_e2e/tests/assets/update-asset.spec.ts @@ -1,9 +1,10 @@ import { expect } from '@playwright/test'; + +import fillLinuxAssetBase from '../../fixtures/assetFixtures'; import { test } from '../../fixtures/baseFixtures'; -import appUrl from '../../utils/url'; -import AssetsPage from '../../model/assets/assets.page'; import AssetFormPage from '../../model/assets/asset-form.page'; -import fillLinuxAssetBase from '../../fixtures/assetFixtures'; +import AssetsPage from '../../model/assets/assets.page'; +import appUrl from '../../utils/url'; test('Update an asset', async ({ page }) => { // -- PREPARE -- diff --git a/openbas-front/tests_e2e/utils/login.ts b/openbas-front/tests_e2e/utils/login.ts index 04ef790ea7..bb86223599 100644 --- a/openbas-front/tests_e2e/utils/login.ts +++ b/openbas-front/tests_e2e/utils/login.ts @@ -1,4 +1,5 @@ import { expect, Page } from '@playwright/test'; + import LoginPage from '../model/login.page'; import TopBarPage from '../model/topBar.page'; import appUrl from './url'; diff --git a/openbas-front/tests_e2e/utils/logout.ts b/openbas-front/tests_e2e/utils/logout.ts index 419c206c7a..6cb7fcb5fa 100644 --- a/openbas-front/tests_e2e/utils/logout.ts +++ b/openbas-front/tests_e2e/utils/logout.ts @@ -1,4 +1,5 @@ import { Page } from '@playwright/test'; + import TopBarPage from '../model/topBar.page'; const logout = async (page: Page) => { diff --git a/openbas-front/vite.config.ts b/openbas-front/vite.config.ts index 8f9b91f090..ae3d1f4f19 100644 --- a/openbas-front/vite.config.ts +++ b/openbas-front/vite.config.ts @@ -1,5 +1,5 @@ -import { createLogger, defineConfig, loadEnv, transformWithEsbuild } from 'vite'; import react from '@vitejs/plugin-react'; +import { createLogger, defineConfig, loadEnv, transformWithEsbuild } from 'vite'; import IstanbulPlugin from 'vite-plugin-istanbul'; const logger = createLogger(); diff --git a/openbas-front/vitest.config.ts b/openbas-front/vitest.config.ts index b87a98d3b1..ef04fa0261 100644 --- a/openbas-front/vitest.config.ts +++ b/openbas-front/vitest.config.ts @@ -1,12 +1,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-nocheck // ts nocheck because there is an "Excessive stack depth comparing types" it seems that there is a problem with the React plugin and the defineConfig type -import { defineConfig } from 'vitest/config'; import react from '@vitejs/plugin-react'; - // import jsdom to not let tools report them as unused // eslint-disable-next-line @typescript-eslint/no-unused-vars import jsdom from 'jsdom'; +import { defineConfig } from 'vitest/config'; export default defineConfig({ plugins: [react()], From 997ccb7c6ad8b5b9b6d58fcf6f2c545ee0011ea8 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 28 Oct 2024 08:04:25 +0100 Subject: [PATCH 07/14] [frontend] last fixes --- openbas-front/builder/dev/dev.js | 2 + openbas-front/builder/prod/prod.js | 2 + openbas-front/eslint.config.js | 54 ++++++++++++++++++- openbas-front/src/actions/Schema.js | 2 - .../inject_test/inject-test-actions.ts | 1 - .../atomic_testings/AtomicTestings.tsx | 1 - .../atomic_testing/TargetResultsDetail.tsx | 2 - .../common/injects/CreateInjectDetails.js | 1 - .../components/common/injects/Injects.tsx | 5 +- .../common/injects/UpdateInjectDetails.js | 1 - .../xls_mapper/RulesContractContent.tsx | 2 +- .../simulation/validation/Validations.js | 1 - .../src/components/ScenarioField.jsx | 11 ++-- .../common/queryable/QueryableUtils.ts | 1 - .../src/components/fields/OldSelectField.jsx | 4 +- .../src/components/fields/OldTextField.jsx | 25 ++++----- .../src/components/fields/RichTextField.jsx | 29 +++++----- .../components/fields/SimpleRichTextField.jsx | 10 ++-- openbas-front/src/network.js | 2 +- openbas-front/src/utils/utils.ts | 1 - 20 files changed, 103 insertions(+), 54 deletions(-) diff --git a/openbas-front/builder/dev/dev.js b/openbas-front/builder/dev/dev.js index 8b294ac115..492073f358 100644 --- a/openbas-front/builder/dev/dev.js +++ b/openbas-front/builder/dev/dev.js @@ -1,3 +1,5 @@ +/* eslint import/no-extraneous-dependencies: 0 */ + import { readFileSync } from 'node:fs'; import path from 'node:path'; diff --git a/openbas-front/builder/prod/prod.js b/openbas-front/builder/prod/prod.js index 1c74360dbe..1408580d25 100644 --- a/openbas-front/builder/prod/prod.js +++ b/openbas-front/builder/prod/prod.js @@ -1,3 +1,5 @@ +/* eslint import/no-extraneous-dependencies: 0 */ + import fs from 'node:fs'; import { build } from 'esbuild'; diff --git a/openbas-front/eslint.config.js b/openbas-front/eslint.config.js index 050a2fda35..e0756b9310 100644 --- a/openbas-front/eslint.config.js +++ b/openbas-front/eslint.config.js @@ -1,3 +1,5 @@ +/* eslint import/no-extraneous-dependencies: 0 */ + // imports to not let tools report them as unused import 'eslint-import-resolver-oxc'; @@ -109,9 +111,22 @@ export default [ // eslint-plugin-import rules 'import/no-named-as-default-member': 'off', 'import/prefer-default-export': 'error', - 'import/namespace': 'off', + 'import/no-mutable-exports': 'error', + 'import/namespace': 'off', // off to reduce computing time for one file, on when doing yarn lint + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: [ + '**/*.test.tsx', + '**/*.test.ts', + 'vite.config.ts', + 'vitest.config.ts', + 'playwright.config.ts', + ], + }, + ], - // custom rules inspired from airbnb + // custom rules 'sort-imports': 'off', 'no-underscore-dangle': 'error', 'no-await-in-loop': 'error', @@ -123,7 +138,31 @@ export default [ 'no-nested-ternary': 'error', 'prefer-promise-reject-errors': 'error', 'no-console': 'error', + 'max-len': [ + 'error', 180, 2, { + ignoreUrls: true, + ignoreComments: false, + ignoreRegExpLiterals: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + }, + ], + 'no-restricted-imports': [ + 'error', { + patterns: [ + { + group: ['@mui/material/*', '!@mui/material/locale', '!@mui/material/styles', '!@mui/material/colors', '!@mui/material/transitions'], + message: 'Please use named import from @mui/material instead.', + }, + { + group: ['@mui/styles/*'], + message: 'Please use named import from @mui/styles instead.', + }, + ], + }, + ], }, + files: ['**/*.js', '**/*.ts', '**/*.jsx', '**/*.tsx'], languageOptions: { globals: { ...globals.browser, @@ -142,6 +181,17 @@ export default [ files: ['tests_e2e/**/*'], // rules recommended by eslint-plugin-playwright ...playwright.configs['flat/recommended'], + rules: { + ...playwright.configs['flat/recommended'].rules, + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: [ + '**/*.ts', + ], + }, + ], + }, }, // ignores patterns diff --git a/openbas-front/src/actions/Schema.js b/openbas-front/src/actions/Schema.js index 6e419b2b7c..6217d003c5 100644 --- a/openbas-front/src/actions/Schema.js +++ b/openbas-front/src/actions/Schema.js @@ -1,4 +1,3 @@ -/* eslint-disable no-underscore-dangle,max-len */ import { schema } from 'normalizr'; import * as R from 'ramda'; @@ -369,7 +368,6 @@ export const storeHelper = state => ({ getAtomicTestings: () => entities('atomics', state), getTargetResults: (id, injectId) => entities('targetresults', state).filter(r => (r.target_id === id) && (r.target_inject_id === injectId)), getInjectsMap: () => getInjectsWithParsedInjectorContractContent(entities('injects', state)).reduce((map, i) => { - // eslint-disable-next-line no-param-reassign map[i.inject_id] = i; return map; }, {}), diff --git a/openbas-front/src/actions/inject_test/inject-test-actions.ts b/openbas-front/src/actions/inject_test/inject-test-actions.ts index 095b7ff1ca..5ea3bd979f 100644 --- a/openbas-front/src/actions/inject_test/inject-test-actions.ts +++ b/openbas-front/src/actions/inject_test/inject-test-actions.ts @@ -1,7 +1,6 @@ import { simpleCall, simpleDelCall, simplePostCall } from '../../utils/Action'; import type { SearchPaginationInput } from '../../utils/api-types'; -// eslint-disable-next-line import/prefer-default-export export const searchExerciseInjectTests = (exerciseId: string, searchPaginationInput: SearchPaginationInput) => { const uri = `/api/exercise/${exerciseId}/injects/test`; return simplePostCall(uri, searchPaginationInput); diff --git a/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx b/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx index 9944f40364..7b51017b8b 100644 --- a/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx +++ b/openbas-front/src/admin/components/atomic_testings/AtomicTestings.tsx @@ -18,7 +18,6 @@ import CreateInject from '../common/injects/CreateInject'; import teamContextForAtomicTesting from './atomic_testing/context/TeamContextForAtomicTesting'; import InjectDtoList from './InjectDtoList'; -// eslint-disable-next-line consistent-return const AtomicTestings = () => { // Standard hooks const { t } = useFormatter(); diff --git a/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx b/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx index ad50b57f59..214344ca68 100644 --- a/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx +++ b/openbas-front/src/admin/components/atomic_testings/atomic_testing/TargetResultsDetail.tsx @@ -188,8 +188,6 @@ const TargetResultsDetailFlow: FunctionComponent = ({ const computeInitialSteps = (currentInitialSteps: Steptarget[]) => { return currentInitialSteps.map((step, index) => { if (index === 0) { - // eslint-disable-next-line @typescript-eslint/no-use-before-define,no-nested-ternary,@typescript-eslint/ban-ts-comment - // @ts-ignore // eslint-disable-next-line @typescript-eslint/no-use-before-define,no-nested-ternary return { ...step, status: injectResultDto?.inject_status?.status_name === 'QUEUING' ? 'QUEUING' : lastExecutionStartDate ? 'SUCCESS' : 'PENDING' }; } diff --git a/openbas-front/src/admin/components/common/injects/CreateInjectDetails.js b/openbas-front/src/admin/components/common/injects/CreateInjectDetails.js index b38c685103..1b70fa4d10 100644 --- a/openbas-front/src/admin/components/common/injects/CreateInjectDetails.js +++ b/openbas-front/src/admin/components/common/injects/CreateInjectDetails.js @@ -92,7 +92,6 @@ const CreateInjectDetails = ({ }); const toggleInjectContent = () => { if (openDetails) { - // eslint-disable-next-line no-param-reassign drawerRef.current.scrollTop = 0; setOpenDetails(false); } else { diff --git a/openbas-front/src/admin/components/common/injects/Injects.tsx b/openbas-front/src/admin/components/common/injects/Injects.tsx index 0689309683..cf36a52301 100644 --- a/openbas-front/src/admin/components/common/injects/Injects.tsx +++ b/openbas-front/src/admin/components/common/injects/Injects.tsx @@ -355,7 +355,7 @@ const Injects: FunctionComponent = ({ let entities: InjectOutputType[] = []; while (firstIndex <= currentIndex) { entities = [...entities, injects[firstIndex]]; - // eslint-disable-next-line no-plusplus + firstIndex++; } const forcedRemove = R.values(selectedElements).filter( @@ -368,7 +368,7 @@ const Injects: FunctionComponent = ({ let entities: InjectOutputType[] = []; while (firstIndex >= currentIndex) { entities = [...entities, injects[firstIndex]]; - // eslint-disable-next-line no-plusplus + firstIndex--; } const forcedRemove = R.values(selectedElements).filter( @@ -460,7 +460,6 @@ const Injects: FunctionComponent = ({ default: return; } - /* eslint-enable */ } } }; diff --git a/openbas-front/src/admin/components/common/injects/UpdateInjectDetails.js b/openbas-front/src/admin/components/common/injects/UpdateInjectDetails.js index 089c8e2fcc..ec43fe8217 100644 --- a/openbas-front/src/admin/components/common/injects/UpdateInjectDetails.js +++ b/openbas-front/src/admin/components/common/injects/UpdateInjectDetails.js @@ -75,7 +75,6 @@ const UpdateInjectDetails = ({ const toggleInjectContent = () => { if (openDetails) { - // eslint-disable-next-line no-param-reassign drawerRef.current.scrollTop = 0; setOpenDetails(false); } else { diff --git a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/RulesContractContent.tsx b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/RulesContractContent.tsx index 40c0662e46..f130c9d3d1 100644 --- a/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/RulesContractContent.tsx +++ b/openbas-front/src/admin/components/settings/data_ingestion/xls_mapper/RulesContractContent.tsx @@ -100,7 +100,7 @@ const RulesContractContent: React.FC = ({ rule_attribute_columns: '', rule_attribute_default_value: '', }); - // eslint-disable-next-line no-plusplus + for (let i = 0; i < contractFieldKeys?.length; i++) { rulesAppend({ rule_attribute_name: contractFieldKeys[i], diff --git a/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js b/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js index 538544cfb1..9e830a5870 100644 --- a/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js +++ b/openbas-front/src/admin/components/simulations/simulation/validation/Validations.js @@ -92,7 +92,6 @@ const Validations = () => { sort, )(injectExpectations); - /* eslint-disable no-param-reassign */ const groupedByInject = sortedInjectExpectations.reduce((group, expectation) => { const { inject_expectation_inject } = expectation; const { inject_id } = inject_expectation_inject; diff --git a/openbas-front/src/components/ScenarioField.jsx b/openbas-front/src/components/ScenarioField.jsx index 7cc1a92132..4f9ad24573 100644 --- a/openbas-front/src/components/ScenarioField.jsx +++ b/openbas-front/src/components/ScenarioField.jsx @@ -1,11 +1,12 @@ import { Kayaking } from '@mui/icons-material'; import { Box } from '@mui/material'; import { makeStyles } from '@mui/styles'; -import Autocomplete from './Autocomplete'; -import useDataLoader from '../utils/hooks/useDataLoader'; -import { useHelper } from '../store'; + import { fetchScenarios } from '../actions/scenarios/scenario-actions'; +import { useHelper } from '../store'; import { useAppDispatch } from '../utils/hooks'; +import useDataLoader from '../utils/hooks/useDataLoader'; +import Autocomplete from './Autocomplete'; const useStyles = makeStyles(() => ({ icon: { @@ -27,13 +28,13 @@ const ScenarioField = (props) => { const classes = useStyles(); const dispatch = useAppDispatch(); // Fetching data - const scenarios = useHelper((helper) => helper.getScenarios()); + const scenarios = useHelper(helper => helper.getScenarios()); useDataLoader(() => { dispatch(fetchScenarios()); }); const { name, onKeyDown, style, label, placeholder } = props; - const scenarioOptions = (scenarios || []).map((n) => ({ + const scenarioOptions = (scenarios || []).map(n => ({ id: n.scenario_id, label: n.scenario_name, })); diff --git a/openbas-front/src/components/common/queryable/QueryableUtils.ts b/openbas-front/src/components/common/queryable/QueryableUtils.ts index 8db9b9a71b..77e2d580af 100644 --- a/openbas-front/src/components/common/queryable/QueryableUtils.ts +++ b/openbas-front/src/components/common/queryable/QueryableUtils.ts @@ -3,7 +3,6 @@ import { z } from 'zod'; import type { SearchPaginationInput } from '../../../utils/api-types'; import { ROWS_PER_PAGE_OPTIONS } from './pagination/usPaginationState'; -// eslint-disable-next-line import/prefer-default-export export const buildSearchPagination = (searchPaginationInput: Partial) => { return ({ page: 0, diff --git a/openbas-front/src/components/fields/OldSelectField.jsx b/openbas-front/src/components/fields/OldSelectField.jsx index 418471ce05..cf269c4833 100644 --- a/openbas-front/src/components/fields/OldSelectField.jsx +++ b/openbas-front/src/components/fields/OldSelectField.jsx @@ -1,4 +1,4 @@ -import { Select as MUISelect, FormControl, InputLabel, FormHelperText } from '@mui/material'; +import { FormControl, FormHelperText, InputLabel, Select as MUISelect } from '@mui/material'; import { Field } from 'react-final-form'; const renderHelper = ({ touched, error, submitError, helperText, variant }) => { @@ -64,7 +64,7 @@ const renderSelectField = ({ ); -const OldSelectField = (props) => ( +const OldSelectField = props => ( ); diff --git a/openbas-front/src/components/fields/OldTextField.jsx b/openbas-front/src/components/fields/OldTextField.jsx index 65106f63c4..051c6c5d72 100644 --- a/openbas-front/src/components/fields/OldTextField.jsx +++ b/openbas-front/src/components/fields/OldTextField.jsx @@ -1,7 +1,8 @@ -import { Field } from 'react-final-form'; import { TextField as MuiTextField } from '@mui/material'; -import { useFormatter } from '../i18n'; +import { Field } from 'react-final-form'; + import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; +import { useFormatter } from '../i18n'; const TextFieldBase = ({ label, @@ -22,15 +23,15 @@ const TextFieldBase = ({ {...others} InputProps={{ endAdornment: askAi && ( - { - input.onChange(val); - }} - format="text" - disabled={others.disabled} - /> + { + input.onChange(val); + }} + format="text" + disabled={others.disabled} + /> ), }} /> @@ -40,7 +41,7 @@ const TextFieldBase = ({ /** * @deprecated The component use old form libnary react-final-form */ -const OldTextField = (props) => ( +const OldTextField = props => ( ); diff --git a/openbas-front/src/components/fields/RichTextField.jsx b/openbas-front/src/components/fields/RichTextField.jsx index f5a8962fd9..7900d755a5 100644 --- a/openbas-front/src/components/fields/RichTextField.jsx +++ b/openbas-front/src/components/fields/RichTextField.jsx @@ -1,17 +1,19 @@ -import { Field } from 'react-final-form'; -import { FormHelperText, InputLabel } from '@mui/material'; -import { CKEditor } from '@ckeditor/ckeditor5-react'; -import Editor from 'ckeditor5-custom-build/build/ckeditor'; import 'ckeditor5-custom-build/build/translations/fr'; + +import { CKEditor } from '@ckeditor/ckeditor5-react'; +import { FormHelperText, InputLabel } from '@mui/material'; import { makeStyles } from '@mui/styles'; +import Editor from 'ckeditor5-custom-build/build/ckeditor'; import classNames from 'classnames'; +import { Field } from 'react-final-form'; + +// eslint-disable-next-line import/no-cycle +import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; import { useHelper } from '../../store'; import locale from '../../utils/BrowserLanguage'; import { useFormatter } from '../i18n'; -// eslint-disable-next-line import/no-cycle -import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(theme => ({ errorColor: { color: theme.palette.error.main, }, @@ -59,14 +61,15 @@ const RichTextFieldBase = ({ onChange={(event, editor) => { onChange(editor.getData()); }} - onBlur={(event) => onBlur(event)} + onBlur={event => onBlur(event)} disabled={disabled} /> {touched && invalid - && - {(error && t(error)) || (submitError && t(submitError))} - - } + && ( + + {(error && t(error)) || (submitError && t(submitError))} + + )} {askAi && ( ( +const RichTextField = props => ( ); diff --git a/openbas-front/src/components/fields/SimpleRichTextField.jsx b/openbas-front/src/components/fields/SimpleRichTextField.jsx index 4b4b798473..a0a87862ae 100644 --- a/openbas-front/src/components/fields/SimpleRichTextField.jsx +++ b/openbas-front/src/components/fields/SimpleRichTextField.jsx @@ -1,11 +1,13 @@ -import { InputLabel } from '@mui/material'; +import 'ckeditor5-custom-build/build/translations/fr'; + import { CKEditor } from '@ckeditor/ckeditor5-react'; +import { InputLabel } from '@mui/material'; import Editor from 'ckeditor5-custom-build/build/ckeditor'; -import 'ckeditor5-custom-build/build/translations/fr'; -import { useHelper } from '../../store'; -import locale from '../../utils/BrowserLanguage'; + // eslint-disable-next-line import/no-cycle import TextFieldAskAI from '../../admin/components/common/form/TextFieldAskAI'; +import { useHelper } from '../../store'; +import locale from '../../utils/BrowserLanguage'; const SimpleRichTextField = (props) => { const { diff --git a/openbas-front/src/network.js b/openbas-front/src/network.js index c6aeb4dd3f..b33f3b904b 100644 --- a/openbas-front/src/network.js +++ b/openbas-front/src/network.js @@ -23,7 +23,7 @@ export const api = (schema) => { // eslint-disable-next-line no-underscore-dangle && !err.config.__isRetryRequest ) { - // eslint-disable-next-line no-param-reassign,no-underscore-dangle + // eslint-disable-next-line no-underscore-dangle err.config.__isRetryRequest = true; return axios(err.config); } diff --git a/openbas-front/src/utils/utils.ts b/openbas-front/src/utils/utils.ts index 746f824e57..1ed188da5b 100644 --- a/openbas-front/src/utils/utils.ts +++ b/openbas-front/src/utils/utils.ts @@ -57,7 +57,6 @@ export const removeEmptyFields = ( export const deleteElementByValue = (obj: Record, val: string) => { for (const key in obj) { if (obj[key] === val) { - // eslint-disable-next-line no-param-reassign delete obj[key]; } } From 28dd5cc0a04793b70eda9a05e3a181170d9dcd88 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 28 Oct 2024 08:59:36 +0100 Subject: [PATCH 08/14] [frontend] fix ts --- .../components/assets/asset_groups/AssetGroupManagement.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupManagement.tsx b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupManagement.tsx index 819331a110..325d23e6c9 100644 --- a/openbas-front/src/admin/components/assets/asset_groups/AssetGroupManagement.tsx +++ b/openbas-front/src/admin/components/assets/asset_groups/AssetGroupManagement.tsx @@ -125,9 +125,8 @@ const AssetGroupManagement: FunctionComponent = ({ Date: Mon, 28 Oct 2024 09:04:07 +0100 Subject: [PATCH 09/14] [frontend] fix import --- .../src/admin/components/common/injects/teams/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openbas-front/src/admin/components/common/injects/teams/utils.ts b/openbas-front/src/admin/components/common/injects/teams/utils.ts index 8a615513e9..4b5fe55187 100644 --- a/openbas-front/src/admin/components/common/injects/teams/utils.ts +++ b/openbas-front/src/admin/components/common/injects/teams/utils.ts @@ -1,5 +1,5 @@ import { useTheme } from '@mui/styles'; -import R from 'ramda'; +import * as R from 'ramda'; import type { TeamStore } from '../../../../../actions/teams/Team'; import type { Theme } from '../../../../../components/Theme'; From 70d263fe9afc1afe700345c416a5c5b61e145aad Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 28 Oct 2024 09:08:07 +0100 Subject: [PATCH 10/14] [frontend] fix localization --- openbas-front/src/utils/Localization.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openbas-front/src/utils/Localization.js b/openbas-front/src/utils/Localization.js index f6acaef5de..746efe4ee6 100644 --- a/openbas-front/src/utils/Localization.js +++ b/openbas-front/src/utils/Localization.js @@ -249,6 +249,7 @@ const i18n = { 'Taxonomies': 'Taxonomies', 'Attack patterns': 'Motifs d\'attaque', 'AttackPatterns': 'Motifs-d\'attaque', + 'Attack Pattern': 'Motif d\'attaque', 'Kill chain phases': 'Phases de kill chain', 'KillChainPhases': 'Phases-de-kill-chain', 'This field is mandatory': 'Ce champ est requis', @@ -1643,6 +1644,7 @@ const i18n = { 'Taxonomies': '分类法', 'Attack patterns': '攻击模式', 'AttackPatterns': '攻击模式', + 'Attack Pattern': '攻击模式', 'Kill chain phases': '杀伤链阶段', 'KillChainPhases': '杀伤链阶段', 'This field is mandatory': '该字段为必填字段', From 6b9cb1ac7197431e807374895bb9549a5ce90cd9 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 28 Oct 2024 09:20:25 +0100 Subject: [PATCH 11/14] [frontend] fix localization --- openbas-front/src/utils/Localization.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openbas-front/src/utils/Localization.js b/openbas-front/src/utils/Localization.js index 746efe4ee6..034e67e514 100644 --- a/openbas-front/src/utils/Localization.js +++ b/openbas-front/src/utils/Localization.js @@ -591,6 +591,9 @@ const i18n = { 'Send the questionnaire': 'Envoyer le questionnaire', 'Reset answers': 'Réinitialiser les réponses', 'hours': 'heures', + 'ms': 'ms', + 's': 's', + 'title': 'titre', 'Expiration time': 'Temps d\'expiration', 'Apply': 'Appliquer', 'players': 'joueurs', @@ -1622,6 +1625,9 @@ const i18n = { 'Disabled': '禁用', 'Days': '天', 'Hours': '小时', + 'ms': '毫秒', + 's': '秒', + 'title': '标题', 'Expiration time': '过期时间', 'Minutes': '分钟', 'Seconds': '秒', From 82372b623182c34b8749286ca79305475bf3def9 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Tue, 29 Oct 2024 11:57:18 +0100 Subject: [PATCH 12/14] [frontend] fix vite --- openbas-front/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openbas-front/vite.config.ts b/openbas-front/vite.config.ts index ae3d1f4f19..b0ed6b9edc 100644 --- a/openbas-front/vite.config.ts +++ b/openbas-front/vite.config.ts @@ -114,7 +114,7 @@ export default ({ mode }: { mode: string }) => { }); }, }, - react({ jsxRuntime: 'classic' }), + react(), [IstanbulPlugin({ include: 'src/*', exclude: ['node_modules', 'test/'], From 3ddd78e42d03c353fc32673365cc82d3cbeb8936 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Tue, 29 Oct 2024 13:39:15 +0100 Subject: [PATCH 13/14] [frontend] fix yarn lock --- openbas-front/yarn.lock | 2875 ++++++++------------------------------- 1 file changed, 589 insertions(+), 2286 deletions(-) diff --git a/openbas-front/yarn.lock b/openbas-front/yarn.lock index 9e738662ff..c0ef8283a3 100644 --- a/openbas-front/yarn.lock +++ b/openbas-front/yarn.lock @@ -25,14 +25,14 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9": +"@babel/compat-data@npm:^7.25.9": version: 7.25.9 resolution: "@babel/compat-data@npm:7.25.9" checksum: 10c0/8d9fc2074311ce61aaf5bccf740a808644d19d4859caf5fa46d8a7186a1ee0b0d8cbbc23f9371f8b397e84a885bdeab58d5f22d6799ddde55973252aac351a27 languageName: node linkType: hard -"@babel/core@npm:^7.16.0, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.5": +"@babel/core@npm:^7.23.9, @babel/core@npm:^7.24.5": version: 7.25.9 resolution: "@babel/core@npm:7.25.9" dependencies: @@ -55,1375 +55,149 @@ __metadata: languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.16.3": - version: 7.25.9 - resolution: "@babel/eslint-parser@npm:7.25.9" - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals": "npm:5.1.1-v1" - eslint-visitor-keys: "npm:^2.1.0" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/7dc525da9a076906aff562f82373765785732edf306e2be6497e347ed73be80d3544f2f845a77c2376bfa1c7c8c3580ea7346b12b78d8ddf4365c44fe9c35c4b - languageName: node - linkType: hard - -"@babel/generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/generator@npm:7.25.9" - dependencies: - "@babel/types": "npm:^7.25.9" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^3.0.2" - checksum: 10c0/fca49a1440ac550bb835a73c0e8314849cd493a468a5431ca7f9dbb3d3443e3a1a6dcba2426752e8a97cc2feed4a3b7a0c639e1c45871c4a9dd0c994f08dd25a - languageName: node - linkType: hard - -"@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" - dependencies: - "@babel/types": "npm:^7.25.9" - checksum: 10c0/095b6ba50489d797733abebc4596a81918316a99e3632755c9f02508882912b00c2ae5e468532a25a5c2108d109ddbe9b7da78333ee7cc13817fc50c00cf06fe - languageName: node - linkType: hard - -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/a6068bb813e7f72d12b72edeecb99167f60cd7964cacedfb60e01fff5e7bed4a5a7f4f7414de7cf352a1b71487df5f8dab8c2b5230de4ad5aea16adf32e14219 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-compilation-targets@npm:7.25.9" - dependencies: - "@babel/compat-data": "npm:^7.25.9" - "@babel/helper-validator-option": "npm:^7.25.9" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa - languageName: node - linkType: hard - -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-member-expression-to-functions": "npm:^7.25.9" - "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/b2bdd39f38056a76b9ba00ec5b209dd84f5c5ebd998d0f4033cf0e73d5f2c357fbb49d1ce52db77a2709fb29ee22321f84a5734dc9914849bdfee9ad12ce8caf - languageName: node - linkType: hard - -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - regexpu-core: "npm:^6.1.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/3adc60a758febbf07d65a15eaccab1f7b9fcc55e7141e59122f13c9f81fc0d1cce4525b7f4af50285d27c93b34c859fd2c39c39820c5fb92211898c3bbdc77ef - languageName: node - linkType: hard - -"@babel/helper-define-polyfill-provider@npm:^0.6.2": - version: 0.6.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" - lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/f777fe0ee1e467fdaaac059c39ed203bdc94ef2465fb873316e9e1acfc511a276263724b061e3b0af2f6d7ad3ff174f2bb368fde236a860e0f650fda43d7e022 - languageName: node - linkType: hard - -"@babel/helper-member-expression-to-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/e08c7616f111e1fb56f398365e78858e26e466d4ac46dff25921adc5ccae9b232f66e952a2f4162bbe336627ba336c7fd9eca4835b6548935973d3380d77eaff - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-imports@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.25.7, @babel/helper-module-transforms@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-transforms@npm:7.25.9" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-simple-access": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/cd005e7585806845d79c5c0ca9e8926f186b430b0a558dad08a3611365eaad3ac587672b0d903530117dec454f48b6bdc3d164b19ea1b71ca1b4eb3be7b452ef - languageName: node - linkType: hard - -"@babel/helper-optimise-call-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" - dependencies: - "@babel/types": "npm:^7.25.9" - checksum: 10c0/90203e6607edeadd2a154940803fd616c0ed92c1013d6774c4b8eb491f1a5a3448b68faae6268141caa5c456e55e3ee49a4ed2bd7ddaf2365daea321c435914c - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.7, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.25.9 - resolution: "@babel/helper-plugin-utils@npm:7.25.9" - checksum: 10c0/483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d - languageName: node - linkType: hard - -"@babel/helper-remap-async-to-generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-wrap-function": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/6798b562f2788210980f29c5ee96056d90dc73458c88af5bd32f9c82e28e01975588aa2a57bb866c35556bd9b76bac937e824ee63ba472b6430224b91b4879e9 - languageName: node - linkType: hard - -"@babel/helper-replace-supers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-replace-supers@npm:7.25.9" - dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.25.9" - "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/0b40d7d2925bd3ba4223b3519e2e4d2456d471ad69aa458f1c1d1783c80b522c61f8237d3a52afc9e47c7174129bbba650df06393a6787d5722f2ec7f223c3f4 - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.25.7, @babel/helper-simple-access@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-simple-access@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/3f1bcdb88ee3883ccf86959869a867f6bbf8c4737cd44fb9f799c38e54f67474590bc66802500ae9fe18161792875b2cfb7ec15673f48ed6c8663f6d09686ca8 - languageName: node - linkType: hard - -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0, @babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/09ace0c6156961624ac9524329ce7f45350bab94bbe24335cbe0da7dfaa1448e658771831983cb83fe91cf6635b15d0a3cab57c03b92657480bfb49fb56dd184 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-string-parser@npm:7.25.9" - checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-option@npm:7.25.9" - checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e - languageName: node - linkType: hard - -"@babel/helper-wrap-function@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-wrap-function@npm:7.25.9" - dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/b6627d83291e7b80df020f8ee2890c52b8d49272962cac0114ef90f189889c90f1027985873d1b5261a4e986e109b2754292dc112392f0b1fcbfc91cc08bd003 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helpers@npm:7.25.9" - dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/4354fbf050291937d0f127f6f927a0c471b604524e0767516fefb91dc36427f25904dd0d2b2b3bbc66bce1894c680cc37eac9ab46970d70f24bf3e53375612de - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/highlight@npm:7.25.9" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/ae0ed93c151b85a07df42936117fa593ce91563a22dfc8944a90ae7088c9679645c33e00dcd20b081c1979665d65f986241172dae1fc9e5922692fc3ff685a49 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.18.9, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/parser@npm:7.25.9" - dependencies: - "@babel/types": "npm:^7.25.9" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/143faff8a72331be5ed94080e0f4645cbeea814fb488cd9210154083735f67cb66fde32f6a4a80efd6c4cdf12c6f8b50995a465846093c7f65c5da8d7829627c - languageName: node - linkType: hard - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/7aab47fcbb8c1ddc195a3cd66609edcad54c5022f018db7de40185f0182950389690e953e952f117a1737b72f665ff02ad30de6c02b49b97f1d8f4ccdffedc34 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/3a652b3574ca62775c5f101f8457950edc540c3581226579125da535d67765f41ad7f0e6327f8efeb2540a5dad5bb0c60a89fb934af3f67472e73fb63612d004 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/18fc9004104a150f9f5da9f3307f361bc3104d16778bb593b7523d5110f04a8df19a2587e6bdd5e726fb1d397191add45223f4f731bb556c33f14f2779d596e8 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.13.0 - checksum: 10c0/3f6c8781a2f7aa1791a31d2242399ca884df2ab944f90c020b6f112fb19f05fa6dad5be143d274dad1377e40415b63d24d5489faf5060b9c4a99e55d8f0c317c - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/02b365f0cc4df8b8b811c68697c93476da387841e5f153fe42766f34241b685503ea51110d5ed6df7132759820b93e48d9fa3743cffc091eed97c19f7e5fe272 - languageName: node - linkType: hard - -"@babel/plugin-proposal-class-properties@npm:^7.16.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.18.6" - "@babel/helper-plugin-utils": "npm:^7.18.6" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d5172ac6c9948cdfc387e94f3493ad86cb04035cf7433f86b5d358270b1b9752dc25e176db0c5d65892a246aca7bdb4636672e15626d7a7de4bc0bd0040168d9 - languageName: node - linkType: hard - -"@babel/plugin-proposal-decorators@npm:^7.16.4": - version: 7.25.9 - resolution: "@babel/plugin-proposal-decorators@npm:7.25.9" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/plugin-syntax-decorators": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d7d54644f50a60c47090d70121905ca76534bd7a837c03d25e163ca6ae384b48ef6dcfb125a99f12b3ce7e78e074a33f6fa8c4531c1a46aa31274153f587b05e - languageName: node - linkType: hard - -"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.16.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/f6629158196ee9f16295d16db75825092ef543f8b98f4dfdd516e642a0430c7b1d69319ee676d35485d9b86a53ade6de0b883490d44de6d4336d38cdeccbe0bf - languageName: node - linkType: hard - -"@babel/plugin-proposal-numeric-separator@npm:^7.16.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-numeric-separator@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.18.6" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/a83a65c6ec0d2293d830e9db61406d246f22d8ea03583d68460cb1b6330c6699320acce1b45f66ba3c357830720e49267e3d99f95088be457c66e6450fbfe3fa - languageName: node - linkType: hard - -"@babel/plugin-proposal-optional-chaining@npm:^7.16.0": - version: 7.21.0 - resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.20.0" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/b524a61b1de3f3ad287cd1e98c2a7f662178d21cd02205b0d615512e475f0159fa1b569fa7e34c8ed67baef689c0136fa20ba7d1bf058d186d30736a581a723f - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-methods@npm:^7.16.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-private-methods@npm:7.18.6" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.18.6" - "@babel/helper-plugin-utils": "npm:^7.18.6" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/1c273d0ec3d49d0fe80bd754ec0191016e5b3ab4fb1e162ac0c014e9d3c1517a5d973afbf8b6dc9f9c98a8605c79e5f9e8b5ee158a4313fa68d1ff7b02084b6a - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": - version: 7.21.0-placeholder-for-preset-env.2 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e605e0070da087f6c35579499e65801179a521b6842c15181a1e305c04fded2393f11c1efd09b087be7f8b083d1b75e8f3efcbc1292b4f60d3369e14812cff63 - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-property-in-object@npm:^7.16.7": - version: 7.21.11 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.11" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.18.6" - "@babel/helper-create-class-features-plugin": "npm:^7.21.0" - "@babel/helper-plugin-utils": "npm:^7.20.2" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/3c8c9ea175101b1cbb2b0e8fee20fcbdd03eb0700d3581aa826ac3573c9b002f39b1512c2af9fd1903ff921bcc864da95ad3cdeba53c9fbcfb3dc23916eacf47 - languageName: node - linkType: hard - -"@babel/plugin-syntax-decorators@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-decorators@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/47e44a7d61b76dac4f18fd61edc186012e084eb8f1fe253c483b0fe90b73366b4ebd2b0b03728e000fd1fdedc8af3aa6e93246caf97183a8d9d42a0eb57ecfcc - languageName: node - linkType: hard - -"@babel/plugin-syntax-flow@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-flow@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/322136c86f550da4d6eee31de79b13852555188cfe6662db57a6329588b5e57bba81bd9f9e7f1f40d27a81a5f901a353218bbd4134392ced6b4b5536708224e7 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-assertions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/f5a022b8a7f3585cf1586535224b06ae380983d3c14f7127b82792ef50cd8194047080540c8abec7aa8f8bfe7d774d71a1ee91f4fd3fa0277f7ffe2d3c6c4977 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-attributes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/bbdf97ba088c3d482492f6c3376422752b1723ce32e3ac11b000faf3c942d68e418c8a911431cb05d5e300d008cc37cd5518e89807a5813c2ac8fdd82d171f8d - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 - languageName: node - linkType: hard - -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 - languageName: node - linkType: hard - -"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.18.6" - "@babel/helper-plugin-utils": "npm:^7.18.6" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/9144e5b02a211a4fb9a0ce91063f94fbe1004e80bde3485a0910c9f14897cf83fabd8c21267907cff25db8e224858178df0517f14333cfcf3380ad9a4139cb50 - languageName: node - linkType: hard - -"@babel/plugin-transform-arrow-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/851fef9f58be60a80f46cc0ce1e46a6f7346a6f9d50fa9e0fa79d46ec205320069d0cc157db213e2bea88ef5b7d9bd7618bb83f0b1996a836e2426c3a3a1f622 - languageName: node - linkType: hard - -"@babel/plugin-transform-async-generator-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-remap-async-to-generator": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e3fcb9fc3d6ab6cbd4fcd956b48c17b5e92fe177553df266ffcd2b2c1f2f758b893e51b638e77ed867941e0436487d2b8b505908d615c41799241699b520dec6 - languageName: node - linkType: hard - -"@babel/plugin-transform-async-to-generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-remap-async-to-generator": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c443d9e462ddef733ae56360064f32fc800105803d892e4ff32d7d6a6922b3765fa97b9ddc9f7f1d3f9d8c2d95721d85bef9dbf507804214c6cf6466b105c168 - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoped-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e92ba0e3d72c038513844d8fca1cc8437dcb35cd42778e97fd03cb8303380b201468611e7ecfdcae3de33473b2679fe2de1552c5f925d112c5693425cf851f10 - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoping@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/a76e30becb6c75b4d87a2cd53556fddb7c88ddd56bfadb965287fd944810ac159aa8eb5705366fc37336041f63154ed9fab3862fb10482a45bf5ede63fd55fda - languageName: node - linkType: hard - -"@babel/plugin-transform-class-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/f0603b6bd34d8ba62c03fc0572cb8bbc75874d097ac20cc7c5379e001081210a84dba1749e7123fca43b978382f605bb9973c99caf2c5b4c492d5c0a4a441150 - languageName: node - linkType: hard - -"@babel/plugin-transform-class-static-block@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-class-static-block@npm:7.25.9" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 10c0/696a3a8acde79d6fee4f685ee1353bf483c4cd50a38e586a1a044268df72d87f9b1a3b7c473def6cde836aa69931fd5a75560bb9ee3a635ebde8911575ed49ca - languageName: node - linkType: hard - -"@babel/plugin-transform-classes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-classes@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - globals: "npm:^11.1.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/02742ea7cd25be286c982e672619effca528d7a931626a6f3d6cea11852951b7ee973276127eaf6418ac0e18c4d749a16b520709c707e86a67012bd23ff2927d - languageName: node - linkType: hard - -"@babel/plugin-transform-computed-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/template": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/948c0ae3ce0ba2375241d122a9bc7cda4a7ac8110bd8a62cd804bc46a5fdb7a7a42c7799c4cd972e14e0a579d2bd0999b92e53177b73f240bb0d4b09972c758b - languageName: node - linkType: hard - -"@babel/plugin-transform-destructuring@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/7beec5fda665d108f69d5023aa7c298a1e566b973dd41290faa18aeea70f6f571295c1ece0a058f3ceb6c6c96de76de7cd34f5a227fbf09a1b8d8a735d28ca49 - languageName: node - linkType: hard - -"@babel/plugin-transform-dotall-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/7c3471ae5cf7521fd8da5b03e137e8d3733fc5ee4524ce01fb0c812f0bb77cb2c9657bc8a6253186be3a15bb4caa8974993c7ddc067f554ecc6a026f0a3b5e12 - languageName: node - linkType: hard - -"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d0c74894b9bf6ff2a04189afffb9cd43d87ebd7b7943e51a827c92d2aaa40fa89ac81565a2fd6fbeabf9e38413a9264c45862eee2b017f1d49046cc3c8ff06b4 - languageName: node - linkType: hard - -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/a8039a6d2b90e011c7b30975edee47b5b1097cf3c2f95ec1f5ddd029898d783a995f55f7d6eb8d6bb8873c060fb64f9f1ccba938dfe22d118d09cf68e0cd3bf6 - languageName: node - linkType: hard - -"@babel/plugin-transform-dynamic-import@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5e643a8209072b668350f5788f23c64e9124f81f958b595c80fecca6561086d8ef346c04391b9e5e4cad8b8cbe22c258f0cd5f4ea89b97e74438e7d1abfd98cf - languageName: node - linkType: hard - -"@babel/plugin-transform-exponentiation-operator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.25.9" - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/3b42f65bab3fee28c385115ce6bcb6ba544dff187012df408a432c9fb44c980afd898911020c723dc1c9257aaf3d7d0131ad83ba15102bf30ad9a86fc2a8a912 - languageName: node - linkType: hard - -"@babel/plugin-transform-export-namespace-from@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/f291ea2ec5f36de9028a00cbd5b32f08af281b8183bf047200ff001f4cb260be56f156b2449f42149448a4a033bd6e86a3a7f06d0c2825532eb0ae6b03058dfb - languageName: node - linkType: hard - -"@babel/plugin-transform-flow-strip-types@npm:^7.16.0": - version: 7.25.9 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/plugin-syntax-flow": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d4b79769a5b8bfc1a0766ed2158417e7efa53cdb5776161f641a642019c0822a1288f2ccd36c16a4bca77c64ccf1bab7e36aa1419adc417606acc6eddc126339 - languageName: node - linkType: hard - -"@babel/plugin-transform-for-of@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-for-of@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/bf11abc71934a1f369f39cd7a33cf3d4dc5673026a53f70b7c1238c4fcc44e68b3ca1bdbe3db2076f60defb6ffe117cbe10b90f3e1a613b551d88f7c4e693bbe - languageName: node - linkType: hard - -"@babel/plugin-transform-function-name@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-function-name@npm:7.25.9" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8e67fbd1dd367927b8b6afdf0a6e7cb3a3fd70766c52f700ca77428b6d536f6c9d7ec643e7762d64b23093233765c66bffa40e31aabe6492682879bcb45423e1 - languageName: node - linkType: hard - -"@babel/plugin-transform-json-strings@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/00bc2d4751dfc9d44ab725be16ee534de13cfd7e77dfb386e5dac9e48101ce8fcbc5971df919dc25b3f8a0fa85d6dc5f2a0c3cf7ec9d61c163d9823c091844f0 - languageName: node - linkType: hard - -"@babel/plugin-transform-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-literals@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/00b14e9c14cf1e871c1f3781bf6334cac339c360404afd6aba63d2f6aca9270854d59a2b40abff1c4c90d4ffdca614440842d3043316c2f0ceb155fdf7726b3b - languageName: node - linkType: hard - -"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/6e2051e10b2d6452980fc4bdef9da17c0d6ca48f81b8529e8804b031950e4fff7c74a7eb3de4a2b6ad22ffb631d0b67005425d232cce6e2b29ce861c78ed04f5 - languageName: node - linkType: hard - -"@babel/plugin-transform-member-expression-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/91d17b451bcc5ea9f1c6f8264144057ade3338d4b92c0b248366e4db3a7790a28fd59cc56ac433a9627a9087a17a5684e53f4995dd6ae92831cb72f1bd540b54 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-amd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" - dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/849957d9484d0a2d93331226ed6cf840cee7d57454549534c447c93f8b839ef8553eae9877f8f550e3c39f14d60992f91244b2e8e7502a46064b56c5d68ba855 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-commonjs@npm:7.25.7": - version: 7.25.7 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.25.7" - dependencies: - "@babel/helper-module-transforms": "npm:^7.25.7" - "@babel/helper-plugin-utils": "npm:^7.25.7" - "@babel/helper-simple-access": "npm:^7.25.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2f1c945fc3c9b690b0ddcf2c80156b2e4fbf2cf15aac43ac8fe6e4b34125869528839a53d07c564e62e4aed394ebdc1d2c3b796b547374455522581c11b7599c - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-commonjs@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.25.9" - dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-simple-access": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/6ce771fb04d4810257fc8900374fece877dacaed74b05eaa16ad9224b390f43795c4d046cbe9ae304e1eb5aad035d37383895e3c64496d647c2128d183916e74 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" - dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8299e3437542129c2684b86f98408c690df27db4122a79edded4782cf04e755d6ecb05b1e812c81a34224a81e664303392d5f3c36f3d2d51fdc99bb91c881e9a - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-umd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" - dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/fa11a621f023e2ac437b71d5582f819e667c94306f022583d77da9a8f772c4128861a32bbb63bef5cba581a70cd7dbe87a37238edaafcfacf889470c395e7076 - languageName: node - linkType: hard - -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/32b14fda5c885d1706863f8af2ee6c703d39264355b57482d3a24fce7f6afbd4c7a0896e501c0806ed2b0759beb621bf7f3f7de1fbbc82026039a98d961e78ef - languageName: node - linkType: hard - -"@babel/plugin-transform-new-target@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-new-target@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/7b5f1b7998f1cf183a7fa646346e2f3742e5805b609f28ad5fee22d666a15010f3e398b7e1ab78cddb7901841a3d3f47135929af23d54e8bf4ce69b72051f71e - languageName: node - linkType: hard - -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/eb623db5be078a1c974afe7c7797b0309ba2ea9e9237c0b6831ade0f56d8248bb4ab3432ab34495ff8c877ec2fe412ff779d1e9b3c2b8139da18e1753d950bc3 - languageName: node - linkType: hard - -"@babel/plugin-transform-numeric-separator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/ad63ad341977844b6f9535fcca15ca0d6d6ad112ed9cc509d4f6b75e9bf4b1b1a96a0bcb1986421a601505d34025373608b5f76d420d924b4e21f86b1a1f2749 - languageName: node - linkType: hard - -"@babel/plugin-transform-object-rest-spread@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/plugin-transform-parameters": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/02077d8abd83bf6a48ff0b59e98d7561407cf75b591cffd3fdc5dc5e9a13dec1c847a7a690983762a3afecddb244831e897e0515c293e7c653b262c30cd614af - languageName: node - linkType: hard - -"@babel/plugin-transform-object-super@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-super@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/0348d00e76f1f15ada44481a76e8c923d24cba91f6e49ee9b30d6861eb75344e7f84d62a18df8a6f9e9a7eacf992f388174b7f9cc4ce48287bcefca268c07600 - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/722fd5ee12ab905309d4e84421584fce4b6d9e6b639b06afb20b23fa809e6ab251e908a8d5e8b14d066a28186b8ef8f58d69fd6eca9ce1b9ef7af08333378f6c - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/041ad2beae5affb8e68a0bcb6882a2dadb758db3c629a0e012f57488ab43a822ac1ea17a29db8ef36560a28262a5dfa4dbbbf06ed6e431db55abe024b7cd3961 - languageName: node - linkType: hard - -"@babel/plugin-transform-parameters@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-parameters@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/aecb446754b9e09d6b6fa95fd09e7cf682f8aaeed1d972874ba24c0a30a7e803ad5f014bb1fffc7bfeed22f93c0d200947407894ea59bf7687816f2f464f8df3 - languageName: node - linkType: hard - -"@babel/plugin-transform-private-methods@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/64bd71de93d39daefa3e6c878d6f2fd238ed7d4ecfb13b0e771ddbbc131487def3ceb405b62b534a5cbb5043046b504e1b189b0a45229cc75af979a9fbcaa7bd - languageName: node - linkType: hard - -"@babel/plugin-transform-private-property-in-object@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d4965de19d9f204e692cc74dbc39f0bb469e5f29df96dd4457ea23c5e5596fba9d5af76eaa96f9d48a9fc20ec5f12a94c679285e36b8373406868ea228109e27 - languageName: node - linkType: hard - -"@babel/plugin-transform-property-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/1639e35b2438ccf3107af760d34e6a8e4f9acdd3ae6186ae771a6e3029bd59dfe778e502d67090f1185ecda5c16addfed77561e39c518a3f51ff10d41790e106 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-display-name@npm:^7.16.0, @babel/plugin-transform-react-display-name@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/63a0f962d64e71baf87c212755419e25c637d2d95ea6fdc067df26b91e606ae186442ae815b99a577eca9bf5404d9577ecad218a3cf42d0e9e286ca7b003a992 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-development@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.9" - dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c0b92ff9eb029620abf320ff74aae182cea87524723d740fb48a4373d0d16bddf5edbe1116e7ba341332a5337e55c2ceaee8b8cad5549e78af7f4b3cfe77debb - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-self@npm:^7.24.5": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/ce0e289f6af93d7c4dc6b385512199c5bb138ae61507b4d5117ba88b6a6b5092f704f1bdf80080b7d69b1b8c36649f2a0b250e8198667d4d30c08bbb1546bd99 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-source@npm:^7.24.1": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/fc9ee08efc9be7cbd2cc6788bbf92579adf3cab37912481f1b915221be3d22b0613b5b36a721df5f4c0ab65efe8582fcf8673caab83e6e1ce4cc04ceebf57dfa - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx@npm:^7.25.9": +"@babel/generator@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" + resolution: "@babel/generator@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/plugin-syntax-jsx": "npm:^7.25.9" "@babel/types": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5c9947e8ed141f7606f54da3e05eea1074950c5b8354c39df69cb7f43cb5a83c6c9d7973b24bc3d89341c8611f8ad50830a98ab10d117d850e6bdd8febdce221 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-pure-annotations@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/7c8eac04644ad19dcd71bb8e949b0ae22b9e548fa4a58e545d3d0342f647fb89db7f8789a7c5b8074d478ce6d3d581eaf47dd4b36027e16fd68211c383839abc - languageName: node - linkType: hard - -"@babel/plugin-transform-regenerator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-regenerator@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - regenerator-transform: "npm:^0.15.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/eef3ffc19f7d291b863635f32b896ad7f87806d9219a0d3404a470219abcfc5b43aabecd691026c48e875b965760d9c16abee25e6447272233f30cd07f453ec7 - languageName: node - linkType: hard - -"@babel/plugin-transform-reserved-words@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8b028b80d1983e3e02f74e21924323cc66ba930e5c5758909a122aa7d80e341b8b0f42e1698e42b50d47a6ba911332f584200b28e1a4e2104b7514d9dc011e96 + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/fca49a1440ac550bb835a73c0e8314849cd493a468a5431ca7f9dbb3d3443e3a1a6dcba2426752e8a97cc2feed4a3b7a0c639e1c45871c4a9dd0c994f08dd25a languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.16.4": +"@babel/helper-compilation-targets@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-runtime@npm:7.25.9" + resolution: "@babel/helper-compilation-targets@npm:7.25.9" dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.6" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" + "@babel/compat-data": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/888a4998ba0a2313de347954c9a8dfeccbff0633c69d33aee385b8878eba2b429dbfb00c3cc04f6bca454b9be8afa01ebbd73defb7fbbb6e2d3086205c07758b - languageName: node - linkType: hard - -"@babel/plugin-transform-shorthand-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/05a20d45f0fb62567644c507ccd4e379c1a74dacf887d2b2cac70247415e3f6d7d3bf4850c8b336053144715fedb6200fc38f7130c4b76c94eec9b9c0c2a8e9b + checksum: 10c0/a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.25.9": +"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-spread@npm:7.25.9" + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/996c8fed238efc30e0664f9f58bd7ec8c148f4659f84425f68923a094fe891245711d26eb10d1f815f50c124434e076e860dbe9662240844d1b77cd09907dcdf + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.25.9": +"@babel/helper-module-transforms@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" + resolution: "@babel/helper-module-transforms@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-simple-access": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e9612b0615dab4c4fba1c560769616a9bd7b9226c73191ef84b6c3ee185c8b719b4f887cdd8336a0a13400ce606ab4a0d33bc8fa6b4fcdb53e2896d07f2568f6 + "@babel/core": ^7.0.0 + checksum: 10c0/cd005e7585806845d79c5c0ca9e8926f186b430b0a558dad08a3611365eaad3ac587672b0d903530117dec454f48b6bdc3d164b19ea1b71ca1b4eb3be7b452ef languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.25.9": +"@babel/helper-plugin-utils@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-template-literals@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5144da6036807bbd4e9d2a8b92ae67a759543929f34f4db9b463448a77298f4a40bf1e92e582db208fe08ee116224806a3bd0bed75d9da404fc2c0af9e6da540 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 10c0/483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.25.9": +"@babel/helper-simple-access@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.25.9" + resolution: "@babel/helper-simple-access@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2b19fd88608589d9bc6b607ff17b06791d35c67ef3249f4659283454e6a9984241e3bd4c4eb72bb8b3d860a73223f3874558b861adb7314aa317c1c6a2f0cafb + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/3f1bcdb88ee3883ccf86959869a867f6bbf8c4737cd44fb9f799c38e54f67474590bc66802500ae9fe18161792875b2cfb7ec15673f48ed6c8663f6d09686ca8 languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.25.9": +"@babel/helper-string-parser@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-typescript@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/plugin-syntax-typescript": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c607ddb45f7e33cfcb928aad05cb1b18b1ecb564d2329d8f8e427f75192511aa821dee42d26871f1bdffbd883853e150ba81436664646c6e6b13063e65ce1475 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": +"@babel/helper-validator-identifier@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/615c84d7c53e1575d54ba9257e753e0b98c5de1e3225237d92f55226eaab8eb5bceb74df43f50f4aa162b0bbcc934ed11feafe2b60b8ec4934ce340fad4b8828 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": +"@babel/helper-validator-option@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/1685836fc38af4344c3d2a9edbd46f7c7b28d369b63967d5b83f2f6849ec45b97223461cea3d14cc3f0be6ebb284938e637a5ca3955c0e79c873d62f593d615c + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.25.9": +"@babel/helpers@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" + resolution: "@babel/helpers@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/448004f978279e726af26acd54f63f9002c9e2582ecd70d1c5c4436f6de490fcd817afb60016d11c52f5ef17dbaac2590e8cc7bfaf4e91b58c452cf188c7920f + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/4354fbf050291937d0f127f6f927a0c471b604524e0767516fefb91dc36427f25904dd0d2b2b3bbc66bce1894c680cc37eac9ab46970d70f24bf3e53375612de languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": +"@babel/highlight@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" + resolution: "@babel/highlight@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/56ee04fbe236b77cbcd6035cbf0be7566d1386b8349154ac33244c25f61170c47153a9423cd1d92855f7d6447b53a4a653d9e8fd1eaeeee14feb4b2baf59bd9f + "@babel/helper-validator-identifier": "npm:^7.25.9" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/ae0ed93c151b85a07df42936117fa593ce91563a22dfc8944a90ae7088c9679645c33e00dcd20b081c1979665d65f986241172dae1fc9e5922692fc3ff685a49 languageName: node linkType: hard -"@babel/preset-env@npm:^7.16.4": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.18.9, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/preset-env@npm:7.25.9" - dependencies: - "@babel/compat-data": "npm:^7.25.9" - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-validator-option": "npm:^7.25.9" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.9" - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.9" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.9" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.9" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.9" - "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions": "npm:^7.25.9" - "@babel/plugin-syntax-import-attributes": "npm:^7.25.9" - "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.25.9" - "@babel/plugin-transform-async-generator-functions": "npm:^7.25.9" - "@babel/plugin-transform-async-to-generator": "npm:^7.25.9" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.25.9" - "@babel/plugin-transform-block-scoping": "npm:^7.25.9" - "@babel/plugin-transform-class-properties": "npm:^7.25.9" - "@babel/plugin-transform-class-static-block": "npm:^7.25.9" - "@babel/plugin-transform-classes": "npm:^7.25.9" - "@babel/plugin-transform-computed-properties": "npm:^7.25.9" - "@babel/plugin-transform-destructuring": "npm:^7.25.9" - "@babel/plugin-transform-dotall-regex": "npm:^7.25.9" - "@babel/plugin-transform-duplicate-keys": "npm:^7.25.9" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.9" - "@babel/plugin-transform-dynamic-import": "npm:^7.25.9" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.25.9" - "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" - "@babel/plugin-transform-for-of": "npm:^7.25.9" - "@babel/plugin-transform-function-name": "npm:^7.25.9" - "@babel/plugin-transform-json-strings": "npm:^7.25.9" - "@babel/plugin-transform-literals": "npm:^7.25.9" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.9" - "@babel/plugin-transform-member-expression-literals": "npm:^7.25.9" - "@babel/plugin-transform-modules-amd": "npm:^7.25.9" - "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9" - "@babel/plugin-transform-modules-systemjs": "npm:^7.25.9" - "@babel/plugin-transform-modules-umd": "npm:^7.25.9" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.9" - "@babel/plugin-transform-new-target": "npm:^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.25.9" - "@babel/plugin-transform-numeric-separator": "npm:^7.25.9" - "@babel/plugin-transform-object-rest-spread": "npm:^7.25.9" - "@babel/plugin-transform-object-super": "npm:^7.25.9" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.9" - "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" - "@babel/plugin-transform-parameters": "npm:^7.25.9" - "@babel/plugin-transform-private-methods": "npm:^7.25.9" - "@babel/plugin-transform-private-property-in-object": "npm:^7.25.9" - "@babel/plugin-transform-property-literals": "npm:^7.25.9" - "@babel/plugin-transform-regenerator": "npm:^7.25.9" - "@babel/plugin-transform-reserved-words": "npm:^7.25.9" - "@babel/plugin-transform-shorthand-properties": "npm:^7.25.9" - "@babel/plugin-transform-spread": "npm:^7.25.9" - "@babel/plugin-transform-sticky-regex": "npm:^7.25.9" - "@babel/plugin-transform-template-literals": "npm:^7.25.9" - "@babel/plugin-transform-typeof-symbol": "npm:^7.25.9" - "@babel/plugin-transform-unicode-escapes": "npm:^7.25.9" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.9" - "@babel/plugin-transform-unicode-regex": "npm:^7.25.9" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.9" - "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.6" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.38.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/b8b391e3fe69918a2a4f4366034113bd6f57c9748974dbe1b807a728bc41434f1e003cb4204ca63a2a01cbb7c05ba96036261b64756243374374353931d346e6 - languageName: node - linkType: hard - -"@babel/preset-modules@npm:0.1.6-no-external-plugins": - version: 0.1.6-no-external-plugins - resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" + resolution: "@babel/parser@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@babel/types": "npm:^7.4.4" - esutils: "npm:^2.0.2" - peerDependencies: - "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/9d02f70d7052446c5f3a4fb39e6b632695fb6801e46d31d7f7c5001f7c18d31d1ea8369212331ca7ad4e7877b73231f470b0d559162624128f1b80fe591409e6 + "@babel/types": "npm:^7.25.9" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/143faff8a72331be5ed94080e0f4645cbeea814fb488cd9210154083735f67cb66fde32f6a4a80efd6c4cdf12c6f8b50995a465846093c7f65c5da8d7829627c languageName: node linkType: hard -"@babel/preset-react@npm:^7.16.0": +"@babel/plugin-transform-react-jsx-self@npm:^7.24.5": version: 7.25.9 - resolution: "@babel/preset-react@npm:7.25.9" + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" dependencies: "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-validator-option": "npm:^7.25.9" - "@babel/plugin-transform-react-display-name": "npm:^7.25.9" - "@babel/plugin-transform-react-jsx": "npm:^7.25.9" - "@babel/plugin-transform-react-jsx-development": "npm:^7.25.9" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c294b475ee741f01f63ea0d828862811c453fabc6023f01814ce983bc316388e9d73290164d2b1384c2684db9c330803a3d4d2170285b105dcbacd483329eb93 + checksum: 10c0/ce0e289f6af93d7c4dc6b385512199c5bb138ae61507b4d5117ba88b6a6b5092f704f1bdf80080b7d69b1b8c36649f2a0b250e8198667d4d30c08bbb1546bd99 languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.16.0": +"@babel/plugin-transform-react-jsx-source@npm:^7.24.1": version: 7.25.9 - resolution: "@babel/preset-typescript@npm:7.25.9" + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" dependencies: "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-validator-option": "npm:^7.25.9" - "@babel/plugin-syntax-jsx": "npm:^7.25.9" - "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9" - "@babel/plugin-transform-typescript": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cbcc5b4bf2891e367627338961113febbe58d361e9a03bd2c8340ede914870f74db35ee367cfd8d0fca0872149bfb58b090d0a4815de7c05d0a8abb3d961eead + checksum: 10c0/fc9ee08efc9be7cbd2cc6788bbf92579adf3cab37912481f1b915221be3d22b0613b5b36a721df5f4c0ab65efe8582fcf8673caab83e6e1ce4cc04ceebf57dfa languageName: node linkType: hard -"@babel/runtime@npm:^7.10.0, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.6, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.19.4, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.10.0, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.6, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.19.4, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.25.9 resolution: "@babel/runtime@npm:7.25.9" dependencies: @@ -1467,7 +241,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9": version: 7.25.9 resolution: "@babel/types@npm:7.25.9" dependencies: @@ -1968,6 +742,34 @@ __metadata: languageName: node linkType: hard +"@emnapi/core@npm:^1.1.0": + version: 1.3.1 + resolution: "@emnapi/core@npm:1.3.1" + dependencies: + "@emnapi/wasi-threads": "npm:1.0.1" + tslib: "npm:^2.4.0" + checksum: 10c0/d3be1044ad704e2c486641bc18908523490f28c7d38bd12d9c1d4ce37d39dae6c4aecd2f2eaf44c6e3bd90eaf04e0591acc440b1b038cdf43cce078a355a0ea0 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.1.0": + version: 1.3.1 + resolution: "@emnapi/runtime@npm:1.3.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/060ffede50f1b619c15083312b80a9e62a5b0c87aa8c1b54854c49766c9d69f8d1d3d87bd963a647071263a320db41b25eaa50b74d6a80dcc763c23dbeaafd6c + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.0.1": + version: 1.0.1 + resolution: "@emnapi/wasi-threads@npm:1.0.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/1e0c8036b8d53e9b07cc9acf021705ef6c86ab6b13e1acda7fffaf541a2d3565072afb92597419173ced9ea14f6bf32fce149106e669b5902b825e8b499e5c6c + languageName: node + linkType: hard + "@emotion/babel-plugin@npm:^11.12.0": version: 11.12.0 resolution: "@emotion/babel-plugin@npm:11.12.0" @@ -2454,14 +1256,39 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.10.0": version: 4.11.1 resolution: "@eslint-community/regexpp@npm:4.11.1" checksum: 10c0/fbcc1cb65ef5ed5b92faa8dc542e035269065e7ebcc0b39c81a4fe98ad35cfff20b3c8df048641de15a7757e07d69f85e2579c1a5055f993413ba18c055654f8 languageName: node linkType: hard -"@eslint/eslintrc@npm:3.1.0": +"@eslint-community/regexpp@npm:^4.11.0": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.18.0": + version: 0.18.0 + resolution: "@eslint/config-array@npm:0.18.0" + dependencies: + "@eslint/object-schema": "npm:^2.1.4" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/0234aeb3e6b052ad2402a647d0b4f8a6aa71524bafe1adad0b8db1dfe94d7f5f26d67c80f79bb37ac61361a1d4b14bb8fb475efe501de37263cf55eabb79868f + languageName: node + linkType: hard + +"@eslint/core@npm:^0.7.0": + version: 0.7.0 + resolution: "@eslint/core@npm:0.7.0" + checksum: 10c0/3cdee8bc6cbb96ac6103d3ead42e59830019435839583c9eb352b94ed558bd78e7ffad5286dc710df21ec1e7bd8f52aa6574c62457a4dd0f01f3736fa4a7d87a + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.1.0": version: 3.1.0 resolution: "@eslint/eslintrc@npm:3.1.0" dependencies: @@ -2478,27 +1305,26 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": +"@eslint/js@npm:9.13.0": + version: 9.13.0 + resolution: "@eslint/js@npm:9.13.0" + checksum: 10c0/672257bffe17777b8a98bd80438702904cc7a0b98b9c2e426a8a10929198b3553edf8a3fc20feed4133c02e7c8f7331a0ef1b23e5dab8e4469f7f1791beff1e0 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.4": version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" - dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + resolution: "@eslint/object-schema@npm:2.1.4" + checksum: 10c0/e9885532ea70e483fb007bf1275968b05bb15ebaa506d98560c41a41220d33d342e19023d5f2939fed6eb59676c1bda5c847c284b4b55fce521d282004da4dda languageName: node linkType: hard -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 +"@eslint/plugin-kit@npm:^0.2.0": + version: 0.2.2 + resolution: "@eslint/plugin-kit@npm:0.2.2" + dependencies: + levn: "npm:^0.4.1" + checksum: 10c0/ec533ccc99f2ab003d6f64495cff853730fb7d8bc0eaf031ffccc68de7c34c74a2eda50dfa759cacfb409f014c98d306714c995348d5383c9d3140f9f80a5895 languageName: node linkType: hard @@ -2713,14 +1539,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.13.0": - version: 0.13.0 - resolution: "@humanwhocodes/config-array@npm:0.13.0" +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.5": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.3" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 languageName: node linkType: hard @@ -2731,10 +1563,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.3": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c +"@humanwhocodes/retry@npm:^0.3.0, @humanwhocodes/retry@npm:^0.3.1": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b languageName: node linkType: hard @@ -3156,12 +1988,14 @@ __metadata: languageName: node linkType: hard -"@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": - version: 5.1.1-v1 - resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" +"@napi-rs/wasm-runtime@npm:^0.2.4": + version: 0.2.5 + resolution: "@napi-rs/wasm-runtime@npm:0.2.5" dependencies: - eslint-scope: "npm:5.1.1" - checksum: 10c0/75dda3e623b8ad7369ca22552d6beee337a814b2d0e8a32d23edd13fcb65c8082b32c5d86e436f3860dd7ade30d91d5db55d4ef9a08fb5a976c718ecc0d88a74 + "@emnapi/core": "npm:^1.1.0" + "@emnapi/runtime": "npm:^1.1.0" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10c0/32ea8defd3cc380bcf0de6ffc39a3b9cbe746f6c64000e0f0996a96dc776a7e87df7efeba5ce94e53d8b0ff2cda42f5a54673bdfeedbe8f037426255aba853f7 languageName: node linkType: hard @@ -3182,7 +2016,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -3234,6 +2068,85 @@ __metadata: languageName: node linkType: hard +"@oxc-resolver/binding-darwin-arm64@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-darwin-arm64@npm:1.12.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-x64@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-darwin-x64@npm:1.12.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-freebsd-x64@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-freebsd-x64@npm:1.12.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.12.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-gnu@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:1.12.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-musl@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:1.12.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-gnu@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:1.12.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-musl@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-linux-x64-musl@npm:1.12.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-wasm32-wasi@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-wasm32-wasi@npm:1.12.0" + dependencies: + "@napi-rs/wasm-runtime": "npm:^0.2.4" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-arm64-msvc@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:1.12.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-x64-msvc@npm:1.12.0": + version: 1.12.0 + resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:1.12.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -3408,79 +2321,18 @@ __metadata: languageName: node linkType: hard -"@rushstack/eslint-patch@npm:^1.1.0": - version: 1.10.4 - resolution: "@rushstack/eslint-patch@npm:1.10.4" - checksum: 10c0/de312bd7a3cb0f313c9720029eb719d8762fe54946cce2d33ac142b1cbb5817c4a5a92518dfa476c26311602d37f5a8f7caa90a0c73e3d6a56f9a05d2799c172 - languageName: node - linkType: hard - -"@stylistic/eslint-plugin-js@npm:1.8.1, @stylistic/eslint-plugin-js@npm:^1.8.1": - version: 1.8.1 - resolution: "@stylistic/eslint-plugin-js@npm:1.8.1" - dependencies: - "@types/eslint": "npm:^8.56.10" - acorn: "npm:^8.11.3" - escape-string-regexp: "npm:^4.0.0" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - peerDependencies: - eslint: ">=8.40.0" - checksum: 10c0/0f5aa5f4afd0a0120a7675f5f0abb2d6fc5ee6197390613a69dcf510644964f1eb8ef8c060be2cf8c1885863a507bdf42e74954f886dca4102e49acfee50c577 - languageName: node - linkType: hard - -"@stylistic/eslint-plugin-jsx@npm:1.8.1": - version: 1.8.1 - resolution: "@stylistic/eslint-plugin-jsx@npm:1.8.1" +"@stylistic/eslint-plugin@npm:2.9.0": + version: 2.9.0 + resolution: "@stylistic/eslint-plugin@npm:2.9.0" dependencies: - "@stylistic/eslint-plugin-js": "npm:^1.8.1" - "@types/eslint": "npm:^8.56.10" + "@typescript-eslint/utils": "npm:^8.8.0" + eslint-visitor-keys: "npm:^4.1.0" + espree: "npm:^10.2.0" estraverse: "npm:^5.3.0" picomatch: "npm:^4.0.2" peerDependencies: eslint: ">=8.40.0" - checksum: 10c0/3bf9a543c1dc661bbe1fb939a46a8cc9543f8c2fbd53b39c05861e042e28c7483cf318152c5cbf1dbc6022e0e211375931f707c5d9a7a63f83a74f857f7b28b4 - languageName: node - linkType: hard - -"@stylistic/eslint-plugin-plus@npm:1.8.1": - version: 1.8.1 - resolution: "@stylistic/eslint-plugin-plus@npm:1.8.1" - dependencies: - "@types/eslint": "npm:^8.56.10" - "@typescript-eslint/utils": "npm:^6.21.0" - peerDependencies: - eslint: "*" - checksum: 10c0/644cf23179b69df12bc798357ae0193eed2dd68a6e5e8dd11f5c8ecad0898eb58b5dac68fafd31c52b852b0800cb21ce457397d4d94cb60549311283540a2dd4 - languageName: node - linkType: hard - -"@stylistic/eslint-plugin-ts@npm:1.8.1": - version: 1.8.1 - resolution: "@stylistic/eslint-plugin-ts@npm:1.8.1" - dependencies: - "@stylistic/eslint-plugin-js": "npm:1.8.1" - "@types/eslint": "npm:^8.56.10" - "@typescript-eslint/utils": "npm:^6.21.0" - peerDependencies: - eslint: ">=8.40.0" - checksum: 10c0/1bd0bb220998b7ebd3a7e788b8bafc6674291160604825eea547cfd1a9530b02777ffe5775ddce932388044d7e932c9693be8c30fa989b03ee0ddf98ebc3d40d - languageName: node - linkType: hard - -"@stylistic/eslint-plugin@npm:1.8.1": - version: 1.8.1 - resolution: "@stylistic/eslint-plugin@npm:1.8.1" - dependencies: - "@stylistic/eslint-plugin-js": "npm:1.8.1" - "@stylistic/eslint-plugin-jsx": "npm:1.8.1" - "@stylistic/eslint-plugin-plus": "npm:1.8.1" - "@stylistic/eslint-plugin-ts": "npm:1.8.1" - "@types/eslint": "npm:^8.56.10" - peerDependencies: - eslint: ">=8.40.0" - checksum: 10c0/036e4e9dcc4674810bd36b22404234b6a34b79b762fe8275470916ce5a3d3b10e5ef9ba86fb786fcbb39b801a6757079915c1cdd57d07c88ed472fdff5192cc4 + checksum: 10c0/334e15502732961032355fabecf8eb03652f9e0cfea5bcb8c975402796625762de10d32b43c1e5b28c0cb1772cdbbc6f2c765e9f7bffb9170d579fe4e9f013ab languageName: node linkType: hard @@ -3521,6 +2373,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d + languageName: node + linkType: hard + "@types/aria-query@npm:^5.0.1": version: 5.0.4 resolution: "@types/aria-query@npm:5.0.4" @@ -3636,13 +2497,22 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:^8.56.10": - version: 8.56.12 - resolution: "@types/eslint@npm:8.56.12" +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" dependencies: "@types/estree": "npm:*" "@types/json-schema": "npm:*" - checksum: 10c0/e4ca426abe9d55f82b69a3250bec78b6d340ad1e567f91c97ecc59d3b2d6a1d8494955ac62ad0ea14b97519db580611c02be8277cbea370bdfb0f96aa2910504 + checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e + languageName: node + linkType: hard + +"@types/eslint__js@npm:8.42.3": + version: 8.42.3 + resolution: "@types/eslint__js@npm:8.42.3" + dependencies: + "@types/eslint": "npm:*" + checksum: 10c0/ccc5180b92155929a089ffb03ed62625216dcd5e46dd3197c6f82370ce8b52c7cb9df66c06b0a3017995409e023bc9eafe5a3f009e391960eacefaa1b62d9a56 languageName: node linkType: hard @@ -3655,7 +2525,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5, @types/estree@npm:^1.0.6": version: 1.0.6 resolution: "@types/estree@npm:1.0.6" checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a @@ -3709,7 +2579,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.8": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -3883,13 +2753,6 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa - languageName: node - linkType: hard - "@types/swagger-schema-official@npm:^2.0.25": version: 2.0.25 resolution: "@types/swagger-schema-official@npm:2.0.25" @@ -3925,229 +2788,123 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.18.0" +"@typescript-eslint/eslint-plugin@npm:8.11.0": + version: 8.11.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.11.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/type-utils": "npm:7.18.0" - "@typescript-eslint/utils": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" + "@typescript-eslint/scope-manager": "npm:8.11.0" + "@typescript-eslint/type-utils": "npm:8.11.0" + "@typescript-eslint/utils": "npm:8.11.0" + "@typescript-eslint/visitor-keys": "npm:8.11.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^1.3.0" peerDependencies: - "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.56.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/2b37948fa1b0dab77138909dabef242a4d49ab93e4019d4ef930626f0a7d96b03e696cd027fa0087881c20e73be7be77c942606b4a76fa599e6b37f6985304c3 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^5.5.0": - version: 5.62.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" - dependencies: - "@eslint-community/regexpp": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/type-utils": "npm:5.62.0" - "@typescript-eslint/utils": "npm:5.62.0" - debug: "npm:^4.3.4" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.0" - natural-compare-lite: "npm:^1.4.0" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/3f40cb6bab5a2833c3544e4621b9fdacd8ea53420cadc1c63fac3b89cdf5c62be1e6b7bcf56976dede5db4c43830de298ced3db60b5494a3b961ca1b4bff9f2a - languageName: node - linkType: hard - -"@typescript-eslint/experimental-utils@npm:^5.0.0": - version: 5.62.0 - resolution: "@typescript-eslint/experimental-utils@npm:5.62.0" - dependencies: - "@typescript-eslint/utils": "npm:5.62.0" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/f7037977e00849cd8c03677a88b0659a4f0e0b1e0151aebb47c49c92b8e57408578142df598eac08b364623d926343c724f42494f87662e437b1c89f0b2e815b - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/parser@npm:7.18.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/typescript-estree": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - debug: "npm:^4.3.4" - peerDependencies: - eslint: ^8.56.0 + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/370e73fca4278091bc1b657f85e7d74cd52b24257ea20c927a8e17546107ce04fbf313fec99aed0cc2a145ddbae1d3b12e9cc2c1320117636dc1281bcfd08059 + checksum: 10c0/be509f7bb0c0c596801059b06995a81a1c326cc6ac31d96a32f7b6b7d7b495f9bad4dc442aa6e923d22515e62c668d3c14695c68bd6e0be1d4bf72158b7fd2d6 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.5.0": - version: 5.62.0 - resolution: "@typescript-eslint/parser@npm:5.62.0" +"@typescript-eslint/parser@npm:8.11.0": + version: 8.11.0 + resolution: "@typescript-eslint/parser@npm:8.11.0" dependencies: - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/typescript-estree": "npm:5.62.0" + "@typescript-eslint/scope-manager": "npm:8.11.0" + "@typescript-eslint/types": "npm:8.11.0" + "@typescript-eslint/typescript-estree": "npm:8.11.0" + "@typescript-eslint/visitor-keys": "npm:8.11.0" debug: "npm:^4.3.4" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/315194b3bf39beb9bd16c190956c46beec64b8371e18d6bb72002108b250983eb1e186a01d34b77eb4045f4941acbb243b16155fbb46881105f65e37dc9e24d4 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - checksum: 10c0/861253235576c1c5c1772d23cdce1418c2da2618a479a7de4f6114a12a7ca853011a1e530525d0931c355a8fd237b9cd828fac560f85f9623e24054fd024726f - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/scope-manager@npm:6.21.0" - dependencies: - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" - checksum: 10c0/eaf868938d811cbbea33e97e44ba7050d2b6892202cea6a9622c486b85ab1cf801979edf78036179a8ba4ac26f1dfdf7fcc83a68c1ff66be0b3a8e9a9989b526 + checksum: 10c0/e83f239fec60697083e5dcb1c8948340e783ea6e043fe9a65d557faef8882963b09d69aacd736eb8ab18a768769a7bbfc3de0f1251d4bba080613541acb0741c languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/scope-manager@npm:7.18.0" +"@typescript-eslint/scope-manager@npm:8.11.0": + version: 8.11.0 + resolution: "@typescript-eslint/scope-manager@npm:8.11.0" dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - checksum: 10c0/038cd58c2271de146b3a594afe2c99290034033326d57ff1f902976022c8b0138ffd3cb893ae439ae41003b5e4bcc00cabf6b244ce40e8668f9412cc96d97b8e + "@typescript-eslint/types": "npm:8.11.0" + "@typescript-eslint/visitor-keys": "npm:8.11.0" + checksum: 10c0/0910da62d8ae261711dd9f89d5c7d8e96ff13c50054436256e5a661309229cb49e3b8189c9468d36b6c4d3f7cddd121519ea78f9b18c9b869a808834b079b2ea languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/type-utils@npm:5.62.0" +"@typescript-eslint/scope-manager@npm:8.12.1": + version: 8.12.1 + resolution: "@typescript-eslint/scope-manager@npm:8.12.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:5.62.0" - "@typescript-eslint/utils": "npm:5.62.0" - debug: "npm:^4.3.4" - tsutils: "npm:^3.21.0" - peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/93112e34026069a48f0484b98caca1c89d9707842afe14e08e7390af51cdde87378df29d213d3bbd10a7cfe6f91b228031b56218515ce077bdb62ddea9d9f474 + "@typescript-eslint/types": "npm:8.12.1" + "@typescript-eslint/visitor-keys": "npm:8.12.1" + checksum: 10c0/396fb8566f753341d2e3dad1e48935009f72cb5d0234cd47ead629d664720c29df91c46166c551c97e7a10996911f047e35d52e59765a77d829e7d912625e851 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/type-utils@npm:7.18.0" +"@typescript-eslint/type-utils@npm:8.11.0": + version: 8.11.0 + resolution: "@typescript-eslint/type-utils@npm:8.11.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.18.0" - "@typescript-eslint/utils": "npm:7.18.0" + "@typescript-eslint/typescript-estree": "npm:8.11.0" + "@typescript-eslint/utils": "npm:8.11.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" - peerDependencies: - eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/ad92a38007be620f3f7036f10e234abdc2fdc518787b5a7227e55fd12896dacf56e8b34578723fbf9bea8128df2510ba8eb6739439a3879eda9519476d5783fd - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 10c0/7febd3a7f0701c0b927e094f02e82d8ee2cada2b186fcb938bc2b94ff6fbad88237afc304cbaf33e82797078bbbb1baf91475f6400912f8b64c89be79bfa4ddf - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/types@npm:6.21.0" - checksum: 10c0/020631d3223bbcff8a0da3efbdf058220a8f48a3de221563996ad1dcc30d6c08dadc3f7608cc08830d21c0d565efd2db19b557b9528921c78aabb605eef2d74d + checksum: 10c0/b69e31c1599ceeb20c29052a4ddb33a554174a3a4c55ee37d90c9b8250af6ef978a0b9ddbeefef4e83d62c4caea1bfa2d8088527f397bde69fb4ab9b360d794a languageName: node linkType: hard -"@typescript-eslint/types@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/types@npm:7.18.0" - checksum: 10c0/eb7371ac55ca77db8e59ba0310b41a74523f17e06f485a0ef819491bc3dd8909bb930120ff7d30aaf54e888167e0005aa1337011f3663dc90fb19203ce478054 +"@typescript-eslint/types@npm:8.11.0": + version: 8.11.0 + resolution: "@typescript-eslint/types@npm:8.11.0" + checksum: 10c0/5ccdd3eeee077a6fc8e7f4bc0e0cbc9327b1205a845253ec5c0c6c49ff915e853161df00c24a0ffb4b8ec745d3f153dd0e066400a021c844c026e31121f46699 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/d7984a3e9d56897b2481940ec803cb8e7ead03df8d9cfd9797350be82ff765dfcf3cfec04e7355e1779e948da8f02bc5e11719d07a596eb1cb995c48a95e38cf +"@typescript-eslint/types@npm:8.12.1": + version: 8.12.1 + resolution: "@typescript-eslint/types@npm:8.12.1" + checksum: 10c0/3fc1087109cf3afbf1e9b6e0fd296473831c3e8e3e52496e53528586baf3e682844ce720e24b5d29dc4ff0d47c373a2665b726330443d08d0e8cd3cefcc77623 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" +"@typescript-eslint/typescript-estree@npm:8.11.0": + version: 8.11.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.11.0" dependencies: - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" + "@typescript-eslint/types": "npm:8.11.0" + "@typescript-eslint/visitor-keys": "npm:8.11.0" debug: "npm:^4.3.4" - globby: "npm:^11.1.0" + fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" - minimatch: "npm:9.0.3" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/af1438c60f080045ebb330155a8c9bb90db345d5069cdd5d01b67de502abb7449d6c75500519df829f913a6b3f490ade3e8215279b6bdc63d0fb0ae61034df5f + checksum: 10c0/b629ad3cd32b005d5c1d67c36958a418f8672efebea869399834f4f201ebf90b942165eebb5c9d9799dcabdc2cc26e5fabb00629f76b158847f42e1a491a75a6 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" +"@typescript-eslint/typescript-estree@npm:8.12.1": + version: 8.12.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.12.1" dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" + "@typescript-eslint/types": "npm:8.12.1" + "@typescript-eslint/visitor-keys": "npm:8.12.1" debug: "npm:^4.3.4" - globby: "npm:^11.1.0" + fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" minimatch: "npm:^9.0.4" semver: "npm:^7.6.0" @@ -4155,86 +2912,55 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/0c7f109a2e460ec8a1524339479cf78ff17814d23c83aa5112c77fb345e87b3642616291908dcddea1e671da63686403dfb712e4a4435104f92abdfddf9aba81 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:5.62.0, @typescript-eslint/utils@npm:^5.58.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@types/json-schema": "npm:^7.0.9" - "@types/semver": "npm:^7.3.12" - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/typescript-estree": "npm:5.62.0" - eslint-scope: "npm:^5.1.1" - semver: "npm:^7.3.7" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/f09b7d9952e4a205eb1ced31d7684dd55cee40bf8c2d78e923aa8a255318d97279825733902742c09d8690f37a50243f4c4d383ab16bd7aefaf9c4b438f785e1 + checksum: 10c0/23463f4e8d9e3921d9b4bc853007336ffca3101e1ef6e38a1cf6131c1c1d27bbdcee3419c36ad67786b77c9dd7ee12833e0aba7d6fa5dd38b1c6efc0a75ead7e languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/utils@npm:7.18.0" +"@typescript-eslint/utils@npm:8.11.0": + version: 8.11.0 + resolution: "@typescript-eslint/utils@npm:8.11.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/typescript-estree": "npm:7.18.0" + "@typescript-eslint/scope-manager": "npm:8.11.0" + "@typescript-eslint/types": "npm:8.11.0" + "@typescript-eslint/typescript-estree": "npm:8.11.0" peerDependencies: - eslint: ^8.56.0 - checksum: 10c0/a25a6d50eb45c514469a01ff01f215115a4725fb18401055a847ddf20d1b681409c4027f349033a95c4ff7138d28c3b0a70253dfe8262eb732df4b87c547bd1e + eslint: ^8.57.0 || ^9.0.0 + checksum: 10c0/bb5bcc8d928a55b22298e76f834ea6a9fe125a9ffeb6ac23bee0258b3ed32f41e281888a3d0be226a05e1011bb3b70e42a71a40366acdefea6779131c46bc522 languageName: node linkType: hard -"@typescript-eslint/utils@npm:^6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/utils@npm:6.21.0" +"@typescript-eslint/utils@npm:^8.8.0": + version: 8.12.1 + resolution: "@typescript-eslint/utils@npm:8.12.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@types/json-schema": "npm:^7.0.12" - "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.21.0" - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/typescript-estree": "npm:6.21.0" - semver: "npm:^7.5.4" + "@typescript-eslint/scope-manager": "npm:8.12.1" + "@typescript-eslint/types": "npm:8.12.1" + "@typescript-eslint/typescript-estree": "npm:8.12.1" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 10c0/ab2df3833b2582d4e5467a484d08942b4f2f7208f8e09d67de510008eb8001a9b7460f2f9ba11c12086fd3cdcac0c626761c7995c2c6b5657d5fa6b82030a32d - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - eslint-visitor-keys: "npm:^3.3.0" - checksum: 10c0/7c3b8e4148e9b94d9b7162a596a1260d7a3efc4e65199693b8025c71c4652b8042501c0bc9f57654c1e2943c26da98c0f77884a746c6ae81389fcb0b513d995d + eslint: ^8.57.0 || ^9.0.0 + checksum: 10c0/82005530a0c80683dd586fe2a7d2083b82448862aef9fdc72224e618e87ab60d66a31d47443c0afd509f56d0df8eddc960cdc07341403e57a30d93d14b9c3f93 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" +"@typescript-eslint/visitor-keys@npm:8.11.0": + version: 8.11.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.11.0" dependencies: - "@typescript-eslint/types": "npm:6.21.0" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/7395f69739cfa1cb83c1fb2fad30afa2a814756367302fb4facd5893eff66abc807e8d8f63eba94ed3b0fe0c1c996ac9a1680bcbf0f83717acedc3f2bb724fbf + "@typescript-eslint/types": "npm:8.11.0" + eslint-visitor-keys: "npm:^3.4.3" + checksum: 10c0/7a5a49609fdc47e114fe59eee56393c90b122ec8e9520f90b0c5e189635ae1ccfa8e00108f641342c2c8f4637fe9d40c77927cf7c8248a3a660812cb4b7d0c08 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" +"@typescript-eslint/visitor-keys@npm:8.12.1": + version: 8.12.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.12.1" dependencies: - "@typescript-eslint/types": "npm:7.18.0" + "@typescript-eslint/types": "npm:8.12.1" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/538b645f8ff1d9debf264865c69a317074eaff0255e63d7407046176b0f6a6beba34a6c51d511f12444bae12a98c69891eb6f403c9f54c6c2e2849d1c1cb73c0 + checksum: 10c0/7c3f8c205c69611f07182fc09125c32a397aa51b96886431a793d5f0b1a864e4a7d847a6f3334b0aa00c8c4b8c3286f36e8ffffb235e6d36ace0509722cf9dda languageName: node linkType: hard @@ -4284,7 +3010,7 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.0.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d @@ -4675,7 +3401,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.3, acorn@npm:^8.12.0, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.12.0, acorn@npm:^8.7.1, acorn@npm:^8.8.2": version: 8.13.0 resolution: "acorn@npm:8.13.0" bin: @@ -4826,13 +3552,6 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.3.2": - version: 5.3.2 - resolution: "aria-query@npm:5.3.2" - checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e - languageName: node - linkType: hard - "array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "array-buffer-byte-length@npm:1.0.1" @@ -4850,7 +3569,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7, array-includes@npm:^3.1.8": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": version: 3.1.8 resolution: "array-includes@npm:3.1.8" dependencies: @@ -4871,7 +3590,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlast@npm:^1.2.4, array.prototype.findlast@npm:^1.2.5": +"array.prototype.findlast@npm:^1.2.5": version: 1.2.5 resolution: "array.prototype.findlast@npm:1.2.5" dependencies: @@ -4885,7 +3604,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.3, array.prototype.findlastindex@npm:^1.2.5": +"array.prototype.findlastindex@npm:^1.2.5": version: 1.2.5 resolution: "array.prototype.findlastindex@npm:1.2.5" dependencies: @@ -4923,19 +3642,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.toreversed@npm:^1.1.2": - version: 1.1.2 - resolution: "array.prototype.toreversed@npm:1.1.2" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/2b7627ea85eae1e80ecce665a500cc0f3355ac83ee4a1a727562c7c2a1d5f1c0b4dd7b65c468ec6867207e452ba01256910a2c0b41486bfdd11acf875a7a3435 - languageName: node - linkType: hard - -"array.prototype.tosorted@npm:^1.1.3, array.prototype.tosorted@npm:^1.1.4": +"array.prototype.tosorted@npm:^1.1.4": version: 1.1.4 resolution: "array.prototype.tosorted@npm:1.1.4" dependencies: @@ -4971,13 +3678,6 @@ __metadata: languageName: node linkType: hard -"ast-types-flow@npm:^0.0.8": - version: 0.0.8 - resolution: "ast-types-flow@npm:0.0.8" - checksum: 10c0/f2a0ba8055353b743c41431974521e5e852a9824870cd6fce2db0e538ac7bf4da406bbd018d109af29ff3f8f0993f6a730c9eddbd0abd031fbcb29ca75c1014e - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -5001,13 +3701,6 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:^4.10.0": - version: 4.10.2 - resolution: "axe-core@npm:4.10.2" - checksum: 10c0/0e20169077de96946a547fce0df39d9aeebe0077f9d3eeff4896518b96fde857f80b98f0d4279274a7178791744dd5a54bb4f322de45b4f561ffa2586ff9a09d - languageName: node - linkType: hard - "axios@npm:1.7.7": version: 1.7.7 resolution: "axios@npm:1.7.7" @@ -5019,13 +3712,6 @@ __metadata: languageName: node linkType: hard -"axobject-query@npm:^4.1.0": - version: 4.1.0 - resolution: "axobject-query@npm:4.1.0" - checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775 - languageName: node - linkType: hard - "babel-plugin-macros@npm:^3.1.0": version: 3.1.0 resolution: "babel-plugin-macros@npm:3.1.0" @@ -5037,73 +3723,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.11 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" - dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b2217bc8d5976cf8142453ed44daabf0b2e0e75518f24eac83b54a8892e87a88f1bd9089daa92fd25df979ecd0acfd29b6bc28c4182c1c46344cee15ef9bce84 - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs3@npm:^0.10.6": - version: 0.10.6 - resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - core-js-compat: "npm:^3.38.0" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/3a69220471b07722c2ae6537310bf26b772514e12b601398082965459c838be70a0ca70b0662f0737070654ff6207673391221d48599abb4a2b27765206d9f79 - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/bc541037cf7620bc84ddb75a1c0ce3288f90e7d2799c070a53f8a495c8c8ae0316447becb06f958dd25dcce2a2fce855d318ecfa48036a1ddb218d55aa38a744 - languageName: node - linkType: hard - -"babel-plugin-transform-react-remove-prop-types@npm:^0.4.24": - version: 0.4.24 - resolution: "babel-plugin-transform-react-remove-prop-types@npm:0.4.24" - checksum: 10c0/713441fd9fb663cc95709cb52d9c2c6228ea6d5406092a8a50094c810bcb13c3c347f8fca703d45b20cc401782743a91d7272025950147f9247d53360267f107 - languageName: node - linkType: hard - -"babel-preset-react-app@npm:^10.0.1": - version: 10.0.1 - resolution: "babel-preset-react-app@npm:10.0.1" - dependencies: - "@babel/core": "npm:^7.16.0" - "@babel/plugin-proposal-class-properties": "npm:^7.16.0" - "@babel/plugin-proposal-decorators": "npm:^7.16.4" - "@babel/plugin-proposal-nullish-coalescing-operator": "npm:^7.16.0" - "@babel/plugin-proposal-numeric-separator": "npm:^7.16.0" - "@babel/plugin-proposal-optional-chaining": "npm:^7.16.0" - "@babel/plugin-proposal-private-methods": "npm:^7.16.0" - "@babel/plugin-transform-flow-strip-types": "npm:^7.16.0" - "@babel/plugin-transform-react-display-name": "npm:^7.16.0" - "@babel/plugin-transform-runtime": "npm:^7.16.4" - "@babel/preset-env": "npm:^7.16.4" - "@babel/preset-react": "npm:^7.16.0" - "@babel/preset-typescript": "npm:^7.16.0" - "@babel/runtime": "npm:^7.16.3" - babel-plugin-macros: "npm:^3.1.0" - babel-plugin-transform-react-remove-prop-types: "npm:^0.4.24" - checksum: 10c0/aba225d0caf2591f7cc1aeed69369d1e86419a92fcf6025312421c238f4468347a7b6c12a45a4fb15e879a01f5a060439842fbde5739d7be31077b35c7d20fa5 - languageName: node - linkType: hard - "bail@npm:^2.0.0": version: 2.0.2 resolution: "bail@npm:2.0.2" @@ -5210,7 +3829,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": +"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.24.0": version: 4.24.2 resolution: "browserslist@npm:4.24.2" dependencies: @@ -5565,7 +4184,7 @@ __metadata: languageName: node linkType: hard -"classcat@npm:^5.0.3, classcat@npm:^5.0.5": +"classcat@npm:5.0.5, classcat@npm:^5.0.3": version: 5.0.5 resolution: "classcat@npm:5.0.5" checksum: 10c0/ff8d273055ef9b518529cfe80fd0486f7057a9917373807ff802d75ceb46e8f8e148f41fa094ee7625c8f34642cfaa98395ff182d9519898da7cbf383d4a210d @@ -5755,13 +4374,6 @@ __metadata: languageName: node linkType: hard -"confusing-browser-globals@npm:^1.0.10, confusing-browser-globals@npm:^1.0.11": - version: 1.0.11 - resolution: "confusing-browser-globals@npm:1.0.11" - checksum: 10c0/475d0a284fa964a5182b519af5738b5b64bf7e413cfd703c1b3496bf6f4df9f827893a9b221c0ea5873c1476835beb1e0df569ba643eff0734010c1eb780589e - languageName: node - linkType: hard - "consola@npm:^3.2.3": version: 3.2.3 resolution: "consola@npm:3.2.3" @@ -5813,15 +4425,6 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1": - version: 3.38.1 - resolution: "core-js-compat@npm:3.38.1" - dependencies: - browserslist: "npm:^4.23.3" - checksum: 10c0/d8bc8a35591fc5fbf3e376d793f298ec41eb452619c7ef9de4ea59b74be06e9fda799e0dcbf9ba59880dae87e3b41fb191d744ffc988315642a1272bb9442b31 - languageName: node - linkType: hard - "cosmiconfig@npm:^7.0.0": version: 7.1.0 resolution: "cosmiconfig@npm:7.1.0" @@ -6151,13 +4754,6 @@ __metadata: languageName: node linkType: hard -"damerau-levenshtein@npm:^1.0.8": - version: 1.0.8 - resolution: "damerau-levenshtein@npm:1.0.8" - checksum: 10c0/4c2647e0f42acaee7d068756c1d396e296c3556f9c8314bac1ac63ffb236217ef0e7e58602b18bb2173deec7ec8e0cac8e27cccf8f5526666b4ff11a13ad54a3 - languageName: node - linkType: hard - "data-urls@npm:^5.0.0": version: 5.0.0 resolution: "data-urls@npm:5.0.0" @@ -6440,15 +5036,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 - languageName: node - linkType: hard - "dom-accessibility-api@npm:^0.5.9": version: 0.5.16 resolution: "dom-accessibility-api@npm:0.5.16" @@ -6757,7 +5344,7 @@ __metadata: languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.17, es-iterator-helpers@npm:^1.1.0": +"es-iterator-helpers@npm:^1.1.0": version: 1.1.0 resolution: "es-iterator-helpers@npm:1.1.0" dependencies: @@ -7017,93 +5604,24 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^5.0.0": - version: 5.0.0 - resolution: "escape-string-regexp@npm:5.0.0" - checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 - languageName: node - linkType: hard - -"eslint-config-airbnb-base@npm:15.0.0, eslint-config-airbnb-base@npm:^15.0.0": - version: 15.0.0 - resolution: "eslint-config-airbnb-base@npm:15.0.0" - dependencies: - confusing-browser-globals: "npm:^1.0.10" - object.assign: "npm:^4.1.2" - object.entries: "npm:^1.1.5" - semver: "npm:^6.3.0" - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.2 - checksum: 10c0/93639d991654414756f82ad7860aac30b0dc6797277b7904ddb53ed88a32c470598696bbc6c503e066414024d305221974d3769e6642de65043bedf29cbbd30f - languageName: node - linkType: hard - -"eslint-config-airbnb-typescript@npm:18.0.0": - version: 18.0.0 - resolution: "eslint-config-airbnb-typescript@npm:18.0.0" - dependencies: - eslint-config-airbnb-base: "npm:^15.0.0" - peerDependencies: - "@typescript-eslint/eslint-plugin": ^7.0.0 - "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.56.0 - checksum: 10c0/8bfedda75f746f04972ce4cc5f32257bcc7953122360827d8afdd1e2c7c13a296eabacd50588de83ea74bab0f4bc7f383f460708ef267ac72c891daddfa44749 +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 languageName: node linkType: hard -"eslint-config-airbnb@npm:19.0.4": - version: 19.0.4 - resolution: "eslint-config-airbnb@npm:19.0.4" - dependencies: - eslint-config-airbnb-base: "npm:^15.0.0" - object.assign: "npm:^4.1.2" - object.entries: "npm:^1.1.5" - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.3 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-react: ^7.28.0 - eslint-plugin-react-hooks: ^4.3.0 - checksum: 10c0/867feeda45c4b480b1b8eff8fabc1bb107e837da8b48e5039e0c175ae6ad34af383b1924fc163bbfcef24a324e6651b1515e5bd12cbcbb19535a8838e2544a02 +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 languageName: node linkType: hard -"eslint-config-react-app@npm:7.0.1": - version: 7.0.1 - resolution: "eslint-config-react-app@npm:7.0.1" - dependencies: - "@babel/core": "npm:^7.16.0" - "@babel/eslint-parser": "npm:^7.16.3" - "@rushstack/eslint-patch": "npm:^1.1.0" - "@typescript-eslint/eslint-plugin": "npm:^5.5.0" - "@typescript-eslint/parser": "npm:^5.5.0" - babel-preset-react-app: "npm:^10.0.1" - confusing-browser-globals: "npm:^1.0.11" - eslint-plugin-flowtype: "npm:^8.0.3" - eslint-plugin-import: "npm:^2.25.3" - eslint-plugin-jest: "npm:^25.3.0" - eslint-plugin-jsx-a11y: "npm:^6.5.1" - eslint-plugin-react: "npm:^7.27.1" - eslint-plugin-react-hooks: "npm:^4.3.0" - eslint-plugin-testing-library: "npm:^5.0.1" - peerDependencies: - eslint: ^8.0.0 - checksum: 10c0/be290ec0cd5a2c0bb0b85cb1645e8734769cae77f101cd453631d77a60fa4894ee8b5b1e080ee8c21e01af0d0fc22367a2882931a549691b5ab801abb985cbba +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 languageName: node linkType: hard @@ -7118,7 +5636,25 @@ __metadata: languageName: node linkType: hard -"eslint-module-utils@npm:^2.12.0, eslint-module-utils@npm:^2.8.0": +"eslint-import-resolver-oxc@npm:0.4.0": + version: 0.4.0 + resolution: "eslint-import-resolver-oxc@npm:0.4.0" + dependencies: + oxc-resolver: "npm:^1.12.0" + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 10c0/d220c986f1cdaf46ae6a690eda188731f7642927b678a6ce22fa70947c24a62258547fb3e2da07c4fce67e56a69367ad0a0eb5232331af93d074a46381c9111f + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.12.0": version: 2.12.0 resolution: "eslint-module-utils@npm:2.12.0" dependencies: @@ -7146,27 +5682,13 @@ __metadata: languageName: unknown linkType: soft -"eslint-plugin-flowtype@npm:^8.0.3": - version: 8.0.3 - resolution: "eslint-plugin-flowtype@npm:8.0.3" - dependencies: - lodash: "npm:^4.17.21" - string-natural-compare: "npm:^3.0.1" - peerDependencies: - "@babel/plugin-syntax-flow": ^7.14.5 - "@babel/plugin-transform-react-jsx": ^7.14.9 - eslint: ^8.1.0 - checksum: 10c0/a4596ba1cb80c19a06f1ddef6c36e6a671769da8d056d4a8f3482a2c46f475c547e78f82c3233099dba3759dc9a29e36d0ca07019cf6deb666db17f49d8f566d - languageName: node - linkType: hard - -"eslint-plugin-i18next@npm:6.0.9": - version: 6.0.9 - resolution: "eslint-plugin-i18next@npm:6.0.9" +"eslint-plugin-i18next@npm:6.1.0": + version: 6.1.0 + resolution: "eslint-plugin-i18next@npm:6.1.0" dependencies: lodash: "npm:^4.17.21" requireindex: "npm:~1.1.0" - checksum: 10c0/6a90288cd5f3f97be7136fe912ba3d554fe3cafa56884b3ab5c7b5c46212811e94bae3185c5c820935ca5ef2daed9a2601c43c957c8f71e8dbcbe704e701bd43 + checksum: 10c0/06c36df0de8cc0043c54c3e881d89b51558ed0b8c9dbff6f9cc9028e8df789a254921b7fad1427ce25790bbd8b99089ae413f95742e3536992be6e709cdee302 languageName: node linkType: hard @@ -7181,34 +5703,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:2.29.1": - version: 2.29.1 - resolution: "eslint-plugin-import@npm:2.29.1" - dependencies: - array-includes: "npm:^3.1.7" - array.prototype.findlastindex: "npm:^1.2.3" - array.prototype.flat: "npm:^1.3.2" - array.prototype.flatmap: "npm:^1.3.2" - debug: "npm:^3.2.7" - doctrine: "npm:^2.1.0" - eslint-import-resolver-node: "npm:^0.3.9" - eslint-module-utils: "npm:^2.8.0" - hasown: "npm:^2.0.0" - is-core-module: "npm:^2.13.1" - is-glob: "npm:^4.0.3" - minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.7" - object.groupby: "npm:^1.0.1" - object.values: "npm:^1.1.7" - semver: "npm:^6.3.1" - tsconfig-paths: "npm:^3.15.0" - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 10c0/5f35dfbf4e8e67f741f396987de9504ad125c49f4144508a93282b4ea0127e052bde65ab6def1f31b6ace6d5d430be698333f75bdd7dca3bc14226c92a083196 - languageName: node - linkType: hard - -"eslint-plugin-import@npm:^2.25.3": +"eslint-plugin-import@npm:2.31.0": version: 2.31.0 resolution: "eslint-plugin-import@npm:2.31.0" dependencies: @@ -7237,102 +5732,27 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:^25.3.0": - version: 25.7.0 - resolution: "eslint-plugin-jest@npm:25.7.0" - dependencies: - "@typescript-eslint/experimental-utils": "npm:^5.0.0" - peerDependencies: - "@typescript-eslint/eslint-plugin": ^4.0.0 || ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - jest: - optional: true - checksum: 10c0/72dad05323d54e815c2bb10235bd5b77423796ef2e2940f7dba28bdb6cfac5a578793d3f0c7ac74618c41f9d8d6f345097a2a1f89f41aeec27bb873cb66ab270 - languageName: node - linkType: hard - -"eslint-plugin-jsx-a11y@npm:^6.5.1": - version: 6.10.1 - resolution: "eslint-plugin-jsx-a11y@npm:6.10.1" - dependencies: - aria-query: "npm:^5.3.2" - array-includes: "npm:^3.1.8" - array.prototype.flatmap: "npm:^1.3.2" - ast-types-flow: "npm:^0.0.8" - axe-core: "npm:^4.10.0" - axobject-query: "npm:^4.1.0" - damerau-levenshtein: "npm:^1.0.8" - emoji-regex: "npm:^9.2.2" - es-iterator-helpers: "npm:^1.1.0" - hasown: "npm:^2.0.2" - jsx-ast-utils: "npm:^3.3.5" - language-tags: "npm:^1.0.9" - minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.8" - safe-regex-test: "npm:^1.0.3" - string.prototype.includes: "npm:^2.0.1" - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - checksum: 10c0/25bf28e3db4f6789c5d4f9300fc6fc54faca19ecc537d0f46e9c873f80ed37103a033e1f716f608fab5f5813dd38af65a9a6ae2e29dd079763ce539ebecf998e - languageName: node - linkType: hard - -"eslint-plugin-playwright@npm:1.6.2": - version: 1.6.2 - resolution: "eslint-plugin-playwright@npm:1.6.2" +"eslint-plugin-playwright@npm:2.0.0": + version: 2.0.0 + resolution: "eslint-plugin-playwright@npm:2.0.0" dependencies: globals: "npm:^13.23.0" peerDependencies: eslint: ">=8.40.0" - eslint-plugin-jest: ">=25" - peerDependenciesMeta: - eslint-plugin-jest: - optional: true - checksum: 10c0/0785b7031507699eac6a45fdcd90705d9759d5943a4033354b735ae856c9d71345ecacb6a7ff0c4cd0e24f523e9d59dee7081dc96c7b5c492fcbed77496a0a19 - languageName: node - linkType: hard - -"eslint-plugin-react-hooks@npm:^4.3.0": - version: 4.6.2 - resolution: "eslint-plugin-react-hooks@npm:4.6.2" - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 10c0/4844e58c929bc05157fb70ba1e462e34f1f4abcbc8dd5bbe5b04513d33e2699effb8bca668297976ceea8e7ebee4e8fc29b9af9d131bcef52886feaa2308b2cc + checksum: 10c0/0fecb0cf23cc7099c2f4ba40167f0a09d19e670e4856a90582a5a33b303738e3ee6e24ac4e5b3a679a9718deed563861a6a3fdec446068f55f9509c9ef4fa298 languageName: node linkType: hard -"eslint-plugin-react@npm:7.34.1": - version: 7.34.1 - resolution: "eslint-plugin-react@npm:7.34.1" - dependencies: - array-includes: "npm:^3.1.7" - array.prototype.findlast: "npm:^1.2.4" - array.prototype.flatmap: "npm:^1.3.2" - array.prototype.toreversed: "npm:^1.1.2" - array.prototype.tosorted: "npm:^1.1.3" - doctrine: "npm:^2.1.0" - es-iterator-helpers: "npm:^1.0.17" - estraverse: "npm:^5.3.0" - jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" - minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.7" - object.fromentries: "npm:^2.0.7" - object.hasown: "npm:^1.1.3" - object.values: "npm:^1.1.7" - prop-types: "npm:^15.8.1" - resolve: "npm:^2.0.0-next.5" - semver: "npm:^6.3.1" - string.prototype.matchall: "npm:^4.0.10" +"eslint-plugin-react-refresh@npm:0.4.13": + version: 0.4.13 + resolution: "eslint-plugin-react-refresh@npm:0.4.13" peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/7c61b1314d37a4ac2f2474f9571f801f1a1a5d81dcd4abbb5d07145406518722fb792367267757ee116bde254be9753242d6b93c9619110398b3fe1746e4848c + eslint: ">=7" + checksum: 10c0/c15a2122c3f092d7a5388e480a033ae054a61b2d0f7da50c896e90ca4616c0cba0d6249c77545b94262c9c9af3b78817e2ace3ead210206ab91c672ac6de4497 languageName: node linkType: hard -"eslint-plugin-react@npm:^7.27.1": +"eslint-plugin-react@npm:7.37.2": version: 7.37.2 resolution: "eslint-plugin-react@npm:7.37.2" dependencies: @@ -7360,18 +5780,16 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-testing-library@npm:^5.0.1": - version: 5.11.1 - resolution: "eslint-plugin-testing-library@npm:5.11.1" - dependencies: - "@typescript-eslint/utils": "npm:^5.58.0" +"eslint-plugin-simple-import-sort@npm:^12.1.1": + version: 12.1.1 + resolution: "eslint-plugin-simple-import-sort@npm:12.1.1" peerDependencies: - eslint: ^7.5.0 || ^8.0.0 - checksum: 10c0/55c7792345710a2b951acb0552ebe4e491d988f7d37fd308749e75fdbc36142b9a151ecec03b39992f672afea1a99dd3c3d2fb9f737ef18f56d7168e294fd9eb + eslint: ">=5.0.0" + checksum: 10c0/0ad1907ad9ddbadd1db655db0a9d0b77076e274b793a77b982c8525d808d868e6ecfce24f3a411e8a1fa551077387f9ebb38c00956073970ebd7ee6a029ce2b3 languageName: node linkType: hard -"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": +"eslint-scope@npm:5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" dependencies: @@ -7381,24 +5799,17 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.1.0": + version: 8.1.0 + resolution: "eslint-scope@npm:8.1.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^2.1.0": - version: 2.1.0 - resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: 10c0/9f0e3a2db751d84067d15977ac4b4472efd6b303e369e6ff241a99feac04da758f46d5add022c33d06b53596038dbae4b4aceb27c7e68b8dfc1055b35e495787 + checksum: 10c0/ae1df7accae9ea90465c2ded70f7064d6d1f2962ef4cc87398855c4f0b3a5ab01063e0258d954bb94b184f6759febe04c3118195cab5c51978a7229948ba2875 languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 @@ -7412,55 +5823,57 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.57.1": - version: 8.57.1 - resolution: "eslint@npm:8.57.1" +"eslint@npm:9.13.0": + version: 9.13.0 + resolution: "eslint@npm:9.13.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.1" - "@humanwhocodes/config-array": "npm:^0.13.0" + "@eslint-community/regexpp": "npm:^4.11.0" + "@eslint/config-array": "npm:^0.18.0" + "@eslint/core": "npm:^0.7.0" + "@eslint/eslintrc": "npm:^3.1.0" + "@eslint/js": "npm:9.13.0" + "@eslint/plugin-kit": "npm:^0.2.0" + "@humanfs/node": "npm:^0.16.5" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" + "@humanwhocodes/retry": "npm:^0.3.1" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.2" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.1.0" + eslint-visitor-keys: "npm:^4.1.0" + espree: "npm:^10.2.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + checksum: 10c0/d3577444152182a9d8ea8c6a6acb073d3a2773ad73a6b646f432746583ec4bfcd6a44fcc2e37d05d276984e583c46c2d289b3b981ca8f8b4052756a152341d19 languageName: node linkType: hard -"espree@npm:^10.0.1": +"espree@npm:^10.0.1, espree@npm:^10.2.0": version: 10.2.0 resolution: "espree@npm:10.2.0" dependencies: @@ -7471,17 +5884,6 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: "npm:^8.9.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 - languageName: node - linkType: hard - "esprima@npm:^4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -7492,7 +5894,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": +"esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -7635,7 +6037,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9": +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.11, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -7694,12 +6096,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + flat-cache: "npm:^4.0.0" + checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 languageName: node linkType: hard @@ -7792,14 +6194,13 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: flatted: "npm:^3.2.9" - keyv: "npm:^4.5.3" - rimraf: "npm:^3.0.2" - checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + keyv: "npm:^4.5.4" + checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc languageName: node linkType: hard @@ -8129,7 +6530,7 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0, globals@npm:^13.23.0": +"globals@npm:^13.23.0": version: 13.24.0 resolution: "globals@npm:13.24.0" dependencies: @@ -8171,20 +6572,6 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: "npm:^2.1.0" - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.2.9" - ignore: "npm:^5.2.0" - merge2: "npm:^1.4.1" - slash: "npm:^3.0.0" - checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 - languageName: node - linkType: hard - "gopd@npm:^1.0.1": version: 1.0.1 resolution: "gopd@npm:1.0.1" @@ -8966,7 +7353,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.15.1": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1": version: 2.15.1 resolution: "is-core-module@npm:2.15.1" dependencies: @@ -9120,7 +7507,7 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.1, is-path-inside@npm:^3.0.3": +"is-path-inside@npm:^3.0.1": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 @@ -9493,7 +7880,7 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2": +"jsesc@npm:^3.0.2": version: 3.0.2 resolution: "jsesc@npm:3.0.2" bin: @@ -9661,7 +8048,7 @@ __metadata: languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" dependencies: @@ -9673,7 +8060,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -9696,22 +8083,6 @@ __metadata: languageName: node linkType: hard -"language-subtag-registry@npm:^0.3.20": - version: 0.3.23 - resolution: "language-subtag-registry@npm:0.3.23" - checksum: 10c0/e9b05190421d2cd36dd6c95c28673019c927947cb6d94f40ba7e77a838629ee9675c94accf897fbebb07923187deb843b8fbb8935762df6edafe6c28dcb0b86c - languageName: node - linkType: hard - -"language-tags@npm:^1.0.9": - version: 1.0.9 - resolution: "language-tags@npm:1.0.9" - dependencies: - language-subtag-registry: "npm:^0.3.20" - checksum: 10c0/9ab911213c4bd8bd583c850201c17794e52cb0660d1ab6e32558aadc8324abebf6844e46f92b80a5d600d0fbba7eface2c207bfaf270a1c7fd539e4c3a880bff - languageName: node - linkType: hard - "leaflet@npm:1.9.4": version: 1.9.4 resolution: "leaflet@npm:1.9.4" @@ -10205,7 +8576,7 @@ __metadata: languageName: node linkType: hard -"merge2@npm:^1.2.3, merge2@npm:^1.3.0, merge2@npm:^1.4.1": +"merge2@npm:^1.2.3, merge2@npm:^1.3.0": version: 1.4.1 resolution: "merge2@npm:1.4.1" checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb @@ -10590,16 +8961,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.3": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -10765,13 +9127,6 @@ __metadata: languageName: node linkType: hard -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 10c0/f6cef26f5044515754802c0fc475d81426f3b90fe88c20fabe08771ce1f736ce46e0397c10acb569a4dd0acb84c7f1ee70676122f95d5bfdd747af3a6c6bbaa8 - languageName: node - linkType: hard - "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -11035,7 +9390,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": version: 4.1.5 resolution: "object.assign@npm:4.1.5" dependencies: @@ -11047,7 +9402,7 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.5, object.entries@npm:^1.1.7, object.entries@npm:^1.1.8": +"object.entries@npm:^1.1.8": version: 1.1.8 resolution: "object.entries@npm:1.1.8" dependencies: @@ -11058,7 +9413,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.7, object.fromentries@npm:^2.0.8": +"object.fromentries@npm:^2.0.8": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" dependencies: @@ -11070,7 +9425,7 @@ __metadata: languageName: node linkType: hard -"object.groupby@npm:^1.0.1, object.groupby@npm:^1.0.3": +"object.groupby@npm:^1.0.3": version: 1.0.3 resolution: "object.groupby@npm:1.0.3" dependencies: @@ -11081,18 +9436,7 @@ __metadata: languageName: node linkType: hard -"object.hasown@npm:^1.1.3": - version: 1.1.4 - resolution: "object.hasown@npm:1.1.4" - dependencies: - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/f23187b08d874ef1aea060118c8259eb7f99f93c15a50771d710569534119062b90e087b92952b2d0fb1bb8914d61fb0b43c57fb06f622aaad538fe6868ab987 - languageName: node - linkType: hard - -"object.values@npm:^1.1.6, object.values@npm:^1.1.7, object.values@npm:^1.2.0": +"object.values@npm:^1.1.6, object.values@npm:^1.2.0": version: 1.2.0 resolution: "object.values@npm:1.2.0" dependencies: @@ -11134,13 +9478,11 @@ __metadata: version: 0.0.0-use.local resolution: "openbas-front@workspace:." dependencies: - "@babel/plugin-transform-modules-commonjs": "npm:7.25.7" "@ckeditor/ckeditor5-react": "npm:6.2.0" "@dagrejs/dagre": "npm:1.1.4" "@emotion/react": "npm:11.13.3" "@emotion/styled": "npm:11.13.0" - "@eslint/eslintrc": "npm:3.1.0" - "@eslint/js": "npm:8.57.1" + "@eslint/js": "npm:9.13.0" "@fontsource/geologica": "npm:5.0.6" "@fontsource/ibm-plex-sans": "npm:5.0.21" "@hookform/resolvers": "npm:3.9.0" @@ -11153,9 +9495,10 @@ __metadata: "@mui/x-date-pickers": "npm:7.22.0" "@playwright/test": "npm:1.48.2" "@redux-devtools/extension": "npm:3.3.0" - "@stylistic/eslint-plugin": "npm:1.8.1" + "@stylistic/eslint-plugin": "npm:2.9.0" "@testing-library/react": "npm:14.3.1" "@types/d3-hierarchy": "npm:3.1.7" + "@types/eslint__js": "npm:8.42.3" "@types/node": "npm:20.17.1" "@types/pdfmake": "npm:0.2.9" "@types/qs": "npm:6" @@ -11165,8 +9508,7 @@ __metadata: "@types/react-syntax-highlighter": "npm:15" "@types/seamless-immutable": "npm:7.1.19" "@types/uuid": "npm:10.0.0" - "@typescript-eslint/eslint-plugin": "npm:7.18.0" - "@typescript-eslint/parser": "npm:7.18.0" + "@typescript-eslint/parser": "npm:8.11.0" "@uiw/react-md-editor": "npm:4.0.4" "@vitejs/plugin-react": "npm:4.3.0" "@xyflow/react": "npm:12.3.0" @@ -11174,7 +9516,7 @@ __metadata: axios: "npm:1.7.7" chokidar: "npm:4.0.1" ckeditor5-custom-build: "link:packages/ckeditor5-custom-build" - classcat: "npm:^5.0.5" + classcat: "npm:5.0.5" classnames: "npm:2.5.1" cronstrue: "npm:2.50.0" cross-env: "npm:7.0.3" @@ -11183,17 +9525,16 @@ __metadata: dompurify: "npm:3.1.6" elkjs: "npm:0.9.3" esbuild: "npm:0.24.0" - eslint: "npm:8.57.1" - eslint-config-airbnb: "npm:19.0.4" - eslint-config-airbnb-base: "npm:15.0.0" - eslint-config-airbnb-typescript: "npm:18.0.0" - eslint-config-react-app: "npm:7.0.1" + eslint: "npm:9.13.0" + eslint-import-resolver-oxc: "npm:0.4.0" eslint-plugin-custom-rules: "link:packages/eslint-plugin-custom-rules" - eslint-plugin-i18next: "npm:6.0.9" - eslint-plugin-import: "npm:2.29.1" + eslint-plugin-i18next: "npm:6.1.0" + eslint-plugin-import: "npm:2.31.0" eslint-plugin-import-newlines: "npm:1.4.0" - eslint-plugin-playwright: "npm:1.6.2" - eslint-plugin-react: "npm:7.34.1" + eslint-plugin-playwright: "npm:2.0.0" + eslint-plugin-react: "npm:7.37.2" + eslint-plugin-react-refresh: "npm:0.4.13" + eslint-plugin-simple-import-sort: "npm:^12.1.1" express: "npm:4.20.0" final-form: "npm:4.20.10" final-form-arrays: "npm:3.1.0" @@ -11240,6 +9581,7 @@ __metadata: seamless-immutable: "npm:7.1.4" swagger-typescript-api: "npm:13.0.22" typescript: "npm:5.6.2" + typescript-eslint: "npm:8.11.0" usehooks-ts: "npm:3.1.0" uuid: "npm:10.0.0" vite: "npm:5.4.7" @@ -11247,7 +9589,7 @@ __metadata: vitest: "npm:2.1.1" xlsx: "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" zod: "npm:3.23.8" - zustand: "npm:^4.5.4" + zustand: "npm:4.5.4" languageName: unknown linkType: soft @@ -11265,6 +9607,48 @@ __metadata: languageName: node linkType: hard +"oxc-resolver@npm:^1.12.0": + version: 1.12.0 + resolution: "oxc-resolver@npm:1.12.0" + dependencies: + "@oxc-resolver/binding-darwin-arm64": "npm:1.12.0" + "@oxc-resolver/binding-darwin-x64": "npm:1.12.0" + "@oxc-resolver/binding-freebsd-x64": "npm:1.12.0" + "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:1.12.0" + "@oxc-resolver/binding-linux-arm64-gnu": "npm:1.12.0" + "@oxc-resolver/binding-linux-arm64-musl": "npm:1.12.0" + "@oxc-resolver/binding-linux-x64-gnu": "npm:1.12.0" + "@oxc-resolver/binding-linux-x64-musl": "npm:1.12.0" + "@oxc-resolver/binding-wasm32-wasi": "npm:1.12.0" + "@oxc-resolver/binding-win32-arm64-msvc": "npm:1.12.0" + "@oxc-resolver/binding-win32-x64-msvc": "npm:1.12.0" + dependenciesMeta: + "@oxc-resolver/binding-darwin-arm64": + optional: true + "@oxc-resolver/binding-darwin-x64": + optional: true + "@oxc-resolver/binding-freebsd-x64": + optional: true + "@oxc-resolver/binding-linux-arm-gnueabihf": + optional: true + "@oxc-resolver/binding-linux-arm64-gnu": + optional: true + "@oxc-resolver/binding-linux-arm64-musl": + optional: true + "@oxc-resolver/binding-linux-x64-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-musl": + optional: true + "@oxc-resolver/binding-wasm32-wasi": + optional: true + "@oxc-resolver/binding-win32-arm64-msvc": + optional: true + "@oxc-resolver/binding-win32-x64-msvc": + optional: true + checksum: 10c0/61c0b9c2f02ee91fe73e49f6d84b3e373d48aba5e86c25503369f5285d6d2d1be54b0f2026ce5d2f18acc5989f9232fa44371e7855baeb3bffbd9c0b93777dac + languageName: node + linkType: hard + "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -12658,22 +11042,6 @@ __metadata: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.2.0": - version: 10.2.0 - resolution: "regenerate-unicode-properties@npm:10.2.0" - dependencies: - regenerate: "npm:^1.4.2" - checksum: 10c0/5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460 - languageName: node - linkType: hard - -"regenerate@npm:^1.4.2": - version: 1.4.2 - resolution: "regenerate@npm:1.4.2" - checksum: 10c0/f73c9eba5d398c818edc71d1c6979eaa05af7a808682749dd079f8df2a6d91a9b913db216c2c9b03e0a8ba2bba8701244a93f45211afbff691c32c7b275db1b8 - languageName: node - linkType: hard - "regenerator-runtime@npm:^0.14.0": version: 0.14.1 resolution: "regenerator-runtime@npm:0.14.1" @@ -12681,15 +11049,6 @@ __metadata: languageName: node linkType: hard -"regenerator-transform@npm:^0.15.2": - version: 0.15.2 - resolution: "regenerator-transform@npm:0.15.2" - dependencies: - "@babel/runtime": "npm:^7.8.4" - checksum: 10c0/7cfe6931ec793269701994a93bab89c0cc95379191fad866270a7fea2adfec67ea62bb5b374db77058b60ba4509319d9b608664d0d288bd9989ca8dbd08fae90 - languageName: node - linkType: hard - "regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2": version: 1.5.3 resolution: "regexp.prototype.flags@npm:1.5.3" @@ -12702,38 +11061,6 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^6.1.1": - version: 6.1.1 - resolution: "regexpu-core@npm:6.1.1" - dependencies: - regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.2.0" - regjsgen: "npm:^0.8.0" - regjsparser: "npm:^0.11.0" - unicode-match-property-ecmascript: "npm:^2.0.0" - unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10c0/07d49697e20f9b65977535abba4858b7f5171c13f7c366be53ec1886d3d5f69f1b98cc6a6e63cf271adda077c3366a4c851c7473c28bbd69cf5a6b6b008efc3e - languageName: node - linkType: hard - -"regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "regjsgen@npm:0.8.0" - checksum: 10c0/44f526c4fdbf0b29286101a282189e4dbb303f4013cf3fea058668d96d113b9180d3d03d1e13f6d4cbde38b7728bf951aecd9dc199938c080093a9a6f0d7a6bd - languageName: node - linkType: hard - -"regjsparser@npm:^0.11.0": - version: 0.11.1 - resolution: "regjsparser@npm:0.11.1" - dependencies: - jsesc: "npm:~3.0.2" - bin: - regjsparser: bin/parser - checksum: 10c0/be4b40981a596b31eacd84ee12cfa474f1d33a6c05f7e995e8ec9d5ad8f1c3fbf7a5b690a05c443e1f312a1c0b16d4ea0b3384596a61d4fda97aa322879bb3cd - languageName: node - linkType: hard - "rehype-attr@npm:~3.0.1": version: 3.0.3 resolution: "rehype-attr@npm:3.0.3" @@ -12993,7 +11320,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.22.4, resolve@npm:^1.9.0": +"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.19.0, resolve@npm:^1.22.4, resolve@npm:^1.9.0": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -13019,7 +11346,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.9.0#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.9.0#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -13248,7 +11575,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.0.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -13257,7 +11584,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -13682,13 +12009,6 @@ __metadata: languageName: node linkType: hard -"string-natural-compare@npm:^3.0.1": - version: 3.0.1 - resolution: "string-natural-compare@npm:3.0.1" - checksum: 10c0/85a6a9195736be500af5d817c7ea36b7e1ac278af079a807f70f79a56602359ee6743ca409af6291b94557de550ff60d1ec31b3c4fc8e7a08d0e12cdab57c149 - languageName: node - linkType: hard - "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -13711,18 +12031,7 @@ __metadata: languageName: node linkType: hard -"string.prototype.includes@npm:^2.0.1": - version: 2.0.1 - resolution: "string.prototype.includes@npm:2.0.1" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.3" - checksum: 10c0/25ce9c9b49128352a2618fbe8758b46f945817a58a4420f4799419e40a8d28f116e176c7590d767d5327a61e75c8f32c86171063f48e389b9fdd325f1bd04ee5 - languageName: node - linkType: hard - -"string.prototype.matchall@npm:^4.0.10, string.prototype.matchall@npm:^4.0.11": +"string.prototype.matchall@npm:^4.0.11": version: 4.0.11 resolution: "string.prototype.matchall@npm:4.0.11" dependencies: @@ -14326,7 +12635,7 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": +"ts-api-utils@npm:^1.3.0": version: 1.3.0 resolution: "ts-api-utils@npm:1.3.0" peerDependencies: @@ -14363,13 +12672,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.8.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 - languageName: node - linkType: hard - "tslib@npm:^2.1.0, tslib@npm:^2.4.0": version: 2.8.0 resolution: "tslib@npm:2.8.0" @@ -14377,17 +12679,6 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: "npm:^1.8.1" - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 10c0/02f19e458ec78ead8fffbf711f834ad8ecd2cc6ade4ec0320790713dccc0a412b99e7fd907c4cda2a1dc602c75db6f12e0108e87a5afad4b2f9e90a24cabd5a2 - languageName: node - linkType: hard - "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -14482,6 +12773,20 @@ __metadata: languageName: node linkType: hard +"typescript-eslint@npm:8.11.0": + version: 8.11.0 + resolution: "typescript-eslint@npm:8.11.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.11.0" + "@typescript-eslint/parser": "npm:8.11.0" + "@typescript-eslint/utils": "npm:8.11.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/8f9b5916c9f47b0cbb26f142d1a266a6aaf33998ec87621252dffb56d8fe0ad01a944f8d8d837e4e6058153a1deee3557527d14fa7bf7ef80a927334529db6bd + languageName: node + linkType: hard + "typescript@npm:5.6.2": version: 5.6.2 resolution: "typescript@npm:5.6.2" @@ -14561,30 +12866,6 @@ __metadata: languageName: node linkType: hard -"unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.1 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" - checksum: 10c0/f83bc492fdbe662860795ef37a85910944df7310cac91bd778f1c19ebc911e8b9cde84e703de631e5a2fcca3905e39896f8fc5fc6a44ddaf7f4aff1cda24f381 - languageName: node - linkType: hard - -"unicode-match-property-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-ecmascript@npm:2.0.0" - dependencies: - unicode-canonical-property-names-ecmascript: "npm:^2.0.0" - unicode-property-aliases-ecmascript: "npm:^2.0.0" - checksum: 10c0/4d05252cecaf5c8e36d78dc5332e03b334c6242faf7cf16b3658525441386c0a03b5f603d42cbec0f09bb63b9fd25c9b3b09667aee75463cac3efadae2cd17ec - languageName: node - linkType: hard - -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.2.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.2.0" - checksum: 10c0/1d0a2deefd97974ddff5b7cb84f9884177f4489928dfcebb4b2b091d6124f2739df51fc6ea15958e1b5637ac2a24cff9bf21ea81e45335086ac52c0b4c717d6d - languageName: node - linkType: hard - "unicode-properties@npm:^1.2.2": version: 1.4.1 resolution: "unicode-properties@npm:1.4.1" @@ -14595,13 +12876,6 @@ __metadata: languageName: node linkType: hard -"unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.1.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" - checksum: 10c0/50ded3f8c963c7785e48c510a3b7c6bc4e08a579551489aa0349680a35b1ceceec122e33b2b6c1b579d0be2250f34bb163ac35f5f8695fe10bbc67fb757f0af8 - languageName: node - linkType: hard - "unicode-trie@npm:^2.0.0": version: 2.0.0 resolution: "unicode-trie@npm:2.0.0" @@ -14815,6 +13089,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:1.2.0": + version: 1.2.0 + resolution: "use-sync-external-store@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/ac4814e5592524f242921157e791b022efe36e451fe0d4fd4d204322d5433a4fc300d63b0ade5185f8e0735ded044c70bcf6d2352db0f74d097a238cebd2da02 + languageName: node + linkType: hard + "use-sync-external-store@npm:1.2.2, use-sync-external-store@npm:^1.0.0": version: 1.2.2 resolution: "use-sync-external-store@npm:1.2.2" @@ -15578,7 +13861,27 @@ __metadata: languageName: node linkType: hard -"zustand@npm:^4.4.0, zustand@npm:^4.5.4": +"zustand@npm:4.5.4": + version: 4.5.4 + resolution: "zustand@npm:4.5.4" + dependencies: + use-sync-external-store: "npm:1.2.0" + peerDependencies: + "@types/react": ">=16.8" + immer: ">=9.0.6" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + checksum: 10c0/479af491ffa1f1eb2c38b3ba25dc4e14339e8b35a60033d3f6c165b22f8be8163f7e1370015ded9c6e28548cd25af84a73fb40b5fad0bd7882d16ddd5ed613c6 + languageName: node + linkType: hard + +"zustand@npm:^4.4.0": version: 4.5.5 resolution: "zustand@npm:4.5.5" dependencies: From d87a187bc7fb3f9452655a0ae8aa84ee3e916710 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Tue, 29 Oct 2024 13:43:24 +0100 Subject: [PATCH 14/14] [frontend] fix version eslint-plugin-simple-import-sort --- openbas-front/.yarnrc.yml | 2 +- openbas-front/package.json | 2 +- openbas-front/yarn.lock | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openbas-front/.yarnrc.yml b/openbas-front/.yarnrc.yml index 225c9c14ae..c67eb3662d 100644 --- a/openbas-front/.yarnrc.yml +++ b/openbas-front/.yarnrc.yml @@ -1,3 +1,3 @@ nodeLinker: node-modules - yarnPath: .yarn/releases/yarn-4.5.1.cjs +defaultSemverRangePrefix: "" \ No newline at end of file diff --git a/openbas-front/package.json b/openbas-front/package.json index eabf754f03..a743c1424b 100644 --- a/openbas-front/package.json +++ b/openbas-front/package.json @@ -108,7 +108,7 @@ "eslint-plugin-playwright": "2.0.0", "eslint-plugin-react": "7.37.2", "eslint-plugin-react-refresh": "0.4.13", - "eslint-plugin-simple-import-sort": "^12.1.1", + "eslint-plugin-simple-import-sort": "12.1.1", "express": "4.20.0", "fs-extra": "11.2.0", "globals": "15.9.0", diff --git a/openbas-front/yarn.lock b/openbas-front/yarn.lock index c0ef8283a3..ee2069fac8 100644 --- a/openbas-front/yarn.lock +++ b/openbas-front/yarn.lock @@ -5780,7 +5780,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-simple-import-sort@npm:^12.1.1": +"eslint-plugin-simple-import-sort@npm:12.1.1": version: 12.1.1 resolution: "eslint-plugin-simple-import-sort@npm:12.1.1" peerDependencies: @@ -9534,7 +9534,7 @@ __metadata: eslint-plugin-playwright: "npm:2.0.0" eslint-plugin-react: "npm:7.37.2" eslint-plugin-react-refresh: "npm:0.4.13" - eslint-plugin-simple-import-sort: "npm:^12.1.1" + eslint-plugin-simple-import-sort: "npm:12.1.1" express: "npm:4.20.0" final-form: "npm:4.20.10" final-form-arrays: "npm:3.1.0"