257 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Vue
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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> |