mirror of
https://github.com/immich-app/immich.git
synced 2025-06-03 05:34:32 -04:00
chore(web): remove flowbite (#4178)
* chore(web): remove flowbite * Added confirmation prompt for deletion
This commit is contained in:
parent
e050121dbf
commit
9a7e48eaa6
@ -4,6 +4,6 @@
|
|||||||
"printWidth": 120,
|
"printWidth": 120,
|
||||||
"semi": true,
|
"semi": true,
|
||||||
"organizeImportsSkipDestructiveCodeActions": true,
|
"organizeImportsSkipDestructiveCodeActions": true,
|
||||||
"plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
|
"plugins": ["prettier-plugin-svelte"],
|
||||||
"pluginSearchDirs": false
|
"pluginSearchDirs": false
|
||||||
}
|
}
|
||||||
|
183
web/package-lock.json
generated
183
web/package-lock.json
generated
@ -50,16 +50,12 @@
|
|||||||
"eslint-config-prettier": "^8.6.0",
|
"eslint-config-prettier": "^8.6.0",
|
||||||
"eslint-plugin-svelte": "^2.30.0",
|
"eslint-plugin-svelte": "^2.30.0",
|
||||||
"factory.ts": "^1.3.0",
|
"factory.ts": "^1.3.0",
|
||||||
"flowbite": "^1.8.1",
|
|
||||||
"flowbite-svelte": "^0.43.1",
|
|
||||||
"flowbite-svelte-icons": "^0.3.6",
|
|
||||||
"identity-obj-proxy": "^3.0.0",
|
"identity-obj-proxy": "^3.0.0",
|
||||||
"jest": "^29.4.3",
|
"jest": "^29.4.3",
|
||||||
"jest-environment-jsdom": "^29.4.3",
|
"jest-environment-jsdom": "^29.4.3",
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.4.21",
|
||||||
"prettier": "^2.8.4",
|
"prettier": "^2.8.4",
|
||||||
"prettier-plugin-svelte": "^2.10.1",
|
"prettier-plugin-svelte": "^2.10.1",
|
||||||
"prettier-plugin-tailwindcss": "^0.4.1",
|
|
||||||
"svelte": "^4.0.5",
|
"svelte": "^4.0.5",
|
||||||
"svelte-check": "^3.4.3",
|
"svelte-check": "^3.4.3",
|
||||||
"svelte-jester": "^2.3.2",
|
"svelte-jester": "^2.3.2",
|
||||||
@ -3204,16 +3200,6 @@
|
|||||||
"integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
|
"integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@popperjs/core": {
|
|
||||||
"version": "2.11.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
|
|
||||||
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
|
|
||||||
"dev": true,
|
|
||||||
"funding": {
|
|
||||||
"type": "opencollective",
|
|
||||||
"url": "https://opencollective.com/popperjs"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@rollup/plugin-commonjs": {
|
"node_modules/@rollup/plugin-commonjs": {
|
||||||
"version": "24.0.1",
|
"version": "24.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz",
|
||||||
@ -6236,45 +6222,6 @@
|
|||||||
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
|
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/flowbite": {
|
|
||||||
"version": "1.8.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/flowbite/-/flowbite-1.8.1.tgz",
|
|
||||||
"integrity": "sha512-lXTcO8a6dRTPFpINyOLcATCN/pK1Of/jY4PryklPllAiqH64tSDUsOdQpar3TO59ZXWwugm2e92oaqwH6X90Xg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@popperjs/core": "^2.9.3",
|
|
||||||
"mini-svg-data-uri": "^1.4.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/flowbite-svelte": {
|
|
||||||
"version": "0.43.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/flowbite-svelte/-/flowbite-svelte-0.43.1.tgz",
|
|
||||||
"integrity": "sha512-01ofjsHi7YRNx/MvmjpULQ5L6ar8El7yqWD3aJJupyaXRvTyPb5CHPUP5fT1rOJA11oeZDnPRTdJ27aDuTXpZQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@floating-ui/dom": "^1.5.1",
|
|
||||||
"flowbite": "^1.8.1",
|
|
||||||
"tailwind-merge": "^1.14.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=16.0.0",
|
|
||||||
"npm": ">=7.0.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"svelte": "^3.55.1 || ^4.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/flowbite-svelte-icons": {
|
|
||||||
"version": "0.3.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/flowbite-svelte-icons/-/flowbite-svelte-icons-0.3.6.tgz",
|
|
||||||
"integrity": "sha512-4YEq++cbD36KF+zGgLqfkmQgfWGMAP7tjDbesuieROx6UgbMBTtj7f4n49iO+g1cMLelGsCkyZiwelCXDbIJ2w==",
|
|
||||||
"dev": true,
|
|
||||||
"peerDependencies": {
|
|
||||||
"svelte": "^3.54.0 || ^4.0.0",
|
|
||||||
"tailwind-merge": "^1.13.2",
|
|
||||||
"tailwindcss": "^3.3.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/follow-redirects": {
|
"node_modules/follow-redirects": {
|
||||||
"version": "1.15.2",
|
"version": "1.15.2",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
|
||||||
@ -9629,15 +9576,6 @@
|
|||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mini-svg-data-uri": {
|
|
||||||
"version": "1.4.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
|
|
||||||
"integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
|
|
||||||
"dev": true,
|
|
||||||
"bin": {
|
|
||||||
"mini-svg-data-uri": "cli.js"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
@ -10288,80 +10226,6 @@
|
|||||||
"svelte": "^3.2.0 || ^4.0.0-next.0"
|
"svelte": "^3.2.0 || ^4.0.0-next.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prettier-plugin-tailwindcss": {
|
|
||||||
"version": "0.4.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.4.1.tgz",
|
|
||||||
"integrity": "sha512-hwn2EiJmv8M+AW4YDkbjJ6HlZCTzLyz1QlySn9sMuKV/Px0fjwldlB7tol8GzdgqtkdPtzT3iJ4UzdnYXP25Ag==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12.17.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@ianvs/prettier-plugin-sort-imports": "*",
|
|
||||||
"@prettier/plugin-pug": "*",
|
|
||||||
"@shopify/prettier-plugin-liquid": "*",
|
|
||||||
"@shufo/prettier-plugin-blade": "*",
|
|
||||||
"@trivago/prettier-plugin-sort-imports": "*",
|
|
||||||
"prettier": "^2.2 || ^3.0",
|
|
||||||
"prettier-plugin-astro": "*",
|
|
||||||
"prettier-plugin-css-order": "*",
|
|
||||||
"prettier-plugin-import-sort": "*",
|
|
||||||
"prettier-plugin-jsdoc": "*",
|
|
||||||
"prettier-plugin-marko": "*",
|
|
||||||
"prettier-plugin-organize-attributes": "*",
|
|
||||||
"prettier-plugin-organize-imports": "*",
|
|
||||||
"prettier-plugin-style-order": "*",
|
|
||||||
"prettier-plugin-svelte": "*",
|
|
||||||
"prettier-plugin-twig-melody": "*"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@ianvs/prettier-plugin-sort-imports": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"@prettier/plugin-pug": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"@shopify/prettier-plugin-liquid": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"@shufo/prettier-plugin-blade": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"@trivago/prettier-plugin-sort-imports": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-astro": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-css-order": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-import-sort": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-jsdoc": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-marko": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-organize-attributes": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-organize-imports": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-style-order": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-svelte": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"prettier-plugin-twig-melody": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/pretty-format": {
|
"node_modules/pretty-format": {
|
||||||
"version": "27.5.1",
|
"version": "27.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
|
||||||
@ -14414,12 +14278,6 @@
|
|||||||
"integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
|
"integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@popperjs/core": {
|
|
||||||
"version": "2.11.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
|
|
||||||
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"@rollup/plugin-commonjs": {
|
"@rollup/plugin-commonjs": {
|
||||||
"version": "24.0.1",
|
"version": "24.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz",
|
||||||
@ -16653,34 +16511,6 @@
|
|||||||
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
|
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"flowbite": {
|
|
||||||
"version": "1.8.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/flowbite/-/flowbite-1.8.1.tgz",
|
|
||||||
"integrity": "sha512-lXTcO8a6dRTPFpINyOLcATCN/pK1Of/jY4PryklPllAiqH64tSDUsOdQpar3TO59ZXWwugm2e92oaqwH6X90Xg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@popperjs/core": "^2.9.3",
|
|
||||||
"mini-svg-data-uri": "^1.4.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flowbite-svelte": {
|
|
||||||
"version": "0.43.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/flowbite-svelte/-/flowbite-svelte-0.43.1.tgz",
|
|
||||||
"integrity": "sha512-01ofjsHi7YRNx/MvmjpULQ5L6ar8El7yqWD3aJJupyaXRvTyPb5CHPUP5fT1rOJA11oeZDnPRTdJ27aDuTXpZQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@floating-ui/dom": "^1.5.1",
|
|
||||||
"flowbite": "^1.8.1",
|
|
||||||
"tailwind-merge": "^1.14.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flowbite-svelte-icons": {
|
|
||||||
"version": "0.3.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/flowbite-svelte-icons/-/flowbite-svelte-icons-0.3.6.tgz",
|
|
||||||
"integrity": "sha512-4YEq++cbD36KF+zGgLqfkmQgfWGMAP7tjDbesuieROx6UgbMBTtj7f4n49iO+g1cMLelGsCkyZiwelCXDbIJ2w==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {}
|
|
||||||
},
|
|
||||||
"follow-redirects": {
|
"follow-redirects": {
|
||||||
"version": "1.15.2",
|
"version": "1.15.2",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
|
||||||
@ -19150,12 +18980,6 @@
|
|||||||
"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
|
"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"mini-svg-data-uri": {
|
|
||||||
"version": "1.4.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
|
|
||||||
"integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"minimatch": {
|
"minimatch": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
@ -19595,13 +19419,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
"prettier-plugin-tailwindcss": {
|
|
||||||
"version": "0.4.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.4.1.tgz",
|
|
||||||
"integrity": "sha512-hwn2EiJmv8M+AW4YDkbjJ6HlZCTzLyz1QlySn9sMuKV/Px0fjwldlB7tol8GzdgqtkdPtzT3iJ4UzdnYXP25Ag==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {}
|
|
||||||
},
|
|
||||||
"pretty-format": {
|
"pretty-format": {
|
||||||
"version": "27.5.1",
|
"version": "27.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
|
||||||
|
@ -43,16 +43,12 @@
|
|||||||
"eslint-config-prettier": "^8.6.0",
|
"eslint-config-prettier": "^8.6.0",
|
||||||
"eslint-plugin-svelte": "^2.30.0",
|
"eslint-plugin-svelte": "^2.30.0",
|
||||||
"factory.ts": "^1.3.0",
|
"factory.ts": "^1.3.0",
|
||||||
"flowbite": "^1.8.1",
|
|
||||||
"flowbite-svelte": "^0.43.1",
|
|
||||||
"flowbite-svelte-icons": "^0.3.6",
|
|
||||||
"identity-obj-proxy": "^3.0.0",
|
"identity-obj-proxy": "^3.0.0",
|
||||||
"jest": "^29.4.3",
|
"jest": "^29.4.3",
|
||||||
"jest-environment-jsdom": "^29.4.3",
|
"jest-environment-jsdom": "^29.4.3",
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.4.21",
|
||||||
"prettier": "^2.8.4",
|
"prettier": "^2.8.4",
|
||||||
"prettier-plugin-svelte": "^2.10.1",
|
"prettier-plugin-svelte": "^2.10.1",
|
||||||
"prettier-plugin-tailwindcss": "^0.4.1",
|
|
||||||
"svelte": "^4.0.5",
|
"svelte": "^4.0.5",
|
||||||
"svelte-check": "^3.4.3",
|
"svelte-check": "^3.4.3",
|
||||||
"svelte-jester": "^2.3.2",
|
"svelte-jester": "^2.3.2",
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
export let text = '';
|
export let text = '';
|
||||||
|
export let subtitle = '';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
@ -12,4 +13,10 @@
|
|||||||
{:else}
|
{:else}
|
||||||
<slot />
|
<slot />
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
<slot name="subtitle">
|
||||||
|
<p class="text-xs text-gray-500">
|
||||||
|
{subtitle}
|
||||||
|
</p>
|
||||||
|
</slot>
|
||||||
</button>
|
</button>
|
||||||
|
@ -10,14 +10,14 @@
|
|||||||
import Database from 'svelte-material-icons/Database.svelte';
|
import Database from 'svelte-material-icons/Database.svelte';
|
||||||
import Upload from 'svelte-material-icons/Upload.svelte';
|
import Upload from 'svelte-material-icons/Upload.svelte';
|
||||||
import Pulse from 'svelte-loading-spinners/Pulse.svelte';
|
import Pulse from 'svelte-loading-spinners/Pulse.svelte';
|
||||||
|
|
||||||
import { slide } from 'svelte/transition';
|
import { slide } from 'svelte/transition';
|
||||||
import { Dropdown, DropdownDivider, DropdownItem, Helper } from 'flowbite-svelte';
|
|
||||||
import { Icon } from 'flowbite-svelte-icons';
|
|
||||||
import LibraryImportPathsForm from '../forms/library-import-paths-form.svelte';
|
import LibraryImportPathsForm from '../forms/library-import-paths-form.svelte';
|
||||||
import LibraryScanSettingsForm from '../forms/library-scan-settings-form.svelte';
|
import LibraryScanSettingsForm from '../forms/library-scan-settings-form.svelte';
|
||||||
import LibraryRenameForm from '../forms/library-rename-form.svelte';
|
import LibraryRenameForm from '../forms/library-rename-form.svelte';
|
||||||
import { getBytesWithUnit } from '$lib/utils/byte-units';
|
import { getBytesWithUnit } from '$lib/utils/byte-units';
|
||||||
|
import Portal from '../shared-components/portal/portal.svelte';
|
||||||
|
import ContextMenu from '../shared-components/context-menu/context-menu.svelte';
|
||||||
|
import MenuOption from '../shared-components/context-menu/menu-option.svelte';
|
||||||
|
|
||||||
let libraries: LibraryResponseDto[] = [];
|
let libraries: LibraryResponseDto[] = [];
|
||||||
|
|
||||||
@ -40,6 +40,9 @@
|
|||||||
let deleteAssetCount = 0;
|
let deleteAssetCount = 0;
|
||||||
|
|
||||||
let dropdownOpen: boolean[] = [];
|
let dropdownOpen: boolean[] = [];
|
||||||
|
let showContextMenu = false;
|
||||||
|
let contextMenuPosition = { x: 0, y: 0 };
|
||||||
|
let libraryType: LibraryType;
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
readLibraryList();
|
readLibraryList();
|
||||||
@ -50,12 +53,22 @@
|
|||||||
editScanSettings = null;
|
editScanSettings = null;
|
||||||
renameLibrary = null;
|
renameLibrary = null;
|
||||||
updateLibraryIndex = null;
|
updateLibraryIndex = null;
|
||||||
|
showContextMenu = false;
|
||||||
|
|
||||||
for (let i = 0; i < dropdownOpen.length; i++) {
|
for (let i = 0; i < dropdownOpen.length; i++) {
|
||||||
dropdownOpen[i] = false;
|
dropdownOpen[i] = false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const showMenu = ({ x, y }: MouseEvent, type: LibraryType) => {
|
||||||
|
contextMenuPosition = { x, y };
|
||||||
|
showContextMenu = !showContextMenu;
|
||||||
|
libraryType = type;
|
||||||
|
};
|
||||||
|
|
||||||
|
const onMenuExit = () => {
|
||||||
|
showContextMenu = false;
|
||||||
|
};
|
||||||
const refreshStats = async (listIndex: number) => {
|
const refreshStats = async (listIndex: number) => {
|
||||||
const { data } = await api.libraryApi.getLibraryStatistics({ id: libraries[listIndex].id });
|
const { data } = await api.libraryApi.getLibraryStatistics({ id: libraries[listIndex].id });
|
||||||
stats[listIndex] = data;
|
stats[listIndex] = data;
|
||||||
@ -201,6 +214,59 @@
|
|||||||
handleError(error, 'Unable to remove offline files');
|
handleError(error, 'Unable to remove offline files');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onRenameClicked = (index: number) => {
|
||||||
|
closeAll();
|
||||||
|
renameLibrary = index;
|
||||||
|
updateLibraryIndex = index;
|
||||||
|
};
|
||||||
|
|
||||||
|
const onEditImportPathClicked = (index: number) => {
|
||||||
|
closeAll();
|
||||||
|
editImportPaths = index;
|
||||||
|
updateLibraryIndex = index;
|
||||||
|
};
|
||||||
|
|
||||||
|
const onScanNewLibraryClicked = (libraryId: string) => {
|
||||||
|
closeAll();
|
||||||
|
handleScan(libraryId);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onScanSettingClicked = (index: number) => {
|
||||||
|
closeAll();
|
||||||
|
editScanSettings = index;
|
||||||
|
updateLibraryIndex = index;
|
||||||
|
};
|
||||||
|
|
||||||
|
const onScanAllLibraryFilesClicked = (libraryId: string) => {
|
||||||
|
closeAll();
|
||||||
|
handleScanChanges(libraryId);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onForceScanAllLibraryFilesClicked = (libraryId: string) => {
|
||||||
|
closeAll();
|
||||||
|
handleForceScan(libraryId);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onRemoveOfflineFilesClicked = (libraryId: string) => {
|
||||||
|
closeAll();
|
||||||
|
handleRemoveOffline(libraryId);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onDeleteLibraryClicked = (index: number, library: LibraryResponseDto) => {
|
||||||
|
closeAll();
|
||||||
|
|
||||||
|
if (confirm(`Are you sure you want to delete ${library.name} library?`) == true) {
|
||||||
|
refreshStats(index);
|
||||||
|
if (totalCount[index] > 0) {
|
||||||
|
deleteAssetCount = totalCount[index];
|
||||||
|
confirmDeleteLibrary = library;
|
||||||
|
} else {
|
||||||
|
deleteLibrary = library;
|
||||||
|
handleDelete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if confirmDeleteLibrary}
|
{#if confirmDeleteLibrary}
|
||||||
@ -260,88 +326,46 @@
|
|||||||
<td class="w-1/6 text-ellipsis px-4 text-sm">
|
<td class="w-1/6 text-ellipsis px-4 text-sm">
|
||||||
<button
|
<button
|
||||||
class="rounded-full bg-immich-primary p-3 text-gray-100 transition-all duration-150 hover:bg-immich-primary/75 dark:bg-immich-dark-primary dark:text-gray-700"
|
class="rounded-full bg-immich-primary p-3 text-gray-100 transition-all duration-150 hover:bg-immich-primary/75 dark:bg-immich-dark-primary dark:text-gray-700"
|
||||||
|
on:click|stopPropagation|preventDefault={(e) => showMenu(e, library.type)}
|
||||||
>
|
>
|
||||||
<DotsVertical size="16" />
|
<DotsVertical size="16" />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<Dropdown bind:open={dropdownOpen[index]}>
|
{#if showContextMenu}
|
||||||
<DropdownItem
|
<Portal target="body">
|
||||||
on:click={() => {
|
<ContextMenu {...contextMenuPosition} on:outclick={() => onMenuExit()}>
|
||||||
closeAll();
|
<MenuOption on:click={() => onRenameClicked(index)} text="Rename" />
|
||||||
renameLibrary = index;
|
|
||||||
updateLibraryIndex = index;
|
|
||||||
}}>Rename</DropdownItem
|
|
||||||
>
|
|
||||||
{#if library.type === LibraryType.External}
|
|
||||||
<DropdownItem
|
|
||||||
on:click={function () {
|
|
||||||
closeAll();
|
|
||||||
handleScan(library.id);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Scan Library Files
|
|
||||||
<Helper>Looks for new files</Helper>
|
|
||||||
</DropdownItem>
|
|
||||||
<DropdownItem
|
|
||||||
on:click={() => {
|
|
||||||
closeAll();
|
|
||||||
editImportPaths = index;
|
|
||||||
updateLibraryIndex = index;
|
|
||||||
}}>Edit Import Paths</DropdownItem
|
|
||||||
>
|
|
||||||
<DropdownItem class="flex items-center justify-between">
|
|
||||||
Manage<Icon name="chevron-right-solid" class="ml-2 h-3 w-3 text-primary-700 dark:text-white" />
|
|
||||||
</DropdownItem>
|
|
||||||
<Dropdown slot="footer" class="w-60" placement="right-start">
|
|
||||||
<DropdownItem
|
|
||||||
on:click={() => {
|
|
||||||
closeAll();
|
|
||||||
editScanSettings = index;
|
|
||||||
updateLibraryIndex = index;
|
|
||||||
}}>Scan Settings</DropdownItem
|
|
||||||
>
|
|
||||||
<DropdownDivider />
|
|
||||||
<DropdownItem
|
|
||||||
on:click={function () {
|
|
||||||
closeAll();
|
|
||||||
handleScanChanges(library.id);
|
|
||||||
}}
|
|
||||||
>Scan All Library Files
|
|
||||||
<Helper>Rescan, but also refreshes modified files</Helper>
|
|
||||||
</DropdownItem>
|
|
||||||
<DropdownItem
|
|
||||||
on:click={function () {
|
|
||||||
closeAll();
|
|
||||||
handleForceScan(library.id);
|
|
||||||
}}
|
|
||||||
>Force Scan All Library Files
|
|
||||||
<Helper>Rescan, but refreshes every file</Helper>
|
|
||||||
</DropdownItem>
|
|
||||||
<DropdownItem
|
|
||||||
on:click={function () {
|
|
||||||
closeAll();
|
|
||||||
handleRemoveOffline(library.id);
|
|
||||||
}}
|
|
||||||
>Remove Offline Files
|
|
||||||
<Helper>Any offline files are removed from Immich</Helper>
|
|
||||||
</DropdownItem>
|
|
||||||
<DropdownItem
|
|
||||||
on:click={function () {
|
|
||||||
closeAll();
|
|
||||||
refreshStats(index);
|
|
||||||
|
|
||||||
if (totalCount[index] > 0) {
|
{#if libraryType === LibraryType.External}
|
||||||
deleteAssetCount = totalCount[index];
|
<MenuOption on:click={() => onEditImportPathClicked(index)} text="Edit Import Paths" />
|
||||||
confirmDeleteLibrary = library;
|
<MenuOption on:click={() => onScanSettingClicked(index)} text="Scan Settings" />
|
||||||
} else {
|
<hr />
|
||||||
deleteLibrary = library;
|
<MenuOption
|
||||||
handleDelete();
|
on:click={() => onScanNewLibraryClicked(library.id)}
|
||||||
}
|
text="Scan New Library Files"
|
||||||
}}>Delete Library</DropdownItem
|
/>
|
||||||
>
|
<MenuOption
|
||||||
</Dropdown>
|
on:click={() => onScanAllLibraryFilesClicked(library.id)}
|
||||||
{/if}
|
text="Re-scan All Library Files"
|
||||||
</Dropdown>
|
subtitle={'Only refreshes modified files'}
|
||||||
|
/>
|
||||||
|
<MenuOption
|
||||||
|
on:click={() => onForceScanAllLibraryFilesClicked(library.id)}
|
||||||
|
text="Force Re-scan All Library Files"
|
||||||
|
subtitle={'Refreshes every file'}
|
||||||
|
/>
|
||||||
|
<hr />
|
||||||
|
<MenuOption
|
||||||
|
on:click={() => onRemoveOfflineFilesClicked(library.id)}
|
||||||
|
text="Remove Offline Files"
|
||||||
|
/>
|
||||||
|
<MenuOption on:click={() => onDeleteLibraryClicked(index, library)}>
|
||||||
|
<p class="text-red-600">Delete library</p>
|
||||||
|
</MenuOption>
|
||||||
|
{/if}
|
||||||
|
</ContextMenu>
|
||||||
|
</Portal>
|
||||||
|
{/if}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{#if renameLibrary === index}
|
{#if renameLibrary === index}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/** @type {import('tailwindcss').Config} */
|
/** @type {import('tailwindcss').Config} */
|
||||||
module.exports = {
|
module.exports = {
|
||||||
content: ['./src/**/*.{html,js,svelte,ts}', './node_modules/flowbite-svelte/**/*.{html,js,svelte,ts}'],
|
content: ['./src/**/*.{html,js,svelte,ts}'],
|
||||||
darkMode: 'class',
|
darkMode: 'class',
|
||||||
theme: {
|
theme: {
|
||||||
extend: {
|
extend: {
|
||||||
@ -22,20 +22,6 @@ module.exports = {
|
|||||||
'immich-dark-error': '#d32f2f',
|
'immich-dark-error': '#d32f2f',
|
||||||
'immich-dark-success': '#388e3c',
|
'immich-dark-success': '#388e3c',
|
||||||
'immich-dark-warning': '#f57c00',
|
'immich-dark-warning': '#f57c00',
|
||||||
|
|
||||||
// flowbite-svelte
|
|
||||||
primary: {
|
|
||||||
50: '#FFF5F2',
|
|
||||||
100: '#FFF1EE',
|
|
||||||
200: '#FFE4DE',
|
|
||||||
300: '#FFD5CC',
|
|
||||||
400: '#FFBCAD',
|
|
||||||
500: '#FE795D',
|
|
||||||
600: '#EF562F',
|
|
||||||
700: '#EB4F27',
|
|
||||||
800: '#CC4522',
|
|
||||||
900: '#A5371B',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
fontFamily: {
|
fontFamily: {
|
||||||
'immich-title': ['Snowburst One', 'cursive'],
|
'immich-title': ['Snowburst One', 'cursive'],
|
||||||
@ -45,5 +31,4 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: [require('flowbite/plugin')],
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user