Compare commits

...

3 Commits

Author SHA1 Message Date
Sebastian 71fefcb056 chore(deps): update dependency vue-tsc to v3.3.11
Build Test / test (pull_request) Successful in 50s
JS Unit Tests / test (pull_request) Successful in 1m8s
2026-09-01 03:05:29 +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 28 additions and 27 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');
}
}
}
+7 -7
View File
@@ -1032,9 +1032,9 @@
"license": "MIT"
},
"node_modules/@vue/language-core": {
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.8.tgz",
"integrity": "sha512-ieGT8jJdhhy0mGzStZhsg/qPw5bQZJg5yF+3+XU6saf4sM7yo9ZXy3h+nCwrm2+b4qS/SypkNdR2jAF3uei9tA==",
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.11.tgz",
"integrity": "sha512-QJmpliwAVpC/OxubIByPAhNzsQPRc8/gxlN2qnVzVfIMjMDz/9RnXRFoetjz5yEgXVXyp4LqhXq3V53PjmNzFw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3176,14 +3176,14 @@
}
},
"node_modules/vue-tsc": {
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.8.tgz",
"integrity": "sha512-xXmYlVQpcwJDWyGlqbHrGVOl1h3UOsASymRibrHc+iy9j/UNnOrOn4u+fntHz4D6Cs74RtapeqVV6CzJeg+UlA==",
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.11.tgz",
"integrity": "sha512-gOb0B9rtU2+f1dszwPqSH5kAieIF9ReeLhD3kSRNHv5WZZUQz/JdVXW0RTdqhNTMlQkqKzrTTviqKr/4FYZraQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/typescript": "2.4.28",
"@vue/language-core": "3.3.8"
"@vue/language-core": "3.3.11"
},
"bin": {
"vue-tsc": "bin/vue-tsc.js"
+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"