Merge remote-tracking branch 'origin/master'

This commit is contained in:
M_Kececi
2026-03-16 00:00:02 +03:00
parent 2a46b2942d
commit 7889ab0f07
2 changed files with 212 additions and 68 deletions

View File

@@ -249,21 +249,6 @@
<q-separator />
<q-card-section class="q-pt-md">
<div class="product-card-stock">
<div class="text-subtitle1 text-weight-bold">
{{ productCardData.productCode || '-' }} / {{ productCardData.colorCode || '-' }}{{ productCardData.secondColor ? '-' + productCardData.secondColor : '' }}
</div>
<div class="text-caption">Toplam Stok: {{ formatNumber(productCardData.totalQty || 0) }}</div>
<div class="stock-size-grid q-mt-sm">
<div v-for="sz in sizeLabels" :key="'dlg-sz-' + sz" class="stock-size-chip">
<span class="label">{{ sz }}</span>
<span class="value">{{ Number(productCardData.sizeTotals?.[sz] || 0) > 0 ? formatNumber(productCardData.sizeTotals[sz]) : '-' }}</span>
</div>
</div>
</div>
<q-separator class="q-my-md" />
<div class="product-card-content">
<div class="product-card-images">
<q-carousel
@@ -293,6 +278,7 @@
</div>
<div class="product-card-fields">
<div class="field-row field-row-head"><span class="k">Urun</span><span class="v">{{ productCardData.productCode || '-' }} / {{ productCardData.colorCode || '-' }}{{ productCardData.secondColor ? '-' + productCardData.secondColor : '' }}</span></div>
<div class="field-row"><span class="k">Urun Kodu</span><span class="v">{{ productCardData.productCode || '-' }}</span></div>
<div class="field-row"><span class="k">Urun Renk</span><span class="v">{{ productCardData.colorCode || '-' }}</span></div>
<div class="field-row"><span class="k">Urun 2.Renk</span><span class="v">{{ productCardData.secondColor || '-' }}</span></div>
@@ -304,6 +290,17 @@
<div class="field-row"><span class="k">Drop</span><span class="v">{{ productCardData.drop || '-' }}</span></div>
<div class="field-row"><span class="k">Kumas</span><span class="v">{{ productCardData.kumas || '-' }}</span></div>
<div class="field-row"><span class="k">Karisim</span><span class="v">{{ productCardData.karisim || '-' }}</span></div>
<div class="product-card-stock-inline q-mt-md">
<div class="text-subtitle2 text-weight-bold">Stok Ozet</div>
<div class="text-caption">Toplam Stok: {{ formatNumber(productCardData.totalQty || 0) }}</div>
<div class="stock-size-grid q-mt-sm">
<div v-for="sz in sizeLabels" :key="'dlg-sz-' + sz" class="stock-size-chip">
<span class="label">{{ sz }}</span>
<span class="value">{{ Number(productCardData.sizeTotals?.[sz] || 0) > 0 ? formatNumber(productCardData.sizeTotals[sz]) : '-' }}</span>
</div>
</div>
</div>
</div>
</div>
</q-card-section>
@@ -465,6 +462,34 @@ function parseNumber(value) {
return Number.isFinite(n) ? n : 0
}
function firstText(...values) {
for (const value of values) {
const s = String(value || '').trim()
if (s) return s
}
return ''
}
function resolveKumasValue(item) {
return firstText(
item?.BIRINCI_PARCA_KUMAS,
item?.ProductAtt26Desc,
item?.PRODUCTATT26DESC,
item?.ProductAtt29Desc,
item?.PRODUCTATT29DESC
)
}
function resolveKarisimValue(item) {
return firstText(
item?.BIRINCI_PARCA_KARISIM,
item?.ProductAtt29Desc,
item?.PRODUCTATT29DESC,
item?.ProductAtt26Desc,
item?.PRODUCTATT26DESC
)
}
function sortByColorCodeAsc(a, b) {
const compareCodeLike = (va, vb) => {
const sa = String(va || '').trim()
@@ -665,7 +690,7 @@ function getProductImageUrl(code, color, secondColor = '', dim1Id = '', dim3Id =
async function onProductImageError(code, color, secondColor = '', dim1Id = '', dim3Id = '') {
const key = buildImageKey(code, color, secondColor, dim1Id, dim3Id)
productImageCache.value[key] = ''
productImageCache.value[key] = String(productImageFallbackByKey.value[key] || '').trim()
}
async function ensureProductImage(code, color, secondColor = '', dim1Id = '', dim3Id = '') {
@@ -722,8 +747,9 @@ async function ensureProductImage(code, color, secondColor = '', dim1Id = '', di
const first = list[0] || null
const resolved = resolveProductImageUrl(first)
productImageCache.value[key] = resolved.fullUrl || resolved.publicUrl || resolved.thumbUrl || resolved.contentUrl || ''
productImageFallbackByKey.value[key] = resolved.contentUrl || ''
const preferredCardUrl = first ? await resolveProductImageUrlForCarousel(first) : ''
productImageCache.value[key] = String(preferredCardUrl || resolved.fullUrl || resolved.publicUrl || resolved.thumbUrl || resolved.contentUrl || '').trim()
productImageFallbackByKey.value[key] = resolved.fullUrl || resolved.publicUrl || resolved.contentUrl || ''
} catch (err) {
console.warn('[ProductStockQuery] product image fetch failed', { code, color, err })
productImageCache.value[key] = ''
@@ -855,8 +881,8 @@ const level1Groups = computed(() => {
const urunIcerigi = String(item.URUN_ICERIGI || item.KISA_KAR || '').trim()
const fit = String(item.BIRINCI_PARCA_FIT || '').trim()
const drop = String(item.DR || '').trim()
const kumas = String(item.BIRINCI_PARCA_KUMAS || '').trim()
const karisim = String(item.BIRINCI_PARCA_KARISIM || '').trim()
const kumas = resolveKumasValue(item)
const karisim = resolveKarisimValue(item)
const aciklama = String(item.Madde_Aciklamasi || '').trim()
const beden = normalizeSize(item.Beden || '')
const qty = parseNumber(item.Kullanilabilir_Envanter)
@@ -1618,12 +1644,12 @@ onMounted(() => {
.product-card-dialog {
--pc-media-h: min(70vh, 900px);
--pc-media-w: min(74vw, 1220px);
background: #f6f8fc;
background: #f9f8f5;
}
.product-card-stock {
background: linear-gradient(180deg, #eef3fb 0%, #f8fbff 100%);
border: 1px solid #c8d6ec;
background: linear-gradient(180deg, #f9f6ef 0%, #fffdf9 100%);
border: 1px solid #e4dac7;
border-radius: 12px;
padding: 14px;
}
@@ -1635,7 +1661,7 @@ onMounted(() => {
}
.stock-size-chip {
border: 1px solid #d7e2f2;
border: 1px solid #e6dccb;
border-radius: 10px;
background: #ffffff;
padding: 6px 8px;
@@ -1669,8 +1695,8 @@ onMounted(() => {
.product-card-carousel {
width: var(--pc-media-w);
max-width: 100%;
background: linear-gradient(180deg, #edf2fb 0%, #e4ebf9 100%);
border: 1px solid #c8d6ec;
background: linear-gradient(180deg, #f6f1e6 0%, #efe6d3 100%);
border: 1px solid #e4dac7;
}
.dialog-image {
@@ -1684,7 +1710,7 @@ onMounted(() => {
height: var(--pc-media-h);
overflow: hidden;
border-radius: 10px;
background: linear-gradient(180deg, #edf2fb 0%, #e4ebf9 100%);
background: linear-gradient(180deg, #f6f1e6 0%, #efe6d3 100%);
display: flex;
align-items: center;
justify-content: center;
@@ -1694,12 +1720,12 @@ onMounted(() => {
width: var(--pc-media-w);
max-width: 100%;
height: var(--pc-media-h);
border: 1px dashed #9db5de;
border: 1px dashed #c5b28d;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
background: #f2f6fd;
background: #faf6ee;
}
.image-fullscreen-dialog {
@@ -1717,11 +1743,44 @@ onMounted(() => {
width: min(98vw, 1500px);
}
:deep(.image-fullscreen-carousel .q-carousel__slide) {
background: linear-gradient(180deg, #f7f2e7 0%, #efe5d2 100%);
}
:deep(.image-fullscreen-carousel .q-carousel__navigation) {
bottom: 12px;
}
:deep(.image-fullscreen-carousel .q-carousel__navigation .q-btn) {
color: rgba(38, 166, 154, 0.42);
transform: scale(1);
transition: transform 0.14s ease, color 0.14s ease;
}
:deep(.image-fullscreen-carousel .q-carousel__navigation .q-btn--active) {
color: var(--q-primary, #1976d2);
transform: scale(1.28);
text-shadow: 0 0 0.5px currentColor;
filter: drop-shadow(0 0 2px rgba(38, 166, 154, 0.45));
}
:deep(.image-fullscreen-carousel .q-carousel__arrow .q-btn) {
color: var(--q-primary, #1976d2);
background: rgba(255, 255, 255, 0.88);
border: 1px solid #d7e2f3;
}
:deep(.image-fullscreen-carousel .q-carousel__arrow .q-btn:hover) {
color: var(--q-secondary, #26a69a);
border-color: rgba(38, 166, 154, 0.45);
background: rgba(255, 255, 255, 0.98);
}
.image-fullscreen-stage {
width: min(96vw, 1400px);
height: calc(100vh - 120px);
border-radius: 10px;
background: #efe7cc;
background: linear-gradient(180deg, #f1e7d3 0%, #e9dcc4 100%);
overflow: hidden;
display: flex;
align-items: center;
@@ -1736,9 +1795,9 @@ onMounted(() => {
.product-card-fields {
grid-column: 1;
grid-row: 1;
border: 1px solid #c8d6ec;
border: 1px solid #e4dac7;
border-radius: 12px;
background: linear-gradient(180deg, #ffffff 0%, #f7faff 100%);
background: linear-gradient(180deg, #ffffff 0%, #fdfaf4 100%);
padding: 12px;
height: var(--pc-media-h);
overflow: auto;
@@ -1749,16 +1808,24 @@ onMounted(() => {
grid-template-columns: 150px 1fr;
gap: 8px;
padding: 8px 0;
border-bottom: 1px solid #e4ebf7;
border-bottom: 1px solid #efe5d5;
font-size: 13px;
}
.field-row.field-row-head {
background: #f8f3e9;
border: 1px solid #e6dccb;
border-radius: 8px;
padding: 8px 10px;
margin-bottom: 8px;
}
.field-row:last-child {
border-bottom: none;
}
.field-row .k {
color: var(--q-primary, #1976d2);
color: #6b5a33;
font-weight: 700;
}
@@ -1767,6 +1834,11 @@ onMounted(() => {
word-break: break-word;
}
.product-card-stock-inline {
border-top: 1px solid #e6dccb;
padding-top: 10px;
}
.q-btn,
.q-icon,
.product-image-card,