DataRequests.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <script setup lang="ts">
  2. import { defineAsyncComponent, ref } from "vue";
  3. import Toast from "toasters";
  4. import { useWebsocketsStore } from "@/stores/websockets";
  5. import { useUserAuthStore } from "@/stores/userAuth";
  6. import { TableColumn, TableFilter, TableEvents } from "@/types/advancedTable";
  7. const AdvancedTable = defineAsyncComponent(
  8. () => import("@/components/AdvancedTable.vue")
  9. );
  10. const { socket } = useWebsocketsStore();
  11. const columnDefault = ref<TableColumn>({
  12. sortable: true,
  13. hidable: true,
  14. defaultVisibility: "shown",
  15. draggable: true,
  16. resizable: true,
  17. minWidth: 230,
  18. maxWidth: 600
  19. });
  20. const columns = ref<TableColumn[]>([
  21. {
  22. name: "options",
  23. displayName: "Options",
  24. properties: ["_id"],
  25. sortable: false,
  26. hidable: false,
  27. resizable: false,
  28. minWidth: 76,
  29. defaultWidth: 76
  30. },
  31. {
  32. name: "resolved",
  33. displayName: "Resolved",
  34. properties: ["resolved"],
  35. sortProperty: "resolved",
  36. minWidth: 150
  37. },
  38. {
  39. name: "type",
  40. displayName: "Type",
  41. properties: ["type"],
  42. sortable: false
  43. },
  44. {
  45. name: "userId",
  46. displayName: "User ID",
  47. properties: ["userId"],
  48. sortProperty: "userId"
  49. },
  50. {
  51. name: "_id",
  52. displayName: "Request ID",
  53. properties: ["_id"],
  54. sortProperty: "_id"
  55. }
  56. ]);
  57. const filters = ref<TableFilter[]>([
  58. {
  59. name: "_id",
  60. displayName: "Request ID",
  61. property: "_id",
  62. filterTypes: ["exact"],
  63. defaultFilterType: "exact"
  64. },
  65. {
  66. name: "userId",
  67. displayName: "User ID",
  68. property: "userId",
  69. filterTypes: ["contains", "exact", "regex"],
  70. defaultFilterType: "contains"
  71. },
  72. {
  73. name: "resolved",
  74. displayName: "Resolved",
  75. property: "resolved",
  76. filterTypes: ["boolean"],
  77. defaultFilterType: "boolean"
  78. }
  79. ]);
  80. const events = ref<TableEvents>({
  81. adminRoom: "dataRequests",
  82. updated: {
  83. event: "admin.dataRequests.updated",
  84. id: "dataRequest._id",
  85. item: "dataRequest"
  86. }
  87. });
  88. const { hasPermission } = useUserAuthStore();
  89. const resolveDataRequest = (id, resolved) => {
  90. socket.dispatch("dataRequests.resolve", id, resolved, res => {
  91. if (res.status === "success") new Toast(res.message);
  92. });
  93. };
  94. </script>
  95. <template>
  96. <div class="admin-tab container">
  97. <page-metadata title="Admin | Users | Data Requests" />
  98. <div class="card tab-info">
  99. <div class="info-row">
  100. <h1>Data Requests</h1>
  101. <p>Manage data requests made by users</p>
  102. </div>
  103. </div>
  104. <advanced-table
  105. :column-default="columnDefault"
  106. :columns="columns"
  107. :filters="filters"
  108. data-action="dataRequests.getData"
  109. name="admin-data-requests"
  110. :max-width="1200"
  111. :events="events"
  112. >
  113. <template #column-options="slotProps">
  114. <div class="row-options">
  115. <button
  116. v-if="
  117. hasPermission('dataRequests.resolve') &&
  118. slotProps.item.resolved
  119. "
  120. class="button is-danger material-icons icon-with-button"
  121. @click="resolveDataRequest(slotProps.item._id, false)"
  122. :disabled="slotProps.item.removed"
  123. content="Unresolve Data Request"
  124. v-tippy
  125. >
  126. remove_done
  127. </button>
  128. <button
  129. v-else-if="hasPermission('dataRequests.resolve')"
  130. class="button is-success material-icons icon-with-button"
  131. @click="resolveDataRequest(slotProps.item._id, true)"
  132. :disabled="slotProps.item.removed"
  133. content="Resolve Data Request"
  134. v-tippy
  135. >
  136. done_all
  137. </button>
  138. </div>
  139. </template>
  140. <template #column-resolved="slotProps">
  141. <span :title="slotProps.item.resolved">{{
  142. slotProps.item.resolved
  143. }}</span>
  144. </template>
  145. <template #column-type="slotProps">
  146. <span
  147. :title="
  148. slotProps.item.type
  149. ? 'Remove all associated data'
  150. : slotProps.item.type
  151. "
  152. >{{
  153. slotProps.item.type
  154. ? "Remove all associated data"
  155. : slotProps.item.type
  156. }}</span
  157. >
  158. </template>
  159. <template #column-userId="slotProps">
  160. <span :title="slotProps.item.userId">{{
  161. slotProps.item.userId
  162. }}</span>
  163. </template>
  164. <template #column-_id="slotProps">
  165. <span :title="slotProps.item._id">{{
  166. slotProps.item._id
  167. }}</span>
  168. </template>
  169. </advanced-table>
  170. </div>
  171. </template>