Catalyst / admin/Synapse-Cortex 14.8 GB / 57.8 GB 40.0 GB free
Help Sign in

admin / Synapse-Cortex

public

Self Hosted ITSM Tool with RBAC/Tenanting and MFA

Code Issues Pull requests Pipelines Packages Security Insights Wiki Settings
Synapse-Cortex / synapse-cortex / app / templates / sla_policies.html 3238 B · main
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
{% extends "base.html" %}
{% block title %}SLA Policies // Synapse-Cortex{% endblock %}
{% block header %}Tenant SLA Configuration{% endblock %}
{% block content %}
<div class="text-xs text-cortex-muted uppercase tracking-wider mb-4">Resolution &amp; response targets by priority</div>

<div class="border border-cortex-border bg-cortex-panel rounded-md">
  <table class="w-full text-sm">
    <thead>
      <tr class="text-left text-[10px] text-cortex-muted uppercase tracking-wider border-b border-cortex-border">
        <th class="px-4 py-2">Priority</th>
        <th class="px-4 py-2">Response Time (min)</th>
        <th class="px-4 py-2">Resolution Time (min)</th>
        <th class="px-4 py-2"></th>
      </tr>
    </thead>
    <tbody>
      {% for p in policies %}
      <tr class="border-b border-cortex-border/60 hover:bg-cortex-panel2" data-policy-id="{{ p.id }}">
        <td class="px-4 py-2">
          <span class="text-[10px] px-2 py-0.5 rounded uppercase
            {% if p.priority.value == 'critical' %}bg-accent-red/15 text-accent-red border border-accent-red/30
            {% elif p.priority.value == 'high' %}bg-accent-orange/15 text-accent-orange border border-accent-orange/30
            {% elif p.priority.value == 'medium' %}bg-accent-blue/15 text-accent-blue border border-accent-blue/30
            {% else %}bg-cortex-panel2 text-cortex-muted border border-cortex-border{% endif %}">
            {{ p.priority.value }}
          </span>
        </td>
        <td class="px-4 py-2">
          <input type="number" min="1" value="{{ p.response_time_minutes }}" class="response-input w-28 bg-cortex-panel2 border border-cortex-border rounded px-2 py-1 focus:outline-none focus:border-accent-blue" />
        </td>
        <td class="px-4 py-2">
          <input type="number" min="1" value="{{ p.resolution_time_minutes }}" class="resolution-input w-28 bg-cortex-panel2 border border-cortex-border rounded px-2 py-1 focus:outline-none focus:border-accent-blue" />
        </td>
        <td class="px-4 py-2">
          <button class="save-policy-btn text-[10px] uppercase text-accent-blue hover:text-white border border-accent-blue/40 rounded px-2 py-1">Save</button>
        </td>
      </tr>
      {% else %}
      <tr><td colspan="4" class="px-4 py-6 text-center text-cortex-muted text-xs">No SLA policies configured.</td></tr>
      {% endfor %}
    </tbody>
  </table>
</div>

<script>
  document.querySelectorAll('.save-policy-btn').forEach(function (btn) {
    btn.addEventListener('click', async function () {
      const row = btn.closest('tr');
      const policyId = row.getAttribute('data-policy-id');
      const response_time_minutes = parseInt(row.querySelector('.response-input').value, 10);
      const resolution_time_minutes = parseInt(row.querySelector('.resolution-input').value, 10);

      const res = await fetch('/api/v1/sla-policies/' + policyId, {
        method: 'PATCH',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ response_time_minutes, resolution_time_minutes }),
      });

      btn.textContent = res.ok ? 'Saved' : 'Error';
      setTimeout(function () { btn.textContent = 'Save'; }, 1500);
    });
  });
</script>
{% endblock %}