Auto-commit local changes before build (2026-01-06 13:25:04)
This commit is contained in:
parent
6984b9ec22
commit
63b47a59e0
@ -1 +1 @@
|
||||
v20260106-11-new-ticket-remove-description
|
||||
v20260106-12-disable-ticket-and-remark-edit
|
||||
|
||||
@ -356,27 +356,13 @@
|
||||
'<div class="text-truncate">' +
|
||||
'<span class="me-1" title="Ticket">🎫</span>' +
|
||||
'<span class="fw-semibold">' + escapeHtml(t.ticket_code || '') + '</span>' +
|
||||
'<span class="ms-2 badge ' + (t.resolved_at ? 'bg-secondary' : 'bg-warning text-dark') + '">' + status + '</span>' +
|
||||
'<span class="ms-2 badge ' + (t.resolved_at ? 'bg-secondary' : 'bg-warning text-dark') + '">' + status + '</span>' +
|
||||
'</div>' +
|
||||
(t.description ? ('<div class="small text-muted mt-1">' + escapeHtml(t.description) + '</div>') : '') +
|
||||
'</div>' +
|
||||
'<div class="d-flex gap-1 flex-shrink-0">' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-secondary" data-action="toggle-edit-ticket" data-id="' + t.id + '" ' + (t.resolved_at ? 'disabled' : '') + '>Edit</button>' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-success" data-action="resolve-ticket" data-id="' + t.id + '" ' + (t.resolved_at ? 'disabled' : '') + '>Resolve</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'<div class="mt-2" data-edit="ticket" style="display:none;">' +
|
||||
'<div class="row g-2">' +
|
||||
'<div class="col-12">' +
|
||||
'<textarea class="form-control form-control-sm" data-field="description" rows="2" placeholder="Description (optional)">' + escapeHtml(t.description || '') + '</textarea>' +
|
||||
'</div>' +
|
||||
'<div class="col-12 d-flex gap-2">' +
|
||||
'<button type="button" class="btn btn-sm btn-primary" data-action="save-ticket" data-id="' + t.id + '">Save</button>' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-secondary" data-action="cancel-edit" data-id="' + t.id + '">Cancel</button>' +
|
||||
'<div class="small text-muted align-self-center" data-field="status"></div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
});
|
||||
html += '</div></div>';
|
||||
@ -397,22 +383,9 @@
|
||||
(r.body ? ('<div class="small text-muted mt-1">' + escapeHtml(r.body) + '</div>') : '') +
|
||||
'</div>' +
|
||||
'<div class="d-flex gap-1 flex-shrink-0">' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-secondary" data-action="toggle-edit-remark" data-id="' + r.id + '" ' + (r.resolved_at ? 'disabled' : '') + '>Edit</button>' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-success" data-action="resolve-remark" data-id="' + r.id + '" ' + (r.resolved_at ? 'disabled' : '') + '>Resolve</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'<div class="mt-2" data-edit="remark" style="display:none;">' +
|
||||
'<div class="row g-2">' +
|
||||
'<div class="col-12">' +
|
||||
'<textarea class="form-control form-control-sm" data-field="body" rows="2" placeholder="Body (required)">' + escapeHtml(r.body || '') + '</textarea>' +
|
||||
'</div>' +
|
||||
'<div class="col-12 d-flex gap-2">' +
|
||||
'<button type="button" class="btn btn-sm btn-primary" data-action="save-remark" data-id="' + r.id + '">Save</button>' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-secondary" data-action="cancel-edit" data-id="' + r.id + '">Cancel</button>' +
|
||||
'<div class="small text-muted align-self-center" data-field="status"></div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
});
|
||||
html += '</div></div>';
|
||||
@ -427,8 +400,6 @@
|
||||
var id = btn.getAttribute('data-id');
|
||||
if (!action || !id) return;
|
||||
|
||||
var wrapper = btn.closest('[data-alert-type]');
|
||||
|
||||
if (action === 'resolve-ticket') {
|
||||
if (!confirm('Mark ticket as resolved?')) return;
|
||||
apiJson('/api/tickets/' + encodeURIComponent(id) + '/resolve', {method: 'POST', body: '{}'})
|
||||
@ -439,59 +410,6 @@
|
||||
apiJson('/api/remarks/' + encodeURIComponent(id) + '/resolve', {method: 'POST', body: '{}'})
|
||||
.then(function () { loadAlerts(currentRunId); })
|
||||
.catch(function (e) { alert(e.message || 'Failed.'); });
|
||||
} else if (action === 'toggle-edit-ticket') {
|
||||
if (!wrapper) return;
|
||||
var edit = wrapper.querySelector('[data-edit="ticket"]');
|
||||
if (!edit) return;
|
||||
edit.style.display = (edit.style.display === 'none' || !edit.style.display) ? '' : 'none';
|
||||
} else if (action === 'toggle-edit-remark') {
|
||||
if (!wrapper) return;
|
||||
var edit2 = wrapper.querySelector('[data-edit="remark"]');
|
||||
if (!edit2) return;
|
||||
edit2.style.display = (edit2.style.display === 'none' || !edit2.style.display) ? '' : 'none';
|
||||
} else if (action === 'cancel-edit') {
|
||||
if (!wrapper) return;
|
||||
var editAny = wrapper.querySelector('[data-edit]');
|
||||
if (editAny) editAny.style.display = 'none';
|
||||
} else if (action === 'save-ticket') {
|
||||
if (!wrapper) return;
|
||||
var editT = wrapper.querySelector('[data-edit="ticket"]');
|
||||
if (!editT) return;
|
||||
var descEl = editT.querySelector('[data-field="description"]');
|
||||
var statusEl = editT.querySelector('[data-field="status"]');
|
||||
var descVal = descEl ? descEl.value : '';
|
||||
if (statusEl) statusEl.textContent = 'Saving...';
|
||||
apiJson('/api/tickets/' + encodeURIComponent(id), {
|
||||
method: 'PATCH',
|
||||
body: JSON.stringify({description: descVal})
|
||||
})
|
||||
.then(function () { loadAlerts(currentRunId); })
|
||||
.catch(function (e) {
|
||||
if (statusEl) statusEl.textContent = e.message || 'Failed.';
|
||||
else alert(e.message || 'Failed.');
|
||||
});
|
||||
} else if (action === 'save-remark') {
|
||||
if (!wrapper) return;
|
||||
var editR = wrapper.querySelector('[data-edit="remark"]');
|
||||
if (!editR) return;
|
||||
var bodyEl2 = editR.querySelector('[data-field="body"]');
|
||||
var statusEl2 = editR.querySelector('[data-field="status"]');
|
||||
var bodyVal2 = bodyEl2 ? bodyEl2.value : '';
|
||||
if (!bodyVal2 || !bodyVal2.trim()) {
|
||||
if (statusEl2) statusEl2.textContent = 'Body is required.';
|
||||
else alert('Body is required.');
|
||||
return;
|
||||
}
|
||||
if (statusEl2) statusEl2.textContent = 'Saving...';
|
||||
apiJson('/api/remarks/' + encodeURIComponent(id), {
|
||||
method: 'PATCH',
|
||||
body: JSON.stringify({body: bodyVal2})
|
||||
})
|
||||
.then(function () { loadAlerts(currentRunId); })
|
||||
.catch(function (e) {
|
||||
if (statusEl2) statusEl2.textContent = e.message || 'Failed.';
|
||||
else alert(e.message || 'Failed.');
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@ -669,25 +669,11 @@ table.addEventListener('change', function (e) {
|
||||
'<span class="fw-semibold">' + escapeHtml(t.ticket_code || '') + '</span>' +
|
||||
'<span class="ms-2 badge ' + (t.resolved_at ? 'bg-secondary' : 'bg-warning text-dark') + '">' + status + '</span>' +
|
||||
'</div>' +
|
||||
(t.description ? ('<div class="small text-muted mt-1">' + escapeHtml(t.description) + '</div>') : '') +
|
||||
'</div>' +
|
||||
'<div class="d-flex gap-1 flex-shrink-0">' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-secondary" data-action="toggle-edit-ticket" data-id="' + t.id + '" ' + (t.resolved_at ? 'disabled' : '') + '>Edit</button>' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-success" data-action="resolve-ticket" data-id="' + t.id + '" ' + (t.resolved_at ? 'disabled' : '') + '>Resolve</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'<div class="mt-2" data-edit="ticket" style="display:none;">' +
|
||||
'<div class="row g-2">' +
|
||||
'<div class="col-12">' +
|
||||
'<textarea class="form-control form-control-sm" data-field="description" rows="2" placeholder="Description (optional)">' + escapeHtml(t.description || '') + '</textarea>' +
|
||||
'</div>' +
|
||||
'<div class="col-12 d-flex gap-2">' +
|
||||
'<button type="button" class="btn btn-sm btn-primary" data-action="save-ticket" data-id="' + t.id + '">Save</button>' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-secondary" data-action="cancel-edit" data-id="' + t.id + '">Cancel</button>' +
|
||||
'<div class="small text-muted align-self-center" data-field="status"></div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
});
|
||||
html += '</div></div>';
|
||||
@ -696,34 +682,21 @@ table.addEventListener('change', function (e) {
|
||||
if (remarks.length) {
|
||||
html += '<div class="mb-2"><strong>Remarks</strong><div class="mt-1">';
|
||||
remarks.forEach(function (r) {
|
||||
var status2 = r.resolved_at ? 'Resolved' : 'Active';
|
||||
var status = r.resolved_at ? 'Resolved' : 'Active';
|
||||
html += '<div class="mb-2 border rounded p-2" data-alert-type="remark" data-id="' + r.id + '">' +
|
||||
'<div class="d-flex align-items-start justify-content-between gap-2">' +
|
||||
'<div class="flex-grow-1 min-w-0">' +
|
||||
'<div class="text-truncate">' +
|
||||
'<span class="me-1" title="Remark">💬</span>' +
|
||||
'<span class="fw-semibold">Remark</span>' +
|
||||
'<span class="ms-2 badge ' + (r.resolved_at ? 'bg-secondary' : 'bg-warning text-dark') + '">' + status2 + '</span>' +
|
||||
'<span class="ms-2 badge ' + (r.resolved_at ? 'bg-secondary' : 'bg-warning text-dark') + '">' + status + '</span>' +
|
||||
'</div>' +
|
||||
(r.body ? ('<div class="small text-muted mt-1">' + escapeHtml(r.body) + '</div>') : '') +
|
||||
'</div>' +
|
||||
'<div class="d-flex gap-1 flex-shrink-0">' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-secondary" data-action="toggle-edit-remark" data-id="' + r.id + '" ' + (r.resolved_at ? 'disabled' : '') + '>Edit</button>' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-success" data-action="resolve-remark" data-id="' + r.id + '" ' + (r.resolved_at ? 'disabled' : '') + '>Resolve</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'<div class="mt-2" data-edit="remark" style="display:none;">' +
|
||||
'<div class="row g-2">' +
|
||||
'<div class="col-12">' +
|
||||
'<textarea class="form-control form-control-sm" data-field="body" rows="2" placeholder="Body (required)">' + escapeHtml(r.body || '') + '</textarea>' +
|
||||
'</div>' +
|
||||
'<div class="col-12 d-flex gap-2">' +
|
||||
'<button type="button" class="btn btn-sm btn-primary" data-action="save-remark" data-id="' + r.id + '">Save</button>' +
|
||||
'<button type="button" class="btn btn-sm btn-outline-secondary" data-action="cancel-edit" data-id="' + r.id + '">Cancel</button>' +
|
||||
'<div class="small text-muted align-self-center" data-field="status"></div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
});
|
||||
html += '</div></div>';
|
||||
@ -737,8 +710,6 @@ table.addEventListener('change', function (e) {
|
||||
var action = btn.getAttribute('data-action');
|
||||
var id = btn.getAttribute('data-id');
|
||||
if (!action || !id) return;
|
||||
var wrapper = btn.closest('[data-alert-type]');
|
||||
|
||||
if (action === 'resolve-ticket') {
|
||||
if (!confirm('Mark ticket as resolved?')) return;
|
||||
apiJson('/api/tickets/' + encodeURIComponent(id) + '/resolve', {method: 'POST', body: '{}'})
|
||||
@ -749,58 +720,6 @@ table.addEventListener('change', function (e) {
|
||||
apiJson('/api/remarks/' + encodeURIComponent(id) + '/resolve', {method: 'POST', body: '{}'})
|
||||
.then(function () { loadAlerts(currentRunId); })
|
||||
.catch(function (e) { alert(e.message || 'Failed.'); });
|
||||
} else if (action === 'toggle-edit-ticket') {
|
||||
if (!wrapper) return;
|
||||
var edit = wrapper.querySelector('[data-edit="ticket"]');
|
||||
if (!edit) return;
|
||||
edit.style.display = (edit.style.display === 'none' || !edit.style.display) ? '' : 'none';
|
||||
} else if (action === 'toggle-edit-remark') {
|
||||
if (!wrapper) return;
|
||||
var edit2 = wrapper.querySelector('[data-edit="remark"]');
|
||||
if (!edit2) return;
|
||||
edit2.style.display = (edit2.style.display === 'none' || !edit2.style.display) ? '' : 'none';
|
||||
} else if (action === 'cancel-edit') {
|
||||
if (!wrapper) return;
|
||||
var editAny = wrapper.querySelector('[data-edit]');
|
||||
if (editAny) editAny.style.display = 'none';
|
||||
} else if (action === 'save-ticket') {
|
||||
if (!wrapper) return;
|
||||
var editT = wrapper.querySelector('[data-edit="ticket"]');
|
||||
if (!editT) return;
|
||||
var descEl = editT.querySelector('[data-field="description"]');
|
||||
var statusEl2 = editT.querySelector('[data-field="status"]');
|
||||
var descVal = descEl ? descEl.value : '';
|
||||
if (statusEl2) statusEl2.textContent = 'Saving...';
|
||||
apiJson('/api/tickets/' + encodeURIComponent(id), {
|
||||
method: 'PATCH',
|
||||
body: JSON.stringify({description: descVal})
|
||||
})
|
||||
.then(function () { loadAlerts(currentRunId); })
|
||||
.catch(function (e) {
|
||||
if (statusEl2) statusEl2.textContent = e.message || 'Failed.';
|
||||
else alert(e.message || 'Failed.');
|
||||
});
|
||||
} else if (action === 'save-remark') {
|
||||
if (!wrapper) return;
|
||||
var editR = wrapper.querySelector('[data-edit="remark"]');
|
||||
if (!editR) return;
|
||||
var bodyEl = editR.querySelector('[data-field="body"]');
|
||||
var statusEl3 = editR.querySelector('[data-field="status"]');
|
||||
var bodyVal = bodyEl ? bodyEl.value : '';
|
||||
if (!bodyVal || !bodyVal.trim()) {
|
||||
if (statusEl3) statusEl3.textContent = 'Body is required.';
|
||||
return;
|
||||
}
|
||||
if (statusEl3) statusEl3.textContent = 'Saving...';
|
||||
apiJson('/api/remarks/' + encodeURIComponent(id), {
|
||||
method: 'PATCH',
|
||||
body: JSON.stringify({body: bodyVal})
|
||||
})
|
||||
.then(function () { loadAlerts(currentRunId); })
|
||||
.catch(function (e) {
|
||||
if (statusEl3) statusEl3.textContent = e.message || 'Failed.';
|
||||
else alert(e.message || 'Failed.');
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@ -17,10 +17,7 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="row g-3"> <div class="col-12">
|
||||
<label class="form-label">Description</label>
|
||||
<div class="form-control-plaintext border rounded p-2" style="min-height: 6rem; white-space: pre-wrap;">{{ ticket.description or '' }}</div>
|
||||
</div>
|
||||
<div class="row g-3">
|
||||
{% if active_role in ['admin','operator'] %}
|
||||
<div class="col-12">
|
||||
|
||||
|
||||
@ -45,7 +45,7 @@
|
||||
|
||||
<div class="col-auto" style="min-width: 260px;">
|
||||
<label class="form-label" for="flt_q">Search</label>
|
||||
<input class="form-control" id="flt_q" name="q" value="{{ q }}" placeholder="ticket code / description / job" />
|
||||
<input class="form-control" id="flt_q" name="q" value="{{ q }}" placeholder="ticket code / job" />
|
||||
</div>
|
||||
|
||||
<div class="col-auto">
|
||||
@ -89,7 +89,7 @@
|
||||
<td class="text-nowrap">{{ t.start_date }}</td>
|
||||
<td class="text-nowrap">{{ t.resolved_at }}</td>
|
||||
<td class="text-nowrap">
|
||||
<a class="btn btn-sm btn-outline-primary" href="{{ url_for('main.ticket_detail', ticket_id=t.id) }}">View / Edit</a>
|
||||
<a class="btn btn-sm btn-outline-primary" href="{{ url_for('main.ticket_detail', ticket_id=t.id) }}">View</a>
|
||||
{% if t.active and t.job_id %}
|
||||
<a class="btn btn-sm btn-outline-secondary ms-1" href="{{ url_for('main.job_detail', job_id=t.job_id) }}">Job page</a>
|
||||
{% endif %}
|
||||
@ -144,7 +144,7 @@
|
||||
<td class="text-nowrap">{{ r.start_date }}</td>
|
||||
<td class="text-nowrap">{{ r.resolved_at }}</td>
|
||||
<td class="text-nowrap">
|
||||
<a class="btn btn-sm btn-outline-primary" href="{{ url_for('main.remark_detail', remark_id=r.id) }}">View / Edit</a>
|
||||
<a class="btn btn-sm btn-outline-primary" href="{{ url_for('main.remark_detail', remark_id=r.id) }}">View</a>
|
||||
{% if r.active and r.job_id %}
|
||||
<a class="btn btn-sm btn-outline-secondary ms-1" href="{{ url_for('main.job_detail', job_id=r.job_id) }}">Job page</a>
|
||||
{% endif %}
|
||||
|
||||
@ -87,6 +87,14 @@ Removed an incorrectly indented redirect statement so the module loads correctly
|
||||
- Updated the ticket creation request to store only the ticket number (ticket_code) when creating a new ticket.
|
||||
- Backend /api/tickets (POST) now ignores any description input during ticket creation (use remarks for additional context).
|
||||
|
||||
---
|
||||
|
||||
## v20260106-12-disable-ticket-and-remark-edit
|
||||
- Removed ticket edit UI actions (Daily Jobs, Run Checks, Tickets & Remarks overview).
|
||||
- Removed remark edit UI actions (Daily Jobs, Run Checks, Tickets & Remarks overview).
|
||||
- Removed ticket description display from ticket detail to prevent the field from reappearing.
|
||||
- Kept resolve actions available for tickets and remarks.
|
||||
|
||||
================================================================================================================================================
|
||||
## v0.1.16
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user