2020-07-09 17:24:28 +02:00
< template >
< div >
< nav class = "breadcrumb" aria -label = " breadcrumbs " >
< ul >
< li >
< router -link
: to = " {
name : RouteName . GROUP ,
params : { preferredUsername : usernameWithDomain ( group ) } ,
} "
> { { group . name } } < / r o u t e r - l i n k
>
< / li >
< li >
< router -link
: to = " {
name : RouteName . GROUP _SETTINGS ,
params : { preferredUsername : usernameWithDomain ( group ) } ,
} "
> { { $t ( "Settings" ) } } < / r o u t e r - l i n k
>
< / li >
< li class = "is-active" >
< router -link
: to = " {
name : RouteName . GROUP _PUBLIC _SETTINGS ,
params : { preferredUsername : usernameWithDomain ( group ) } ,
} "
> { { $t ( "Group settings" ) } } < / r o u t e r - l i n k
>
< / li >
< / ul >
< / nav >
< section class = "container section" >
< form @submit.prevent ="updateGroup" >
< b -field : label = "$t('Group name')" >
< b -input v -model = " group.name " / >
< / b - f i e l d >
< b -field : label = "$t('Group short description')" >
2020-09-29 09:53:48 +02:00
< editor mode = "basic" v -model = " group.summary " :maxSize ="500"
2020-07-09 17:24:28 +02:00
/ > < / b - f i e l d >
2020-09-29 09:53:48 +02:00
< b -field :label ="$t('Avatar')" >
< picture -upload
: textFallback = "$t('Avatar')"
v - model = "avatarFile"
: defaultImageSrc = "group.avatar ? group.avatar.url : null"
/ >
< / b - f i e l d >
< b -field :label ="$t('Banner')" >
< picture -upload
: textFallback = "$t('Banner')"
v - model = "bannerFile"
: defaultImageSrc = "group.banner ? group.banner.url : null"
/ >
< / b - f i e l d >
2020-08-05 16:44:08 +02:00
< p class = "label" > { { $t ( "Group visibility" ) } } < / p >
< div class = "field" >
< b -radio
v - model = "group.visibility"
name = "groupVisibility"
: native - value = "GroupVisibility.PUBLIC"
>
{ { $t ( "Visible everywhere on the web" ) } } < br / >
< small > { {
$t (
"The group will be publicly listed in search results and may be suggested in the explore section. Only public informations will be shown on it's page."
)
} } < / small >
< / b - r a d i o >
< / div >
< div class = "field" >
< b -radio
v - model = "group.visibility"
name = "groupVisibility"
: native - value = "GroupVisibility.UNLISTED"
> { { $t ( "Only accessible through link" ) } } < br / >
< small > { {
2020-09-02 10:00:39 +02:00
$t (
"You'll need to transmit the group URL so people may access the group's profile. The group won't be findable in Mobilizon's search or regular search engines."
)
2020-08-05 16:44:08 +02:00
} } < / small >
< / b - r a d i o >
< p class = "control" >
< code > { { group . url } } < / code >
< b -tooltip
v - if = "canShowCopyButton"
: label = "$t('URL copied to clipboard')"
: active = "showCopiedTooltip"
always
type = "is-success"
position = "is-left"
>
< b -button
type = "is-primary"
icon - right = "content-paste"
native - type = "button"
@ click = "copyURL"
@ keyup . enter = "copyURL"
/ >
< / b - t o o l t i p >
< / p >
< / div >
< full -address -auto -complete
: label = "$t('Group address')"
v - model = "group.physicalAddress"
: value = "currentAddress"
/ >
2020-08-27 11:53:24 +02:00
< div class = "buttons" >
< b -button native -type = " submit " type = "is-primary" > { { $t ( "Update group" ) } } < / b - b u t t o n >
< b -button @click ="confirmDeleteGroup" type = "is-danger" > { { $t ( "Delete group" ) } } < / b - b u t t o n >
< / div >
2020-07-09 17:24:28 +02:00
< / form >
< / section >
< / div >
< / template >
< script lang = "ts" >
import { Component , Vue } from "vue-property-decorator" ;
2020-08-31 12:40:30 +02:00
import FullAddressAutoComplete from "@/components/Event/FullAddressAutoComplete.vue" ;
2020-09-02 17:42:17 +02:00
import { Route } from "vue-router" ;
2020-09-29 09:53:48 +02:00
import PictureUpload from "@/components/PictureUpload.vue" ;
2020-07-09 17:24:28 +02:00
import RouteName from "../../router/name" ;
2020-08-27 11:53:24 +02:00
import { FETCH _GROUP , UPDATE _GROUP , DELETE _GROUP } from "../../graphql/group" ;
2020-07-09 17:24:28 +02:00
import { IGroup , usernameWithDomain } from "../../types/actor" ;
2020-08-05 16:44:08 +02:00
import { Address , IAddress } from "../../types/address.model" ;
2020-09-02 17:42:17 +02:00
import { Group } from "../../types/actor/group.model" ;
2020-07-09 17:24:28 +02:00
@ Component ( {
apollo : {
group : {
query : FETCH _GROUP ,
2020-08-27 11:53:24 +02:00
fetchPolicy : "cache-and-network" ,
2020-07-09 17:24:28 +02:00
variables ( ) {
return {
name : this . $route . params . preferredUsername ,
} ;
} ,
skip ( ) {
return ! this . $route . params . preferredUsername ;
} ,
} ,
} ,
2020-08-05 16:44:08 +02:00
components : {
FullAddressAutoComplete ,
2020-09-29 09:53:48 +02:00
PictureUpload ,
2020-09-02 17:42:17 +02:00
editor : ( ) => import ( "../../components/Editor.vue" ) ,
2020-08-05 16:44:08 +02:00
} ,
2020-07-09 17:24:28 +02:00
} )
export default class GroupSettings extends Vue {
group : IGroup = new Group ( ) ;
loading = true ;
RouteName = RouteName ;
newMemberUsername = "" ;
2020-09-29 09:53:48 +02:00
avatarFile : File | null = null ;
bannerFile : File | null = null ;
2020-07-09 17:24:28 +02:00
usernameWithDomain = usernameWithDomain ;
2020-08-05 16:44:08 +02:00
GroupVisibility = {
PUBLIC : "PUBLIC" ,
UNLISTED : "UNLISTED" ,
} ;
showCopiedTooltip = false ;
2020-09-02 17:42:17 +02:00
async updateGroup ( ) : Promise < void > {
2020-09-29 09:53:48 +02:00
const variables = this . buildVariables ( ) ;
2020-07-09 17:24:28 +02:00
await this . $apollo . mutate < { updateGroup : IGroup } > ( {
mutation : UPDATE _GROUP ,
2020-08-05 16:44:08 +02:00
variables ,
2020-07-09 17:24:28 +02:00
} ) ;
2020-09-29 09:53:48 +02:00
this . $notifier . success ( this . $t ( "Group settings saved" ) as string ) ;
2020-07-09 17:24:28 +02:00
}
2020-08-05 16:44:08 +02:00
2020-09-02 17:42:17 +02:00
confirmDeleteGroup ( ) : void {
2020-08-27 11:53:24 +02:00
this . $buefy . dialog . confirm ( {
title : this . $t ( "Delete group" ) as string ,
message : this . $t (
"Are you sure you want to <b>completely delete</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>."
) as string ,
confirmText : this . $t ( "Delete group" ) as string ,
cancelText : this . $t ( "Cancel" ) as string ,
type : "is-danger" ,
hasIcon : true ,
onConfirm : ( ) => this . deleteGroup ( ) ,
} ) ;
}
2020-09-02 17:42:17 +02:00
async deleteGroup ( ) : Promise < Route > {
2020-08-27 11:53:24 +02:00
await this . $apollo . mutate < { deleteGroup : IGroup } > ( {
mutation : DELETE _GROUP ,
variables : {
groupId : this . group . id ,
} ,
} ) ;
return this . $router . push ( { name : RouteName . MY _GROUPS } ) ;
}
2020-09-02 17:42:17 +02:00
async copyURL ( ) : Promise < void > {
2020-08-05 16:44:08 +02:00
await window . navigator . clipboard . writeText ( this . group . url ) ;
this . showCopiedTooltip = true ;
setTimeout ( ( ) => {
this . showCopiedTooltip = false ;
} , 2000 ) ;
}
2020-09-29 09:53:48 +02:00
private buildVariables ( ) {
let avatarObj = { } ;
let bannerObj = { } ;
const variables = { ... this . group } ;
// eslint-disable-next-line
// @ts-ignore
delete variables . _ _typename ;
if ( variables . physicalAddress ) {
// eslint-disable-next-line
// @ts-ignore
delete variables . physicalAddress . _ _typename ;
}
delete variables . avatar ;
delete variables . banner ;
if ( this . avatarFile ) {
avatarObj = {
avatar : {
picture : {
name : this . avatarFile . name ,
alt : ` ${ this . group . preferredUsername } 's avatar ` ,
file : this . avatarFile ,
} ,
} ,
} ;
}
if ( this . bannerFile ) {
bannerObj = {
banner : {
picture : {
name : this . bannerFile . name ,
alt : ` ${ this . group . preferredUsername } 's banner ` ,
file : this . bannerFile ,
} ,
} ,
} ;
}
return {
... variables ,
... avatarObj ,
... bannerObj ,
} ;
}
2020-09-02 17:42:17 +02:00
// eslint-disable-next-line class-methods-use-this
2020-08-05 16:44:08 +02:00
get canShowCopyButton ( ) : boolean {
return window . isSecureContext ;
}
get currentAddress ( ) : IAddress {
return new Address ( this . group . physicalAddress ) ;
}
2020-07-09 17:24:28 +02:00
}
< / script >