|
|
@@ -5,34 +5,30 @@
|
|
|
<div class="scroll-track">
|
|
|
<q-card
|
|
|
v-for="item in data"
|
|
|
- :key="item.id"
|
|
|
+ :key="item.provider_id"
|
|
|
class="fav-card shadow-card bg-surface card-border"
|
|
|
:flat="false"
|
|
|
>
|
|
|
<q-card-section class="q-pa-sm column text-text">
|
|
|
<div class="row items-start no-wrap q-gutter-x-sm">
|
|
|
<div class="col-3">
|
|
|
- <q-avatar :style="avatarColors[item.id % avatarColors.length]" size="46px" class="text-weight-bold">
|
|
|
+ <q-avatar :style="avatarColors[item.provider_id % avatarColors.length]" size="46px" class="text-weight-bold">
|
|
|
{{ item.provider_name?.slice(0,1).toUpperCase() ?? '—' }}
|
|
|
</q-avatar>
|
|
|
</div>
|
|
|
- <div class="col-9 row">
|
|
|
- <div class="col-6 column full-height justify-between">
|
|
|
- <div class="column q-gutter-y-xs">
|
|
|
- <span class="text-fav-name">{{ item.provider_name ?? 'Prestador' }}</span>
|
|
|
- <div class="row items-center q-gutter-x-xs">
|
|
|
- <q-icon name="mdi-star" color="warning" size="sm" />
|
|
|
- <span class="text-fav-name">{{ item.average_rating ?? '-' }}</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="column col-5 items-end justify-end">
|
|
|
- <q-btn
|
|
|
- rounded color="primary"
|
|
|
- padding="1px 5px" size="sm"
|
|
|
- :label="$t('dashboard_client.favorites.view_schedule')"
|
|
|
- />
|
|
|
+ <div class="col-9 column q-gutter-y-xs">
|
|
|
+ <span class="text-fav-name">{{ item.provider_name ?? 'Prestador' }}</span>
|
|
|
+ <div v-if="item.average_rating != null" class="row items-center q-gutter-x-xs">
|
|
|
+ <q-icon name="mdi-star" color="warning" size="sm" />
|
|
|
+ <span class="text-fav-name">{{ Number(item.average_rating).toFixed(1) }}</span>
|
|
|
</div>
|
|
|
+ <span class="text-fav-price">{{ bestPrice(item) }}</span>
|
|
|
+ <q-btn
|
|
|
+ rounded color="primary"
|
|
|
+ padding="1px 5px" size="sm"
|
|
|
+ class="q-mt-xs"
|
|
|
+ :label="$t('dashboard_client.favorites.view_schedule')"
|
|
|
+ />
|
|
|
</div>
|
|
|
</div>
|
|
|
</q-card-section>
|
|
|
@@ -42,14 +38,32 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
+import { formatCurrency } from 'src/helpers/utils';
|
|
|
+import { useI18n } from 'vue-i18n';
|
|
|
+
|
|
|
defineProps({ data: { type: Array, default: () => [] } });
|
|
|
|
|
|
+const { t } = useI18n();
|
|
|
+
|
|
|
const avatarColors = [
|
|
|
{ background: '#ffd5df', color: '#932e57' },
|
|
|
{ background: '#d7e8ff', color: '#2158a8' },
|
|
|
{ background: '#dfd', color: '#2a7a3b' },
|
|
|
{ background: '#ffe5cc', color: '#8a4500' },
|
|
|
];
|
|
|
+
|
|
|
+const bestPrice = (item) => {
|
|
|
+ const prices = [
|
|
|
+ item.daily_price_2h,
|
|
|
+ item.daily_price_4h,
|
|
|
+ item.daily_price_6h,
|
|
|
+ item.daily_price_8h,
|
|
|
+ ].filter(p => p != null && Number(p) > 0);
|
|
|
+
|
|
|
+ if (!prices.length) return t('dashboard_client.favorites.no_price');
|
|
|
+ const min = Math.min(...prices.map(Number));
|
|
|
+ return t('dashboard_client.favorites.from') + ' ' + formatCurrency(min);
|
|
|
+};
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|