improve admin resource management

This commit is contained in:
les 2021-07-01 12:19:44 +02:00
parent 2e85e0318b
commit 6c36739372
No known key found for this signature in database
GPG key ID: 352918250B012177
6 changed files with 110 additions and 148 deletions

View file

@ -4,7 +4,8 @@ All notable changes to this project will be documented in this file.
- fix AP resource removal
- improve AP resource UI
- fix Docker setup
- update deps
### 1.0 (alpha)
This release is a complete rewrite of frontend UI and many internals, main changes are:

View file

@ -13,8 +13,7 @@
dense :headers='instancesHeader'
@click:row='instanceSelected')
template(v-slot:item.blocked="{ item }")
v-icon(v-if='item.blocked') mdi-checkbox-intermediate
v-icon(v-else) mdi-checkbox-blank-outline
v-icon(@click='toggleBlock(item)') {{item.blocked ? 'mdi-checkbox-intermediate' : 'mdi-checkbox-blank-outline'}}
v-col(:span='11')
span {{$t('common.users')}}
@ -24,49 +23,39 @@
:search='usersFilter'
:hide-default-footer='users.length<5'
dense :headers='usersHeader')
//- template(v-slot:item.username="{item}")
//- a(:href='item.ap_id') {{item.object.preferredUsername}}
//- el-table-column(:label="$t('common.user')" width='150')
//- template(slot-scope='data')
//- span(slot='reference')
//- a(:href='data.row.object.id' target='_blank') {{data.row.object.name}}
//- small ({{data.row.object.preferredUsername}})
//- el-table-column(:label="$t('common.resources')" width='90')
//- template(slot-scope='data')
//- span {{data.row.resources.length}}
//- el-table-column(:label="$t('common.actions')" width='200')
//- template(slot-scope='data')
//- el-button-group
//- el-button(size='mini'
//- :type='data.row.blocked?"danger":"warning"'
//- @click='toggleUserBlock(data.row)') {{data.row.blocked?$t('admin.unblock'):$t('admin.block')}}
template(v-slot:item.blocked="{ item }")
v-icon(@click='toggleUserBlock(item)') {{item.blocked?'mdi-checkbox-intermediate':'mdi-checkbox-blank-outline'}}
div
v-card-title {{$t('common.resources')}}
v-data-table(:items='resources'
v-data-table(:items='resources' dense
:headers='resourcesHeader'
:hide-default-footer='resources.length<10'
)
//- el-table-column(:label="$t('common.event')")
//- template(slot-scope='data')
//- span {{data.row.event}}
//- el-table-column(:label="$t('common.resources')")
//- template(slot-scope='data')
//- span(:class='{disabled: data.row.hidden}' v-html='data.row.data.content')
//- el-table-column(:label="$t('common.user')" width='200')
//- template(slot-scope='data')
//- span(:class='{disabled: data.row.hidden}' v-html='data.row.data.actor')
//- el-table-column(:label="$t('common.actions')" width="150")
//- template(slot-scope='data')
//- el-dropdown
//- el-button(type="primary" icon="el-icon-arrow-down" size='mini') {{$t('common.moderation')}}
//- el-dropdown-menu(slot='dropdown')
//- el-dropdown-item(v-if='!data.row.hidden' icon='el-icon-remove' @click.native='hideResource(data.row, true)') {{$t('admin.hide_resource')}}
//- el-dropdown-item(v-else icon='el-icon-success' @click.native='hideResource(data.row, false)') {{$t('admin.show_resource')}}
//- el-dropdown-item(icon='el-icon-delete' @click.native='deleteResource(data.row)') {{$t('admin.delete_resource')}}
//- el-dropdown-item(icon='el-icon-lock' @click.native='toggleUserBlock(data.row.ap_user)') {{$t('admin.block_user')}}
:items-per-page='10')
template(v-slot:item.content='{ item }')
span(v-html='item.data.content')
template(v-slot:item.user='{ item }')
span {{item.ap_user.preferredUsername}}
template(v-slot:item.event='{ item }')
span {{item.event.title}}
template(v-slot:item.actions='{ item }')
v-menu(offset-y)
template(v-slot:activator="{ on }")
v-btn.mr-2(v-on='on' color='primary' small icon)
v-icon mdi-dots-vertical
v-list
v-list-item(v-if='!item.hidden' @click='hideResource(item, true)')
v-list-item-title <v-icon left>mdi-eye-off</v-icon> {{$t('admin.hide_resource')}}
v-list-item(v-else @click='hideResource(item, false)')
v-list-item-title <v-icon left>mdi-eye</v-icon> {{$t('admin.show_resource')}}
v-list-item(@click='deleteResource(item)')
v-list-item-title <v-icon left>mdi-delete</v-icon> {{$t('admin.delete_resource')}}
//- v-list-item(@click='toggleUserBlock(item.ap_user)')
//- v-list-item-title <v-icon left>mdi-lock</v-icon> {{$t('admin.block_user')}}
</template>
<script>
import { mapState, mapActions } from 'vuex'
import get from 'lodash/get'
export default {
name: 'Moderation',
@ -76,7 +65,8 @@ export default {
resources: [],
users: [],
usersHeader: [
{ value: 'object.preferredUsername', text: 'Name' }
{ value: 'object.preferredUsername', text: 'Name' },
{ value: 'blocked', text: 'Blocked' }
],
instancesHeader: [
{ value: 'domain', text: 'Domain' },
@ -85,44 +75,24 @@ export default {
{ value: 'users', text: 'known users' }
],
resourcesHeader: [
{ value: '', text: '' }
{ value: 'created', text: 'Created' },
{ value: 'event', text: 'Event' },
{ value: 'user', text: 'user' },
{ value: 'content', text: 'Content' },
{ value: 'actions', text: 'Actions' }
],
usersFilter: '',
instancesFilter: ''
}
},
computed: {
...mapState(['settings'])
// paginatedResources () {
// return this.resources.slice((this.resourcePage - 1) * this.perPage,
// this.resourcePage * this.perPage)
// },
// paginatedInstances () {
// return this.filteredInstances.slice((this.instancePage - 1) * this.perPage,
// this.instancePage * this.perPage)
// },
// filteredUsers () {
// if (!this.usersFilter) { return this.users }
// const usersFilter = this.usersFilter.toLowerCase()
// return this.users.filter(user => user.name.includes(usersFilter) || user.preferredName.includes(usersFilter))
// },
// filteredInstances () {
// if (!this.instancesFilter) { return this.instances }
// const instancesFilter = this.instancesFilter.toLowerCase()
// return this.instances.filter(instance =>
// (instance.name && instance.name.includes(instancesFilter)) ||
// (instance.domain && instance.domain.includes(instancesFilter))
// )
// },
// paginatedSelectedUsers () {
// return this.filteredUsers.slice((this.userPage - 1) * this.perPage,
// this.userPage * this.perPage)
// }
},
computed: mapState(['settings']),
async mounted () {
this.instances = await this.$axios.$get('/instances')
if (!this.instances.length) {
return
}
this.users = await this.$axios.$get(`/instances/${this.instances[0].domain}`)
this.resources = await this.$axios.$get('/resources')
// this.users = await this.$axios.$get('/users')
},
methods: {
...mapActions(['setSetting']),
@ -133,6 +103,7 @@ export default {
},
async instanceSelected (instance) {
this.users = await this.$axios.$get(`/instances/${instance.domain}`)
this.resources = await this.$axios.$get('/resources', { filters: { instance: instance.domain } })
},
async hideResource (resource, hidden) {
await this.$axios.$put(`/resources/${resource.id}`, { hidden })
@ -140,7 +111,7 @@ export default {
},
async toggleUserBlock (ap_user) {
if (!ap_user.blocked) {
const ret = await this.$root.$confirm('admin.user_block_confirm')
const ret = await this.$root.$confirm('admin.user_block_confirm', { user: get(ap_user, 'object.preferredUsername', ap_user.preferredUsername) })
if (!ret) { return }
}
await this.$axios.post('/instances/toggle_user_block', { ap_id: ap_user.ap_id })
@ -153,6 +124,10 @@ export default {
this.resources = this.resources.filter(r => r.id !== resource.id)
},
async toggleBlock (instance) {
if (!instance.blocked) {
const ret = await this.$root.$confirm('admin.instance_block_confirm', { instance: instance.domain })
if (!ret) { return }
}
await this.$axios.post('/instances/toggle_block', { instance: instance.domain, blocked: !instance.blocked })
instance.blocked = !instance.blocked
}

View file

@ -195,7 +195,8 @@
"resources": "Resources",
"user_blocked": "User {user} blocked",
"favicon": "Logo",
"user_block_confirm": "Are you sure you want block this user?",
"user_block_confirm": "Are you sure you want block user {user}?",
"instance_block_confirm": "Are you sure you want block instance {instance}?",
"delete_announcement_confirm": "Are you sure you want to remove the announcement?",
"announcement_remove_ok": "Announce removed",
"announcement_description": "In this section you can insert announcements to remain on the homepage",

View file

@ -191,15 +191,16 @@
"hide_resource": "Nascondi risorsa",
"show_resource": "Mostra risorsa",
"delete_resource": "Elimina risorsa",
"delete_resource_confirm": "Sei sicuro/a di voler eliminare questa risorsa?",
"delete_resource_confirm": "Sei sicurǝ di voler eliminare questa risorsa?",
"block_user": "Blocca questo utente",
"user_blocked": "L'utente {user} non potrà più aggiungere risorse",
"filter_instances": "Filtra istanze",
"filter_users": "Filtra utenti",
"instance_name": "Nome istanza",
"favicon": "Logo",
"user_block_confirm": "Sei sicuro/a di voler bloccare l'utente?",
"delete_announcement_confirm": "Sei sicuro/a di voler eliminare l'annuncio?",
"user_block_confirm": "Confermi di voler bloccare l'utente {user}?",
"instance_block_confirm": "Confermi di voler bloccare l'istanza {instance}?",
"delete_announcement_confirm": " Vuoieliminare questo l'annuncio?",
"announcement_remove_ok": "Annuncio rimosso",
"announcement_description": "In questa sezione puoi inserire annunci che rimarranno in homepage",
"instance_locale": "Lingua predefinita",
@ -216,7 +217,7 @@
"is_dark": "Tema scuro",
"add_link": "Aggiungi link",
"footer_links": "Collegamenti del piè di pagina",
"delete_footer_link_confirm": "Sei sicuro/a di eliminare questo collegamento?",
"delete_footer_link_confirm": "Vuoi eliminare questo collegamento?",
"edit_place": "Modifica luogo",
"new_announcement": "Nuovo annuncio"
},

View file

@ -1,4 +1,7 @@
const Resource = require('../models/resource')
const APUser = require('../models/ap_user')
const Event = require('../models/event')
const get = require('lodash/get')
const resourceController = {
async hide (req, res) {
@ -17,12 +20,28 @@ const resourceController = {
},
async getAll (req, res) {
const limit = req.body.limit || 100
const limit = req.body.limit || 1000
// const where = {}
// if (req.params.instanceId) {
// where =
//
const resources = await Resource.findAll({ limit })
let resources = await Resource.findAll({ limit, include: [APUser, Event], order: [['createdAt', 'DESC']] })
resources = resources.map(r => ({
id: r.id,
hidden: r.hidden,
created: r.createdAt,
data: {
content: r.data.content
},
event: {
id: r.event.id,
title: r.event.title
},
ap_user: {
ap_id: get(r, 'ap_user.ap_id', ''),
preferredUsername: get(r, 'ap_user.object.preferredUsername', '')
}
}))
res.json(resources)
}
}

105
yarn.lock
View file

@ -3712,16 +3712,11 @@ core-js-compat@^3.12.1, core-js-compat@^3.9.0, core-js-compat@^3.9.1:
browserslist "^4.16.6"
semver "7.0.0"
core-js@3.14.0, core-js@^3.6.5:
core-js@3.14.0, core-js@^2.6.5, core-js@^3.6.5:
version "3.14.0"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.14.0.tgz#62322b98c71cc2018b027971a69419e2425c2a6c"
integrity sha512-3s+ed8er9ahK+zJpp9ZtuVcDoFzHNiZsPbNAAE4KXgrRHbjSqqNN6xGSXq6bq7TZIbKj4NLrLb6bJ5i+vSVjHA==
core-js@^2.6.5:
version "2.6.12"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@ -3937,22 +3932,7 @@ css-tree@^1.1.2:
mdn-data "2.0.14"
source-map "^0.6.1"
css-what@2.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
css-what@^3.2.1:
version "3.4.2"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4"
integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
css-what@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233"
integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==
css-what@^5.0.0:
css-what@2.1, css-what@5.0.1, css-what@^3.2.1, css-what@^4.0.0, css-what@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad"
integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==
@ -5739,15 +5719,7 @@ github-from-package@0.0.0:
resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
glob-parent@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
dependencies:
is-glob "^3.1.0"
path-dirname "^1.0.0"
glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0:
glob-parent@5.1.2, glob-parent@^3.1.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@ -6341,10 +6313,10 @@ infer-owner@^1.0.3, infer-owner@^1.0.4:
resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
inflection@1.12.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416"
integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=
inflection@1.13.1:
version "1.13.1"
resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb"
integrity sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA==
inflight@^1.0.4:
version "1.0.6"
@ -6584,7 +6556,7 @@ is-extendable@^1.0.1:
dependencies:
is-plain-object "^2.0.4"
is-extglob@^2.1.0, is-extglob@^2.1.1:
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
@ -6616,13 +6588,6 @@ is-generator@^1.0.2:
resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3"
integrity sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=
is-glob@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
dependencies:
is-extglob "^2.1.0"
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
@ -8813,11 +8778,6 @@ path-browserify@0.0.1:
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
path-dirname@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@ -9670,10 +9630,10 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
indexes-of "^1.0.1"
uniq "^1.0.1"
postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
version "7.0.35"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
postcss@7.0.36, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
version "7.0.36"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb"
integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==
dependencies:
chalk "^2.4.2"
source-map "^0.6.1"
@ -9752,10 +9712,10 @@ prettier@^1.18.2:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
prettier@^2.3.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6"
integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==
prettier@^2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d"
integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==
pretty-bytes@^5.6.0:
version "5.6.0"
@ -10827,14 +10787,14 @@ sequelize-slugify@^1.5.0:
dependencies:
sluglife "^0.9.8"
sequelize@^6.6.2:
version "6.6.2"
resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.6.2.tgz#3681b0a4aeb106e31079d3a537d88542051dab2e"
integrity sha512-H/zrzmTK+tis9PJaSigkuXI57nKBvNCtPQol0yxCvau1iWLzSOuq8t3tMOVeQ+Ep8QH2HoD9/+FCCIAqzUr/BQ==
sequelize@^6.6.4:
version "6.6.4"
resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.6.4.tgz#616072aa5e7226db1050cc485942ee2fd04d475f"
integrity sha512-SOSu3tclOjHJfvuIITUlAsh2Q642gFxjpNN+IM1quFZ7jU5Pep7FIAwBK8UWgTpNc9TK9rUr1cyLB/G25CGicA==
dependencies:
debug "^4.1.1"
dottie "^2.0.0"
inflection "1.12.0"
inflection "1.13.1"
lodash "^4.17.20"
moment "^2.26.0"
moment-timezone "^0.5.31"
@ -12001,10 +11961,10 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc"
integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==
typescript@^4.3.5:
version "4.3.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4"
integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==
ua-parser-js@^0.7.28:
version "0.7.28"
@ -12368,10 +12328,10 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
vue-i18n@^8.24.4:
version "8.24.4"
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.24.4.tgz#b158614c1df7db183d9cadddbb73e1d540269492"
integrity sha512-RZE94WUAGxEiBAANxQ0pptbRwDkNKNSXl3fnJslpFOxVMF6UkUtMDSuYGuW2blDrVgweIXVpethOVkYoNNT9xw==
vue-i18n@^8.24.5:
version "8.24.5"
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.24.5.tgz#7127a666d5be2199be69be39e439a419a90ff931"
integrity sha512-p8W5xOmniuZ8fj76VXe0vBL3bRWVU87jHuC/v8VwmhKVH2iMQsKnheB1U+umxDBqC/5g9K+NwzokepcLxnBAVQ==
vue-loader@^15.9.7:
version "15.9.7"
@ -12477,11 +12437,16 @@ vuetify-loader@^1.7.1, vuetify-loader@^1.7.2:
file-loader "^6.2.0"
loader-utils "^2.0.0"
vuetify@^2.5.3, vuetify@^2.5.4:
vuetify@^2.5.3:
version "2.5.4"
resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-2.5.4.tgz#037cc8d430b61188ab15b9a8cc1ee67e620fa6e7"
integrity sha512-0EIXSCuy9LGXHgWbGiOdUUbGI6feodWoB3s+0Kr7rIppQWsq54tjPaQ1NobjAuDYKG7xsqkr+j0rnJUhc+GIag==
vuetify@^2.5.6:
version "2.5.6"
resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-2.5.6.tgz#9cbb1eacece6c42028216312b9be23e35a7f5cf4"
integrity sha512-2T8ML5PYuJ/AdMVH3ZIvzHnsM0nX8t4Xzj+0HFFGfLT7jLlptCFpG+JE8+kyrgGZlbUgulyOwCUu8hJkVsReFA==
vuex@^3.6.2:
version "3.6.2"
resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71"