Compare commits

...

3 Commits

Author SHA1 Message Date
Sebastian 59546ae163 chore(deps): update dependency pinia to v4.0.3
JS Unit Tests / test (pull_request) Successful in 1m10s
Build Test / test (pull_request) Successful in 1m21s
2026-09-01 03:05:25 +00:00
Sebastian f14de07061 refactor(module): register browser integration through context
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-08-31 22:55:11 -04:00
Sebastian cf0d90ffa7 feat(preview): disable previews when storage is unavailable
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-08-31 22:55:11 -04:00
3 changed files with 24 additions and 23 deletions
+7 -12
View File
@@ -2,13 +2,14 @@
namespace KTXM\Documents;
use KTXF\Module\ModuleBrowserInterface;
use KTXF\Module\Configuration\BrowserModuleContextInterface;
use KTXF\Module\Configuration\ModuleContextInterface;
use KTXF\Module\ModuleInstanceAbstract;
/**
* Documents Module - Document Browser UI
*/
class Module extends ModuleInstanceAbstract implements ModuleBrowserInterface
class Module extends ModuleInstanceAbstract
{
public function __construct()
@@ -50,16 +51,10 @@ class Module extends ModuleInstanceAbstract implements ModuleBrowserInterface
];
}
public function registerBI(): array
public function configure(ModuleContextInterface $context): void
{
return [
'handle' => $this->handle(),
'namespace' => 'Documents',
'version' => $this->version(),
'label' => $this->label(),
'author' => $this->author(),
'description' => $this->description(),
'boot' => 'static/module.mjs',
];
if ($context instanceof BrowserModuleContextInterface) {
$context->registerModule($this, 'Documents', 'static/module.mjs');
}
}
}
+3 -3
View File
@@ -2359,9 +2359,9 @@
}
},
"node_modules/pinia": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/pinia/-/pinia-4.0.2.tgz",
"integrity": "sha512-yKVVA7bSj5oRZFp/Ab9wLlmyb5gPUYEiIm4ryiWTe/xe7PtkRdMVOp1X1ggvq0c6Uj7Q0Du1HnV2mtAwM0Ks1g==",
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/pinia/-/pinia-4.0.3.tgz",
"integrity": "sha512-XMQqpvjgG7LMqVhhFUzKLT4KEbsYbfZZ0CZU9PgdFm1O2VKBmIkykL8+SfNhOaT7sR0wT6BEgKT0YNDYWgmVRA==",
"license": "MIT",
"dependencies": {
"nostics": "^1.1.4"
+14 -8
View File
@@ -1,7 +1,7 @@
<script setup lang="ts">
import { ref, computed, onMounted, watch, nextTick, defineAsyncComponent } from 'vue'
import { useDisplay } from 'vuetify'
import { useModuleStore, useIntegrationStore } from '@KTXC'
import { useModuleStore, useIntegrationStore, usePreviewStore } from '@KTXC'
import { useDocumentManager, useDocumentSelection, useFileUpload, useFileEditor } from '@/composables'
import type { ViewMode, SortField, SortOrder, BreadcrumbItem } from '@/types'
import { CollectionObject } from '@DocumentsManager/models/collection'
@@ -31,6 +31,8 @@ const isMobile = computed(() => display.mdAndDown.value)
const moduleStore = useModuleStore()
const integrationStore = useIntegrationStore()
const previewStore = usePreviewStore()
const previewsAvailable = computed(() => previewStore.availability.storage)
const isFileManagerAvailable = computed(() => {
return moduleStore.has('documents_manager') || moduleStore.has('DocumentsManager')
})
@@ -128,7 +130,10 @@ function entityToViewerItem(entity: EntityObject): ViewerItem {
}
}
function resolveViewerSource(item: ViewerItem): string {
function resolveViewerSource(item: ViewerItem): string | Promise<string> {
if (!previewsAvailable.value) {
return Promise.reject(new Error('Preview storage is unavailable'))
}
return documentManager.getEntityPreviewUrl(
item.id,
(item.meta?.collection as string | null) ?? null,
@@ -154,6 +159,7 @@ function resolveThumbnailSource(item: ViewerItem): string {
// Preview shown in the info panel sidebar for the current single selection
const infoPanelPreviewUrl = computed<string | null>(() => {
if (!previewsAvailable.value) return null
const items = selection.selectedNodeArray.value
if (items.length !== 1) return null
const item = items[0]
@@ -815,8 +821,8 @@ onMounted(async () => {
:collections="sortedItems.collections"
:entities="sortedItems.entities"
:selected-ids="selectedIds"
:preview-source="resolvePreviewSource"
:thumbnail-source="resolveThumbnailSource"
:preview-source="previewsAvailable ? resolvePreviewSource : undefined"
:thumbnail-source="previewsAvailable ? resolveThumbnailSource : undefined"
@item-click="handleItemClick"
@open="handleOpenItem"
@edit="handleEditItem"
@@ -832,8 +838,8 @@ onMounted(async () => {
:collections="sortedItems.collections"
:entities="sortedItems.entities"
:selected-ids="selectedIds"
:preview-source="resolvePreviewSource"
:thumbnail-source="resolveThumbnailSource"
:preview-source="previewsAvailable ? resolvePreviewSource : undefined"
:thumbnail-source="previewsAvailable ? resolveThumbnailSource : undefined"
@item-click="handleItemClick"
@open="handleOpenItem"
@edit="handleEditItem"
@@ -849,8 +855,8 @@ onMounted(async () => {
:collections="sortedItems.collections"
:entities="sortedItems.entities"
:selected-ids="selectedIds"
:preview-source="resolvePreviewSource"
:thumbnail-source="resolveThumbnailSource"
:preview-source="previewsAvailable ? resolvePreviewSource : undefined"
:thumbnail-source="previewsAvailable ? resolveThumbnailSource : undefined"
@item-click="handleItemClick"
@open="handleOpenItem"
@edit="handleEditItem"