diff --git a/src/components/Menu/AssistantAction.vue b/src/components/Menu/AssistantAction.vue index b0bf415b0a7..d8e6b4fc87f 100644 --- a/src/components/Menu/AssistantAction.vue +++ b/src/components/Menu/AssistantAction.vue @@ -59,7 +59,8 @@ close-after-click @click="showTaskList = true"> {{ t('text', 'Show assistant results') }} @@ -161,6 +162,7 @@ import NcActions from '@nextcloud/vue/components/NcActions' import NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator' import NcAssistantIcon from '@nextcloud/vue/components/NcAssistantIcon' import NcListItem from '@nextcloud/vue/components/NcListItem' +import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon' import NcModal from '@nextcloud/vue/components/NcModal' import ErrorOutlineIcon from 'vue-material-design-icons/AlertCircleOutline.vue' import CheckCircleOutlineIcon from 'vue-material-design-icons/CheckCircleOutline.vue' @@ -206,6 +208,7 @@ export default { NcActionButton, NcActionSeparator, NcListItem, + NcLoadingIcon, NcModal, }, extends: BaseActionEntry, @@ -217,9 +220,10 @@ export default { data() { return { menuOpen: false, - taskTypes: OCP.InitialState.loadState('text', 'taskprocessing'), + taskTypes: loadState('text', 'taskprocessing', []), selection: '', tasks: [], + loading: false, STATUS_FAILED, STATUS_RUNNING, @@ -262,9 +266,17 @@ export default { return this.taskTypes.map((type) => type.id) }, }, + watch: { + async menuOpen(isOpen) { + if (isOpen && this.tasks.length === 0) { + this.loading = true + await this.fetchTasks() + this.loading = false + } + }, + }, beforeMount() { this.editor.on('selectionUpdate', this.onSelection) - this.fetchTasks() subscribe('notifications:notification:received', this.checkNotification) }, beforeDestroy() { diff --git a/src/components/Menu/MenuBar.vue b/src/components/Menu/MenuBar.vue index 2e839067402..3fd154084e3 100644 --- a/src/components/Menu/MenuBar.vue +++ b/src/components/Menu/MenuBar.vue @@ -129,11 +129,12 @@ export default { data() { return { - entries: this.openReadOnly + entries: (this.openReadOnly ? [...ReadOnlyDoneEntries, ...MenuEntries] : this.isPublic || this.isRichWorkspace ? [...MenuEntries] - : [...MenuEntries, ...AssistantMenuEntries], + : [...MenuEntries, ...AssistantMenuEntries] + ).filter((entry) => !!entry), randomID: `menu-bar-${Math.ceil(Math.random() * 10000 + 500).toString(16)}`, displayHelp: false, isReady: false, diff --git a/src/components/Menu/entries.js b/src/components/Menu/entries.js index 44fe26aab66..cf10cd17826 100644 --- a/src/components/Menu/entries.js +++ b/src/components/Menu/entries.js @@ -43,6 +43,7 @@ import ActionInsertLink from './ActionInsertLink.vue' import AssistantAction from './AssistantAction.vue' import EmojiPickerAction from './EmojiPickerAction.vue' +import { loadState } from '@nextcloud/initial-state' import { t } from '@nextcloud/l10n' import { isMobileDevice } from '../../helpers/isMobileDevice.js' import { MODIFIERS } from './keys.js' @@ -465,12 +466,15 @@ if (!isMobileDevice) { }) } -// TODO: Disable in rich workspace +const hasAssistantTaskTypes = loadState('text', 'taskprocessing', []).length > 0 + export const AssistantMenuEntries = [ - { - key: 'assistant', - label: t('text', 'Nextcloud Assistant'), - component: AssistantAction, - priority: 7, - }, + hasAssistantTaskTypes + ? { + key: 'assistant', + label: t('text', 'Nextcloud Assistant'), + component: AssistantAction, + priority: 7, + } + : undefined, ]