added error messages to places

This commit is contained in:
supertiger1234 2019-08-10 11:47:14 +01:00
parent f08d09d4d2
commit e0fc34f6ed
7 changed files with 179 additions and 151 deletions

View file

@ -522,10 +522,6 @@ export default {
delete this.$options.sockets.typingStatus; delete this.$options.sockets.typingStatus;
}, },
watch: { watch: {
scrolledDown(v) {
},
selectedChannelMessages(newMessages, oldMessages){ selectedChannelMessages(newMessages, oldMessages){
this.$nextTick(function () { this.$nextTick(function () {
this.scrollDown(); this.scrollDown();

View file

@ -1,128 +1,55 @@
<template> <template>
<div <div class="dark-background" @mousedown="backgroundClick">
class="dark-background"
@mousedown="backgroundClick"
>
<div class="inner"> <div class="inner">
<div class="tabs"> <div class="tabs">
<div <div :class="{tab: true, selected: tab == 0}" @click="tab = 0; slideBack(); ">Create</div>
:class="{tab: true, selected: tab == 0}"
@click="tab = 0; slideBack(); "
>
Create
</div>
<div <div
:class="{tab: true, selected: tab == 1 || tab == 2}" :class="{tab: true, selected: tab == 1 || tab == 2}"
@click="tab = 1; slideForward();" @click="tab = 1; slideForward();"
> >Join</div>
Join
</div>
</div> </div>
<transition-group <transition-group tag="div" class="slider" :name="slideInDirection">
tag="div" <div class="content" v-if="tab == 0" key="add-server">
class="slider" <errors-list-template :errors="errors" v-if="errors" />
:name="slideInDirection"
> <div class="inner-content">
<div <div class="add-server">
v-if="tab == 0" <profile-picture class="avatar" size="90px" :url="avatar + 'default'" />
key="add-server" <div class="input">
class="content" <div class="input-name">Server Name</div>
> <input v-model="serverName" type="text" placeholder="Server Name" />
<!-- <div class="title"> </div>
Set your server's avatar <span v-if="serverNameError" class="warn">{{ serverNameError }}</span>
</div> --> <div class="button create-button" @click="createButton">Create</div>
<profile-picture
class="avatar"
size="90px"
:url="avatar + 'default'"
/>
<!-- <div class="button">
Browse Avatar Coming Soon!
</div> -->
<div class="input">
<div class="input-name">
Server Name
</div> </div>
<input
v-model="serverName"
type="text"
placeholder="Server Name"
>
</div>
<span
v-if="serverNameError"
class="warn"
>{{ serverNameError }}</span>
<div
class="button create-button"
@click="createButton"
>
Create
</div> </div>
</div> </div>
<div <div v-if="tab == 1" key="check-invite" class="content">
v-if="tab == 1"
key="check-invite"
class="content"
>
<i class="material-icons icon">forum</i> <i class="material-icons icon">forum</i>
<div class="title"> <div class="title">Join A Server</div>
Join A Server
</div>
<div class="input"> <div class="input">
<div class="input-name"> <div class="input-name">
Invite Code Invite Code
<span <span v-if="inviteCodeError" class="warn">- {{ inviteCodeError }}</span>
v-if="inviteCodeError"
class="warn"
>- {{ inviteCodeError }}</span>
</div> </div>
<input <input v-model="inviteCode" type="text" placeholder="Invite code" />
v-model="inviteCode"
type="text"
placeholder="Invite code"
>
</div>
<div
class="button check-button"
@click="checkInviteCode"
>
Check
</div> </div>
<div class="button check-button" @click="checkInviteCode">Check</div>
</div> </div>
<div <div v-if="tab == 2" key="join-server" class="content server">
v-if="tab == 2" <profile-picture class="avatar" size="100px" :url="avatar + server.avatar" />
key="join-server" <div class="server-name">{{ server.name }}</div>
class="content server"
>
<profile-picture
class="avatar"
size="100px"
:url="avatar + server.avatar"
/>
<div class="server-name">
{{ server.name }}
</div>
<div class="buttons"> <div class="buttons">
<div <div
v-if="!servers[server.server_id]" v-if="!servers[server.server_id]"
class="button join-button" class="button join-button"
@click="joinButton" @click="joinButton"
> >Join</div>
Join <div v-if="servers[server.server_id]" class="button join-button button-clicked">Joined</div>
</div>
<div
v-if="servers[server.server_id]"
class="button join-button button-clicked"
>
Joined
</div>
<div <div
class="button cancel-button" class="button cancel-button"
@click="server = null; inviteCode = ''; tab = 1; slideBack();" @click="server = null; inviteCode = ''; tab = 1; slideBack();"
> >Cancel</div>
Cancel
</div>
</div> </div>
</div> </div>
</transition-group> </transition-group>
@ -135,10 +62,11 @@ import config from "@/config.js";
import { bus } from "@/main"; import { bus } from "@/main";
import ServerService from "@/services/ServerService"; import ServerService from "@/services/ServerService";
import ProfilePicture from "@/components/ProfilePictureTemplate.vue"; import ProfilePicture from "@/components/ProfilePictureTemplate.vue";
import serversModule from '../../../../store/modules/serversModule'; import serversModule from "../../../../store/modules/serversModule";
import ErrorsListTemplate from "@/components/app/errorsListTemplate";
export default { export default {
components: { ProfilePicture }, components: { ProfilePicture, ErrorsListTemplate },
data() { data() {
return { return {
tab: 0, tab: 0,
@ -148,12 +76,13 @@ export default {
inviteCode: "", inviteCode: "",
inviteCodeError: null, inviteCodeError: null,
server: null, server: null,
slideInDirection: "slide-forward" slideInDirection: "slide-forward",
errors: null
}; };
}, },
computed: { computed: {
servers() { servers() {
return this.$store.getters['servers/servers']; return this.$store.getters["servers/servers"];
} }
}, },
methods: { methods: {
@ -176,10 +105,10 @@ export default {
}, },
async createButton(event) { async createButton(event) {
if (event.target.classList.contains("button-clicked")) return; if (event.target.classList.contains("button-clicked")) return;
this.serverNameError = null; this.errors = null;
const name = this.serverName.trim(); const name = this.serverName.trim();
if (!name) { if (!name) {
this.serverNameError = "Enter a name!"; this.errors = [{ msg: "Enter a name!" }];
return; return;
} }
event.target.classList.add("button-clicked"); event.target.classList.add("button-clicked");
@ -188,9 +117,11 @@ export default {
this.closeMenu(); this.closeMenu();
} else { } else {
if (error.response) { if (error.response) {
this.serverNameError = error.response.data.message; if (error.response.data.message)
this.errors = [{ msg: error.response.data.message }];
else this.errors = error.response.data.errors;
} else { } else {
this.serverNameError = "Something went wrong."; this.errors = [{ msg: "Something went wrong." }];
} }
event.target.classList.remove("button-clicked"); event.target.classList.remove("button-clicked");
} }
@ -221,7 +152,9 @@ export default {
async joinButton(event) { async joinButton(event) {
if (event.target.classList.contains("button-clicked")) return; if (event.target.classList.contains("button-clicked")) return;
event.target.classList.add("button-clicked"); event.target.classList.add("button-clicked");
const { ok, error, result } = await ServerService.joinServer(this.inviteCode) const { ok, error, result } = await ServerService.joinServer(
this.inviteCode
);
if (ok) { if (ok) {
this.closeMenu(); this.closeMenu();
} }
@ -273,7 +206,8 @@ export default {
} }
.inner { .inner {
margin: auto; margin: auto;
height: 450px; height: 100%;
max-height: 450px;
width: 400px; width: 400px;
background: rgb(32, 32, 32); background: rgb(32, 32, 32);
display: flex; display: flex;
@ -287,6 +221,7 @@ export default {
justify-content: center; justify-content: center;
padding-top: 15px; padding-top: 15px;
background: rgb(27, 27, 27); background: rgb(27, 27, 27);
flex-shrink: 0;
} }
.tab { .tab {
flex-shrink: 0; flex-shrink: 0;
@ -314,15 +249,31 @@ export default {
height: 100%; height: 100%;
width: 100%; width: 100%;
overflow: hidden;
position: absolute; position: absolute;
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
top: 0; top: 0;
align-items: center; align-items: center;
justify-content: center; overflow: auto;
} }
.inner-content {
display: flex;
flex-direction: row;
width: 100%;
height: 100%;
align-content: center;
}
.add-server {
display: flex;
flex-direction: column;
margin: auto;
}
.errors {
margin-top: 10px;
flex-shrink: 0;
}
.input { .input {
align-self: center; align-self: center;
margin-top: 15px; margin-top: 15px;

View file

@ -166,6 +166,7 @@ export default {
flex-direction: column; flex-direction: column;
width: 100%; width: 100%;
justify-content: center; justify-content: center;
flex-shrink: 0;
} }
.details { .details {
display: flex; display: flex;
@ -179,6 +180,7 @@ export default {
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-self: center; align-self: center;
flex-shrink: 0;
} }
.server-name { .server-name {
align-self: center; align-self: center;
@ -192,6 +194,7 @@ export default {
padding: 10px; padding: 10px;
align-self: center; align-self: center;
margin: 10px; margin: 10px;
flex-shrink: 0;
} }
.input input { .input input {
margin-top: 2px; margin-top: 2px;

View file

@ -1,19 +1,53 @@
<template> <template>
<div class="content">
<errors-list-template :errors="errors" v-if="errors" />
<div class="content-inner"> <div class="content-inner">
<div class="channels-list"> <div class="channels-list">
<div class="channel add-channel-button" @click="createChannel()"><div class="material-icons">add</div><div>Create Channel</div></div> <div
<div class="channel" v-for="(channel, index) in channels" :key="channel.channelID" :class="{selected: index === selectedChannelIndex}" @click="channelClick($event, index)"><div class="name">{{channel.name}}</div></div> class="channel add-channel-button"
:class="{warn: Object.keys(channels).length === 50}"
@click="createChannel()"
>
<div class="material-icons">add</div>
<div>Create Channel</div>
</div>
<div
class="channel"
v-for="(channel, index) in channels"
:key="channel.channelID"
:class="{selected: index === selectedChannelIndex}"
@click="channelClick($event, index)"
>
<div class="name">{{channel.name}}</div>
</div>
</div> </div>
<div class="details" v-if="channels[selectedChannelIndex]"> <div class="details" v-if="channels[selectedChannelIndex]">
<div class="input"> <div class="input">
<div class="input-title">Channel Name</div> <div class="input-title">Channel Name</div>
<input type="text" ref="name" placeholder="Channel Name" :default-value.prop="channels[selectedChannelIndex].name" @input="inputEvent('name', $event)"> <input
type="text"
ref="name"
placeholder="Channel Name"
:default-value.prop="channels[selectedChannelIndex].name"
@input="inputEvent('name', $event)"
/>
</div> </div>
<div class="button" v-if="update.name" @click="updateChannel">Save Changes</div> <div class="button" v-if="update.name" @click="updateChannel">Save Changes</div>
<div class="button warn delete-server disabled" v-if="server.default_channel_id === channels[selectedChannelIndex].channelID">Cannot delete default channel</div> <div
<div class="button warn delete-server" :class="{disabled: deleteClicked}" v-if="server.default_channel_id !== channels[selectedChannelIndex].channelID" @click="deleteChannel">{{deleteButtonConfirmed ? 'ARE YOU SURE?' : 'Delete Channel' }}</div> class="button warn delete-server disabled"
v-if="server.default_channel_id === channels[selectedChannelIndex].channelID"
>Cannot delete default channel</div>
<div
class="button warn delete-server"
:class="{disabled: deleteClicked}"
v-if="server.default_channel_id !== channels[selectedChannelIndex].channelID"
@click="deleteChannel"
>{{deleteButtonConfirmed ? 'ARE YOU SURE?' : 'Delete Channel' }}</div>
</div> </div>
</div> </div>
</div>
</template> </template>
<script> <script>
@ -21,65 +55,85 @@ import config from "@/config.js";
import { bus } from "@/main"; import { bus } from "@/main";
import ServerService from "@/services/ServerService"; import ServerService from "@/services/ServerService";
import { mapState } from "vuex"; import { mapState } from "vuex";
import ErrorsListTemplate from "@/components/app/errorsListTemplate";
export default { export default {
components: {}, components: { ErrorsListTemplate },
data() { data() {
return { return {
deleteButtonConfirmed: false, deleteButtonConfirmed: false,
deleteClicked: false, deleteClicked: false,
selectedChannelIndex: 0, selectedChannelIndex: 0,
errors: null,
update: { update: {
name: null name: null
} }
} };
}, },
methods: { methods: {
async createChannel() { async createChannel() {
const {ok, error, result} = await ServerService.createChannel(this.server.server_id, "New Channel"); const { ok, error, result } = await ServerService.createChannel(
this.server.server_id,
"New Channel"
);
}, },
async updateChannel() { async updateChannel() {
this.errors = null;
const data = { const data = {
name: this.update.name || this.channels[this.selectedChannelIndex].name name: this.update.name || this.channels[this.selectedChannelIndex].name
} };
const {ok, error, result} = await ServerService.updateChannel(this.server.server_id, this.channels[this.selectedChannelIndex].channelID, data); const { ok, error, result } = await ServerService.updateChannel(
this.server.server_id,
this.channels[this.selectedChannelIndex].channelID,
data
);
if (ok) { if (ok) {
this.update.name = null; this.update.name = null;
} else {
if (error.response) {
if (error.response.data.message)
this.errors = [{ msg: error.response.data.message }];
else this.errors = error.response.data.errors;
} else {
this.errors = [{ msg: "Something went wrong." }];
}
} }
}, },
async deleteChannel() { async deleteChannel() {
if (this.deleteClicked) return; if (this.deleteClicked) return;
if (!this.deleteButtonConfirmed) { if (!this.deleteButtonConfirmed) {
return this.deleteButtonConfirmed = true; return (this.deleteButtonConfirmed = true);
} }
this.deleteClicked = true; this.deleteClicked = true;
const {ok, error, result} = await ServerService.deleteChannel(this.server.server_id, this.channels[this.selectedChannelIndex].channelID) const { ok, error, result } = await ServerService.deleteChannel(
this.server.server_id,
this.channels[this.selectedChannelIndex].channelID
);
this.deleteButtonConfirmed = false; this.deleteButtonConfirmed = false;
this.selectedChannelIndex = null; this.selectedChannelIndex = null;
this.deleteClicked = false; this.deleteClicked = false;
}, },
inputEvent(name, event) { inputEvent(name, event) {
this.update.name = event.target.value this.update.name = event.target.value;
}, },
channelClick(event, index) { channelClick(event, index) {
this.selectedChannelIndex = index this.selectedChannelIndex = index;
this.$refs['name'].value = this.channels[this.selectedChannelIndex].name this.$refs["name"].value = this.channels[this.selectedChannelIndex].name;
this.update.name = null; this.update.name = null;
this.deleteButtonConfirmed = false; this.deleteButtonConfirmed = false;
}, }
}, },
computed: { computed: {
server() { server() {
const serverID = this.$store.state.popoutsModule.serverSettings.serverID const serverID = this.$store.state.popoutsModule.serverSettings.serverID;
return this.$store.getters['servers/servers'][serverID] return this.$store.getters["servers/servers"][serverID];
}, },
channels() { channels() {
const serverID = this.$store.state.popoutsModule.serverSettings.serverID const serverID = this.$store.state.popoutsModule.serverSettings.serverID;
const channels = this.$store.getters.channels; const channels = this.$store.getters.channels;
const channelIDs = this.$store.getters['servers/channelsIDs'][serverID]; const channelIDs = this.$store.getters["servers/channelsIDs"][serverID];
return channelIDs.map(c => { return channelIDs.map(c => {
return channels[c]; return channels[c];
}) });
} }
} }
}; };
@ -118,7 +172,7 @@ export default {
} }
.channel .name { .channel .name {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.channel div { .channel div {
@ -168,8 +222,12 @@ export default {
.button.disabled:hover { .button.disabled:hover {
background: grey; background: grey;
} }
.add-channel-button.warn {
background: rgba(255, 17, 17, 0.192);
cursor: not-allowed;
}
.delete-server{ .delete-server {
margin: auto; margin: auto;
margin-bottom: 0; margin-bottom: 0;
margin-left: 0; margin-left: 0;

View file

@ -74,7 +74,8 @@ export default {
} }
.inner { .inner {
margin: auto; margin: auto;
height: 500px; height: 100%;
max-height: 500px;
width: 700px; width: 700px;
background: rgba(32, 32, 32, 0.87); background: rgba(32, 32, 32, 0.87);
display: flex; display: flex;

View file

@ -1,9 +1,6 @@
<template> <template>
<div class="edit-profile"> <div class="edit-profile">
<div class="errors" v-if="errors"> <errors-list-template :errors="errors" v-if="errors" />
<div class="error-title">Fix these mistakes:</div>
<li class="error" v-for="error in errors" :key="error.msg">{{error.msg}}</li>
</div>
<div class="inner-content"> <div class="inner-content">
<div class="left"> <div class="left">
<form> <form>
@ -59,11 +56,12 @@
<script> <script>
import ProfilePicture from "@/components/ProfilePictureTemplate.vue"; import ProfilePicture from "@/components/ProfilePictureTemplate.vue";
import userService from "@/services/userService.js"; import userService from "@/services/userService.js";
import ErrorsListTemplate from "@/components/app/errorsListTemplate";
import config from "@/config.js"; import config from "@/config.js";
import path from "path"; import path from "path";
export default { export default {
components: { ProfilePicture }, components: { ProfilePicture, ErrorsListTemplate },
data() { data() {
return { return {
errors: null, errors: null,
@ -245,10 +243,6 @@ export default {
} }
.errors { .errors {
background: rgb(255, 62, 62);
color: white;
border-radius: 10px;
padding: 10px;
align-self: center; align-self: center;
} }
.link { .link {

View file

@ -0,0 +1,25 @@
<template>
<div class="errors">
<div class="errors-title">Fix these mistakes:</div>
<li class="error" v-for="(error, index) in errors" :key="index">{{error.msg}}</li>
</div>
</template>
<script>
export default {
props: ['errors']
}
</script>
<style scoped>
.errors{
background: rgb(255, 62, 62);
color: white;
border-radius: 10px;
padding: 10px;
}
</style>