diff --git a/web/package.json b/web/package.json index 268facbf..75020d5d 100644 --- a/web/package.json +++ b/web/package.json @@ -59,7 +59,6 @@ }, "devDependencies": { "@iconify-json/mdi": "^1.2.3", - "@iconify-json/simple-icons": "^1.2.63", "@iconify/vue": "^5.0.0", "@rushstack/eslint-patch": "^1.14.0", "@tsconfig/node24": "^24.0.0", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 1a42a3f0..3bef0ef8 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -105,9 +105,6 @@ importers: '@iconify-json/mdi': specifier: ^1.2.3 version: 1.2.3 - '@iconify-json/simple-icons': - specifier: ^1.2.63 - version: 1.2.64 '@iconify/vue': specifier: ^5.0.0 version: 5.0.0(vue@3.5.26(typescript@5.9.3)) @@ -699,9 +696,6 @@ packages: '@iconify-json/mdi@1.2.3': resolution: {integrity: sha512-O3cLwbDOK7NNDf2ihaQOH5F9JglnulNDFV7WprU2dSoZu3h3cWH//h74uQAB87brHmvFVxIOkuBX2sZSzYhScg==} - '@iconify-json/simple-icons@1.2.64': - resolution: {integrity: sha512-SMmm//tjZBvHnT0EAzZLnBTL6bukSkncM0pwkOXjr0FsAeCqjQtqoxBR0Mp+PazIJjXJKHm1Ju0YgnCIPOodJg==} - '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -4082,10 +4076,6 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.64': - dependencies: - '@iconify/types': 2.0.0 - '@iconify/types@2.0.0': {} '@iconify/utils@3.1.0': diff --git a/web/src/assets/icons/app/app.svg b/web/src/assets/icons/app/app.svg new file mode 100644 index 00000000..ae5f5fbd --- /dev/null +++ b/web/src/assets/icons/app/app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/codeserver.svg b/web/src/assets/icons/app/codeserver.svg new file mode 100644 index 00000000..4b60da54 --- /dev/null +++ b/web/src/assets/icons/app/codeserver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/docker.svg b/web/src/assets/icons/app/docker.svg new file mode 100644 index 00000000..066b55e0 --- /dev/null +++ b/web/src/assets/icons/app/docker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/fail2ban.svg b/web/src/assets/icons/app/fail2ban.svg new file mode 100644 index 00000000..62e34dcb --- /dev/null +++ b/web/src/assets/icons/app/fail2ban.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/frp.svg b/web/src/assets/icons/app/frp.svg new file mode 100644 index 00000000..ee5c3e50 --- /dev/null +++ b/web/src/assets/icons/app/frp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/gitea.svg b/web/src/assets/icons/app/gitea.svg new file mode 100644 index 00000000..54d03eca --- /dev/null +++ b/web/src/assets/icons/app/gitea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/memcached.svg b/web/src/assets/icons/app/memcached.svg new file mode 100644 index 00000000..3ad9c9bb --- /dev/null +++ b/web/src/assets/icons/app/memcached.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/minio.svg b/web/src/assets/icons/app/minio.svg new file mode 100644 index 00000000..dbed8f1a --- /dev/null +++ b/web/src/assets/icons/app/minio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/mysql.svg b/web/src/assets/icons/app/mysql.svg new file mode 100644 index 00000000..cba77c87 --- /dev/null +++ b/web/src/assets/icons/app/mysql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/nginx.svg b/web/src/assets/icons/app/nginx.svg new file mode 100644 index 00000000..d218a5b6 --- /dev/null +++ b/web/src/assets/icons/app/nginx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/percona.svg b/web/src/assets/icons/app/percona.svg new file mode 100644 index 00000000..33343954 --- /dev/null +++ b/web/src/assets/icons/app/percona.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/phpmyadmin.svg b/web/src/assets/icons/app/phpmyadmin.svg new file mode 100644 index 00000000..5f6030e7 --- /dev/null +++ b/web/src/assets/icons/app/phpmyadmin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/podman.svg b/web/src/assets/icons/app/podman.svg new file mode 100644 index 00000000..298829cb --- /dev/null +++ b/web/src/assets/icons/app/podman.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/postgresql.svg b/web/src/assets/icons/app/postgresql.svg new file mode 100644 index 00000000..270b4cae --- /dev/null +++ b/web/src/assets/icons/app/postgresql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/pureftpd.svg b/web/src/assets/icons/app/pureftpd.svg new file mode 100644 index 00000000..e4862cf4 --- /dev/null +++ b/web/src/assets/icons/app/pureftpd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/redis.svg b/web/src/assets/icons/app/redis.svg new file mode 100644 index 00000000..7b497086 --- /dev/null +++ b/web/src/assets/icons/app/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/rsync.svg b/web/src/assets/icons/app/rsync.svg new file mode 100644 index 00000000..7a5e48ba --- /dev/null +++ b/web/src/assets/icons/app/rsync.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/s3fs.svg b/web/src/assets/icons/app/s3fs.svg new file mode 100644 index 00000000..dce4addc --- /dev/null +++ b/web/src/assets/icons/app/s3fs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/app/supervisor.svg b/web/src/assets/icons/app/supervisor.svg new file mode 100644 index 00000000..02bb10f7 --- /dev/null +++ b/web/src/assets/icons/app/supervisor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/environment/environment.svg b/web/src/assets/icons/environment/environment.svg new file mode 100644 index 00000000..bc616f55 --- /dev/null +++ b/web/src/assets/icons/environment/environment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/environment/go.svg b/web/src/assets/icons/environment/go.svg new file mode 100644 index 00000000..1ffe0cdb --- /dev/null +++ b/web/src/assets/icons/environment/go.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/environment/java.svg b/web/src/assets/icons/environment/java.svg new file mode 100644 index 00000000..1de7c807 --- /dev/null +++ b/web/src/assets/icons/environment/java.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/environment/nodejs.svg b/web/src/assets/icons/environment/nodejs.svg new file mode 100644 index 00000000..cb6a7edb --- /dev/null +++ b/web/src/assets/icons/environment/nodejs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/environment/php.svg b/web/src/assets/icons/environment/php.svg new file mode 100644 index 00000000..edd42896 --- /dev/null +++ b/web/src/assets/icons/environment/php.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/environment/python.svg b/web/src/assets/icons/environment/python.svg new file mode 100644 index 00000000..8160ffd7 --- /dev/null +++ b/web/src/assets/icons/environment/python.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/utils/common/icon.ts b/web/src/utils/common/icon.ts index 7555026c..f3ff8ce6 100644 --- a/web/src/utils/common/icon.ts +++ b/web/src/utils/common/icon.ts @@ -1,11 +1,22 @@ import { icons as mdi } from '@iconify-json/mdi' -import { icons as simpleIcons } from '@iconify-json/simple-icons' import { addCollection, Icon } from '@iconify/vue' import { NIcon } from 'naive-ui' addCollection(mdi) -addCollection(simpleIcons) + +const localIcons = import.meta.glob('@/assets/icons/**/*.svg', { + eager: true, + query: '?raw', + import: 'default' +}) + +function getLocalIconSvg(type: string, icon: string): string { + const path = `/src/assets/icons/${type}/${icon}.svg` + const defaultPath = `/src/assets/icons/${type}/${type}.svg` + + return localIcons[path] ?? localIcons[defaultPath] ?? '' +} interface Props { size?: number @@ -16,3 +27,9 @@ interface Props { export function renderIcon(icon: string, props: Props = { size: 12 }) { return () => h(NIcon, props, { default: () => h(Icon, { icon }) }) } + +export function renderLocalIcon(type: string, icon: string, props: Props = { size: 12 }) { + console.log('type, icon', type, icon) + const svgContent = getLocalIconSvg(type, icon) + return () => h(NIcon, { ...props, innerHTML: svgContent }) +} diff --git a/web/src/views/app/InstallView.vue b/web/src/views/app/AllView.vue similarity index 97% rename from web/src/views/app/InstallView.vue rename to web/src/views/app/AllView.vue index d5b378b8..06c0c9a7 100644 --- a/web/src/views/app/InstallView.vue +++ b/web/src/views/app/AllView.vue @@ -3,14 +3,13 @@ defineOptions({ name: 'app-index' }) -import VersionModal from '@/views/app/VersionModal.vue' - import { NButton, NDataTable, NFlex, NPopconfirm, NSwitch } from 'naive-ui' import { useGettext } from 'vue3-gettext' import app from '@/api/panel/app' -import TheIcon from '@/components/custom/TheIcon.vue' import { router } from '@/router' +import { renderLocalIcon } from '@/utils' +import VersionModal from '@/views/app/VersionModal.vue' const { $gettext } = useGettext() @@ -25,10 +24,7 @@ const columns: any = [ width: 80, align: 'center', render(row: any) { - return h(TheIcon, { - icon: row.icon, - size: 26 - }) + return renderLocalIcon('app', row.slug, { size: 26 })() } }, { diff --git a/web/src/views/app/IndexView.vue b/web/src/views/app/IndexView.vue index 26eb4c76..0ca6dcab 100644 --- a/web/src/views/app/IndexView.vue +++ b/web/src/views/app/IndexView.vue @@ -7,11 +7,11 @@ import { NButton } from 'naive-ui' import { useGettext } from 'vue3-gettext' import app from '@/api/panel/app' -import InstallView from '@/views/app/InstallView.vue' +import AllView from '@/views/app/AllView.vue' const { $gettext } = useGettext() -const currentTab = ref('installed') +const currentTab = ref('environment') const handleUpdateCache = () => { useRequest(app.updateCache()).onSuccess(() => { @@ -25,9 +25,8 @@ const handleUpdateCache = () => { - - + @@ -35,6 +34,6 @@ const handleUpdateCache = () => { - + diff --git a/web/src/views/apps/codeserver/route.ts b/web/src/views/apps/codeserver/route.ts index 9366c5ca..b9c20ed7 100644 --- a/web/src/views/apps/codeserver/route.ts +++ b/web/src/views/apps/codeserver/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Code Server', - icon: 'simple-icons:coder', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/docker/route.ts b/web/src/views/apps/docker/route.ts index ea35188e..6e874111 100644 --- a/web/src/views/apps/docker/route.ts +++ b/web/src/views/apps/docker/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Docker', - icon: 'simple-icons:docker', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/fail2ban/route.ts b/web/src/views/apps/fail2ban/route.ts index c1239c17..0e4a9042 100644 --- a/web/src/views/apps/fail2ban/route.ts +++ b/web/src/views/apps/fail2ban/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Fail2ban Manager', - icon: 'mdi:wall-fire', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/frp/route.ts b/web/src/views/apps/frp/route.ts index 0f11f247..e755b94d 100644 --- a/web/src/views/apps/frp/route.ts +++ b/web/src/views/apps/frp/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Frp Manager', - icon: 'mdi:swap-horizontal', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/gitea/route.ts b/web/src/views/apps/gitea/route.ts index 90690cd8..5e51d22b 100644 --- a/web/src/views/apps/gitea/route.ts +++ b/web/src/views/apps/gitea/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Gitea', - icon: 'simple-icons:gitea', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/memcached/route.ts b/web/src/views/apps/memcached/route.ts index 931e0317..02b72981 100644 --- a/web/src/views/apps/memcached/route.ts +++ b/web/src/views/apps/memcached/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Memcached', - icon: 'mdi:memory', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/minio/route.ts b/web/src/views/apps/minio/route.ts index e6a026ea..b040774d 100644 --- a/web/src/views/apps/minio/route.ts +++ b/web/src/views/apps/minio/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Minio', - icon: 'simple-icons:minio', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/mysql/route.ts b/web/src/views/apps/mysql/route.ts index 3fe2a2f0..36deb84b 100644 --- a/web/src/views/apps/mysql/route.ts +++ b/web/src/views/apps/mysql/route.ts @@ -13,8 +13,7 @@ export default { path: '', component: () => import('./IndexView.vue'), meta: { - title: 'Percona (MySQL)', - icon: 'simple-icons:mysql', + title: 'MySQL', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/nginx/route.ts b/web/src/views/apps/nginx/route.ts index 87897506..1a461254 100644 --- a/web/src/views/apps/nginx/route.ts +++ b/web/src/views/apps/nginx/route.ts @@ -13,8 +13,7 @@ export default { path: '', component: () => import('./IndexView.vue'), meta: { - title: 'OpenResty (Nginx)', - icon: 'simple-icons:nginx', + title: 'Nginx', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/php74/route.ts b/web/src/views/apps/php74/route.ts index a2bb49cf..04c442e2 100644 --- a/web/src/views/apps/php74/route.ts +++ b/web/src/views/apps/php74/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'PHP 7.4', - icon: 'simple-icons:php', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/php80/route.ts b/web/src/views/apps/php80/route.ts index d539b71e..f6352c8b 100644 --- a/web/src/views/apps/php80/route.ts +++ b/web/src/views/apps/php80/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'PHP 8.0', - icon: 'simple-icons:php', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/php81/route.ts b/web/src/views/apps/php81/route.ts index c7293b01..bae0bf65 100644 --- a/web/src/views/apps/php81/route.ts +++ b/web/src/views/apps/php81/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'PHP 8.1', - icon: 'simple-icons:php', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/php82/route.ts b/web/src/views/apps/php82/route.ts index b3841187..64ec376c 100644 --- a/web/src/views/apps/php82/route.ts +++ b/web/src/views/apps/php82/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'PHP 8.2', - icon: 'simple-icons:php', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/php83/route.ts b/web/src/views/apps/php83/route.ts index 6d9bf683..a70cf944 100644 --- a/web/src/views/apps/php83/route.ts +++ b/web/src/views/apps/php83/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'PHP 8.3', - icon: 'simple-icons:php', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/php84/route.ts b/web/src/views/apps/php84/route.ts index 60cb93f1..198446ed 100644 --- a/web/src/views/apps/php84/route.ts +++ b/web/src/views/apps/php84/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'PHP 8.4', - icon: 'simple-icons:php', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/phpmyadmin/route.ts b/web/src/views/apps/phpmyadmin/route.ts index cbaf61a7..44da9af6 100644 --- a/web/src/views/apps/phpmyadmin/route.ts +++ b/web/src/views/apps/phpmyadmin/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'phpMyAdmin', - icon: 'simple-icons:phpmyadmin', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/podman/route.ts b/web/src/views/apps/podman/route.ts index ed9b9d54..0a54fa2c 100644 --- a/web/src/views/apps/podman/route.ts +++ b/web/src/views/apps/podman/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Podman', - icon: 'simple-icons:podman', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/postgresql/route.ts b/web/src/views/apps/postgresql/route.ts index a5a7ef23..29a116c5 100644 --- a/web/src/views/apps/postgresql/route.ts +++ b/web/src/views/apps/postgresql/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'PostgreSQL', - icon: 'simple-icons:postgresql', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/pureftpd/route.ts b/web/src/views/apps/pureftpd/route.ts index 2bc53ccb..f09e084f 100644 --- a/web/src/views/apps/pureftpd/route.ts +++ b/web/src/views/apps/pureftpd/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Pure-FTPd', - icon: 'mdi:server-network', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/redis/route.ts b/web/src/views/apps/redis/route.ts index 623fe766..df010ac5 100644 --- a/web/src/views/apps/redis/route.ts +++ b/web/src/views/apps/redis/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Redis', - icon: 'simple-icons:redis', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/rsync/route.ts b/web/src/views/apps/rsync/route.ts index b48ebadc..4917dd7b 100644 --- a/web/src/views/apps/rsync/route.ts +++ b/web/src/views/apps/rsync/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Rsync Manager', - icon: 'mdi:folder-sync-outline', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/s3fs/route.ts b/web/src/views/apps/s3fs/route.ts index 04cee6bf..3be4af93 100644 --- a/web/src/views/apps/s3fs/route.ts +++ b/web/src/views/apps/s3fs/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'S3fs Manager', - icon: 'mdi:dns-outline', role: ['admin'], requireAuth: true } diff --git a/web/src/views/apps/supervisor/route.ts b/web/src/views/apps/supervisor/route.ts index a79a6db8..d1f48fc0 100644 --- a/web/src/views/apps/supervisor/route.ts +++ b/web/src/views/apps/supervisor/route.ts @@ -14,7 +14,6 @@ export default { component: () => import('./IndexView.vue'), meta: { title: 'Supervisor Manager', - icon: 'mdi:monitor-dashboard', role: ['admin'], requireAuth: true }