Jelajahi Sumber

feat(unit): adiciona criacao da partners junto com unidade

ebagabee 2 minggu lalu
induk
melakukan
798976328a

+ 4 - 2
src/components/shared/PartnerCardComponent.vue

@@ -1,6 +1,9 @@
 <template>
   <div class="partner-card column items-center q-pa-md cursor-pointer" @click="emit('click')">
-    <div class="partner-avatar flex flex-center q-mb-md">
+    <div
+      class="partner-avatar flex flex-center q-mb-md"
+      :style="partner.avatar_url ? {} : { backgroundColor: '#ff8340' }"
+    >
       <img
         v-if="partner.avatar_url"
         :src="partner.avatar_url"
@@ -75,7 +78,6 @@ const initials = computed(() => {
   width: 80px;
   height: 80px;
   border-radius: 50%;
-  background-color: #ff8340;
   overflow: hidden;
   flex-shrink: 0;
 }

+ 14 - 6
src/pages/unit/UnitActionPage.vue

@@ -4,12 +4,18 @@
 
     <CustomTabComponent v-model:active-tab="activeTab" :tabs />
 
-    <UnitDataTab v-if="activeTab === 'unit_data'" :unit-id="unitId" />
-    <PartnersTab v-if="activeTab === 'partners'" :unit-id="unitId" />
-    <ContractsTab v-if="activeTab === 'contracts'" />
-    <FinancialTab v-if="activeTab === 'financial'" />
-    <HistoryTab v-if="activeTab === 'history'" />
-    <MediasTab v-if="activeTab === 'medias'" />
+    <UnitDataTab v-show="activeTab === 'unit_data'" :unit-id="unitId" :pending-partners="pendingPartners" />
+    <PartnersTab
+      v-show="activeTab === 'partners'"
+      :unit-id="unitId"
+      :pending-partners="pendingPartners"
+      @add-partner="pendingPartners.push($event)"
+      @remove-partner="pendingPartners.splice($event, 1)"
+    />
+    <ContractsTab v-show="activeTab === 'contracts'" />
+    <FinancialTab v-show="activeTab === 'financial'" />
+    <HistoryTab v-show="activeTab === 'history'" />
+    <MediasTab v-show="activeTab === 'medias'" />
   </div>
 </template>
 
@@ -28,6 +34,8 @@ import { useRoute } from "vue-router";
 const route = useRoute();
 const unitId = route.params.id ? Number(route.params.id) : null;
 
+const pendingPartners = ref([]);
+
 const activeTab = ref("unit_data");
 
 const tabs = ref([

+ 11 - 2
src/pages/unit/components/AddEditPartnerDialog.vue

@@ -190,14 +190,18 @@ import CitySelect from "src/components/selects/CitySelect.vue";
 
 defineEmits([...useDialogPluginComponent.emits]);
 
-const { partner, unitId } = defineProps({
+const { partner, unitId, offlineMode } = defineProps({
   partner: {
     type: Object,
     default: null,
   },
   unitId: {
     type: Number,
-    required: true,
+    default: null,
+  },
+  offlineMode: {
+    type: Boolean,
+    default: false,
   },
 });
 
@@ -267,6 +271,11 @@ const { loading, execute } = useSubmitHandler({
 });
 
 async function onOKClick() {
+  if (offlineMode) {
+    onDialogOK({ ...form });
+    return;
+  }
+
   await execute(() => {
     const formData = getFormAsFormData();
 

+ 85 - 25
src/pages/unit/tabs/PartnersTab.vue

@@ -5,8 +5,7 @@
         icon="add"
         color="primary-2"
         style="height: 40px; width: 40px"
-        :disable="!unitId"
-        @click="openDialog(null)"
+        @click="onAddClick"
       />
     </div>
 
@@ -15,31 +14,63 @@
     </div>
 
     <template v-else>
-      <div v-if="partners.length === 0" class="text-center text-grey-6 q-pa-xl">
-        Nenhum sócio cadastrado para esta unidade.
-      </div>
-
-      <div v-else class="row q-col-gutter-md">
-        <div v-for="partner in partners" :key="partner.id" class="col-xs-12 col-sm-6 col-md-3">
-          <div class="relative-position">
-            <PartnerCardComponent :partner @click="openDialog(partner)" />
-
-            <q-btn
-              round
-              unelevated
-              size="xs"
-              icon="delete"
-              color="negative"
-              text-color="white"
-              class="absolute"
-              style="top: 8px; right: 8px"
-              @click.stop="confirmDelete(partner)"
-            >
-              <q-tooltip>Remover sócio</q-tooltip>
-            </q-btn>
+      <!-- Modo criação: lista de sócios pendentes -->
+      <template v-if="!unitId">
+        <div v-if="pendingPartners.length === 0" class="text-center text-grey-6 q-pa-xl">
+          Nenhum sócio adicionado. Os sócios serão criados junto com a unidade.
+        </div>
+
+        <div v-else class="row q-col-gutter-md">
+          <div v-for="(partner, index) in pendingPartners" :key="index" class="col-xs-12 col-sm-6 col-md-3">
+            <div class="relative-position">
+              <PartnerCardComponent :partner @click="onPendingClick(partner, index)" />
+
+              <q-btn
+                round
+                unelevated
+                size="xs"
+                icon="delete"
+                color="negative"
+                text-color="white"
+                class="absolute"
+                style="top: 8px; right: 8px"
+                @click.stop="emit('remove-partner', index)"
+              >
+                <q-tooltip>Remover sócio</q-tooltip>
+              </q-btn>
+            </div>
+          </div>
+        </div>
+      </template>
+
+      <!-- Modo edição: sócios salvos -->
+      <template v-else>
+        <div v-if="partners.length === 0" class="text-center text-grey-6 q-pa-xl">
+          Nenhum sócio cadastrado para esta unidade.
+        </div>
+
+        <div v-else class="row q-col-gutter-md">
+          <div v-for="partner in partners" :key="partner.id" class="col-xs-12 col-sm-6 col-md-3">
+            <div class="relative-position">
+              <PartnerCardComponent :partner @click="openDialog(partner)" />
+
+              <q-btn
+                round
+                unelevated
+                size="xs"
+                icon="delete"
+                color="negative"
+                text-color="white"
+                class="absolute"
+                style="top: 8px; right: 8px"
+                @click.stop="confirmDelete(partner)"
+              >
+                <q-tooltip>Remover sócio</q-tooltip>
+              </q-btn>
+            </div>
           </div>
         </div>
-      </div>
+      </template>
     </template>
   </div>
 </template>
@@ -56,8 +87,14 @@ const props = defineProps({
     type: Number,
     default: null,
   },
+  pendingPartners: {
+    type: Array,
+    default: () => [],
+  },
 });
 
+const emit = defineEmits(["add-partner", "remove-partner"]);
+
 const $q = useQuasar();
 const partners = ref([]);
 const loading = ref(false);
@@ -74,6 +111,29 @@ async function fetchPartners() {
   }
 }
 
+function onAddClick() {
+  if (props.unitId) {
+    openDialog(null);
+  } else {
+    $q.dialog({
+      component: AddEditPartnerDialog,
+      componentProps: { offlineMode: true },
+    }).onOk((partnerData) => {
+      emit("add-partner", partnerData);
+    });
+  }
+}
+
+function onPendingClick(partner, index) {
+  $q.dialog({
+    component: AddEditPartnerDialog,
+    componentProps: { partner, offlineMode: true },
+  }).onOk((updatedData) => {
+    emit("remove-partner", index);
+    emit("add-partner", updatedData);
+  });
+}
+
 function openDialog(partner) {
   $q.dialog({
     component: AddEditPartnerDialog,

+ 12 - 0
src/pages/unit/tabs/UnitDataTab.vue

@@ -174,6 +174,10 @@ const props = defineProps({
     type: Number,
     default: null,
   },
+  pendingPartners: {
+    type: Array,
+    default: () => [],
+  },
 });
 
 const router = useRouter();
@@ -272,6 +276,14 @@ async function onSave() {
       return updateUnit(props.unitId, formData);
     }
 
+    props.pendingPartners.forEach((partner, index) => {
+      Object.entries(partner).forEach(([key, value]) => {
+        if (value != null) {
+          formData.append(`partners[${index}][${key}]`, value);
+        }
+      });
+    });
+
     return createUnit(formData);
   });
 }