5 کامیت‌ها e644f85b6b ... d06cab5d59

نویسنده SHA1 پیام تاریخ
  Gustavo Zanatta d06cab5d59 ajustes edicao custom schedule + bloqueio preencher codigo se ja tiver preenchido 5 روز پیش
  Gustavo Zanatta 573671c862 ajuste import padronizacao na page 5 روز پیش
  Gustavo Zanatta b4b475fd8b ajustes layout header e breadcrumbs 5 روز پیش
  Gustavo Zanatta e8fa083c7e refactor: :recycle: formatting currency 5 روز پیش
  Gustavo Zanatta 75efb86282 style: :lipstick: aplicando logos e favicon 5 روز پیش

+ 4 - 4
package.json

@@ -1,9 +1,9 @@
 {
-  "name": "quasar-skeleton",
+  "name": "diarista-app",
   "version": "0.0.1",
-  "description": "A skeleton for future projects",
-  "productName": "Quasar App",
-  "author": "Denis <denis.gnl@gmail.com>",
+  "description": "Um aplicativo para diaristas",
+  "productName": "Diaria App",
+  "author": "Gustavo <zanattagg@gmail.com>",
   "type": "module",
   "private": true,
   "scripts": {

BIN
public/favicon.ico


BIN
public/icons/favicon-128x128.png


BIN
public/icons/favicon-16x16.png


BIN
public/icons/favicon-32x32.png


BIN
public/icons/favicon-96x96.png


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6 - 0
public/logo_diaria_branco.svg


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6 - 0
src/assets/logo-diarista.svg


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6 - 0
src/assets/logo_small.svg


+ 0 - 1
src/components/layout/DefaultHeaderPage.vue

@@ -10,7 +10,6 @@
       />
     </q-breadcrumbs>
     <div class="flex items-center justify-between">
-      <span class="text-h5 gradient-diarista">{{ $t($route.meta?.title) }}</span>
       <slot name="after" />
     </div>
     <q-separator class="q-my-sm" />

+ 12 - 17
src/components/layout/LeftMenuLayout.vue

@@ -168,11 +168,6 @@
           <div class="flex">
             <q-item-section avatar>
               <template #default>
-                <!-- <img
-                  :src="someAvatar()"
-                  alt="avatar"
-                  style="width: 20px; height: 20px; border-radius: 50%"
-                /> -->
                 <q-icon
                   name="mdi-account"
                   color="primary"
@@ -212,21 +207,21 @@
                   }}</q-item-section>
                 </div>
               </q-item>
-              <q-item v-ripple clickable @click="logoutFn">
-                <div class="flex">
-                  <q-item-section avatar>
-                    <q-icon
-                      name="logout"
-                      color="negative"
-                      style="font-size: 18px"
-                    />
-                  </q-item-section>
-                  <q-item-section>{{ $t("auth.logout") }}</q-item-section>
-                </div>
-              </q-item>
             </q-list>
           </q-menu>
         </q-item>
+        <q-item v-ripple clickable @click="logoutFn">
+          <div class="flex">
+            <q-item-section avatar>
+              <q-icon
+                name="logout"
+                color="negative"
+                style="font-size: 18px"
+              />
+            </q-item-section>
+            <q-item-section>{{ $t("auth.logout") }}</q-item-section>
+          </div>
+        </q-item>
         <q-item v-ripple>
           <div class="flex full-width justify-center">
             <q-img

+ 2 - 2
src/pages/LoginPage.vue

@@ -2,7 +2,7 @@
   <q-page padding class="login-page">
     <q-card flat class="login-card q-pa-md q-pt-xl bg-surface">
       <div class="text-center">
-        <q-img :src="Logo" style="max-width: 250px" />
+        <q-img :src="LogoDiarista" style="max-width: 250px" />
         <div class="text-h6">{{ $t("common.ui.messages.welcome") }}</div>
       </div>
 
@@ -60,7 +60,7 @@ import { useAuth } from "src/composables/useAuth";
 import { useRouter } from "vue-router";
 import { useInputRules } from "src/composables/useInputRules";
 
