фильтр по приоритету

This commit is contained in:
tore 2026-09-21 16:42:59 +00:00
parent 96a2eb114f
commit 14889a8b6d
3 changed files with 53 additions and 4 deletions

View File

@ -51,6 +51,12 @@
<div class="kt-ai-work-column-table" id="view"> <div class="kt-ai-work-column-table" id="view">
<div class="kt-ai-kpi-strip" data-cards="true" id="kpiStrip"></div> <div class="kt-ai-kpi-strip" data-cards="true" id="kpiStrip"></div>
<div class="j-toolbar"> <div class="j-toolbar">
<div class="j-filters">
<span class="j-filters-label">Приоритет</span>
<div class="kt-ai-select-wrap">
<select class="kt-ai-select" id="prioSelect" onchange="S.setPrio(this.value)"></select>
</div>
</div>
<span class="spacer"></span> <span class="spacer"></span>
<div class="kt-ai-segmented" id="statusSeg"></div> <div class="kt-ai-segmented" id="statusSeg"></div>
<span class="kt-ai-meta" id="visCount"></span> <span class="kt-ai-meta" id="visCount"></span>

View File

@ -14,10 +14,17 @@ var STATUSES = {
var PRIORITIES = { var PRIORITIES = {
low: { label: "Низкий" }, low: { label: "Низкий" },
normal: { label: "Средний" }, normal: { label: "Средний", tone: "muted" },
high: { label: "Высокий" } high: { label: "Высокий", tone: "risk" }
}; };
var PRIORITY_OPTIONS = [
{ key: "", label: "Все" },
{ key: "high", label: "Высокий" },
{ key: "normal", label: "Средний" },
{ key: "low", label: "Низкий" }
];
function todayIso(offsetDays) { function todayIso(offsetDays) {
var d = new Date(); var d = new Date();
d.setDate(d.getDate() + (offsetDays || 0)); d.setDate(d.getDate() + (offsetDays || 0));
@ -57,6 +64,7 @@ var state = {
requests: [], requests: [],
query: "", query: "",
statusFilter: "", // "" = все statusFilter: "", // "" = все
priorityFilter: "", // "" = все
openId: null, // id записи в drawer openId: null, // id записи в drawer
drawerMode: "" // "" | "view" | "new" | "edit" drawerMode: "" // "" | "view" | "new" | "edit"
}; };
@ -138,12 +146,18 @@ function statusPill(status) {
return '<span class="kt-ai-status-pill" data-status="' + st.tone + '">' + esc(st.label) + "</span>"; return '<span class="kt-ai-status-pill" data-status="' + st.tone + '">' + esc(st.label) + "</span>";
} }
function prioChip(p) {
var pr = PRIORITIES[p] || PRIORITIES.normal;
return '<span class="kt-ai-chip" data-tone="' + pr.tone + '">' + esc(pr.label) + "</span>";
}
function filteredRequests(q) { function filteredRequests(q) {
q = (q == null ? "" : q).trim().toLowerCase(); q = (q == null ? "" : q).trim().toLowerCase();
var out = []; var out = [];
for (var i = 0; i < state.requests.length; i++) { for (var i = 0; i < state.requests.length; i++) {
var r = state.requests[i]; var r = state.requests[i];
if (state.statusFilter && r.status !== state.statusFilter) continue; if (state.statusFilter && r.status !== state.statusFilter) continue;
if (state.priorityFilter && r.priority !== state.priorityFilter) continue;
if (q) { if (q) {
if (String(r.equipment).toLowerCase().indexOf(q) === -1) continue; if (String(r.equipment).toLowerCase().indexOf(q) === -1) continue;
} }
@ -156,6 +170,7 @@ function statusCounts(q) {
var c = { "": 0, new: 0, inwork: 0, waiting: 0, done: 0, cancelled: 0 }; var c = { "": 0, new: 0, inwork: 0, waiting: 0, done: 0, cancelled: 0 };
for (var i = 0; i < state.requests.length; i++) { for (var i = 0; i < state.requests.length; i++) {
var r = state.requests[i]; var r = state.requests[i];
if (state.priorityFilter && r.priority !== state.priorityFilter) continue;
if (q) { if (q) {
if (String(r.equipment).toLowerCase().indexOf(q) === -1) continue; if (String(r.equipment).toLowerCase().indexOf(q) === -1) continue;
} }
@ -227,13 +242,12 @@ function renderTable() {
for (var i = 0; i < vis.length; i++) { for (var i = 0; i < vis.length; i++) {
var r = vis[i]; var r = vis[i];
var prio = PRIORITIES[r.priority] || { label: "—" };
h += '<tr class="j-row" onclick="S.openView(\'' + esc(r.id) + '\')">' + h += '<tr class="j-row" onclick="S.openView(\'' + esc(r.id) + '\')">' +
'<td class="j-id">' + esc(r.id) + "</td>" + '<td class="j-id">' + esc(r.id) + "</td>" +
'<td><span class="j-name">' + esc(r.equipment) + '</span>' + '<td><span class="j-name">' + esc(r.equipment) + '</span>' +
'<span class="j-sub">' + esc(r.address) + "</span></td>" + '<span class="j-sub">' + esc(r.address) + "</span></td>" +
"<td>" + statusPill(r.status) + "</td>" + "<td>" + statusPill(r.status) + "</td>" +
'<td class="j-prio">' + esc(prio.label) + "</td>" + '<td class="j-prio">' + prioChip(r.priority) + "</td>" +
'<td class="j-date">' + esc(fmtDate(r.created)) + "</td>" + '<td class="j-date">' + esc(fmtDate(r.created)) + "</td>" +
'<td>' + esc(r.reporter) + "</td>" + '<td>' + esc(r.reporter) + "</td>" +
"</tr>"; "</tr>";
@ -244,9 +258,22 @@ function renderTable() {
if (el) el.textContent = vis.length + " из " + state.requests.length; if (el) el.textContent = vis.length + " из " + state.requests.length;
} }
function renderPrioSelect() {
var sel = $("prioSelect");
if (!sel) return;
var h = "";
for (var i = 0; i < PRIORITY_OPTIONS.length; i++) {
var o = PRIORITY_OPTIONS[i];
var active = state.priorityFilter === o.key ? "1" : "0";
h += '<option value="' + o.key + '"' + (active ? " selected" : "") + ">" + esc(o.label) + "</option>";
}
sel.innerHTML = h;
}
function renderAll() { function renderAll() {
renderKpis(); renderKpis();
renderStatusSeg(); renderStatusSeg();
renderPrioSelect();
renderTable(); renderTable();
} }
@ -547,6 +574,11 @@ S.onSearch = function (v) {
renderAll(); renderAll();
}; };
S.setPrio = function (v) {
state.priorityFilter = v;
renderAll();
};
S.toggleSidebar = function () { S.toggleSidebar = function () {
var sb = $("sidebar"); var sb = $("sidebar");
if (sb) sb.setAttribute("data-open", sb.getAttribute("data-open") === "true" ? "false" : "true"); if (sb) sb.setAttribute("data-open", sb.getAttribute("data-open") === "true" ? "false" : "true");

View File

@ -9,6 +9,17 @@
flex-wrap: wrap; flex-wrap: wrap;
} }
/* Выборка приоритета в тулбаре */
.j-filters {
display: flex;
align-items: center;
gap: var(--kt-ai-space-3);
}
.j-filters-label {
font-size: var(--kt-ai-text-xs);
color: var(--kt-ai-fg-muted);
}
/* Заголовок экрана */ /* Заголовок экрана */
.j-page-head { .j-page-head {
display: flex; display: flex;