strette di mano

This commit is contained in:
Surya Paolo
2023-01-06 15:51:58 +01:00
parent d5d005a714
commit 865e1ad738
37 changed files with 644 additions and 76 deletions

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.51"
APP_VERSION="0.5.53"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13"
DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.51"
APP_VERSION="0.5.53"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.51"
APP_VERSION="0.5.53"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13"
DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.51"
APP_VERSION="0.5.53"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.51"
APP_VERSION="0.5.53"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="14"
DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -72,6 +72,7 @@
"vue-scroll-reveal": "^1.0.11",
"vue-social-sharing": "^4.0.0-alpha4",
"vue-svgicon": "^4.0.0-alpha.3",
"vue-timeago3": "^2.3.0",
"vue2-dragula": "^2.5.5",
"vuex": "^4.1.0",
"vuex-router-sync": "^6.0.0-rc.1"

View File

@@ -37,7 +37,7 @@ module.exports = configure((ctx) => ({
// --> boot files are part of "main.js"
// https://v2.quasar.dev/quasar-cli/boot-files
// boot: ['vue-i18n', 'vue-meta', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'vue-idb', 'dragula', 'guard'],
boot: ['i18n', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'calendar', 'social-sharing'],
boot: ['i18n', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'calendar', 'social-sharing', 'timeago'],
// https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-css
css: [
@@ -238,8 +238,7 @@ module.exports = configure((ctx) => ({
'Ripple',
'ClosePopup',
],
// Quasar plugins
plugins: [
_plugins: [
'Meta',
'Dialog',
'Notify',
@@ -247,13 +246,25 @@ module.exports = configure((ctx) => ({
'Loading',
'AppVisibility',
],
get plugins_1() {
return this._plugins;
},
set plugins_1(value) {
this._plugins = value;
},
get plugins() {
return this._plugins;
},
set plugins(value) {
this._plugins = value;
},
iconSet: 'fontawesome-v5',
lang: 'it', // Quasar language
},
// animations: 'all', // --- includes all animations
animations: 'all', // --- includes all animations
// https://v2.quasar.dev/options/animations
animations: [],
// animations: [],
// https://v2.quasar.dev/quasar-cli/developing-ssr/configuring-ssr
ssr: {

7
src/boot/timeago.ts Executable file
View File

@@ -0,0 +1,7 @@
//@ts-ignore
import timeago from 'vue-timeago3'
import { boot } from 'quasar/wrappers'
export default boot(({ app }) => {
app.use(timeago)
})

View File

@@ -96,10 +96,15 @@ export const shared_consts = {
FRIENDSCMD: {
SETTRUST: 121,
REQFRIEND: 125,
REQHANDSHAKE: 128,
SETFRIEND: 132,
SETHANDSHAKE: 133,
REMOVE_FROM_MYFRIENDS: 144,
REFUSE_REQ_FRIEND: 145,
CANCEL_REQ_FRIEND: 146,
REMOVE_FROM_MYHANDSHAKE: 147,
REFUSE_REQ_HANDSHAKE: 148,
CANCEL_REQ_HANDSHAKE: 149,
BLOCK_USER: 155,
UNBLOCK_USER: 156,
REPORT_USER: 158,
@@ -997,6 +1002,9 @@ export const shared_consts = {
StatusNotifs: {
STATUS_FRIENDS_ACCEPTED: 1,
STATUS_FRIENDS_REFUSED: 2,
STATUS_FRIENDS_REPORTED: 3,
STATUS_HANDSHAKE_ACCEPTED: 10,
STATUS_HANDSHAKE_REFUSED: 11,
},
GroupsNotifs: {
@@ -1063,6 +1071,12 @@ export const shared_consts = {
TYPEDIR_MSGS: 7,
ID_MSGS_NEW_REC: 1,
TYPEDIR_HANDSHAKE: 10,
ID_HANDSHAKE_NEW_REC: 1,
ID_HANDSHAKE_ACCEPTED: 2,
ID_HANDSHAKE_REFUSED: 4,
ID_HANDSHAKE_ACCEPTED_MY_REQUEST: 8,
TYPEDIR_TEST: 444,
ID_TEST_NEW_REC: 1,
},

View File

@@ -1044,7 +1044,7 @@
</q-table>
<q-page-sticky
v-if="mytable && butt_modif_new"
v-if="mytable && butt_modif_new && !hidetitleIfEmpty"
position="bottom-right"
:offset="[18, 68]"
>

View File

@@ -9,6 +9,7 @@ import { CDateTime } from '@/components/CDateTime'
import { CMyGroup } from '@/components/CMyGroup'
import { CMyCircuit } from '@/components/CMyCircuit'
import { CNotifAtTop } from '@src/components/CNotifAtTop'
import { CTimeAgo } from '@src/components/CTimeAgo'
import { CSendCoins } from '@/components/CSendCoins'
import { CMyUser } from '@/components/CMyUser'
import { CCheckIfIsLogged } from '@/components/CCheckIfIsLogged'
@@ -34,7 +35,8 @@ export default defineComponent({
name: 'CMyActivities',
components: {
CProfile, CTitleBanner, CMyFieldDb, CSkill, CDateTime, CCopyBtn, CUserNonVerif, CMyFieldRec, CMyUser,
CMyGroup, CLabel, CMyCircuit, CSendCoins, CNotifAtTop, CCheckIfIsLogged
CMyGroup, CLabel, CMyCircuit, CSendCoins, CNotifAtTop, CCheckIfIsLogged,
CTimeAgo
},
props: {
},

View File

@@ -53,7 +53,7 @@
</div>
<div class="last_access">
OnLine: {{ tools.timeAgo(myuser.lasttimeonline) }}
OnLine: <CTimeAgo :datetime="myuser.lasttimeonline" />
</div>
<div v-if="myuser.reported">

View File

@@ -79,7 +79,7 @@ export default defineComponent({
// @ts-ignore
const rectofind = circuitStore.listcircuits.find((circ: ICircuit) => circ.name === circuit.value.circuitname!)
if (rectofind) {
console.log('rectofind', rectofind)
// console.log('rectofind', rectofind)
circuit.value = rectofind
}
}

View File

@@ -73,8 +73,14 @@ export default defineComponent({
arr = userStore.my.profile.friends
} else if (props.modelValue === costanti.REQ_FRIENDS) {
arr = userStore.my.profile.req_friends
} else if (props.modelValue === costanti.HANDSHAKE) {
arr = userStore.my.profile.handshake
} else if (props.modelValue === costanti.REQ_HANDSHAKE) {
arr = userStore.my.profile.req_handshake
} else if (props.modelValue === costanti.ASK_SENT_FRIENDS) {
arr = userStore.my.profile.asked_friends
} else if (props.modelValue === costanti.ASK_SENT_HANDSHAKE) {
arr = userStore.my.profile.asked_handshake
} else if (props.modelValue === costanti.ASK_TRUST) {
arr = listTrusted.value.filter((user: IUserFields) => user.verified_by_aportador === undefined)
} else if (props.modelValue === costanti.TRUSTED) {
@@ -101,6 +107,15 @@ export default defineComponent({
label: t('mypages.request_friends') + ' (' + numReqFriends.value + ')',
value: costanti.REQ_FRIENDS
})
if (numHandShake.value > 0 || props.modelValue === costanti.HANDSHAKE)
mybutt.push({ label: t('mypages.handshake') + ' (' + numHandShake.value + ')', value: costanti.HANDSHAKE })
if (numReqHandShake.value > 0 || props.modelValue === costanti.REQ_HANDSHAKE)
mybutt.push({
label: t('mypages.requesthandshake') + ' (' + numReqHandShake.value + ')',
value: costanti.REQ_HANDSHAKE
})
if (numAskSentFriends.value > 0 || props.modelValue === costanti.ASK_SENT_FRIENDS)
mybutt.push({
label: t('mypages.request_sent') + ' (' + numAskSentFriends.value + ')',
@@ -121,11 +136,21 @@ export default defineComponent({
return (arr) ? arr.length : 0
})
const numHandShake = computed(() => {
const arr = userStore.my.profile.handshake
return (arr) ? arr.length : 0
})
const numReqFriends = computed(() => {
const arr = userStore.my.profile.req_friends
return (arr) ? arr.length : 0
})
const numReqHandShake = computed(() => {
const arr = userStore.my.profile.req_handshake
return (arr) ? arr.length : 0
})
const numAskSentFriends = computed(() => {
const arr = userStore.my.profile.asked_friends
return (arr) ? arr.length : 0

View File

@@ -83,6 +83,25 @@
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-else-if="visu === costanti.REQ_HANDSHAKE">
<q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list v-if="true" style="min-width: 150px">
<q-item clickable v-close-popup @click="setCmd($q, shared_consts.FRIENDSCMD.SETHANDSHAKE, userStore.my.username, '', contact.username)">
<q-item-section>{{ $t('friends.accept_handshake') }}</q-item-section>
</q-item>
</q-list>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup
@click="setCmd($q, shared_consts.FRIENDSCMD.REQ_HANDSHAKE, userStore.my.username, false, contact.username, false)">
<q-item-section>{{ $t('friends.reject_ask_handshake') }}</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-else-if="visu === costanti.REQ_ADD_USER_TO_GROUP">
<q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h">
@@ -253,11 +272,15 @@
<q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list v-if="!userStore.IsMyFriendByUsername(contact.username)" style="min-width: 200px">
<q-item clickable icon="fas fa-user-plus" v-close-popup
<q-list style="min-width: 200px">
<q-item v-if="!userStore.IsMyFriendByUsername(contact.username)" clickable icon="fas fa-user-plus" v-close-popup
@click="setCmd($q, shared_consts.FRIENDSCMD.REQFRIEND, userStore.my.username, true, contact.username)">
<q-item-section>{{ $t('friends.ask_friend') }}</q-item-section>
</q-item>
<q-item v-if="!userStore.IsHandShakeByUsername(contact.username)" clickable icon="far fa-handshake" v-close-popup
@click="setCmd($q, shared_consts.FRIENDSCMD.REQ_HANDSHAKE, userStore.my.username, true, contact.username)">
<q-item-section>{{ $t('handshake.ask_handshake') }}</q-item-section>
</q-item>
</q-list>
<q-list style="min-width: 200px">
<q-item clickable icon="fas fa-user-minus" v-close-popup
@@ -299,6 +322,30 @@
</q-item-section>
<q-item-section>{{ $t('friends.remove_from_myfriends') }}</q-item-section>
</q-item>
<q-item v-if="(!userStore.IsHandShakeByUsername(contact.username) && !userStore.IsAskedHandShakeByUsername(contact.username))"
clickable v-close-popup @click="setCmd($q, shared_consts.FRIENDSCMD.REQ_HANDSHAKE, userStore.my.username, true, contact.username)">
<q-item-section avatar>
<q-icon color="positive" name="far fa-handshake"/>
</q-item-section>
<q-item-section>{{ $t('handshake.ask_handshake') }}</q-item-section>
</q-item>
<q-item v-else-if="(!userStore.IsHandShakeByUsername(contact.username) && userStore.IsAskedHandShakeByUsername(contact.username))"
clickable v-close-popup @click="setCmd($q, shared_consts.FRIENDSCMD.REQ_HANDSHAKE, userStore.my.username, false, contact.username)">
<q-item-section avatar>
<q-icon color="negative" name="far fa-handshake-alt-slash"/>
</q-item-section>
<q-item-section>{{ $t('handshake.cancel_ask_handshake') }}</q-item-section>
</q-item>
<q-item v-else-if="userStore.IsHandShakeByUsername(contact.username)" style="min-width: 200px"
clickable v-close-popup
@click="setCmd($q, shared_consts.FRIENDSCMD.REMOVE_FROM_MYHANDSHAKE, userStore.my.username, '', contact.username)">
<q-item-section avatar>
<q-icon color="negative" name="far fa-handshake-alt-slash"/>
</q-item-section>
<q-item-section>{{ $t('handshake.remove_from_myhandshake') }}</q-item-section>
</q-item>
<q-item clickable v-close-popup @click="tools.reportUser($q, userStore.my.username, contact.username)">
<q-item-section avatar>
<q-icon color="negative" name="fas fa-flag"/>

View File

@@ -6,6 +6,7 @@ import {
import { INotData } from '../../model/index'
import MixinBase from '@src/mixins/mixin-base'
import { CTitleBanner } from '@/components/CTitleBanner'
import { CTimeAgo } from '@/components/CTimeAgo'
import { CCardState } from '../CCardState'
import { CMyFieldRec } from '../CMyFieldRec'
import { CElemStat } from '../CElemStat'
@@ -28,7 +29,7 @@ export default defineComponent({
name: 'CStatusReg',
props: {},
components: { CTitleBanner, CElemStat,
CCardState, CCardStat, CLineChart, CMyFieldRec },
CCardState, CCardStat, CLineChart, CMyFieldRec, CTimeAgo },
setup(props, { attrs, slots, emit }) {
const { t } = useI18n()
const $q = useQuasar()

View File

@@ -147,9 +147,17 @@
tools.getUserNameOnlyIfToShow(user)
}}</q-item-label>
</q-item-section>
<q-item-section side>{{
tools.timeAgo(user.lasttimeonline)
}}</q-item-section>
<q-item-section side>
<div
:class="
`text-h6 q-mr-sm text-bold ` + $q.dark.isActive
? `text-white`
: `text-black`
"
>
<CTimeAgo :datetime="user.lasttimeonline" />
</div>
</q-item-section>
</q-item>
</transition-group>
</q-list>
@@ -157,8 +165,12 @@
</q-tab-panel>
<q-tab-panel name="diffusori">
<div class="q-pa-md" style="max-width: 300px">
<div class="text-center text-bold text-h6">Aiuta RISO a crescere</div>
<div class="text-center"> Condividi il tuo link d'invito, alimentando nuovi ingressi alla RETE Solidale di RISO.
<div class="text-center text-bold text-h6">
Aiuta RISO a crescere
</div>
<div class="text-center">
Condividi il tuo link d'invito, alimentando nuovi ingressi
alla RETE Solidale di RISO.
</div>
<q-list bordered>
<transition-group
@@ -200,9 +212,12 @@
}}</q-item-label>
</q-item-section>
<q-item-section side
><span :class="`text-h6 q-mr-sm text-bold ` + $q.dark.isActive ? `text-white` : `text-black`">{{
user.count
}}</span></q-item-section
><div
:class="
`text-h6 q-mx-sm q-px-sm text-bold ` + ($q.dark.isActive ? `text-white`: `text-black`)
"
>{{ user.count }}
</div></q-item-section
>
</q-item>
</transition-group>
@@ -211,8 +226,11 @@
</q-tab-panel>
<q-tab-panel name="sharedlink">
<div class="q-pa-md" style="max-width: 300px">
<div class="text-center text-bold text-h6">Registrati con questi invitanti:</div>
<div class="text-center">Cliccare sulla persona per procedere alla registrazione
<div class="text-center text-bold text-h6">
Registrati con questi invitanti:
</div>
<div class="text-center">
Cliccare sulla persona per procedere alla registrazione
</div>
<q-list bordered>
<transition-group
@@ -254,8 +272,8 @@
}}</q-item-label>
</q-item-section>
<q-item-section side
><span class="text-h6 q-mr-sm"></span></q-item-section
>
><span class="text-h6 q-mr-sm"></span
></q-item-section>
</q-item>
</transition-group>
</q-list>

View File

View File

@@ -0,0 +1,41 @@
import { defineComponent, ref, computed, PropType, toRef, onMounted } from 'vue'
import { useUserStore } from '@store/UserStore'
import { useRouter } from 'vue-router'
import { useGlobalStore } from '@store/globalStore'
import { useI18n } from '@/boot/i18n'
import { tools } from '@store/Modules/tools'
import { toolsext } from '@store/Modules/toolsext'
import { es, it, enUS } from 'date-fns/locale' // import custom locale
export default defineComponent({
name: 'CTimeAgo',
components: {},
props: {
datetime: {
type: String,
required: true
},
},
setup(props, { emit }) {
const mylocale = ref(<any>null)
function mounted() {
mylocale.value = enUS
if (toolsext.getLocale() === 'it')
mylocale.value = it
else if (toolsext.getLocale() === 'es')
mylocale.value = es
}
mounted()
return {
tools,
toolsext,
mylocale,
}
}
})

View File

@@ -0,0 +1,19 @@
<template>
<timeago
:datetime="datetime"
auto-update
:converter-options="{
includeSeconds: true,
addSuffix: true,
useStrict: false,
}"
:locale="mylocale"
/>
</template>
<script lang="ts" src="./CTimeAgo.ts">
</script>
<style lang="scss" scoped>
@import './CTimeAgo.scss';
</style>

View File

@@ -0,0 +1 @@
export {default as CTimeAgo} from './CTimeAgo.vue'

View File

@@ -16,6 +16,7 @@ import { useUserStore } from '@store/UserStore'
import { CTitleBanner } from '@/components/CTitleBanner'
import { CMyFieldRec } from '@/components/CMyFieldRec'
import { CTimeAgo } from '@/components/CTimeAgo'
import { CMyFieldDb } from '@/components/CMyFieldDb'
import { CMyCircuits } from '@/components/CMyCircuits'
import { CFinder } from '@/components/CFinder'
@@ -28,7 +29,7 @@ import { useGlobalStore } from '@store/globalStore'
export default defineComponent({
name: 'coinsPopover',
components: { CTitleBanner, CMyFieldRec, CMyFieldDb, CMyCircuits, CFinder },
components: { CTitleBanner, CMyFieldRec, CTimeAgo, CMyFieldDb, CMyCircuits, CFinder },
emits: ['update:modelValue'],
props: {
modelValue: {

View File

@@ -151,7 +151,8 @@
</q-item-label>
<q-item-label caption lines="1" :class="(!notif.read) ? 'unread-date' : 'read-date'" @click="clickNotif(notif)">
{{ tools.timeAgo(notif.datenotif) }}
<CTimeAgo :datetime="notif.datenotif" />
<!--{{ // getUsernameChatByNotif(notif) }}-->
</q-item-label>
</q-item-section>

View File

@@ -16,6 +16,7 @@ import { useGlobalStore } from '@store/globalStore'
import { useUserStore } from '@store/UserStore'
import { CTitleBanner } from '@/components/CTitleBanner'
import { CTimeAgo } from '@/components/CTimeAgo'
import { CMyFieldRec } from '@/components/CMyFieldRec'
import { CMyFieldDb } from '@/components/CMyFieldDb'
import { shared_consts } from '@/common/shared_vuejs'
@@ -26,7 +27,7 @@ import { waitAndcheckPendingNotif } from '../../../store/Modules/ApiTables'
export default defineComponent({
name: 'notifPopover',
components: { CTitleBanner, CMyFieldRec, CMyFieldDb },
components: { CTitleBanner, CMyFieldRec, CMyFieldDb, CTimeAgo },
emits: ['update:modelValue'],
props: {
modelValue: {

View File

@@ -113,6 +113,26 @@
/>
</div>
</q-item-label>
<q-item-label caption lines="2" v-if="notif.typedir === shared_consts.TypeNotifs.TYPEDIR_HANDSHAKE && notif.status === 0" v-ripple>
<div class="row no-wrap justify-evenly" v-if="userStore.IsReqHandShakeByUsername(notif.sender)">
<q-btn
dense
rounded
size="sm"
icon="fas fa-user-plus"
color="positive" :label="$t('handshake.accept')"
@click="tools.addToMyHandShake(q, userStore.my.username, notif.sender)"
/>
<q-btn
dense
rounded
size="sm"
icon="fas fa-user-minus"
color="negative" :label="$t('handshake.refuse')"
@click="tools.refuseReqHandShake(q, userStore.my.username, notif.sender)"
/>
</div>
</q-item-label>
<q-item-label caption lines="2"
v-else-if="notif.typedir === shared_consts.TypeNotifs.TYPEDIR_GROUPS && notif.status === 0 && notif.typeid === shared_consts.TypeNotifs.ID_GROUP_REQUEST_TO_ENTER"
v-ripple>
@@ -137,7 +157,7 @@
</q-item-label>
<q-item-label caption lines="1" :class="(!notif.read) ? 'unread-date' : 'read-date'" @click="clickNotif(notif)">
{{ tools.timeAgo(notif.datenotif) }}
<CTimeAgo :datetime="notif.datenotif" />
<!--{{ // getUsernameChatByNotif(notif) }}-->
</q-item-label>
</q-item-section>

View File

@@ -174,6 +174,19 @@ export default function () {
descr += '( ' + $t('movement.causal') + ': ' + notif.extrarec.causal + ')'
}
}
} else if (notif.typedir === shared_consts.TypeNotifs.TYPEDIR_HANDSHAKE) {
if (notif.status === shared_consts.StatusNotifs.STATUS_HANDSHAKE_ACCEPTED) {
descr += '<br><em>' + $t('handshake.accepted') + '</em>'
} else if (notif.status === shared_consts.StatusNotifs.STATUS_HANDSHAKE_REFUSED) {
descr += '<br><em>' + $t('handshake.refused') + '</em>'
}
} else if (notif.typedir === shared_consts.TypeNotifs.TYPEDIR_CIRCUITS) {
if (notif.typeid === shared_consts.TypeNotifs.ID_CIRCUIT_SENDCOINSREQ) {
// console.log('notif.extrarec', notif.extrarec)
if (notif.extrarec && notif.extrarec.hasOwnProperty('causal') && notif.extrarec.causal) {
descr += '( ' + $t('movement.causal') + ': ' + notif.extrarec.causal + ')'
}
}
} else if (notif.typedir === shared_consts.TypeNotifs.TYPEDIR_GROUPS) {
if (notif.status === shared_consts.GroupsNotifs.STATUS_GROUPS_ACCEPTED) {
descr += '<br><em>' + $t('groups.accepted') + '</em>'

View File

@@ -248,6 +248,8 @@ export interface IConfPages {
showViewProfile: boolean
enablePwa: boolean
lang: number
videoPromo: string
PDFPromo: string
}
export interface IContacts {
facebook: string

View File

@@ -96,6 +96,8 @@ export interface IUserProfile {
myshares: IShareWithUs[]
friends: IFriends[]
req_friends: IFriends[]
handshake: IFriends[]
req_handshake: IFriends[]
mygroups: IMyGroup[]
mycircuits: IMyCircuit[]
manage_mygroups: IMyGroup[]
@@ -108,6 +110,7 @@ export interface IUserProfile {
// in memory
asked_friends: any[]
asked_handshake: any[]
asked_groups: IGroupShort[]
refused_groups: IGroupShort[]
list_usersgroup?: IFriends[]

View File

@@ -664,6 +664,16 @@
:type="costanti.FieldType.boolean"
>
</CMyFieldDb>
<CMyFieldDb
table="sites"
:title="$t('confpages.PDFPromo')"
:id="mysite._id"
:rec="mysite"
mykey="confpages"
mysubkey="PDFPromo"
:type="costanti.FieldType.string"
>
</CMyFieldDb>
</div>
<CMyFieldDb
table="sites"
@@ -675,6 +685,16 @@
:type="costanti.FieldType.boolean"
>
</CMyFieldDb>
<CMyFieldDb
table="sites"
:title="$t('confpages.videoPromo')"
:id="mysite._id"
:rec="mysite"
mykey="confpages"
mysubkey="videoPromo"
:type="costanti.FieldType.string"
>
</CMyFieldDb>
</q-tab-panel>
</q-tab-panels>

View File

@@ -209,11 +209,14 @@ const msg_it = {
duplicatedrecord: 'Vuoi Duplicare il record',
recdupfailed: 'Errore durante la duplicazione del Record',
friendsadded: 'Aggiunto alla lista di Amici',
handshakesadded: 'Aggiunto alla lista Strette di Mano',
domanda_removefriend: 'Rimuovi dagli Amici {username}?',
domanda_removehandshake: 'Rimuovi dalla lista Strette di Mano {username}?',
domanda_exit_fromgroup: 'Uscire dal Gruppo {groupname} ?',
domanda_addadminofmygroup: 'Aggiungere {username} come Amministratore del Gruppo {groupname} ?',
domanda_removeadminofmygroup: 'Rimuovere {username} dall\' incarico di Amministratore del Gruppo {groupname} ?',
removedfriend: 'Rimosso dalla lista di Amici',
removedhandshake: 'Rimosso dalla lista Strette di Mano',
addedtoadmin: 'Aggiunto {username} come amministratore',
removedtoadmin: 'Rimosso {username} come amministratore',
refusedgroup: 'Rifiutato a {username} la richiesta di entrare nel Gruppo',
@@ -223,23 +226,32 @@ const msg_it = {
insertgoodorservices_to_enter_circuit: 'Per poter entrare nel Circuito è necessario aggiungere almeno un Bene, Servizio o offrire Ospitalità',
deletedgroup: 'Gruppo Eliminato',
domanda_addtofriend: 'Aggiungere agli amici {username}?',
domanda_addtohandshake: 'Hai stretto la mano a {username}?',
addtohandshake: 'Hai stretto la mano a {username}',
domanda_addtogroup: 'Aggiungi {username} al gruppo {groupname}?',
domanda_addtocircuit: 'Aggiungi {username} al Circuito {circuitname}?',
addedfriend: 'Aggiunto alla lista di Amici',
addedhandshake: 'Aggiunto alla lista Strette di Mano',
addedgroup: 'Aggiunto al Gruppo',
addedcircuit: 'Aggiunto al Circuito {circuitname}',
domanda_trusted: 'Accettare la Fiducia a {username}?',
trusted: 'Accettato la Fiducia',
domanda_ask_friend: 'Chiedere l\'Amicizia a {username}?',
domanda_ask_handshake: 'Chiedere di confermare la vostra Stretta di mano a {username}?',
domanda_ask_group: 'Chiedere l\'invito al Gruppo {groupname}?',
askedtofriend: 'Chiesto l\'Amicizia a {username}',
askedtohandshake: 'Chiesto la Stretta di mano a {username}',
domanda_revoke_friend: 'Revocare la richiesta di Amicizia a {username}?',
domanda_revoke_handshake: 'Revocare la richiesta di Stretta di mano a {username}?',
domanda_revoke_group: 'Revocare la richiesta al gruppo {groupname}?',
domanda_refuse_group: 'Rifiutare la richiesta di {username} per entrare nel gruppo {groupname}?',
revoketofriend: 'Revocato la richiesta di Amicizia a {username}',
revoketohandshake: 'Revocato la richiesta di Stretta di mano a {username}',
domanda_cancel_req_friend: 'Annullare la richiesta di Amicizia a {username}?',
domanda_cancel_req_handshake: 'Annullare la richiesta di Stretta di mano a {username}?',
domanda_cancel_req_group: 'Annullare la richiesta d\'invito di {username} al gruppo {groupname}?',
cancel_req_friend: 'Annullata la richiesta di Amicizia a {username}',
cancel_req_handshake: 'Annullata la richiesta di Stretta di mano a {username}',
cancel_req_group: 'Annullata la richiesta al gruppo {groupname}',
domanda_rejectedtrust: 'Rifiutare la Fiducia a {username}?',
rejected: 'Rifiutato la Fiducia',
@@ -1067,10 +1079,25 @@ const msg_it = {
block_user: 'Blocca Utente',
ask_friend: 'Chiedi l\'Amicizia',
cancel_ask_friend: 'Annulla la richiesta di Amicizia',
cancel_ask_friend_short: 'Annulla richiesta',
cancel_ask_friend_short: 'Annulla rich. Amicizia',
reject_ask_friend: 'Rifiuta l\'Amicizia',
report_user: 'Segnala Utente',
},
handshake: {
strettedimano: 'Strette di mano',
received: 'Ricevute',
accept_trust: 'Accetta la Stretta di mano',
accepted: 'Stretta di mano Accettata',
refused: 'Stretta di mano Rifiutata',
accept: 'Accetta',
refuse: 'Rifiuta',
accept_handshake: 'Accetta la Stretta di mano',
remove_from_myhandshake: 'Rimuovi dalle Strette di mano',
ask_handshake: 'Chiedi',
cancel_ask_handshake: 'Annulla la richiesta di Stretta di mano',
cancel_ask_handshake_short: 'Annulla',
reject_ask_handshake: 'Rifiuta la Stretta di mano',
},
shared: {
info1: 'Info',
subscribes: 'Membri',
@@ -1351,9 +1378,11 @@ const msg_it = {
showViewGroups: 'Bott. Gruppi',
showViewUsers: 'Bott. Users',
showViewCircuits: 'Bott. Circuiti',
videoPromo: 'Video Presentazione',
showViewBooking: 'Bott. Prenotaz.',
showViewProfile: 'Bott. Profile',
enablePwa: 'PWA',
PDFPromo: 'PDF Presentazione',
},

View File

@@ -243,6 +243,10 @@ export const costanti = {
FIND_GROUP: 20,
MY_GROUPS: 21,
USER_GROUPS: 22,
HANDSHAKE: 23,
REQ_HANDSHAKE: 24,
ASK_SENT_HANDSHAKE: 25,
CREATE_GROUP: 30,
MANAGE_GROUPS: 31,
ADMIN_GROUPS: 40,

View File

@@ -3030,6 +3030,7 @@ export const tools = {
},
getstrShortDate(mydate: Date | number | string | undefined) {
try {
const DateFormatter = new Intl.DateTimeFormat(toolsext.getLocale() || void 0, {
weekday: 'long',
day: 'numeric',
@@ -3047,6 +3048,10 @@ export const tools = {
} catch (e) {
return ''
}
} catch (e) {
return ''
}
},
getstrVeryShortDate(mydate: Date | number | string | undefined) {
const DateFormatter = new Intl.DateTimeFormat(toolsext.getLocale() || void 0, {
@@ -5455,6 +5460,48 @@ export const tools = {
})
},
addToMyHandShake($q: any, username: string, usernameDest: string) {
const userStore = useUserStore()
const notifStore = useNotifStore()
$q.dialog({
message: t('db.domanda_addtohandshake', { username: usernameDest }),
ok: { label: t('dialog.yes'), push: true },
cancel: { label: t('dialog.cancel') },
title: t('db.domanda')
}).onOk(() => {
userStore.setFriendsCmd($q, t, username, usernameDest, shared_consts.FRIENDSCMD.SETHANDSHAKE, null)
.then((res: any) => {
if (res) {
notifStore.updateNotification = true
userStore.my.profile.handshake = [...userStore.my.profile.handshake, res]
userStore.my.profile.req_handshake = userStore.my.profile.req_handshake.filter((rec: IFriends) => rec.username !== usernameDest)
tools.showPositiveNotif($q, t('db.addedhandshake'))
}
})
})
},
removeFromMyHandShake($q: any, username: string, usernameDest: string) {
const userStore = useUserStore()
$q.dialog({
message: t('db.domanda_removehandshake', { username: usernameDest }),
ok: { label: t('dialog.yes'), push: true },
cancel: { label: t('dialog.cancel') },
title: t('db.domanda')
}).onOk(() => {
userStore.setFriendsCmd($q, t, username, usernameDest, shared_consts.FRIENDSCMD.REMOVE_FROM_MYHANDSHAKE, null).then((res) => {
if (res) {
userStore.my.profile.handshake = userStore.my.profile.handshake.filter((rec: IFriends) => rec.username !== usernameDest)
tools.showPositiveNotif($q, t('db.removedhandshake'))
}
})
})
},
blockUser($q: any, username: string, usernameDest: string) {
const userStore = useUserStore()
$q.dialog({
@@ -5525,6 +5572,27 @@ export const tools = {
})
},
refuseReqHandShake($q: any, username: string, usernameDest: string) {
const userStore = useUserStore()
const notifStore = useNotifStore()
$q.dialog({
message: t('db.domanda_revoke_handshake', { username: usernameDest }),
ok: { label: t('dialog.yes'), push: true },
cancel: { label: t('dialog.cancel') },
title: t('db.domanda')
}).onOk(() => {
userStore.setFriendsCmd($q, t, username, usernameDest, shared_consts.FRIENDSCMD.REMOVE_FROM_MYHANDSHAKE, null).then((res) => {
if (res) {
notifStore.updateNotification = true
userStore.my.profile.req_handshake = userStore.my.profile.req_handshake.filter((user: IFriends) => user.username !== usernameDest)
tools.showPositiveNotif($q, t('db.removedhandshake'))
}
})
})
},
updateMyData(res: any) {
const userStore = useUserStore()
const circuitStore = useCircuitStore()
@@ -5805,6 +5873,49 @@ export const tools = {
})
})
},
setRequestHandShake($q: any, username: string, usernameDest: string, value: boolean) {
const userStore = useUserStore()
let msg = ''
if (value) {
msg = t('db.domanda_ask_handshake', { username: usernameDest })
} else {
msg = t('db.domanda_revoke_handshake', { username: usernameDest })
}
$q.dialog({
message: msg,
ok: {
label: t('dialog.yes'),
push: true
},
cancel: {
label: t('dialog.cancel')
},
title: t('db.domanda')
}).onOk(() => {
userStore.setFriendsCmd($q, t, username, usernameDest, shared_consts.FRIENDSCMD.REQHANDSHAKE, value)
.then((res: any) => {
if (res) {
if (value) {
// ADD to req HandShake
userStore.my.profile.asked_handshake.push(res)
tools.showPositiveNotif($q, t('db.askedtohandshake', { username: usernameDest }))
} else {
// REMOVE to req HandShake
userStore.my.profile.asked_handshake = userStore.my.profile.asked_handshake.filter((rec: IUserFields) => rec.username !== usernameDest)
tools.showPositiveNotif($q, t('db.revoketohandshake', { username: usernameDest }))
}
} else {
tools.showNegativeNotif($q, t('db.recfailed'))
}
})
})
},
setRequestGroup($q: any, username: string, groupnameDest: string, value: boolean) {
const userStore = useUserStore()
@@ -5864,6 +5975,23 @@ export const tools = {
})
})
},
cancelReqHandShake($q: any, username: string, usernameDest: string) {
const userStore = useUserStore()
$q.dialog({
message: t('db.domanda_cancel_req_handshake', { username: usernameDest }),
ok: { label: t('dialog.yes'), push: true },
cancel: { label: t('dialog.cancel') },
title: t('db.domanda')
}).onOk(() => {
userStore.setFriendsCmd($q, t, username, usernameDest, shared_consts.FRIENDSCMD.CANCEL_REQ_HANDSHAKE, null).then((res) => {
if (res) {
userStore.my.profile.asked_handshake = userStore.my.profile.asked_handshake.filter((rec: IUserFields) => rec.username !== usernameDest)
tools.showPositiveNotif($q, t('db.cancel_req_handshake'))
}
})
})
},
cancelReqGroups($q: any, username: string, groupnameDest: string) {
const userStore = useUserStore()
$q.dialog({
@@ -6479,10 +6607,18 @@ export const tools = {
tools.addToMyFriends($q, username, dest)
} else if (cmd === shared_consts.FRIENDSCMD.REQFRIEND) {
tools.setRequestFriendship($q, username, dest, value)
} else if (cmd === shared_consts.FRIENDSCMD.SETHANDSHAKE) {
tools.addToMyHandShake($q, username, dest)
} else if (cmd === shared_consts.FRIENDSCMD.REQHANDSHAKE) {
tools.setRequestHandShake($q, username, dest, value)
} else if (cmd === shared_consts.FRIENDSCMD.REFUSE_REQ_FRIEND) {
tools.refuseReqFriends($q, username, dest)
} else if (cmd === shared_consts.FRIENDSCMD.REFUSE_REQ_HANDSHAKE) {
tools.refuseReqHandShake($q, username, dest)
} else if (cmd === shared_consts.FRIENDSCMD.CANCEL_REQ_FRIEND) {
tools.cancelReqFriends($q, username, dest)
} else if (cmd === shared_consts.FRIENDSCMD.CANCEL_REQ_HANDSHAKE) {
tools.cancelReqHandShake($q, username, dest)
} else if (cmd === shared_consts.CIRCUITCMD.SET) {
tools.addToMyCircuits($q, username, dest)
} else if (cmd === shared_consts.CIRCUITCMD.REQ) {
@@ -7079,30 +7215,6 @@ export const tools = {
}
},
timeAgo(input: any) {
const date = (input instanceof Date) ? input : new Date(input)
const formatter = new Intl.RelativeTimeFormat(toolsext.getLocale() || 'it')
const ranges: any = {
years: 3600 * 24 * 365,
months: 3600 * 24 * 30,
weeks: 3600 * 24 * 7,
days: 3600 * 24,
hours: 3600,
minutes: 60,
seconds: 1
}
const secondsElapsed = (date.getTime() - Date.now()) / 1000
let key: any
for (key in ranges) {
if (ranges[key] < Math.abs(secondsElapsed)) {
// @ts-ignore
const delta = secondsElapsed / ranges[key]
// @ts-ignore
return formatter.format(Math.round(delta), key)
}
}
},
getEnv(name: string) {
const config: any = {
// @ts-ignore

View File

@@ -65,6 +65,9 @@ export const DefaultUser: IUserFields = {
myshares: [],
friends: [],
req_friends: [],
handshake: [],
req_handshake: [],
asked_handshake: [],
mygroups: [],
mycircuits: [],
manage_mygroups: [],
@@ -123,6 +126,9 @@ export const DefaultProfile: IUserProfile = {
myshares: [],
friends: [],
req_friends: [],
handshake: [],
req_handshake: [],
asked_handshake: [],
mygroups: [],
mycircuits: [],
manage_mygroups: [],
@@ -220,6 +226,12 @@ export const useUserStore = defineStore('UserStore', {
else
return false
},
IsHandShakeByUsername(username: string): boolean {
if (this.my.profile.handshake)
return this.my.profile.handshake.findIndex((rec) => rec.username === username) >= 0
else
return false
},
IsMyGroupByGroupname(groupname: string): boolean {
if (this.my.profile.mygroups)
@@ -251,6 +263,13 @@ export const useUserStore = defineStore('UserStore', {
return false
},
IsAskedHandShakeByUsername(username: string): boolean {
if (this.my.profile.asked_handshake)
return this.my.profile.asked_handshake.findIndex((rec) => rec.username === username) >= 0
else
return false
},
IsReqFriendByUsername(username: string): boolean {
if (this.my.profile.req_friends)
return this.my.profile.req_friends.findIndex((rec) => rec.username === username) >= 0
@@ -258,6 +277,13 @@ export const useUserStore = defineStore('UserStore', {
return false
},
IsReqHandShakeByUsername(username: string): boolean {
if (this.my.profile.req_handshake)
return this.my.profile.req_handshake.findIndex((rec) => rec.username === username) >= 0
else
return false
},
IsAskedGroupByGroupname(groupname: string): boolean {
if (this.my.profile.asked_groups)
return this.my.profile.asked_groups.findIndex((rec: IGroupShort) => rec.groupname === groupname) >= 0
@@ -733,6 +759,7 @@ export const useUserStore = defineStore('UserStore', {
// Memory
this.my.profile.manage_mygroups = []
this.my.profile.asked_friends = []
this.my.profile.asked_handshake = []
this.my.profile.asked_groups = []
this.my.profile.refused_groups = []
}
@@ -1151,7 +1178,10 @@ export const useUserStore = defineStore('UserStore', {
.then((ris) => {
this.my.profile.friends = ris.data.friends.listFriends ? ris.data.friends.listFriends : []
this.my.profile.req_friends = ris.data.friends.listRequestFriends ? ris.data.friends.listRequestFriends : []
this.my.profile.handshake = ris.data.friends.listHandShake ? ris.data.friends.listHandShake : []
this.my.profile.req_handshake = ris.data.friends.listRequestHandShake ? ris.data.friends.listRequestHandShake : []
this.my.profile.asked_friends = ris.data.friends.listSentRequestFriends ? ris.data.friends.listSentRequestFriends : []
this.my.profile.asked_handshake = ris.data.friends.listSentRequestHandShake ? ris.data.friends.listSentRequestHandShake : []
return ris.data.user
}).catch((error) => {
@@ -1255,7 +1285,10 @@ export const useUserStore = defineStore('UserStore', {
.then((ris) => {
this.my.profile.friends = ris.data.listFriends ? ris.data.listFriends : []
this.my.profile.req_friends = ris.data.listRequestFriends ? ris.data.listRequestFriends : []
this.my.profile.handshake = ris.data.friends.listHandShake ? ris.data.friends.listHandShake : []
this.my.profile.req_handshake = ris.data.friends.listRequestHandShake ? ris.data.friends.listRequestHandShake : []
this.my.profile.asked_friends = ris.data.listSentRequestFriends ? ris.data.listSentRequestFriends : []
this.my.profile.asked_handshake = ris.data.friends.listSentRequestHandShake ? ris.data.friends.listSentRequestHandShake : []
return ris.data
}).catch((error) => {
return {}

View File

@@ -174,6 +174,8 @@ export const useGlobalStore = defineStore('GlobalStore', {
showViewProfile: false,
enablePwa: false,
lang: costanti.Lang.IT,
videoPromo: '',
PDFPromo: '',
},
},
provinces: [],

View File

@@ -10,6 +10,7 @@ import { CMyGroup } from '@/components/CMyGroup'
import { CMyCircuit } from '@/components/CMyCircuit'
import { CNotifAtTop } from '@src/components/CNotifAtTop'
import { CSendCoins } from '@/components/CSendCoins'
import { CTimeAgo } from '@/components/CTimeAgo'
import { CMyUser } from '@/components/CMyUser'
import { CUserNonVerif } from '@/components/CUserNonVerif'
import { CCheckIfIsLogged } from '@/components/CCheckIfIsLogged'
@@ -35,7 +36,7 @@ export default defineComponent({
components: {
CProfile, CTitleBanner, CMyFieldDb, CSkill, CDateTime, CCopyBtn, CUserNonVerif, CMyFieldRec, CMyUser,
CMyGroup, CLabel, CMyCircuit, CSendCoins, CNotifAtTop,
CCheckIfIsLogged
CCheckIfIsLogged, CTimeAgo
},
props: {},
setup() {
@@ -50,6 +51,8 @@ export default defineComponent({
const { getRefLink } = MixinUsers()
const animation = ref('fade')
const quantiHandShake = ref('')
const usersList = ref({show: false, title: '', list: []})
const username = computed(() => $route.params.username ? $route.params.username.toString() : userStore.my.username)
const idnotif = computed(() => $route.query.idnotif ? $route.query.idnotif.toString() : '')
@@ -59,6 +62,7 @@ export default defineComponent({
const showPic = ref(false)
const caricato = ref(false)
const showsendCoinTo = ref(false)
const showinghand = ref(false)
const myuser = ref(<IUserFields | null>null)
@@ -94,6 +98,8 @@ export default defineComponent({
filtroutente.value = [{ userId: myuser.value._id }]
notifStore.setAsRead(idnotif.value)
quantiHandShake.value = (myuser.value.profile.handshake ? myuser.value.profile.handshake.length : 0) + ' ' + t('handshake.received')
try {
listgroupsfiltered.value = globalStore.mygroups.filter((grp: IMyGroup) => myuser.value!.profile.mygroups.findIndex((rec: IMyGroup) => rec.groupname === grp.groupname) >= 0)
} catch (e) {
@@ -175,6 +181,7 @@ export default defineComponent({
username,
profile,
tools,
toolsext,
costanti,
myuser,
shared_consts,
@@ -201,6 +208,9 @@ export default defineComponent({
site,
listcircuitsfiltered,
isDebugOn,
showinghand,
quantiHandShake,
usersList,
}
}
})

View File

@@ -51,11 +51,19 @@
color="green"
>online</q-badge
>
<q-badge
v-if="userStore.IsHandShakeByUsername(myuser.username)"
align="bottom"
floating
color="red"
><q-icon name="fas fa-handshake"></q-icon
></q-badge>
</q-avatar>
</div>
<div class="last_access">
OnLine: {{ tools.timeAgo(myuser.lasttimeonline) }}
OnLine:
<CTimeAgo :datetime="myuser.lasttimeonline" />
</div>
<div v-if="myuser.reported">
@@ -147,7 +155,7 @@
</div>
<div class="last_access">
OnLine: {{ tools.timeAgo(myuser.lasttimeonline) }}
OnLine: <CTimeAgo :datetime="myuser.lasttimeonline" />
</div>
<div v-if="myuser.reported">
@@ -210,6 +218,100 @@
<div v-if="myuser._id" class="col-12 text-h8 q-mt-sm">
{{ myuser.profile.biografia }}
</div>
<q-banner
rounded
dense
size="lg"
class="bg-grey-1 shadow-5 q-my-sm"
color="primary q-title"
style="text-align: center"
>
<div class="mybanner bg-blue text-white">{{ $t('handshake.strettedimano')}}:</div>
<div v-if="userStore.IsHandShakeByUsername(myuser.username)">
{{ $t('db.addtohandshake', { username: myuser.username }) }}
</div>
<q-btn
:label="quantiHandShake"
class="q-my-sm"
rounded
icon="fas fa-handshake"
@click="
usersList.show = true;
usersList.title = 'Lista Strette di mano';
usersList.list = myuser.profile.handshake;
"
>
</q-btn>
<!--HANDSHAKE-->
<div v-if="!isMyRecord(myuser.username)">
<div
class="row centeritems q-ma-sm q-pa-sm"
v-if="userStore.IsReqHandShakeByUsername(myuser.username)"
>
<q-btn
icon="fas fa-handshake"
color="positive"
:label="$t('handshake.accept_handshake')"
@click="
tools.addToMyHandShake(
$q,
userStore.my.username,
myuser.username
)
"
/>
<q-btn
icon="fas fa-handshake-alt-slash"
color="negative"
:label="$t('handshake.reject_ask_handshake')"
@click="
tools.refuseReqHandShake(
$q,
userStore.my.username,
myuser.username
)
"
/>
</div>
<div v-else>
<q-btn
v-if="
!userStore.IsHandShakeByUsername(myuser.username) &&
!userStore.IsAskedHandShakeByUsername(myuser.username)
"
icon="fas fa-handshake"
color="primary"
:label="$t('handshake.ask_handshake')"
@click="
tools.setRequestHandShake(
$q,
userStore.my.username,
myuser.username,
true
)
"
/>
</div>
<q-btn
v-if="
userStore.IsAskedHandShakeByUsername(myuser.username) &&
!userStore.IsHandShakeByUsername(myuser.username)
"
icon="fas fa-handshake-alt-slash"
:label="$t('handshake.cancel_ask_handshake_short')"
@click="
tools.cancelReqHandShake(
$q,
userStore.my.username,
myuser.username
)
"
/>
</div>
</q-banner>
<div v-if="!isMyRecord(myuser.username)">
<div
@@ -539,6 +641,27 @@
<div v-else>
<CUserNonVerif></CUserNonVerif>
</div>
<q-dialog v-model="usersList.show">
<q-card class="dialog_card">
<q-toolbar class="bg-primary text-white">
<q-toolbar-title>
{{ usersList.title }}
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<div v-for="(rec, i) in usersList.list" :key="i">
<CMyUser
:mycontact="rec"
:visu="costanti.FIND_PEOPLE"
@setCmd="tools.setCmd"
>
</CMyUser>
</div>
</q-card-section>
</q-card>
</q-dialog>
</template>
<script lang="ts" src="./myprofile.ts">

View File

@@ -4479,7 +4479,7 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
date-fns@^2.29.3:
date-fns@^2.28.0, date-fns@^2.29.3:
version "2.29.3"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"
integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==
@@ -12754,6 +12754,13 @@ vue-template-es2015-compiler@^1.2.2:
resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
vue-timeago3@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/vue-timeago3/-/vue-timeago3-2.3.0.tgz#897b82e27c44f198d76b39141e1807e4c381f250"
integrity sha512-9rV/f9thgjkBJeF5X2lsUSp4SENYuL0XjrXsaHvNkc0x5wHRiCG/Aefi6Xl0op/X9Oblio9NmNOQGXVWyRWm5A==
dependencies:
date-fns "^2.28.0"
vue2-dragula@^2.5.5:
version "2.5.5"
resolved "https://registry.yarnpkg.com/vue2-dragula/-/vue2-dragula-2.5.5.tgz#a237fb6769b941b4658de2711c350fccd3f4c219"