-import Logo from "src/assets/logo.png";
+import LogoDiarista from "src/assets/logo-diarista.svg";
 import DefaultPasswordInput from "src/components/defaults/DefaultPasswordInput.vue";
 
 const router = useRouter();

+ 5 - 9
src/pages/dashboard/DashboardPage.vue

@@ -104,7 +104,7 @@
                                 {{ schedule.period_type }} {{ $t('schedules.hours') }}
                               </q-item-label>
                               <q-item-label caption class="text-positive text-weight-bold">
-                                {{ formatCurrency(schedule.total_amount) }}
+                                {{ formatToBRLCurrency(schedule.total_amount) }}
                               </q-item-label>
                             </q-item-section>
 
@@ -194,7 +194,7 @@
                                 {{ schedule.period_type }} {{ $t('schedules.hours') }}
                               </q-item-label>
                               <q-item-label caption class="text-positive text-weight-bold">
-                                {{ formatCurrency(schedule.total_amount) }}
+                                {{ formatToBRLCurrency(schedule.total_amount) }}
                               </q-item-label>
                             </q-item-section>
 
@@ -302,7 +302,7 @@
                                 {{ schedule.period_type }} {{ $t('schedules.hours') }}
                               </q-item-label>
                               <q-item-label caption class="text-positive text-weight-bold">
-                                {{ formatCurrency(schedule.total_amount) }}
+                                {{ formatToBRLCurrency(schedule.total_amount) }}
                               </q-item-label>
                             </q-item-section>
 
@@ -399,7 +399,7 @@
                                 {{ schedule.period_type }} {{ $t('schedules.hours') }}
                               </q-item-label>
                               <q-item-label caption class="text-positive text-weight-bold">
-                                {{ formatCurrency(schedule.total_amount) }}
+                                {{ formatToBRLCurrency(schedule.total_amount) }}
                               </q-item-label>
                             </q-item-section>
 
@@ -471,6 +471,7 @@ import { getSchedulesGroupedByClient, getSchedulesGroupedByClientCustom, updateS
 import { getProvidersProposalsAndOpportunities } from 'src/api/customSchedule'
 import ProviderSelect from 'src/components/provider/ProviderSelect.vue'
 import DefaultTable from 'src/components/defaults/DefaultTable.vue'
+import { formatToBRLCurrency } from 'src/helpers/utils'
 
 const $q = useQuasar()
 const { t } = useI18n()
@@ -573,11 +574,6 @@ const proposalColumns = computed(() => [
   }
 ])
 
