diff --git a/Dockerfile b/Dockerfile index f1203f4c..2bc14a03 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,17 +7,17 @@ COPY /client/.npmrc /client/.npmrc WORKDIR /client RUN npm ci COPY /client /client -COPY /docs /docs RUN npm run build FROM node:24-bookworm AS build_v3 -RUN mkdir -p /server/static/ui-new +RUN mkdir -p /server/static COPY /client-v3/package.json /client-v3/package.json COPY /client-v3/package-lock.json /client-v3/package-lock.json WORKDIR /client-v3 RUN npm ci COPY /client-v3 /client-v3 +COPY /docs /docs RUN npm run build FROM python:3.13-bookworm @@ -30,7 +30,7 @@ RUN apt install -y nano COPY /server /server COPY --from=build_v2 /server/static /server/static -COPY --from=build_v3 /server/static/ui-new /server/static/ui-new +COPY --from=build_v3 /server/static /server/static WORKDIR /server RUN mkdir conf EXPOSE 8080 diff --git a/client-v3/e2e/helpers.ts b/client-v3/e2e/helpers.ts index 3a694ab9..a9c0331b 100644 --- a/client-v3/e2e/helpers.ts +++ b/client-v3/e2e/helpers.ts @@ -1,7 +1,7 @@ import type { Page } from '@playwright/test'; export const SERVER_PORT = 8888; -export const UI_BASE = `http://localhost:${SERVER_PORT}/ui-new`; +export const UI_BASE = `http://localhost:${SERVER_PORT}`; export const ADMIN_USERNAME = 'admin'; export const ADMIN_PASSWORD = 'testpassword'; diff --git a/client-v3/package-lock.json b/client-v3/package-lock.json index 69ae2354..2c82034c 100644 --- a/client-v3/package-lock.json +++ b/client-v3/package-lock.json @@ -1,12 +1,12 @@ { "name": "client-v3", - "version": "0.31.2", + "version": "0.32.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "client-v3", - "version": "0.31.2", + "version": "0.32.0", "dependencies": { "@vuelidate/core": "^2.0.3", "@vuelidate/validators": "^2.0.4", @@ -19,8 +19,8 @@ "d3-selection": "^3.0.0", "d3-zoom": "^3.0.0", "deep-object-diff": "1.1.9", - "dompurify": "^3.4.8", - "fuse.js": "^7.4.1", + "dompurify": "^3.4.9", + "fuse.js": "^7.4.2", "lodash": "^4.18.1", "loglevel": "^1.9.2", "marked": "^18.0.5", @@ -33,15 +33,15 @@ "vue-toast-notification": "^3.1.3" }, "devDependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", + "@emnapi/core": "1.11.0", + "@emnapi/runtime": "1.11.0", "@eslint/js": "^10.0.1", "@iconify-json/mdi": "^1.2.3", "@playwright/test": "^1.60.0", "@types/lodash": "~4.17.24", "@types/node": ">=22.12.0", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", "@vitejs/plugin-vue": "^6.0.7", "@vitest/ui": "^4.1.8", "@vue/test-utils": "^2.4.11", @@ -52,10 +52,10 @@ "globals": "^17.6.0", "jiti": "^2.7.0", "jsdom": "^29.1.1", - "prettier": "^3.8.3", + "prettier": "^3.8.4", "sass": "1.100.0", "typescript": "^6.0.3", - "typescript-eslint": "^8.60.1", + "typescript-eslint": "^8.61.0", "unplugin-icons": "^23.0.1", "unplugin-vue-components": "^32.1.0", "vite": "^8.0.16", @@ -299,9 +299,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", - "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.2.tgz", + "integrity": "sha512-n6Zd8mpVhObnaOqq6TC/lBCKgYncAGfFwuvJGQZTDRAwEoxwXIZu9kXBQeXkcqHsE6Sp6LyxDMrvXj5gOxnryw==", "dev": true, "funding": [ { @@ -397,21 +397,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.0.tgz", + "integrity": "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.1", + "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.0.tgz", + "integrity": "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==", "dev": true, "license": "MIT", "peer": true, @@ -420,9 +420,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, "license": "MIT", "dependencies": { @@ -801,14 +801,14 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.1" + "@tybys/wasm-util": "^0.10.2" }, "funding": { "type": "github", @@ -1427,6 +1427,40 @@ "node": "^20.19.0 || >=22.12.0" } }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@rolldown/binding-win32-arm64-msvc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", @@ -1574,9 +1608,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", - "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "version": "25.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz", + "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", "dev": true, "license": "MIT", "peer": true, @@ -1598,17 +1632,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz", - "integrity": "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz", + "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.60.1", - "@typescript-eslint/type-utils": "8.60.1", - "@typescript-eslint/utils": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/type-utils": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -1621,23 +1655,23 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/parser": "^8.61.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.1.tgz", - "integrity": "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz", + "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.60.1", - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", "debug": "^4.4.3" }, "engines": { @@ -1653,14 +1687,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz", - "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", + "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.60.1", - "@typescript-eslint/types": "^8.60.1", + "@typescript-eslint/tsconfig-utils": "^8.61.0", + "@typescript-eslint/types": "^8.61.0", "debug": "^4.4.3" }, "engines": { @@ -1675,14 +1709,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz", - "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", + "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1" + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1693,9 +1727,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz", - "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", + "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", "dev": true, "license": "MIT", "engines": { @@ -1710,15 +1744,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz", - "integrity": "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz", + "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1", - "@typescript-eslint/utils": "8.60.1", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -1735,9 +1769,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", - "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", + "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", "dev": true, "license": "MIT", "engines": { @@ -1749,16 +1783,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz", - "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", + "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.60.1", - "@typescript-eslint/tsconfig-utils": "8.60.1", - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1", + "@typescript-eslint/project-service": "8.61.0", + "@typescript-eslint/tsconfig-utils": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -1777,16 +1811,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.1.tgz", - "integrity": "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz", + "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.60.1", - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1" + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1801,13 +1835,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz", - "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", + "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/types": "8.61.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -2905,9 +2939,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.8.tgz", - "integrity": "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==", + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.9.tgz", + "integrity": "sha512-4dPSRMRDqHvs0V4YDFCsaIZo4if5u0xM+llyxiM2fwuZFdKArUBAF3VtI2+n8NKg9P870WMdYk0UhqQNoWXbfQ==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -3438,9 +3472,9 @@ } }, "node_modules/fuse.js": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.4.1.tgz", - "integrity": "sha512-AY7lKAXK71hi3WgUvDy6oZL67UEHOOtvCAwVdOXHyJd6ZzftBy7QqxuXt4HxmmAhYjmp/YCuOELZtIvAdlZ+fw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.4.2.tgz", + "integrity": "sha512-LVbzjD4WA6UP5B1UnP8wuaXJiLnqMdM/E4fiJXTJ5haJ5b/MBNsK29h2fm6swEoQaVQjvYFWKLE2RanyZIoRVQ==", "license": "Apache-2.0", "engines": { "node": ">=10" @@ -4645,9 +4679,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.2.tgz", + "integrity": "sha512-Wjvt4scRFouioIInHf51IFNP4ltJ2EngJM+cZPGiqbKetBfmP3vpdPV8ID2S6JS6/jdo74N8+aEYH9lQr2C6sA==", "dev": true, "license": "MIT", "dependencies": { @@ -4669,9 +4703,9 @@ } }, "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz", + "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==", "dev": true, "license": "MIT", "peer": true, @@ -4745,9 +4779,9 @@ } }, "node_modules/reka-ui": { - "version": "2.9.9", - "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.9.tgz", - "integrity": "sha512-/e+hdF9vP8E2kPrKR4RdgMQQsfpCr8l436Zn8GRWM3jKT9EG1lOO/UFMGBVEnrMLOVoJSjjmIFrej4tMOb+6qQ==", + "version": "2.9.10", + "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.10.tgz", + "integrity": "sha512-yuvZVTp4fWH2G3qk+ze/x6YYlyc2Xl1d+eMUlIYrKqzTowBKteoDoN17fitURmqSUck3mc7JbcYgp49DnGu2EQ==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.6.13", @@ -4861,9 +4895,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", - "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", "bin": { @@ -5261,16 +5295,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.1.tgz", - "integrity": "sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz", + "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.60.1", - "@typescript-eslint/parser": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1", - "@typescript-eslint/utils": "8.60.1" + "@typescript-eslint/eslint-plugin": "8.61.0", + "@typescript-eslint/parser": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5291,9 +5325,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.1.tgz", - "integrity": "sha512-UDdpiex+mzigiyrXrGbiUaF4HzTNhKbh2vRNFaTMzcqmLIPrZxaCtwo/1TMSuWoM1Xz3WiTo9KdgI3kRqYzJGg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz", + "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", "dev": true, "license": "MIT", "engines": { @@ -5649,9 +5683,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.3.tgz", - "integrity": "sha512-x4nsFpy5Pe8fqPzp/5vkTPeTTDBpAx4WVtV47Ejt0+2FQrq4pRRsJs7JmYRqMFzTu/LW+pCWEjQ3YVCkPV7f9g==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.4.tgz", + "integrity": "sha512-joip1uZTaQR0nD23N400gIdJ7xY+WiiiMA/BCKz842gvGBknqDQAzklUvDEhqFvvrhQY8S2ZANBMu4X70VMFGw==", "dev": true, "license": "MIT" }, diff --git a/client-v3/package.json b/client-v3/package.json index fcda5dfa..a389ea89 100644 --- a/client-v3/package.json +++ b/client-v3/package.json @@ -1,11 +1,12 @@ { "name": "client-v3", - "version": "0.31.2", + "version": "0.32.0", "description": "DigiScript front end (Vue 3)", "author": "DreamTeamProd", "private": true, "type": "module", "scripts": { + "prebuild": "scripts/copy-docs.sh && node --strip-types scripts/generate-doc-manifest.ts", "build": "vite build", "build:analyze": "vite build --mode analyze", "lint": "npm run format && npm run lint:eslint", @@ -41,8 +42,8 @@ "d3-selection": "^3.0.0", "d3-zoom": "^3.0.0", "deep-object-diff": "1.1.9", - "dompurify": "^3.4.8", - "fuse.js": "^7.4.1", + "dompurify": "^3.4.9", + "fuse.js": "^7.4.2", "lodash": "^4.18.1", "loglevel": "^1.9.2", "marked": "^18.0.5", @@ -55,14 +56,14 @@ "vue-toast-notification": "^3.1.3" }, "devDependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", + "@emnapi/core": "1.11.0", + "@emnapi/runtime": "1.11.0", "@eslint/js": "^10.0.1", "@iconify-json/mdi": "^1.2.3", "@types/lodash": "~4.17.24", "@types/node": ">=22.12.0", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", "@vitejs/plugin-vue": "^6.0.7", "@vitest/ui": "^4.1.8", "@vue/test-utils": "^2.4.11", @@ -73,10 +74,10 @@ "globals": "^17.6.0", "jiti": "^2.7.0", "jsdom": "^29.1.1", - "prettier": "^3.8.3", + "prettier": "^3.8.4", "sass": "1.100.0", "typescript": "^6.0.3", - "typescript-eslint": "^8.60.1", + "typescript-eslint": "^8.61.0", "unplugin-icons": "^23.0.1", "unplugin-vue-components": "^32.1.0", "vite": "^8.0.16", diff --git a/client-v3/scripts/copy-docs.sh b/client-v3/scripts/copy-docs.sh new file mode 100755 index 00000000..962b1b3b --- /dev/null +++ b/client-v3/scripts/copy-docs.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + +DOCS_SOURCE="../docs" +DOCS_DEST="./public/docs" + +echo "Copying documentation assets..." + +# Remove existing docs and ensure parent dir exists +rm -rf "$DOCS_DEST" +mkdir -p "$(dirname "$DOCS_DEST")" + +# Copy docs directory +cp -r "$DOCS_SOURCE" "$DOCS_DEST" + +echo "Documentation assets copied successfully" diff --git a/client-v3/scripts/generate-doc-manifest.ts b/client-v3/scripts/generate-doc-manifest.ts new file mode 100644 index 00000000..fb2b41a5 --- /dev/null +++ b/client-v3/scripts/generate-doc-manifest.ts @@ -0,0 +1,135 @@ +#!/usr/bin/env node +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const DOCS_DIR = path.join(__dirname, '../../docs'); +const OUTPUT_DIR = path.join(__dirname, '../public/docs'); +const MANIFEST_PATH = path.join(OUTPUT_DIR, 'manifest.json'); + +interface ManifestEntry { + title: string; + slug: string; + path: string; + category: string; + order: number; +} + +function generateSlug(filepath: string): string { + // pages/getting_started.md → getting-started + // pages/show_config/acts_and_scenes.md → show-config/acts-and-scenes + const withoutExt = filepath.replace(/\.md$/, ''); + const withoutPages = withoutExt.replace(/^pages\//, ''); + return withoutPages.replace(/_/g, '-'); +} + +function extractTitle(content: string, filepath: string): string { + const parts = filepath.split('/'); + + if (parts.length > 2) { + const h3Match = content.match(/^###\s+(.+)$/m); + if (h3Match) return h3Match[1]; + } + + const match = content.match(/^##?\s+(.+)$/m); + if (match) return match[1]; + + const filename = parts[parts.length - 1].replace(/\.md$/, ''); + return filename.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()); +} + +function extractCategory(relativePath: string): string { + const parts = relativePath.split('/'); + return parts.length > 2 ? parts[1] : 'root'; +} + +function extractMarkdownLinks(content: string): string[] { + // Extract all markdown links: [text](./path.md) or [text](path.md) + return [...content.matchAll(/\[([^\]]+)\]\(([^)]+\.md)\)/g)].map((m) => m[2]); +} + +function normalizeLink(currentFile: string, link: string): string { + const currentDir = path.dirname(currentFile); + return path.normalize(path.join(currentDir, link)).replace(/\\/g, '/'); +} + +function buildOrderFromLinks(docsDir: string): string[] { + const visited = new Set(); + const order: string[] = []; + + function traverse(relativePath: string): void { + if (visited.has(relativePath)) return; + + const fullPath = path.join(docsDir, relativePath); + if (!fs.existsSync(fullPath) || !fs.statSync(fullPath).isFile()) return; + + visited.add(relativePath); + order.push(relativePath); + + const content = fs.readFileSync(fullPath, 'utf8'); + for (const link of extractMarkdownLinks(content)) { + traverse(normalizeLink(relativePath, link)); + } + } + + traverse('index.md'); + return order; +} + +function walkDocs(dir: string, basePath = ''): Omit[] { + const manifest: Omit[] = []; + + if (!fs.existsSync(dir)) { + console.warn(`Warning: Directory ${dir} does not exist`); + return manifest; + } + + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const fullPath = path.join(dir, entry.name); + const relativePath = path.join(basePath, entry.name); + + if (entry.isDirectory() && entry.name !== 'images') { + manifest.push(...walkDocs(fullPath, relativePath)); + } else if (entry.isFile() && entry.name.endsWith('.md')) { + const content = fs.readFileSync(fullPath, 'utf8'); + manifest.push({ + title: extractTitle(content, relativePath), + slug: generateSlug(relativePath), + path: relativePath.replace(/\\/g, '/'), + category: extractCategory(relativePath), + }); + } + } + + return manifest; +} + +if (!fs.existsSync(OUTPUT_DIR)) { + fs.mkdirSync(OUTPUT_DIR, { recursive: true }); +} + +console.log('Generating documentation manifest...'); + +const linkOrder = buildOrderFromLinks(DOCS_DIR); +console.log(`📊 Discovered ${linkOrder.length} documents via link traversal`); + +const orderMap = new Map(linkOrder.map((filePath, i) => [filePath, i])); + +const manifest: ManifestEntry[] = walkDocs(DOCS_DIR).map((entry) => ({ + ...entry, + order: orderMap.get(entry.path) ?? 999, +})); + +const filteredManifest = manifest + .filter((entry) => entry.path !== 'index.md') + .sort((a, b) => { + if (a.order !== b.order) return a.order - b.order; + if (a.category !== b.category) return a.category.localeCompare(b.category); + return a.title.localeCompare(b.title); + }); + +fs.writeFileSync(MANIFEST_PATH, JSON.stringify(filteredManifest, null, 2)); +console.log(`✅ Generated manifest with ${filteredManifest.length} documents (excluded index.md)`); +console.log(`📄 Manifest saved to: ${MANIFEST_PATH}`); diff --git a/client-v3/src/App.vue b/client-v3/src/App.vue index 78d0877d..e2aef2e7 100644 --- a/client-v3/src/App.vue +++ b/client-v3/src/App.vue @@ -94,7 +94,9 @@ - Switch to Classic UI + + Switch to Classic UI + Help About @@ -273,7 +275,7 @@ async function loadInitialUserData(): Promise { await Promise.all([userStore.getCurrentRbac(), userStore.getUserSettings()]); const switching = new URLSearchParams(window.location.search).has('_switch'); if (!switching && (userStore.userSettings as UserSettings).preferred_ui === 'old') { - window.location.href = '/?_switch=1'; + window.location.href = '/ui-old/?_switch=1'; return false; } if (switching) { diff --git a/client-v3/src/components/config/ConfigShows.vue b/client-v3/src/components/config/ConfigShows.vue index 62ca7a9d..4da109e7 100644 --- a/client-v3/src/components/config/ConfigShows.vue +++ b/client-v3/src/components/config/ConfigShows.vue @@ -143,7 +143,7 @@ const isSubmittingLoad = ref(false); const isSubmittingShow = ref(false); const isDeleting = ref(false); const deletingId = ref(null); -const { perPage, currentPage } = usePagination(); +const { perPage, currentPage } = usePagination(15, 'config_shows'); const showFields = [ { key: 'id', label: 'ID' }, diff --git a/client-v3/src/components/config/ConfigSystem.vue b/client-v3/src/components/config/ConfigSystem.vue index ecdb107a..b10ba1da 100644 --- a/client-v3/src/components/config/ConfigSystem.vue +++ b/client-v3/src/components/config/ConfigSystem.vue @@ -99,7 +99,7 @@ const { connectedSessions, versionStatus, serverInfo } = storeToRefs(systemStore const loading = ref(true); const isCheckingVersion = ref(false); -const { perPage, currentPage } = usePagination(); +const { perPage, currentPage } = usePagination(15, 'config_system_clients'); const clientsModal = ref>(); const clientFields = [ diff --git a/client-v3/src/components/show/config/acts_and_scenes/ConfigActs.vue b/client-v3/src/components/show/config/acts_and_scenes/ConfigActs.vue index 9bb104c4..63c1ec04 100644 --- a/client-v3/src/components/show/config/acts_and_scenes/ConfigActs.vue +++ b/client-v3/src/components/show/config/acts_and_scenes/ConfigActs.vue @@ -142,7 +142,7 @@ const showStore = useShowStore(); const { confirm } = useConfirm(); const loading = ref(true); -const { perPage, currentPage } = usePagination(); +const { perPage, currentPage } = usePagination(15, 'config_acts'); const submittingNewAct = ref(false); const submittingEditAct = ref(false); const deletingAct = ref(false); diff --git a/client-v3/src/components/show/config/acts_and_scenes/ConfigScenes.vue b/client-v3/src/components/show/config/acts_and_scenes/ConfigScenes.vue index 1d7680ff..ae5ea410 100644 --- a/client-v3/src/components/show/config/acts_and_scenes/ConfigScenes.vue +++ b/client-v3/src/components/show/config/acts_and_scenes/ConfigScenes.vue @@ -206,7 +206,7 @@ const showStore = useShowStore(); const { confirm } = useConfirm(); const loading = ref(true); -const { perPage, currentPage } = usePagination(); +const { perPage, currentPage } = usePagination(15, 'config_scenes'); const submittingNewScene = ref(false); const submittingEditScene = ref(false); const submittingFirstScene = ref(false); diff --git a/client-v3/src/components/show/config/characters/CharacterGroups.vue b/client-v3/src/components/show/config/characters/CharacterGroups.vue index 68a1f195..cf7a2e41 100644 --- a/client-v3/src/components/show/config/characters/CharacterGroups.vue +++ b/client-v3/src/components/show/config/characters/CharacterGroups.vue @@ -146,7 +146,7 @@ const showStore = useShowStore(); const { confirm } = useConfirm(); const loading = ref(true); -const { perPage, currentPage } = usePagination(); +const { perPage, currentPage } = usePagination(15, 'config_character_groups'); const submittingNewGroup = ref(false); const submittingEditGroup = ref(false); const deletingGroup = ref(false); diff --git a/client-v3/src/components/show/config/mics/MicList.vue b/client-v3/src/components/show/config/mics/MicList.vue index 005e886a..4dca8a95 100644 --- a/client-v3/src/components/show/config/mics/MicList.vue +++ b/client-v3/src/components/show/config/mics/MicList.vue @@ -103,7 +103,7 @@ const systemStore = useSystemStore(); const { confirm } = useConfirm(); const { validationState } = useFormValidation(); -const { perPage, currentPage } = usePagination(); +const { perPage, currentPage } = usePagination(15, 'config_mics'); const isSubmitting = ref(false); const newModal = ref>(); diff --git a/client-v3/src/components/show/config/script/StageDirectionStyles.vue b/client-v3/src/components/show/config/script/StageDirectionStyles.vue index a23180d7..a38e660b 100644 --- a/client-v3/src/components/show/config/script/StageDirectionStyles.vue +++ b/client-v3/src/components/show/config/script/StageDirectionStyles.vue @@ -156,7 +156,7 @@ const systemStore = useSystemStore(); const { confirm } = useConfirm(); const { validationState } = useFormValidation(); -const { perPage, currentPage } = usePagination(); +const { perPage, currentPage } = usePagination(15, 'show_stage_direction_styles'); const isSubmittingNew = ref(false); const isSubmittingEdit = ref(false); const isDeleting = ref(false); diff --git a/client-v3/src/components/show/config/sessions/SessionTagList.vue b/client-v3/src/components/show/config/sessions/SessionTagList.vue index a0e6b34b..176edca8 100644 --- a/client-v3/src/components/show/config/sessions/SessionTagList.vue +++ b/client-v3/src/components/show/config/sessions/SessionTagList.vue @@ -203,7 +203,7 @@ const systemStore = useSystemStore(); const showStore = useShowStore(); const { confirm } = useConfirm(); -const { perPage, currentPage } = usePagination(); +const { perPage, currentPage } = usePagination(15, 'config_session_tags'); const isSubmittingNewTag = ref(false); const isSubmittingEditTag = ref(false); const isSubmittingDeleteTag = ref(false); diff --git a/client-v3/src/components/show/config/stage/CrewList.vue b/client-v3/src/components/show/config/stage/CrewList.vue index b1be46b3..ecdca562 100644 --- a/client-v3/src/components/show/config/stage/CrewList.vue +++ b/client-v3/src/components/show/config/stage/CrewList.vue @@ -111,7 +111,7 @@ const systemStore = useSystemStore(); const { confirm } = useConfirm(); const { validationState } = useFormValidation(); -const { perPage, currentPage } = usePagination(); +const { perPage, currentPage } = usePagination(15, 'config_crew'); const isSubmitting = ref(false); const newModal = ref>(); diff --git a/client-v3/src/components/show/config/stage/PropsList.vue b/client-v3/src/components/show/config/stage/PropsList.vue index 7e65e62a..2b167566 100644 --- a/client-v3/src/components/show/config/stage/PropsList.vue +++ b/client-v3/src/components/show/config/stage/PropsList.vue @@ -220,8 +220,11 @@ const systemStore = useSystemStore(); const { confirm } = useConfirm(); const { validationState } = useFormValidation(); -const { perPage: propTypesPerPage, currentPage: currentPropTypesPage } = usePagination(); -const { perPage: propsPerPage, currentPage: currentPropsPage } = usePagination(); +const { perPage: propTypesPerPage, currentPage: currentPropTypesPage } = usePagination( + 15, + 'config_prop_types' +); +const { perPage: propsPerPage, currentPage: currentPropsPage } = usePagination(15, 'config_props'); const isSubmitting = ref(false); const newPropTypeModal = ref>(); diff --git a/client-v3/src/components/show/config/stage/SceneryList.vue b/client-v3/src/components/show/config/stage/SceneryList.vue index bad527bb..6fe9ceae 100644 --- a/client-v3/src/components/show/config/stage/SceneryList.vue +++ b/client-v3/src/components/show/config/stage/SceneryList.vue @@ -222,8 +222,14 @@ const systemStore = useSystemStore(); const { confirm } = useConfirm(); const { validationState } = useFormValidation(); -const { perPage: sceneryTypesPerPage, currentPage: currentSceneryTypesPage } = usePagination(); -const { perPage: sceneryPerPage, currentPage: currentSceneryPage } = usePagination(); +const { perPage: sceneryTypesPerPage, currentPage: currentSceneryTypesPage } = usePagination( + 15, + 'config_scenery_types' +); +const { perPage: sceneryPerPage, currentPage: currentSceneryPage } = usePagination( + 15, + 'config_scenery' +); const isSubmitting = ref(false); const newSceneryTypeModal = ref>(); diff --git a/client-v3/src/components/show/config/stage/StageManager.vue b/client-v3/src/components/show/config/stage/StageManager.vue index cbd298ed..7193c883 100644 --- a/client-v3/src/components/show/config/stage/StageManager.vue +++ b/client-v3/src/components/show/config/stage/StageManager.vue @@ -450,8 +450,14 @@ const setExpanded = ref(false); const strikeExpanded = ref(false); const savingAssignment = ref(false); const newCrewSelections = ref>({}); -const { perPage: sceneryAllocPerPage, currentPage: currentSceneryAllocPage } = usePagination(); -const { perPage: propsAllocPerPage, currentPage: currentPropsAllocPage } = usePagination(); +const { perPage: sceneryAllocPerPage, currentPage: currentSceneryAllocPage } = usePagination( + 15, + 'config_stage_scenery_alloc' +); +const { perPage: propsAllocPerPage, currentPage: currentPropsAllocPage } = usePagination( + 15, + 'config_stage_props_alloc' +); const goToSceneModal = ref>(); const addSceneryModal = ref>(); diff --git a/client-v3/src/components/show/live/ScriptLineViewer.vue b/client-v3/src/components/show/live/ScriptLineViewer.vue index 3c8a10ea..063772a3 100644 --- a/client-v3/src/components/show/live/ScriptLineViewer.vue +++ b/client-v3/src/components/show/live/ScriptLineViewer.vue @@ -64,6 +64,7 @@ @@ -170,7 +171,7 @@ @@ -439,6 +440,12 @@ onUnmounted(() => { padding: 0.2rem; } +.line-row:has(.add-cue-btn:hover) { + background-color: rgba(255, 255, 255, 0.06); + border-radius: 4px; + transition: background-color 0.15s ease; +} + .stage-direction { margin-top: 1rem; margin-bottom: 1rem; diff --git a/client-v3/src/components/show/live/ScriptLineViewerCompact.vue b/client-v3/src/components/show/live/ScriptLineViewerCompact.vue index a5d35085..bb088382 100644 --- a/client-v3/src/components/show/live/ScriptLineViewerCompact.vue +++ b/client-v3/src/components/show/live/ScriptLineViewerCompact.vue @@ -56,7 +56,7 @@ - + @@ -175,7 +176,7 @@ @@ -393,6 +394,12 @@ export default defineComponent({ padding: 0.2rem; } +.line-row:has(.add-cue-btn:hover) { + background-color: rgba(255, 255, 255, 0.06); + border-radius: 4px; + transition: background-color 0.15s ease; +} + .stage-direction { margin-top: 1rem; margin-bottom: 1rem; diff --git a/client/src/vue_components/show/live/ScriptLineViewerCompact.vue b/client/src/vue_components/show/live/ScriptLineViewerCompact.vue index c447b9b7..81f198df 100644 --- a/client/src/vue_components/show/live/ScriptLineViewerCompact.vue +++ b/client/src/vue_components/show/live/ScriptLineViewerCompact.vue @@ -70,7 +70,7 @@ - +