From c518f373df3723534c4db4cf558aac5636c7d96d Mon Sep 17 00:00:00 2001 From: venashial Date: Sat, 2 Oct 2021 16:47:59 -0700 Subject: [PATCH] Makes mod editing only send changed data (#286) * Add getDifferences lib * Only send mod diff to backend for changes * Disable fields when lacking permissions --- assets/styles/components.scss | 8 +- assets/styles/global.scss | 9 +- libs/getDifferences.js | 23 ++++ package-lock.json | 1 - pages/mod/_id/edit.vue | 215 ++++++++++++++++++++++++---------- pages/mod/_id/settings.vue | 21 +++- 6 files changed, 207 insertions(+), 70 deletions(-) create mode 100644 libs/getDifferences.js diff --git a/assets/styles/components.scss b/assets/styles/components.scss index e3e746d4..b73bc436 100644 --- a/assets/styles/components.scss +++ b/assets/styles/components.scss @@ -364,7 +364,7 @@ } } } - + .tab:last-child { margin-bottom: 0; } @@ -404,6 +404,12 @@ &:active { background-color: var(--color-button-bg-active); } + &:disabled, + &[disabled] { + opacity: 0.6; + pointer-events: none; + cursor: not-allowed; + } } .transparent-button { diff --git a/assets/styles/global.scss b/assets/styles/global.scss index 0b9076aa..cd753061 100644 --- a/assets/styles/global.scss +++ b/assets/styles/global.scss @@ -234,7 +234,7 @@ textarea { border: 2px solid transparent; &:focus, - &:hover { + &:hover:not([disabled]) { background: var(--color-button-bg-hover); color: var(--color-text); outline: none; @@ -252,6 +252,13 @@ textarea { &::placeholder { color: var(--color-color-text); } + + &:disabled, + &[disabled] { + opacity: 0.6; + pointer-events: none; + cursor: not-allowed; + } } .ea-content { diff --git a/libs/getDifferences.js b/libs/getDifferences.js new file mode 100644 index 00000000..33a84279 --- /dev/null +++ b/libs/getDifferences.js @@ -0,0 +1,23 @@ +const equalArrays = (arr1, arr2) => + arr1.length === arr2.length && + arr1.every((element, index) => element === arr2[index]) + +const isObject = (obj) => obj instanceof Object && !Array.isArray(obj) + +const isArray = (arr) => Array.isArray(arr) + +export default function getDifferences(obj1, obj2) { + const obj3 = {} + for (const key of Object.keys(obj1)) { + const val1 = obj1[key] + const val2 = obj2[key] + const areArrays = isArray(val1) && isArray(val2) + const areObjects = isObject(val1) && isObject(val2) + if (areObjects) { + const diff = getDifferences(val1, val2) + if (diff) obj3[key] = diff + } else if (areArrays && !equalArrays(val1, val2)) obj3[key] = val2 + else if (val1 !== val2) obj3[key] = val2 + } + return !!Object.keys(obj3).length && obj3 +} diff --git a/package-lock.json b/package-lock.json index 3ee66248..d93699d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,6 @@ "requires": true, "packages": { "": { - "name": "knossos", "version": "1.0.0", "dependencies": { "@nuxtjs/axios": "^5.12.5", diff --git a/pages/mod/_id/edit.vue b/pages/mod/_id/edit.vue index 1829958c..98194834 100644 --- a/pages/mod/_id/edit.vue +++ b/pages/mod/_id/edit.vue @@ -16,7 +16,7 @@ " title="Submit for approval" class="button column" - :disabled="!this.$nuxt.$loading" + :disabled="!$nuxt.$loading" @click="saveModReview" > Submit for approval @@ -24,7 +24,7 @@