improve bazdid 6
This commit is contained in:
1 parent
99c25a8216
commit
fa73a734a0
21 files changed
+32760
-7985
No files matched your search
@@ -318,6 +318,29 @@
|
||||
#ActionBox .ax-warn.is-confirming .ax-warn-actions { display: flex; }
|
||||
#ActionBox .ax-warn:focus { outline: 2px solid #f59e0b; outline-offset: 2px; }
|
||||
|
||||
/* اعلان «تاریخ قرار عقبتر» — کلاس مستقل تا به CSS پنل «انجام شد» وابسته نباشد */
|
||||
#ActionBox .ax-holdback {
|
||||
margin-top: .5rem; padding: .6rem .7rem;
|
||||
border: 1px solid #fcd34d; border-radius: .5rem; background: #fffbeb;
|
||||
color: #92400e; font-size: .78rem; line-height: 1.75;
|
||||
}
|
||||
#ActionBox .ax-holdback.is-blocking {
|
||||
border-color: #f59e0b; box-shadow: 0 0 0 3px #fde68a66; background: #fef3c7;
|
||||
}
|
||||
#ActionBox .ax-holdback .ax-hb-title { font-weight: 800; color: #78350f; margin: 0 0 .15rem; }
|
||||
#ActionBox .ax-holdback .ax-hb-current { margin: 0 0 .4rem; }
|
||||
#ActionBox .ax-holdback .ax-hb-current b { font-weight: 800; }
|
||||
#ActionBox .ax-holdback .ax-hb-alt { margin: 0; }
|
||||
#ActionBox .ax-holdback .ax-hb-check {
|
||||
display: flex; align-items: flex-start; gap: .5rem; margin: 0;
|
||||
padding: .5rem .6rem; border-radius: .45rem; background: #fff;
|
||||
border: 1px solid #fbbf24; cursor: pointer; font-weight: 700; color: #7c2d12;
|
||||
}
|
||||
#ActionBox .ax-holdback .ax-hb-check input {
|
||||
width: 1.05rem; height: 1.05rem; margin-top: .15rem; flex: 0 0 auto;
|
||||
}
|
||||
#ActionBox .ax-holdback:focus { outline: 2px solid #f59e0b; outline-offset: 2px; }
|
||||
|
||||
#ActionBox .ax-help-toggle {
|
||||
display: flex; align-items: center; gap: .45rem; width: 100%;
|
||||
padding: .55rem .7rem; border: 1px solid #bae6fd; border-radius: .5rem;
|
||||
@@ -352,12 +375,15 @@
|
||||
</style>
|
||||
|
||||
{% if customer %}
|
||||
<form id="ActionBox" class="modal" method="post" action="{% url 'admin_panel:customerNewAction' customer.id %}">
|
||||
<form id="ActionBox" class="modal" method="post" action="{% url 'admin_panel:customerNewAction' customer.id %}"
|
||||
data-customer-hold="{% if customer.visit_hold_until %}{{ customer.visit_hold_until|date:'c' }}{% endif %}">
|
||||
{% else %}
|
||||
<form id="ActionBox" class="modal" method="post" action="">
|
||||
{% endif %}
|
||||
|
||||
{% csrf_token %}
|
||||
{# تأیید صریح کاربر برای عقببردن تاریخ قرار؛ فقط با زدن دکمهٔ تأیید پر میشود. #}
|
||||
<input type="hidden" name="force_hold" id="forceHold" value="">
|
||||
<div class="modal-background closeActionBox"></div>
|
||||
<div class="modal-card ax-card">
|
||||
<header class="modal-card-head ax-head">
|
||||
@@ -427,6 +453,20 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# اعلان «تاریخ عقبتر» — عرض کامل، بیرون از شبکهٔ دوستونه #}
|
||||
<div class="ax-holdback is-hidden" id="holdBackwardNotice" tabindex="-1"
|
||||
role="alert" aria-live="polite">
|
||||
<p class="ax-hb-title">این تاریخ از قرار فعلی عقبتر است</p>
|
||||
<p class="ax-hb-current">قرار فعلی: <b id="hbCurrent">—</b></p>
|
||||
<label class="ax-hb-check is-hidden" id="hbForceRow" for="forceHoldCheck">
|
||||
<input type="checkbox" id="forceHoldCheck">
|
||||
<span>تاریخ قرار را عقب ببر</span>
|
||||
</label>
|
||||
<p class="ax-hb-alt is-hidden" id="hbCreateHint">
|
||||
این تاریخ ذخیره نمیشود. برای تغییر قرار، وظیفهٔ هماهنگی فعلی را ویرایش کنید.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{# راهنمای بازشونده — فقط برای هماهنگی #}
|
||||
<div class="ax-help-wrap showWhenCoordination is-hidden" style="margin-top: .6rem;">
|
||||
<button type="button" class="ax-help-toggle" id="holdHelpToggle"
|
||||
@@ -451,11 +491,13 @@
|
||||
|
||||
<h4>نکات مهم</h4>
|
||||
<ul>
|
||||
<li><b>خالی + تیک «انجام شد»</b> ← سیستم خودش ۱۴ روز میگذارد.</li>
|
||||
<li><b>خالی + تیک</b> ← سیستم خودش ۱۴ روز میگذارد.</li>
|
||||
<li><b>خالی + بدون تیک</b> ← هیچ تعویقی ثبت نمیشود؛ مشتری در فهرست میماند.</li>
|
||||
<li><b>فقط تمدید میکند، کوتاه نمیکند:</b> اگر قرار ۲۲ آذر باشد و همکار دیگری ۳۰ آذر بگذارد،
|
||||
قرار به ۳۰ آذر میرود؛ اما ۱۵ آذر نادیده گرفته میشود. برای کوتاهکردن،
|
||||
هماهنگی را حذف و دوباره ثبت کنید.</li>
|
||||
قرار به ۳۰ آذر میرود؛ تاریخهای عقبتر نادیده گرفته میشوند تا قرارِ دورتر از بین نرود.
|
||||
اگر خودتان میخواهید قرار را عقب ببرید، وظیفه را <b>ویرایش</b> کنید و
|
||||
گزینهٔ <b>«تاریخ قرار را عقب ببر»</b> را تیک بزنید
|
||||
(در «ایجاد وظیفهٔ تازه» این گزینه وجود ندارد).</li>
|
||||
<li><b>حذف یا لغو هماهنگی</b> ← قرار بیاثر میشود و مشتری بلافاصله برمیگردد.</li>
|
||||
<li><b>سقف ۶ ماه</b> است؛ بیشتر از آن با پیام خطا رد میشود.</li>
|
||||
<li>این فیلد <b>تاریخ بازدید پرسنل نیست</b> و <b>بازدید حساب نمیشود</b>؛
|
||||
@@ -596,6 +638,7 @@
|
||||
dateTimePickerAnjam.setDate();
|
||||
dateTimePickerFinish.setDate();
|
||||
resetHoldPicker();
|
||||
syncHoldBackward();
|
||||
$(".showWhenCoordination").addClass("is-hidden");
|
||||
closeHoldHelp();
|
||||
$("#sabtBtn05").val("ثبت");
|
||||
@@ -649,8 +692,109 @@
|
||||
$("#checkIsDone").trigger('focus');
|
||||
});
|
||||
|
||||
// ══════════ عقببردن تاریخ قرار ══════════
|
||||
// قاعدهٔ سیستم: تاریخ «تا تاریخ پیگیری نشود» فقط رو به جلو میرود تا قرارِ
|
||||
// دورتری که ثبت شده از بین نرود. در «ویرایش» اگر کاربر خودش بخواهد عقب ببرد،
|
||||
// قرار فعلی را میبیند و با تیک زدن اجازهٔ صریح میدهد. در «ایجادِ» وظیفهٔ تازه
|
||||
// این اجازه داده نمیشود؛ چون کاربر قصد اصلاح قرارِ موجود را ندارد و ممکن است
|
||||
// ناخواسته قولِ ثبتشدهٔ قبلی را کوتاه کند.
|
||||
|
||||
function holdCurrentMs() {
|
||||
var iso = ($("#ActionBox").attr('data-customer-hold') || '').trim();
|
||||
if (!iso) { return null; }
|
||||
var ms = new Date(iso).getTime();
|
||||
return isNaN(ms) ? null : ms;
|
||||
}
|
||||
|
||||
// مقدار پیکر در فیلد مخفی بهصورت timestamp میلیثانیهای است؛ اگر پیکر
|
||||
// تاریخ شمسی متنی گذاشت، همان را هم میپذیریم.
|
||||
function holdTargetMs() {
|
||||
var raw = ($("#visitHoldUntil").val() || '').trim();
|
||||
if (!raw) { return null; }
|
||||
if (/^\d+$/.test(raw)) {
|
||||
var n = parseInt(raw, 10);
|
||||
return isNaN(n) ? null : n;
|
||||
}
|
||||
var parsed = Date.parse(raw.replace(/\//g, '-'));
|
||||
return isNaN(parsed) ? null : parsed;
|
||||
}
|
||||
|
||||
function sameLocalDay(a, b) {
|
||||
var da = new Date(a), db = new Date(b);
|
||||
return da.getFullYear() === db.getFullYear()
|
||||
&& da.getMonth() === db.getMonth()
|
||||
&& da.getDate() === db.getDate();
|
||||
}
|
||||
|
||||
function jalaliDay(ms) {
|
||||
if (ms === null) { return '—'; }
|
||||
try {
|
||||
if (typeof persianDate !== 'undefined') {
|
||||
return new persianDate(ms).format('YYYY/MM/DD');
|
||||
}
|
||||
} catch (err) { /* کتابخانه در دسترس نیست ⇒ تاریخ میلادی */ }
|
||||
var d = new Date(ms);
|
||||
return d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate();
|
||||
}
|
||||
|
||||
// آیا تاریخ انتخابی از قرار فعلی عقبتر است؟ (مستقل از تیک کاربر)
|
||||
function holdIsBackward() {
|
||||
if ($("#actionType").val() !== 'hamahangi') { return false; }
|
||||
var current = holdCurrentMs(), target = holdTargetMs();
|
||||
if (current === null || target === null) { return false; }
|
||||
if (sameLocalDay(current, target)) { return false; }
|
||||
return target < current;
|
||||
}
|
||||
|
||||
// بهروزرسانی اعلان (و اجازهٔ عقببردن فقط در ویرایش) — با هر تغییر تاریخ/نوع.
|
||||
function syncHoldBackward() {
|
||||
var notice = $("#holdBackwardNotice");
|
||||
var needed = holdIsBackward();
|
||||
var canForce = needed && isEditMode;
|
||||
// تیک فقط وقتی معنا دارد که عقببردن مجاز باشد؛ در غیر این صورت پاک میشود.
|
||||
$("#hbForceRow").toggleClass("is-hidden", !canForce);
|
||||
$("#hbCreateHint").toggleClass("is-hidden", !needed || canForce);
|
||||
if (!canForce) {
|
||||
$("#forceHoldCheck").prop('checked', false);
|
||||
$("#forceHold").val('');
|
||||
}
|
||||
if (!needed) {
|
||||
notice.addClass("is-hidden").removeClass("is-blocking");
|
||||
return;
|
||||
}
|
||||
$("#hbCurrent").text(jalaliDay(holdCurrentMs()));
|
||||
notice.removeClass("is-hidden");
|
||||
}
|
||||
|
||||
// تیک «عقب ببر» ⇒ فیلد مخفی force_hold برای سرور.
|
||||
$("#forceHoldCheck").on('change', function() {
|
||||
var checked = $(this).prop('checked');
|
||||
$("#forceHold").val(checked ? '1' : '');
|
||||
$("#holdBackwardNotice").toggleClass("is-blocking", !checked);
|
||||
});
|
||||
|
||||
// هر تغییر تاریخ/نوع اقدام ⇒ وضعیت دوباره محاسبه میشود.
|
||||
$("#ActionBox").on('change input', "#visitHoldUntil, #actionType",
|
||||
function() { syncHoldBackward(); });
|
||||
// پیکر تاریخ هم بعد از انتخاب، فیلد مخفی را پر میکند.
|
||||
$(document).on('change', ".dateTimePickerHoldUntil, .dateTimePickerHoldUntil-alt",
|
||||
function() { syncHoldBackward(); });
|
||||
|
||||
// گرفتن تأیید پیش از ثبتِ هماهنگیِ «انجامشده» (فقط در حالت ایجاد، نه ویرایش).
|
||||
$("#ActionBox").on('submit', function(event) {
|
||||
// (۱) در ویرایش: تاریخ عقبتر از قرار فعلی ⇒ تا تیک تأیید نزده، ارسال نمیشود.
|
||||
// در «ایجاد»، وظیفه ذخیره میشود و فقط تاریخ قرار عقب نمیرود؛ سرور
|
||||
// همین را با پیام روشن به کاربر میگوید، پس ارسال بلاک نمیشود.
|
||||
if (isEditMode && holdIsBackward() && !$("#forceHoldCheck").prop('checked')) {
|
||||
event.preventDefault();
|
||||
var notice = $("#holdBackwardNotice").removeClass("is-hidden").addClass("is-blocking");
|
||||
if (notice[0].scrollIntoView) {
|
||||
notice[0].scrollIntoView({ block: 'center', behavior: 'smooth' });
|
||||
}
|
||||
notice.trigger('focus');
|
||||
return;
|
||||
}
|
||||
// (۲) هماهنگیِ «انجامشده»: تأیید یکبارهٔ انجام کار.
|
||||
if (isEditMode || holdConfirmed) {
|
||||
return; // ویرایش، یا تأیید قبلی ⇒ ارسال آزاد
|
||||
}
|
||||
@@ -704,6 +848,7 @@
|
||||
// مقدار ذخیرهشدهٔ «قرار بعدی» را در همان فیلد نشان بده (بعد از toggle،
|
||||
// چون toggle برای انواع غیرهماهنگی فیلد را پاک میکند).
|
||||
seedHoldPicker(customerHold);
|
||||
syncHoldBackward();
|
||||
$("#desc").val(ActionParseData[0]['fields']['desc']);
|
||||
$("#userID").val(ActionParseData[0]['fields']['forUser']);
|
||||
if(ActionParseData[0]['fields']['status'] == 'finish'){
|
||||
@@ -752,6 +897,11 @@
|
||||
enabled: false,
|
||||
}
|
||||
},
|
||||
// بعد از انتخاب تاریخ، وضعیت «عقبتر بودن» فوراً بازمحاسبه شود
|
||||
// (پیکر مقدار altField را برنامهنویسیشده مینویسد و ممکن است change رخ ندهد).
|
||||
onSelect: function () {
|
||||
setTimeout(function () { syncHoldBackward(); }, 0);
|
||||
},
|
||||
});
|
||||
|
||||
// اگر پیکر ساخته نشد (مثلاً نام کلاس در قالب عوض شده باشد) هشدار بده؛
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<div class="columns m-0">
|
||||
<div class="column is-12 px-2 pt-3 pb-0">
|
||||
{% for message in messages %}
|
||||
<div class="notification {% if message.tags == 'error' %}is-danger{% elif message.tags == 'success' %}is-success{% else %}is-info{% endif %} is-light mb-2">
|
||||
<div class="notification {% if message.tags == 'error' %}is-danger{% elif message.tags == 'warning' %}is-warning{% elif message.tags == 'success' %}is-success{% else %}is-info{% endif %} is-light mb-2">
|
||||
<button class="delete close-notification" type="button"></button>
|
||||
<strong>{{ message }}</strong>
|
||||
</div>
|
||||
|
||||
Reference in new issue
Block a user