UsersPage.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <template>
  2. <div>
  3. <DefaultHeaderPage>
  4. <template #after>
  5. <q-btn
  6. color="primary"
  7. padding="8px 8px"
  8. :label="$t('common.actions.add')"
  9. icon="mdi-plus"
  10. class="q-mt-md"
  11. @click="onAddItem"
  12. />
  13. </template>
  14. </DefaultHeaderPage>
  15. <div>
  16. <DefaultTable
  17. ref="tableRef"
  18. :columns="columns"
  19. :api-call="getUsers"
  20. :delete-function="deleteUser"
  21. :show-columns-select="false"
  22. :title="
  23. $t('common.terms.list') +
  24. ' ' +
  25. $t('common.ui.table.of') +
  26. ' ' +
  27. $t('user.plural')
  28. "
  29. >
  30. <template #body-cell-actions="{ row }">
  31. <q-btn
  32. outline
  33. style="width: 36px"
  34. class="q-ml-auto q-mr-sm"
  35. @click.prevent.stop="onRowClick(row)"
  36. >
  37. <q-icon name="mdi-file-edit-outline" />
  38. </q-btn>
  39. </template>
  40. </DefaultTable>
  41. </div>
  42. </div>
  43. </template>
  44. <script setup>
  45. import { defineAsyncComponent, useTemplateRef } from "vue";
  46. import { useQuasar } from "quasar";
  47. import { useI18n } from "vue-i18n";
  48. import { permissionStore } from "src/stores/permission";
  49. import { getUsers, deleteUser } from "src/api/user";
  50. import DefaultTable from "src/components/defaults/DefaultTable.vue";
  51. import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
  52. const AddEditUserDialog = defineAsyncComponent(
  53. () => import("src/pages/users/components/AddEditUserDialog.vue"),
  54. );
  55. const permission_store = permissionStore();
  56. const $q = useQuasar();
  57. const { t } = useI18n();
  58. const tableRef = useTemplateRef("tableRef");
  59. const columns = [
  60. {
  61. name: "name",
  62. label: t("common.terms.name"),
  63. field: "name",
  64. align: "left",
  65. required: true,
  66. sortable: true,
  67. },
  68. {
  69. name: "email",
  70. label: "Email",
  71. field: "email",
  72. align: "left",
  73. sortable: true,
  74. },
  75. {
  76. name: "actions",
  77. label: t("common.terms.actions"),
  78. align: "left",
  79. required: true,
  80. },
  81. ];
  82. const onRowClick = (row) => {
  83. if (permission_store.getAccess("config.user", "view") === false) {
  84. $q.notify({
  85. type: "negative",
  86. message: t("validation.permissions.view"),
  87. });
  88. return;
  89. }
  90. $q.dialog({
  91. component: AddEditUserDialog,
  92. componentProps: {
  93. user: row,
  94. title: () => t("common.actions.edit") + " " + t("user.singular"),
  95. },
  96. }).onOk(async (success) => {
  97. if (success) {
  98. tableRef.value.refresh();
  99. }
  100. });
  101. };
  102. const onAddItem = () => {
  103. if (permission_store.getAccess("config.user", "add") === false) {
  104. $q.notify({
  105. type: "negative",
  106. message: t("validation.permissions.add"),
  107. });
  108. return;
  109. }
  110. $q.dialog({
  111. component: AddEditUserDialog,
  112. componentProps: {
  113. title: () => t("common.actions.add") + " " + t("user.singular"),
  114. },
  115. }).onOk(async (success) => {
  116. if (success) {
  117. tableRef.value.refresh();
  118. }
  119. });
  120. };
  121. </script>