diff --git a/src/components/SelectionManager.vue b/src/components/SelectionManager.vue index 62d13df0..cf6dfa99 100644 --- a/src/components/SelectionManager.vue +++ b/src/components/SelectionManager.vue @@ -413,17 +413,7 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { */ private async viewInFolder(selection: Selection) { if (selection.size !== 1) return; - - const photo: IPhoto = selection.values().next().value; - const f = await dav.getFiles([photo]); - if (f.length === 0) return; - - const file = f[0]; - const dirPath = file.filename.split("/").slice(0, -1).join("/"); - const url = generateUrl( - `/apps/files/?dir=${dirPath}&scrollto=${file.fileid}&openfile=${file.fileid}` - ); - window.open(url, "_blank"); + dav.viewInFolder(selection.values().next().value); } /** diff --git a/src/components/Viewer.vue b/src/components/Viewer.vue index bc3cd8e0..b1e5f5b3 100644 --- a/src/components/Viewer.vue +++ b/src/components/Viewer.vue @@ -7,7 +7,7 @@ >
- + + + {{ t("memories", "View in folder") }} + +
@@ -79,6 +89,7 @@ import StarIcon from "vue-material-design-icons/Star.vue"; import StarOutlineIcon from "vue-material-design-icons/StarOutline.vue"; import DownloadIcon from "vue-material-design-icons/Download.vue"; import InfoIcon from "vue-material-design-icons/InformationOutline.vue"; +import OpenInNewIcon from "vue-material-design-icons/OpenInNew.vue"; @Component({ components: { @@ -89,6 +100,7 @@ import InfoIcon from "vue-material-design-icons/InformationOutline.vue"; StarOutlineIcon, DownloadIcon, InfoIcon, + OpenInNewIcon, }, }) export default class Viewer extends Mixins(GlobalMixin) { @@ -544,6 +556,14 @@ export default class Viewer extends Mixins(GlobalMixin) { this.openSidebar(); } } + + /** + * Open the files app with the current file. + */ + private async viewInFolder() { + const photo = this.getCurrentPhoto(); + if (photo) dav.viewInFolder(photo); + } } diff --git a/src/services/DavRequests.ts b/src/services/DavRequests.ts index 00332907..c9b2420c 100644 --- a/src/services/DavRequests.ts +++ b/src/services/DavRequests.ts @@ -7,3 +7,4 @@ export * from "./dav/favorites"; export * from "./dav/folders"; export * from "./dav/onthisday"; export * from "./dav/tags"; +export * from "./dav/other"; diff --git a/src/services/Utils.ts b/src/services/Utils.ts index 8f1962c1..1d8a9217 100644 --- a/src/services/Utils.ts +++ b/src/services/Utils.ts @@ -94,6 +94,8 @@ export function hashCode(str: string): number { * @param key Key to use for comparison */ export function binarySearch(arr: any, elem: any, key?: string) { + if (arr.length === 0) return 0; + const desc = key ? arr[0][key] > arr[arr.length - 1][key] : arr[0] > arr[arr.length - 1]; diff --git a/src/services/dav/other.ts b/src/services/dav/other.ts new file mode 100644 index 00000000..3e6a3fea --- /dev/null +++ b/src/services/dav/other.ts @@ -0,0 +1,19 @@ +import { getFiles } from "./base"; +import { generateUrl } from "@nextcloud/router"; +import { IPhoto } from "../../types"; + +/** + * Open the files app with the given photo + * Opens a new window. + */ +export async function viewInFolder(photo: IPhoto) { + const f = await getFiles([photo]); + if (f.length === 0) return; + + const file = f[0]; + const dirPath = file.filename.split("/").slice(0, -1).join("/"); + const url = generateUrl( + `/apps/files/?dir=${dirPath}&scrollto=${file.fileid}&openfile=${file.fileid}` + ); + window.open(url, "_blank"); +}