feat: admin auth page (wip)

pull/5698/head
Nicolas Giard 2 years ago
parent b9ca6862de
commit 6625267bc9
No known key found for this signature in database
GPG Key ID: 85061B8F9D55B7C8

@ -63,13 +63,11 @@ exports.up = async knex => {
table.uuid('id').notNullable().primary().defaultTo(knex.raw('gen_random_uuid()')) table.uuid('id').notNullable().primary().defaultTo(knex.raw('gen_random_uuid()'))
table.string('module').notNullable() table.string('module').notNullable()
table.boolean('isEnabled').notNullable().defaultTo(false) table.boolean('isEnabled').notNullable().defaultTo(false)
table.integer('order').unsigned().notNullable().defaultTo(0)
table.string('displayName').notNullable().defaultTo('') table.string('displayName').notNullable().defaultTo('')
table.jsonb('config').notNullable().defaultTo('{}') table.jsonb('config').notNullable().defaultTo('{}')
table.boolean('selfRegistration').notNullable().defaultTo(false) table.boolean('selfRegistration').notNullable().defaultTo(false)
table.jsonb('domainWhitelist').notNullable().defaultTo('[]') table.jsonb('domainWhitelist').notNullable().defaultTo('[]')
table.jsonb('autoEnrollGroups').notNullable().defaultTo('[]') table.jsonb('autoEnrollGroups').notNullable().defaultTo('[]')
table.jsonb('hideOnSites').notNullable().defaultTo('[]')
}) })
.createTable('commentProviders', table => { .createTable('commentProviders', table => {
table.uuid('id').notNullable().primary().defaultTo(knex.raw('gen_random_uuid()')) table.uuid('id').notNullable().primary().defaultTo(knex.raw('gen_random_uuid()'))

@ -31,18 +31,18 @@ module.exports = {
async authStrategies () { async authStrategies () {
return WIKI.data.authentication.map(stg => ({ return WIKI.data.authentication.map(stg => ({
...stg, ...stg,
isAvailable: stg.isAvailable === true, isAvailable: stg.isAvailable === true
props: _.sortBy(_.transform(stg.props, (res, value, key) => {
res.push({
key,
value: JSON.stringify(value)
})
}, []), 'key')
})) }))
}, },
/** /**
* Fetch active authentication strategies * Fetch active authentication strategies
*/ */
async authActiveStrategies (obj, args, context) {
return WIKI.models.authentication.getStrategies()
},
/**
* Fetch site authentication strategies
*/
async authSiteStrategies (obj, args, context, info) { async authSiteStrategies (obj, args, context, info) {
let strategies = await WIKI.models.authentication.getStrategies() let strategies = await WIKI.models.authentication.getStrategies()
strategies = strategies.map(stg => { strategies = strategies.map(stg => {
@ -268,14 +268,9 @@ module.exports = {
} }
} }
}, },
AuthenticationStrategy: { AuthenticationActiveStrategy: {
icon (ap, args) { strategy (obj, args, context) {
return fs.readFile(path.join(WIKI.ROOTPATH, `assets/svg/auth-icon-${ap.key}.svg`), 'utf8').catch(err => { return _.find(WIKI.data.authentication, ['key', obj.module])
if (err.code === 'ENOENT') {
return null
}
throw err
})
} }
} }
} }

@ -9,9 +9,11 @@ extend type Query {
authStrategies: [AuthenticationStrategy] authStrategies: [AuthenticationStrategy]
authActiveStrategies: [AuthenticationActiveStrategy]
authSiteStrategies( authSiteStrategies(
siteId: UUID! siteId: UUID!
enabledOnly: Boolean visibleOnly: Boolean
): [AuthenticationSiteStrategy] ): [AuthenticationSiteStrategy]
} }
@ -73,7 +75,7 @@ extend type Mutation {
type AuthenticationStrategy { type AuthenticationStrategy {
key: String key: String
props: [KeyValuePair] props: JSON
title: String title: String
description: String description: String
isAvailable: Boolean isAvailable: Boolean
@ -81,22 +83,29 @@ type AuthenticationStrategy {
usernameType: String usernameType: String
logo: String logo: String
color: String color: String
vendor: String
website: String website: String
icon: String icon: String
} }
type AuthenticationSiteStrategy { type AuthenticationActiveStrategy {
key: String id: UUID
strategy: AuthenticationStrategy strategy: AuthenticationStrategy
displayName: String displayName: String
order: Int
isEnabled: Boolean isEnabled: Boolean
config: [KeyValuePair] config: JSON
selfRegistration: Boolean selfRegistration: Boolean
domainWhitelist: [String] domainWhitelist: [String]
autoEnrollGroups: [Int] autoEnrollGroups: [Int]
} }
type AuthenticationSiteStrategy {
id: UUID
activeStrategy: AuthenticationActiveStrategy
order: Int
isVisible: Boolean
}
type AuthenticationLoginResponse { type AuthenticationLoginResponse {
operation: Operation operation: Operation
jwt: String jwt: String

@ -29,11 +29,12 @@ module.exports = {
default: defaultValue, default: defaultValue,
type: (value.type || value).toLowerCase(), type: (value.type || value).toLowerCase(),
title: value.title || _.startCase(key), title: value.title || _.startCase(key),
hint: value.hint || false, hint: value.hint || '',
enum: value.enum || false, enum: value.enum || false,
enumDisplay: value.enumDisplay || 'select',
multiline: value.multiline || false, multiline: value.multiline || false,
sensitive: value.sensitive || false, sensitive: value.sensitive || false,
maxWidth: value.maxWidth || 0, icon: value.icon || 'rename',
order: value.order || 100 order: value.order || 100
}) })
return result return result

@ -51,13 +51,14 @@ module.exports = class Authentication extends Model {
for (const dir of authenticationDirs) { for (const dir of authenticationDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/authentication', dir, 'definition.yml'), 'utf8') const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/authentication', dir, 'definition.yml'), 'utf8')
const defParsed = yaml.load(def) const defParsed = yaml.load(def)
if (!defParsed.isAvailable) { continue }
defParsed.key = dir defParsed.key = dir
defParsed.props = commonHelper.parseModuleProps(defParsed.props) defParsed.props = commonHelper.parseModuleProps(defParsed.props)
WIKI.data.analytics.push(defParsed) WIKI.data.authentication.push(defParsed)
WIKI.logger.debug(`Loaded authentication module definition ${dir}: [ OK ]`) WIKI.logger.debug(`Loaded authentication module definition ${dir}: [ OK ]`)
} }
WIKI.logger.info(`Loaded ${WIKI.data.analytics.length} authentication module definitions: [ OK ]`) WIKI.logger.info(`Loaded ${WIKI.data.authentication.length} authentication module definitions: [ OK ]`)
} catch (err) { } catch (err) {
WIKI.logger.error(`Failed to scan or load authentication providers: [ FAILED ]`) WIKI.logger.error(`Failed to scan or load authentication providers: [ FAILED ]`)
WIKI.logger.error(err) WIKI.logger.error(err)

@ -3,6 +3,7 @@ title: Auth0
description: Auth0 provides universal identity platform for web, mobile, IoT, and internal applications. description: Auth0 provides universal identity platform for web, mobile, IoT, and internal applications.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/auth0.svg logo: https://static.requarks.io/logo/auth0.svg
icon: /_assets/icons/ultraviolet-auth0.svg
color: deep-orange color: deep-orange
website: https://auth0.com/ website: https://auth0.com/
isAvailable: true isAvailable: true

@ -1,8 +1,9 @@
key: azure key: azure
title: Azure Active Directory title: Azure Active Directory
description: Azure Active Directory (Azure AD) is Microsofts multi-tenant, cloud-based directory, and identity management service that combines core directory services, application access management, and identity protection into a single solution. description: Azure Active Directory (Azure AD) is Microsoft's multi-tenant, cloud-based directory, and identity management service that combines core directory services, application access management, and identity protection into a single solution.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/azure.svg logo: https://static.requarks.io/logo/azure.svg
icon: /_assets/icons/ultraviolet-azure.svg
color: blue darken-3 color: blue darken-3
website: https://azure.microsoft.com/services/active-directory/ website: https://azure.microsoft.com/services/active-directory/
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: CAS
description: The Central Authentication Service (CAS) is a single sign-on protocol for the web. description: The Central Authentication Service (CAS) is a single sign-on protocol for the web.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/cas.svg logo: https://static.requarks.io/logo/cas.svg
icon: /_assets/icons/ultraviolet-cas.svg
color: green darken-2 color: green darken-2
website: https://apereo.github.io/cas/ website: https://apereo.github.io/cas/
useForm: false useForm: false

@ -3,6 +3,7 @@ title: Discord
description: Discord is a proprietary freeware VoIP application designed for gaming communities, that specializes in text, video and audio communication between users in a chat channel. description: Discord is a proprietary freeware VoIP application designed for gaming communities, that specializes in text, video and audio communication between users in a chat channel.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/discord.svg logo: https://static.requarks.io/logo/discord.svg
icon: /_assets/icons/ultraviolet-discord.svg
color: indigo lighten-2 color: indigo lighten-2
website: https://discord.com/ website: https://discord.com/
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: Dropbox
description: Dropbox is a file hosting service that offers cloud storage, file synchronization, personal cloud, and client software. description: Dropbox is a file hosting service that offers cloud storage, file synchronization, personal cloud, and client software.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/dropbox.svg logo: https://static.requarks.io/logo/dropbox.svg
icon: /_assets/icons/ultraviolet-dropbox.svg
color: blue darken-2 color: blue darken-2
website: https://dropbox.com website: https://dropbox.com
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: Facebook
description: Facebook is an online social media and social networking service company. description: Facebook is an online social media and social networking service company.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/facebook.svg logo: https://static.requarks.io/logo/facebook.svg
icon: /_assets/icons/ultraviolet-facebook.svg
color: indigo color: indigo
website: https://facebook.com/ website: https://facebook.com/
isAvailable: true isAvailable: true

@ -1,36 +0,0 @@
/* global WIKI */
// ------------------------------------
// Firebase Account
// ------------------------------------
// INCOMPLETE / TODO
const FirebaseStrategy = require('passport-github2').Strategy
const _ = require('lodash')
module.exports = {
init (passport, conf) {
passport.use(conf.key,
new FirebaseStrategy({
clientID: conf.clientId,
clientSecret: conf.clientSecret,
callbackURL: conf.callbackURL,
scope: ['user:email']
}, async (req, accessToken, refreshToken, profile, cb) => {
try {
const user = await WIKI.models.users.processProfile({
providerKey: req.params.strategy,
profile: {
...profile,
picture: _.get(profile, 'photos[0].value', '')
}
})
cb(null, user)
} catch (err) {
cb(err, null)
}
}
))
}
}

@ -1,11 +0,0 @@
key: firebase
title: Firebase
description: Firebase is Google's mobile platform that helps you quickly develop high-quality apps and grow your business.
author: requarks.io
logo: https://static.requarks.io/logo/firebase.svg
color: yellow darken-3
website: https://firebase.google.com/
isAvailable: false
useForm: false
props: {}

@ -3,6 +3,7 @@ title: GitHub
description: GitHub Inc. is a web-based hosting service for version control using Git. description: GitHub Inc. is a web-based hosting service for version control using Git.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/github.svg logo: https://static.requarks.io/logo/github.svg
icon: /_assets/icons/ultraviolet-github.svg
color: grey darken-3 color: grey darken-3
website: https://github.com website: https://github.com
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: GitLab
description: GitLab is a web-based DevOps lifecycle tool that provides a Git-repository manager providing wiki, issue-tracking and CI/CD pipeline features. description: GitLab is a web-based DevOps lifecycle tool that provides a Git-repository manager providing wiki, issue-tracking and CI/CD pipeline features.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/gitlab.svg logo: https://static.requarks.io/logo/gitlab.svg
icon: /_assets/icons/ultraviolet-gitlab.svg
color: deep-orange color: deep-orange
website: https://gitlab.com website: https://gitlab.com
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: Google
description: Google specializes in Internet-related services and products, which include online advertising technologies, search engine, cloud computing, software, and hardware. description: Google specializes in Internet-related services and products, which include online advertising technologies, search engine, cloud computing, software, and hardware.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/google.svg logo: https://static.requarks.io/logo/google.svg
icon: /_assets/icons/ultraviolet-google.svg
color: red darken-1 color: red darken-1
website: https://console.developers.google.com/ website: https://console.developers.google.com/
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: Keycloak
description: Keycloak is an open source software product to allow single sign-on with Identity Management and Access Management aimed at modern applications and services. description: Keycloak is an open source software product to allow single sign-on with Identity Management and Access Management aimed at modern applications and services.
author: D4uS1 author: D4uS1
logo: https://static.requarks.io/logo/keycloak.svg logo: https://static.requarks.io/logo/keycloak.svg
icon: /_assets/icons/ultraviolet-keycloak.svg
color: blue-grey darken-2 color: blue-grey darken-2
website: https://www.keycloak.org/ website: https://www.keycloak.org/
useForm: false useForm: false

@ -3,7 +3,9 @@ title: LDAP / Active Directory
description: Active Directory is a directory service that Microsoft developed for the Windows domain networks. description: Active Directory is a directory service that Microsoft developed for the Windows domain networks.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/active-directory.svg logo: https://static.requarks.io/logo/active-directory.svg
icon: /_assets/icons/ultraviolet-windows8.svg
color: blue darken-3 color: blue darken-3
vendor: Microsoft Corporation
website: https://www.microsoft.com/windowsserver website: https://www.microsoft.com/windowsserver
isAvailable: true isAvailable: true
useForm: true useForm: true

@ -3,8 +3,10 @@ title: Local Database
description: Built-in authentication for Wiki.js description: Built-in authentication for Wiki.js
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/wikijs.svg logo: https://static.requarks.io/logo/wikijs.svg
icon: /_assets/icons/ultraviolet-data-protection.svg
color: primary color: primary
website: https://wiki.js.org vendor: 'Wiki.js'
website: 'https://js.wiki'
isAvailable: true isAvailable: true
useForm: true useForm: true
usernameType: email usernameType: email

@ -3,6 +3,7 @@ title: Microsoft
description: Microsoft is a software company, best known for it's Windows, Office, Azure, Xbox and Surface products. description: Microsoft is a software company, best known for it's Windows, Office, Azure, Xbox and Surface products.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/microsoft.svg logo: https://static.requarks.io/logo/microsoft.svg
icon: /_assets/icons/ultraviolet-microsoft.svg
color: blue color: blue
website: https://apps.dev.microsoft.com/ website: https://apps.dev.microsoft.com/
isAvailable: false isAvailable: false

@ -3,6 +3,7 @@ title: Generic OAuth2
description: OAuth 2.0 is the industry-standard protocol for authorization. description: OAuth 2.0 is the industry-standard protocol for authorization.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/oauth2.svg logo: https://static.requarks.io/logo/oauth2.svg
icon: /_assets/icons/ultraviolet-oauth2.svg
color: blue-grey darken-2 color: blue-grey darken-2
website: https://oauth.net/2/ website: https://oauth.net/2/
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: Generic OpenID Connect / OAuth2
description: OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. description: OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/oidc.svg logo: https://static.requarks.io/logo/oidc.svg
icon: /_assets/icons/ultraviolet-openid.svg
color: blue-grey darken-2 color: blue-grey darken-2
website: http://openid.net/connect/ website: http://openid.net/connect/
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: Okta
description: Okta provide secure identity management and single sign-on to any application. description: Okta provide secure identity management and single sign-on to any application.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/okta.svg logo: https://static.requarks.io/logo/okta.svg
icon: /_assets/icons/ultraviolet-okta.svg
color: blue darken-1 color: blue darken-1
website: https://www.okta.com/ website: https://www.okta.com/
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: Rocket.chat
description: Communicate and collaborate with your team, share files, chat in real-time, or switch to video/audio conferencing. description: Communicate and collaborate with your team, share files, chat in real-time, or switch to video/audio conferencing.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/rocketchat.svg logo: https://static.requarks.io/logo/rocketchat.svg
icon: /_assets/icons/ultraviolet-rocketchat.svg
color: red accent-3 color: red accent-3
website: https://rocket.chat/ website: https://rocket.chat/
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: SAML 2.0
description: Security Assertion Markup Language 2.0 (SAML 2.0) is a version of the SAML standard for exchanging authentication and authorization data between security domains. description: Security Assertion Markup Language 2.0 (SAML 2.0) is a version of the SAML standard for exchanging authentication and authorization data between security domains.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/saml.svg logo: https://static.requarks.io/logo/saml.svg
icon: /_assets/icons/ultraviolet-saml.svg
color: red darken-3 color: red darken-3
website: https://wiki.oasis-open.org/security/FrontPage website: https://wiki.oasis-open.org/security/FrontPage
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: Slack
description: Slack is a cloud-based set of proprietary team collaboration tools and services. description: Slack is a cloud-based set of proprietary team collaboration tools and services.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/slack.svg logo: https://static.requarks.io/logo/slack.svg
icon: /_assets/icons/ultraviolet-slack.svg
color: green color: green
website: https://api.slack.com/docs/oauth website: https://api.slack.com/docs/oauth
isAvailable: true isAvailable: true

@ -3,6 +3,7 @@ title: Twitch
description: Twitch is a live streaming video platform. description: Twitch is a live streaming video platform.
author: requarks.io author: requarks.io
logo: https://static.requarks.io/logo/twitch.svg logo: https://static.requarks.io/logo/twitch.svg
icon: /_assets/icons/ultraviolet-twitch.svg
color: indigo darken-2 color: indigo darken-2
website: https://dev.twitch.tv/docs/authentication/ website: https://dev.twitch.tv/docs/authentication/
isAvailable: true isAvailable: true

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 96 96" width="96px" height="96px">
<g id="surface100632812">
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(87.450981%,94.117647%,99.607843%);fill-opacity:1;" d="M 25.070312 75.71875 L 48.023438 92.570312 L 70.878906 75.695312 L 48.015625 58.648438 L 25.117188 75.660156 L 33.882812 48.050781 L 10.871094 31.148438 L 39.246094 30.980469 L 48.027344 3.429688 L 19.535156 3.429688 L 10.882812 31.09375 C 5.855469 47.109375 10.996094 65.289062 25.070312 75.71875 Z M 25.070312 75.71875 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(87.450981%,94.117647%,99.607843%);fill-opacity:1;" d="M 85.035156 31.09375 L 62.203125 48.046875 L 70.902344 75.679688 L 70.925781 75.664062 C 84.886719 65.226562 90.195312 47.109375 85.113281 31.035156 L 85.101562 31.042969 L 76.339844 3.429688 L 48.03125 3.429688 L 56.792969 30.929688 Z M 85.035156 31.09375 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(27.843139%,53.333336%,78.039217%);fill-opacity:1;" d="M 74.597656 77.851562 L 74.578125 77.808594 L 74.554688 77.824219 Z M 74.597656 77.851562 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(27.843139%,53.333336%,78.039217%);fill-opacity:1;" d="M 48.023438 96 C 47.394531 96 46.769531 95.804688 46.234375 95.410156 L 23.285156 78.398438 C 23.28125 78.398438 23.28125 78.394531 23.277344 78.390625 C 8.574219 67.386719 2.449219 47.960938 8.019531 30.039062 L 16.671875 2.113281 C 17.058594 0.855469 18.222656 0 19.535156 0 L 48.027344 0 C 48.984375 0 49.878906 0.457031 50.449219 1.226562 C 51.011719 2 51.175781 2.992188 50.886719 3.902344 L 42.109375 31.71875 C 41.714844 32.964844 40.566406 33.808594 39.265625 33.816406 L 19.882812 33.933594 L 35.671875 45.640625 C 36.699219 46.398438 37.132812 47.726562 36.746094 48.953125 L 30.777344 67.933594 L 46.21875 56.351562 C 47.292969 55.550781 48.757812 55.554688 49.824219 56.355469 L 72.683594 73.566406 C 73.4375 74.136719 73.878906 75.027344 73.878906 75.972656 C 73.878906 76.914062 73.433594 77.804688 72.671875 78.367188 L 49.816406 95.40625 C 49.285156 95.800781 48.65625 96 48.023438 96 Z M 30.066406 75.957031 L 48.015625 89.261719 L 65.871094 75.949219 L 48.011719 62.5 Z M 12.683594 36.0625 C 10.21875 48.875 14.34375 62.019531 23.578125 70.808594 L 30.382812 49.1875 Z M 21.746094 6 L 14.945312 27.960938 L 37.042969 27.828125 L 43.9375 6 Z M 21.746094 6 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(27.843139%,53.333336%,78.039217%);fill-opacity:1;" d="M 70.902344 78.9375 C 70.601562 78.9375 70.292969 78.886719 69.992188 78.792969 C 69.0625 78.492188 68.324219 77.769531 68.035156 76.835938 L 59.335938 48.941406 C 58.957031 47.726562 59.382812 46.40625 60.398438 45.648438 L 76.097656 33.875 L 56.769531 33.765625 C 55.464844 33.757812 54.316406 32.90625 53.925781 31.667969 L 45.164062 3.902344 C 44.875 2.992188 45.039062 2 45.605469 1.226562 C 46.171875 0.457031 47.070312 0 48.027344 0 L 76.335938 0 C 77.648438 0 78.804688 0.847656 79.195312 2.101562 L 87.867188 29.699219 C 87.90625 29.789062 87.941406 29.878906 87.96875 29.972656 C 93.550781 47.796875 87.425781 67.222656 72.722656 78.320312 C 72.199219 78.722656 71.550781 78.9375 70.902344 78.9375 Z M 65.695312 49.175781 L 72.414062 70.726562 C 81.65625 61.886719 85.785156 48.726562 83.308594 35.972656 Z M 58.992188 27.78125 L 81.015625 27.90625 L 74.136719 6 L 52.121094 6 Z M 58.992188 27.78125 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g id="surface100774253">
<path d="M7.305,19.719L16.883,19.719L12.262,6.695L7.305,19.719Z" style="fill:rgb(152,204,253);fill-rule:nonzero;"/>
<path d="M31.082,19.719L40.656,19.719L36.039,6.695L31.082,19.719Z" style="fill:rgb(152,204,253);fill-rule:nonzero;"/>
<path d="M25.656,39.785L40.898,20.031L42.766,26.477C42.766,26.477 43.051,28.008 41.039,29.031C39.031,30.051 25.656,39.785 25.656,39.785Z" style="fill:rgb(254,254,254);fill-rule:nonzero;"/>
<path d="M22.289,39.785L7.051,20.031L5.184,26.477C5.184,26.477 4.895,28.008 6.906,29.031C8.914,30.051 22.289,39.785 22.289,39.785Z" style="fill:rgb(254,254,254);fill-rule:nonzero;"/>
<path d="M16.945,20.156L23.902,40.871L31.18,20.031L16.945,20.156Z" style="fill:rgb(152,204,253);fill-rule:nonzero;"/>
<path d="M7.305,20.031L16.848,20.031L24.094,41.316L7.305,20.031Z" style="fill:rgb(223,239,253);fill-rule:nonzero;"/>
<path d="M40.898,20.031L31.355,20.031L24.109,41.316L40.898,20.031Z" style="fill:rgb(223,239,253);fill-rule:nonzero;"/>
<path d="M42.777,24.066C42.184,21.93 41.535,19.813 40.832,17.711C40.129,15.609 39.371,13.527 38.563,11.465C38.156,10.434 37.738,9.406 37.309,8.387C37.121,7.945 36.934,7.508 36.742,7.066C36.605,6.75 36.484,6.301 36.156,6.117C35.051,5.488 34.605,8.164 34.406,8.738C33.699,10.777 32.934,12.777 32.418,14.875C32.035,16.441 31.5,17.957 30.941,19.465C29.188,19.563 27.43,19.703 25.68,19.723C23.586,19.738 21.477,19.586 19.383,19.52C18.652,19.496 17.922,19.473 17.191,19.449C16.848,18.48 16.52,17.504 16.199,16.527C15.512,14.402 14.855,12.27 14.188,10.141C13.906,9.246 13.609,8.359 13.344,7.465C13.211,7.027 13.066,6.34 12.617,6.109C11.934,5.762 11.621,6.594 11.414,7.066C10.988,8.051 10.574,9.039 10.172,10.031C9.336,12.086 8.555,14.156 7.828,16.25C7.02,18.566 6.281,20.906 5.605,23.266C5.113,25 3.965,27.797 6.027,28.977C8.336,30.402 10.52,31.953 12.648,33.637C16.285,36.512 20.051,39.215 23.828,41.902C23.895,41.945 23.961,41.965 24.031,41.969C24.047,41.973 24.063,41.973 24.082,41.973C24.098,41.973 24.117,41.973 24.133,41.969C24.203,41.965 24.27,41.945 24.336,41.898C28.109,39.211 31.879,36.512 35.516,33.637C37.645,31.953 39.828,30.402 42.137,28.973C43.945,27.934 43.223,25.66 42.777,24.066ZM31.641,20.434C34.434,20.438 37.227,20.457 40.02,20.434C38.848,22.023 37.566,23.527 36.305,25.047C34.93,26.703 33.648,28.406 32.414,30.172C30.223,33.316 27.633,36.16 25.352,39.246C26.391,36.211 27.492,33.199 28.492,30.152C29.109,28.273 29.613,26.367 30.199,24.48C30.621,23.113 31.133,21.773 31.641,20.434ZM33.789,13.586C34.34,11.727 35.102,9.938 35.676,8.09C35.734,7.902 35.785,7.711 35.848,7.523C35.879,7.586 35.91,7.641 35.93,7.68C36.023,7.898 36.117,8.117 36.211,8.336C36.426,8.84 36.637,9.348 36.848,9.855C37.613,11.723 38.336,13.609 39.016,15.508C39.477,16.809 39.914,18.117 40.336,19.434C37.563,19.457 34.785,19.438 32.012,19.434C32.059,19.305 32.109,19.176 32.156,19.047C32.813,17.25 33.246,15.414 33.789,13.586ZM28.074,20.602C28.902,20.563 29.73,20.52 30.559,20.48C30.504,20.625 30.449,20.77 30.395,20.914C29.637,22.93 29.039,24.965 28.43,27.027C27.141,31.352 25.543,35.574 24.102,39.848C23.012,36.215 22.137,32.523 20.641,29.023C19.766,26.973 19.184,24.813 18.387,22.73C18.102,21.98 17.828,21.223 17.555,20.465C21.063,20.59 24.566,20.777 28.074,20.602ZM8.594,17.078C9.234,15.207 9.922,13.348 10.648,11.508C11.016,10.57 11.398,9.641 11.789,8.711C11.961,8.305 12.137,7.902 12.313,7.496C12.859,8.961 13.254,10.512 13.719,12.004C14.324,13.941 14.93,15.887 15.57,17.816C15.75,18.355 15.941,18.891 16.133,19.426C13.367,19.348 10.59,19.313 7.82,19.422C8.074,18.641 8.328,17.855 8.594,17.078ZM12.98,32.633C10.914,30.988 8.773,29.5 6.527,28.109C5.629,27.594 5.785,26.445 6,25.594C6.242,24.633 6.523,23.684 6.801,22.734C6.973,22.145 7.156,21.559 7.336,20.973C9.484,23.512 11.617,26.066 13.625,28.715C15.449,31.125 17.117,33.648 18.945,36.055C19.594,36.91 20.25,37.754 20.918,38.594C18.23,36.66 15.566,34.695 12.98,32.633ZM16.969,31.645C15.344,29.316 13.633,27.059 11.848,24.848C10.641,23.355 9.406,21.883 8.164,20.414C10.93,20.316 13.703,20.355 16.469,20.434C16.477,20.434 16.48,20.43 16.488,20.43C16.852,21.434 17.223,22.438 17.594,23.441C18.27,25.277 18.789,27.168 19.547,28.977C20.977,32.41 21.902,35.977 22.961,39.523C20.879,36.961 18.859,34.355 16.969,31.645ZM35.18,32.633C32.473,34.785 29.688,36.836 26.879,38.855C28.988,36.109 31.297,33.52 33.281,30.676C34.551,28.855 35.879,27.113 37.301,25.406C38.508,23.961 39.711,22.512 40.828,20.996C40.914,21.273 41.008,21.547 41.09,21.824C41.418,22.922 41.734,24.023 42.035,25.133C42.293,26.082 42.695,27.5 41.629,28.109C39.387,29.5 37.242,30.992 35.18,32.633Z" style="fill:rgb(71,136,199);fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g id="g110">
<path id="path38" d="M438.48,152C437.114,152.015 435.845,151.292 435.16,150.11L377.39,49.94C376.675,48.754 375.385,48.035 374,48.05L138.33,48.05C136.96,48.032 135.687,48.754 135,49.94L75,153.89L19.17,254.09C18.5,255.275 18.5,256.725 19.17,257.91L75,358L135,462C135.685,463.182 136.954,463.905 138.32,463.89L374,463.89C375.374,463.894 376.65,463.177 377.36,462L435.2,361.9C435.885,360.718 437.154,359.995 438.52,360.01L438.45,152L438.48,152Z" style="fill:rgb(182,220,254);fill-rule:nonzero;"/>
<path id="path27674" d="M76.014,152L17.659,256.009L76,360L512,360L512,152" style="fill:rgb(223,240,254);fill-rule:nonzero;"/>
<path id="path381" serif:id="path38" d="M72.104,158.97L76.014,152L76.091,152L135,49.94C135.687,48.754 136.96,48.032 138.33,48.05L374,48.05C375.385,48.035 376.675,48.754 377.39,49.94L435.16,150.11C435.845,151.292 437.114,152.015 438.48,152L512,152L512,360L438.52,360L438.52,360.01C437.154,359.995 435.885,360.718 435.2,361.9L377.36,462C376.65,463.177 375.374,463.894 374,463.89L138.32,463.89C136.954,463.905 135.685,463.182 135,462L78.472,364.018L83.111,355.986L140.73,455.858L371.632,455.858L428.25,357.874C430.273,354.381 433.928,352.176 437.93,351.992C438.124,351.975 438.321,351.968 438.52,351.968C438.52,351.968 503.968,351.968 503.968,351.968C503.968,351.968 503.968,160.032 503.968,160.032C503.968,160.032 438.509,160.032 438.509,160.032C434.268,160.057 430.337,157.808 428.21,154.136L371.662,56.082L140.729,56.082L83.047,156.015C82.895,156.28 82.728,156.534 82.546,156.774L26.869,256.009L83.005,356.07L78.412,363.914L76.154,360L76,360L17.659,256.009L72.085,159.003C73.265,159.668 74.614,160.032 76.014,160.032L76.013,160.03C74.617,160.017 73.275,159.642 72.104,158.97Z" style="fill:rgb(71,136,199);"/>
<path id="path94" d="M235.08,361.89L217.08,393.16C216.772,393.636 216.354,394.031 215.86,394.31L136,256.14L176.6,256.14C176.585,256.688 176.716,257.23 176.98,257.71C176.989,257.772 177.013,257.83 177.05,257.88L235.05,358.46C235.675,359.513 235.687,360.826 235.08,361.89ZM235.15,153.81L177,254.46C176.723,254.962 176.579,255.527 176.58,256.1L136.07,256.1L215.81,117.92C216.302,118.19 216.713,118.587 217,119.07L217.11,119.18L235.19,150.59C235.702,151.605 235.687,152.808 235.15,153.81Z" style="fill:rgb(152,204,253);fill-rule:nonzero;"/>
<path id="path98" d="M116.044,290.714L96.97,257.64C96.706,257.16 96.575,256.618 96.59,256.07C96.589,255.497 96.733,254.932 97.01,254.43L116.31,221L175.06,119.26C175.663,118.173 176.817,117.5 178.06,117.51L214.1,117.51C214.695,117.502 215.283,117.643 215.81,117.92L136.07,256.1L136.026,256.176L215.81,394.31C215.287,394.601 214.699,394.755 214.1,394.76L178,394.76C176.757,394.77 175.603,394.097 175,393.01L121.28,300.01L116,290.79L116.044,290.714Z" style="fill:rgb(71,136,199);fill-rule:nonzero;"/>
<path id="path102" d="M335.63,256.1C335.624,255.496 335.454,254.905 335.14,254.39L277.14,153.84C276.512,152.774 276.512,151.446 277.14,150.38L295.22,119.08C295.526,118.612 295.932,118.219 296.41,117.93L376.19,256.1L296.39,394.31C295.912,394.021 295.506,393.628 295.2,393.16L295.13,393.06L277,361.72C276.476,360.712 276.476,359.508 277,358.5L335.06,257.85C335.38,257.322 335.549,256.717 335.55,256.1L335.63,256.1Z" style="fill:rgb(71,136,199);fill-rule:nonzero;"/>
<path id="path104" d="M415.68,256.1C415.679,256.717 415.51,257.322 415.19,257.85L337.06,393.16C336.436,394.16 335.338,394.769 334.16,394.77L298.16,394.77C297.549,394.766 296.947,394.612 296.41,394.32L376.19,256.1L396.19,221.48L415.19,254.39C415.504,254.905 415.674,255.496 415.68,256.1ZM396.2,221.44L376.2,256.06L296.39,117.92C296.927,117.628 297.529,117.474 298.14,117.47L334.14,117.47C335.318,117.471 336.416,118.08 337.04,119.08L396.2,221.44Z" style="fill:rgb(152,204,253);fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80" width="80px" height="80px">
<g id="surface100804718">
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(87.450981%,94.117647%,99.607843%);fill-opacity:1;" d="M 3.132812 71.585938 L 5.949219 62.457031 L 29.597656 38.808594 L 28.410156 37.625 C 27.574219 36.789062 27.117188 35.679688 27.117188 34.496094 C 27.117188 33.3125 27.574219 32.203125 28.410156 31.363281 L 30.335938 29.441406 L 30.285156 28.964844 C 30.1875 28.074219 30.140625 27.246094 30.140625 26.429688 C 30.140625 13.511719 40.652344 3.003906 53.570312 3.003906 L 54.234375 3.011719 C 66.445312 3.347656 76.652344 13.554688 76.988281 25.765625 C 77.167969 32.152344 74.816406 38.191406 70.367188 42.765625 C 65.914062 47.339844 59.953125 49.859375 53.570312 49.859375 C 52.757812 49.859375 51.929688 49.8125 51.035156 49.714844 L 50.558594 49.664062 L 48.636719 51.585938 C 47.800781 52.421875 46.6875 52.882812 45.507812 52.882812 C 44.324219 52.882812 43.210938 52.421875 42.375 51.585938 L 41.191406 50.402344 L 36.59375 55 L 29 55 L 29 62.59375 L 26.59375 65 L 19 65 L 19 72.59375 L 17.523438 74.070312 L 8.417969 76.867188 Z M 53.941406 11 C 49.917969 11 46.136719 12.566406 43.292969 15.410156 L 42.585938 16.121094 L 63.882812 37.414062 L 64.589844 36.707031 C 67.433594 33.863281 69 30.082031 69 26.058594 C 69 22.039062 67.433594 18.257812 64.589844 15.410156 C 61.746094 12.566406 57.964844 11 53.941406 11 Z M 53.941406 11 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(27.843139%,53.333336%,78.039217%);fill-opacity:1;" d="M 53.570312 4 C 53.785156 4 53.996094 4.003906 54.207031 4.007812 C 65.894531 4.332031 75.667969 14.101562 75.988281 25.789062 C 76.160156 31.90625 73.90625 37.6875 69.648438 42.0625 C 65.390625 46.445312 59.679688 48.855469 53.570312 48.855469 C 52.792969 48.855469 51.996094 48.8125 51.144531 48.71875 L 50.191406 48.617188 L 49.515625 49.292969 L 47.933594 50.878906 C 47.285156 51.527344 46.425781 51.882812 45.507812 51.882812 C 44.59375 51.882812 43.730469 51.527344 43.085938 50.878906 L 41.195312 48.988281 L 39.78125 50.402344 L 36.179688 54 L 28 54 L 28 62.179688 L 26.179688 64 L 18 64 L 18 72.179688 L 16.992188 73.1875 L 8.699219 75.734375 L 4.265625 71.304688 L 6.828125 62.988281 L 29.597656 40.222656 L 31.011719 38.808594 L 29.597656 37.394531 L 29.121094 36.921875 C 28.472656 36.273438 28.117188 35.410156 28.117188 34.496094 C 28.117188 33.578125 28.472656 32.71875 29.121094 32.070312 L 31.378906 29.8125 L 31.277344 28.859375 C 31.1875 28.007812 31.140625 27.210938 31.140625 26.433594 C 31.140625 14.0625 41.203125 4 53.570312 4 M 63.882812 38.828125 L 65.296875 37.414062 C 68.328125 34.382812 70 30.347656 70 26.058594 C 70 21.769531 68.328125 17.734375 65.296875 14.703125 C 62.265625 11.671875 58.230469 10 53.941406 10 C 49.652344 10 45.621094 11.671875 42.585938 14.703125 L 41.171875 16.117188 L 63.882812 38.828125 M 53.570312 2 C 40.078125 2 29.140625 12.9375 29.140625 26.429688 C 29.140625 27.320312 29.195312 28.203125 29.289062 29.070312 L 27.707031 30.652344 C 25.585938 32.773438 25.585938 36.210938 27.707031 38.332031 L 28.183594 38.808594 L 5.066406 61.925781 L 2 71.867188 L 8.136719 78 L 18.054688 74.953125 L 20 73.007812 L 20 66 L 27.007812 66 L 30 63.007812 L 30 56 L 37.007812 56 L 41.191406 51.816406 L 41.664062 52.292969 C 42.726562 53.355469 44.117188 53.882812 45.503906 53.882812 C 46.894531 53.882812 48.28125 53.355469 49.34375 52.292969 L 50.925781 50.710938 C 51.792969 50.804688 52.675781 50.859375 53.566406 50.859375 C 67.289062 50.859375 78.371094 39.542969 77.984375 25.734375 C 77.632812 12.988281 67.007812 2.363281 54.261719 2.011719 C 54.03125 2.003906 53.800781 2 53.570312 2 Z M 63.882812 36 L 44 16.117188 C 46.746094 13.371094 50.34375 12 53.941406 12 C 57.539062 12 61.136719 13.371094 63.882812 16.117188 C 69.371094 21.609375 69.371094 30.511719 63.882812 36 Z M 63.882812 36 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(59.607846%,80.000001%,99.215686%);fill-opacity:1;" d="M 33.90625 43.507812 L 11.707031 65.707031 C 11.316406 66.097656 10.683594 66.097656 10.292969 65.707031 C 9.902344 65.316406 9.902344 64.683594 10.292969 64.292969 L 32.492188 42.09375 C 32.882812 41.703125 33.515625 41.703125 33.90625 42.09375 C 34.296875 42.484375 34.296875 43.117188 33.90625 43.507812 Z M 33.90625 43.507812 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(27.843139%,53.333336%,78.039217%);fill-opacity:1;" d="M 29.195312 39.839844 L 30.609375 38.425781 L 41.253906 49.070312 L 39.839844 50.484375 Z M 29.195312 39.839844 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(59.607846%,80.000001%,99.215686%);fill-opacity:1;" d="M 64 79 C 61.800781 78 49.199219 72.199219 49 49.800781 L 64 45 L 79 49.800781 C 78.800781 72.199219 66.199219 78 64 79 Z M 64 79 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(27.843139%,53.333336%,78.039217%);fill-opacity:1;" d="M 64 46 L 78 50.398438 C 77.601562 70.398438 66.800781 76.398438 64 77.601562 C 61.199219 76.398438 50.601562 70.398438 50 50.398438 L 64 46 M 64 44 L 48 49.199219 C 48 74.800781 64 80 64 80 C 64 80 80 74.800781 80 49.199219 Z M 64 44 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(87.450981%,94.117647%,99.607843%);fill-opacity:1;" d="M 64 73.199219 C 61 71.199219 55.199219 65.800781 54.199219 53.398438 L 64 50.398438 L 73.800781 53.601562 C 72.800781 66 67 71.199219 64 73.199219 Z M 64 73.199219 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 175 175" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
<g transform="matrix(1,0,0,1,2.5,2.5)">
<circle cx="85" cy="85" r="63" style="fill:white;stroke:rgb(71,136,199);stroke-width:44px;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 565 B

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 100 92" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g id="path2606" transform="matrix(0.46875,0,0,-0.46875,45,7.32797)">
<path d="M0,0L0,-180L32,-164.939L32,15.633L0,0Z" style="fill:rgb(152,204,253);fill-rule:nonzero;stroke:rgb(71,136,199);stroke-width:2.13px;"/>
</g>
<g id="path2610">
<path d="M15,59.59C15,48.961 26.581,40.011 42.367,37.278L42.367,27.751C18.222,30.669 0,43.814 0,59.59C0,75.935 19.559,89.454 45,91.703L45,82.299C27.883,80.154 15,70.802 15,59.59ZM78.143,42.681C73.811,40.172 68.512,38.296 62.633,37.278L62.633,27.755C72.886,28.994 82.073,32.072 89.248,36.419L96.948,32.078L99.018,53.577L70.011,47.265L78.143,42.681Z" style="fill:rgb(223,240,254);fill-rule:nonzero;"/>
<path d="M15,59.59C15,48.961 26.581,40.011 42.367,37.278L42.367,27.751C18.222,30.669 0,43.814 0,59.59C0,75.935 19.559,89.454 45,91.703L45,82.299C27.883,80.154 15,70.802 15,59.59ZM13.374,59.59C13.374,64.491 15.584,69.086 19.484,72.962C24.8,78.246 33.317,82.206 43.374,83.717C43.374,83.717 43.374,89.908 43.374,89.908C29.279,88.351 17.172,83.261 9.63,76.126C4.599,71.365 1.626,65.701 1.626,59.59C1.626,53.697 4.392,48.217 9.102,43.564C16.136,36.616 27.447,31.525 40.741,29.606C40.741,29.606 40.741,35.927 40.741,35.927C31.473,37.761 23.725,41.712 18.905,46.815C15.366,50.562 13.374,54.937 13.374,59.59ZM78.143,42.681C73.811,40.172 68.512,38.296 62.633,37.278L62.633,27.755C72.886,28.994 82.073,32.072 89.248,36.419L96.948,32.078L99.018,53.577L70.011,47.265L78.143,42.681ZM78.941,44.097C79.449,43.81 79.765,43.273 79.768,42.69C79.772,42.107 79.462,41.566 78.957,41.274C74.809,38.871 69.805,37.023 64.259,35.926C64.259,35.926 64.259,29.61 64.259,29.61C73.528,30.948 81.834,33.828 88.406,37.81C88.908,38.114 89.535,38.124 90.046,37.835L95.569,34.722C95.569,34.722 97.186,51.514 97.186,51.514C97.186,51.514 74.529,46.585 74.529,46.585C74.529,46.585 78.941,44.097 78.941,44.097Z" style="fill:rgb(71,136,199);"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" width="80px" height="80px"><path fill="#fff" d="M1.5 13.5H38.5V26.5H1.5z"/><path fill="#4788c7" d="M38,14v12H2V14H38 M39,13H1v14h38V13L39,13z"/><path fill="#b6dcfe" d="M5 17H27V23H5z"/><path fill="none" stroke="#4788c7" stroke-linecap="round" stroke-miterlimit="10" d="M34.5 5.5h-1.333c-1.473 0-2.667 1.194-2.667 2.667v23.667c0 1.473 1.194 2.667 2.667 2.667H34.5M26.5 5.5h1.333c1.473 0 2.667 1.194 2.667 2.667v23.667c0 1.473-1.194 2.667-2.667 2.667H26.5"/></svg>

After

Width:  |  Height:  |  Size: 523 B

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g id="surface100778921">
<g transform="matrix(1,0,0,1,1,0)">
<path d="M23.5,10C35.366,10 45,16.273 45,24C45,31.727 35.366,38 23.5,38C21.202,38 4,43 4,43L6,34C6,34 2,27.591 2,24C2,16.273 11.634,10 23.5,10Z" style="fill:rgb(223,240,254);"/>
</g>
<path d="M21.488,24.129C21.555,27.863 27.234,27.82 27.199,24.082L27.199,24.031C27.137,20.273 21.426,20.363 21.488,24.129Z" style="fill:rgb(71,136,199);fill-rule:nonzero;"/>
<path d="M12.441,24.129C12.465,25.695 13.77,26.949 15.344,26.926C16.875,26.926 18.164,25.66 18.148,24.078L18.148,24.039C18.098,20.285 12.383,20.363 12.441,24.129Z" style="fill:rgb(71,136,199);fill-rule:nonzero;"/>
<path d="M30.539,24.129C30.563,25.695 31.867,26.949 33.438,26.926C35.012,26.918 36.266,25.637 36.246,24.078L36.246,24.039C36.191,20.285 30.48,20.363 30.539,24.129Z" style="fill:rgb(71,136,199);fill-rule:nonzero;"/>
<path d="M40.535,11.688C34.121,7.469 25.602,6.512 18.523,7.781C10.605,0.18 1.73,3.672 0,4.68C0,4.68 6.09,9.832 5.102,14.344C-2.109,21.66 1.316,29.809 5.102,33.652C6.094,38.164 0,43.316 0,43.316C1.715,44.328 10.563,47.813 18.527,40.25C25.59,41.516 34.109,40.563 40.535,36.336C50.473,30.02 50.508,18.035 40.535,11.688ZM24.512,36.297C22.031,36.305 19.566,35.984 17.172,35.352L15.523,36.938C14.609,37.82 13.578,38.586 12.477,39.207C11.133,39.879 9.668,40.297 8.164,40.43C8.246,40.285 8.32,40.133 8.395,39.996C10.043,36.953 10.488,34.23 9.73,31.809C7.02,29.688 5.395,26.969 5.395,24C5.395,17.199 13.957,11.688 24.516,11.688C35.07,11.688 43.633,17.199 43.633,24C43.629,30.797 35.066,36.297 24.512,36.297Z" style="fill:rgb(71,136,199);fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 109 105" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
<g transform="matrix(1,0,0,1,-100.5,0.5)">
<path d="M111.1,101.044C149.869,109.584 202.903,89.9 202.903,89.9C202.903,89.9 192.718,72.842 185.955,64.965C178.736,56.557 159.591,39.452 159.591,39.452C159.591,39.452 191.454,68.807 181.208,83.471C172.443,96.016 154.44,99.138 111.1,101.044ZM135,3C109,33 101,89 101,89C101,89 120.851,88.186 131,86C141.833,83.667 166,75 166,75C166,75 125,89 117,73C110.156,59.311 116,42 135,3ZM208.661,73.549C196.413,35.787 152.603,0 152.603,0C152.603,0 143.042,17.416 139.669,27.234C136.068,37.715 131,62.883 131,62.883C131,62.883 140.201,20.547 158.033,21.966C173.289,23.18 185.09,37.129 208.661,73.549Z" style="fill:rgb(152,204,253);stroke:rgb(71,136,199);stroke-width:1px;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -1 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" width="40px" height="40px"><path fill="#dff0fe" d="M10,37.5c-4.136,0-7.5-3.364-7.5-7.5V10c0-4.136,3.364-7.5,7.5-7.5h20c4.136,0,7.5,3.364,7.5,7.5v20 c0,4.136-3.364,7.5-7.5,7.5H10z"/><path fill="#4788c7" d="M30,3c3.86,0,7,3.14,7,7v20c0,3.86-3.14,7-7,7H10c-3.86,0-7-3.14-7-7V10c0-3.86,3.14-7,7-7H30 M30,2H10c-4.418,0-8,3.582-8,8v20c0,4.418,3.582,8,8,8h20c4.418,0,8-3.582,8-8V10C38,5.582,34.418,2,30,2L30,2z"/><polygon fill="#fff" points="24,28 12,28 12,10 30,10 30,22"/><path fill="#98ccfd" d="M10.257,9.649L9.064,12.83C9.022,12.942,9,13.061,9,13.181V28c0,0.552,0.448,1,1,1h5v2 c0,0.552,0.448,1,1,1h1.086c0.265,0,0.52-0.105,0.707-0.293L20.5,29h4.086c0.265,0,0.52-0.105,0.707-0.293l5.414-5.414 C30.895,23.105,31,22.851,31,22.586V10c0-0.552-0.448-1-1-1H11.193C10.776,9,10.403,9.259,10.257,9.649z M13,11h16v11l-3,3h-6l-3,3 v-3h-4V11z M18,15v6h2v-6H18z M23,15v6h2v-6H23z"/></svg> <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 96 96" width="96px" height="96px">
<g id="surface100548424">
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(27.843139%,53.333336%,78.039217%);fill-opacity:1;" d="M 83.507812 55.914062 L 66.597656 75.3125 C 66.21875 75.75 65.667969 76 65.089844 76 L 52.738281 76 C 52.261719 76 51.800781 76.171875 51.4375 76.480469 L 38.5625 87.519531 C 38.199219 87.828125 37.738281 88 37.261719 88 L 34 88 C 32.894531 88 32 87.105469 32 86 L 32 78 C 32 76.894531 31.105469 76 30 76 L 14 76 C 12.894531 76 12 75.105469 12 74 L 12 31.886719 C 12 31.574219 12.070312 31.269531 12.210938 30.988281 L 20.175781 15.105469 C 20.515625 14.429688 21.207031 14 21.960938 14 L 82 14 C 83.105469 14 84 14.894531 84 16 L 84 54.601562 C 84 55.085938 83.824219 55.550781 83.507812 55.914062 Z M 83.507812 55.914062 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.039216%,98.039216%,98.039216%);fill-opacity:1;" d="M 78 52.738281 C 74.664062 56.492188 71.335938 60.246094 68 64 C 63.335938 64 58.664062 64 54 64 C 49.335938 68 44.664062 72 40 76 C 40 72 40 68 40 64 C 34.664062 63.984375 29.335938 63.96875 24 63.953125 C 24 49.300781 24 34.648438 24 20 C 42 20 60 20 78 20 C 78 30.910156 78 41.824219 78 52.738281 Z M 78 52.738281 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(27.843139%,53.333336%,78.039217%);fill-opacity:1;" d="M 42 32 L 48 32 L 48 52 L 42 52 Z M 42 32 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(27.843139%,53.333336%,78.039217%);fill-opacity:1;" d="M 60 32 L 66 32 L 66 52 L 60 52 Z M 60 32 "/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 933 B

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -1443,5 +1443,11 @@
"admin.utilities.exportHint": "Export content to tarball for backup / migration.", "admin.utilities.exportHint": "Export content to tarball for backup / migration.",
"admin.utilities.importHint": "Import content from a tarball backup or a 2.X backup.", "admin.utilities.importHint": "Import content from a tarball backup or a 2.X backup.",
"admin.utilities.flushCache": "Flush Cache", "admin.utilities.flushCache": "Flush Cache",
"admin.utilities.flushCacheHint": "Pages and Assets are cached to disk for better performance. You can flush the cache to force all content to be fetched from the DB again." "admin.utilities.flushCacheHint": "Pages and Assets are cached to disk for better performance. You can flush the cache to force all content to be fetched from the DB again.",
"admin.auth.enabledForced": "This strategy cannot be disabled.",
"admin.auth.enabled": "Enabled",
"admin.auth.enabledHint": "Should this strategy be available to sites for login.",
"admin.auth.vendor": "Vendor",
"admin.auth.vendorWebsite": "Website",
"admin.auth.status": "Status"
} }

