|
@@ -1,118 +1,53 @@
|
|
|
<template>
|
|
|
<LeftPano>
|
|
|
- <template v-for="item in types" :key="item.id">
|
|
|
- <div class="types" v-if="item.floders.length || item.children?.length">
|
|
|
- <h2 @click="showHanlder(item)">
|
|
|
- {{ item.title }}
|
|
|
- <ui-icon :type="`pull-${item.show.value ? 'up' : 'down'}`" class="icon" ctrl />
|
|
|
- </h2>
|
|
|
-
|
|
|
- <div class="floders" v-if="item.show.value">
|
|
|
- <div
|
|
|
- v-for="floder in item.floders"
|
|
|
- :key="floder.filesId"
|
|
|
- class="fun-ctrl"
|
|
|
- @click="preview(floder)"
|
|
|
- >
|
|
|
- <ui-icon :type="typeIcons[floder.metaType]" v-if="floder.metaType" />
|
|
|
- <p>{{ floder.filesTitle }}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <template v-for="item in floderRoots" :key="item.id">
|
|
|
+ <FloderView :root="item" @preview="(v) => preview(v)" />
|
|
|
</template>
|
|
|
</LeftPano>
|
|
|
|
|
|
- <Preview :items="[currentFile]" v-if="currentFile" @close="currentFile = null" />
|
|
|
- <Modal
|
|
|
- width="800px"
|
|
|
- :title="showModalRoot?.title"
|
|
|
- @cancel="showModalRoot = void 0"
|
|
|
- :open="!!showModalRoot"
|
|
|
- :footer="null"
|
|
|
- >
|
|
|
- <ShowFloderRoot :root="showModalRoot" v-if="showModalRoot" @preview="preview" />
|
|
|
- </Modal>
|
|
|
+ <Preview
|
|
|
+ :items="currentItems"
|
|
|
+ :current="currentNdx"
|
|
|
+ v-if="~currentNdx"
|
|
|
+ @close="currentNdx = -1"
|
|
|
+ />
|
|
|
+ <Fire v-model:open="showInfo" />
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
import { LeftPano } from "@/layout";
|
|
|
-import { computed, Ref, ref } from "vue";
|
|
|
+import { ref } from "vue";
|
|
|
import { getUrlType, MetaType, saveAs } from "@/utils";
|
|
|
-import { Preview, MediaItem, MediaType } from "@/components/static-preview/index.vue";
|
|
|
-import { floderRoots, floderTypes, getFloderByType } from "@/store";
|
|
|
-import { Modal } from "ant-design-vue";
|
|
|
-import ShowFloderRoot from "./floder-root-view.vue";
|
|
|
+import { Preview, MediaItem } from "@/components/static-preview/index.vue";
|
|
|
+import { floderRoots, getFlatFloders } from "@/store";
|
|
|
+import FloderView from "./floder-view.vue";
|
|
|
+import Fire from "./fire/index.vue";
|
|
|
|
|
|
import type { Floder, FloderRoot } from "@/store";
|
|
|
import { useViewStack } from "@/hook";
|
|
|
import { showRightPanoStack } from "@/env";
|
|
|
|
|
|
-const showModalRoot = ref<FloderRoot>();
|
|
|
-const types = computed(() =>
|
|
|
- floderRoots.value.map((type) => {
|
|
|
- let show: Ref<boolean>;
|
|
|
- if (type.children?.length) {
|
|
|
- show = computed(() => showModalRoot.value?.id === type.id);
|
|
|
- } else {
|
|
|
- show = ref(true);
|
|
|
- }
|
|
|
- return {
|
|
|
- show,
|
|
|
- ...type,
|
|
|
- };
|
|
|
- })
|
|
|
-);
|
|
|
-
|
|
|
-const typeIcons = {
|
|
|
- [MetaType.image]: "pic",
|
|
|
- [MetaType.video]: "a-film",
|
|
|
- [MetaType.other]: "nav-edit",
|
|
|
- [MetaType.audio]: "nav-edit",
|
|
|
-};
|
|
|
-
|
|
|
-const showHanlder = (item: FloderRoot & { show: Ref<boolean> }) => {
|
|
|
- if (item.children?.length) {
|
|
|
- showModalRoot.value = item;
|
|
|
- } else {
|
|
|
- item.show.value = !item.show.value;
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-const currentFile = ref<MediaItem | null>(null);
|
|
|
-const preview = async (floder: Floder) => {
|
|
|
- console.log("???");
|
|
|
- const ext = floder.filesUrl
|
|
|
- .substring(floder.filesUrl.lastIndexOf("."))
|
|
|
- .toLocaleLowerCase();
|
|
|
- if ([".raw", ".dcm"].includes(ext)) {
|
|
|
- window.open(
|
|
|
- `/xfile-viewer/index.html?file=${floder.filesUrl}&name=${floder.filesTitle}&time=` +
|
|
|
- Date.now()
|
|
|
- );
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- const type = getUrlType(floder.filesUrl);
|
|
|
- const mediaType =
|
|
|
- type === MetaType.image
|
|
|
- ? MediaType.img
|
|
|
- : type === MetaType.video
|
|
|
- ? MediaType.video
|
|
|
- : null;
|
|
|
-
|
|
|
- if (!mediaType) {
|
|
|
+const showInfo = ref(false);
|
|
|
+const currentNdx = ref(-1);
|
|
|
+const currentItems = ref<MediaItem[]>([]);
|
|
|
+const preview = async ([floder, root]: [Floder, FloderRoot]) => {
|
|
|
+ const metaType = getUrlType(floder.filesUrl);
|
|
|
+ if (metaType === MetaType.other) {
|
|
|
const isBlob = floder.filesUrl.includes("blob");
|
|
|
-
|
|
|
if (floder.filesTypeId === 100) {
|
|
|
saveAs(floder.filesUrl, floder.filesTitle + ".doc");
|
|
|
} else {
|
|
|
window.open(floder.filesUrl + (!isBlob ? "?time=" + Date.now() : ""));
|
|
|
}
|
|
|
} else {
|
|
|
- currentFile.value = {
|
|
|
- type: mediaType,
|
|
|
- url: floder.filesUrl,
|
|
|
- };
|
|
|
+ const floders = root.flat ? getFlatFloders(root) : root.floders;
|
|
|
+ const items = floders.map((item) => ({
|
|
|
+ type: getUrlType(item.filesUrl),
|
|
|
+ id: item.filesId,
|
|
|
+ url: item.filesUrl,
|
|
|
+ }));
|
|
|
+ currentNdx.value = items.findIndex((item) => item.id === floder.filesId);
|
|
|
+ currentItems.value = items;
|
|
|
}
|
|
|
};
|
|
|
useViewStack(() => showRightPanoStack.push(ref(false)));
|
|
@@ -121,7 +56,9 @@ useViewStack(() => showRightPanoStack.push(ref(false)));
|
|
|
<style lang="scss" scoped>
|
|
|
.types {
|
|
|
h2 {
|
|
|
- padding: 20px;
|
|
|
+ padding: 20px 0;
|
|
|
+ margin: 0 20px;
|
|
|
+ font-size: 16px;
|
|
|
font-weight: bold;
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|