This commit is contained in:
Matthieu Bessat 2020-07-14 23:58:34 +02:00
parent e3fbebe1b8
commit 4791bd8037
30 changed files with 15738 additions and 278 deletions

0
.env.example Normal file
View file

View file

@ -13,6 +13,7 @@ module.exports = {
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'@typescript-eslint/ban-ts-ignore': 'off'
}
}

1
.gitignore vendored
View file

@ -5,6 +5,7 @@ node_modules
# local env files
.env.local
.env.*.local
.env
# Log files
npm-debug.log*

13770
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -10,9 +10,11 @@
"dependencies": {
"core-js": "^3.6.5",
"register-service-worker": "^1.7.1",
"tiptap-vuetify": "^2.23.0",
"vue": "^2.6.11",
"vue-apitator": "^0.0.16",
"vue-class-component": "^7.2.3",
"vue-croppa": "^1.3.8",
"vue-property-decorator": "^8.4.2",
"vue-router": "^3.2.0",
"vuetify": "^2.2.11",
@ -44,13 +46,7 @@
"vue-template-compiler": "^2.6.11",
"vuetify-loader": "^1.3.0"
},
"gitHooks": {
"pre-commit": "lint-staged"
},
"lint-staged": {
"*.{js,jsx,vue,ts,tsx}": [
"vue-cli-service lint",
"git add"
]
"resolutions": {
"prosemirror-model": "1.9.1"
}
}

View file

@ -9,6 +9,7 @@
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons"/>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css">
</head>
<body>
<noscript>

View file

@ -16,6 +16,10 @@ export default Vue.extend({
GlobalSnackbar
},
created () {
console.log('Using ' + process.env.VUE_APP_BASE_URL)
},
data: () => ({})
})
</script>

View file

@ -1 +0,0 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 87.5 100"><defs><style>.cls-1{fill:#1697f6;}.cls-2{fill:#7bc6ff;}.cls-3{fill:#1867c0;}.cls-4{fill:#aeddff;}</style></defs><title>Artboard 46</title><polyline class="cls-1" points="43.75 0 23.31 0 43.75 48.32"/><polygon class="cls-2" points="43.75 62.5 43.75 100 0 14.58 22.92 14.58 43.75 62.5"/><polyline class="cls-3" points="43.75 0 64.19 0 43.75 48.32"/><polygon class="cls-4" points="64.58 14.58 87.5 14.58 43.75 100 43.75 62.5 64.58 14.58"/></svg>

Before

Width:  |  Height:  |  Size: 539 B

View file

@ -0,0 +1,141 @@
<template>
<v-dialog
v-model="enabled"
max-width="500px">
<v-card>
<v-card-title>
{{ caption }}
</v-card-title>
<v-card-text>
<v-layout justify-center>
<croppa
class="canvas-container"
v-model="plugin"
:show-remove-button="false"
canvas-color="white"
:width="size"
:height="size"
prevent-white-space
:placeholder-font-size="22"
@file-size-exceed="handleFileSizeExceed"
@file-type-mismatch="handleFileTypeMismatch"
placeholder="Choisissez une image"
></croppa>
</v-layout>
<v-layout justify-center wrap>
<v-btn
dark
outlined
color="indigo"
@click="rotate()">
Tourner 90°
</v-btn>
<v-btn
dark
outlined
color="indigo"
@click="rotate(-1)">
Tourner -90°
</v-btn>
<v-btn
dark
outlined
color="purple"
@click="clear">
Supprimer
</v-btn>
</v-layout>
</v-card-text>
<v-card-actions>
<v-btn
text
color="error"
@click="toggle">
Fermer
</v-btn>
<v-spacer></v-spacer>
<v-btn
text
:loading="loading"
color="primary"
@click="submit">
Sauvegarder
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script>
import 'vue-croppa/dist/vue-croppa.css'
export default {
name: 'AvatarEditor',
data: () => ({
enabled: false,
plugin: {},
size: 400
}),
props: {
caption: {
type: String,
default: 'Modifier votre logo'
},
loading: {
type: Boolean,
default: false
}
},
methods: {
toggle: function () {
this.enabled = !this.enabled
},
clear: function () {
this.plugin.remove()
},
rotate: function (x) {
this.plugin.rotate(x)
},
submit: function () {
this.plugin.generateBlob(
blob => {
this.$emit('submitted', blob)
},
'image/jpeg',
0.8
)
},
finish: function () {
this.plugin.remove()
this.enabled = false
},
handleFileSizeExceed: function () {
this.$store.commit('ADD_ALERT', {
color: 'error',
text: 'Ce fichier est trop grand !'
})
},
handleFileTypeMismatch: function () {
this.$store.commit('ADD_ALERT', {
color: 'error',
text: "Ce fichier n'est pas une image !"
})
}
}
}
</script>
<style>
.croppa-container {
background: transparent !important;
}
.canvas-container canvas {
border: 1px solid #bdc3c7;
border-radius: 50%;
}
@media screen and (max-width: 959px) {
.canvas-container canvas {
width: 100% !important;
height: auto !important;
}
}
</style>

View file

@ -1,3 +1,3 @@
<template>
</template>
</template>

17
src/icons/Facebook.vue Normal file
View file

@ -0,0 +1,17 @@
<template>
<svg
aria-hidden="true"
focusable="false"
data-prefix="fab"
data-icon="facebook"
class="svg-inline--fa fa-facebook fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="currentColor"
d="M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"
/>
</svg>
</template>

17
src/icons/Instagram.vue Normal file
View file

@ -0,0 +1,17 @@
<template>
<svg
aria-hidden="true"
focusable="false"
data-prefix="fab"
data-icon="instagram"
class="svg-inline--fa fa-instagram fa-w-14"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 448 512"
>
<path
fill="currentColor"
d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"
/>
</svg>
</template>

17
src/icons/Twitter.vue Normal file
View file

@ -0,0 +1,17 @@
<template>
<svg
aria-hidden="true"
focusable="false"
data-prefix="fab"
data-icon="twitter"
class="svg-inline--fa fa-twitter fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="currentColor"
d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"
/>
</svg>
</template>

View file

@ -1,5 +1,5 @@
<template>
<div>
<v-main>
<div v-if="enabled">
<v-app-bar
app
@ -8,10 +8,12 @@
dark
>
<v-app-bar-nav-icon @click.stop="drawer = !drawer"></v-app-bar-nav-icon>
<v-toolbar-title>Administration</v-toolbar-title>
<v-toolbar-title>{{ $store.state.title }}</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon @click="logout">
<v-icon>exit_to_app</v-icon>
</v-btn>
</v-app-bar>
<v-navigation-drawer
v-model="drawer"
app
@ -35,38 +37,40 @@
</v-list-item>
</v-list>
</v-navigation-drawer>
<v-main>
<v-container fluid>
<router-view></router-view>
</v-container>
</v-main>
<v-container fluid>
<router-view></router-view>
</v-container>
</div>
<v-main v-else>
<div v-if="!enabled && loading">
<span>Chargement...</span>
</div>
<div v-if="!enabled && !loading">
<div class="d-flex align-center justify-center mt-5">
<v-card>
<v-card-title>
Connexion au panel administrateur
</v-card-title>
<v-card-text>
<p>
Vous n'êtes pas encore connecté à l'interface d'administration veuillez copier-coller le token dans la boîte ci-dessous.
</p>
<v-text-field autofocus label="Token" v-model="token" />
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn color="primary" @click="init" :disabled="token === ''">Se connecter</v-btn>
</v-card-actions>
</v-card>
</div>
</div>
</v-main>
</div>
<div v-if="!enabled && loading" class="d-flex align-center justify-center mt-10 pt-10">
<v-progress-circular indeterminate color="primary" />
</div>
<div v-if="!enabled && !loading" class="d-flex align-center justify-center mt-5">
<v-card max-width="600">
<v-card-title>
Connexion au panel administrateur
</v-card-title>
<v-card-text>
<p>
Vous n'êtes pas encore connecté à l'interface d'administration veuillez copier-coller le token dans la boîte ci-dessous.
</p>
<v-text-field
v-on:keydown.enter="submitForm()"
autofocus
label="Token"
v-model="token" />
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn
color="primary"
@click="submitForm()"
:disabled="token === ''">
Se connecter
</v-btn>
</v-card-actions>
</v-card>
</div>
</v-main>
</template>
<script>
@ -99,7 +103,7 @@ export default {
}
this.$apitator.setAuthorizationToken(adminToken)
// verify the token
this.$apitator.get('/admin', { withAuth: true }).then(res => {
this.$apitator.get('/admin', { withAuth: true }).then(() => {
window.localStorage.setItem('adminToken', adminToken)
this.loading = false
this.enabled = true
@ -112,11 +116,16 @@ export default {
})
}
})
},
submitForm () {
if (this.token !== '') {
this.init()
}
},
logout () {
window.localStorage.removeItem('adminToken')
this.$router.push('/')
}
}
}
</script>
<style>
</style>

