Richard Dern 400e3d01f1 Refresh
2022-01-12 00:35:37 +01:00

257 lines
8.6 KiB
Vue
Executable File

<template>
<article>
<header>
<h1>
{{ title }}
</h1>
</header>
<div class="body">
<div
v-if="group && group.description"
v-html="group.description"
></div>
<form
v-on:submit.prevent="onSubmit"
v-if="
!group ||
(group &&
(group.pivot.status === 'own' ||
group.pivot.status === 'created'))
"
>
<input type="hidden" name="id" v-model="id" />
<div class="form-group">
<input
type="text"
v-model="name"
v-bind:placeholder="__('Group name')"
/>
</div>
<div class="form-group">
<input
type="text"
v-model="description"
v-bind:placeholder="__('Description')"
/>
</div>
<div class="form-group">
<label class="my-0"
><input type="checkbox" v-model="inviteOnly" />
<span class="ml-2">{{ __("Invite only") }}</span>
</label>
</div>
<div class="form-group">
<label class="my-0"
><input type="checkbox" v-model="autoAcceptUsers" />
<span class="ml-2">{{ __("Auto-accept users") }}</span>
</label>
</div>
<div class="flex justify-between mt-4">
<button class="success" type="submit">
<svg fill="currentColor" width="16" height="16">
<use
v-bind:xlink:href="icon(!id ? 'add' : 'update')"
/>
</svg>
<span>
{{ !id ? __("Create group") : __("Update group") }}
</span>
</button>
<div v-if="id !== null" class="flex items-center space-x-2">
<button
class="secondary"
v-on:click.stop.prevent="$emit('unselect')"
>
<svg fill="currentColor" width="16" height="16">
<use v-bind:xlink:href="icon('cancel')" />
</svg>
<span>
{{ __("Cancel") }}
</span>
</button>
<button
v-if="group.pivot.status !== 'own'"
class="danger"
v-on:click.stop.prevent="
$emit('group-deleted', group)
"
>
<svg fill="currentColor" width="16" height="16">
<use v-bind:xlink:href="icon('trash')" />
</svg>
<span>
{{ __("Delete") }}
</span>
</button>
</div>
</div>
</form>
<form
v-if="
group &&
(group.pivot.status === 'own' ||
group.pivot.status === 'created')
"
v-on:submit.prevent="onInviteSubmit"
>
<div class="form-group">
<div class="input-group">
<input
type="text"
name="title"
v-model="inviteEmail"
v-bind:placeholder="__('E-Mail Address')"
/>
<button type="submit" class="info">
<svg fill="currentColor" width="16" height="16">
<use v-bind:xlink:href="icon('join')" />
</svg>
<span>
{{ __("Invite in group") }}
</span>
</button>
</div>
</div>
</form>
<div
v-if="group && group.pivot.status === 'invited'"
class="mt-4 flex items-center justify-between"
>
<button
class="success"
v-on:click="$emit('invitation-accepted', group)"
>
<svg fill="currentColor" width="16" height="16">
<use v-bind:xlink:href="icon('check')" />
</svg>
<span>
{{ __("Accept invitation") }}
</span>
</button>
<button
class="danger"
v-on:click="$emit('invitation-declined', group)"
>
<svg fill="currentColor" width="16" height="16">
<use v-bind:xlink:href="icon('cancel')" />
</svg>
<span>
{{ __("Decline invitation") }}
</span>
</button>
</div>
<div
v-if="
group &&
(group.pivot.status === 'accepted' ||
group.pivot.status === 'joining')
"
class="mt-4"
>
<button class="danger" v-on:click="$emit('leave', group)">
<svg fill="currentColor" width="16" height="16">
<use v-bind:xlink:href="icon('logout')" />
</svg>
<span>
{{ __("Leave the group") }}
</span>
</button>
</div>
</div>
</article>
</template>
<script>
export default {
props: ["group"],
data: function () {
return {
id: null,
name: null,
description: null,
inviteOnly: false,
autoAcceptUsers: false,
inviteEmail: null,
};
},
computed: {
title: function () {
if (this.group) {
return this.group.name;
}
return this.__("Create group");
},
},
watch: {
group: function (group) {
if (!group) {
this.id = null;
this.name = null;
this.description = null;
this.inviteOnly = false;
this.autoAcceptUsers = false;
} else {
this.id = group.id;
this.name = group.name;
this.description = group.description;
this.inviteOnly = group.invite_only;
this.autoAcceptUsers = group.auto_accept_users;
}
this.$forceUpdate();
},
},
methods: {
onSubmit: function () {
const self = this;
const properties = {
name: self.name,
description: self.description,
invite_only: self.inviteOnly,
auto_accept_users: self.autoAcceptUsers,
};
if (!properties.name) {
return;
}
if (self.id) {
properties["id"] = self.id;
self.$emit("group-updated", properties);
} else {
self.$emit("group-created", properties);
self.id = null;
self.name = null;
self.description = null;
self.inviteOnly = false;
self.autoAcceptUsers = false;
}
},
onInviteSubmit: function () {
const self = this;
if (!self.inviteEmail) {
return false;
}
api.post(route("group.invite_user", self.group), {
email: self.inviteEmail,
}).then(function (response) {
self.inviteEmail = null;
self.$emit("invitation-sent");
//TODO: Handle errors
});
},
},
};
</script>