@ -33,11 +33,11 @@ q-page.admin-mail
dark dark
) )
q-item( q-item(
v-for='str of state.activeStrategies' v-for='str of combinedActiveStrategies'
:key='str.key' :key='str.key'
active-class='bg-primary text-white' active-class='bg-primary text-white'
:active='state.selectedStrategy === str.key' :active='state.selectedStrategy === str.id'
@click='state.selectedStrategy = str.key' @click='state.selectedStrategy = str.id'
clickable clickable
) )
q-item-section(side) q-item-section(side)
@ -54,54 +54,159 @@ q-page.admin-mail
icon='las la-plus' icon='las la-plus'
:label='t(`admin.auth.addStrategy`)' :label='t(`admin.auth.addStrategy`)'
) )
q-menu(auto-close) q-menu(auto-close, fit, max-width='300px')
q-list(style='min-width: 350px;') q-list(separator)
q-item(clickable) q-item(
.col Doude v-for='str of availableStrategies'
:key='str.key'
clickable
@click='addStrategy(str)'
)
q-item-section(avatar)
q-avatar(
rounded
color='dark'
text-color='white'
)
q-icon(
:name='`img:` + str.icon'
)
q-item-section
q-item-label: strong {{str.title}}
q-item-label(caption, lines='2') {{str.description}}
.col
q-card.shadow-1.q-pb-sm
q-card-section
.text-subtitle1 {{t('admin.storage.contentTypes')}}
.text-body2.text-grey {{ t('admin.storage.contentTypesHint') }}
//- v-flex(lg3, xs12) //- -----------------------
//- v-card.animated.fadeInUp //- Configuration
//- v-toolbar(flat, color='teal', dark, dense) //- -----------------------
//- .subtitle-1 {{$t('admin.auth.activeStrategies')}} q-card.shadow-1.q-pb-sm.q-mt-md
//- v-list(two-line, dense).py-0 q-card-section
//- draggable( .text-subtitle1 {{t('admin.storage.config')}}
//- v-model='activeStrategies' q-banner.q-mt-md(
//- handle='.is-handle' v-if='!state.strategy.config || Object.keys(state.strategy.config).length < 1'
//- direction='vertical' rounded
//- ) :class='$q.dark.isActive ? `bg-negative text-white` : `bg-grey-2 text-grey-7`'
//- transition-group ) {{t('admin.storage.noConfigOption')}}
//- v-list-item( template(
//- v-for='(str, idx) in activeStrategies' v-for='(cfg, cfgKey, idx) in state.strategy.config'
//- :key='str.key' )
//- @click='selectedStrategy = str.key' template(
//- :class='selectedStrategy === str.key ? ($vuetify.theme.dark ? `grey darken-5` : `teal lighten-5`) : ``' v-if='configIfCheck(cfg.if)'
//- ) )
//- v-list-item-avatar.is-handle(size='24') q-separator.q-my-sm(inset, v-if='idx > 0')
//- v-icon(:color='selectedStrategy === str.key ? `teal` : `grey`') mdi-drag-horizontal q-item(v-if='cfg.type === `boolean`', tag='label')
//- v-list-item-content blueprint-icon(:icon='cfg.icon', :hue-rotate='cfg.readOnly ? -45 : 0')
//- v-list-item-title.body-2(:class='selectedStrategy === str.key ? `teal--text` : ``') {{ str.displayName }} q-item-section
//- v-list-item-subtitle: .caption(:class='selectedStrategy === str.key ? `teal--text ` : ``') {{ str.strategy.title }} q-item-label {{cfg.title}}
//- v-list-item-avatar(v-if='selectedStrategy === str.key', size='24') q-item-label(caption) {{cfg.hint}}
//- v-icon.animated.fadeInLeft(color='teal', large) mdi-chevron-right q-item-section(avatar)
//- v-card-chin q-toggle(
//- v-menu(offset-y, bottom, min-width='250px', max-width='550px', max-height='50vh', style='flex: 1 1;', center) v-model='cfg.value'
//- template(v-slot:activator='{ on }') color='primary'
//- v-btn(v-on='on', color='primary', depressed, block) checked-icon='las la-check'
//- v-icon(left) mdi-plus unchecked-icon='las la-times'
//- span {{$t('admin.auth.addStrategy')}} :aria-label='t(`admin.general.allowComments`)'
//- v-list(dense) :disable='cfg.readOnly'
//- template(v-for='(str, idx) of strategies') )
//- v-list-item( q-item(v-else)
//- :key='str.key' blueprint-icon(:icon='cfg.icon', :hue-rotate='cfg.readOnly ? -45 : 0')
//- :disabled='str.isDisabled' q-item-section
//- @click='addStrategy(str)' q-item-label {{cfg.title}}
//- ) q-item-label(caption) {{cfg.hint}}
//- v-list-item-avatar(height='24', width='48', tile) q-item-section(
//- v-img(:src='str.logo', width='48px', height='24px', contain, :style='str.isDisabled ? `opacity: .25;` : ``') :style='cfg.type === `number` ? `flex: 0 0 150px;` : ``'
//- v-list-item-content :class='{ "col-auto": cfg.enum && cfg.enumDisplay === `buttons` }'
//- v-list-item-title {{str.title}} )
//- v-list-item-subtitle: .caption(:style='str.isDisabled ? `opacity: .4;` : ``') {{str.description}} q-btn-toggle(
//- v-divider(v-if='idx < strategies.length - 1') v-if='cfg.enum && cfg.enumDisplay === `buttons`'
v-model='cfg.value'
push
glossy
no-caps
toggle-color='primary'
:options='cfg.enum'
:disable='cfg.readOnly'
)
q-select(
v-else-if='cfg.enum'
outlined
v-model='cfg.value'
:options='cfg.enum'
emit-value
map-options
dense
options-dense
:aria-label='cfg.title'
:disable='cfg.readOnly'
)
q-input(
v-else
outlined
v-model='cfg.value'
dense
:type='cfg.multiline ? `textarea` : `input`'
:aria-label='cfg.title'
:disable='cfg.readOnly'
)
.col-auto(v-if='state.selectedStrategy && state.strategy')
//- -----------------------
//- Infobox
//- -----------------------
q-card.rounded-borders.q-pb-md(style='width: 350px;')
q-card-section
.text-subtitle1 {{state.strategy.strategy.title}}
q-img.q-mt-sm.rounded-borders(
:src='state.strategy.strategy.logo'
fit='cover'
no-spinner
)
.text-body2.q-mt-md {{state.strategy.strategy.description}}
q-separator.q-mb-sm(inset)
q-item
q-item-section
q-item-label.text-grey {{t(`admin.auth.vendor`)}}
q-item-label {{state.strategy.strategy.vendor}}
q-separator.q-my-sm(inset)
q-item
q-item-section
q-item-label.text-grey {{t(`admin.auth.vendorWebsite`)}}
q-item-label: a(:href='state.strategy.strategy.website', target='_blank', rel='noreferrer') {{state.strategy.strategy.website}}
//- -----------------------
//- Status
//- -----------------------
q-card.rounded-borders.q-pb-md.q-mt-md(style='width: 350px;')
q-card-section
.text-subtitle1 {{t(`admin.auth.status`)}}
q-item(tag='label')
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-section(avatar)
q-toggle(
v-model='state.strategy.isEnabled'
:disable='state.strategy.strategy.key === `local`'
color='primary'
checked-icon='las la-check'
unchecked-icon='las la-times'
:aria-label='t(`admin.auth.enabled`)'
)
q-separator.q-my-sm(inset)
q-item
q-item-section
q-btn.acrylic-btn(
icon='las la-trash-alt'
flat
color='negative'
:disable='state.strategy.strategy.key === `local`'
label='Delete Strategy'
)
//- v-flex(xs12, lg9) //- v-flex(xs12, lg9)
//- v-card.animated.fadeInUp.wait-p2s //- v-card.animated.fadeInUp.wait-p2s
@ -263,7 +368,7 @@ q-page.admin-mail
<script setup> <script setup>
import gql from 'graphql-tag' import gql from 'graphql-tag'
import { find, reject } from 'lodash-es' import { find, reject, transform } from 'lodash-es'
import { v4 as uuid } from 'uuid' import { v4 as uuid } from 'uuid'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
@ -273,8 +378,6 @@ import { computed, onMounted, reactive, watch, nextTick } from 'vue'
import { useAdminStore } from 'src/stores/admin' import { useAdminStore } from 'src/stores/admin'
import { useSiteStore } from 'src/stores/site' import { useSiteStore } from 'src/stores/site'
import draggable from 'vuedraggable'
// QUASAR // QUASAR
const $q = useQuasar() const $q = useQuasar()
@ -300,59 +403,7 @@ const state = reactive({
loading: 0, loading: 0,
groups: [], groups: [],
strategies: [], strategies: [],
activeStrategies: [ activeStrategies: [],
{
key: 'local',
strategy: {
key: 'local',
title: 'Username-Password Authentication',
description: '',
useForm: true,
icon: '/_assets/icons/ultraviolet-data-protection.svg',
website: ''
},
config: [],
isEnabled: true,
displayName: 'Local Database',
selfRegistration: false,
domainWhitelist: '',
autoEnrollGroups: []
},
{
key: 'google',
strategy: {
key: 'google',
title: 'Google',
description: '',
useForm: true,
icon: '/_assets/icons/ultraviolet-google.svg',
website: ''
},
config: [],
isEnabled: true,
displayName: 'Google',
selfRegistration: false,
domainWhitelist: '',
autoEnrollGroups: []
},
{
key: 'slack',
strategy: {
key: 'slack',
title: 'Slack',
description: '',
useForm: true,
icon: '/_assets/icons/ultraviolet-slack.svg',
website: ''
},
config: [],
isEnabled: false,
displayName: 'Slack',
selfRegistration: false,
domainWhitelist: '',
autoEnrollGroups: []
}
],
selectedStrategy: '', selectedStrategy: '',
host: '', host: '',
strategy: { strategy: {
@ -360,39 +411,93 @@ const state = reactive({
} }
}) })
// COMPUTED
const availableStrategies = computed(() => {
return state.strategies.filter(str => str.key !== 'local')
})
const combinedActiveStrategies = computed(() => {
return state.activeStrategies.map(str => ({
...str,
strategy: find(state.strategies, ['key', str.strategy?.key]) || {}
}))
})
// WATCHERS // WATCHERS
watch(() => state.selectedStrategy, (newValue, oldValue) => { watch(() => state.selectedStrategy, (newValue, oldValue) => {
state.strategy = find(state.activeStrategies, ['key', newValue]) || {} const str = find(combinedActiveStrategies.value, ['id', newValue]) || {}
str.config = transform(str.strategy.props, (cfg, v, k) => {
cfg[k] = {
...v,
value: str.config[k]
}
}, {})
state.strategy = str
}) })
watch(() => state.activeStrategies, (newValue, oldValue) => { watch(() => state.activeStrategies, (newValue, oldValue) => {
state.selectedStrategy = 'local' state.selectedStrategy = newValue[0]?.id
}) })
// METHODS // METHODS
async function refresh () { async function load () {
await this.$apollo.queries.strategies.refetch() state.loading++
await this.$apollo.queries.activeStrategies.refetch() $q.loading.show()
this.$store.commit('showNotification', { const resp = await APOLLO_CLIENT.query({
message: this.$t('admin.auth.refreshSuccess'), query: gql`
style: 'success', query adminFetchAuthStrategies {
icon: 'cached' authStrategies {
key
props
title
description
isAvailable
useForm
usernameType
logo
color
vendor
website
icon
}
authActiveStrategies {
id
strategy {
key
}
displayName
isEnabled
config
selfRegistration
domainWhitelist
autoEnrollGroups
}
}
`,
fetchPolicy: 'network-only'
}) })
state.strategies = resp?.data?.authStrategies || []
state.activeStrategies = resp?.data?.authActiveStrategies || []
$q.loading.hide()
state.loading--
}
function configIfCheck (ifs) {
if (!ifs || ifs.length < 1) { return true }
return ifs.every(s => state.strategy.config[s.key]?.value === s.eq)
} }
function addStrategy (str) { function addStrategy (str) {
const newStr = { const newStr = {
key: uuid(), id: uuid(),
strategy: str, strategy: {
config: str.props.map(c => ({ key: str.key
key: c.key, },
value: { config: transform(str.props, (cfg, v, k) => {
...c, cfg[k] = v.default
value: c.default }, {}),
}
})),
order: state.activeStrategies.length,
isEnabled: true, isEnabled: true,
displayName: str.title, displayName: str.title,
selfRegistration: false, selfRegistration: false,
@ -401,12 +506,12 @@ function addStrategy (str) {
} }
state.activeStrategies = [...state.activeStrategies, newStr] state.activeStrategies = [...state.activeStrategies, newStr]
nextTick(() => { nextTick(() => {
state.selectedStrategy = newStr.key state.selectedStrategy = newStr.id
}) })
} }
function deleteStrategy () { function deleteStrategy (id) {
state.activeStrategies = reject(state.activeStrategies, ['key', state.strategy.key]) state.activeStrategies = reject(state.activeStrategies, ['id', id])
} }
async function save () { async function save () {
@ -551,4 +656,8 @@ async function save () {
// this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-auth-host-refresh') // this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-auth-host-refresh')
// } // }
// } // }
onMounted(() => {
load()
})
</script> </script>

@ -438,7 +438,7 @@ q-page.admin-storage
//- ----------------------- //- -----------------------
q-card.rounded-borders.q-pb-md.q-mt-md(style='width: 350px;') q-card.rounded-borders.q-pb-md.q-mt-md(style='width: 350px;')
q-card-section q-card-section
.text-subtitle1 Status .text-subtitle1 {{ t('admin.storage.status') }}
template(v-if='state.target.module !== `db` && !(state.target.setup && state.target.setup.handler && state.target.setup.state !== `configured`)') template(v-if='state.target.module !== `db` && !(state.target.setup && state.target.setup.handler && state.target.setup.state !== `configured`)')
q-item(tag='label') q-item(tag='label')
q-item-section q-item-section
@ -452,7 +452,7 @@ q-page.admin-storage
color='primary' color='primary'
checked-icon='las la-check' checked-icon='las la-check'
unchecked-icon='las la-times' unchecked-icon='las la-times'
:aria-label='t(`admin.general.allowSearch`)' :aria-label='t(`admin.storage.enabled`)'
) )
q-separator.q-my-sm(inset) q-separator.q-my-sm(inset)
q-item q-item

Loading…
Cancel
Save