diff --git a/server/app/data.yml b/server/app/data.yml index 001f9aaa..17cd99f1 100644 --- a/server/app/data.yml +++ b/server/app/data.yml @@ -74,6 +74,10 @@ defaults: experimental: false authDebug: false sqlLog: false + userDefaults: + timezone: 'America/New_York' + dateFormat: 'YYYY-MM-DD' + timeFormat: '12h' # System defaults channel: NEXT cors: diff --git a/server/db/migrations/3.0.0.mjs b/server/db/migrations/3.0.0.mjs index 6bc284ce..1adbe492 100644 --- a/server/db/migrations/3.0.0.mjs +++ b/server/db/migrations/3.0.0.mjs @@ -509,6 +509,14 @@ export async function up (knex) { value: { locales: true } + }, + { + key: 'userDefaults', + value: { + timezone: 'America/New_York', + dateFormat: 'YYYY-MM-DD', + timeFormat: '12h' + } } ]) @@ -536,9 +544,6 @@ export async function up (knex) { footerExtra: '', pageExtensions: ['md', 'html', 'txt'], defaults: { - timezone: 'America/New_York', - dateFormat: 'YYYY-MM-DD', - timeFormat: '12h', tocDepth: { min: 1, max: 2 diff --git a/server/graph/resolvers/user.mjs b/server/graph/resolvers/user.mjs index 14305428..fba9a17d 100644 --- a/server/graph/resolvers/user.mjs +++ b/server/graph/resolvers/user.mjs @@ -79,6 +79,11 @@ export default { // return usr // }, + + async userDefaults (obj, args, context) { + return WIKI.config.userDefaults + }, + async lastLogins (obj, args, context, info) { return WIKI.db.users.query() .select('id', 'name', 'lastLoginAt') @@ -352,6 +357,20 @@ export default { WIKI.logger.warn(err) return generateError(err) } + }, + /** + * UPDATE USER DEFAULTS + */ + async updateUserDefaults (obj, args, context) { + WIKI.config.userDefaults = { + timezone: args.timezone, + dateFormat: args.dateFormat, + timeFormat: args.timeFormat + } + await WIKI.configSvc.saveToDb(['userDefaults']) + return { + operation: generateSuccess('User defaults saved successfully') + } } }, User: { diff --git a/server/graph/schemas/site.graphql b/server/graph/schemas/site.graphql index 8799c663..db87eef2 100644 --- a/server/graph/schemas/site.graphql +++ b/server/graph/schemas/site.graphql @@ -89,9 +89,6 @@ type SiteFeatures { } type SiteDefaults { - timezone: String - dateFormat: String - timeFormat: String tocDepth: PageTocDepth } @@ -206,9 +203,6 @@ input SiteFeaturesInput { } input SiteDefaultsInput { - timezone: String - dateFormat: String - timeFormat: String tocDepth: PageTocDepthInput } diff --git a/server/graph/schemas/user.graphql b/server/graph/schemas/user.graphql index e58fc104..3d85b4b0 100644 --- a/server/graph/schemas/user.graphql +++ b/server/graph/schemas/user.graphql @@ -16,6 +16,8 @@ extend type Query { id: UUID! ): User + userDefaults: UserDefaults + lastLogins: [UserLastLogin] userPermissions: [String] @@ -90,6 +92,12 @@ extend type Mutation { clearUserAvatar( id: UUID! ): DefaultResponse + + updateUserDefaults( + timezone: String! + dateFormat: String! + timeFormat: String! + ): DefaultResponse } # ----------------------------------------------- @@ -142,6 +150,12 @@ type UserAuth { config: JSON } +type UserDefaults { + timezone: String + dateFormat: String + timeFormat: String +} + type UserTokenResponse { operation: Operation jwt: String diff --git a/server/models/sites.mjs b/server/models/sites.mjs index 5522fae0..26be4363 100644 --- a/server/models/sites.mjs +++ b/server/models/sites.mjs @@ -58,9 +58,10 @@ export class Site extends Model { footerExtra: '', pageExtensions: ['md', 'html', 'txt'], defaults: { - timezone: 'America/New_York', - dateFormat: 'YYYY-MM-DD', - timeFormat: '12h' + tocDepth: { + min: 1, + max: 2 + } }, features: { ratings: false, diff --git a/server/models/users.mjs b/server/models/users.mjs index 7b018380..0140e542 100644 --- a/server/models/users.mjs +++ b/server/models/users.mjs @@ -588,10 +588,10 @@ export class User extends Model { }, prefs: { cvd: 'none', - timezone: 'America/New_York', + timezone: WIKI.config.userDefaults.timezone || 'America/New_York', appearance: 'site', - dateFormat: 'YYYY-MM-DD', - timeFormat: '12h' + dateFormat: WIKI.config.userDefaults.dateFormat || 'YYYY-MM-DD', + timeFormat: WIKI.config.userDefaults.timeFormat || '12h' } }) diff --git a/ux/public/_assets/icons/fluent-choose.svg b/ux/public/_assets/icons/fluent-choose.svg new file mode 100644 index 00000000..c446c752 --- /dev/null +++ b/ux/public/_assets/icons/fluent-choose.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ux/src/components/UserDefaultsMenu.vue b/ux/src/components/UserDefaultsMenu.vue new file mode 100644 index 00000000..ac43e71e --- /dev/null +++ b/ux/src/components/UserDefaultsMenu.vue @@ -0,0 +1,211 @@ + + + diff --git a/ux/src/i18n/locales/en.json b/ux/src/i18n/locales/en.json index 0fb15edf..cb87fa0a 100644 --- a/ux/src/i18n/locales/en.json +++ b/ux/src/i18n/locales/en.json @@ -882,6 +882,8 @@ "admin.users.darkModeHint": "Display the user interface using dark mode.", "admin.users.dateFormat": "Date Format", "admin.users.dateFormatHint": "How dates should be formatted when displayed to the user.", + "admin.users.defaults": "Manage User Defaults", + "admin.users.defaultsSaveSuccess": "User defaults saved successfully.", "admin.users.delete": "Delete User", "admin.users.deleteConfirmForeignNotice": "Note that you cannot delete a user that already created content. You must instead either deactivate the user or delete all content that was created by that user.", "admin.users.deleteConfirmReplaceWarn": "Any content (pages, uploads, comments, etc.) that was created by this user will be reassigned to the user selected below. It is recommended to create a dummy target user (e.g. Deleted User) if you don't want the content to be reassigned to any current active user.", @@ -1202,6 +1204,7 @@ "common.actions.update": "Update", "common.actions.upload": "Upload", "common.actions.view": "View", + "common.actions.viewDocs": "View Documentation", "common.clipboard.failure": "Failed to copy to clipboard.", "common.clipboard.success": "Copied to clipboard successfully.", "common.clipboard.uuid": "Copy UUID to clipboard.", diff --git a/ux/src/pages/AdminApi.vue b/ux/src/pages/AdminApi.vue index 65c165c6..3803ea95 100644 --- a/ux/src/pages/AdminApi.vue +++ b/ux/src/pages/AdminApi.vue @@ -19,17 +19,21 @@ q-page.admin-api icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/dev/api`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.acrylic-btn.q-mr-sm( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='refresh' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn.q-mr-sm( unelevated icon='las la-power-off' diff --git a/ux/src/pages/AdminAuth.vue b/ux/src/pages/AdminAuth.vue index 61cc57c1..be9e4b75 100644 --- a/ux/src/pages/AdminAuth.vue +++ b/ux/src/pages/AdminAuth.vue @@ -11,10 +11,12 @@ q-page.admin-mail icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/auth`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminEditors.vue b/ux/src/pages/AdminEditors.vue index ae452324..f4503367 100644 --- a/ux/src/pages/AdminEditors.vue +++ b/ux/src/pages/AdminEditors.vue @@ -11,17 +11,21 @@ q-page.admin-flags icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/editors`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='refresh' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminExtensions.vue b/ux/src/pages/AdminExtensions.vue index 57a58516..9b0c2f13 100644 --- a/ux/src/pages/AdminExtensions.vue +++ b/ux/src/pages/AdminExtensions.vue @@ -11,17 +11,21 @@ q-page.admin-extensions icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/system/extensions`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-separator(inset) .row.q-pa-md.q-col-gutter-md .col-12 diff --git a/ux/src/pages/AdminFlags.vue b/ux/src/pages/AdminFlags.vue index 1e336144..52cdfe0f 100644 --- a/ux/src/pages/AdminFlags.vue +++ b/ux/src/pages/AdminFlags.vue @@ -11,17 +11,21 @@ q-page.admin-flags icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/system/flags`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminGeneral.vue b/ux/src/pages/AdminGeneral.vue index 1357d656..c00efec7 100644 --- a/ux/src/pages/AdminGeneral.vue +++ b/ux/src/pages/AdminGeneral.vue @@ -11,17 +11,21 @@ q-page.admin-general icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/sites#general`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' @@ -336,57 +340,6 @@ q-page.admin-general q-card.q-pb-sm.q-mt-md(v-if='state.config.defaults') q-card-section .text-subtitle1 {{t('admin.general.defaults')}} - q-item - blueprint-icon(icon='timezone') - q-item-section - q-item-label {{t(`admin.general.defaultTimezone`)}} - q-item-label(caption) {{t(`admin.general.defaultTimezoneHint`)}} - q-item-section - q-select( - outlined - v-model='state.config.defaults.timezone' - :options='timezones' - option-value='value' - option-label='text' - emit-value - map-options - dense - options-dense - :virtual-scroll-slice-size='1000' - :aria-label='t(`admin.general.defaultTimezone`)' - ) - q-separator.q-my-sm(inset) - q-item - blueprint-icon(icon='calendar') - q-item-section - q-item-label {{t(`admin.general.defaultDateFormat`)}} - q-item-label(caption) {{t(`admin.general.defaultDateFormatHint`)}} - q-item-section - q-select( - outlined - v-model='state.config.defaults.dateFormat' - emit-value - map-options - dense - :aria-label='t(`admin.general.defaultDateFormat`)' - :options='dateFormats' - ) - q-separator.q-my-sm(inset) - q-item - blueprint-icon(icon='clock') - q-item-section - q-item-label {{t(`admin.general.defaultTimeFormat`)}} - q-item-label(caption) {{t(`admin.general.defaultTimeFormatHint`)}} - q-item-section.col-auto - q-btn-toggle( - v-model='state.config.defaults.timeFormat' - push - glossy - no-caps - toggle-color='primary' - :options='timeFormats' - ) - q-separator.q-my-sm(inset) q-item blueprint-icon(icon='depth') q-item-section @@ -589,26 +542,12 @@ const reasonForChangeModes = [ { value: 'optional', label: t('admin.general.reasonForChangeOptional') }, { value: 'required', label: t('admin.general.reasonForChangeRequired') } ] -const dateFormats = [ - { value: '', label: t('profile.localeDefault') }, - { value: 'DD/MM/YYYY', label: 'DD/MM/YYYY' }, - { value: 'DD.MM.YYYY', label: 'DD.MM.YYYY' }, - { value: 'MM/DD/YYYY', label: 'MM/DD/YYYY' }, - { value: 'YYYY-MM-DD', label: 'YYYY-MM-DD' }, - { value: 'YYYY/MM/DD', label: 'YYYY/MM/DD' } -] -const timeFormats = [ - { value: '12h', label: t('admin.general.defaultTimeFormat12h') }, - { value: '24h', label: t('admin.general.defaultTimeFormat24h') } -] const uploadConflictBehaviors = [ { value: 'overwrite', label: t('admin.general.uploadConflictBehaviorOverwrite') }, { value: 'reject', label: t('admin.general.uploadConflictBehaviorReject') }, { value: 'new', label: t('admin.general.uploadConflictBehaviorNew') } ] -const timezones = Intl.supportedValuesOf('timeZone') - const rulesTitle = [ val => /^[^<>"]+$/.test(val) || t('admin.general.siteTitleInvalidChars') ] @@ -664,9 +603,6 @@ async function load () { search } defaults { - timezone - dateFormat - timeFormat tocDepth { min max @@ -735,9 +671,6 @@ async function save () { search: state.config.features?.search ?? false }, defaults: { - timezone: state.config.defaults?.timezone ?? 'America/New_York', - dateFormat: state.config.defaults?.dateFormat ?? 'YYYY-MM-DD', - timeFormat: state.config.defaults?.timeFormat ?? '12h', tocDepth: { min: state.config.defaults?.tocDepth?.min ?? 1, max: state.config.defaults?.tocDepth?.max ?? 2 diff --git a/ux/src/pages/AdminGroups.vue b/ux/src/pages/AdminGroups.vue index 8da564b4..58cd0db4 100644 --- a/ux/src/pages/AdminGroups.vue +++ b/ux/src/pages/AdminGroups.vue @@ -20,16 +20,20 @@ q-page.admin-groups flat color='grey' type='a' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/groups`' target='_blank' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' + :aria-label='t(`common.actions.refresh`)' @click='load' :loading='state.loading > 0' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='las la-plus' diff --git a/ux/src/pages/AdminIcons.vue b/ux/src/pages/AdminIcons.vue index ba1d4cb9..aa0ed6c8 100644 --- a/ux/src/pages/AdminIcons.vue +++ b/ux/src/pages/AdminIcons.vue @@ -11,17 +11,21 @@ q-page.admin-icons icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/system/icons`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.acrylic-btn.q-mr-sm( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminInstances.vue b/ux/src/pages/AdminInstances.vue index 7c74e222..cd5d0663 100644 --- a/ux/src/pages/AdminInstances.vue +++ b/ux/src/pages/AdminInstances.vue @@ -11,17 +11,21 @@ q-page.admin-terminal icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/instances`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' - ) + ) + q-tooltip {{ t(`common.actions.refresh`) }} q-separator(inset) .q-pa-md.q-gutter-md q-card diff --git a/ux/src/pages/AdminLocale.vue b/ux/src/pages/AdminLocale.vue index b3754bbe..114252ac 100644 --- a/ux/src/pages/AdminLocale.vue +++ b/ux/src/pages/AdminLocale.vue @@ -20,17 +20,21 @@ q-page.admin-locale icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/localisation`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminLogin.vue b/ux/src/pages/AdminLogin.vue index f2bdea30..18b9043a 100644 --- a/ux/src/pages/AdminLogin.vue +++ b/ux/src/pages/AdminLogin.vue @@ -11,17 +11,21 @@ q-page.admin-login icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/auth`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminMail.vue b/ux/src/pages/AdminMail.vue index 6df55232..4b38bdf8 100644 --- a/ux/src/pages/AdminMail.vue +++ b/ux/src/pages/AdminMail.vue @@ -11,17 +11,21 @@ q-page.admin-mail icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/system/mail`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminNavigation.vue b/ux/src/pages/AdminNavigation.vue index 2c583a71..a797fd3d 100644 --- a/ux/src/pages/AdminNavigation.vue +++ b/ux/src/pages/AdminNavigation.vue @@ -11,17 +11,21 @@ q-page.admin-navigation icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/navigation`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminRendering.vue b/ux/src/pages/AdminRendering.vue index d4e658f4..ea892b73 100644 --- a/ux/src/pages/AdminRendering.vue +++ b/ux/src/pages/AdminRendering.vue @@ -22,6 +22,7 @@ q-page.admin-mail :loading='state.loading > 0' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminScheduler.vue b/ux/src/pages/AdminScheduler.vue index 47c9fc41..b6bb4ce7 100644 --- a/ux/src/pages/AdminScheduler.vue +++ b/ux/src/pages/AdminScheduler.vue @@ -29,17 +29,21 @@ q-page.admin-terminal icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/scheduler`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' - ) + ) + q-tooltip {{ t(`common.actions.refresh`) }} q-separator(inset) .q-pa-md.q-gutter-md template(v-if='state.displayMode === `scheduled`') diff --git a/ux/src/pages/AdminSecurity.vue b/ux/src/pages/AdminSecurity.vue index 0d0e37e2..c9eaf54c 100644 --- a/ux/src/pages/AdminSecurity.vue +++ b/ux/src/pages/AdminSecurity.vue @@ -11,17 +11,21 @@ q-page.admin-mail icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/system/security`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminSites.vue b/ux/src/pages/AdminSites.vue index 342a74d5..6cb4fd47 100644 --- a/ux/src/pages/AdminSites.vue +++ b/ux/src/pages/AdminSites.vue @@ -12,15 +12,19 @@ q-page.admin-locale flat color='grey' type='a' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/sites`' target='_blank' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' + :aria-label='t(`common.actions.refresh`)' @click='refresh' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='las la-plus' diff --git a/ux/src/pages/AdminStorage.vue b/ux/src/pages/AdminStorage.vue index 94129441..1cb89bc1 100644 --- a/ux/src/pages/AdminStorage.vue +++ b/ux/src/pages/AdminStorage.vue @@ -30,10 +30,12 @@ q-page.admin-storage icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/storage`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminSystem.vue b/ux/src/pages/AdminSystem.vue index e593bfde..b3bc6ee9 100644 --- a/ux/src/pages/AdminSystem.vue +++ b/ux/src/pages/AdminSystem.vue @@ -11,17 +11,21 @@ q-page.admin-system icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/system/`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn.acrylic-btn( ref='copySysInfoBtn' flat diff --git a/ux/src/pages/AdminTerminal.vue b/ux/src/pages/AdminTerminal.vue index b048c386..e0027789 100644 --- a/ux/src/pages/AdminTerminal.vue +++ b/ux/src/pages/AdminTerminal.vue @@ -37,10 +37,12 @@ q-page.admin-terminal icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/terminal`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-separator(inset) .q-pa-md.q-gutter-md q-card diff --git a/ux/src/pages/AdminTheme.vue b/ux/src/pages/AdminTheme.vue index 13c91933..5741f72f 100644 --- a/ux/src/pages/AdminTheme.vue +++ b/ux/src/pages/AdminTheme.vue @@ -12,16 +12,20 @@ q-page.admin-theme flat color='grey' type='a' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/theme`' target='_blank' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='mdi-check' diff --git a/ux/src/pages/AdminUsers.vue b/ux/src/pages/AdminUsers.vue index e13997cf..dcaf40ec 100644 --- a/ux/src/pages/AdminUsers.vue +++ b/ux/src/pages/AdminUsers.vue @@ -20,16 +20,29 @@ q-page.admin-groups flat color='grey' type='a' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/groups`' target='_blank' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' + :aria-label='t(`common.actions.refresh`)' @click='load' :loading='state.loading > 0' ) + q-tooltip {{ t(`common.actions.refresh`) }} + q-btn.q-mr-sm( + icon='las la-user-cog' + unelevated + color='secondary' + :aria-label='t(`admin.users.defaults`)' + @click='' + ) + q-tooltip {{ t(`admin.users.defaults`) }} + user-defaults-menu q-btn( unelevated icon='las la-plus' @@ -117,6 +130,7 @@ import { useAdminStore } from 'src/stores/admin' import { useSiteStore } from 'src/stores/site' import UserCreateDialog from '../components/UserCreateDialog.vue' +import UserDefaultsMenu from 'src/components/UserDefaultsMenu.vue' // QUASAR diff --git a/ux/src/pages/AdminUtilities.vue b/ux/src/pages/AdminUtilities.vue index 4042a223..1f1187a5 100644 --- a/ux/src/pages/AdminUtilities.vue +++ b/ux/src/pages/AdminUtilities.vue @@ -11,10 +11,12 @@ q-page.admin-utilities icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/admin/utilities`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-separator(inset) .q-pa-md.q-gutter-md q-card diff --git a/ux/src/pages/AdminWebhooks.vue b/ux/src/pages/AdminWebhooks.vue index c6f59c64..6a98203f 100644 --- a/ux/src/pages/AdminWebhooks.vue +++ b/ux/src/pages/AdminWebhooks.vue @@ -11,17 +11,21 @@ q-page.admin-webhooks icon='las la-question-circle' flat color='grey' + :aria-label='t(`common.actions.viewDocs`)' :href='siteStore.docsBase + `/system/webhooks`' target='_blank' type='a' ) + q-tooltip {{ t(`common.actions.viewDocs`) }} q-btn.acrylic-btn.q-mr-sm( icon='las la-redo-alt' flat color='secondary' :loading='state.loading > 0' + :aria-label='t(`common.actions.refresh`)' @click='load' ) + q-tooltip {{ t(`common.actions.refresh`) }} q-btn( unelevated icon='las la-plus'