diff --git a/Dockerfile b/Dockerfile index 421046d..b1382bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ########################## -FROM node:24.14.0-alpine3.23 AS base +FROM node:24.14.1-alpine3.23 AS base WORKDIR /app ENV NODE_ENV=production @@ -26,9 +26,12 @@ COPY --from=package-strip /app/package.json package.json COPY --from=package-strip /app/package-lock.json package-lock.json ADD ui/package.json ui/package.json ADD api/package.json api/package.json -# full deps install used for building +ADD lib-vuetify/package.json lib-vuetify/package.json +# full deps install used for types and ui building # also used to fill the npm cache for faster install of api deps -RUN npm ci --omit=optional --no-audit --no-fund +RUN npm ci --omit=dev --no-audit --no-fund +# install dev dependencies for ui workspace +RUN npm install -w ui --include=dev --no-audit --no-fund ########################## FROM installer AS types @@ -46,6 +49,7 @@ COPY --from=types /app/api/config api/config COPY --from=types /app/api/types api/types ADD /api/src/config.ts api/src/config.ts ADD /ui ui +ADD /lib-vuetify lib-vuetify RUN npm -w ui run build ########################## diff --git a/eslint.config.mjs b/eslint.config.mjs index 19b0e4f..89e4fe0 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -2,7 +2,7 @@ import neostandard from 'neostandard' import dfLibRecommended from '@data-fair/lib-utils/eslint/recommended.js' export default [ - { ignores: ['ui/*', '**/.type/', 'dev/*', 'node_modules/*'] }, + { ignores: ['ui/*', '**/.type/', 'dev/*', 'node_modules/*', 'lib-vuetify/*.js', 'lib-vuetify/*.d.ts'] }, ...dfLibRecommended, ...neostandard({ ts: true }) ] diff --git a/lib-vuetify/.gitignore b/lib-vuetify/.gitignore new file mode 100644 index 0000000..d785128 --- /dev/null +++ b/lib-vuetify/.gitignore @@ -0,0 +1,3 @@ +*.js +*.d.ts +!env.d.ts diff --git a/lib-vuetify/DfNotificationQueue.vue b/lib-vuetify/DfNotificationQueue.vue new file mode 100644 index 0000000..8dc071a --- /dev/null +++ b/lib-vuetify/DfNotificationQueue.vue @@ -0,0 +1,134 @@ + + + + + + en: + loginRequired: + part1: You must + part2: log in + part3: to receive notifications. + noNotifications: You have not received any notifications yet. + openNotificationList: Open notification list + + fr: + loginRequired: + part1: Vous devez vous + part2: connecter + part3: pour recevoir des notifications. + noNotifications: Vous n'avez pas encore reçu de notification. + openNotificationList: Ouvrir la liste des notifications + diff --git a/lib-vuetify/env.d.ts b/lib-vuetify/env.d.ts new file mode 100644 index 0000000..2b97bd9 --- /dev/null +++ b/lib-vuetify/env.d.ts @@ -0,0 +1,5 @@ +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/lib-vuetify/index.ts b/lib-vuetify/index.ts new file mode 100644 index 0000000..3c4bafd --- /dev/null +++ b/lib-vuetify/index.ts @@ -0,0 +1 @@ +export { default as DfNotificationQueue } from './DfNotificationQueue.vue' diff --git a/lib-vuetify/package.json b/lib-vuetify/package.json new file mode 100644 index 0000000..631cc52 --- /dev/null +++ b/lib-vuetify/package.json @@ -0,0 +1,27 @@ +{ + "name": "@data-fair/lib-vuetify-events", + "version": "0.2.1", + "description": "Vuetify components for embedding events features.", + "main": "index.js", + "type": "module", + "files": [ + "**/*.js", + "**/*.d.ts", + "**/*.vue" + ], + "scripts": { + "build": "tsc", + "prepublishOnly": "tsc" + }, + "license": "MIT", + "peerDependencies": { + "vue": "^3.5.0", + "vuetify": "^4.0.0", + "@data-fair/lib-vuetify": "^2.0.0", + "@data-fair/lib-vue": "^1.26.0" + }, + "dependencies": { + "@mdi/js": "^7.4.47", + "ofetch": "^1.4.0" + } +} diff --git a/lib-vuetify/tsconfig.json b/lib-vuetify/tsconfig.json new file mode 100644 index 0000000..1dcc5e1 --- /dev/null +++ b/lib-vuetify/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "declaration": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": ".", + "rootDir": ".", + "lib": ["ESNext", "DOM"] + }, + "include": ["*.ts"], + "exclude": ["node_modules"] +} diff --git a/package-lock.json b/package-lock.json index 2846674..2c8a185 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "MIT", "workspaces": [ "ui", - "api" + "api", + "lib-vuetify" ], "dependencies": { "@data-fair/lib-types-builder": "^1.11.6" @@ -26,7 +27,7 @@ "dotenv-cli": "^11.0.0", "eslint": "^9.39.4", "eslint-plugin-vue": "^9.33.0", - "eslint-plugin-vuetify": "github:albanm/eslint-plugin-vuetify", + "eslint-plugin-vuetify": "^2.5.1", "husky": "^9.1.7", "json-schema-to-typescript": "^11.0.5", "neostandard": "^0.12.2", @@ -35,6 +36,9 @@ "tough-cookie": "^5.1.2", "typescript": "^5.9.3", "ws": "^8.20.0" + }, + "optionalDependencies": { + "sass": "1.98.0" } }, "api": { @@ -90,6 +94,21 @@ "node": "^18 || >=20" } }, + "lib-vuetify": { + "name": "@data-fair/lib-vuetify-events", + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "@mdi/js": "^7.4.47", + "ofetch": "^1.4.0" + }, + "peerDependencies": { + "@data-fair/lib-vue": "^1.26.0", + "@data-fair/lib-vuetify": "^2.0.0", + "vue": "^3.5.0", + "vuetify": "^4.0.0" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "11.9.3", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", @@ -557,7 +576,6 @@ "resolved": "https://registry.npmjs.org/@data-fair/lib-node/-/lib-node-2.12.1.tgz", "integrity": "sha512-qNQwLV1XbzrRs/UlhHWWJRArenIy7qdg9JKuWK/NPnlLAJAzTvWkiOM/Q2UVnFo2CquJ4+7uUMymhEt7+nBw+Q==", "license": "MIT", - "peer": true, "dependencies": { "@data-fair/lib-common-types": "^1.8.4", "@data-fair/lib-utils": "^1.1.0", @@ -685,7 +703,6 @@ "resolved": "https://registry.npmjs.org/@data-fair/lib-vue/-/lib-vue-1.27.0.tgz", "integrity": "sha512-9yCj9cSXo2lrU8X3AWURjODuSQY+MIS2Wf8we7rx5HG/k3qEV8PKLS1WS2dGiuhyh5to4hXeLMOOCgne599dAw==", "license": "MIT", - "peer": true, "dependencies": { "@data-fair/lib-common-types": "^1.7.1", "@data-fair/lib-utils": "^1.9.0", @@ -708,10 +725,32 @@ } } }, + "node_modules/@data-fair/lib-vuetify": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@data-fair/lib-vuetify/-/lib-vuetify-2.0.5.tgz", + "integrity": "sha512-qRRJLH3riP5xur7mpms2yT7n8qtWv2uxQIeitYgznu/8mZ7xotD0Ka0ntaV7FGdjlEXUI/3obkNT9J4uDQioHA==", + "license": "MIT", + "dependencies": { + "@data-fair/lib-common-types": "^1.10.4", + "@mdi/js": "^7.4.47", + "@vueuse/core": "^14.0.0" + }, + "peerDependencies": { + "@data-fair/lib-vue": "^1.15.0", + "ofetch": "1", + "vue-i18n": "10 || 11", + "vuetify": "4" + } + }, + "node_modules/@data-fair/lib-vuetify-events": { + "resolved": "lib-vuetify", + "link": true + }, "node_modules/@emnapi/core": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -723,6 +762,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -733,6 +773,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -751,6 +792,7 @@ "os": [ "aix" ], + "peer": true, "engines": { "node": ">=12" } @@ -767,6 +809,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=12" } @@ -783,6 +826,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=12" } @@ -799,6 +843,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=12" } @@ -815,6 +860,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=12" } @@ -831,6 +877,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=12" } @@ -847,6 +894,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -863,6 +911,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -879,6 +928,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -895,6 +945,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -911,6 +962,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -927,6 +979,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -943,6 +996,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -959,6 +1013,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -975,6 +1030,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -991,6 +1047,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -1007,6 +1064,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -1023,6 +1081,7 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -1039,6 +1098,7 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -1055,6 +1115,7 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=12" } @@ -1071,6 +1132,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -1087,6 +1149,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -1103,6 +1166,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -2421,19 +2485,6 @@ "node": ">=v12.0.0" } }, - "node_modules/@koumoul/v-iframe": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@koumoul/v-iframe/-/v-iframe-2.4.5.tgz", - "integrity": "sha512-Y7btXvMP96vs6H5lfAZ6SOElXp+kAHE7G2vu0z0q6WrL33gaIIi0LdhUkA1K2x3XVo7RitCjwtPlaWqqijjTEw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.2" - }, - "peerDependencies": { - "iframe-resizer": "4", - "vuetify": "3" - } - }, "node_modules/@mdi/js": { "version": "7.4.47", "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz", @@ -3015,150 +3066,6 @@ "license": "BSD-3-Clause", "optional": true }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", - "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", - "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", - "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", - "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, "node_modules/@rolldown/binding-linux-x64-gnu": { "version": "1.0.0-rc.9", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", @@ -3191,86 +3098,6 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", - "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", - "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", - "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.2", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", @@ -3310,7 +3137,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.59.0", @@ -3323,7 +3151,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.59.0", @@ -3336,7 +3165,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.59.0", @@ -3349,7 +3179,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.59.0", @@ -3362,7 +3193,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.59.0", @@ -3375,7 +3207,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.59.0", @@ -3388,7 +3221,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.59.0", @@ -3401,7 +3235,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.59.0", @@ -3414,7 +3249,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.59.0", @@ -3427,7 +3263,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.59.0", @@ -3440,7 +3277,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-loong64-musl": { "version": "4.59.0", @@ -3453,7 +3291,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.59.0", @@ -3466,7 +3305,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-ppc64-musl": { "version": "4.59.0", @@ -3479,7 +3319,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.59.0", @@ -3492,7 +3333,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.59.0", @@ -3505,7 +3347,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.59.0", @@ -3518,7 +3361,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.59.0", @@ -3531,7 +3375,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.59.0", @@ -3544,7 +3389,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-openbsd-x64": { "version": "4.59.0", @@ -3557,7 +3403,8 @@ "optional": true, "os": [ "openbsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.59.0", @@ -3570,7 +3417,8 @@ "optional": true, "os": [ "openharmony" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.59.0", @@ -3583,7 +3431,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.59.0", @@ -3596,7 +3445,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.59.0", @@ -3609,7 +3459,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.59.0", @@ -3622,7 +3473,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@stylistic/eslint-plugin": { "version": "2.11.0", @@ -3658,6 +3510,7 @@ "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -3847,7 +3700,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -4049,7 +3901,6 @@ "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/types": "8.57.0", @@ -4904,7 +4755,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4951,7 +4801,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5858,7 +5707,6 @@ "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -6025,8 +5873,7 @@ "version": "1.11.20", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/de-indent": { "version": "1.0.2", @@ -6753,7 +6600,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6912,7 +6758,6 @@ "integrity": "sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@package-json/types": "^0.0.12", "@typescript-eslint/types": "^8.56.0", @@ -7139,17 +6984,89 @@ } }, "node_modules/eslint-plugin-vuetify": { - "version": "2.4.0", - "resolved": "git+ssh://git@github.com/albanm/eslint-plugin-vuetify.git#e25c604300a03f8b852593c71a5ce9f4d25c2acd", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-vuetify/-/eslint-plugin-vuetify-2.7.2.tgz", + "integrity": "sha512-c8uKnb4DFJFBaqGTKT9Yv6SDhe+cVAQpRpey7nRlpXgXfHpMEe8u6yg5DEhn+Diam0bY05nEe3+T/t/d+cEinQ==", "dev": true, "license": "MIT", "dependencies": { - "eslint-plugin-vue": "^9.6.0", + "eslint-plugin-vue": "^10.8.0", "requireindex": "^1.2.0" }, "peerDependencies": { - "eslint": "^9.0.0", - "vuetify": "^3.0.0" + "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0", + "vuetify": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/eslint-plugin-vuetify/node_modules/eslint-plugin-vue": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.8.0.tgz", + "integrity": "sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^7.1.0", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vuetify/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-vuetify/node_modules/vue-eslint-parser": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz", + "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0 || ^9.0.0", + "eslint-visitor-keys": "^4.2.0 || ^5.0.0", + "espree": "^10.3.0 || ^11.0.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/eslint-scope": { @@ -7429,7 +7346,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -7935,9 +7851,9 @@ "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -8152,7 +8068,6 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8664,21 +8579,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/iframe-resizer": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/iframe-resizer/-/iframe-resizer-4.4.5.tgz", - "integrity": "sha512-U8bCywf/Gh07O69RXo6dXAzTtODQrxaHGHRI7Nt4ipXsuq6EMxVsOP/jjaP43YtXz/ibESS0uSVDN3sOGCzSmw==", - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.0" - }, - "funding": { - "type": "individual", - "url": "https://iframe-resizer.com//pricing" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -9329,7 +9229,6 @@ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "devOptional": true, "license": "MIT", - "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -11932,7 +11831,6 @@ "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", "license": "MIT", - "peer": true, "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", @@ -12292,21 +12190,6 @@ "node": ">=18" } }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -12727,8 +12610,7 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", @@ -13201,12 +13083,32 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/sass": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.98.0.tgz", + "integrity": "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==", + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, "node_modules/sass-embedded": { "version": "1.98.0", "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.98.0.tgz", "integrity": "sha512-Do7u6iRb6K+lrllcTkB1BXcHwOxcKe3rEfOF/GcCLE2w3WpddakRAosJOHFUR37DpsvimQXEt5abs3NzUjEIqg==", "license": "MIT", - "peer": true, "dependencies": { "@bufbuild/protobuf": "^2.5.0", "colorjs.io": "^0.5.0", @@ -14365,7 +14267,6 @@ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "devOptional": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tldts": "^6.1.32" }, @@ -14594,7 +14495,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15151,7 +15051,6 @@ "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.1.3.tgz", "integrity": "sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw==", "license": "MIT", - "peer": true, "dependencies": { "@vuetify/loader-shared": "^2.1.2", "debug": "^4.3.3", @@ -15166,6 +15065,21 @@ "vuetify": ">=3" } }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/vscode-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", @@ -15177,7 +15091,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.30", "@vue/compiler-sfc": "3.5.30", @@ -15273,7 +15186,6 @@ "integrity": "sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ==", "deprecated": "v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html", "license": "MIT", - "peer": true, "dependencies": { "@intlify/core-base": "10.0.8", "@intlify/shared": "10.0.8", @@ -15318,9 +15230,9 @@ } }, "node_modules/vuetify": { - "version": "3.12.3", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.12.3.tgz", - "integrity": "sha512-7QzgftMu8OYKRz/jr2yntPEJ7WFmAzMn8jyeUcW7gz539MjQbDF3UrqZXW3aWi458UVJW9WWvzQn9x5B75Aijw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-4.0.4.tgz", + "integrity": "sha512-sO2ux9RG0C1HKaP1HqDMro3+vbbmUJwzcKXuzaxQmUERAT/0FR0yfbwnj4PrMwWy1qc2WPJq01h4cr86FmNrFA==", "license": "MIT", "peer": true, "funding": { @@ -15614,7 +15526,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -15756,14 +15667,13 @@ "@data-fair/frame": "^0.17.7", "@data-fair/lib-vue": "^1.26.0", "@data-fair/lib-vuetify": "^2.0.0", + "@data-fair/lib-vuetify-events": "*", "@intlify/unplugin-vue-i18n": "^11.0.7", - "@koumoul/v-iframe": "^2.4.5", "@mdi/js": "^7.4.47", "@types/config": "^3.3.5", "@types/debug": "^4.1.12", "@vitejs/plugin-vue": "^6.0.5", "debug": "^4.4.3", - "iframe-resizer": "^4.4.5", "ofetch": "^1.5.1", "reconnecting-websocket": "^4.4.0", "sass-embedded": "^1.97.3", @@ -15779,23 +15689,6 @@ "vuetify": "^4.0.2" } }, - "ui/node_modules/@data-fair/lib-vuetify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@data-fair/lib-vuetify/-/lib-vuetify-2.0.0.tgz", - "integrity": "sha512-xfI15er5F/8FN+//iKHc8ZsaQmuI8XrpF1MH3FqBGOoPxSzjzNWW7HvGL4NvY5SHmTI5mrvCVcyCIteW+Ljgbw==", - "license": "MIT", - "dependencies": { - "@data-fair/lib-common-types": "^1.10.4", - "@mdi/js": "^7.4.47", - "@vueuse/core": "^14.0.0" - }, - "peerDependencies": { - "@data-fair/lib-vue": "^1.15.0", - "ofetch": "1", - "vue-i18n": "10 || 11", - "vuetify": "4" - } - }, "ui/node_modules/@vue/devtools-api": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.0.tgz", @@ -15820,6 +15713,20 @@ "url": "https://paulmillr.com/funding/" } }, + "ui/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "ui/node_modules/readdirp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", @@ -15975,7 +15882,6 @@ "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-4.0.2.tgz", "integrity": "sha512-klgSGmfXoLajdTuuxreilzDQjp0ojzL2U5v6Z3ZbMYtpihPPXT9rkd/FxWL3dIGevnWdgaP2Kpwoz6aS/MISDA==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/johnleider" diff --git a/package.json b/package.json index 06180f7..646ebbc 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "license": "MIT", "workspaces": [ "ui", - "api" + "api", + "lib-vuetify" ], "bugs": { "url": "https://github.com/data-fair/events/issues" @@ -47,7 +48,7 @@ "dotenv-cli": "^11.0.0", "eslint": "^9.39.4", "eslint-plugin-vue": "^9.33.0", - "eslint-plugin-vuetify": "github:albanm/eslint-plugin-vuetify", + "eslint-plugin-vuetify": "^2.5.1", "husky": "^9.1.7", "json-schema-to-typescript": "^11.0.5", "neostandard": "^0.12.2", @@ -65,5 +66,8 @@ "relativeDependencies": { "@data-fair/lib-express": "../lib/packages/express", "@data-fair/lib-vue": "../lib/packages/vue" + }, + "optionalDependencies": { + "sass": "1.98.0" } } diff --git a/tests/dev-notification-queue.e2e.spec.ts b/tests/dev-notification-queue.e2e.spec.ts new file mode 100644 index 0000000..f27d2de --- /dev/null +++ b/tests/dev-notification-queue.e2e.spec.ts @@ -0,0 +1,39 @@ +import { expect } from '@playwright/test' +import { test } from './fixtures/login.ts' +import { axiosAuth, clean, devBaseURL, axios } from './support/axios.ts' + +const axPush = axios({ headers: { 'x-secret-key': 'SECRET_EVENTS' }, baseURL: devBaseURL }) + +test.describe('DfNotificationQueue on dev page', () => { + test.beforeEach(clean) + + test('bell button is visible on dev page', async ({ page, goToWithAuth }) => { + await goToWithAuth('/events/dev', 'test-user1') + await expect(page.getByRole('button', { name: 'Open notification list' })).toBeVisible() + }) + + test('shows notification in dropdown after event is sent with subscription', async ({ page, goToWithAuth }) => { + // create a subscription for test-user1 + const user1 = await axiosAuth('test-user1') + await user1.post('/api/subscriptions', { + topic: { key: 'topic1' }, + sender: { type: 'user', id: 'test-user1', name: 'User 1' }, + outputs: ['devices'] + }) + + // send an event matching the subscription + await axPush.post('/api/events', [{ + date: new Date().toISOString(), + topic: { key: 'topic1' }, + title: 'Dev page notification title', + sender: { type: 'user', id: 'test-user1', name: 'User 1' } + }]) + + // wait for notification processing + await new Promise(resolve => setTimeout(resolve, 2000)) + + await goToWithAuth('/events/dev', 'test-user1') + await page.getByRole('button', { name: 'Open notification list' }).click() + await expect(page.getByText('Dev page notification title')).toBeVisible() + }) +}) diff --git a/ui/eslint.config.mjs b/ui/eslint.config.mjs index 04edcab..0093e32 100644 --- a/ui/eslint.config.mjs +++ b/ui/eslint.config.mjs @@ -1,9 +1,8 @@ import neostandard from 'neostandard' import pluginVue from 'eslint-plugin-vue' import dfLibRecommended from '@data-fair/lib-utils/eslint/recommended.js' -// cf https://github.com/vuetifyjs/eslint-plugin-vuetify/pull/98 // @ts-ignore -import vuetify from 'eslint-plugin-vuetify/src/index.js' +import vuetify from 'eslint-plugin-vuetify' export default [ ...dfLibRecommended, diff --git a/ui/package.json b/ui/package.json index 6332c93..f0965d2 100644 --- a/ui/package.json +++ b/ui/package.json @@ -15,14 +15,13 @@ "@data-fair/frame": "^0.17.7", "@data-fair/lib-vue": "^1.26.0", "@data-fair/lib-vuetify": "^2.0.0", + "@data-fair/lib-vuetify-events": "*", "@intlify/unplugin-vue-i18n": "^11.0.7", - "@koumoul/v-iframe": "^2.4.5", "@mdi/js": "^7.4.47", "@types/config": "^3.3.5", "@types/debug": "^4.1.12", "@vitejs/plugin-vue": "^6.0.5", "debug": "^4.4.3", - "iframe-resizer": "^4.4.5", "ofetch": "^1.5.1", "reconnecting-websocket": "^4.4.0", "sass-embedded": "^1.97.3", diff --git a/ui/src/main.ts b/ui/src/main.ts index 32180e7..9e32b91 100644 --- a/ui/src/main.ts +++ b/ui/src/main.ts @@ -11,13 +11,8 @@ import { createSession } from '@data-fair/lib-vue/session.js' import { createUiNotif } from '@data-fair/lib-vue/ui-notif.js' import { createI18n } from 'vue-i18n' import App from './App.vue' -// TODO: remove v-iframe and iframe-resizer when d-frame is fully integrated -import '@koumoul/v-iframe/content-window' -import 'iframe-resizer/js/iframeResizer.contentWindow.js' import dFrameContent from '@data-fair/frame/lib/vue-router/d-frame-content.js' -(window as any).iFrameResizer = { heightCalculationMethod: 'taggedElement' }; - (async function () { const router = createRouter({ history: createWebHistory($sitePath + '/events/'), routes }) dFrameContent(router) @@ -29,9 +24,7 @@ import dFrameContent from '@data-fair/frame/lib/vue-router/d-frame-content.js' ...vuetifySessionOptions(session, $cspNonce), icons: { defaultSet: 'mdi', aliases, sets: { mdi, } } }) - const i18n = createI18n({ locale: session.state.lang }); - - (window as any).vIframeOptions = { router } + const i18n = createI18n({ locale: session.state.lang }) createApp(App) .use(router) diff --git a/ui/src/pages/dev.vue b/ui/src/pages/dev.vue index 0097a33..47390f5 100644 --- a/ui/src/pages/dev.vue +++ b/ui/src/pages/dev.vue @@ -2,6 +2,7 @@
+ @@ -23,6 +24,8 @@