chore: various fixes + updates

vega
NGPixel 1 month 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
# [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}
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 \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# Add ngrok Source
RUN curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc > /dev/null && \
echo "deb https://ngrok-agent.s3.amazonaws.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ngrok.list
# Add cloudflared Source
RUN curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null && \
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
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 \
bash \
build-essential \
cloudflared \
curl \
docker-ce-cli \
jq \
@ -83,7 +84,6 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && apt-get install -
localazy \
nano \
netcat \
ngrok \
pandoc \
unzip \
wget

@ -10,6 +10,7 @@ jobs:
name: Build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
@ -76,10 +77,7 @@ jobs:
with:
context: .
file: dev/build/Dockerfile
provenance: true
push: true
# cache-from: type=gha
# cache-to: type=gha,mode=max
platforms: linux/amd64,linux/arm64
tags: |
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
- PostgreSQL **11** or later *(**16** or later recommended)*
- Node.js **18.x** or later
- PostgreSQL **12** or later *(**16** or later recommended)*
- Node.js **20.x** or later
- [pnpm](https://pnpm.io/installation#using-corepack)
### Usage

File diff suppressed because it is too large Load Diff

@ -438,11 +438,10 @@ export default function () {
* Metrics (Prometheus)
*/
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.auth.checkAccess(req.user, ['read:metrics'])) {
return res.sendStatus(403)
}
WIKI.metrics.render(res)
} else {
next()

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

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

@ -36,26 +36,26 @@
"node": ">=18.0"
},
"dependencies": {
"@apollo/server": "4.10.0",
"@apollo/server": "4.10.4",
"@azure/storage-blob": "12.17.0",
"@exlinc/keycloak-passport": "1.0.2",
"@graphql-tools/schema": "10.0.2",
"@graphql-tools/utils": "10.0.13",
"@graphql-tools/schema": "10.0.3",
"@graphql-tools/utils": "10.1.3",
"@hexagon/base64": "1.1.28",
"@joplin/turndown-plugin-gfm": "1.0.54",
"@node-saml/passport-saml": "4.0.4",
"@joplin/turndown-plugin-gfm": "1.0.55",
"@node-saml/passport-saml": "5.0.0",
"@root/csr": "0.8.1",
"@root/keypairs": "0.10.3",
"@root/pem": "1.0.4",
"@simplewebauthn/server": "9.0.1",
"@vue-email/compiler": "0.8.9",
"@simplewebauthn/server": "10.0.0",
"@vue-email/compiler": "0.8.14",
"acme": "3.0.3",
"akismet-api": "6.0.0",
"aws-sdk": "2.1550.0",
"aws-sdk": "2.1603.0",
"bcryptjs": "2.4.3",
"chalk": "5.3.0",
"cheerio": "1.0.0-rc.12",
"chokidar": "3.5.3",
"chokidar": "3.6.0",
"chromium-pickle-js": "0.2.0",
"clean-css": "5.3.3",
"command-exists": "1.2.9",
@ -67,40 +67,40 @@
"cuint": "0.2.2",
"custom-error-instance": "2.1.2",
"dependency-graph": "1.0.0",
"diff": "5.1.0",
"diff2html": "3.4.47",
"dompurify": "3.0.8",
"diff": "5.2.0",
"diff2html": "3.4.48",
"dompurify": "3.1.0",
"dotize": "0.3.0",
"emoji-regex": "10.3.0",
"eventemitter2": "6.4.9",
"express": "4.18.2",
"express": "4.19.2",
"express-brute": "1.0.1",
"express-session": "1.18.0",
"file-type": "19.0.0",
"filesize": "10.1.0",
"filesize": "10.1.1",
"fs-extra": "11.2.0",
"getos": "3.2.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-tools": "9.0.0",
"graphql-tools": "9.0.1",
"graphql-upload": "16.0.2",
"gray-matter": "4.0.3",
"he": "1.2.0",
"highlight.js": "11.9.0",
"image-size": "1.1.1",
"js-base64": "3.7.6",
"js-base64": "3.7.7",
"js-binary": "1.2.0",
"js-yaml": "4.1.0",
"jsdom": "24.0.0",
"jsonwebtoken": "9.0.2",
"katex": "0.16.9",
"katex": "0.16.10",
"klaw": "4.1.0",
"knex": "3.1.0",
"lodash": "4.17.21",
"lodash-es": "4.17.21",
"luxon": "3.4.4",
"markdown-it": "14.0.0",
"markdown-it": "14.1.0",
"markdown-it-abbr": "2.0.0",
"markdown-it-attrs": "4.1.6",
"markdown-it-decorate": "1.2.2",
@ -109,7 +109,7 @@
"markdown-it-footnote": "4.0.0",
"markdown-it-imsize": "2.0.1",
"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-sub": "2.0.0",
"markdown-it-sup": "2.0.0",
@ -118,12 +118,12 @@
"mime-types": "2.1.35",
"ms": "2.1.3",
"multer": "1.4.5-lts.1",
"nanoid": "5.0.5",
"nanoid": "5.0.7",
"node-2fa": "2.0.3",
"node-cache": "5.1.2",
"nodemailer": "6.9.9",
"objection": "3.1.3",
"octokit": "3.1.2",
"nodemailer": "6.9.13",
"objection": "3.1.4",
"octokit": "3.2.0",
"passport": "0.7.0",
"passport-auth0": "1.4.4",
"passport-azure-ad": "4.3.5",
@ -137,42 +137,42 @@
"passport-jwt": "4.0.1",
"passport-ldapauth": "3.0.1",
"passport-local": "1.0.0",
"passport-microsoft": "1.0.0",
"passport-microsoft": "2.0.0",
"passport-oauth2": "1.8.0",
"passport-okta-oauth": "0.0.1",
"passport-openidconnect": "0.1.1",
"passport-openidconnect": "0.1.2",
"passport-slack-oauth2": "1.2.0",
"passport-twitch-strategy": "2.2.0",
"pem-jwk": "2.0.0",
"pg": "8.11.3",
"pg": "8.11.5",
"pg-hstore": "2.3.4",
"pg-pubsub": "0.8.1",
"pg-query-stream": "4.5.3",
"pg-query-stream": "4.5.5",
"pg-tsquery": "8.4.2",
"poolifier": "3.1.19",
"prom-client": "15.1.0",
"poolifier": "3.1.29",
"prom-client": "15.1.2",
"punycode": "2.3.1",
"puppeteer-core": "21.11.0",
"puppeteer-core": "22.6.5",
"qr-image": "3.2.0",
"remove-markdown": "0.5.0",
"safe-regex": "2.1.1",
"sanitize-filename": "1.6.3",
"scim-query-filter-parser": "2.0.4",
"semver": "7.5.4",
"semver": "7.6.0",
"serve-favicon": "2.5.0",
"sharp": "0.33.2",
"simple-git": "3.22.0",
"socket.io": "4.7.4",
"sharp": "0.33.3",
"simple-git": "3.24.0",
"socket.io": "4.7.5",
"striptags": "3.2.0",
"tar-fs": "3.0.4",
"turndown": "7.1.2",
"tar-fs": "3.0.5",
"turndown": "7.1.3",
"twemoji": "14.0.2",
"ufo": "1.3.2",
"ufo": "1.5.3",
"uslug": "1.0.4",
"uuid": "9.0.1",
"validate.js": "0.13.1",
"vue": "3.4.15",
"xss": "1.0.14",
"vue": "3.4.23",
"xss": "1.0.15",
"yargs": "17.7.2"
},
"devDependencies": {
@ -182,10 +182,10 @@
"eslint-plugin-import": "2.29.1",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
"nodemon": "3.0.3"
"nodemon": "3.1.0"
},
"overrides": {
"@graphql-tools/utils": "10.0.1"
"@graphql-tools/utils": "10.1.3"
},
"collective": {
"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"
},
"dependencies": {
"@apollo/client": "3.9.9",
"@apollo/client": "3.9.11",
"@lezer/common": "1.2.1",
"@mdi/font": "7.4.47",
"@quasar/extras": "1.16.11",
"@simplewebauthn/browser": "9.0.1",
"@tiptap/core": "2.2.4",
"@tiptap/extension-code-block": "2.2.4",
"@tiptap/extension-code-block-lowlight": "2.2.4",
"@tiptap/extension-color": "2.2.4",
"@tiptap/extension-dropcursor": "2.2.4",
"@tiptap/extension-font-family": "2.2.4",
"@tiptap/extension-gapcursor": "2.2.4",
"@tiptap/extension-hard-break": "2.2.4",
"@tiptap/extension-highlight": "2.2.4",
"@tiptap/extension-history": "2.2.4",
"@tiptap/extension-image": "2.2.4",
"@tiptap/extension-mention": "2.2.4",
"@tiptap/extension-placeholder": "2.2.4",
"@tiptap/extension-table": "2.2.4",
"@tiptap/extension-table-cell": "2.2.4",
"@tiptap/extension-table-header": "2.2.4",
"@tiptap/extension-table-row": "2.2.4",
"@tiptap/extension-task-item": "2.2.4",
"@tiptap/extension-task-list": "2.2.4",
"@tiptap/extension-text-align": "2.2.4",
"@tiptap/extension-text-style": "2.2.4",
"@tiptap/extension-typography": "2.2.4",
"@tiptap/pm": "2.2.4",
"@tiptap/starter-kit": "2.2.4",
"@tiptap/vue-3": "2.2.4",
"@simplewebauthn/browser": "10.0.0",
"@tiptap/core": "2.3.0",
"@tiptap/extension-code-block": "2.3.0",
"@tiptap/extension-code-block-lowlight": "2.3.0",
"@tiptap/extension-color": "2.3.0",
"@tiptap/extension-dropcursor": "2.3.0",
"@tiptap/extension-font-family": "2.3.0",
"@tiptap/extension-gapcursor": "2.3.0",
"@tiptap/extension-hard-break": "2.3.0",
"@tiptap/extension-highlight": "2.3.0",
"@tiptap/extension-history": "2.3.0",
"@tiptap/extension-image": "2.3.0",
"@tiptap/extension-mention": "2.3.0",
"@tiptap/extension-placeholder": "2.3.0",
"@tiptap/extension-table": "2.3.0",
"@tiptap/extension-table-cell": "2.3.0",
"@tiptap/extension-table-header": "2.3.0",
"@tiptap/extension-table-row": "2.3.0",
"@tiptap/extension-task-item": "2.3.0",
"@tiptap/extension-task-list": "2.3.0",
"@tiptap/extension-text-align": "2.3.0",
"@tiptap/extension-text-style": "2.3.0",
"@tiptap/extension-typography": "2.3.0",
"@tiptap/pm": "2.3.0",
"@tiptap/starter-kit": "2.3.0",
"@tiptap/vue-3": "2.3.0",
"@vue/repl": "3.4.0",
"@xterm/xterm": "5.5.0",
"apollo-upload-client": "18.0.1",
"browser-fs-access": "0.35.0",
"clipboard": "2.0.11",
@ -81,13 +82,13 @@
"prosemirror-commands": "1.5.2",
"prosemirror-history": "1.4.0",
"prosemirror-keymap": "1.2.2",
"prosemirror-model": "1.19.4",
"prosemirror-model": "1.20.0",
"prosemirror-schema-list": "1.3.0",
"prosemirror-state": "1.4.3",
"prosemirror-transform": "1.8.0",
"prosemirror-view": "1.33.3",
"prosemirror-view": "1.33.4",
"pug": "3.0.2",
"quasar": "2.15.2",
"quasar": "2.15.3",
"slugify": "1.6.6",
"socket.io-client": "4.7.5",
"sortablejs": "1.15.2",
@ -95,15 +96,14 @@
"tabulator-tables": "6.2.0",
"tippy.js": "6.3.7",
"twemoji": "14.0.2",
"typescript": "5.4.3",
"typescript": "5.4.5",
"uuid": "9.0.1",
"v-network-graph": "0.9.15",
"vue": "3.4.21",
"vue-i18n": "9.10.2",
"vue-router": "4.3.0",
"vue": "3.4.23",
"vue-i18n": "9.13.1",
"vue-router": "4.3.2",
"vue3-otp-input": "0.4.4",
"vuedraggable": "4.1.0",
"xterm": "5.3.0",
"zxcvbn": "4.4.2"
},
"devDependencies": {
@ -112,8 +112,8 @@
"@quasar/app-vite": "2.0.0-beta.5",
"@quasar/vite-plugin": "1.6.0",
"@types/lodash": "4.17.0",
"@vue/devtools": "7.0.25",
"@vue/language-plugin-pug": "2.0.7",
"@vue/devtools": "7.0.27",
"@vue/language-plugin-pug": "2.0.13",
"autoprefixer": "10.4.19",
"browserlist": "latest",
"eslint": "8.57.0",
@ -121,9 +121,9 @@
"eslint-plugin-import": "2.29.1",
"eslint-plugin-n": "16.6.2",
"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",
"sass": "1.72.0"
"sass": "1.75.0"
},
"engines": {
"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-icon(:name='`img:` + str.strategy.icon')
q-item-section
q-item-label {{str.displayName}}
q-item-label(caption) {{str.strategy.title}}
q-item-label {{ str.displayName }}
q-item-label(caption) {{ str.strategy.title }}
q-item-section(side)
status-light(:color='str.isEnabled ? `positive` : `negative`', :pulse='str.isEnabled')
q-btn.q-mt-sm.full-width(
color='primary'
icon='las la-plus'
:label='t(`admin.auth.addStrategy`)'
v-if='flagsStore.experimental'
)
q-menu(auto-close, fit, max-width='300px')
q-list(separator)
@ -72,17 +73,17 @@ q-page.admin-mail
:name='`img:` + str.icon'
)
q-item-section
q-item-label: strong {{str.title}}
q-item-label: strong {{ str.title }}
q-item-label(caption, lines='2') {{str.description}}
.col
q-card.q-pb-sm
q-card-section
.text-subtitle1 {{t('admin.auth.info')}}
.text-subtitle1 {{ t('admin.auth.info') }}
q-item
blueprint-icon(icon='information')
q-item-section
q-item-label {{t(`admin.auth.infoName`)}}
q-item-label(caption) {{t(`admin.auth.infoNameHint`)}}
q-item-label {{ t(`admin.auth.infoName`) }}
q-item-label(caption) {{ t(`admin.auth.infoNameHint`) }}
q-item-section
q-input(
outlined
@ -95,9 +96,9 @@ q-page.admin-mail
q-item(tag='label')
blueprint-icon(icon='shutdown')
q-item-section
q-item-label {{t(`admin.auth.enabled`)}}
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 {{ t(`admin.auth.enabled`) }}
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-section(avatar)
q-toggle(
v-model='state.strategy.isEnabled'
@ -111,8 +112,8 @@ q-page.admin-mail
q-item(tag='label')
blueprint-icon(icon='register')
q-item-section
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 {{ t(`admin.auth.registration`) }}
q-item-label(caption) {{ state.strategy.strategy.key === `local` ? t(`admin.auth.registrationLocalHint`) : t(`admin.auth.registrationHint`) }}
q-item-section(avatar)
q-toggle(
v-model='state.strategy.registration'
@ -126,8 +127,8 @@ q-page.admin-mail
q-item
blueprint-icon(icon='team')
q-item-section
q-item-label {{t(`admin.auth.autoEnrollGroups`)}}
q-item-label(caption) {{t(`admin.auth.autoEnrollGroupsHint`)}}
q-item-label {{ t(`admin.auth.autoEnrollGroups`) }}
q-item-label(caption) {{ t(`admin.auth.autoEnrollGroupsHint`) }}
q-item-section
q-select(
outlined
@ -144,7 +145,7 @@ q-page.admin-mail
:aria-label='t(`admin.users.groups`)'
:loading='state.loadingGroups'
)
template(v-slot:selected)
template(#selected)
.text-caption(v-if='state.strategy.autoEnrollGroups?.length > 1')
i18n-t(keypath='admin.users.groupsSelected')
template(#count)
@ -154,7 +155,7 @@ q-page.admin-mail
template(#group)
strong {{ selectedGroupName }}
span(v-else)
template(v-slot:option='{ itemProps, opt, selected, toggleOption }')
template(#option='{ itemProps, opt, selected, toggleOption }')
q-item(
v-bind='itemProps'
)
@ -171,8 +172,8 @@ q-page.admin-mail
q-item
blueprint-icon(icon='private')
q-item-section
q-item-label {{t(`admin.auth.allowedEmailRegex`)}}
q-item-label(caption) {{t(`admin.auth.allowedEmailRegexHint`)}}
q-item-label {{ t(`admin.auth.allowedEmailRegex`) }}
q-item-label(caption) {{ t(`admin.auth.allowedEmailRegexHint`) }}
q-item-section
q-input(
outlined
@ -189,12 +190,12 @@ q-page.admin-mail
//- -----------------------
q-card.q-pb-sm.q-mt-md
q-card-section
.text-subtitle1 {{t('admin.auth.strategyConfiguration')}}
.text-subtitle1 {{ t('admin.auth.strategyConfiguration') }}
q-banner.q-mt-md(
v-if='!state.strategy.config || Object.keys(state.strategy.config).length < 1'
rounded
: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(
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')
blueprint-icon(:icon='cfg.icon', :hue-rotate='cfg.readOnly ? -45 : 0')
q-item-section
q-item-label {{cfg.title}}
q-item-label(caption) {{cfg.hint}}
q-item-label {{ cfg.title }}
q-item-label(caption) {{ cfg.hint }}
q-item-section(avatar)
q-toggle(
v-model='cfg.value'
@ -219,8 +220,8 @@ q-page.admin-mail
q-item(v-else)
blueprint-icon(:icon='cfg.icon', :hue-rotate='cfg.readOnly ? -45 : 0')
q-item-section
q-item-label {{cfg.title}}
q-item-label(caption) {{cfg.hint}}
q-item-label {{ cfg.title }}
q-item-label(caption) {{ cfg.hint }}
q-item-section(
:style='cfg.type === `number` ? `flex: 0 0 150px;` : ``'
: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-section
.text-subtitle1 {{t('admin.auth.configReference')}}
.text-subtitle1 {{ t('admin.auth.configReference') }}
q-item(v-for='strRef of strategyRefs', :key='strRef.key')
blueprint-icon(:icon='strRef.icon', :hue-rotate='-45')
q-item-section
q-item-label {{strRef.title}}
q-item-label(caption) {{strRef.hint}}
q-item-label {{ strRef.title }}
q-item-label(caption) {{ strRef.hint }}
q-item-section
q-input(
outlined
@ -287,9 +288,9 @@ q-page.admin-mail
no-spinner
style='height: 100px; max-width: 300px;'
)
.text-subtitle2.q-mt-sm {{state.strategy.strategy.title}}
.text-caption.q-mt-sm {{state.strategy.strategy.description}}
.text-caption.q-mt-sm: strong {{state.strategy.strategy.vendor}}
.text-subtitle2.q-mt-sm {{ state.strategy.strategy.title }}
.text-caption.q-mt-sm {{ state.strategy.strategy.description }}
.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}}
.flex.q-mt-md
@ -315,6 +316,7 @@ import { useMeta, useQuasar } from 'quasar'
import { computed, onMounted, reactive, watch, nextTick } from 'vue'
import { useAdminStore } from '@/stores/admin'
import { useFlagsStore } from '@/stores/flags'
import { useSiteStore } from '@/stores/site'
// QUASAR
@ -324,6 +326,7 @@ const $q = useQuasar()
// STORES
const adminStore = useAdminStore()
const flagsStore = useFlagsStore()
const siteStore = useSiteStore()
// I18N

@ -50,8 +50,8 @@ q-page.admin-flags
q-item(v-for='block of state.blocks', :key='block.id')
blueprint-icon(:icon='block.isCustom ? `plugin` : block.icon')
q-item-section
q-item-label: strong {{block.name}}
q-item-label(caption) {{ block.description}}
q-item-label: strong {{ block.name }}
q-item-label(caption) {{ block.description }}
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-separator.q-mx-sm.q-my-xs(vertical)
@ -79,6 +79,7 @@ q-page.admin-flags
unchecked-icon='las la-times'
:label='t(`admin.blocks.isEnabled`)'
:aria-label='t(`admin.blocks.isEnabled`)'
disable
)
</template>

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

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

Loading…
Cancel
Save