diff --git a/package-lock.json b/package-lock.json index 176fb51..5220498 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10583,6 +10583,11 @@ "is-plain-obj": "^1.0.0" } }, + "sortablejs": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.1.tgz", + "integrity": "sha512-N6r7GrVmO8RW1rn0cTdvK3JR0BcqecAJ0PmYMCL3ZuqTH3pY+9QyqkmJSkkLyyDvd+AJnwaxTP22Ybr/83V9hQ==" + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -11938,6 +11943,14 @@ "vue-script2": "^2.0.3" } }, + "vuedraggable": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.23.2.tgz", + "integrity": "sha512-PgHCjUpxEAEZJq36ys49HfQmXglattf/7ofOzUrW2/rRdG7tu6fK84ir14t1jYv4kdXewTEa2ieKEAhhEMdwkQ==", + "requires": { + "sortablejs": "^1.10.1" + } + }, "vuex": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.1.tgz", diff --git a/package.json b/package.json index 3ee4f8a..03614c0 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "vue-socket.io": "^3.0.4", "vue-socket.io-extended": "^3.2.0", "vue-twitter": "^0.1.0", + "vuedraggable": "^2.23.2", "vuex": "^3.0.1" }, "devDependencies": { diff --git a/src/components/app/Navigation.vue b/src/components/app/Navigation.vue index 0c2957f..41b9350 100644 --- a/src/components/app/Navigation.vue +++ b/src/components/app/Navigation.vue @@ -41,14 +41,22 @@ >error
+
- + + + + + +
+
import { bus } from "@/main.js"; import config from "@/config.js"; +import settingsService from '@/services/settingsService'; import ServerTemplate from "@/components/app/ServerTemplate/ServerTemplate"; - +import draggable from 'vuedraggable' +import { isMobile } from "@/utils/Mobile"; export default { - components: { ServerTemplate }, + components: { ServerTemplate, draggable }, data() { return { avatarDomain: config.domain + "/avatars", toolTipShown: false, toolTipTopPosition: 0, toolTipServerID: null, - toolTipLocalName: null + toolTipLocalName: null, + mobile: isMobile(), + + drag: false, }; }, methods: { + async onEnd(event) { + this.drag = false; + const serverIDArr = this.serversArr.map(s => s.server_id); + await settingsService.setServerPositions(serverIDArr); + }, + onStart() { + this.toolTipShown = false; + this.drag = true; + this.$store.dispatch("setAllPopout", {show: false}); + }, dismissNotification(channelID) { const notifications = this.$store.getters.notifications.find(function(e) { return e.channelID === channelID; @@ -156,6 +179,7 @@ export default { this.toolTipShown = true; }, serverToolTipEvent({ serverID, top }) { + if (this.drag) return; this.toolTipLocalName = null; this.toolTipServerID = serverID; this.toolTipTopPosition = top - this.getTopHeight() + 16; @@ -198,14 +222,25 @@ export default { servers() { return this.$store.getters["servers/servers"]; }, - serversArr() { - const data = this.servers; - return Object.keys(data) + serversArr: { + get() { + const data = this.servers; + return Object.keys(data) .map(key => { return data[key]; }) - .slice() .reverse(); + }, + set(value) { + const reversedServers = value.reverse() + // convert array to json + const json = {}; + for (let index = 0; index < reversedServers.length; index++) { + const element = reversedServers[index]; + json[element.server_id] = element; + } + this.$store.dispatch("servers/setServers", json); + } }, selectedServerID() { return this.$store.getters["servers/selectedServerID"]; @@ -261,7 +296,25 @@ export default { }; +