ui: add B2B olmayan stok (orphans) page

This commit is contained in:
M_Kececi
2026-07-02 15:33:49 +03:00
parent 810c0e5eff
commit cbb853d433
19 changed files with 3365 additions and 395 deletions
+80 -23
View File
@@ -87,26 +87,52 @@
<q-menu class="npc-filter-menu" fit>
<div class="npc-filter-menu-content">
<div class="text-caption text-weight-bold q-mb-sm">{{ props.col.label }}</div>
<q-input
v-model="getColumnFilter(props.col.name).text"
dense
outlined
clearable
label="Icerir"
/>
<q-select
v-model="getColumnFilter(props.col.name).selected"
class="q-mt-sm"
dense
outlined
multiple
use-chips
use-input
emit-value
map-options
:options="getColumnDistinctOptions(props.col.name)"
label="Deger Sec"
/>
<template v-if="isNumericColumn(props.col.name)">
<div class="row q-col-gutter-sm">
<div class="col-6">
<q-input
v-model="getColumnFilter(props.col.name).min"
dense
outlined
clearable
inputmode="decimal"
label="Min"
/>
</div>
<div class="col-6">
<q-input
v-model="getColumnFilter(props.col.name).max"
dense
outlined
clearable
inputmode="decimal"
label="Max"
/>
</div>
</div>
</template>
<template v-else>
<q-input
v-model="getColumnFilter(props.col.name).text"
dense
outlined
clearable
label="Icerir"
/>
<q-select
v-model="getColumnFilter(props.col.name).selected"
class="q-mt-sm"
dense
outlined
multiple
use-chips
use-input
emit-value
map-options
:options="getColumnDistinctOptions(props.col.name)"
label="Deger Sec"
/>
</template>
<div class="row justify-end q-gutter-sm q-mt-sm">
<q-btn dense flat color="grey-7" label="Temizle" @click="clearColumnFilter(props.col.name)" />
</div>
@@ -241,12 +267,29 @@ function getColumnFilter (name) {
if (!columnFilters[name]) {
columnFilters[name] = {
text: '',
selected: []
selected: [],
min: '',
max: ''
}
}
return columnFilters[name]
}
function isNumericColumn (name) {
return name === 'lMMiktar_G'
}
function parseNumberFilter (value) {
const raw = String(value ?? '').trim()
if (!raw) return null
const normalized = raw
.replace(/\s/g, '')
.replace(/\./g, '')
.replace(',', '.')
const n = Number(normalized)
return Number.isFinite(n) ? n : null
}
function formatDateTR (value) {
const s = String(value || '').trim()
if (!s) return ''
@@ -264,10 +307,19 @@ const rows = computed(() => {
const cf = getColumnFilter(col.name)
const text = String(cf.text || '').trim().toLowerCase()
const selected = Array.isArray(cf.selected) ? cf.selected : []
const min = parseNumberFilter(cf.min)
const max = parseNumberFilter(cf.max)
if (!text && selected.length === 0) continue
if (!text && selected.length === 0 && min === null && max === null) continue
result = result.filter((row) => {
if (isNumericColumn(col.name)) {
const numericValue = Number(row?.[col.name] || 0)
if (min !== null && numericValue < min) return false
if (max !== null && numericValue > max) return false
return true
}
const value = getColumnComparableValue(row, col.name)
const valueLC = value.toLowerCase()
@@ -310,13 +362,18 @@ function getColumnDistinctOptions (colName) {
function isColumnFilterActive (name) {
const cf = getColumnFilter(name)
return !!String(cf.text || '').trim() || (Array.isArray(cf.selected) && cf.selected.length > 0)
return !!String(cf.text || '').trim() ||
(Array.isArray(cf.selected) && cf.selected.length > 0) ||
parseNumberFilter(cf.min) !== null ||
parseNumberFilter(cf.max) !== null
}
function clearColumnFilter (name) {
const cf = getColumnFilter(name)
cf.text = ''
cf.selected = []
cf.min = ''
cf.max = ''
}
function clearAllColumnFilters () {