chore: various fixes + updates

vega
NGPixel 1 year ago
parent 83875e5ce3
commit 5fb12c1e34
No known key found for this signature in database
GPG Key ID: B755FB6870B30F63

@ -1,7 +1,7 @@
# Based of https://github.com/microsoft/vscode-dev-containers/blob/main/containers/javascript-node/.devcontainer/base.Dockerfile # Based of https://github.com/microsoft/vscode-dev-containers/blob/main/containers/javascript-node/.devcontainer/base.Dockerfile
# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 16, 14, 12, 16-bullseye, 14-bullseye, 12-bullseye, 16-buster, 14-buster, 12-buster # [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 16, 14, 12, 16-bullseye, 14-bullseye, 12-bullseye, 16-buster, 14-buster, 12-buster
ARG VARIANT=18-bullseye ARG VARIANT=20-bullseye
FROM node:${VARIANT} FROM node:${VARIANT}
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
@ -62,9 +62,9 @@ RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# Add ngrok Source # Add cloudflared Source
RUN curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc > /dev/null && \ RUN curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null && \
echo "deb https://ngrok-agent.s3.amazonaws.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ngrok.list echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
# Add Localazy Source # Add Localazy Source
RUN curl -sS https://dist.localazy.com/debian/pubkey.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/localazy.gpg && \ RUN curl -sS https://dist.localazy.com/debian/pubkey.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/localazy.gpg && \
@ -74,6 +74,7 @@ RUN curl -sS https://dist.localazy.com/debian/pubkey.gpg | sudo gpg --dearmor -o
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && apt-get install -qy \ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && apt-get install -qy \
bash \ bash \
build-essential \ build-essential \
cloudflared \
curl \ curl \
docker-ce-cli \ docker-ce-cli \
jq \ jq \
@ -83,7 +84,6 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && apt-get install -
localazy \ localazy \
nano \ nano \
netcat \ netcat \
ngrok \
pandoc \ pandoc \
unzip \ unzip \
wget wget

@ -10,6 +10,7 @@ jobs:
name: Build name: Build
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: read
packages: write packages: write
steps: steps:
@ -76,10 +77,7 @@ jobs:
with: with:
context: . context: .
file: dev/build/Dockerfile file: dev/build/Dockerfile
provenance: true
push: true push: true
# cache-from: type=gha
# cache-to: type=gha,mode=max
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
tags: | tags: |
ghcr.io/requarks/wiki:3.0.0-alpha ghcr.io/requarks/wiki:3.0.0-alpha

