From bade6214a0be345d26f21253a73ebdf0d7bb2144 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 20 Nov 2021 16:44:54 +0100 Subject: [PATCH] Add context menu actions to tag list and files Signed-off-by: trivernis --- mediarepo-ui/src-tauri/Cargo.lock | 420 +----------------- mediarepo-ui/src-tauri/Cargo.toml | 4 +- mediarepo-ui/src-tauri/tauri.conf.json | 7 +- mediarepo-ui/src/app/app.module.ts | 2 + .../context-menu/context-menu.component.ts | 5 +- .../file-context-menu.component.html | 5 + .../file-context-menu.component.scss | 0 .../file-context-menu.component.spec.ts | 25 ++ .../file-context-menu.component.ts | 72 +++ .../file-gallery/file-gallery.component.html | 3 +- .../file-grid/file-grid.component.html | 9 +- .../files-tab-sidebar.component.html | 10 +- .../files-tab-sidebar.component.ts | 6 + .../src/app/services/file/file.service.ts | 4 + 14 files changed, 148 insertions(+), 424 deletions(-) create mode 100644 mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.html create mode 100644 mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.scss create mode 100644 mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.spec.ts create mode 100644 mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.ts diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index 95a4b76..ee664f1 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -58,37 +58,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" -[[package]] -name = "async-io" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" -dependencies = [ - "concurrent-queue", - "futures-lite", - "libc", - "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "winapi", -] - [[package]] name = "async-trait" version = "0.1.51" @@ -148,12 +123,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - [[package]] name = "bincode" version = "1.3.3" @@ -169,17 +138,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - [[package]] name = "blake3" version = "1.0.0" @@ -187,7 +145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcd555c66291d5f836dbb6883b48660ece810fe25a31f3bdfb911945dff2691f" dependencies = [ "arrayref", - "arrayvec 0.7.1", + "arrayvec", "cc", "cfg-if 1.0.0", "constant_time_eq", @@ -249,12 +207,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "cache-padded" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" - [[package]] name = "cairo-rs" version = "0.14.7" @@ -401,21 +353,6 @@ dependencies = [ "syn 1.0.80", ] -[[package]] -name = "concurrent-queue" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" -dependencies = [ - "cache-padded", -] - -[[package]] -name = "const-sha1" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb58b6451e8c2a812ad979ed1d83378caa5e927eef2622017a45f251457c2c9d" - [[package]] name = "constant_time_eq" version = "0.1.5" @@ -687,17 +624,6 @@ dependencies = [ "dirs-sys", ] -[[package]] -name = "dirs" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" -dependencies = [ - "libc", - "redox_users 0.3.5", - "winapi", -] - [[package]] name = "dirs-next" version = "2.0.0" @@ -715,7 +641,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" dependencies = [ "libc", - "redox_users 0.4.0", + "redox_users", "winapi", ] @@ -726,7 +652,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users 0.4.0", + "redox_users", "winapi", ] @@ -763,27 +689,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53dd2e43a7d32952a6054141ee0d75183958620e84e5eab045de362dff13dc99" -[[package]] -name = "enumflags2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" -dependencies = [ - "proc-macro2 1.0.29", - "quote 1.0.10", - "syn 1.0.80", -] - [[package]] name = "fastrand" version = "1.5.0" @@ -811,7 +716,7 @@ checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "winapi", ] @@ -1519,18 +1424,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -[[package]] -name = "mac-notification-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76" -dependencies = [ - "cc", - "chrono", - "dirs", - "objc-foundation", -] - [[package]] name = "malloc_buf" version = "0.0.6" @@ -1581,7 +1474,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" version = "0.11.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=6fbc72699a565b1ca3f76f58c3dafbe9790c758e#6fbc72699a565b1ca3f76f58c3dafbe9790c758e" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=8f19fe419203842e3e7bff130d52be90de733504#8f19fe419203842e3e7bff130d52be90de733504" dependencies = [ "async-trait", "chrono", @@ -1632,12 +1525,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "minisign-verify" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0507fe8e3c68cd62961cf9f87f6c2b21d884d3515a7150a4a3fa9d014e5c12" - [[package]] name = "miniz_oxide" version = "0.3.7" @@ -1697,16 +1584,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nb-connect" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15" -dependencies = [ - "libc", - "socket2", -] - [[package]] name = "ndk" version = "0.4.0" @@ -1759,39 +1636,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -[[package]] -name = "nix" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -[[package]] -name = "notify-rust" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825e9c9efdcb4d14920f72e2ef329b4dae0219791834c000c42c1475dad341f8" -dependencies = [ - "mac-notification-sys", - "serde", - "winrt-notification", - "zbus", - "zvariant", - "zvariant_derive", -] - [[package]] name = "ntapi" version = "0.3.6" @@ -1898,16 +1748,6 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" -[[package]] -name = "open" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46b233de7d83bc167fe43ae2dda3b5b84e80e09cceba581e4decb958a4896bf" -dependencies = [ - "pathdiff", - "winapi", -] - [[package]] name = "openssl" version = "0.10.36" @@ -1941,27 +1781,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "os_info" -version = "3.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac91020bfed8cc3f8aa450d4c3b5fa1d3373fc091c8a92009f3b27749d5a227" -dependencies = [ - "log", - "serde", - "winapi", -] - -[[package]] -name = "os_pipe" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb233f06c2307e1f5ce2ecad9f8121cffbbee2c95428f44ea85222e460d0d213" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "pango" version = "0.14.8" @@ -2013,17 +1832,11 @@ dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "smallvec", "winapi", ] -[[package]] -name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - [[package]] name = "percent-encoding" version = "2.1.0" @@ -2179,19 +1992,6 @@ dependencies = [ "miniz_oxide 0.3.7", ] -[[package]] -name = "polling" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - [[package]] name = "ppv-lite86" version = "0.2.10" @@ -2420,12 +2220,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - [[package]] name = "redox_syscall" version = "0.2.10" @@ -2435,17 +2229,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "redox_users" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" -dependencies = [ - "getrandom 0.1.16", - "redox_syscall 0.1.57", - "rust-argon2", -] - [[package]] name = "redox_users" version = "0.4.0" @@ -2453,7 +2236,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ "getrandom 0.2.3", - "redox_syscall 0.2.10", + "redox_syscall", ] [[package]] @@ -2553,18 +2336,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rust-argon2" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils", -] - [[package]] name = "rustc_version" version = "0.3.3" @@ -2779,16 +2550,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shared_child" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6be9f7d5565b1483af3e72975e2dee33879b3b86bd48c0929fccf6585d79e65a" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -2816,16 +2577,6 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" -[[package]] -name = "socket2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "soup-sys" version = "0.10.0" @@ -2856,12 +2607,6 @@ dependencies = [ "loom", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "string_cache" version = "0.8.1" @@ -2904,9 +2649,6 @@ name = "strum" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" -dependencies = [ - "strum_macros 0.21.1", -] [[package]] name = "strum_macros" @@ -3044,7 +2786,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79a0579dcc6fb883fe90dd3c66d76b8b8f4a1786e1e915e314b2017a500ede09" dependencies = [ "attohttpc", - "base64", "bincode", "cfg_aliases", "dirs-next", @@ -3057,12 +2798,7 @@ dependencies = [ "gtk", "http", "ignore", - "minisign-verify", - "notify-rust", "once_cell", - "open", - "os_info", - "os_pipe", "percent-encoding", "rand 0.8.4", "raw-window-handle", @@ -3071,7 +2807,6 @@ dependencies = [ "serde", "serde_json", "serde_repr", - "shared_child", "state", "tar", "tauri-macros", @@ -3193,7 +2928,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "rand 0.8.4", - "redox_syscall 0.2.10", + "redox_syscall", "remove_dir_all", "winapi", ] @@ -3502,12 +3237,6 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - [[package]] name = "waker-fn" version = "1.1.0" @@ -3682,15 +3411,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - [[package]] name = "widestring" version = "0.4.3" @@ -3734,52 +3454,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f5f8d2ea79bf690bbee453fd4a1516ae426e5d5c7215d96cc0c3dc134fc4a0" -dependencies = [ - "const-sha1", - "windows_gen", - "windows_macros", - "windows_reader", -] - -[[package]] -name = "windows_gen" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6994f42f8481387778cc608407d6703410672d57f32a66009419d7a18aa912" -dependencies = [ - "windows_quote", - "windows_reader", -] - -[[package]] -name = "windows_macros" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cc2357b1b03c19f056cb0e6d06011f80f54beadb4e36aee2ca98493c7cfc3c" -dependencies = [ - "syn 1.0.80", - "windows_gen", - "windows_quote", - "windows_reader", -] - -[[package]] -name = "windows_quote" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cf987b5288c15e1997226848f78f3ed3ef8b78dcfd71a201c8c8684163a7e4d" - -[[package]] -name = "windows_reader" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "237b53e8b40766ea7db5da0d8c6c1442d21d0429f0ee7500d7b5688967bd9d7b" - [[package]] name = "winres" version = "0.1.12" @@ -3789,17 +3463,6 @@ dependencies = [ "toml", ] -[[package]] -name = "winrt-notification" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0cc832b8c66c42b3ee6b625c124fe2d0b3ff7fb2cec18b28926e9c4bfdb72da" -dependencies = [ - "strum 0.21.0", - "windows", - "xml-rs", -] - [[package]] name = "wry" version = "0.12.2" @@ -3850,47 +3513,6 @@ dependencies = [ "libc", ] -[[package]] -name = "xml-rs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" - -[[package]] -name = "zbus" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2326acc379a3ac4e34b794089f5bdb17086bf29a5fdf619b7b4cc772dc2e9dad" -dependencies = [ - "async-io", - "byteorder", - "derivative", - "enumflags2", - "fastrand", - "futures", - "nb-connect", - "nix", - "once_cell", - "polling", - "scoped-tls", - "serde", - "serde_repr", - "zbus_macros", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a482c56029e48681b89b92b5db3c446db0915e8dd1052c0328a574eda38d5f93" -dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2 1.0.29", - "quote 1.0.10", - "syn 1.0.80", -] - [[package]] name = "zip" version = "0.5.13" @@ -3933,29 +3555,3 @@ dependencies = [ "cc", "libc", ] - -[[package]] -name = "zvariant" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a9373dead84d640ccf5798f2928917e6aa1ab3f130751406bb13e0a9dd9913" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46ee71e0e88747ec582d290dbe98ff7907ff28770c7a35f16da41e5e6f1f4fa3" -dependencies = [ - "proc-macro-crate 1.1.0", - "proc-macro2 1.0.29", - "quote 1.0.10", - "syn 1.0.80", -] diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index 2147b3e..b83001a 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -17,7 +17,7 @@ tauri-build = { version = "1.0.0-beta.4" } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.0.0-beta.8", features = ["api-all"] } +tauri = { version = "1.0.0-beta.8", features = ["dialog-all", "path-all"] } thiserror = "1.0.30" typemap_rev = "0.1.5" @@ -30,7 +30,7 @@ features = ["env-filter"] [dependencies.mediarepo-api] git = "https://github.com/Trivernis/mediarepo-api.git" -rev = "6fbc72699a565b1ca3f76f58c3dafbe9790c758e" +rev = "8f19fe419203842e3e7bff130d52be90de733504" features = ["tauri-plugin"] [features] diff --git a/mediarepo-ui/src-tauri/tauri.conf.json b/mediarepo-ui/src-tauri/tauri.conf.json index 128750c..66e8a82 100644 --- a/mediarepo-ui/src-tauri/tauri.conf.json +++ b/mediarepo-ui/src-tauri/tauri.conf.json @@ -49,7 +49,12 @@ "active": false }, "allowlist": { - "all": true + "dialog": { + "all": true + }, + "path": { + "all": true + } }, "windows": [ { diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index dceb63e..e8ca84f 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -58,6 +58,7 @@ import { FilterDialogComponent } from './components/file-search/filter-dialog/fi import { TagFilterListItemComponent } from './components/file-search/filter-dialog/tag-filter-list-item/tag-filter-list-item.component'; import { TagInputComponent } from './components/inputs/tag-input/tag-input.component'; import { ContextMenuComponent } from './components/context-menu/context-menu.component'; +import { FileContextMenuComponent } from './components/context-menu/file-context-menu/file-context-menu.component'; @NgModule({ declarations: [ @@ -86,6 +87,7 @@ import { ContextMenuComponent } from './components/context-menu/context-menu.com TagFilterListItemComponent, TagInputComponent, ContextMenuComponent, + FileContextMenuComponent, ], imports: [ BrowserModule, diff --git a/mediarepo-ui/src/app/components/context-menu/context-menu.component.ts b/mediarepo-ui/src/app/components/context-menu/context-menu.component.ts index 38e0105..5307252 100644 --- a/mediarepo-ui/src/app/components/context-menu/context-menu.component.ts +++ b/mediarepo-ui/src/app/components/context-menu/context-menu.component.ts @@ -1,9 +1,6 @@ import { Component, - ComponentFactoryResolver, - OnInit, ViewChild, - ViewContainerRef } from '@angular/core'; import {MatMenuTrigger} from "@angular/material/menu"; @@ -14,7 +11,6 @@ import {MatMenuTrigger} from "@angular/material/menu"; }) export class ContextMenuComponent { - public x: string = "0"; public y: string = "0"; @@ -27,6 +23,7 @@ export class ContextMenuComponent { event.preventDefault(); this.x = event.clientX + "px"; this.y = event.clientY + "px"; + this.menuTrigger.menu.focusFirstItem("mouse"); this.menuTrigger.openMenu(); } } diff --git a/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.html b/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.html new file mode 100644 index 0000000..009d9b3 --- /dev/null +++ b/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.scss b/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.spec.ts b/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.spec.ts new file mode 100644 index 0000000..3c40444 --- /dev/null +++ b/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FileContextMenuComponent } from './file-context-menu.component'; + +describe('FileContextMenuComponent', () => { + let component: FileContextMenuComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FileContextMenuComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FileContextMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.ts b/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.ts new file mode 100644 index 0000000..0e349b0 --- /dev/null +++ b/mediarepo-ui/src/app/components/context-menu/file-context-menu/file-context-menu.component.ts @@ -0,0 +1,72 @@ +import {Component, ViewChild} from '@angular/core'; +import {File} from "../../../models/File"; +import {ContextMenuComponent} from "../context-menu.component"; +import {clipboard, dialog} from "@tauri-apps/api"; +import {FileService} from "../../../services/file/file.service"; +import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; +import {downloadDir} from "@tauri-apps/api/path"; + +@Component({ + selector: 'app-file-context-menu', + templateUrl: './file-context-menu.component.html', + styleUrls: ['./file-context-menu.component.scss'] +}) +export class FileContextMenuComponent { + + public file!: File; + + @ViewChild("contextMenu") contextMenu!: ContextMenuComponent; + + constructor(private fileService: FileService, private errorBroker: ErrorBrokerService) { } + + public onContextMenu(event: MouseEvent, file: File) { + this.file = file; + this.contextMenu.onContextMenu(event); + } + + public async copyFileHash(): Promise { + await clipboard.writeText(this.file.hash); + } + + public async exportFile(): Promise { + let extension; + if (this.file.mime_type) { + extension = FileContextMenuComponent.getExtensionForMime(this.file.mime_type); + } + const downloadDirectory = await downloadDir(); + const suggestionPath = downloadDirectory + this.file.hash + "." + extension; + + const path = await dialog.save({ + defaultPath: suggestionPath, + filters: [{name: this.file.mime_type ?? "All", extensions: [extension ?? "*"]}, {name: "All", extensions: ["*"]}] + }); + if (path) { + try { + await this.fileService.saveFile(this.file, path); + } catch (err) { + this.errorBroker.showError(err); + } + } + } + + /** + * Returns the extension for a mime type + * @param {string} mime + * @returns {string | undefined} + * @private + */ + private static getExtensionForMime(mime: string): string | undefined { + let parts = mime.split("/"); + + if (parts.length === 2) { + const type = parts[0]; + const subtype = parts[1]; + return FileContextMenuComponent.convertMimeSubtypeToExtension(subtype); + } + return undefined; + } + + private static convertMimeSubtypeToExtension(subtype: string): string { + return subtype; + } +} diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html index 0151938..1555516 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html @@ -19,7 +19,7 @@
- +
@@ -34,3 +34,4 @@ + diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html index 48af744..7dbb8e9 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html @@ -3,11 +3,14 @@ minBufferPx="500">
- +
+ diff --git a/mediarepo-ui/src/app/pages/home/files-tab/files-tab-sidebar/files-tab-sidebar.component.html b/mediarepo-ui/src/app/pages/home/files-tab/files-tab-sidebar/files-tab-sidebar.component.html index 83d9da1..d54f2d8 100644 --- a/mediarepo-ui/src/app/pages/home/files-tab/files-tab-sidebar/files-tab-sidebar.component.html +++ b/mediarepo-ui/src/app/pages/home/files-tab/files-tab-sidebar/files-tab-sidebar.component.html @@ -15,7 +15,8 @@
-
+
@@ -27,3 +28,10 @@
+ + + + + diff --git a/mediarepo-ui/src/app/pages/home/files-tab/files-tab-sidebar/files-tab-sidebar.component.ts b/mediarepo-ui/src/app/pages/home/files-tab/files-tab-sidebar/files-tab-sidebar.component.ts index 6767c0c..f06a2a1 100644 --- a/mediarepo-ui/src/app/pages/home/files-tab/files-tab-sidebar/files-tab-sidebar.component.ts +++ b/mediarepo-ui/src/app/pages/home/files-tab/files-tab-sidebar/files-tab-sidebar.component.ts @@ -15,6 +15,7 @@ import {File} from "../../../../models/File"; import {FileSearchComponent} from "../../../../components/file-search/file-search.component"; import {RepositoryService} from "../../../../services/repository/repository.service"; import {FileEditComponent} from "../../../../components/file-edit/file-edit.component"; +import {clipboard} from "@tauri-apps/api"; @Component({ selector: 'app-files-tab-sidebar', @@ -35,6 +36,7 @@ export class FilesTabSidebarComponent implements OnInit, OnChanges { public allTags: Tag[] = []; public files: File[] = []; public tagsOfSelection: Tag[] = []; + public contextMenuTag: Tag | undefined; constructor(private repoService: RepositoryService, private tagService: TagService, private fileService: FileService) { this.fileService.displayedFiles.subscribe(async files => { @@ -102,4 +104,8 @@ export class FilesTabSidebarComponent implements OnInit, OnChanges { .localeCompare(b.getNormalizedOutput())); } } + + public async copyToClipboard(text: string) { + await clipboard.writeText(text); + } } diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index 97cf034..e69b9da 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -60,4 +60,8 @@ export class FileService { public buildContentUrl(file: File): SafeResourceUrl { return this.sanitizer.bypassSecurityTrustResourceUrl(`content://${file.hash}`) } + + public async saveFile(file: File, targetPath: string) { + await invoke("plugin:mediarepo|save_file_locally", {id: file.id, path: targetPath}) + } }