ProviderPage.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <template>
  2. <div>
  3. <DefaultHeaderPage />
  4. <div>
  5. <DefaultTable
  6. ref="tableRef"
  7. :columns="columns"
  8. :api-call="getProviders"
  9. :delete-function="deleteProvider"
  10. :mostrar-selecao-de-colunas="false"
  11. :mostrar-botao-fullscreen="false"
  12. :mostrar-toggle-inativos="false"
  13. class="provider-table"
  14. open-item
  15. add-item
  16. @on-row-click="onRowClick"
  17. @on-add-item="onAddItem"
  18. >
  19. <template #body-cell-approval_status="slotProps">
  20. <q-td :props="slotProps">
  21. <q-badge
  22. :class="[
  23. 'approval-status-label',
  24. `approval-status-label--${slotProps.row.approval_status}`,
  25. ]"
  26. :label="
  27. $t(`provider.approval_status.${slotProps.row.approval_status}`)
  28. "
  29. />
  30. </q-td>
  31. </template>
  32. </DefaultTable>
  33. </div>
  34. </div>
  35. </template>
  36. <script setup>
  37. import { defineAsyncComponent, useTemplateRef } from "vue";
  38. import { useQuasar } from "quasar";
  39. import { useI18n } from "vue-i18n";
  40. import { permissionStore } from "src/stores/permission";
  41. import { getProviders, deleteProvider } from "src/api/provider";
  42. import DefaultTable from "src/components/defaults/DefaultTable.vue";
  43. import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
  44. const AddEditProviderDialog = defineAsyncComponent(
  45. () => import("src/pages/provider/components/AddEditProviderDialog.vue"),
  46. );
  47. const permission_store = permissionStore();
  48. const $q = useQuasar();
  49. const tableRef = useTemplateRef("tableRef");
  50. const { t } = useI18n();
  51. const columns = [
  52. {
  53. name: "document",
  54. label: t("provider.fields.document"),
  55. field: "document",
  56. align: "left",
  57. sortable: true,
  58. },
  59. {
  60. name: "user",
  61. label: t("common.terms.user"),
  62. field: (row) => row.user?.name || "-",
  63. align: "left",
  64. sortable: true,
  65. },
  66. {
  67. name: "birth_date",
  68. label: t("provider.fields.birth_date"),
  69. field: "birth_date",
  70. align: "center",
  71. sortable: true,
  72. },
  73. {
  74. name: "approval_status",
  75. label: t("provider.fields.approval_status"),
  76. field: (row) => t(`provider.approval_status.${row.approval_status}`),
  77. align: "center",
  78. sortable: true,
  79. },
  80. {
  81. name: "average_rating",
  82. label: t("provider.fields.average_rating"),
  83. field: (row) => row.average_rating || "-",
  84. align: "center",
  85. sortable: true,
  86. },
  87. {
  88. name: "total_services",
  89. label: t("provider.fields.total_services"),
  90. field: "total_services",
  91. align: "center",
  92. sortable: true,
  93. },
  94. {
  95. name: "daily_price_8h",
  96. label: t("provider.fields.daily_price_8h"),
  97. field: (row) => (row.daily_price_8h ? `R$ ${row.daily_price_8h}` : "-"),
  98. align: "center",
  99. sortable: true,
  100. },
  101. {
  102. name: "actions",
  103. required: true,
  104. },
  105. ];
  106. const onRowClick = ({ row }) => {
  107. if (permission_store.getAccess("config.provider", "edit") === false) {
  108. $q.loading.hide();
  109. $q.notify({
  110. type: "negative",
  111. message: t("validation.permissions.edit"),
  112. });
  113. return;
  114. }
  115. $q.dialog({
  116. component: AddEditProviderDialog,
  117. componentProps: {
  118. provider: row,
  119. title: () =>
  120. useI18n().t("common.actions.edit") +
  121. " " +
  122. useI18n().t("ui.navigation.provider"),
  123. },
  124. }).onOk(async (success) => {
  125. if (success) {
  126. tableRef.value.refresh();
  127. }
  128. });
  129. };
  130. const onAddItem = () => {
  131. if (permission_store.getAccess("config.provider", "add") === false) {
  132. $q.loading.hide();
  133. $q.notify({
  134. type: "negative",
  135. message: t("validation.permissions.add"),
  136. });
  137. return;
  138. }
  139. $q.dialog({
  140. component: AddEditProviderDialog,
  141. componentProps: {
  142. title: () =>
  143. useI18n().t("common.actions.add") +
  144. " " +
  145. useI18n().t("ui.navigation.provider"),
  146. },
  147. }).onOk(async (success) => {
  148. if (success) {
  149. tableRef.value.refresh();
  150. }
  151. });
  152. };
  153. </script>
  154. <style scoped>
  155. :deep(.provider-table th.sortable) {
  156. position: relative;
  157. }
  158. :deep(.provider-table .q-table__sort-icon) {
  159. position: absolute;
  160. top: 50%;
  161. right: 8px;
  162. margin: -0.6em 0 0;
  163. }
  164. :deep(.provider-table .q-table__sort-icon--right) {
  165. right: auto;
  166. left: 8px;
  167. }
  168. .approval-status-label {
  169. width: 96px;
  170. padding: 6px 10px;
  171. justify-content: center;
  172. color: #424242;
  173. background: #eeeeee;
  174. border-radius: 12px;
  175. font-weight: 500;
  176. }
  177. .approval-status-label--pending {
  178. color: #8a5a00;
  179. background: #fff3cd;
  180. }
  181. .approval-status-label--accepted {
  182. color: #1b5e20;
  183. background: #d9f2df;
  184. }
  185. .approval-status-label--rejected {
  186. color: #8e1b1b;
  187. background: #f8d7da;
  188. }
  189. </style>