214
src/layouts/Delegate.vue Normal file
View file

@ -0,0 +1,214 @@
<template>
<v-main>
<div v-if="enabled">
<v-toolbar
color="primary"
dark
flat
>
<v-toolbar-title>Gestion de l'association We Robot</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn outlined>
Publier
</v-btn>
<v-btn icon @click="logout()">
<v-icon>exit_to_app</v-icon>
</v-btn>
<template v-slot:extension>
<v-tabs
v-model="tab"
centered
show-arrows
slider-color="yellow"
ref="tabs"
>
<v-tab @click="navigate('DelegateMain')">
Résumé
</v-tab>
<v-tab @click="navigate('DelegateGallery')">
Images/vidéos
</v-tab>
<v-tab @click="navigate('DelegatePresentation')">
Présentation
</v-tab>
<v-tab @click="navigate('DelegateSchedule')">
Horaires
</v-tab>
<v-tab @click="navigate('DelegatePricing')">
Tarifs
</v-tab>
<v-tab @click="navigate('DelegateContact')">
Contact
</v-tab>
</v-tabs>
</template>
</v-toolbar>
<v-container fluid>
<v-row class="justify-center">
<v-col cols="12" sm="12" md="8">
<router-view></router-view>
<div class="mt-3 d-flex justify-end">
<v-btn color="success" :loading="isSaving" @click="save()">Sauvegarder</v-btn>
</div>
</v-col>
</v-row>
</v-container>
</div>
<div v-if="!enabled && loading" class="d-flex align-center justify-center mt-10 pt-10">
<v-progress-circular indeterminate color="primary" />
</div>
<div v-if="!enabled && !loading" class="d-flex align-center justify-center mt-5">
<v-card max-width="600">
<v-card-title>
Connexion au panel de modification
</v-card-title>
<v-card-text>
<p>
Vous n'êtes pas encore connecté à l'interface de modification de votre association, veuillez copier-coller la clée qui vous a été envoyé par e-mail dans la boîte ci-dessous.
</p>
<v-text-field
v-on:keydown.enter="submitForm()"
autofocus
label="Clée"
v-model="token" />
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn
color="primary"
@click="submitForm()"
:disabled="token === ''">
Se connecter
</v-btn>
</v-card-actions>
</v-card>
</div>
</v-main>
</template>
<script>
export default {
data: () => ({
enabled: false,
loading: true,
token: '',
loadingHandle: null,
isSaving: false,
tab: 0
}),
created () {
this.init()
},
mounted () {
const path = this.$route.path.split('/')
const name = path[path.length - 1]
const routes = ['', 'gallery', 'presentation', 'schedule', 'pricing', 'contact']
this.tab = routes.indexOf(name)
/**
* this is very ugly I kown
*/
// setTimeout(() => {
// window.dispatchEvent(new Event('resize'))
// }, 100)
// const i = setInterval(() => {
// window.dispatchEvent(new Event('resize'))
// }, 500)
// setTimeout(() => {
// window.dispatchEvent(new Event('resize'))
// }, 1000)
// setTimeout(() => {
// clearInterval(i)
// }, 3000)
},
methods: {
init () {
this.enabled = false
this.loadingHandle = setTimeout(() => {
this.loading = true
}, 300)
let inUrl = false
let delegateToken = (new URL(window.location)).searchParams.get('delegateToken')
if (this.token !== '') {
delegateToken = this.token
}
if (delegateToken === null) {
delegateToken = window.localStorage.getItem('delegateToken')
if (delegateToken === null || delegateToken === 'null') {
clearTimeout(this.loadingHandle)
this.loading = false
return
}
} else {
inUrl = true
}
this.$apitator.setAuthorizationToken(delegateToken)
// verify the token
this.$apitator.get('/delegate', { withAuth: true }).then(res => {
window.localStorage.setItem('delegateToken', delegateToken)
if (this.token !== '') {
this.$router.push({ query: { delegateToken: this.token } })
}
clearTimeout(this.loadingHandle)
this.loading = false
this.enabled = true
const organization = res.data.data
this.$store.commit('SET_DATA', organization.proposedVersion)
this.$nextTick(() => {
setTimeout(this.$refs.tabs.callSlider, 200)
setTimeout(this.$refs.tabs.callSlider, 400)
setTimeout(this.$refs.tabs.callSlider, 500)
setTimeout(this.$refs.tabs.callSlider, 1000)
setTimeout(this.$refs.tabs.callSlider, 1500)
})
}).catch(() => {
clearTimeout(this.loadingHandle)
this.loading = false
if (this.token !== '' || inUrl) {
this.$store.commit('ADD_ALERT', {
color: 'error',
text: 'Clée invalide !'
})
}
})
},
logout () {
window.localStorage.removeItem('delegateToken')
this.$router.push('/')
},
save () {
this.isSaving = true
const data = this.$store.state.data
data.pricing = data.pricing.map(i => {
delete i._id
return i
})
this.$apitator.put('/delegate', data, { withAuth: true }).then(() => {
this.isSaving = false
this.$store.commit('ADD_ALERT', {
color: 'success',
text: 'Vos changements ont été sauvegardés !'
})
}).catch(() => {
this.isSaving = false
this.$store.commit('ADD_ALERT', {
color: 'error',
text: 'Impossible de sauvegarder vos changements'
})
})
},
navigate (routeName) {
if (routeName !== this.$route.name) {
this.$router.push({ name: routeName })
}
},
submitForm () {
if (this.token !== '') {
this.init()
}
}
}
}
</script>

View file

@ -1,31 +0,0 @@
<template>
<div>
<h1>Organization Layout</h1>
<router-view></router-view>
</div>
</template>
<script>
export default {
created() {
let delegateToken = window.localStorage.getItem('delegateToken')
if (delegateToken === null) {
delegateToken = (new URL(window.location)).searchParams.get('delegateToken')
if (delegateToken === null) {
delegateToken = prompt(`
Vous n'êtes pas encore connecté à l'interface de configuration de votre
association veuillez copier-coller le token qui vous a été envoyé par email ci-dessous.
(ou connectez vous directement avec le lient envoyé par email)
`)
}
window.localStorage.setItem('delegateToken', delegateToken)
}
this.$apitator.setAuthorizationToken(delegateToken)
}
}
</script>
<style>
</style>

View file

@ -3,16 +3,28 @@ import App from './App.vue'
import './registerServiceWorker'
import router from './router'
import store from './store'
// @ts-ignore
import Croppa from 'vue-croppa'
import vuetify from './plugins/vuetify'
import apitator from 'vue-apitator'
// @ts-ignore
import { TiptapVuetifyPlugin } from 'tiptap-vuetify'
Vue.config.productionTip = false
Vue.use(apitator, {
baseUrl: 'http://localhost:8001'
baseUrl: process.env.VUE_APP_BASE_URL
})
Vue.filter('less', (s: string, l = 60) => {
return s.substr(0, l) + (s.length > 60 ? '...' : '')
})
Vue.use(TiptapVuetifyPlugin, {
vuetify,
iconsGroup: 'md'
})
Vue.use(Croppa)
new Vue({
router,

View file

@ -1,7 +1,28 @@
import Vue from 'vue'
import Vuetify from 'vuetify/lib'
import fr from 'vuetify/src/locale/fr'
import FacebookIcon from '../icons/Facebook.vue'
import InstagramIcon from '../icons/Instagram.vue'
import TwitterIcon from '../icons/Twitter.vue'
Vue.use(Vuetify)
export default new Vuetify({
lang: {
locales: { fr },
current: 'fr'
},
icons: {
values: {
facebook: {
component: FacebookIcon
},
twitter: {
component: TwitterIcon
},
instagram: {
component: InstagramIcon
}
}
}
})

View file

@ -35,6 +35,44 @@ const routes: Array<RouteConfig> = [
component: () => import(/* webpackChunkName: "tags" */ '../views/Admin/Tags.vue')
}
]
},
{
path: '/delegate',
name: 'DelegateLayout',
component: () => import(/* webpackChunkName: "delegateLayout" */ '../layouts/Delegate.vue'),
children: [
{
path: '/',
name: 'DelegateMain',
component: () => import(/* webpackChunkName: "delegateMain" */ '../views/Delegate/Main.vue')
},
{
path: 'contact',
name: 'DelegateContact',
component: () => import(/* webpackChunkName: "delegateContact" */ '../views/Delegate/Contact.vue')
},
{
path: 'pricing',
name: 'DelegatePricing',
component: () => import(/* webpackChunkName: "delegatePricing" */ '../views/Delegate/Pricing.vue')
},
{
path: 'schedule',
name: 'DelegateSchedule',
component: () => import(/* webpackChunkName: "delegateSchedule" */ '../views/Delegate/Schedule.vue')
},
{
path: 'gallery',
name: 'DelegateGallery',
component: () => import(/* webpackChunkName: "delegateGallery" */ '../views/Delegate/Gallery.vue')
},
{
path: 'presentation',
name: 'DelegatePresentation',
component: () => import(/* webpackChunkName: "delegatePresentation" */ '../views/Delegate/Presentation.vue')
}
]
}
]

