From f6123c2d708c7f613919640a859dd1865220d13f Mon Sep 17 00:00:00 2001 From: Tiina Turban Date: Tue, 17 Oct 2023 12:10:33 +0200 Subject: [PATCH] feat: Separate out apps management tab (#18013) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .../scenes-app-apps--installed.png | Bin 46689 -> 33995 bytes frontend/src/scenes/plugins/AppsScene.tsx | 8 +- .../plugins/tabs/apps/AppManagementView.tsx | 138 +++++++++++++++ .../src/scenes/plugins/tabs/apps/AppView.tsx | 97 +---------- .../plugins/tabs/apps/AppsManagementTab.tsx | 115 +++++++++++++ .../src/scenes/plugins/tabs/apps/AppsTab.tsx | 158 ++---------------- .../scenes/plugins/tabs/apps/AppsTable.tsx | 61 +++++++ frontend/src/scenes/plugins/types.ts | 1 + 8 files changed, 340 insertions(+), 238 deletions(-) create mode 100644 frontend/src/scenes/plugins/tabs/apps/AppManagementView.tsx create mode 100644 frontend/src/scenes/plugins/tabs/apps/AppsManagementTab.tsx create mode 100644 frontend/src/scenes/plugins/tabs/apps/AppsTable.tsx diff --git a/frontend/__snapshots__/scenes-app-apps--installed.png b/frontend/__snapshots__/scenes-app-apps--installed.png index 848a0e2dfdc2d645ae0617d5935f481bf6bfc0e2..34ae3b5167bb3ea0732ab4a0c4f58dd3a1420453 100644 GIT binary patch literal 33995 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 literal 46689 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, }, + canGloballyManagePlugins(user?.organization) && { + key: PluginTab.AppsManagement, + label: 'Apps Management', + content: , + }, ]} /> diff --git a/frontend/src/scenes/plugins/tabs/apps/AppManagementView.tsx b/frontend/src/scenes/plugins/tabs/apps/AppManagementView.tsx new file mode 100644 index 0000000000000..6324af5a536b8 --- /dev/null +++ b/frontend/src/scenes/plugins/tabs/apps/AppManagementView.tsx @@ -0,0 +1,138 @@ +import { LemonButton, Link } from '@posthog/lemon-ui' +import { useActions, useValues } from 'kea' +import { IconCheckmark, IconCloudDownload } from 'lib/lemon-ui/icons' +import { PluginImage } from 'scenes/plugins/plugin/PluginImage' +import { pluginsLogic } from 'scenes/plugins/pluginsLogic' +import { PluginTypeWithConfig, PluginRepositoryEntry, PluginInstallationType } from 'scenes/plugins/types' +import { PluginType } from '~/types' +import { PluginTags } from './components' +import { Tooltip } from 'lib/lemon-ui/Tooltip' +import { Popconfirm } from 'antd' +import { DeleteOutlined, GlobalOutlined, RollbackOutlined } from '@ant-design/icons' +import { canGloballyManagePlugins } from 'scenes/plugins/access' +import { userLogic } from 'scenes/userLogic' + +export function AppManagementView({ + plugin, +}: { + plugin: PluginTypeWithConfig | PluginType | PluginRepositoryEntry +}): JSX.Element { + const { user } = useValues(userLogic) + + if (!canGloballyManagePlugins(user?.organization)) { + return <> + } + const { installingPluginUrl, pluginsNeedingUpdates, pluginsUpdating, loading, unusedPlugins } = + useValues(pluginsLogic) + const { installPlugin, editPlugin, updatePlugin, uninstallPlugin, patchPlugin } = useActions(pluginsLogic) + + return ( +

+
+ +
+
+ + + {plugin.name} + + + +
+
{plugin.description}
+
+
+ +
+ {'id' in plugin ? ( + <> + {'updateStatus' in plugin && pluginsNeedingUpdates.find((x) => x.id === plugin.id) && ( + { + plugin.updateStatus?.updated ? editPlugin(plugin.id) : updatePlugin(plugin.id) + }} + loading={pluginsUpdating.includes(plugin.id)} + icon={plugin.updateStatus?.updated ? : } + > + {plugin.updateStatus?.updated ? 'Updated' : 'Update'} + + )} + uninstallPlugin(plugin.id)} + okText="Uninstall" + cancelText="Cancel" + className="Plugins__Popconfirm" + > + } + disabledReason={ + unusedPlugins.includes(plugin.id) ? undefined : 'This app is still in use.' + } + data-attr="plugin-uninstall" + > + Uninstall + + + {plugin.is_global ? ( + + This app can currently be used by other organizations in this instance of + PostHog. This action will disable and hide it for all organizations other + than yours. + + } + > + } + onClick={() => patchPlugin(plugin.id, { is_global: false })} + > + Make local + + + ) : ( + + This action will mark this app as installed for all organizations in this + instance of PostHog. + + } + > + } + onClick={() => patchPlugin(plugin.id, { is_global: true })} + > + Make global + + + )} + + ) : ( + } + size="small" + onClick={() => + plugin.url ? installPlugin(plugin.url, PluginInstallationType.Repository) : undefined + } + > + Install + + )} +
+
+ ) +} diff --git a/frontend/src/scenes/plugins/tabs/apps/AppView.tsx b/frontend/src/scenes/plugins/tabs/apps/AppView.tsx index 8a190a014c3af..f76dae1df1a38 100644 --- a/frontend/src/scenes/plugins/tabs/apps/AppView.tsx +++ b/frontend/src/scenes/plugins/tabs/apps/AppView.tsx @@ -1,10 +1,8 @@ import { Link, LemonButton, LemonBadge } from '@posthog/lemon-ui' import { useActions, useValues } from 'kea' -import { DeleteOutlined, GlobalOutlined, RollbackOutlined } from '@ant-design/icons' import { LemonMenuItem, LemonMenu } from 'lib/lemon-ui/LemonMenu' import { IconLink, - IconCheckmark, IconCloudDownload, IconSettings, IconEllipsis, @@ -19,27 +17,14 @@ import { urls } from 'scenes/urls' import { PluginType } from '~/types' import { PluginTags } from './components' import { Tooltip } from 'lib/lemon-ui/Tooltip' -import { userLogic } from 'scenes/userLogic' -import { canGloballyManagePlugins } from 'scenes/plugins/access' -import { Popconfirm } from 'antd' export function AppView({ plugin, }: { plugin: PluginTypeWithConfig | PluginType | PluginRepositoryEntry }): JSX.Element { - const { - installingPluginUrl, - pluginsNeedingUpdates, - pluginsUpdating, - showAppMetricsForPlugin, - loading, - sortableEnabledPlugins, - unusedPlugins, - } = useValues(pluginsLogic) - const { installPlugin, editPlugin, toggleEnabled, updatePlugin, openReorderModal, patchPlugin, uninstallPlugin } = - useActions(pluginsLogic) - const { user } = useValues(userLogic) + const { installingPluginUrl, showAppMetricsForPlugin, loading, sortableEnabledPlugins } = useValues(pluginsLogic) + const { installPlugin, editPlugin, toggleEnabled, openReorderModal } = useActions(pluginsLogic) const pluginConfig = 'pluginConfig' in plugin ? plugin.pluginConfig : null const isConfigured = !!pluginConfig?.id @@ -144,84 +129,6 @@ export function AppView({ )} - {'updateStatus' in plugin && pluginsNeedingUpdates.find((x) => x.id === plugin.id) && ( - { - plugin.updateStatus?.updated ? editPlugin(plugin.id) : updatePlugin(plugin.id) - }} - loading={pluginsUpdating.includes(plugin.id)} - icon={plugin.updateStatus?.updated ? : } - > - {plugin.updateStatus?.updated ? 'Updated' : 'Update'} - - )} - - {canGloballyManagePlugins(user?.organization) && ( - <> - uninstallPlugin(plugin.id)} - okText="Uninstall" - cancelText="Cancel" - className="Plugins__Popconfirm" - > - } - disabledReason={ - unusedPlugins.includes(plugin.id) ? undefined : 'This app is still in use.' - } - data-attr="plugin-uninstall" - > - Uninstall - - - {plugin.is_global ? ( - - This app can currently be used by other organizations in this instance - of PostHog. This action will disable and hide it for all - organizations other than yours. - - } - > - } - onClick={() => patchPlugin(plugin.id, { is_global: false })} - > - Make local - - - ) : ( - - This action will mark this app as installed for all organizations{' '} - in this instance of PostHog. - - } - > - } - onClick={() => patchPlugin(plugin.id, { is_global: true })} - > - Make global - - - )} - - )} - {pluginConfig.id && (pluginConfig.error ? ( + } + + const { checkForUpdates, openAdvancedInstallModal } = useActions(pluginsLogic) + + const { + installedPlugins, + installedPluginUrls, + filteredPluginsNeedingUpdates, + loading, + filteredUninstalledPlugins, + repositoryLoading, + pluginsNeedingUpdates, + hasUpdatablePlugins, + checkingForUpdates, + updateStatus, + } = useValues(pluginsLogic) + + const officialPlugins = useMemo( + () => filteredUninstalledPlugins.filter((plugin) => plugin.maintainer === 'official'), + [filteredUninstalledPlugins] + ) + const communityPlugins = useMemo( + () => filteredUninstalledPlugins.filter((plugin) => plugin.maintainer === 'community'), + [filteredUninstalledPlugins] + ) + + const renderfn: (plugin: PluginTypeWithConfig | PluginType | PluginRepositoryEntry) => JSX.Element = (plugin) => ( + + ) + + return ( + <> +
+
+ + +
+ {hasUpdatablePlugins && ( + 0 ? : } + onClick={(e) => { + e.stopPropagation() + checkForUpdates(true) + }} + loading={checkingForUpdates} + > + {checkingForUpdates + ? `Checking app ${Object.keys(updateStatus).length + 1} out of ${ + Object.keys(installedPluginUrls).length + }` + : pluginsNeedingUpdates.length > 0 + ? 'Check again for updates' + : 'Check for updates'} + + )} + + Install app (advanced) + +
+
+ + {filteredPluginsNeedingUpdates.length > 0 && ( + + )} + + + + {canGloballyManagePlugins(user?.organization) && ( + <> + + + + + + )} +
+ + + ) +} diff --git a/frontend/src/scenes/plugins/tabs/apps/AppsTab.tsx b/frontend/src/scenes/plugins/tabs/apps/AppsTab.tsx index db786812d56eb..a02ad02f27fef 100644 --- a/frontend/src/scenes/plugins/tabs/apps/AppsTab.tsx +++ b/frontend/src/scenes/plugins/tabs/apps/AppsTab.tsx @@ -1,45 +1,20 @@ -import { LemonTable, LemonButton, LemonDivider } from '@posthog/lemon-ui' -import { useActions, useValues } from 'kea' -import { IconCloudDownload, IconRefresh, IconUnfoldLess, IconUnfoldMore } from 'lib/lemon-ui/icons' -import { useMemo, useState } from 'react' +import { useValues } from 'kea' import { PluginsSearch } from 'scenes/plugins/PluginsSearch' -import { canGloballyManagePlugins, canInstallPlugins } from 'scenes/plugins/access' import { pluginsLogic } from 'scenes/plugins/pluginsLogic' -import { PluginRepositoryEntry, PluginTypeWithConfig } from 'scenes/plugins/types' -import { userLogic } from 'scenes/userLogic' -import { PluginType } from '~/types' -import { AdvancedInstallModal } from './AdvancedInstallModal' -import { AppView } from './AppView' import { PluginDrawer } from 'scenes/plugins/edit/PluginDrawer' import { BatchExportsAlternativeWarning } from './components' import { InstalledAppsReorderModal } from './InstalledAppsReorderModal' +import { AppsTable } from './AppsTable' +import { AppView } from './AppView' +import { PluginRepositoryEntry, PluginTypeWithConfig } from 'scenes/plugins/types' +import { PluginType } from '~/types' export function AppsTab(): JSX.Element { - const { user } = useValues(userLogic) - const { checkForUpdates, openAdvancedInstallModal } = useActions(pluginsLogic) + const { sortableEnabledPlugins, unsortableEnabledPlugins, filteredDisabledPlugins, loading } = + useValues(pluginsLogic) - const { - sortableEnabledPlugins, - unsortableEnabledPlugins, - filteredDisabledPlugins, - installedPluginUrls, - filteredPluginsNeedingUpdates, - loading, - filteredUninstalledPlugins, - repositoryLoading, - pluginsNeedingUpdates, - hasUpdatablePlugins, - checkingForUpdates, - updateStatus, - } = useValues(pluginsLogic) - - const officialPlugins = useMemo( - () => filteredUninstalledPlugins.filter((plugin) => plugin.maintainer === 'official'), - [filteredUninstalledPlugins] - ) - const communityPlugins = useMemo( - () => filteredUninstalledPlugins.filter((plugin) => plugin.maintainer === 'community'), - [filteredUninstalledPlugins] + const renderfn: (plugin: PluginTypeWithConfig | PluginType | PluginRepositoryEntry) => JSX.Element = (plugin) => ( + ) return ( @@ -47,126 +22,25 @@ export function AppsTab(): JSX.Element {
- -
- {canInstallPlugins(user?.organization) && hasUpdatablePlugins && ( - 0 ? : } - onClick={(e) => { - e.stopPropagation() - checkForUpdates(true) - }} - loading={checkingForUpdates} - > - {checkingForUpdates - ? `Checking app ${Object.keys(updateStatus).length + 1} out of ${ - Object.keys(installedPluginUrls).length - }` - : pluginsNeedingUpdates.length > 0 - ? 'Check again for updates' - : 'Check for updates'} - - )} - - {canInstallPlugins(user?.organization) && ( - - Install app (advanced) - - )} -
- {filteredPluginsNeedingUpdates.length > 0 && ( - - )} - + - - - {canGloballyManagePlugins(user?.organization) && ( - <> - - - - - - )}
- ) } - -export function AppsTable({ - title = 'Apps', - plugins, - loading, -}: { - title?: string - plugins: (PluginTypeWithConfig | PluginType | PluginRepositoryEntry)[] - loading: boolean -}): JSX.Element { - const [expanded, setExpanded] = useState(true) - const { searchTerm } = useValues(pluginsLogic) - - return ( - - : } - onClick={() => setExpanded(!expanded)} - className="-ml-2 mr-2" - /> - {title} - - ), - key: 'app', - render: (_, plugin) => { - return - }, - }, - ]} - emptyState={ - !expanded ? ( - - setExpanded(true)}> - Show apps - - - ) : searchTerm ? ( - 'No apps matching your search criteria' - ) : ( - 'No apps found' - ) - } - /> - ) -} diff --git a/frontend/src/scenes/plugins/tabs/apps/AppsTable.tsx b/frontend/src/scenes/plugins/tabs/apps/AppsTable.tsx new file mode 100644 index 0000000000000..5fb4af0d52ac7 --- /dev/null +++ b/frontend/src/scenes/plugins/tabs/apps/AppsTable.tsx @@ -0,0 +1,61 @@ +import { LemonTable, LemonButton } from '@posthog/lemon-ui' +import { useValues } from 'kea' +import { IconUnfoldLess, IconUnfoldMore } from 'lib/lemon-ui/icons' +import { useState } from 'react' +import { pluginsLogic } from 'scenes/plugins/pluginsLogic' +import { PluginRepositoryEntry, PluginTypeWithConfig } from 'scenes/plugins/types' +import { PluginType } from '~/types' + +export function AppsTable({ + title = 'Apps', + plugins, + loading, + renderfn, +}: { + title?: string + plugins: (PluginTypeWithConfig | PluginType | PluginRepositoryEntry)[] + loading: boolean + renderfn: (plugin: PluginTypeWithConfig | PluginType | PluginRepositoryEntry) => JSX.Element +}): JSX.Element { + const [expanded, setExpanded] = useState(true) + const { searchTerm } = useValues(pluginsLogic) + + return ( + + : } + onClick={() => setExpanded(!expanded)} + className="-ml-2 mr-2" + /> + {title} + + ), + key: 'app', + // Passing a function to render after loading + render: (_, plugin) => renderfn(plugin), + }, + ]} + emptyState={ + !expanded ? ( + + setExpanded(true)}> + Show apps + + + ) : searchTerm ? ( + 'No apps matching your search criteria' + ) : ( + 'No apps found' + ) + } + /> + ) +} diff --git a/frontend/src/scenes/plugins/types.ts b/frontend/src/scenes/plugins/types.ts index 8eab513b7f398..f662a93708dd5 100644 --- a/frontend/src/scenes/plugins/types.ts +++ b/frontend/src/scenes/plugins/types.ts @@ -37,6 +37,7 @@ export enum PluginInstallationType { export enum PluginTab { Apps = 'apps', + AppsManagement = 'apps_management', BatchExports = 'batch_exports', History = 'history', }