diff options
| author | Santo Cariotti <santo@dcariotti.me> | 2022-10-16 19:30:29 +0200 | 
|---|---|---|
| committer | Santo Cariotti <santo@dcariotti.me> | 2022-10-16 19:30:29 +0200 | 
| commit | c43aa314a3916be3c264d0d4f94f9153151d118f (patch) | |
| tree | 094d643e67a495275c90f7b4e92a082687241343 | |
| parent | 51143de16c323072c83f1968dfe31e2cf530d06c (diff) | |
Delete rows from admin cp
| -rw-r--r-- | components/VTable.vue | 7 | ||||
| -rw-r--r-- | pages/admin/models.vue | 58 | ||||
| -rw-r--r-- | pages/admin/reports.vue | 67 | ||||
| -rw-r--r-- | store/warnings.js | 25 | 
4 files changed, 155 insertions, 2 deletions
| diff --git a/components/VTable.vue b/components/VTable.vue index 326d17f..8785c73 100644 --- a/components/VTable.vue +++ b/components/VTable.vue @@ -45,7 +45,7 @@                        svg(xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 cursor-pointer")                          path(stroke-linecap="round" stroke-linejoin="round" d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125")                      div(v-if="deleterow") -                      svg(xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 text-red-500 cursor-pointer") +                      svg(xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 text-red-500 cursor-pointer" @click="handleDelete(field.id)")                          path(stroke-linecap="round" stroke-linejoin="round" d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0")  </template> @@ -54,7 +54,7 @@  import UserAvatar from "@/components/UserAvatar.vue";  export default { -  props: ["keys", "fields", "path", "deleterow"], +  props: ["keys", "fields", "path", "deleterow", "delete"],    components: {      "user-avatar": UserAvatar,    }, @@ -65,6 +65,9 @@ export default {      isBool(variable) {        return typeof variable == "boolean";      }, +    handleDelete(id) { +      this.delete(id); +    },    },  };  </script> diff --git a/pages/admin/models.vue b/pages/admin/models.vue index e1f65d7..ca84932 100644 --- a/pages/admin/models.vue +++ b/pages/admin/models.vue @@ -1,6 +1,39 @@  <template lang="pug">    .mx-auto.w-90p.py-6(class="sm:px-6 lg:px-8 md:max-w-7xl")      h1.text-3xl.font-bold(class="dark:text-white") Models +    .relative.z-10(aria-labelledby="modal-title", role="dialog", aria-modal="true" v-if="boxDeleteModel > 0") +      .fixed.inset-0.bg-gray-900.bg-opacity-90.transition-opacity +      .fixed.inset-0.z-10.overflow-y-auto +        .flex.min-h-full.items-end.justify-center.p-4.text-center(class="sm:items-center sm:p-0") +          .relative.transform.overflow-hidden.rounded-lg.bg-white.text-left.shadow-xl.transition-all(class="sm:my-8 sm:w-full sm:max-w-lg") +            .bg-white.px-4.pt-5.pb-4(class="sm:p-6 sm:pb-4") +              div(class="sm:flex sm:items-start") +                .mx-auto.flex.h-12.w-12.flex-shrink-0.items-center.justify-center.rounded-full.bg-red-100(class="sm:mx-0 sm:h-10 sm:w-10") +                  svg.h-6.w-6.text-red-600(xmlns="http://www.w3.org/2000/svg", fill="none", viewbox="0 0 24 24", stroke-width="1.5", stroke="currentColor", aria-hidden="true") +                    path(stroke-linecap="round", stroke-linejoin="round", d="M12 10.5v3.75m-9.303 3.376C1.83 19.126 2.914 21 4.645 21h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 4.88c-.866-1.501-3.032-1.501-3.898 0L2.697 17.626zM12 17.25h.007v.008H12v-.008z") +                .mt-3.text-center(class="sm:mt-0 sm:ml-4 sm:text-left") +                  h3#modal-title.text-lg.font-medium.leading-6.text-gray-900 Are you sure? +                  .mt-2 +                    p.text-sm.text-gray-500 +                      | Model data and all of the files will be deleted. This action cannot be undone. +            .bg-gray-50.px-4.py-3(class="sm:flex sm:flex-row-reverse sm:px-6") +              button.inline-flex.w-full.justify-center.rounded-md.border.border-transparent.bg-red-600.px-4.py-2.text-base.font-medium.text-white.shadow-sm( +                type="button" +                :class="{'hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 sm:ml-3 sm:w-auto sm:text-sm': true, 'opacity-25 cursor-default': isLoading}" +                :disabled="isLoading" +                :readonly="isLoading" +                @click="deleteModel" +              ) +                <svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" v-if="isLoading"> +                  <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> +                  <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path> +                </svg> +                | Yes, confirm +              button.mt-3.inline-flex.w-full.justify-center.rounded-md.border.border-gray-300.bg-white.px-4.py-2.text-base.font-medium.text-gray-700.shadow-sm( +                type="button" +                class="hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm" +                @click="boxDeleteModel = 0" +              ) Cancel      .grid.grid-cols-6.mt-3        div          admin-sidebar @@ -10,6 +43,7 @@            :fields="models"            path="/models/"            :deleterow="true" +          :delete="openModal"          )          pagination(:page="page" :pages="pages" v-if="count" path="/admin/models")  </template> @@ -25,6 +59,7 @@ export default {    name: "AdminView",    head: { title: "Models · Verden" },    computed: { +    ...mapGetters(["isLoading"]),      ...mapGetters("auth", ["isLogged", "me"]),      ...mapGetters("models", ["models", "count"]),    }, @@ -32,6 +67,7 @@ export default {      return {        page: 0,        pages: 0, +      boxDeleteModel: 0,      };    },    components: { @@ -51,5 +87,27 @@ export default {        this.pages = Math.ceil(this.count / 20);      });    }, +  methods: { +    openModal(id) { +      this.boxDeleteModel = id; +    }, +    deleteModel() { +      if (this.boxDeleteModel) { +        this.$store +          .dispatch("models/deleteModel", this.boxDeleteModel) +          .then((response) => { +            if (response.status == 204) { +              this.$store.dispatch("models/getModels", this.page).then(() => { +                this.pages = Math.ceil(this.count / 20); +              }); +              this.$toast.success("Model deleted!"); +              this.boxDeleteModel = 0; +            } else { +              this.$toast.error(response.data); +            } +          }); +      } +    }, +  },  };  </script> diff --git a/pages/admin/reports.vue b/pages/admin/reports.vue index 7191060..5866335 100644 --- a/pages/admin/reports.vue +++ b/pages/admin/reports.vue @@ -1,6 +1,38 @@  <template lang="pug">    .mx-auto.w-90p.py-6(class="sm:px-6 lg:px-8 md:max-w-7xl")      h1.text-3xl.font-bold(class="dark:text-white") Reports +    .relative.z-10(aria-labelledby="modal-title", role="dialog", aria-modal="true" v-if="boxDeleteReport > 0") +      .fixed.inset-0.bg-gray-900.bg-opacity-90.transition-opacity +      .fixed.inset-0.z-10.overflow-y-auto +        .flex.min-h-full.items-end.justify-center.p-4.text-center(class="sm:items-center sm:p-0") +          .relative.transform.overflow-hidden.rounded-lg.bg-white.text-left.shadow-xl.transition-all(class="sm:my-8 sm:w-full sm:max-w-lg") +            .bg-white.px-4.pt-5.pb-4(class="sm:p-6 sm:pb-4") +              div(class="sm:flex sm:items-start") +                .mx-auto.flex.h-12.w-12.flex-shrink-0.items-center.justify-center.rounded-full.bg-red-100(class="sm:mx-0 sm:h-10 sm:w-10") +                  svg.h-6.w-6.text-red-600(xmlns="http://www.w3.org/2000/svg", fill="none", viewbox="0 0 24 24", stroke-width="1.5", stroke="currentColor", aria-hidden="true") +                    path(stroke-linecap="round", stroke-linejoin="round", d="M12 10.5v3.75m-9.303 3.376C1.83 19.126 2.914 21 4.645 21h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 4.88c-.866-1.501-3.032-1.501-3.898 0L2.697 17.626zM12 17.25h.007v.008H12v-.008z") +                .mt-3.text-center(class="sm:mt-0 sm:ml-4 sm:text-left") +                  h3#modal-title.text-lg.font-medium.leading-6.text-gray-900 Are you sure? +                  .mt-2 +                    p.text-sm.text-gray-500 This action cannot be undone. +            .bg-gray-50.px-4.py-3(class="sm:flex sm:flex-row-reverse sm:px-6") +              button.inline-flex.w-full.justify-center.rounded-md.border.border-transparent.bg-red-600.px-4.py-2.text-base.font-medium.text-white.shadow-sm( +                type="button" +                :class="{'hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 sm:ml-3 sm:w-auto sm:text-sm': true, 'opacity-25 cursor-default': isLoading}" +                :disabled="isLoading" +                :readonly="isLoading" +                @click="deleteReport" +              ) +                <svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" v-if="isLoading"> +                  <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> +                  <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path> +                </svg> +                | Yes, confirm +              button.mt-3.inline-flex.w-full.justify-center.rounded-md.border.border-gray-300.bg-white.px-4.py-2.text-base.font-medium.text-gray-700.shadow-sm( +                type="button" +                class="hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm" +                @click="boxDeleteReport = 0" +              ) Cancel      .grid.grid-cols-6.mt-3        div          admin-sidebar @@ -19,6 +51,7 @@            :keys="['id', 'model_id', 'created', 'updated', 'user', 'resolved', 'note', 'admin_note']"            :fields="warnings"            :deleterow="true" +          :delete="openModal"          )          pagination(:page="page" :pages="pages" v-if="count" path="/admin/reports")  </template> @@ -34,6 +67,7 @@ export default {    name: "AdminView",    head: { title: "Reports · Verden" },    computed: { +    ...mapGetters(["isLoading"]),      ...mapGetters("auth", ["isLogged", "me"]),      ...mapGetters("warnings", ["warnings", "count"]),    }, @@ -42,6 +76,7 @@ export default {        page: 0,        pages: 0,        notResolved: false, +      boxDeleteReport: 0,      };    },    components: { @@ -82,5 +117,37 @@ export default {        });      }    }, +  methods: { +    openModal(id) { +      this.boxDeleteReport = id; +    }, +    deleteReport() { +      if (this.boxDeleteReport) { +        this.$store +          .dispatch("warnings/deleteWarning", this.boxDeleteReport) +          .then((response) => { +            if (response.status == 204) { +              if (this.notResolved) { +                this.$store +                  .dispatch("warnings/filterWarnings", { page: this.page }) +                  .then(() => { +                    this.pages = Math.ceil(this.count / 20); +                  }); +              } else { +                this.$store +                  .dispatch("warnings/getWarnings", this.page) +                  .then(() => { +                    this.pages = Math.ceil(this.count / 20); +                  }); +              } +              this.$toast.success("Report deleted!"); +              this.boxDeleteReport = 0; +            } else { +              this.$toast.error(response.data); +            } +          }); +      } +    }, +  },  };  </script> diff --git a/store/warnings.js b/store/warnings.js index 65f1c92..d2983bd 100644 --- a/store/warnings.js +++ b/store/warnings.js @@ -126,4 +126,29 @@ export const actions = {      return res;    }, +  // Delete a warning +  async deleteWarning({ commit, rootGetters }, id) { +    commit("loadingStatus", true, { root: true }); +    let res = { status: 0, data: null }; +    let api = this.$config.api; + +    await fetch(`${api}/v1/warnings/${id}`, { +      method: "DELETE", +      headers: { +        "Content-Type": "application/json", +        Authorization: `Bearer ${rootGetters["auth/accessToken"]}`, +      }, +    }) +      .then(async (response) => { +        res.status = response.status; +        res.data = await response.text(); +      }) +      .catch((e) => { +        res.status = e.status; +      }); + +    commit("loadingStatus", false, { root: true }); + +    return res; +  },  }; | 
