DashboardProvidersClose.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <div class="q-mx-md q-mb-lg">
  3. <div class="row items-center justify-between no-wrap q-mb-sm">
  4. <div class="dashboard-section-title gradient-diarista">{{ $t('dashboard_client.providers_close.title') }}</div>
  5. <div class="text-text-light">
  6. <q-btn flat color="text-light" icon="mdi-chevron-left" @click="setPeriodTypePrevious"/>
  7. <span>{{ showCorrectLabels() }}</span>
  8. <q-btn flat color="text-light" icon="mdi-chevron-right" @click="setPeriodTypeNext"/>
  9. </div>
  10. </div>
  11. <div class="column">
  12. <q-card
  13. v-for="p in data"
  14. :key="p.provider_id"
  15. class="card-border bg-page text-text q-mb-sm"
  16. :flat="false"
  17. >
  18. <q-card-section class="row no-wrap q-pa-sm">
  19. <div class="row no-wrap full-width">
  20. <div class="col-2">
  21. <q-avatar :style="avatarColors[p.provider_id % avatarColors.length]" class="text-weight-bold">
  22. <img v-if="p.provider_photo" :src="p.provider_photo" style="object-fit:cover;border-radius:50%;" />
  23. <span v-else>{{ p.provider_name?.slice(0,1).toUpperCase() ?? '—' }}</span>
  24. </q-avatar>
  25. </div>
  26. <div class="col-10 row">
  27. <div class="column col-9 justify-between">
  28. <span class="text-provider-close-name">{{ p.provider_name ?? 'Prestador' }}</span>
  29. <span class="text-provider-close-region">{{ p.district }}</span>
  30. <div class="row items-center justify-between q-pr-lg">
  31. <div class="row items-center">
  32. <q-icon name="mdi-star" color="warning" size="16px" />
  33. <span class="text-provider-close-rating">
  34. {{ p.average_rating != null ? (Number(p.average_rating).toFixed(1) + ' (' + (p.total_reviews ?? 0) + ')') : ('(' + (p.total_reviews ?? 0) + ')') }}
  35. </span>
  36. </div>
  37. <div class="row items-center">
  38. <q-icon name="mdi-broom" color="secondary" size="16px" />
  39. <span class="text-provider-close-jobs">{{ p.total_services ?? 0 }}</span>
  40. </div>
  41. <div class="row items-center">
  42. <q-icon name="mdi-map-marker-outline" color="text" size="16px" />
  43. <span class="text-provider-close-jobs">{{ (p.distance_km ?? '--') + ' km' }}</span>
  44. </div>
  45. </div>
  46. </div>
  47. <div class="column col-3 justify-between text-center items-center">
  48. <span class="text-provider-close-price">
  49. {{ showCorrectValues(p) }}
  50. </span>
  51. <div class="full-width">
  52. <q-btn
  53. unelevated rounded no-caps
  54. color="primary"
  55. size="sm"
  56. padding="3px 12px"
  57. :label="$t('dashboard_client.providers_close.schedule')"
  58. @click="goToScheduling(p)"
  59. />
  60. </div>
  61. </div>
  62. </div>
  63. </div>
  64. </q-card-section>
  65. </q-card>
  66. </div>
  67. </div>
  68. </template>
  69. <script setup>
  70. import { useQuasar } from 'quasar';
  71. import { formatCurrency } from 'src/helpers/utils';
  72. import SchedulingDialog from 'src/pages/search/components/SchedulingDialog.vue';
  73. import { ref } from 'vue';
  74. import { useI18n } from 'vue-i18n';
  75. defineProps({ data: { type: Array, default: () => [] } });
  76. const $q = useQuasar();
  77. const { t } = useI18n();
  78. const currentPeriodType = ref(8);
  79. const periodTypeMap = ref({
  80. 2: 'daily_price_2h',
  81. 4: 'daily_price_4h',
  82. 6: 'daily_price_6h',
  83. 8: 'daily_price_8h',
  84. });
  85. const showCorrectValues = (p) => {
  86. switch (currentPeriodType.value) {
  87. case 8:
  88. return p.daily_price_8h ? formatCurrency(p.daily_price_8h) : t('dashboard_client.providers_close.no_price');
  89. case 6:
  90. return p.daily_price_6h ? formatCurrency(p.daily_price_6h) : t('dashboard_client.providers_close.no_price');
  91. case 4:
  92. return p.daily_price_4h ? formatCurrency(p.daily_price_4h) : t('dashboard_client.providers_close.no_price');
  93. case 2:
  94. return p.daily_price_2h ? formatCurrency(p.daily_price_2h) : t('dashboard_client.providers_close.no_price');
  95. default:
  96. return t('dashboard_client.providers_close.no_price');
  97. }
  98. };
  99. const showCorrectLabels = () => {
  100. switch (currentPeriodType.value) {
  101. case 8:
  102. return t('dashboard_client.providers_close.until_8h');
  103. case 6:
  104. return t('dashboard_client.providers_close.until_6h');
  105. case 4:
  106. return t('dashboard_client.providers_close.until_4h');
  107. case 2:
  108. return t('dashboard_client.providers_close.until_2h');
  109. default:
  110. return '';
  111. }
  112. };
  113. const setPeriodTypePrevious = () => {
  114. const previousPeriod = currentPeriodType.value - 2;
  115. if (periodTypeMap.value[previousPeriod]) {
  116. currentPeriodType.value = previousPeriod;
  117. }
  118. };
  119. const setPeriodTypeNext = () => {
  120. const nextPeriod = currentPeriodType.value + 2;
  121. if (periodTypeMap.value[nextPeriod]) {
  122. currentPeriodType.value = nextPeriod;
  123. }
  124. };
  125. const avatarColors = [
  126. { background: '#ffd5df', color: '#932e57' },
  127. { background: '#d7e8ff', color: '#2158a8' },
  128. { background: '#dfd', color: '#2a7a3b' },
  129. { background: '#ffe5cc', color: '#8a4500' },
  130. ];
  131. const goToScheduling = (provider) => {
  132. $q.dialog({
  133. component: SchedulingDialog,
  134. componentProps: { provider },
  135. });
  136. };
  137. </script>
  138. <style scoped lang="scss">
  139. </style>