improve bazdid 2

This commit is contained in:
javad committed 2026-10-21 11:28:01 +03:30
1 parent 534a84f977
commit f8d768a724
6 files changed
+374 -92

No files matched your search

+94 -30
View File
@@ -11,29 +11,55 @@
@media (min-width: 769px) { .ez-wrap { padding: 1rem 1.25rem; } }
/* ---------- نوار آمار ---------- */
.ez-stats-head { margin: 0 0 .55rem; }
.ez-stats-title { font-size: .92rem; font-weight: 800; color: #0f172a; margin: 0; }
.ez-stats-hint {
font-size: .72rem; color: #64748b; margin: .2rem 0 0; line-height: 1.7;
}
.ez-stats-hint b { color: #334155; }
.ez-stats {
display: grid; grid-auto-flow: column; grid-auto-columns: minmax(8.5rem, 1fr);
gap: .5rem; overflow-x: auto; padding-bottom: .25rem;
display: grid; grid-auto-flow: column; grid-auto-columns: minmax(11rem, 1fr);
gap: .5rem; overflow-x: auto; padding-bottom: .35rem;
-webkit-overflow-scrolling: touch;
}
@media (min-width: 1024px) {
.ez-stats { grid-auto-flow: row; grid-template-columns: repeat(5, 1fr); overflow: visible; }
}
.ez-stat {
display: block; border: 1px solid #e2e8f0; border-radius: .625rem;
background: #fff; padding: .55rem .7rem; text-decoration: none; color: #334155;
transition: border-color .15s ease, background-color .15s ease;
display: flex; flex-direction: column; gap: .18rem;
border: 1px solid #e2e8f0; border-radius: .625rem; background: #fff;
padding: .55rem .65rem .6rem; text-decoration: none; color: #334155;
border-top: 3px solid #cbd5e1;
transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
}
.ez-stat:hover { border-color: #94a3b8; box-shadow: 0 1px 6px rgba(15, 23, 42, .08); }
/* نوار رنگی بالای هر کارت = همان رنگ برچسب وضعیت در جدول */
.ez-stat.total { border-top-color: #64748b; }
.ez-stat.danger { border-top-color: #dc2626; }
.ez-stat.success { border-top-color: #16a34a; }
.ez-stat.warning { border-top-color: #d97706; }
.ez-stat.link { border-top-color: #0284c7; }
.ez-stat-top {
display: flex; align-items: baseline; justify-content: space-between; gap: .4rem;
}
.ez-stat .ez-lbl {
font-size: .74rem; font-weight: 700; color: #334155; line-height: 1.35;
}
.ez-stat:hover { border-color: #94a3b8; }
.ez-stat .ez-num {
display: block; font-size: 1.2rem; font-weight: 800; line-height: 1.1;
font-variant-numeric: tabular-nums;
font-size: 1.25rem; font-weight: 800; line-height: 1.1;
font-variant-numeric: tabular-nums; flex: 0 0 auto;
}
.ez-stat .ez-desc {
font-size: .68rem; color: #7c8798; line-height: 1.6;
}
.ez-stat .ez-lbl { display: block; margin-top: .15rem; font-size: .7rem; color: #64748b; }
.ez-stat.is-active {
border-color: #33b5d3; background: #f1fbff; box-shadow: inset 0 -3px 0 #33b5d3;
border-color: #33b5d3; background: #f1fbff;
box-shadow: inset 0 -3px 0 #33b5d3, 0 1px 6px rgba(51, 181, 211, .18);
}
.ez-stat.is-active .ez-lbl { color: #0e7490; font-weight: 700; }
.ez-stat.is-active .ez-lbl { color: #0e7490; }
.ez-stat.is-active .ez-desc { color: #0e7490; }
/* ---------- تفکیک تأخیر ---------- */
.ez-legend {
@@ -169,40 +195,78 @@
<div class="columns m-0">
<div class="column is-12 p-0">
{# ===== نوار آمار: هر عدد لینک فیلتر ===== #}
<div class="ez-stats-head">
<p class="ez-stats-title">وضعیت مشتریانِ عقب‌افتاده</p>
<p class="ez-stats-hint">
«عقب‌افتاده» یعنی از آخرین بازدید
<b>بیش از {{ counts.period_months }} ماه</b> گذشته باشد.
روی هر کارت بزنید تا فقط همان گروه نمایش داده شود؛
<b>کل = بدون قرار + با قرار</b>.
{% if counts.both %}
({{ counts.both }} مشتری هم قرار هماهنگی دارند و هم بازدید
برنامه‌ریزی‌شده، پس در هر دو کارت شمرده می‌شوند.)
{% endif %}
</p>
</div>
<div class="ez-stats">
<a href="?view=all&sort={{ sort }}{% if searchVal %}&searchVal={{ searchVal }}&searchOn={{ searchOn }}{% endif %}"
class="ez-stat {% if view == 'all' %}is-active{% endif %}">
<span class="ez-num">{{ counts.total }}</span>
<span class="ez-lbl">کل معوق</span>
class="ez-stat total {% if view == 'all' %}is-active{% endif %}"
title="همهٔ مشتریان عقب‌افتاده، با هر وضعیت قرار">
<span class="ez-stat-top">
<span class="ez-lbl">کل عقب‌افتاده‌ها</span>
<span class="ez-num">{{ counts.total }}</span>
</span>
<span class="ez-desc">همه، فارغ از داشتن یا نداشتن قرار</span>
</a>
<a href="?view=uncoordinated&sort={{ sort }}{% if searchVal %}&searchVal={{ searchVal }}&searchOn={{ searchOn }}{% endif %}"
class="ez-stat {% if view == 'uncoordinated' %}is-active{% endif %}">
<span class="ez-num has-text-danger">{{ counts.uncoordinated }}</span>
<span class="ez-lbl">بدون قرار</span>
class="ez-stat danger {% if view == 'uncoordinated' %}is-active{% endif %}"
title="مشتریانی که هنوز هیچ قرار بعدی برایشان ثبت نشده است">
<span class="ez-stat-top">
<span class="ez-lbl">بدون قرار</span>
<span class="ez-num has-text-danger">{{ counts.uncoordinated }}</span>
</span>
<span class="ez-desc">هنوز وقت بازدید تعیین نشده — نیاز به تماس</span>
</a>
<a href="?view=coordinated&sort={{ sort }}{% if searchVal %}&searchVal={{ searchVal }}&searchOn={{ searchOn }}{% endif %}"
class="ez-stat {% if view == 'coordinated' %}is-active{% endif %}">
<span class="ez-num has-text-success">{{ counts.coordinated }}</span>
<span class="ez-lbl">با قرار</span>
class="ez-stat success {% if view == 'coordinated' %}is-active{% endif %}"
title="مشتریانی که وقت بازدید بعدی برایشان مشخص شده است">
<span class="ez-stat-top">
<span class="ez-lbl">با قرار</span>
<span class="ez-num has-text-success">{{ counts.coordinated }}</span>
</span>
<span class="ez-desc">وقت بازدیدشان مشخص است (هر دو نوع قرار)</span>
</a>
<a href="?view=manual&sort={{ sort }}{% if searchVal %}&searchVal={{ searchVal }}&searchOn={{ searchOn }}{% endif %}"
class="ez-stat {% if view == 'manual' %}is-active{% endif %}">
<span class="ez-num has-text-warning-dark">{{ counts.manual }}</span>
<span class="ez-lbl">قرار هماهنگی</span>
class="ez-stat warning {% if view == 'manual' %}is-active{% endif %}"
title="قرار تعویق که از فرم «هماهنگی» ثبت شده است">
<span class="ez-stat-top">
<span class="ez-lbl">قرار هماهنگی</span>
<span class="ez-num has-text-warning-dark">{{ counts.manual }}</span>
</span>
<span class="ez-desc">تعویق دستی از فرم هماهنگی (مثلاً «ماه بعد زنگ بزنید»)</span>
</a>
<a href="?view=scheduled&sort={{ sort }}{% if searchVal %}&searchVal={{ searchVal }}&searchOn={{ searchOn }}{% endif %}"
class="ez-stat {% if view == 'scheduled' %}is-active{% endif %}">
<span class="ez-num has-text-link">{{ counts.scheduled }}</span>
<span class="ez-lbl">بازدید برنامه‌ریزی‌شده</span>
class="ez-stat link {% if view == 'scheduled' %}is-active{% endif %}"
title="اقدام «بازدید» با تاریخ آینده">
<span class="ez-stat-top">
<span class="ez-lbl">بازدید برنامه‌ریزی‌شده</span>
<span class="ez-num has-text-link">{{ counts.scheduled }}</span>
</span>
<span class="ez-desc">اقدام «بازدید» با تاریخ آینده ثبت شده است</span>
</a>
</div>
{# تفکیک مدت تأخیر در نمای جاری #}
<div class="ez-legend">
<span>تأخیر:</span>
<span><b>{{ counts.buckets.lt30 }}</b> زیر ۳۰ روز</span>
<span><b>{{ counts.buckets.30to90 }}</b> ۳۰–۹۰ روز</span>
<span><b>{{ counts.buckets.90to180 }}</b> ۹۰–۱۸۰ روز</span>
<span>میزان تأخیر در همین نما:</span>
<span><b>{{ counts.buckets.lt30 }}</b> تا ۳۰ روز</span>
<span><b>{{ counts.buckets.30to90 }}</b> ۳۰ تا ۹۰ روز</span>
<span><b>{{ counts.buckets.90to180 }}</b> ۹۰ تا ۱۸۰ روز</span>
<span><b>{{ counts.buckets.gt180 }}</b> بیش از ۶ ماه</span>
</div>