Merge remote-tracking branch 'origin/master'

This commit is contained in:
M_Kececi
2026-02-20 08:49:31 +03:00
parent 1ced1b1649
commit f6b9793c41
11 changed files with 292 additions and 58 deletions

View File

@@ -1,4 +1,4 @@
<template>
<template>
<!-- ===========================================================
🧾 ORDER ENTRY PAGE (BSSApp)
v23 Sticky-stack + Drawer uyumlu yapı
@@ -8,14 +8,15 @@
class="order-page"
>
<!-- 🔄 SAYFA LOADERI -->
<q-inner-loading :showing="loadingHeader || loadingCari || loadingModels" color="primary">
<q-inner-loading :showing="isPageBlocking" color="primary">
<q-spinner size="50px" />
</q-inner-loading>
<!-- =======================================================
🔹 STICKY STACK (Filter + Save + Header)
======================================================== -->
<div class="sticky-stack">
<template v-if="!isPageBlocking">
<!-- =======================================================
🔹 STICKY STACK (Filter + Save + Header)
======================================================== -->
<div class="sticky-stack">
<!-- 🔸 1. Satır: Filtre Bar -->
<div class="filter-bar row q-col-gutter-md q-mb-sm">
@@ -168,8 +169,22 @@
</template>
</div>
</div>
<!-- 📝 Sipariş Genel Açıklaması (filter bar altında) -->
<div class="filter-bar-desc q-mt-sm">
<q-input
v-model="form.Description"
type="textarea"
label="Sipariş Genel ıklaması"
filled
dense
autogrow
maxlength="1500"
counter
placeholder="Siparişe genel ıklama giriniz (örn. teslimat, üretim notu, müşteri isteği...)"
:disable="isClosedRow"
:readonly="isViewOnly"
/>
</div>
<!-- 🔹 Cari Bilgi Barı -->
<q-slide-transition>
@@ -212,6 +227,14 @@
<div class="save-toolbar">
<div class="text-subtitle2 text-weight-bold">Sipariş Formu</div>
<div>
<q-btn
flat
color="grey-7"
class="q-ml-sm"
:label="compactGridHeader ? 'BAŞLIK GENİŞLET' : 'BAŞLIK DARALT'"
:icon="compactGridHeader ? 'unfold_more' : 'unfold_less'"
@click="compactGridHeader = !compactGridHeader"
/>
<q-btn
v-if="isViewOnly && canExportOrder"
label="🖨 SİPARİŞİ YAZDIR"
@@ -222,7 +245,16 @@
/>
<q-btn
v-else-if="canSubmitOrder"
v-if="canMutateRows"
label="SATIR EKLE"
color="secondary"
icon="add"
class="q-ml-sm"
@click="openNewRowEditor"
:disable="isClosedRow || isViewOnly || !canMutateRows"
/>
<q-btn
v-if="canSubmitOrder"
:label="isEditMode ? 'TÜMÜNÜ GÜNCELLE' : 'TÜMÜNÜ KAYDET'"
color="primary"
icon="save"
@@ -231,24 +263,15 @@
:disable="!canSubmitOrder"
@click="confirmAndSubmit"
/>
<q-btn
label="YENİ SİPARİŞ"
v-if="canWriteOrder"
color="secondary"
icon="add_circle"
class="q-ml-sm"
@click="onResetEditorClick"
:disable="isClosedRow || !canWriteOrder"
/>
</div>
</div>
<!-- 🔹 Grid Header -->
<div class="order-grid-header">
<div class="order-grid-header" :class="{ compact: compactGridHeader }">
<div class="col-fixed model">MODEL</div>
<div class="col-fixed renk">RENK</div>
<div class="col-fixed ana">ÜRÜN ANA<br />GRUBU</div>
<div class="col-fixed alt">ÜRÜN ALT<br />GRUBU</div>
<div class="col-fixed ana">ÜRÜN ANA GRUBU</div>
<div class="col-fixed alt">ÜRÜN ALT GRUBU</div>
<div class="col-fixed aciklama-col">AÇIKLAMA</div>
<div class="beden-block">
@@ -289,7 +312,7 @@
<!-- =======================================================
🔹 GRID BODY (Final Stabil) + EDITOR aynı scrollda
======================================================== -->
<div class="order-scroll-y"> <!-- ✅ YENİ: Grid + Editor ortak dikey scroll -->
<div class="order-scroll-y" :class="{ 'compact-grid-header': compactGridHeader }"> <!-- ✅ YENİ: Grid + Editor ortak dikey scroll -->
<div class="order-grid-body">
<template v-for="grp in groupedRows" :key="grp.name">
<div :class="['summary-group', grp.open ? 'open' : 'closed']">
@@ -424,7 +447,24 @@
<!-- =======================================================
🔹 SATIR DÜZENLEYİCİ FORM (EDITOR)
======================================================== -->
<div class="editor q-mt-lg q-pa-sm">
<q-dialog
v-model="showEditor"
class="order-editor-dialog"
:maximized="$q.screen.lt.md"
full-width
transition-show="jump-down"
transition-hide="jump-up"
persistent
>
<q-card class="order-editor-card">
<q-card-section class="row items-center justify-between">
<div class="text-subtitle1 text-weight-bold">
{{ isEditing ? 'Satır Düzenle' : 'Yeni Satır' }}
</div>
<q-btn flat round icon="close" @click="showEditor = false" />
</q-card-section>
<q-separator />
<q-card-section class="editor q-pa-sm">
<!-- 🔸 1. Satır: Model ve Ürün Bilgileri -->
<div class="row q-col-gutter-sm q-mb-sm">
@@ -717,28 +757,11 @@
butonuna basarak işlemleri kaydedebilirsiniz.
</div>
<!-- =======================================================
🔹 SİPARİŞ GENEL AÇIKLAMASI
======================================================== -->
<div class="row q-mt-md">
<div class="col-12">
<q-input
v-model="form.Description"
type="textarea"
label="Sipariş Genel ıklaması"
filled
dense
autogrow
maxlength="1500"
counter
placeholder="Siparişe genel ıklama giriniz (örn. teslimat, üretim notu, müşteri isteği...)"
:disable="isClosedRow"
/>
</div>
</div>
</div> <!-- editor -->
</div> <!-- ✅ order-scroll-y -->
</q-card-section>
</q-card>
</q-dialog>
</div> <!-- ✅ order-scroll-y -->
</template>
</q-page>
<q-page
@@ -777,6 +800,8 @@ const canExportOrder = canExport('order')
const formatDate = formatDateDisplay
const showEditor = ref(false)
const compactGridHeader = ref(false)
@@ -1094,6 +1119,16 @@ const seriMultiplier = ref(1)
const loadingHeader = ref(true)
const loadingCari = ref(true)
const loadingModels = ref(true)
const isPageBlocking = computed(() => {
if (!isEditMode.value) return false
const headerReady = !!orderStore.header
return (
loadingHeader.value ||
loadingCari.value ||
loadingModels.value ||
!headerReady
)
})
/* ===========================================================
🔹 CARİ INFO STATE
=========================================================== */
@@ -2346,11 +2381,22 @@ const editRow = async (row) => {
notify: true,
loadSizes: true
})
showEditor.value = true
} catch (err) {
console.error('❌ editRow hata:', err)
}
}
const openNewRowEditor = async () => {
if (!hasRowMutationPermission()) {
notifyNoPermission('Siparis satiri ekleme/guncelleme yetkiniz yok')
return
}
await resetEditor(true)
showEditor.value = true
}
@@ -2765,6 +2811,7 @@ const onSaveOrUpdateRow = async () => {
stockMap,
$q
})
showEditor.value = false
}