From a4ba7099a15e11357d4924c6eb613ac46a245c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Dudfield?= Date: Thu, 30 Nov 2023 02:52:01 +0100 Subject: [PATCH 1/5] frontend: Fix npm run i18n to include missed files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also fix a missed translation file change in one of the missed files. Signed-off-by: René Dudfield --- frontend/package.json | 2 +- frontend/src/redux/clusterActionSlice.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 852df1fa6c..d0520f6ef6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -107,7 +107,7 @@ "storybook": "storybook dev -p 6006 -s public", "build-typedoc": "npx typedoc", "build-storybook": "storybook build -s public -o ../docs/development/storybook", - "i18n": "npx --no-install i18next ./src/**/ts* ./src/**/**/*.ts* ./src/**/**/**/*.ts* -c ./src/i18n/i18next-parser.config.js", + "i18n": "npx --no-install i18next ./src/**/*.ts* ./src/**/**/*.ts* ./src/**/**/**/*.ts* -c ./src/i18n/i18next-parser.config.js", "tsc": "tsc", "make-version": "node ./make-env.js", "postinstall": "patch-package" diff --git a/frontend/src/redux/clusterActionSlice.ts b/frontend/src/redux/clusterActionSlice.ts index db7392ee9f..ad49d16bfb 100644 --- a/frontend/src/redux/clusterActionSlice.ts +++ b/frontend/src/redux/clusterActionSlice.ts @@ -175,7 +175,7 @@ export const executeClusterAction = createAsyncThunk( url: startUrl, buttons: [ { - label: i18next.t('frequent|Cancel'), + label: i18next.t('translation|Cancel'), actionToDispatch: uniqueCancelActionType, }, ], From 5d5c40e1fdcd9320d5cd47e5bf04caca348f3d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Dudfield?= Date: Thu, 30 Nov 2023 01:47:44 +0100 Subject: [PATCH 2/5] frontend: App: Move into AppContainer for snackbars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Because the snackbar provider is in the AppContainer. Signed-off-by: René Dudfield --- frontend/src/App.tsx | 2 -- frontend/src/components/App/AppContainer.tsx | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 72951eac4b..1482dbf49d 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -10,7 +10,6 @@ import i18n from './i18n/config'; import { useElectronI18n } from './i18n/electronI18n'; import ThemeProviderNexti18n from './i18n/ThemeProviderNexti18n'; import themes, { getThemeName, usePrefersColorScheme } from './lib/themes'; -import Plugins from './plugin/Plugins'; import { useTypedSelector } from './redux/reducers/reducers'; import store from './redux/stores/store'; @@ -34,7 +33,6 @@ function App() { return ( }> - diff --git a/frontend/src/components/App/AppContainer.tsx b/frontend/src/components/App/AppContainer.tsx index e5bd9cdd9c..3177e88cb2 100644 --- a/frontend/src/components/App/AppContainer.tsx +++ b/frontend/src/components/App/AppContainer.tsx @@ -2,6 +2,7 @@ import { SnackbarProvider } from 'notistack'; import React from 'react'; import { BrowserRouter, HashRouter } from 'react-router-dom'; import helpers from '../../helpers'; +import Plugins from '../../plugin/Plugins'; import ReleaseNotes from '../common/ReleaseNotes/ReleaseNotes'; import Layout from './Layout'; import { PreviousRouteProvider } from './RouteSwitcher'; @@ -23,6 +24,7 @@ export default function AppContainer() { > + From 31a5aae9a48599c2fd375f22505d3b97f782739d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Dudfield?= Date: Thu, 30 Nov 2023 02:29:08 +0100 Subject: [PATCH 3/5] frontend: plugin: Add warning snack about incompat plugins MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a link to the Plugin settings page. Signed-off-by: René Dudfield --- frontend/src/i18n/locales/de/translation.json | 3 +- frontend/src/i18n/locales/en/translation.json | 3 +- frontend/src/i18n/locales/es/translation.json | 3 +- frontend/src/i18n/locales/fr/translation.json | 3 +- frontend/src/i18n/locales/pt/translation.json | 3 +- frontend/src/plugin/Plugins.tsx | 50 +++++++++++++++++-- frontend/src/plugin/index.ts | 11 ++-- 7 files changed, 60 insertions(+), 16 deletions(-) diff --git a/frontend/src/i18n/locales/de/translation.json b/frontend/src/i18n/locales/de/translation.json index 0500f60ee3..ebd344f979 100644 --- a/frontend/src/i18n/locales/de/translation.json +++ b/frontend/src/i18n/locales/de/translation.json @@ -384,5 +384,6 @@ "\"{{metricName}}\" on {{objectKind}}/{{objectName}} {{metricTarget}}": "\"{{metricName}}\" auf {{objectKind}}/{{objectName}} {{metricTarget}}", "\"{{metricName}}\" on pods": "\"{{metricName}}\" auf Pods", "resource {{resourceName}} on pods": "Ressource {{resourceName}} auf Pods", - "resource {{resourceName}} of container {{containerName}} on pods": "Ressource {{resourceName}} des Containers {{containerName}} auf Pods" + "resource {{resourceName}} of container {{containerName}} on pods": "Ressource {{resourceName}} des Containers {{containerName}} auf Pods", + "Warning. Incompatible plugins disabled: ({{ pluginList }})": "Warnung. Inkompatible Plugins deaktiviert: ({{ pluginList }})" } diff --git a/frontend/src/i18n/locales/en/translation.json b/frontend/src/i18n/locales/en/translation.json index d9991709be..593fc16847 100644 --- a/frontend/src/i18n/locales/en/translation.json +++ b/frontend/src/i18n/locales/en/translation.json @@ -384,5 +384,6 @@ "\"{{metricName}}\" on {{objectKind}}/{{objectName}} {{metricTarget}}": "\"{{metricName}}\" on {{objectKind}}/{{objectName}} {{metricTarget}}", "\"{{metricName}}\" on pods": "\"{{metricName}}\" on pods", "resource {{resourceName}} on pods": "resource {{resourceName}} on pods", - "resource {{resourceName}} of container {{containerName}} on pods": "resource {{resourceName}} of container {{containerName}} on pods" + "resource {{resourceName}} of container {{containerName}} on pods": "resource {{resourceName}} of container {{containerName}} on pods", + "Warning. Incompatible plugins disabled: ({{ pluginList }})": "Warning. Incompatible plugins disabled: ({{ pluginList }})" } diff --git a/frontend/src/i18n/locales/es/translation.json b/frontend/src/i18n/locales/es/translation.json index 083bda8a75..397e05ae35 100644 --- a/frontend/src/i18n/locales/es/translation.json +++ b/frontend/src/i18n/locales/es/translation.json @@ -384,5 +384,6 @@ "\"{{metricName}}\" on {{objectKind}}/{{objectName}} {{metricTarget}}": "\"{{metricName}}\" en {{objectKind}}/{{objectName}} {{metricTarget}}", "\"{{metricName}}\" on pods": "\"{{metricName}}\" en pods", "resource {{resourceName}} on pods": "recurso {{resourceName}} en pods", - "resource {{resourceName}} of container {{containerName}} on pods": "recurso {{resourceName}} del contenedor {{containerName}} en pods" + "resource {{resourceName}} of container {{containerName}} on pods": "recurso {{resourceName}} del contenedor {{containerName}} en pods", + "Warning. Incompatible plugins disabled: ({{ pluginList }})": "Advertencia. Plugins incompatibles deshabilitados: ({{ pluginList }})" } diff --git a/frontend/src/i18n/locales/fr/translation.json b/frontend/src/i18n/locales/fr/translation.json index a63d675ff1..8c699a9f08 100644 --- a/frontend/src/i18n/locales/fr/translation.json +++ b/frontend/src/i18n/locales/fr/translation.json @@ -384,5 +384,6 @@ "\"{{metricName}}\" on {{objectKind}}/{{objectName}} {{metricTarget}}": "\"{{metricName}}\" sur {{objectKind}}/{{objectName}} {{metricTarget}}", "\"{{metricName}}\" on pods": "\"{{metricName}}\" sur les pods", "resource {{resourceName}} on pods": "ressource {{resourceName}} sur les pods", - "resource {{resourceName}} of container {{containerName}} on pods": "ressource {{resourceName}} du conteneur {{containerName}} sur les pods" + "resource {{resourceName}} of container {{containerName}} on pods": "ressource {{resourceName}} du conteneur {{containerName}} sur les pods", + "Warning. Incompatible plugins disabled: ({{ pluginList }})": "Attention. Plugins incompatibles désactivés : ({{ pluginList }})" } diff --git a/frontend/src/i18n/locales/pt/translation.json b/frontend/src/i18n/locales/pt/translation.json index 045d379d58..22d1ef634a 100644 --- a/frontend/src/i18n/locales/pt/translation.json +++ b/frontend/src/i18n/locales/pt/translation.json @@ -384,5 +384,6 @@ "\"{{metricName}}\" on {{objectKind}}/{{objectName}} {{metricTarget}}": "\"{{metricName}}\" em {{objectKind}}/{{objectName}} {{metricTarget}}", "\"{{metricName}}\" on pods": "\"{{metricName}}\" em pods", "resource {{resourceName}} on pods": "resource {{resourceName}} em pods", - "resource {{resourceName}} of container {{containerName}} on pods": "resource {{resourceName}} do container {{containerName}} em pods" + "resource {{resourceName}} of container {{containerName}} on pods": "resource {{resourceName}} do container {{containerName}} em pods", + "Warning. Incompatible plugins disabled: ({{ pluginList }})": "Aviso. Plugins incompatíveis desactivados: ({{ pluginList }})" } diff --git a/frontend/src/plugin/Plugins.tsx b/frontend/src/plugin/Plugins.tsx index de4c37b480..46521ec7b5 100644 --- a/frontend/src/plugin/Plugins.tsx +++ b/frontend/src/plugin/Plugins.tsx @@ -1,8 +1,12 @@ +import Button from '@mui/material/Button'; +import { SnackbarKey, useSnackbar } from 'notistack'; import { useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; import { useDispatch } from 'react-redux'; +import { useHistory } from 'react-router-dom'; +import helpers from '../helpers'; import { UI_INITIALIZE_PLUGIN_VIEWS } from '../redux/actions/actions'; import { useTypedSelector } from '../redux/reducers/reducers'; -// import { useAppDispatch } from '../redux/hooks'; import { fetchAndExecutePlugins } from './index'; import { pluginsLoaded, setPluginSettings } from './pluginsSlice'; @@ -18,15 +22,53 @@ import { pluginsLoaded, setPluginSettings } from './pluginsSlice'; */ export default function Plugins() { const dispatch = useDispatch(); + const { closeSnackbar, enqueueSnackbar } = useSnackbar(); + const history = useHistory(); + const { t } = useTranslation(); + const settingsPlugins = useTypedSelector(state => state.plugins.pluginSettings); // only run on first load useEffect(() => { dispatch({ type: UI_INITIALIZE_PLUGIN_VIEWS }); - fetchAndExecutePlugins(settingsPlugins, updatedSettingsPackages => { - dispatch(setPluginSettings(updatedSettingsPackages)); - }) + fetchAndExecutePlugins( + settingsPlugins, + updatedSettingsPackages => { + dispatch(setPluginSettings(updatedSettingsPackages)); + }, + incompatiblePlugins => { + const pluginList = Object.values(incompatiblePlugins) + .map(p => p.name) + .join(', '); + const message = t( + 'translation|Warning. Incompatible plugins disabled: ({{ pluginList }})', + { pluginList } + ); + console.warn(message); + + if (helpers.isElectron()) { + enqueueSnackbar(message, { + action: (snackbarId: SnackbarKey) => ( + <> + + + ), + }); + } else { + enqueueSnackbar(message); + } + } + ) .finally(() => { dispatch(pluginsLoaded()); // Warn the app (if we're in app mode). diff --git a/frontend/src/plugin/index.ts b/frontend/src/plugin/index.ts index 6d21b2da1f..fb48485a7c 100644 --- a/frontend/src/plugin/index.ts +++ b/frontend/src/plugin/index.ts @@ -210,11 +210,13 @@ export function updateSettingsPackages( * * @param settingsPackages The packages settings knows about. * @param onSettingsChange Called when the plugins are different to what is in settings. + * @param onIncompatible Called when there are incompatible plugins. * */ export async function fetchAndExecutePlugins( settingsPackages: PluginInfo[], - onSettingsChange: (plugins: PluginInfo[]) => void + onSettingsChange: (plugins: PluginInfo[]) => void, + onIncompatible: (plugins: Record) => void ) { const pluginPaths = (await fetch(`${helpers.getAppUrl()}plugins`).then(resp => resp.json() @@ -275,12 +277,7 @@ export async function fetchAndExecutePlugins( ); if (Object.keys(incompatiblePlugins).length > 0) { - console.warn( - 'The following plugins are not compatible and will not be executed:' + - Object.values(incompatiblePlugins) - .map(p => p.name) - .join(', ') - ); + onIncompatible(incompatiblePlugins); } sourcesToExecute.forEach((source, index) => { From 67eeaeab1ec55eb8c9e78bcf8d5ec4324c06c0a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Dudfield?= Date: Fri, 1 Mar 2024 10:31:53 +0100 Subject: [PATCH 4/5] frontend: PluginSettings: Show incompatible plugins MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Show "incompatible" in status column for incompatible plugins. Also disable the enable plugin control for incompatible plugins. Signed-off-by: René Dudfield --- .../PluginSettings/PluginSettings.stories.tsx | 1 + .../App/PluginSettings/PluginSettings.tsx | 6 + .../PluginSettings.stories.storyshot | 500 ++---------------- frontend/src/i18n/locales/de/translation.json | 1 + frontend/src/i18n/locales/en/translation.json | 1 + frontend/src/i18n/locales/es/translation.json | 1 + frontend/src/i18n/locales/fr/translation.json | 1 + frontend/src/i18n/locales/pt/translation.json | 1 + frontend/src/plugin/index.ts | 9 + frontend/src/plugin/pluginsSlice.ts | 5 + 10 files changed, 66 insertions(+), 460 deletions(-) diff --git a/frontend/src/components/App/PluginSettings/PluginSettings.stories.tsx b/frontend/src/components/App/PluginSettings/PluginSettings.stories.tsx index d5928036e9..3ed2ae0f04 100644 --- a/frontend/src/components/App/PluginSettings/PluginSettings.stories.tsx +++ b/frontend/src/components/App/PluginSettings/PluginSettings.stories.tsx @@ -26,6 +26,7 @@ function createDemoData(arrSize: number, useHomepage?: boolean) { name: `plugin a ${i}`, description: `This is a plugin for this project PLUGIN A${i}`, isEnabled: i % 2 === 0, + isCompatible: i % 2 === 0, }; if (useHomepage) { diff --git a/frontend/src/components/App/PluginSettings/PluginSettings.tsx b/frontend/src/components/App/PluginSettings/PluginSettings.tsx index dfe2196b9a..e1e5c46d0a 100644 --- a/frontend/src/components/App/PluginSettings/PluginSettings.tsx +++ b/frontend/src/components/App/PluginSettings/PluginSettings.tsx @@ -210,6 +210,9 @@ export function PluginSettingsPure(props: PluginSettingsPureProps) { { label: t('translation|Status'), getter: plugin => { + if (plugin.isCompatible === false) { + return t('translation|Incompatible'); + } return plugin.isEnabled ? t('translation|Enabled') : t('translation|Disabled'); }, sort: true, @@ -217,6 +220,9 @@ export function PluginSettingsPure(props: PluginSettingsPureProps) { { label: t('translation|Enable'), getter: plugin => { + if (!plugin.isCompatible) { + return null; + } return ( - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> - Disabled + Incompatible - - - - - - - - + /> 0) { onIncompatible(incompatiblePlugins); + const packagesIncompatibleSet: PluginInfo[] = updatedSettingsPackages.map( + (plugin: PluginInfo) => { + return { + ...plugin, + isCompatible: !incompatiblePlugins[plugin.name], + }; + } + ); + onSettingsChange(packagesIncompatibleSet); } sourcesToExecute.forEach((source, index) => { diff --git a/frontend/src/plugin/pluginsSlice.ts b/frontend/src/plugin/pluginsSlice.ts index d4494e9389..500e5b31ce 100644 --- a/frontend/src/plugin/pluginsSlice.ts +++ b/frontend/src/plugin/pluginsSlice.ts @@ -57,6 +57,11 @@ export type PluginInfo = { */ isEnabled?: boolean; + /** + * isCompatible is true when the plugin is compatible with this version of Headlamp. + */ + isCompatible?: boolean; + version?: string; // unused by PluginSettings author?: string; // unused by PluginSettings /** From df55a76a9ff9b3ff3cb1a2798188a8b05dc63580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Dudfield?= Date: Sat, 2 Mar 2024 08:11:51 +0100 Subject: [PATCH 5/5] frontend: PluginSettings: Fix enable switch to only show in app mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: René Dudfield --- e2e-tests/tests/pluginSetting.spec.ts | 3 +- .../App/PluginSettings/PluginSettings.tsx | 20 +- .../PluginSettings.stories.storyshot | 770 ------------------ 3 files changed, 14 insertions(+), 779 deletions(-) diff --git a/e2e-tests/tests/pluginSetting.spec.ts b/e2e-tests/tests/pluginSetting.spec.ts index 62bcd632a3..593bc8ebc4 100644 --- a/e2e-tests/tests/pluginSetting.spec.ts +++ b/e2e-tests/tests/pluginSetting.spec.ts @@ -10,7 +10,8 @@ test('plugin settings page should have a title', async ({ page }) => { test('plugin settings page should have a table', async ({ page }) => { const headlampPage = new HeadlampPage(page); - const expectedHeaders = ['Name', 'Description', 'Origin', 'Status', 'Enable']; + const expectedHeaders = ['Name', 'Description', 'Origin', 'Status']; + // note: Enable column is only there in app mode. await headlampPage.authenticate(); await headlampPage.navigateTopage('/settings/plugins', /Plugins/); diff --git a/frontend/src/components/App/PluginSettings/PluginSettings.tsx b/frontend/src/components/App/PluginSettings/PluginSettings.tsx index e1e5c46d0a..a2d1eec360 100644 --- a/frontend/src/components/App/PluginSettings/PluginSettings.tsx +++ b/frontend/src/components/App/PluginSettings/PluginSettings.tsx @@ -5,6 +5,7 @@ import Link from '@mui/material/Link'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useDispatch } from 'react-redux'; +import helpers from '../../../helpers'; import { useFilterFunc } from '../../../lib/util'; import { PluginInfo, reloadPage, setPluginSettings } from '../../../plugin/pluginsSlice'; import { useTypedSelector } from '../../../redux/reducers/reducers'; @@ -167,7 +168,7 @@ export function PluginSettingsPure(props: PluginSettingsPureProps) { columns={[ { label: t('translation|Name'), - getter: plugin => { + getter: (plugin: PluginInfo) => { return ( <> @@ -183,7 +184,7 @@ export function PluginSettingsPure(props: PluginSettingsPureProps) { ); }, - sort: (a, b) => a.name.localeCompare(b.name), + sort: (a: PluginInfo, b: PluginInfo) => a.name.localeCompare(b.name), }, { label: t('translation|Description'), @@ -192,7 +193,7 @@ export function PluginSettingsPure(props: PluginSettingsPureProps) { }, { label: t('translation|Origin'), - getter: plugin => { + getter: (plugin: PluginInfo) => { const url = plugin?.homepage || plugin?.repository?.url; return plugin?.origin ? ( url ? ( @@ -209,7 +210,7 @@ export function PluginSettingsPure(props: PluginSettingsPureProps) { // TODO: Fetch the plugin status from the plugin settings store { label: t('translation|Status'), - getter: plugin => { + getter: (plugin: PluginInfo) => { if (plugin.isCompatible === false) { return t('translation|Incompatible'); } @@ -219,8 +220,8 @@ export function PluginSettingsPure(props: PluginSettingsPureProps) { }, { label: t('translation|Enable'), - getter: plugin => { - if (!plugin.isCompatible) { + getter: (plugin: PluginInfo) => { + if (!plugin.isCompatible || !helpers.isElectron()) { return null; } return ( @@ -233,9 +234,12 @@ export function PluginSettingsPure(props: PluginSettingsPureProps) { /> ); }, - sort: (a, b) => (a.isEnabled === b.isEnabled ? 0 : a.isEnabled ? -1 : 1), + sort: (a: PluginInfo, b: PluginInfo) => + a.isEnabled === b.isEnabled ? 0 : a.isEnabled ? -1 : 1, }, - ]} + ] + // remove the enable column if we're not in app mode + .filter(el => !(el.label === t('translation|Enable') && !helpers.isElectron()))} data={pluginChanges} filterFunction={useFilterFunc(['.name'])} /> diff --git a/frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.stories.storyshot b/frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.stories.storyshot index 4fbac23daf..8c1415e948 100644 --- a/frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.stories.storyshot +++ b/frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.stories.storyshot @@ -131,23 +131,6 @@ exports[`Storyshots Settings/PluginSettings Default Save Enable 1`] = ` /> - - Enable - - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - @@ -636,23 +538,6 @@ exports[`Storyshots Settings/PluginSettings Empty Homepage Items 1`] = ` /> - - Enable - - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - @@ -1058,23 +862,6 @@ exports[`Storyshots Settings/PluginSettings Few Items 1`] = ` /> - - Enable - - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - @@ -1480,23 +1186,6 @@ exports[`Storyshots Settings/PluginSettings Many Items 1`] = ` /> - - Enable - - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - @@ -2402,23 +1870,6 @@ exports[`Storyshots Settings/PluginSettings More Items 1`] = ` /> - - Enable - - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - - Incompatible - Enabled - - - - - - - - -