@ -117,8 +117,8 @@ The server **dev** should already be available under **Servers**. If that's not
### Requirements ### Requirements
- PostgreSQL **11** or later *(**16** or later recommended)* - PostgreSQL **12** or later *(**16** or later recommended)*
- Node.js **18.x** or later - Node.js **20.x** or later
- [pnpm](https://pnpm.io/installation#using-corepack) - [pnpm](https://pnpm.io/installation#using-corepack)
### Usage ### Usage

File diff suppressed because it is too large Load Diff

@ -438,11 +438,10 @@ export default function () {
* Metrics (Prometheus) * Metrics (Prometheus)
*/ */
router.get('/metrics', async (req, res, next) => { router.get('/metrics', async (req, res, next) => {
if (!WIKI.auth.checkAccess(req.user, ['read:metrics'])) {
return res.sendStatus(403)
}
if (WIKI.config.metrics.isEnabled) { if (WIKI.config.metrics.isEnabled) {
if (!WIKI.auth.checkAccess(req.user, ['read:metrics'])) {
return res.sendStatus(403)
}
WIKI.metrics.render(res) WIKI.metrics.render(res)
} else { } else {
next() next()

@ -10,6 +10,7 @@ import {
generateAuthenticationOptions, generateAuthenticationOptions,
verifyAuthenticationResponse verifyAuthenticationResponse
} from '@simplewebauthn/server' } from '@simplewebauthn/server'
import { isoBase64URL } from '@simplewebauthn/server/helpers'
export default { export default {
Query: { Query: {
@ -264,7 +265,7 @@ export default {
userVerification: 'preferred' userVerification: 'preferred'
}, },
excludeCredentials: usr.passkeys.authenticators?.map(authenticator => ({ excludeCredentials: usr.passkeys.authenticators?.map(authenticator => ({
id: new Uint8Array(authenticator.credentialID), id: isoBase64URL.fromBuffer(new Uint8Array(authenticator.credentialID)),
type: 'public-key', type: 'public-key',
transports: authenticator.transports transports: authenticator.transports
})) ?? [] })) ?? []

@ -22,8 +22,6 @@ export function parsePath (rawPath, opts = {}) {
// TODO: use site base lang // TODO: use site base lang
locale: 'en', // WIKI.config.lang.code, locale: 'en', // WIKI.config.lang.code,
path: 'home', path: 'home',
private: false,
privateNS: '',
explicitLocale: false explicitLocale: false
} }
@ -40,7 +38,7 @@ export function parsePath (rawPath, opts = {}) {
p = p.trim() p = p.trim()
return !isEmpty(p) && p !== '..' && p !== '.' return !isEmpty(p) && p !== '..' && p !== '.'
}) })
if (pathParts[0].startsWith('_')) { if (pathParts.length > 1 && pathParts[0].startsWith('_')) {
pathParts.shift() pathParts.shift()
} }
if (localeSegmentRegex.test(pathParts[0])) { if (localeSegmentRegex.test(pathParts[0])) {

@ -36,26 +36,26 @@
"node": ">=18.0" "node": ">=18.0"
}, },
"dependencies": { "dependencies": {
"@apollo/server": "4.10.0", "@apollo/server": "4.10.4",
"@azure/storage-blob": "12.17.0", "@azure/storage-blob": "12.17.0",
"@exlinc/keycloak-passport": "1.0.2", "@exlinc/keycloak-passport": "1.0.2",
"@graphql-tools/schema": "10.0.2", "@graphql-tools/schema": "10.0.3",
"@graphql-tools/utils": "10.0.13", "@graphql-tools/utils": "10.1.3",
"@hexagon/base64": "1.1.28", "@hexagon/base64": "1.1.28",
"@joplin/turndown-plugin-gfm": "1.0.54", "@joplin/turndown-plugin-gfm": "1.0.55",
"@node-saml/passport-saml": "4.0.4", "@node-saml/passport-saml": "5.0.0",
"@root/csr": "0.8.1", "@root/csr": "0.8.1",
"@root/keypairs": "0.10.3", "@root/keypairs": "0.10.3",
"@root/pem": "1.0.4", "@root/pem": "1.0.4",
"@simplewebauthn/server": "9.0.1", "@simplewebauthn/server": "10.0.0",
"@vue-email/compiler": "0.8.9", "@vue-email/compiler": "0.8.14",
"acme": "3.0.3", "acme": "3.0.3",
"akismet-api": "6.0.0", "akismet-api": "6.0.0",
"aws-sdk": "2.1550.0", "aws-sdk": "2.1603.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"chalk": "5.3.0", "chalk": "5.3.0",
"cheerio": "1.0.0-rc.12", "cheerio": "1.0.0-rc.12",
"chokidar": "3.5.3", "chokidar": "3.6.0",
"chromium-pickle-js": "0.2.0", "chromium-pickle-js": "0.2.0",
"clean-css": "5.3.3", "clean-css": "5.3.3",
"command-exists": "1.2.9", "command-exists": "1.2.9",
@ -67,40 +67,40 @@
"cuint": "0.2.2", "cuint": "0.2.2",
"custom-error-instance": "2.1.2", "custom-error-instance": "2.1.2",
"dependency-graph": "1.0.0", "dependency-graph": "1.0.0",
"diff": "5.1.0", "diff": "5.2.0",
"diff2html": "3.4.47", "diff2html": "3.4.48",
"dompurify": "3.0.8", "dompurify": "3.1.0",
"dotize": "0.3.0", "dotize": "0.3.0",
"emoji-regex": "10.3.0", "emoji-regex": "10.3.0",
"eventemitter2": "6.4.9", "eventemitter2": "6.4.9",
"express": "4.18.2", "express": "4.19.2",
"express-brute": "1.0.1", "express-brute": "1.0.1",
"express-session": "1.18.0", "express-session": "1.18.0",
"file-type": "19.0.0", "file-type": "19.0.0",
"filesize": "10.1.0", "filesize": "10.1.1",
"fs-extra": "11.2.0", "fs-extra": "11.2.0",
"getos": "3.2.1", "getos": "3.2.1",
"graphql": "16.8.1", "graphql": "16.8.1",
"graphql-list-fields": "2.0.3", "graphql-list-fields": "2.0.4",
"graphql-rate-limit-directive": "2.0.5", "graphql-rate-limit-directive": "2.0.5",
"graphql-tools": "9.0.0", "graphql-tools": "9.0.1",
"graphql-upload": "16.0.2", "graphql-upload": "16.0.2",
"gray-matter": "4.0.3", "gray-matter": "4.0.3",
"he": "1.2.0", "he": "1.2.0",
"highlight.js": "11.9.0", "highlight.js": "11.9.0",
"image-size": "1.1.1", "image-size": "1.1.1",
"js-base64": "3.7.6", "js-base64": "3.7.7",
"js-binary": "1.2.0", "js-binary": "1.2.0",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"jsdom": "24.0.0", "jsdom": "24.0.0",
"jsonwebtoken": "9.0.2", "jsonwebtoken": "9.0.2",
"katex": "0.16.9", "katex": "0.16.10",
"klaw": "4.1.0", "klaw": "4.1.0",
"knex": "3.1.0", "knex": "3.1.0",
"lodash": "4.17.21", "lodash": "4.17.21",
"lodash-es": "4.17.21", "lodash-es": "4.17.21",
"luxon": "3.4.4", "luxon": "3.4.4",
"markdown-it": "14.0.0", "markdown-it": "14.1.0",
"markdown-it-abbr": "2.0.0", "markdown-it-abbr": "2.0.0",
"markdown-it-attrs": "4.1.6", "markdown-it-attrs": "4.1.6",
"markdown-it-decorate": "1.2.2", "markdown-it-decorate": "1.2.2",
@ -109,7 +109,7 @@
"markdown-it-footnote": "4.0.0", "markdown-it-footnote": "4.0.0",
"markdown-it-imsize": "2.0.1", "markdown-it-imsize": "2.0.1",
"markdown-it-mark": "4.0.0", "markdown-it-mark": "4.0.0",
"markdown-it-mdc": "0.2.1", "markdown-it-mdc": "0.2.3",
"markdown-it-multimd-table": "4.2.3", "markdown-it-multimd-table": "4.2.3",
"markdown-it-sub": "2.0.0", "markdown-it-sub": "2.0.0",
"markdown-it-sup": "2.0.0", "markdown-it-sup": "2.0.0",
@ -118,12 +118,12 @@
"mime-types": "2.1.35", "mime-types": "2.1.35",
"ms": "2.1.3", "ms": "2.1.3",
"multer": "1.4.5-lts.1", "multer": "1.4.5-lts.1",
"nanoid": "5.0.5", "nanoid": "5.0.7",
"node-2fa": "2.0.3", "node-2fa": "2.0.3",
"node-cache": "5.1.2", "node-cache": "5.1.2",
"nodemailer": "6.9.9", "nodemailer": "6.9.13",
"objection": "3.1.3", "objection": "3.1.4",
"octokit": "3.1.2", "octokit": "3.2.0",
"passport": "0.7.0", "passport": "0.7.0",
"passport-auth0": "1.4.4", "passport-auth0": "1.4.4",
"passport-azure-ad": "4.3.5", "passport-azure-ad": "4.3.5",
@ -137,42 +137,42 @@
"passport-jwt": "4.0.1", "passport-jwt": "4.0.1",
"passport-ldapauth": "3.0.1", "passport-ldapauth": "3.0.1",
"passport-local": "1.0.0", "passport-local": "1.0.0",
"passport-microsoft": "1.0.0", "passport-microsoft": "2.0.0",
"passport-oauth2": "1.8.0", "passport-oauth2": "1.8.0",
"passport-okta-oauth": "0.0.1", "passport-okta-oauth": "0.0.1",
"passport-openidconnect": "0.1.1", "passport-openidconnect": "0.1.2",
"passport-slack-oauth2": "1.2.0", "passport-slack-oauth2": "1.2.0",
"passport-twitch-strategy": "2.2.0", "passport-twitch-strategy": "2.2.0",
"pem-jwk": "2.0.0", "pem-jwk": "2.0.0",
"pg": "8.11.3", "pg": "8.11.5",
"pg-hstore": "2.3.4", "pg-hstore": "2.3.4",
"pg-pubsub": "0.8.1", "pg-pubsub": "0.8.1",
"pg-query-stream": "4.5.3", "pg-query-stream": "4.5.5",
"pg-tsquery": "8.4.2", "pg-tsquery": "8.4.2",
"poolifier": "3.1.19", "poolifier": "3.1.29",
"prom-client": "15.1.0", "prom-client": "15.1.2",
"punycode": "2.3.1", "punycode": "2.3.1",
"puppeteer-core": "21.11.0", "puppeteer-core": "22.6.5",
"qr-image": "3.2.0", "qr-image": "3.2.0",
"remove-markdown": "0.5.0", "remove-markdown": "0.5.0",
"safe-regex": "2.1.1", "safe-regex": "2.1.1",
"sanitize-filename": "1.6.3", "sanitize-filename": "1.6.3",
"scim-query-filter-parser": "2.0.4", "scim-query-filter-parser": "2.0.4",
"semver": "7.5.4", "semver": "7.6.0",
"serve-favicon": "2.5.0", "serve-favicon": "2.5.0",
"sharp": "0.33.2", "sharp": "0.33.3",
"simple-git": "3.22.0", "simple-git": "3.24.0",
"socket.io": "4.7.4", "socket.io": "4.7.5",
"striptags": "3.2.0", "striptags": "3.2.0",
"tar-fs": "3.0.4", "tar-fs": "3.0.5",
"turndown": "7.1.2", "turndown": "7.1.3",
"twemoji": "14.0.2", "twemoji": "14.0.2",
"ufo": "1.3.2", "ufo": "1.5.3",
"uslug": "1.0.4", "uslug": "1.0.4",
"uuid": "9.0.1", "uuid": "9.0.1",
"validate.js": "0.13.1", "validate.js": "0.13.1",
"vue": "3.4.15", "vue": "3.4.23",
"xss": "1.0.14", "xss": "1.0.15",
"yargs": "17.7.2" "yargs": "17.7.2"
}, },
"devDependencies": { "devDependencies": {
@ -182,10 +182,10 @@
"eslint-plugin-import": "2.29.1", "eslint-plugin-import": "2.29.1",
"eslint-plugin-node": "11.1.0", "eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1", "eslint-plugin-promise": "6.1.1",
"nodemon": "3.0.3" "nodemon": "3.1.0"
}, },
"overrides": { "overrides": {
"@graphql-tools/utils": "10.0.1" "@graphql-tools/utils": "10.1.3"
}, },
"collective": { "collective": {
"type": "opencollective", "type": "opencollective",

File diff suppressed because it is too large Load Diff

@ -11,37 +11,38 @@
"build": "NODE_OPTIONS=--max-old-space-size=8192 vite build --emptyOutDir" "build": "NODE_OPTIONS=--max-old-space-size=8192 vite build --emptyOutDir"
}, },
"dependencies": { "dependencies": {
"@apollo/client": "3.9.9", "@apollo/client": "3.9.11",
"@lezer/common": "1.2.1", "@lezer/common": "1.2.1",
"@mdi/font": "7.4.47", "@mdi/font": "7.4.47",
"@quasar/extras": "1.16.11", "@quasar/extras": "1.16.11",
"@simplewebauthn/browser": "9.0.1", "@simplewebauthn/browser": "10.0.0",
"@tiptap/core": "2.2.4", "@tiptap/core": "2.3.0",
"@tiptap/extension-code-block": "2.2.4", "@tiptap/extension-code-block": "2.3.0",
"@tiptap/extension-code-block-lowlight": "2.2.4", "@tiptap/extension-code-block-lowlight": "2.3.0",
"@tiptap/extension-color": "2.2.4", "@tiptap/extension-color": "2.3.0",
"@tiptap/extension-dropcursor": "2.2.4", "@tiptap/extension-dropcursor": "2.3.0",
"@tiptap/extension-font-family": "2.2.4", "@tiptap/extension-font-family": "2.3.0",
"@tiptap/extension-gapcursor": "2.2.4", "@tiptap/extension-gapcursor": "2.3.0",
"@tiptap/extension-hard-break": "2.2.4", "@tiptap/extension-hard-break": "2.3.0",
"@tiptap/extension-highlight": "2.2.4", "@tiptap/extension-highlight": "2.3.0",
"@tiptap/extension-history": "2.2.4", "@tiptap/extension-history": "2.3.0",
"@tiptap/extension-image": "2.2.4", "@tiptap/extension-image": "2.3.0",
"@tiptap/extension-mention": "2.2.4", "@tiptap/extension-mention": "2.3.0",
"@tiptap/extension-placeholder": "2.2.4", "@tiptap/extension-placeholder": "2.3.0",
"@tiptap/extension-table": "2.2.4", "@tiptap/extension-table": "2.3.0",
"@tiptap/extension-table-cell": "2.2.4", "@tiptap/extension-table-cell": "2.3.0",
"@tiptap/extension-table-header": "2.2.4", "@tiptap/extension-table-header": "2.3.0",
"@tiptap/extension-table-row": "2.2.4", "@tiptap/extension-table-row": "2.3.0",
"@tiptap/extension-task-item": "2.2.4", "@tiptap/extension-task-item": "2.3.0",
"@tiptap/extension-task-list": "2.2.4", "@tiptap/extension-task-list": "2.3.0",
"@tiptap/extension-text-align": "2.2.4", "@tiptap/extension-text-align": "2.3.0",
"@tiptap/extension-text-style": "2.2.4", "@tiptap/extension-text-style": "2.3.0",
"@tiptap/extension-typography": "2.2.4", "@tiptap/extension-typography": "2.3.0",
"@tiptap/pm": "2.2.4", "@tiptap/pm": "2.3.0",
"@tiptap/starter-kit": "2.2.4", "@tiptap/starter-kit": "2.3.0",
"@tiptap/vue-3": "2.2.4", "@tiptap/vue-3": "2.3.0",
"@vue/repl": "3.4.0", "@vue/repl": "3.4.0",
"@xterm/xterm": "5.5.0",
"apollo-upload-client": "18.0.1", "apollo-upload-client": "18.0.1",
"browser-fs-access": "0.35.0", "browser-fs-access": "0.35.0",
"clipboard": "2.0.11", "clipboard": "2.0.11",
@ -81,13 +82,13 @@
"prosemirror-commands": "1.5.2", "prosemirror-commands": "1.5.2",
"prosemirror-history": "1.4.0", "prosemirror-history": "1.4.0",
"prosemirror-keymap": "1.2.2", "prosemirror-keymap": "1.2.2",
"prosemirror-model": "1.19.4", "prosemirror-model": "1.20.0",
"prosemirror-schema-list": "1.3.0", "prosemirror-schema-list": "1.3.0",
"prosemirror-state": "1.4.3", "prosemirror-state": "1.4.3",
"prosemirror-transform": "1.8.0", "prosemirror-transform": "1.8.0",
"prosemirror-view": "1.33.3", "prosemirror-view": "1.33.4",
"pug": "3.0.2", "pug": "3.0.2",
"quasar": "2.15.2", "quasar": "2.15.3",
"slugify": "1.6.6", "slugify": "1.6.6",
"socket.io-client": "4.7.5", "socket.io-client": "4.7.5",
"sortablejs": "1.15.2", "sortablejs": "1.15.2",
@ -95,15 +96,14 @@
"tabulator-tables": "6.2.0", "tabulator-tables": "6.2.0",
"tippy.js": "6.3.7", "tippy.js": "6.3.7",
"twemoji": "14.0.2", "twemoji": "14.0.2",
"typescript": "5.4.3", "typescript": "5.4.5",
"uuid": "9.0.1", "uuid": "9.0.1",
"v-network-graph": "0.9.15", "v-network-graph": "0.9.15",
"vue": "3.4.21", "vue": "3.4.23",
"vue-i18n": "9.10.2", "vue-i18n": "9.13.1",
"vue-router": "4.3.0", "vue-router": "4.3.2",
"vue3-otp-input": "0.4.4", "vue3-otp-input": "0.4.4",
"vuedraggable": "4.1.0", "vuedraggable": "4.1.0",
"xterm": "5.3.0",
"zxcvbn": "4.4.2" "zxcvbn": "4.4.2"
}, },
"devDependencies": { "devDependencies": {
@ -112,8 +112,8 @@
"@quasar/app-vite": "2.0.0-beta.5", "@quasar/app-vite": "2.0.0-beta.5",
"@quasar/vite-plugin": "1.6.0", "@quasar/vite-plugin": "1.6.0",
"@types/lodash": "4.17.0", "@types/lodash": "4.17.0",
"@vue/devtools": "7.0.25", "@vue/devtools": "7.0.27",
"@vue/language-plugin-pug": "2.0.7", "@vue/language-plugin-pug": "2.0.13",
"autoprefixer": "10.4.19", "autoprefixer": "10.4.19",
"browserlist": "latest", "browserlist": "latest",
"eslint": "8.57.0", "eslint": "8.57.0",
@ -121,9 +121,9 @@
"eslint-plugin-import": "2.29.1", "eslint-plugin-import": "2.29.1",
"eslint-plugin-n": "16.6.2", "eslint-plugin-n": "16.6.2",
"eslint-plugin-promise": "6.1.1", "eslint-plugin-promise": "6.1.1",
"eslint-plugin-vue": "9.24.0", "eslint-plugin-vue": "9.25.0",
"eslint-plugin-vue-pug": "0.6.2", "eslint-plugin-vue-pug": "0.6.2",
"sass": "1.72.0" "sass": "1.75.0"
}, },
"engines": { "engines": {
"node": ">= 18.0", "node": ">= 18.0",

File diff suppressed because it is too large Load Diff

@ -45,14 +45,15 @@ q-page.admin-mail
q-item-section(side) q-item-section(side)
q-icon(:name='`img:` + str.strategy.icon') q-icon(:name='`img:` + str.strategy.icon')
q-item-section q-item-section
q-item-label {{str.displayName}} q-item-label {{ str.displayName }}
q-item-label(caption) {{str.strategy.title}} q-item-label(caption) {{ str.strategy.title }}
q-item-section(side) q-item-section(side)
status-light(:color='str.isEnabled ? `positive` : `negative`', :pulse='str.isEnabled') status-light(:color='str.isEnabled ? `positive` : `negative`', :pulse='str.isEnabled')
q-btn.q-mt-sm.full-width( q-btn.q-mt-sm.full-width(
color='primary' color='primary'
icon='las la-plus' icon='las la-plus'
:label='t(`admin.auth.addStrategy`)' :label='t(`admin.auth.addStrategy`)'
v-if='flagsStore.experimental'
) )
q-menu(auto-close, fit, max-width='300px') q-menu(auto-close, fit, max-width='300px')
q-list(separator) q-list(separator)
@ -72,17 +73,17 @@ q-page.admin-mail
:name='`img:` + str.icon' :name='`img:` + str.icon'
) )
q-item-section q-item-section
q-item-label: strong {{str.title}} q-item-label: strong {{ str.title }}
q-item-label(caption, lines='2') {{str.description}} q-item-label(caption, lines='2') {{str.description}}
.col .col
q-card.q-pb-sm q-card.q-pb-sm
q-card-section q-card-section
.text-subtitle1 {{t('admin.auth.info')}} .text-subtitle1 {{ t('admin.auth.info') }}
q-item q-item
blueprint-icon(icon='information') blueprint-icon(icon='information')
q-item-section q-item-section
q-item-label {{t(`admin.auth.infoName`)}} q-item-label {{ t(`admin.auth.infoName`) }}
q-item-label(caption) {{t(`admin.auth.infoNameHint`)}} q-item-label(caption) {{ t(`admin.auth.infoNameHint`) }}
q-item-section q-item-section
q-input( q-input(
outlined outlined
@ -95,9 +96,9 @@ q-page.admin-mail
q-item(tag='label') q-item(tag='label')
blueprint-icon(icon='shutdown') blueprint-icon(icon='shutdown')
q-item-section q-item-section
q-item-label {{t(`admin.auth.enabled`)}} q-item-label {{ t(`admin.auth.enabled`) }}
q-item-label(caption) {{t(`admin.auth.enabledHint`)}} q-item-label(caption) {{ t(`admin.auth.enabledHint`) }}
q-item-label.text-deep-orange(v-if='state.strategy.strategy.key === `local`', caption) {{t(`admin.auth.enabledForced`)}} q-item-label.text-deep-orange(v-if='state.strategy.strategy.key === `local`', caption) {{ t(`admin.auth.enabledForced`) }}
q-item-section(avatar) q-item-section(avatar)
q-toggle( q-toggle(
v-model='state.strategy.isEnabled' v-model='state.strategy.isEnabled'
@ -111,8 +112,8 @@ q-page.admin-mail
q-item(tag='label') q-item(tag='label')
blueprint-icon(icon='register') blueprint-icon(icon='register')
q-item-section q-item-section
q-item-label {{t(`admin.auth.registration`)}} q-item-label {{ t(`admin.auth.registration`) }}
q-item-label(caption) {{state.strategy.strategy.key === `local` ? t(`admin.auth.registrationLocalHint`) : t(`admin.auth.registrationHint`)}} q-item-label(caption) {{ state.strategy.strategy.key === `local` ? t(`admin.auth.registrationLocalHint`) : t(`admin.auth.registrationHint`) }}
q-item-section(avatar) q-item-section(avatar)
q-toggle( q-toggle(
v-model='state.strategy.registration' v-model='state.strategy.registration'
@ -126,8 +127,8 @@ q-page.admin-mail
q-item q-item
blueprint-icon(icon='team') blueprint-icon(icon='team')
q-item-section q-item-section
q-item-label {{t(`admin.auth.autoEnrollGroups`)}} q-item-label {{ t(`admin.auth.autoEnrollGroups`) }}
q-item-label(caption) {{t(`admin.auth.autoEnrollGroupsHint`)}} q-item-label(caption) {{ t(`admin.auth.autoEnrollGroupsHint`) }}
q-item-section q-item-section
q-select( q-select(
outlined outlined
@ -144,7 +145,7 @@ q-page.admin-mail
:aria-label='t(`admin.users.groups`)' :aria-label='t(`admin.users.groups`)'
:loading='state.loadingGroups' :loading='state.loadingGroups'
) )
template(v-slot:selected) template(#selected)
.text-caption(v-if='state.strategy.autoEnrollGroups?.length > 1') .text-caption(v-if='state.strategy.autoEnrollGroups?.length > 1')
i18n-t(keypath='admin.users.groupsSelected') i18n-t(keypath='admin.users.groupsSelected')
template(#count) template(#count)
@ -154,7 +155,7 @@ q-page.admin-mail
template(#group) template(#group)
strong {{ selectedGroupName }} strong {{ selectedGroupName }}
span(v-else) span(v-else)
template(v-slot:option='{ itemProps, opt, selected, toggleOption }') template(#option='{ itemProps, opt, selected, toggleOption }')
q-item( q-item(
v-bind='itemProps' v-bind='itemProps'
) )
@ -171,8 +172,8 @@ q-page.admin-mail
q-item q-item
blueprint-icon(icon='private') blueprint-icon(icon='private')
q-item-section q-item-section
q-item-label {{t(`admin.auth.allowedEmailRegex`)}} q-item-label {{ t(`admin.auth.allowedEmailRegex`) }}
q-item-label(caption) {{t(`admin.auth.allowedEmailRegexHint`)}} q-item-label(caption) {{ t(`admin.auth.allowedEmailRegexHint`) }}
q-item-section q-item-section
q-input( q-input(
outlined outlined
@ -189,12 +190,12 @@ q-page.admin-mail
//- ----------------------- //- -----------------------
q-card.q-pb-sm.q-mt-md q-card.q-pb-sm.q-mt-md
q-card-section q-card-section
.text-subtitle1 {{t('admin.auth.strategyConfiguration')}} .text-subtitle1 {{ t('admin.auth.strategyConfiguration') }}
q-banner.q-mt-md( q-banner.q-mt-md(
v-if='!state.strategy.config || Object.keys(state.strategy.config).length < 1' v-if='!state.strategy.config || Object.keys(state.strategy.config).length < 1'
rounded rounded
:class='$q.dark.isActive ? `bg-dark-4 text-grey-5` : `bg-grey-2 text-grey-7`' :class='$q.dark.isActive ? `bg-dark-4 text-grey-5` : `bg-grey-2 text-grey-7`'
): em {{t('admin.auth.noConfigOption')}} ): em {{ t('admin.auth.noConfigOption') }}
template( template(
v-for='(cfg, cfgKey, idx) in state.strategy.config' v-for='(cfg, cfgKey, idx) in state.strategy.config'
) )
@ -205,8 +206,8 @@ q-page.admin-mail
q-item(v-if='cfg.type === `boolean`', tag='label') q-item(v-if='cfg.type === `boolean`', tag='label')
blueprint-icon(:icon='cfg.icon', :hue-rotate='cfg.readOnly ? -45 : 0') blueprint-icon(:icon='cfg.icon', :hue-rotate='cfg.readOnly ? -45 : 0')
q-item-section q-item-section
q-item-label {{cfg.title}} q-item-label {{ cfg.title }}
q-item-label(caption) {{cfg.hint}} q-item-label(caption) {{ cfg.hint }}
q-item-section(avatar) q-item-section(avatar)
q-toggle( q-toggle(
v-model='cfg.value' v-model='cfg.value'
@ -219,8 +220,8 @@ q-page.admin-mail
q-item(v-else) q-item(v-else)
blueprint-icon(:icon='cfg.icon', :hue-rotate='cfg.readOnly ? -45 : 0') blueprint-icon(:icon='cfg.icon', :hue-rotate='cfg.readOnly ? -45 : 0')
q-item-section q-item-section
q-item-label {{cfg.title}} q-item-label {{ cfg.title }}
q-item-label(caption) {{cfg.hint}} q-item-label(caption) {{ cfg.hint }}
q-item-section( q-item-section(
:style='cfg.type === `number` ? `flex: 0 0 150px;` : ``' :style='cfg.type === `number` ? `flex: 0 0 150px;` : ``'
:class='{ "col-auto": cfg.enum && cfg.enumDisplay === `buttons` }' :class='{ "col-auto": cfg.enum && cfg.enumDisplay === `buttons` }'
@ -262,12 +263,12 @@ q-page.admin-mail
//- ----------------------- //- -----------------------
q-card.q-pb-sm.q-mt-md(v-if='strategyRefs.length > 0') q-card.q-pb-sm.q-mt-md(v-if='strategyRefs.length > 0')
q-card-section q-card-section
.text-subtitle1 {{t('admin.auth.configReference')}} .text-subtitle1 {{ t('admin.auth.configReference') }}
q-item(v-for='strRef of strategyRefs', :key='strRef.key') q-item(v-for='strRef of strategyRefs', :key='strRef.key')
blueprint-icon(:icon='strRef.icon', :hue-rotate='-45') blueprint-icon(:icon='strRef.icon', :hue-rotate='-45')
q-item-section q-item-section
q-item-label {{strRef.title}} q-item-label {{ strRef.title }}
q-item-label(caption) {{strRef.hint}} q-item-label(caption) {{ strRef.hint }}
q-item-section q-item-section
q-input( q-input(
outlined outlined
@ -287,9 +288,9 @@ q-page.admin-mail
no-spinner no-spinner
style='height: 100px; max-width: 300px;' style='height: 100px; max-width: 300px;'
) )
.text-subtitle2.q-mt-sm {{state.strategy.strategy.title}} .text-subtitle2.q-mt-sm {{ state.strategy.strategy.title }}
.text-caption.q-mt-sm {{state.strategy.strategy.description}} .text-caption.q-mt-sm {{ state.strategy.strategy.description }}
.text-caption.q-mt-sm: strong {{state.strategy.strategy.vendor}} .text-caption.q-mt-sm: strong {{ state.strategy.strategy.vendor }}
.text-caption: a(:href='state.strategy.strategy.website', target='_blank', rel='noreferrer') {{state.strategy.strategy.website}} .text-caption: a(:href='state.strategy.strategy.website', target='_blank', rel='noreferrer') {{state.strategy.strategy.website}}
.flex.q-mt-md .flex.q-mt-md
@ -315,6 +316,7 @@ import { useMeta, useQuasar } from 'quasar'
import { computed, onMounted, reactive, watch, nextTick } from 'vue' import { computed, onMounted, reactive, watch, nextTick } from 'vue'
import { useAdminStore } from '@/stores/admin' import { useAdminStore } from '@/stores/admin'
import { useFlagsStore } from '@/stores/flags'
import { useSiteStore } from '@/stores/site' import { useSiteStore } from '@/stores/site'
// QUASAR // QUASAR
@ -324,6 +326,7 @@ const $q = useQuasar()
// STORES // STORES
const adminStore = useAdminStore() const adminStore = useAdminStore()
const flagsStore = useFlagsStore()
const siteStore = useSiteStore() const siteStore = useSiteStore()
// I18N // I18N

@ -50,8 +50,8 @@ q-page.admin-flags
q-item(v-for='block of state.blocks', :key='block.id') q-item(v-for='block of state.blocks', :key='block.id')
blueprint-icon(:icon='block.isCustom ? `plugin` : block.icon') blueprint-icon(:icon='block.isCustom ? `plugin` : block.icon')
q-item-section q-item-section
q-item-label: strong {{block.name}} q-item-label: strong {{ block.name }}
q-item-label(caption) {{ block.description}} q-item-label(caption) {{ block.description }}
q-item-label.flex.items-center(caption) q-item-label.flex.items-center(caption)
q-chip.q-ma-none(square, dense, :color='$q.dark.isActive ? `pink-8` : `pink-1`', :text-color='$q.dark.isActive ? `white` : `pink-9`'): span.text-caption &lt;block-{{ block.block }}&gt; q-chip.q-ma-none(square, dense, :color='$q.dark.isActive ? `pink-8` : `pink-1`', :text-color='$q.dark.isActive ? `white` : `pink-9`'): span.text-caption &lt;block-{{ block.block }}&gt;
q-separator.q-mx-sm.q-my-xs(vertical) q-separator.q-mx-sm.q-my-xs(vertical)
@ -79,6 +79,7 @@ q-page.admin-flags
unchecked-icon='las la-times' unchecked-icon='las la-times'
:label='t(`admin.blocks.isEnabled`)' :label='t(`admin.blocks.isEnabled`)'
:aria-label='t(`admin.blocks.isEnabled`)' :aria-label='t(`admin.blocks.isEnabled`)'
disable
) )
</template> </template>

@ -85,30 +85,30 @@ q-page.admin-dashboard
:disable='!userStore.can(`manage:users`)' :disable='!userStore.can(`manage:users`)'
to='/_admin/users' to='/_admin/users'
) )
.col-12.col-sm-6.col-lg-3 //- .col-12.col-sm-6.col-lg-3
q-card //- q-card
q-card-section.admin-dashboard-card //- q-card-section.admin-dashboard-card
img(src='/_assets/icons/fluent-tag.svg') //- img(src='/_assets/icons/fluent-tag.svg')
div //- div
strong {{ t('admin.tags.title') }} //- strong {{ t('admin.tags.title') }}
span {{adminStore.info.tagsTotal}} //- span {{adminStore.info.tagsTotal}}
q-separator //- q-separator
q-card-actions(align='right') //- q-card-actions(align='right')
q-btn( //- q-btn(
flat //- flat
color='primary' //- color='primary'
icon='las la-tags' //- icon='las la-tags'
:label='t(`common.actions.manage`)' //- :label='t(`common.actions.manage`)'
:disable='!userStore.can(`manage:sites`)' //- :disable='!userStore.can(`manage:sites`)'
:to='`/_admin/` + adminStore.currentSiteId + `/tags`' //- :to='`/_admin/` + adminStore.currentSiteId + `/tags`'
) //- )
.col-12.col-sm-6.col-lg-3 .col-12.col-sm-6.col-lg-3
q-card q-card
q-card-section.admin-dashboard-card q-card-section.admin-dashboard-card
img(src='/_assets/icons/fluent-female-working-with-a-laptop.svg') img(src='/_assets/icons/fluent-female-working-with-a-laptop.svg')
div div
strong Logins strong Logins
small {{adminStore.info.loginsPastDay}} #[i / past 24h] small {{ adminStore.info.loginsPastDay }} #[i / past 24h]
q-separator q-separator
q-card-actions(align='right') q-card-actions(align='right')
q-btn( q-btn(
@ -116,12 +116,12 @@ q-page.admin-dashboard
color='primary' color='primary'
icon='las la-chart-area' icon='las la-chart-area'
:label='t(`admin.analytics.title`)' :label='t(`admin.analytics.title`)'
:disable='!userStore.can(`manage:sites`)' :disable='!userStore.can(`manage:sites`) || flagsStore.experimental'
:to='`/_admin/` + adminStore.currentSiteId + `/analytics`' :to='`/_admin/` + adminStore.currentSiteId + `/analytics`'
) )
.col-12.col-lg-9 //- .col-12.col-lg-9
q-card //- q-card
q-card-section --- //- q-card-section ---
.col-12 .col-12
q-banner.bg-positive.text-white( q-banner.bg-positive.text-white(
@ -152,6 +152,7 @@ import { useI18n } from 'vue-i18n'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { useAdminStore } from '../stores/admin' import { useAdminStore } from '../stores/admin'
import { useFlagsStore } from '@/stores/flags'
import { useUserStore } from '@/stores/user' import { useUserStore } from '@/stores/user'
// COMPONENTS // COMPONENTS
@ -168,6 +169,7 @@ const $q = useQuasar()
// STORES // STORES
const adminStore = useAdminStore() const adminStore = useAdminStore()
const flagsStore = useFlagsStore()
const userStore = useUserStore() const userStore = useUserStore()
// ROUTER // ROUTER

@ -55,8 +55,8 @@ import { onBeforeUnmount, onMounted, reactive, ref } from 'vue'
import { useMeta, useQuasar } from 'quasar' import { useMeta, useQuasar } from 'quasar'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { io } from 'socket.io-client' import { io } from 'socket.io-client'
import { Terminal } from 'xterm' import { Terminal } from '@xterm/xterm'
import 'xterm/css/xterm.css' import '@xterm/xterm/css/xterm.css'
import { useSiteStore } from '@/stores/site' import { useSiteStore } from '@/stores/site'

Loading…
Cancel
Save