-const formatCurrency = (value) => {
-  if (!value) return 'R$ 0,00'
-  return `R$ ${Number(value).toFixed(2).replace('.', ',')}`
-}
-
 const getStatusColor = (status) => {
   const colors = {
     pending: 'warning',

+ 46 - 48
src/pages/opportunity/CustomSchedulesPage.vue

@@ -1,43 +1,46 @@
 <template>
-  <DefaultTable
-    ref="tableRef"
-    :columns="columns"
-    :loading="loading"
-    :api-call="getCustomSchedules"
-    :add-button-label="$t('opportunities.add')"
-    :empty-message="$t('opportunities.empty_state')"
-    :delete-function="deleteCustomSchedule"
-    :mostrar-selecao-de-colunas="false"
-    :mostrar-botao-fullscreen="false"
-    :mostrar-toggle-inativos="false"
-    :open-item="true"
-    @on-row-click="onRowClick"
-    @on-add-item="onAddItem"
-  >
-    <template #body-cell-status="template_props">
-      <q-td :props="template_props">
-        <q-chip
-          :label="$t(`schedules.statuses.${template_props.row.schedule?.status}`)"
-          :color="getStatusColor(template_props.row.schedule?.status)"
-          text-color="white"
-          size="sm"
-        />
-      </q-td>
-    </template>
+  <q-page>
+    <DefaultHeaderPage />
+    <DefaultTable
+      ref="tableRef"
+      :columns="columns"
+      :loading="loading"
+      :api-call="getCustomSchedules"
+      :add-button-label="$t('opportunities.add')"
+      :empty-message="$t('opportunities.empty_state')"
+      :delete-function="deleteCustomSchedule"
+      :mostrar-selecao-de-colunas="false"
+      :mostrar-botao-fullscreen="false"
+      :mostrar-toggle-inativos="false"
+      :open-item="true"
+      @on-row-click="onRowClick"
+      @on-add-item="onAddItem"
+    >
+      <template #body-cell-status="template_props">
+        <q-td :props="template_props">
+          <q-chip
+            :label="$t(`schedules.statuses.${template_props.row.schedule?.status}`)"
+            :color="getStatusColor(template_props.row.schedule?.status)"
+            text-color="white"
+            size="sm"
+          />
+        </q-td>
+      </template>
 
-    <template #body-cell-price_range="template_props">
-      <q-td :props="template_props">
-        {{ formatCurrency(template_props.row.min_price) }}
-        {{ formatCurrency(template_props.row.max_price) }}
-      </q-td>
-    </template>
+      <template #body-cell-price_range="template_props">
+        <q-td :props="template_props">
+          {{ formatToBRLCurrency(template_props.row.min_price) }}
+          {{ formatToBRLCurrency(template_props.row.max_price) }}
+        </q-td>
+      </template>
 
-    <template #body-cell-period="template_props">
-      <q-td :props="template_props">
-        {{ template_props.row.schedule?.period_type }}{{ $t('schedules.hours') }}
-      </q-td>
-    </template>
-  </DefaultTable>
+      <template #body-cell-period="template_props">
+        <q-td :props="template_props">
+          {{ template_props.row.schedule?.period_type }}{{ $t('schedules.hours') }}
+        </q-td>
+      </template>
+    </DefaultTable>
+  </q-page>
 </template>
 
 <script setup>
@@ -47,6 +50,8 @@ import { useQuasar } from 'quasar'
 import { getCustomSchedules, deleteCustomSchedule } from 'src/api/customSchedule'
 import DefaultTable from 'src/components/defaults/DefaultTable.vue'
 import AddEditCustomScheduleDialog from './components/AddEditCustomScheduleDialog.vue'
+import { formatToBRLCurrency } from 'src/helpers/utils'
+import DefaultHeaderPage from 'src/components/layout/DefaultHeaderPage.vue'
 
 const { t } = useI18n()
 const $q = useQuasar()
@@ -58,7 +63,7 @@ const columns = computed(() => [
     name: 'id',
     label: 'ID',
     align: 'left',
-    field: 'id',
+    field: row => row.schedule?.id,
     sortable: true
   },
   {
@@ -86,21 +91,21 @@ const columns = computed(() => [
     name: 'period',
     label: t('opportunities.period'),
     align: 'center',
-    field: row => row.schedule?.period_type,
+    field: row => row.schedule?.period_type + ' h',
     sortable: true
   },
   {
     name: 'price_range',
     label: t('opportunities.price_range'),
     align: 'right',
-    field: row => `${row.min_price} - ${row.max_price}`,
+    field: row => `${formatToBRLCurrency(row.min_price)} - ${formatToBRLCurrency(row.max_price)}`,
     sortable: false
   },
   {
     name: 'status',
     label: t('common.terms.status'),
     align: 'center',
-    field: row => row.schedule?.status,
+    field: row => t(`schedules.statuses.${row.schedule?.status}`),
     sortable: true
   },
   {
@@ -124,13 +129,6 @@ const getStatusColor = (status) => {
   return colors[status] || 'grey'
 }
 
-const formatCurrency = (value) => {
-  return new Intl.NumberFormat('pt-BR', {
-    style: 'currency',
-    currency: 'BRL'
-  }).format(value)
-}
-
 const onAddItem = () => {
   $q.dialog({
     component: AddEditCustomScheduleDialog,

+ 13 - 5
src/pages/opportunity/components/AddEditCustomScheduleDialog.vue

@@ -132,7 +132,6 @@
             :error="!!serverErrors?.date"
             :error-message="serverErrors?.date"
             class="col-12"
-            @update:untreated-date="updateAvailableTimeSlots"
           />
 
           <div v-show="formData.period_type && formData.date" class="col-12">
@@ -278,9 +277,9 @@ const availableTimeSlots = computed(() => {
   const slots = []
 
   for (let hour = 7; hour <= 20 - period; hour++) {
-    const startTime = `${hour.toString().padStart(2, '0')}:00:00`
+    const startTime = `${hour.toString().padStart(2, '0')}:00`
     const endHour = hour + period
-    const endTime = `${endHour.toString().padStart(2, '0')}:00:00`
+    const endTime = `${endHour.toString().padStart(2, '0')}:00`
     const slotValue = `${startTime}|${endTime}`
 
     slots.push({
@@ -309,6 +308,8 @@ const handleRemoveSpeciality = (index) => {
 }
 
 const onClientChange = (client) => {
+  if(!isMounted.value) return
+  if(client?.value == formData.client_id) return
   formData.client_id = client?.value || null
   formData.address_id = null
   selectedAddress.value = null
@@ -316,17 +317,24 @@ const onClientChange = (client) => {
 }
 
 const onAddressChange = (address) => {
+  if(!isMounted.value) return
+  if(address?.value == formData.address_id) return
   formData.address_id = address?.value || null
   serverErrors.address_id = null
 }
 
 const onServiceTypeChange = (serviceType) => {
+  if(!isMounted.value) return
+  if(serviceType?.value == formData.service_type_id) return
   formData.service_type_id = serviceType?.value || null
   serverErrors.service_type_id = null
 }
 
-const onAddressTypeChange = () => {
+const onAddressTypeChange = (addressType) => {
+  if(!isMounted.value) return
+  if(addressType?.value == formData.address_type) return
   formData.address_id = null
+  formData.address_type = addressType || null
   selectedAddress.value = null
 }
 
@@ -394,6 +402,6 @@ watch(
 
 onMounted(async () => {
   await loadSpecialities()
-  isMounted.value = true
+  isMounted.value = true;
 })
 </script>

+ 4 - 8
src/pages/opportunity/components/ViewCustomScheduleDialog.vue

@@ -63,14 +63,14 @@
           <div class="col-12">
             <div class="text-caption text-grey-7">{{ $t('opportunities.price_range') }}</div>
             <div class="text-body1">
-              {{ formatCurrency(schedule.custom_schedule?.min_price) }} {{ $t('schedules.to') }} {{ formatCurrency(schedule.custom_schedule?.max_price) }}
+              {{ formatToBRLCurrency(schedule.custom_schedule?.min_price) }} {{ $t('schedules.to') }} {{ formatToBRLCurrency(schedule.custom_schedule?.max_price) }}
             </div>
           </div>
 
           <div class="col-12 col-md-6">
             <div class="text-caption text-grey-7">{{ $t('schedules.total_amount') }}</div>
             <div class="text-h6 text-positive">
-              {{ formatCurrency(schedule.total_amount) }}
+              {{ formatToBRLCurrency(schedule.total_amount) }}
             </div>
           </div>
 
@@ -217,7 +217,7 @@
           @click="handleMarkAsPaid"
         />
         <q-btn
-          v-if="schedule?.status === 'paid' && viewMode == 'provider'"
+          v-if="(schedule?.status === 'paid' || schedule?.status === 'started' ) && viewMode == 'provider' && !schedule.code_verified"
           unelevated
           :label="$t('schedules.fill_code')"
           color="secondary"
@@ -235,6 +235,7 @@ import { useI18n } from 'vue-i18n'
 import DefaultDialogHeader from 'src/components/defaults/DefaultDialogHeader.vue'
 import { getOpportunityProposals, proposeOpportunity, acceptProposal, refuseProposal, verifyScheduleCode, refuseOpportunity } from 'src/api/customSchedule'
 import { updateScheduleStatus } from 'src/api/schedule'
+import { formatToBRLCurrency } from 'src/helpers/utils'
 
 const props = defineProps({
   schedule: {
@@ -379,11 +380,6 @@ const formatAddress = (address) => {
   return `${address.address}${address.complement ? ', ' + address.complement : ''}, ${address.city?.name ?? address.city} - ${address.state?.name ?? address.state}, CEP: ${address.zip_code}`
 }
 
-const formatCurrency = (value) => {
-  if (!value) return 'R$ 0,00'
-  return `R$ ${Number(value).toFixed(2).replace('.', ',')}`
-}
-
 const getStatusColor = (status) => {
   const colors = {
     pending: 'warning',

+ 2 - 0
src/pages/schedule/SchedulesPage.vue

@@ -1,9 +1,11 @@
 <template>
   <q-page class="q-pa-md">
+    <DefaultHeaderPage />
     <SchedulesPanel />
   </q-page>
 </template>
 
 <script setup>
 import SchedulesPanel from './components/SchedulesPanel.vue'
+import DefaultHeaderPage from 'src/components/layout/DefaultHeaderPage.vue'
 </script>

+ 10 - 8
src/pages/schedule/components/SchedulesPanel.vue

@@ -33,7 +33,7 @@
 
     <template #body-cell-total_amount="template_props">
       <q-td :props="template_props">
-        {{ formatCurrency(template_props.row.total_amount) }}
+        {{ formatToBRLCurrency(template_props.row.total_amount) }}
       </q-td>
     </template>
   </DefaultTable>
@@ -47,6 +47,7 @@ import { getSchedules, deleteSchedule } from 'src/api/schedule'
 import DefaultTable from 'src/components/defaults/DefaultTable.vue'
 import AddEditScheduleDialog from './AddEditScheduleDialog.vue'
 import { format, parseISO } from 'date-fns'
+import { formatToBRLCurrency } from 'src/helpers/utils'
 
 const { t } = useI18n()
 const $q = useQuasar()
@@ -54,6 +55,13 @@ const tableRef = ref(null)
 const loading = ref(false)
 
 const columns = computed(() => [
+  {
+    name: "id",
+    label: "ID",
+    align: "left",
+    field: "id",
+    sortable: true
+  },
   {
     name: 'client_name',
     label: t('schedules.client'),
@@ -94,6 +102,7 @@ const columns = computed(() => [
     name: 'total_amount',
     label: t('schedules.total_amount'),
     align: 'right',
+    format: (val) => val ? formatToBRLCurrency(val) : '',
     field: 'total_amount',
     sortable: true
   },
@@ -118,13 +127,6 @@ const getStatusColor = (status) => {
   return colors[status] || 'grey'
 }
 
-const formatCurrency = (value) => {
-  return new Intl.NumberFormat('pt-BR', {
-    style: 'currency',
-    currency: 'BRL'
-  }).format(value)
-}
-
 const onAddItem = () => {
   $q.dialog({
     component: AddEditScheduleDialog,

+ 2 - 6
src/pages/schedule/components/ViewScheduleDialog.vue

@@ -43,7 +43,7 @@
           <div class="col-12 col-md-6">
             <div class="text-caption text-grey-7">{{ $t('schedules.total_amount') }}</div>
             <div class="text-body1 text-weight-bold text-positive">
-              {{ formatCurrency(schedule?.total_amount) }}
+              {{ formatToBRLCurrency(schedule?.total_amount) }}
             </div>
           </div>
 
@@ -129,6 +129,7 @@ import { useDialogPluginComponent, useQuasar } from 'quasar'
 import { verifyScheduleCode } from 'src/api/customSchedule'
 import { useI18n } from 'vue-i18n'
 import DefaultDialogHeader from 'src/components/defaults/DefaultDialogHeader.vue'
+import { formatToBRLCurrency } from 'src/helpers/utils'
 
 const props = defineProps({
   schedule: {
@@ -154,11 +155,6 @@ const $q = useQuasar()
 const { t } = useI18n()
 const { dialogRef, onDialogHide, onDialogCancel, onDialogOK } = useDialogPluginComponent()
 
-const formatCurrency = (value) => {
-  if (!value) return 'R$ 0,00'
-  return `R$ ${Number(value).toFixed(2).replace('.', ',')}`
-}
-
 const formatAddress = (address) => {
   if (!address) return 'N/A'
   const parts = [

+ 1 - 1
src/router/routes/customSchedules.route.js

@@ -2,7 +2,7 @@ export default [
   {
     path: 'custom-schedules',
     name: 'CustomSchedulesPage',
-    component: () => import('src/pages/opportunity/CustomSchedulesPage.vue'),
+    component: () => import('pages/opportunity/CustomSchedulesPage.vue'),
     meta: {
       title: 'opportunities.title',
       requireAuth: true,

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است