View file

@ -9,9 +9,34 @@ export default new Vuex.Store({
color: '',
text: '',
enabled: false
},
title: '',
data: {
name: '',
descriptionShort: '',
descriptionLong: '',
thumbnail: {
key: '',
contentType: '',
location: '',
type: 'thumbnail'
},
contacts: {
facebook: '',
twitter: '',
instagram: '',
website: '',
address: '',
person: '',
email: '',
phone: ''
}
}
},
mutations: {
SET_TITLE (state, payload) {
state.title = payload
},
ADD_ALERT (state, payload) {
state.alert = {
color: payload.color,
@ -21,6 +46,11 @@ export default new Vuex.Store({
},
DISABLE_ALERT (state) {
state.alert.enabled = false
},
SET_DATA (state, payload) {
if (payload !== null) {
state.data = { ...state.data, ...payload }
}
}
},
actions: {

View file

@ -1,13 +1,515 @@
<template>
<div>
OrganizationList
</div>
<v-row no-gutters class="d-flex justify-center">
<v-col cols="12" xl="8" md="10" sm="12">
<v-data-table
:headers="headers"
:items="organizations"
sort-by="calories"
class="elevation-1"
>
<template v-slot:top>
<v-toolbar flat color="white">
<v-toolbar-title>Gestion des associations</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn
outlined
color="primary"
dark
@click="fetchData()"
class="mb-2 mr-2"
>
<v-icon>refresh</v-icon>
</v-btn>
<v-dialog v-model="dialog" max-width="500px">
<template v-slot:activator="{ on, attrs }">
<v-btn
color="primary"
dark
class="mb-2"
v-bind="attrs"
v-on="on"
>
Nouvelle association
</v-btn>
</template>
<v-card>
<v-card-title>
<span class="headline">{{ formTitle }}</span>
</v-card-title>
<v-card-text>
<v-text-field
v-model="editedItem.adminName"
required
label="Nom (interne) de l'associatiton">
</v-text-field>
<v-text-field
v-model="editedItem.email"
label="E-mail utilisé pour recevoir le lien/la clé d'identification">
</v-text-field>
<v-select
:items="validationState"
v-model="editedItem.validationState"
label="DEBUG: status de la validation"
></v-select>
<div v-if="editedIndex === -1">
<p>
Remarque : Lorsque vous allez créer cette association un email contenant le lien de connexion va être automatiquement envoyé sur l'adresse renseignée.
</p>
</div>
<div v-else>
<p>
Remarque : Si l'email change lors d'une modification, rien ne sera fait en plus.
Si vous voulez envoyer un email contenant le lient de connexion, vous devez utiliser le bouton dédié pour ça.
</p>
</div>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="grey darken-3" text @click="close">Annuler</v-btn>
<v-btn color="blue darken-1" text @click="save">Valider</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar>
</template>
<!-- <template v-slot:item.icon="{ item }">
</template> -->
<!-- <template v-slot:item.description="{ item }">
{{ item.description|less }}
</template> -->
<template v-slot:item.actions="{ item }">
<v-tooltip top>
<template v-slot:activator="{ on, attrs }">
<v-btn icon small color="success">
<v-icon
small
@click="openApproveModal(item)"
v-bind="attrs"
v-on="on"
>
done
</v-icon>
</v-btn>
</template>
<span>Valider les changements</span>
</v-tooltip>
<v-tooltip top>
<template v-slot:activator="{ on, attrs }">
<v-btn icon small color="info">
<v-icon
small
@click="editItem(item)"
v-bind="attrs"
v-on="on"
>
mdi-pencil
</v-icon>
</v-btn>
</template>
<span>Modifier</span>
</v-tooltip>
<v-tooltip top>
<template v-slot:activator="{ on, attrs }">
<v-btn icon small color="error">
<v-icon
small
@click="openDeleteModal(item)"
v-bind="attrs"
v-on="on"
>
mdi-delete
</v-icon>
</v-btn>
</template>
<span>Supprimer</span>
</v-tooltip>
<v-tooltip top>
<template v-slot:activator="{ on, attrs }">
<v-btn icon small color="primary">
<v-icon
small
@click="openDetailsModal(item)"
v-bind="attrs"
v-on="on"
>
visibility
</v-icon>
</v-btn>
</template>
<span>Voir plus</span>
</v-tooltip>
<v-tooltip top>
<template v-slot:activator="{ on, attrs }">
<v-btn icon small color="success">
<v-icon
small
@click="openExternal(item)"
v-bind="attrs"
v-on="on"
>
launch
</v-icon>
</v-btn>
</template>
<span>Ouvrir la page publique</span>
</v-tooltip>
</template>
<template v-slot:no-data>
<span>Aucune associations n'ont été crées jusqu'a présent</span>
</template>
</v-data-table>
</v-col>
<v-dialog v-model="deleteModal" max-width="600">
<v-card>
<v-card-title>
Voulez vous vraiment supprimer cette association ?
</v-card-title>
<v-card-text>
<b>Attention, cette action est irréversible !</b>
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn color="blue darken-1" text @click="deleteModal = false">Annuler</v-btn>
<v-btn color="red darken-1" text @click="deleteItem">Supprimer</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="detailsModal" max-width="600">
<v-card>
<v-card-title>
Détails et actions sur l'association {{ toSeeItem.adminName }}
</v-card-title>
<v-card-text>
<!-- show dates, status, current and published version page link, token -->
<!-- action: reset token, send email -->
<v-list two-line>
<v-divider />
<v-list-item>
<v-list-item-icon>
<v-icon>vpn_key</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{ toSeeItem.token }}</v-list-item-title>
<v-list-item-subtitle>Token/clée</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-divider />
<v-list-item>
<v-list-item-icon>
<v-icon>update</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{ toSeeItem.createdAt }}</v-list-item-title>
<v-list-item-subtitle>Date de création</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<div v-if="toSeeItem.updatedAt !== undefined">
<v-list-item>
<v-list-item-action />
<v-list-item-content>
<v-list-item-title>{{ toSeeItem.updatedAt }}</v-list-item-title>
<v-list-item-subtitle>Date de dernière mise à jour</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
</div>
<div v-if="toSeeItem.publishedAt !== undefined">
<v-divider />
<v-list-item>
<v-list-item-action />
<v-list-item-content>
<v-list-item-title>{{ toSeeItem.publishedAt }}</v-list-item-title>
<v-list-item-subtitle>Date de dernière publication</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
</div>
<v-divider />
<v-list-item three-line>
<v-list-item-icon>
<v-icon>refresh</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>Générer une nouvelle clé</v-list-item-title>
<v-list-item-subtitle>Cette action va remplacer les clés existantes par une nouvelle clé généré aléatoirement</v-list-item-subtitle>
</v-list-item-content>
<v-list-item-action>
<v-btn color="info" outlined @click="generateToken(toSeeItem)" small>Générer</v-btn>
</v-list-item-action>
</v-list-item>
<v-divider />
<v-list-item>
<v-list-item-icon>
<v-icon>email</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>Envoyer un email contenant la clé</v-list-item-title>
<v-list-item-subtitle>Un message sera envoyé contenant le token existant</v-list-item-subtitle>
</v-list-item-content>
<v-list-item-action>
<v-btn color="teal" outlined @click="sendEmailToken(toSeeItem)" small>Envoyer</v-btn>
</v-list-item-action>
</v-list-item>
<v-divider />
</v-list>
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn color="blue darken-1" text @click="detailsModal = false">Fermer</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="approveModal" max-width="700">
<v-card>
<v-card-title>
Vérification et publication des changements de l'association {{ toSeeItem.adminName }}
</v-card-title>
<v-card-text>
<v-switch label="Les modifications sont acceptées" v-model="approved" />
<v-textarea
:disabled="approved"
label="Raisons du rejet"
v-model="rejectionDescription">
</v-textarea>
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn color="grey darken-3" text @click="approveModal = false">Fermer</v-btn>
<v-btn
color="primary"
text
@click="approveOrReject()"
:disabled="approved && rejectionDescription.length === 0"
>Valider</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-row>
</template>
<script>
export default {
mounted () {
console.log('dzqsd')
data: () => {
const item = {
adminName: '',
email: '',
validationState: 'none'
}
return {
dialog: false,
headers: [
{
text: 'Nom interne',
value: 'adminName'
},
{
text: 'E-mail',
value: 'email'
},
{
text: 'Actions',
value: 'actions'
}
],
organizations: [],
editedIndex: -1,
editedItem: item,
defaultItem: item,
deleteModal: false,
validationState: ['none', 'pending', 'rejected', 'published'],
detailsModal: false,
toSeeItem: item,
approveModal: false,
toApproveItem: item,
rejectionDescription: '',
approved: false
}
},
computed: {
formTitle () {
return this.editedIndex === -1 ? 'Nouvelle association' : "Modification de l'association"
}
},
watch: {
dialog (val) {
val || this.close()
}
},
created () {
this.$store.commit('SET_TITLE', 'Gestion des associations')
this.fetchData()
},
methods: {
fetchData () {
this.$apitator.get('/admin/organizations', { withAuth: true }).then(res => {
this.organizations = res.data.data
})
},
editItem (item) {
this.editedIndex = this.organizations.indexOf(item)
this.editedItem = Object.assign({}, item)
this.dialog = true
},
openDeleteModal (item) {
this.toDeleteItem = item
this.deleteModal = true
},
deleteItem () {
const index = this.organizations.indexOf(this.toDeleteItem)
if (confirm('Êtes vous sûr de vouloir supprimer cette association ?')) {
this.organizations.splice(index, 1)
this.$apitator.delete('/admin/organizations/' + this.toDeleteItem._id, { withAuth: true }).then(() => {
this.deleteModal = false
this.$store.commit('ADD_ALERT', {
color: 'success',
text: "Cette association vient d'être supprimé"
})
})
}
},
openDetailsModal (item) {
this.toSeeItem = item
this.detailsModal = true
},
close () {
this.dialog = false
this.$nextTick(() => {
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
},
save () {
if (this.editedIndex > -1) {
// call the api to update the organization
this.$apitator.put('/admin/organizations/' + this.editedItem._id, {
adminName: this.editedItem.adminName,
email: this.editedItem.email,
validationState: this.editedItem.validationState
}, { withAuth: true }).then(res => {
console.log(res.data)
this.$store.commit('ADD_ALERT', {
color: 'success',
text: 'Association mise à jour'
})
this.fetchData()
this.close()
}).catch(() => {
this.$store.commit('ADD_ALERT', {
color: 'error',
text: 'Impossible de modifier cette association'
})
})
} else {
// call the api to store the organization
this.$apitator.post('/admin/organizations', {
adminName: this.editedItem.adminName,
email: this.editedItem.email,
validationState: this.editedItem.validationState
}, { withAuth: true }).then(() => {
this.fetchData()
this.close()
this.$store.commit('ADD_ALERT', {
color: 'success',
text: 'Association ajoutée'
})
}).catch(() => {
this.$store.commit('ADD_ALERT', {
color: 'error',
text: "Impossible d'ajouter cette association"
})
})
}
},
generateToken (item) {
if (!confirm('Êtes vous sur de reinitialiser la clée de cette association ? Les liens de connexions existants seront inutilisables.')) {
return
}
this.$apitator.post('/admin/organizations/' + item._id + '/reset-token', {}, { withAuth: true }).then(() => {
this.detailsModal = false
this.$store.commit('ADD_ALERT', {
color: 'success',
text: 'La clée de cette association a été reinitialisé'
})
}).catch(() => {
this.$store.commit('ADD_ALERT', {
color: 'error',
text: 'Impossible de reinitialiser la clée de cette association'
})
})
},
sendEmailToken (item) {
this.$apitator.post('/admin/organizations/' + item._id + '/send-email-token', {}, { withAuth: true }).then(() => {
this.detailsModal = false
this.$store.commit('ADD_ALERT', {
color: 'success',
text: 'Un email va être envoyé à cette association contenant la clée'
})
}).catch(() => {
this.$store.commit('ADD_ALERT', {
color: 'error',
text: "Impossible d'envoyer un email à cette association"
})
})
},
openExternal (item) {
window.open('https://forum.espacecondorcet.org/association/slug' + item.slug, '_blank').focus()
},
openApproveModal (item) {
this.approveModal = true
this.toApproveItem = item
this.approved = false
},
approveOrReject (item) {
if (this.approved) {
this.$apitator.post('/admin/organizations/' + item._id + '/approve', {}, { withAuth: true }).then(() => {
this.approveModal = false
this.$store.commit('ADD_ALERT', {
color: 'success',
text: 'La publication est cours de réalisation et un email va être envoyé à cette association afin de notifier de cette publication'
})
}).catch(() => {
this.$store.commit('ADD_ALERT', {
color: 'error',
text: "Impossible d'approuver les changements"
})
})
} else {
this.$apitator.post('/admin/organizations/' + item._id + '/reject', {
rejectionDescription: this.rejectionDescription
}, { withAuth: true }).then(() => {
this.approveModal = false
this.$store.commit('ADD_ALERT', {
color: 'success',
text: "Un email va être envoyé à cette association afin d'informer du problème"
})
}).catch(() => {
this.$store.commit('ADD_ALERT', {
color: 'error',
text: 'Impossible de rejeter les changements'
})
})
}
}
}
}
</script>

View file

@ -1,110 +1,114 @@
<template>
<v-data-table
:headers="headers"
:items="tags"
sort-by="calories"
class="elevation-1"
>
<template v-slot:top>
<v-toolbar flat color="white">
<v-toolbar-title>Gestion des catégories</v-toolbar-title>
<!-- <v-divider
class="mx-4"
inset
vertical
></v-divider> -->
<v-spacer></v-spacer>
<v-btn
outlined
color="primary"
dark
@click="fetchData()"
class="mb-2 mr-2"
>
<v-icon>refresh</v-icon>
</v-btn>
<v-dialog v-model="dialog" max-width="500px">
<template v-slot:activator="{ on, attrs }">
<v-row no-gutters class="d-flex justify-center">
<v-col cols="12" xl="8" md="10" sm="12">
<v-data-table
:headers="headers"
:items="tags"
sort-by="name"
class="elevation-1"
>
<template v-slot:top>
<v-toolbar flat color="white">
<v-toolbar-title>Gestion des catégories</v-toolbar-title>
<!-- <v-divider
class="mx-4"
inset
vertical
></v-divider> -->
<v-spacer></v-spacer>
<v-btn
outlined
color="primary"
dark
class="mb-2"
v-bind="attrs"
v-on="on"
@click="fetchData()"
class="mb-2 mr-2"
>
Nouvelle catégorie
<v-icon>refresh</v-icon>
</v-btn>
</template>
<v-card>
<v-card-title>
<span class="headline">{{ formTitle }}</span>
</v-card-title>
<v-card-text>
<v-text-field
v-model="editedItem.name"
required
label="Nom de la catégorie">
</v-text-field>
<v-text-field
v-model="editedItem.icon"
label="Icône de la catégorie">
</v-text-field>
<v-text-field
v-model="editedItem.description"
label="Description de la catégorie">
</v-text-field>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" text @click="close">Annuler</v-btn>
<v-btn color="blue darken-1" text @click="save">Valider</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar>
</template>
<template v-slot:item.icon="{ item }">
<div style="display:flex">
<svg
style="width: 1em; margin-right: .75em"
aria-hidden="true"
focusable="false"
data-prefix="fas"
data-icon="camera"
class="svg-inline--fa fa-camera fa-w-16"
role="img"
:viewBox="'0 0 ' + item.icon.width + ' ' + item.icon.height"
xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor" :d="item.icon.path"></path>
</svg>
<span>{{ item.icon.id }}</span>
</div>
</template>
<template v-slot:item.description="{ item }">
{{ item.description|less }}
</template>
<template v-slot:item.actions="{ item }">
<v-btn icon small color="info">
<v-icon
small
@click="editItem(item)"
>
mdi-pencil
</v-icon>
</v-btn>
<v-btn icon small color="error">
<v-icon
small
@click="deleteItem(item)"
>
mdi-delete
</v-icon>
</v-btn>
</template>
<template v-slot:no-data>
<span>Aucune catégories n'ont été crées jusqu'a présent</span>
</template>
</v-data-table>
<v-dialog v-model="dialog" max-width="500px">
<template v-slot:activator="{ on, attrs }">
<v-btn
color="primary"
dark
class="mb-2"
v-bind="attrs"
v-on="on"
>
Nouvelle catégorie
</v-btn>
</template>
<v-card>
<v-card-title>
<span class="headline">{{ formTitle }}</span>
</v-card-title>
<v-card-text>
<v-text-field
v-model="editedItem.name"
required
label="Nom de la catégorie">
</v-text-field>
<v-text-field
v-model="editedItem.icon"
label="Icône de la catégorie">
</v-text-field>
<v-text-field
v-model="editedItem.description"
label="Description de la catégorie">
</v-text-field>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="grey darken-3" text @click="close">Annuler</v-btn>
<v-btn color="blue darken-1" text @click="save">Valider</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar>
</template>
<template v-slot:item.icon="{ item }">
<div style="display:flex">
<svg
style="width: 1em; margin-right: .75em"
aria-hidden="true"
focusable="false"
data-prefix="fas"
data-icon="camera"
class="svg-inline--fa fa-camera fa-w-16"
role="img"
:viewBox="'0 0 ' + item.icon.width + ' ' + item.icon.height"
xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor" :d="item.icon.path"></path>
</svg>
<span>{{ item.icon.id }}</span>
</div>
</template>
<template v-slot:item.description="{ item }">
{{ item.description|less }}
</template>
<template v-slot:item.actions="{ item }">
<v-btn icon small color="info">
<v-icon
small
@click="editItem(item)"
>
mdi-pencil
</v-icon>
</v-btn>
<v-btn icon small color="error">
<v-icon
small
@click="deleteItem(item)"
>
mdi-delete
</v-icon>
</v-btn>
</template>
<template v-slot:no-data>
<span>Aucune catégories n'ont été crées jusqu'a présent</span>
</template>
</v-data-table>
</v-col>
</v-row>
</template>
<script>
@ -119,7 +123,7 @@ export default {
width: 200
},
{
text: 'Icone',
text: 'Icône',
value: 'icon',
width: 250
},
@ -160,6 +164,7 @@ export default {
},
created () {
this.$store.commit('SET_TITLE', 'Gestion des tags')
this.fetchData()
},

View file

@ -0,0 +1,51 @@
<template>
<div>
<div class="mb-2">
<p class="text-body">
Ici vous pouvez préciser quelques manières de contacter votre association, aucun des champs indiqués n'est obligatoire.
</p>
</div>
<v-text-field
prepend-icon="person"
label="Personne responsable"
outlined
v-model="$store.state.data.contacts.person" />
<v-text-field
prepend-icon="call"
label="Numéro de téléphone"
outlined
v-model="$store.state.data.contacts.phone" />
<v-text-field
prepend-icon="public"
label="Site web"
outlined
v-model="$store.state.data.contacts.website" />
<v-textarea
prepend-icon="room"
label="Adresse"
outlined
v-model="$store.state.data.contacts.address" />
<v-text-field
prepend-icon="$vuetify.icons.facebook"
label="Compte facebook"
outlined
v-model="$store.state.data.contacts.facebook" />
<v-text-field
prepend-icon="$vuetify.icons.twitter"
label="Compte twitter"
outlined
v-model="$store.state.data.contacts.twitter" />
<v-text-field
prepend-icon="$vuetify.icons.instagram"
label="Compte instagram"
outlined
v-model="$store.state.data.contacts.instagram" />
</div>
</template>
<script>
export default {
data: () => ({}),
methods: {}
}
</script>

View file

@ -0,0 +1,5 @@
<template>
<div>
Gallery
</div>
</template>

View file

@ -0,0 +1,77 @@
<template>
<div>
<v-row class="mb-5">
<v-col cols="12" sm="12" md="6" style="align-items: center; justify-content: center; display: flex;">
<v-avatar size="200" style="border: 2px solid #95a5a6">
<img :src="$store.state.data.thumbnail.location" />
</v-avatar>
</v-col>
<v-col cols="12" sm="12" md="6" style="align-items: center; justify-content: center; display: flex;">
<v-btn @click="$refs.avatarEditor.toggle()" color="primary">Changer le logo</v-btn>
</v-col>
</v-row>
<v-row style="align-items: center;">
<v-col cols="12" sm="12" md="12">
<v-text-field
label="Nom de l'association"
outlined
prepend-icon="label"
v-model="$store.state.data.name" />
</v-col>
</v-row>
<v-textarea
outlined
label="Description ou résumé rapide"
placeholder="Courte description qui apparaitra sur la page d'accueil"
:rules="rules.descriptionShort"
counter
v-model="$store.state.data.descriptionShort" />
<AvatarEditor
ref="avatarEditor"
:loading="logoLoading"
@submitted="handleAvatarEditorSubmitted"
/>
</div>
</template>
<script>
import AvatarEditor from '../../components/AvatarEditor'
export default {
components: { AvatarEditor },
data: () => ({
logoLoading: false,
rules: {
descriptionShort: [v => v.length <= 100 || 'Au maximum 100 caractères'],
logo: [v => !v || v.size < 2000000 || 'La taille du logo doit être inférieur à 2 Mega Octets!']
}
}),
methods: {
handleAvatarEditorSubmitted: function (blob) {
const form = new FormData()
form.append('file', blob, blob.filename)
this.logoLoading = true
this.$apitator.post('/delegate/thumbnail', form, { withAuth: true }).then(res => {
this.logoLoading = false
this.$store.commit('SET_DATA', { thumbnail: res.data.thumbnail })
this.$refs.avatarEditor.finish()
this.$store.commit('ADD_ALERT', {
color: 'success',
text: 'Logo mis à jour !'
})
}).catch(() => {
this.logoLoading = false
this.$store.commit('ADD_ALERT', {
color: 'error',
text: 'Impossible de mettre à jour le logo'
})
})
}
}
}
</script>

View file

@ -0,0 +1,56 @@
<template>
<div>
<tiptap-vuetify
v-model="$store.state.data.descriptionLong"
:extensions="tiptapExtensions"
placeholder="Décrivez ici votre association plus en détail (section présentation)"
min-height="15em"
/>
</div>
</template>
<script>
import 'tiptap-vuetify/dist/main.css'
import {
TiptapVuetify,
Heading,
Bold,
Italic,
Underline,
Paragraph,
BulletList,
OrderedList,
ListItem,
Link,
Blockquote,
HardBreak,
HorizontalRule,
History
} from 'tiptap-vuetify'
export default {
components: { TiptapVuetify },
data: () => ({
tiptapExtensions: [
History,
Blockquote,
Link,
Underline,
Italic,
ListItem,
BulletList,
OrderedList,
[Heading, {
options: {
levels: [1, 2, 3]
}
}],
Bold,
HorizontalRule,
Paragraph,
HardBreak
]
})
}
</script>

View file

@ -0,0 +1,167 @@
<template>
<div>
<div class="d-flex justify-end">
<v-btn @click="openAddModal()" color="teal" outlined>
<v-icon left>add</v-icon>
Ajouter un tarif
</v-btn>
</div>
<div
v-if="$store.state.data.pricing.length === 0"
class="mb-2 mt-2 d-flex justify-center">
<span class="text-gray">
Pas de tarifs ajoutés
</span>
</div>
<v-row v-else>
<v-col
v-for="pricing in $store.state.data.pricing"
:key="pricing._id"
cols="12"
sm="12"
md="6"
lg="6"
>
<v-card
class="mx-auto"
max-width="344"
>
<v-card-text>
<div v-text="pricing.name" />
<div
v-text="pricing.priceLabel"
class="mb-2 mt-2 display-1 text--primary" />
<div
v-text="pricing.description"
class="text--primary" />
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn
@click="openDeleteModal(pricing)"
icon
color="error"
>
<v-icon>delete</v-icon>
</v-btn>
<v-btn
@click="openEditModal(pricing)"
icon
color="info"
>
<v-icon>edit</v-icon>
</v-btn>
</v-card-actions>
</v-card>
</v-col>
</v-row>
<v-dialog
max-width="500"
v-model="itemModal">
<v-card>
<v-card-title v-text="itemModalTitle + ' un tarif'" />
<v-card-text>
<v-text-field
v-model="item.priceLabel"
label="Tarif"
hint="Requis"
/>
<v-text-field
v-model="item.name"
label="Nom/Titre du tarif"
hint="Requis"
/>
<v-text-field
v-model="item.description"
label="Description/Sous Titre du tarif"
hint="Optionel"
/>
</v-card-text>
<v-card-actions>
<v-btn @click="itemModal = false" text color="primary">
Fermer
</v-btn>
<v-spacer />
<v-btn @click="save()" text color="success">
Valider
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog
max-width="500"
v-model="deleteModal">
<v-card>
<v-card-title>
Voulez vous vraiment supprimer ce tarif ?
</v-card-title>
<v-card-actions>
<v-btn @click="deleteModal = false" text color="primary">
Fermer
</v-btn>
<v-spacer />
<v-btn @click="destroy()" text color="error">
Supprimer
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</div>
</template>
<script>
export default {
data: () => ({
itemModal: false,
mode: '',
item: {
priceLabel: '',
name: '',
description: ''
},
toDelete: {},
deleteModal: false,
oldEdit: {}
}),
created () {
this.item = JSON.parse('{"priceLabel":"3.14159 €","name":"Hippie","description":"Vomissures que ce juillets haleurs haleurs dont, roulant"}')
},
computed: {
itemModalTitle () { return this.mode === 'add' ? 'Ajouter' : 'Editer' }
},
methods: {
openAddModal () {
this.mode = 'add'
this.itemModal = true
},
save () {
let pricing = this.$store.state.data.pricing
if (this.mode === 'add') {
this.item._id = Date.now().toString()
pricing.push(this.item)
} else {
pricing = pricing.map(i => i === this.oldEdit ? this.item : i)
}
this.$store.commit('SET_DATA', { pricing })
this.itemModal = false
},
openEditModal (item) {
this.item = item
this.oldEdit = item
this.mode = 'edit'
this.itemModal = true
},
openDeleteModal (item) {
this.deleteModal = true
this.toDelete = item
},
destroy () {
let pricing = this.$store.state.data.pricing
pricing = pricing.filter(item => item !== this.toDelete)
this.$store.commit('SET_DATA', { pricing })
this.deleteModal = false
}
}
}
</script>

View file

@ -0,0 +1,115 @@
<template>
<div>
<div class="d-flex">
<div
class="schedule-item"
v-for="item in scheduleData"
:key="item.name"
>
<!--
cols="12"
sm="12"
md="6"
lg="6"
-->
<v-card>
<v-card-title>
<div class="subheading font-weight-bold">{{ item.name }}</div>
<div class="text-subtitle-2">{{ item.description }}</div>
</v-card-title>
<v-divider></v-divider>
<v-list dense>
<v-list-item
v-for="when in item.when"
:key="when.day">
<v-list-item-content>{{ when.day }}</v-list-item-content>
<v-list-item-content class="align-end">
{{ when.from }} - {{ when.to }}
</v-list-item-content>
</v-list-item>
</v-list>
</v-card>
</div>
</div>
</div>
</template>
<script>
export default {
data: () => ({
scheduleData: [
{
name: 'Création de robot super cool',
description: 'Clita duo sanctus sed rebum elitr dolores et lorem stet',
when: [
{
day: 'Lundi',
from: '13:45',
to: '14:25'
},
{
day: 'Mardi',
from: '10:30',
to: '11:00'
},
{
day: 'Mecredi',
from: '09:00',
to: '10:00'
}
]
},
{
name: 'Introduction à la programmation',
description: 'Clita duo sanctus sed rebum elitr dolores et lorem stetEt ipsum sit et invidunt invidunt tempor lorem consetetur amet, takimata elitr sanctus nonumy at amet ut ut. Justo et stet sanctus no at at, sit ut sit vero rebum ipsum aliquyam vero. Ea at diam vero vero magna kasd ipsum. Diam ipsum amet consetetur sadipscing amet, sed lorem dolor.',
when: [
{
day: 'Lundi',
from: '13:45',
to: '14:25'
},
{
day: 'Mardi',
from: '10:30',
to: '11:00'
},
{
day: 'Mecredi',
from: '09:00',
to: '10:00'
}
]
},
{
name: 'Ldsldsllds',
description: 'Clita duo sanctus sed rebum elitr dolores et lorem stetEt ipsum sit et invidunt invidunt tempor lorem consetetur amet, takimata elitr sanctus nonumy at amet ut ut. Justo et stet sanctus no at at, sit ut sit vero rebum ipsum aliquyam vero. Ea at diam vero vero magna kasd ipsum. Diam ipsum amet consetetur sadipscing amet, sed lorem dolor.',
when: [
{
day: 'Lundi',
from: '13:45',
to: '14:25'
},
{
day: 'Mardi',
from: '10:30',
to: '11:00'
},
{
day: 'Mecredi',
from: '09:00',
to: '10:00'
}
]
}
]
})
}
</script>
<style scoped>
.schedule-item {
width: 25em;
}
</style>

View file

@ -1,10 +1,14 @@
<template>
<div class="home">
<h2>Vous êtes :</h2>
<ul>
<li><a href="">Une association</a></li>
<li><a href="">Administrateur de l'Espace Condorcet Centre Social</a></li>
</ul>
<v-main>
<v-container>
<h2>Vous êtes :</h2>
<ul>
<li><router-link :to="{name: 'DelegateMain'}">Une association</router-link></li>
<li><router-link :to="{name: 'OrganizationList'}">Administrateur de l'Espace Condorcet Centre Social</router-link></li>
</ul>
</v-container>
</v-main>
</div>
</template>

387
yarn.lock
View file

@ -782,14 +782,6 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
"@babel/runtime-corejs3@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz#f29fc1990307c4c57b10dbd6ce667b27159d9e0d"
integrity sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw==
dependencies:
core-js-pure "^3.0.0"
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.6":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99"
@ -937,9 +929,9 @@
integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
"@types/glob@^7.1.1":
version "7.1.2"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.2.tgz#06ca26521353a545d94a0adc74f38a59d232c987"
integrity sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==
version "7.1.3"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
dependencies:
"@types/minimatch" "*"
"@types/node" "*"
@ -960,9 +952,9 @@
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
"@types/node@*":
version "14.0.14"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce"
integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==
version "14.0.23"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806"
integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==
"@types/normalize-package-data@^2.4.0":
version "2.4.0"
@ -1494,14 +1486,14 @@ ajv-errors@^1.0.0:
integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
version "3.5.0"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.0.tgz#5c894537098785926d71e696114a53ce768ed773"
integrity sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw==
version "3.5.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz#b83ca89c5d42d69031f424cad49aada0236c6957"
integrity sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==
ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5:
version "6.12.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
version "6.12.3"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706"
integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
@ -1754,12 +1746,12 @@ atob@^2.1.2:
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
autoprefixer@^9.8.0:
version "9.8.4"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.4.tgz#736f1012673a70fa3464671d78d41abd54512863"
integrity sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==
version "9.8.5"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.5.tgz#2c225de229ddafe1d1424c02791d0c3e10ccccaa"
integrity sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg==
dependencies:
browserslist "^4.12.0"
caniuse-lite "^1.0.30001087"
caniuse-lite "^1.0.30001097"
colorette "^1.2.0"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
@ -2061,12 +2053,12 @@ browserify-zlib@^0.2.0:
pako "~1.0.5"
browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.5:
version "4.12.2"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.2.tgz#76653d7e4c57caa8a1a28513e2f4e197dc11a711"
integrity sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==
version "4.13.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.13.0.tgz#42556cba011e1b0a2775b611cba6a8eca18e940d"
integrity sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==
dependencies:
caniuse-lite "^1.0.30001088"
electron-to-chromium "^1.3.483"
caniuse-lite "^1.0.30001093"
electron-to-chromium "^1.3.488"
escalade "^3.0.1"
node-releases "^1.1.58"
@ -2243,10 +2235,15 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001087, caniuse-lite@^1.0.30001088:
version "1.0.30001093"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz#833e80f64b1a0455cbceed2a4a3baf19e4abd312"
integrity sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001097:
version "1.0.30001099"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001099.tgz#540118fcc6842d1fde62f4ee5521d1ec6afdb40e"
integrity sha512-sdS9A+sQTk7wKoeuZBN/YMAHVztUfVnjDi4/UV3sDE8xoh7YR12hKW+pIdB3oqKGwr9XaFL2ovfzt9w8eUI5CA==
canvas-exif-orientation@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/canvas-exif-orientation/-/canvas-exif-orientation-0.4.0.tgz#b487f3701998a9e879eb104010b2a58115368b6b"
integrity sha1-tIfzcBmYqeh56xBAELKlgRU2i2s=
case-sensitive-paths-webpack-plugin@^2.3.0:
version "2.3.0"
@ -2533,9 +2530,9 @@ color@^3.0.0:
color-string "^1.5.2"
colorette@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.0.tgz#45306add826d196e8c87236ac05d797f25982e63"
integrity sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==
version "1.2.1"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
@ -2708,11 +2705,6 @@ core-js-compat@^3.6.2, core-js-compat@^3.6.5:
browserslist "^4.8.5"
semver "7.0.0"
core-js-pure@^3.0.0:
version "3.6.5"
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813"
integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==
core-js@^2.4.0:
version "2.6.11"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
@ -3033,13 +3025,6 @@ decamelize@^1.2.0:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
decamelize@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-3.2.0.tgz#84b8e8f4f8c579f938e35e2cc7024907e0090851"
integrity sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==
dependencies:
xregexp "^4.2.4"
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@ -3349,10 +3334,10 @@ ejs@^2.6.1:
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
electron-to-chromium@^1.3.483:
version "1.3.485"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.485.tgz#ee67ba44fbe0dddc9dd439af532e593f6c8baaa6"
integrity sha512-Qclz/MFjp6H1oMd1U1AWCWqT8DW/SaN7lUb6ejh03bD6lBoN2X8W2xhXfsU4rdjf7TWReb0ZOGxo6MjsFiEgzQ==
electron-to-chromium@^1.3.488:
version "1.3.497"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.497.tgz#de00f2f2f44c258c4577fbfbd5124b94c18bfa44"
integrity sha512-sPdW5bUDZwiFtoonuZCUwRGzsZmKzcLM0bMVhp6SMCfUG+B3faENLx3cE+o+K0Jl+MPuNA9s9cScyFjOlixZpQ==
elegant-spinner@^1.0.1:
version "1.0.1"
@ -3961,6 +3946,13 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
fault@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==
dependencies:
format "^0.2.0"
faye-websocket@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
@ -4186,6 +4178,11 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
format@^0.2.0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@ -4548,6 +4545,11 @@ highlight.js@^9.6.0:
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c"
integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==
highlight.js@~10.1.0:
version "10.1.1"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.1.1.tgz#691a2148a8d922bf12e52a294566a0d993b94c57"
integrity sha512-b4L09127uVa+9vkMgPpdUQP78ickGbHEQTWeBrQFTJZ4/n2aihWOGS0ZoUqAwjVmfjhq/C76HRzkqwZhK4sBbg==
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@ -4846,9 +4848,9 @@ inherits@2.0.3:
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
inquirer@^7.0.0, inquirer@^7.1.0:
version "7.3.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.0.tgz#aa3e7cb0c18a410c3c16cdd2bc9dcbe83c4d333e"
integrity sha512-K+LZp6L/6eE5swqIcVXrxl21aGDU4S50gKH0/d96OMQnSBCyGyZl/oZhbkVmdp5sBoINHd4xZvFSARh2dk6DWA==
version "7.3.2"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.2.tgz#25245d2e32dc9f33dbe26eeaada231daa66e9c7c"
integrity sha512-DF4osh1FM6l0RJc5YWYhSDB6TawiBRlbV9Cox8MWlidU218Tb7fm3lQTULyUJDfJ0tjbzl0W4q651mrCCEM55w==
dependencies:
ansi-escapes "^4.2.1"
chalk "^4.1.0"
@ -4856,7 +4858,7 @@ inquirer@^7.0.0, inquirer@^7.1.0:
cli-width "^3.0.0"
external-editor "^3.0.3"
figures "^3.0.0"
lodash "^4.17.15"
lodash "^4.17.16"
mute-stream "0.0.8"
run-async "^2.4.0"
rxjs "^6.6.0"
@ -5625,10 +5627,10 @@ lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.3:
version "4.17.19"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
log-symbols@^1.0.2:
version "1.0.2"
@ -5677,6 +5679,14 @@ lower-case@^1.1.1:
resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
lowlight@^1.14.0:
version "1.14.0"
resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.14.0.tgz#83ebc143fec0f9e6c0d3deffe01be129ce56b108"
integrity sha512-N2E7zTM7r1CwbzwspPxJvmjAbxljCPThTFawEX2Z7+P3NGrrvY54u8kyU16IY4qWfoVIxY8SYCS8jTkuG7TqYA==
dependencies:
fault "^1.0.0"
highlight.js "~10.1.0"
lru-cache@^4.0.1, lru-cache@^4.1.2:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
@ -6041,9 +6051,9 @@ negotiator@0.6.2:
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
nice-try@^1.0.4:
version "1.0.5"
@ -6101,9 +6111,9 @@ node-ipc@^9.1.1:
vm-browserify "^1.0.1"
node-releases@^1.1.58:
version "1.1.58"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935"
integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==
version "1.1.59"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.59.tgz#4d648330641cec704bff10f8e4fe28e453ab8e8e"
integrity sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw==
normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
version "2.5.0"
@ -6355,6 +6365,11 @@ ora@^3.4.0:
strip-ansi "^5.2.0"
wcwidth "^1.0.1"
orderedmap@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.1.tgz#c618e77611b3b21d0fe3edc92586265e0059c789"
integrity sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==
original@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
@ -6699,6 +6714,11 @@ pnp-webpack-plugin@^1.6.4:
dependencies:
ts-pnp "^1.1.6"
popper.js@^1.16.1:
version "1.16.1"
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==
portfinder@^1.0.26:
version "1.0.26"
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70"
@ -7096,6 +7116,130 @@ promise-inflight@^1.0.1:
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
prosemirror-collab@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.2.2.tgz#8d2c0e82779cfef5d051154bd0836428bd6d9c4a"
integrity sha512-tBnHKMLgy5Qmx9MYVcLfs3pAyjtcqYYDd9kp3y+LSiQzkhMQDfZSV3NXWe4Gsly32adSef173BvObwfoSQL5MA==
dependencies:
prosemirror-state "^1.0.0"
prosemirror-commands@1.1.4, prosemirror-commands@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.4.tgz#991563e67623acab4f8c510fad1570f8b4693780"
integrity sha512-kj4Qi+8h3EpJtZuuEDwZ9h2/QNGWDsIX/CzjmClxi9GhxWyBUMVUvIFk0mgdqHyX20lLeGmOpc0TLA5aPzgpWg==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
prosemirror-dropcursor@1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz#28738c4ed7102e814d7a8a26d70018523fc7cd6d"
integrity sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw==
dependencies:
prosemirror-state "^1.0.0"
prosemirror-transform "^1.1.0"
prosemirror-view "^1.1.0"
prosemirror-gapcursor@1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.5.tgz#0c37fd6cbb1d7c46358c2e7397f8da9a8b5c6246"
integrity sha512-SjbUZq5pgsBDuV3hu8GqgIpZR5eZvGLM+gPQTqjVVYSMUCfKW3EGXTEYaLHEl1bGduwqNC95O3bZflgtAb4L6w==
dependencies:
prosemirror-keymap "^1.0.0"
prosemirror-model "^1.0.0"
prosemirror-state "^1.0.0"
prosemirror-view "^1.0.0"
prosemirror-history@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.1.3.tgz#4f76a1e71db4ef7cdf0e13dec6d8da2aeaecd489"
integrity sha512-zGDotijea+vnfnyyUGyiy1wfOQhf0B/b6zYcCouBV8yo6JmrE9X23M5q7Nf/nATywEZbgRLG70R4DmfSTC+gfg==
dependencies:
prosemirror-state "^1.2.2"
prosemirror-transform "^1.0.0"
rope-sequence "^1.3.0"
prosemirror-inputrules@1.1.2, prosemirror-inputrules@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz#487e46c763e1212a4577397aba7706139084f012"
integrity sha512-Ja5Z3BWestlHYGvtSGqyvxMeB8QEuBjlHM8YnKtLGUXMDp965qdDV4goV8lJb17kIWHk7e7JNj6Catuoa3302g==
dependencies:
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
prosemirror-keymap@1.1.4, prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2:
version "1.1.4"
resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz#8b481bf8389a5ac40d38dbd67ec3da2c7eac6a6d"
integrity sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg==
dependencies:
prosemirror-state "^1.0.0"
w3c-keyname "^2.2.0"
prosemirror-model@1.10.0, prosemirror-model@1.9.1, prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.10.0, prosemirror-model@^1.8.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.9.1.tgz#8c08cf556f593c5f015548d2c1a6825661df087f"
integrity sha512-Qblh8pm1c7Ll64sYLauwwzjimo/tFg1zW3Q3IWhKRhvfOEgRKqa6dC5pRrAa+XHOIjBFEYrqbi52J5bqA2dV8Q==
dependencies:
orderedmap "^1.1.0"
prosemirror-schema-list@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.2.tgz#310809209094b03425da7f5c337105074913da6c"
integrity sha512-dgM9PwtM4twa5WsgSYMB+J8bwjnR43DAD3L9MsR9rKm/nZR5Y85xcjB7gusVMSsbQ2NomMZF03RE6No6mTnclQ==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-transform "^1.0.0"
prosemirror-state@1.3.3, prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.3.3.tgz#b2862866b14dec2b3ae1ab18229f2bd337651a2c"
integrity sha512-PLXh2VJsIgvlgSTH6I2Yg6vk1CzPDp21DFreVpQtDMY2S6WaMmrQgDTLRcsrD8X38v8Yc873H7+ogdGzyIPn+w==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-transform "^1.0.0"
prosemirror-tables@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.1.0.tgz#e7fc65e57a44759b0b999d8c71294f79e5a4d54b"
integrity sha512-E00+KSbDw65966GdiLBpqTNxIextw0RavlGmvdv/dyYbN9OTD0gzaoCU1S8MAbz4GLKmY9Y/g4nSiC1IL1ThQg==
dependencies:
prosemirror-keymap "^1.1.2"
prosemirror-model "^1.8.1"
prosemirror-state "^1.3.1"
prosemirror-transform "^1.2.1"
prosemirror-view "^1.13.3"
prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.2.6:
version "1.2.7"
resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.2.7.tgz#ba0e291a3cb43e6b633b779d93f53d01f5dad570"
integrity sha512-/107Lo2zeDgXuJBxb8s/clNu0Z2W8Gv3MKmkuSS/68Mcr7LBaUnN/Hj2g+GUxEJ7MpExCzFs65GrsNo2K9rxUQ==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-utils@^0.9.6:
version "0.9.6"
resolved "https://registry.yarnpkg.com/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz#3d97bd85897e3b535555867dc95a51399116a973"
integrity sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA==
prosemirror-view@1.15.0:
version "1.15.0"
resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.15.0.tgz#372102c91d05b3b0f371b3eb59aeacedb5011bba"
integrity sha512-a7Q76sO/DCZr2UX2Rv1Rbw52cr9kVIz8iJOf/rq4mPN1NA3lugq2BKJgUMwlB3U4utyw3olLigqouRHM48NJyg==
dependencies:
prosemirror-model "^1.1.0"
prosemirror-state "^1.0.0"
prosemirror-transform "^1.1.0"
prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.15.0:
version "1.15.2"
resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.15.2.tgz#3f07881d11f18c033467591bbaec26b569bbc22c"
integrity sha512-0wftmMDVD8VXj2HZgv6Rg//+tgJC0lpV9LkYlCiAkDLKsf4yW3Ozs5td1ZXqsyoqvX0ga/k5g2EyLbqOMmC1+w==
dependencies:
prosemirror-model "^1.1.0"
prosemirror-state "^1.0.0"
prosemirror-transform "^1.1.0"
proxy-addr@~2.0.5:
version "2.0.6"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
@ -7566,6 +7710,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
rope-sequence@^1.3.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.2.tgz#a19e02d72991ca71feb6b5f8a91154e48e3c098b"
integrity sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==
run-async@^2.4.0:
version "2.4.1"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
@ -8252,9 +8401,9 @@ strip-indent@^2.0.0:
integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
strip-json-comments@^3.0.1:
version "3.1.0"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
stylehacks@^4.0.0:
version "4.0.3"
@ -8437,6 +8586,72 @@ timsort@^0.3.0:
resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
tiptap-commands@^1.14.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tiptap-commands/-/tiptap-commands-1.14.1.tgz#7c3c4d27e6d66701b2f308f79eee01ccde03e14a"
integrity sha512-8yUkcUgTvEZqzhCJdWN7sY4IB/7IAnDtk0gcfXODOXyf+i7fMj4E/k741jlPxYSUFgWWYZWGks29EG6KJ2IQvQ==
dependencies:
prosemirror-commands "^1.1.4"
prosemirror-inputrules "^1.1.2"
prosemirror-model "^1.10.0"
prosemirror-schema-list "^1.1.2"
prosemirror-state "^1.3.3"
prosemirror-tables "^1.1.0"
prosemirror-utils "^0.9.6"
tiptap-utils "^1.10.1"
tiptap-extensions@^1.14.0:
version "1.31.1"
resolved "https://registry.yarnpkg.com/tiptap-extensions/-/tiptap-extensions-1.31.1.tgz#7b6cbd334f0484699d035533e11a2d02a26ffd8d"
integrity sha512-fDaU+ghnK5/kTkS+HHn1TjljNv66y0ED1ppP1iszk7hmuBc1bo+XfFzhsViqcYi8QB9AeHzBEmvVF1fnKNar4A==
dependencies:
lowlight "^1.14.0"
prosemirror-collab "^1.2.2"
prosemirror-history "^1.1.3"
prosemirror-model "^1.10.0"
prosemirror-state "^1.3.3"
prosemirror-tables "^1.1.0"
prosemirror-transform "^1.2.6"
prosemirror-utils "^0.9.6"
prosemirror-view "^1.15.0"
tiptap "^1.29.1"
tiptap-commands "^1.14.1"
tiptap-utils@^1.10.1:
version "1.10.1"
resolved "https://registry.yarnpkg.com/tiptap-utils/-/tiptap-utils-1.10.1.tgz#bb958fda0a00928e610bee0e004809bdc8827ddd"
integrity sha512-ET3khlkapIPDPuuNou5PhXsI9PE1O8khlqltoE1mcD2eMBQ+q/P/knJNasmBywkZYXJEqJlZSeVufRL0oEH2ZQ==
dependencies:
prosemirror-model "^1.10.0"
prosemirror-state "^1.3.3"
prosemirror-tables "^1.1.0"
prosemirror-utils "^0.9.6"
tiptap-vuetify@^2.23.0:
version "2.23.0"
resolved "https://registry.yarnpkg.com/tiptap-vuetify/-/tiptap-vuetify-2.23.0.tgz#dc6ad26bd029a6392ae86cc5eb9d4b173a211ac6"
integrity sha512-Yr6ra2XYAxmF2wM+EALaAyTpiqtql3TPa651+aVAGKlkP3Vr3Ydm6+rtTA/GAlspX3IPq/x61DG4NDrKdMnZMQ==
dependencies:
popper.js "^1.16.1"
tiptap "^1.16.2"
tiptap-extensions "^1.14.0"
tiptap@^1.16.2, tiptap@^1.29.1:
version "1.29.1"
resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.29.1.tgz#9a8d8b360ce53491556f535b47a9a631e3a1808f"
integrity sha512-clb92b4/Ej83/bGLCnV8V3vifFN99B1HOvlP9D0U3Ym0jKwnryvk285oWl7255D9bvjukSVwmx4vWnBIZmpGUA==
dependencies:
prosemirror-commands "1.1.4"
prosemirror-dropcursor "1.3.2"
prosemirror-gapcursor "1.1.5"
prosemirror-inputrules "1.1.2"
prosemirror-keymap "1.1.4"
prosemirror-model "1.10.0"
prosemirror-state "1.3.3"
prosemirror-view "1.15.0"
tiptap-commands "^1.14.1"
tiptap-utils "^1.10.1"
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@ -8880,6 +9095,14 @@ vue-cli-plugin-vuetify@^2.0.6:
semver "^7.1.2"
shelljs "^0.8.3"
vue-croppa@^1.3.8:
version "1.3.8"
resolved "https://registry.yarnpkg.com/vue-croppa/-/vue-croppa-1.3.8.tgz#1aac95bf5d94020de7bc1ea7ca61e3aadfff1811"
integrity sha512-WwYgEKscTCD7BzhnbfRJfzWIU6RcMq2JRimB3aI5gGzpADmpKuqmDh9+oVfiZaEnpmRthgXZxcAvbxU6CeIU9w==
dependencies:
canvas-exif-orientation "^0.4.0"
object-assign "^4.1.1"
vue-eslint-parser@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz#9cdbcc823e656b087507a1911732b867ac101e83"
@ -8947,9 +9170,9 @@ vue@^2.5.17, vue@^2.6.11:
integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==
vuetify-loader@^1.3.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/vuetify-loader/-/vuetify-loader-1.5.0.tgz#511173c4d1498761210708f7e475dff60fcee8bb"
integrity sha512-JC2EVAblox2FFWE8NIUoHvQmGnnGJLrHISo2Ngciov3mWEWpt2B3qfQ3CYwmUJ7nM99DQgYDdNs26Dg3bgKzEQ==
version "1.6.0"
resolved "https://registry.yarnpkg.com/vuetify-loader/-/vuetify-loader-1.6.0.tgz#05df0805b3ab2ff0de198109d34f9da3f69da667"
integrity sha512-1bx3YeZ712dT1+QMX+XSFlP0O5k5O5Ui9ysBBmUZ9bWkAEHWZJQI9soI+qG5qmeFxUC0L9QYMCIKP0hOL/pf3Q==
dependencies:
file-loader "^4.0.0"
loader-utils "^1.2.0"
@ -8964,6 +9187,11 @@ vuex@^3.4.0:
resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.5.1.tgz#f1b8dcea649bc25254cf4f4358081dbf5da18b3d"
integrity sha512-w7oJzmHQs0FM9LXodfskhw9wgKBiaB+totOdb8sNzbTB2KDCEEwEs29NzBZFh/lmEK1t5tDmM1vtsO7ubG1DFw==
w3c-keyname@^2.2.0:
version "2.2.4"
resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.4.tgz#4ade6916f6290224cdbd1db8ac49eab03d0eef6b"
integrity sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==
watchpack-chokidar2@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
@ -9364,13 +9592,6 @@ ws@^6.0.0, ws@^6.2.1:
dependencies:
async-limiter "~1.0.0"
xregexp@^4.2.4:
version "4.3.0"
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50"
integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==
dependencies:
"@babel/runtime-corejs3" "^7.8.3"
xtend@^4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
@ -9429,12 +9650,12 @@ yargs@^13.3.2:
yargs-parser "^13.1.2"
yargs@^15.0.0:
version "15.4.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.0.tgz#53949fb768309bac1843de9b17b80051e9805ec2"
integrity sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw==
version "15.4.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
dependencies:
cliui "^6.0.0"
decamelize "^3.2.0"
decamelize "^1.2.0"
find-up "^4.1.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"