v1.4.0: fix #43, #31, #29, #49, #33 + shared templating

This commit is contained in:
2026-05-20 20:08:25 +03:00
parent ca4d00c895
commit 64991f0228
63 changed files with 5005 additions and 45 deletions
@@ -0,0 +1,29 @@
{% extends "page.html" %}
{% block breadcrumb %}<a href="/service/documents/">Документация</a> / Редактирование{% endblock %}
{% block page_actions %}<a href="/service/documents/{{ doc.filename | replace('.md', '') }}" class="btn btn-secondary btn-sm">← Назад</a>{% endblock %}
{% block page_content %}
<div class="card" style="padding-bottom:0">
<form method="post" action="/service/documents/{{ doc.filename | replace('.md', '') }}/edit">
<div class="form-group" style="margin-bottom:0">
<textarea id="editor" name="content">{{ content }}</textarea>
</div>
<div class="form-actions edit-form-actions">
<button type="submit" class="btn btn-primary">Сохранить</button>
<a href="/service/documents/{{ doc.filename | replace('.md', '') }}" class="btn btn-secondary">Отмена</a>
</div>
</form>
</div>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.css">
<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
<script>
const easyMDE = new EasyMDE({
element: document.getElementById('editor'),
spellChecker: false,
autosave: {
enabled: true,
uniqueId: "{{ doc.filename }}",
delay: 1000,
},
});
</script>
{% endblock %}
@@ -0,0 +1,30 @@
{% extends "page.html" %}
{% block breadcrumb %}Документация{% endblock %}
{% block page_content %}
<div class="card">
<div class="card-header"><h2>Документация</h2></div>
<div class="docs-list">
{% for doc in docs %}
<div class="doc-item">
<a href="/service/documents/{{ doc.filename | replace('.md', '') }}">{{ doc.title }}</a>
</div>
{% else %}
<p>Нет доступных документов</p>
{% endfor %}
</div>
{% if user.role == "owner" %}
<div class="docs-actions" style="margin-top:12px;">
<a href="/service/documents/admin/permissions" class="btn btn-secondary btn-sm">Управление доступами</a>
<button class="btn btn-primary btn-sm" onclick="document.getElementById('create-form').style.display='block'">Создать документ</button>
</div>
<form id="create-form" method="post" action="/service/documents/admin/create" style="display:none; margin-top: 1rem;">
<div class="form-group">
<label for="title">Название документа</label>
<input type="text" id="title" name="title" required>
</div>
<button type="submit" class="btn btn-primary btn-sm">Создать</button>
<button type="button" class="btn btn-secondary btn-sm" onclick="document.getElementById('create-form').style.display='none'">Отмена</button>
</form>
{% endif %}
</div>
{% endblock %}
@@ -0,0 +1,39 @@
{% extends "page.html" %}
{% block breadcrumb %}<a href="/service/documents/">Документация</a> / Управление доступами{% endblock %}
{% block page_actions %}<a href="/service/documents/" class="btn btn-secondary btn-sm">← Назад</a>{% endblock %}
{% block page_content %}
<div class="card">
<form method="post" action="/service/documents/admin/permissions">
<table class="permissions-table">
<thead>
<tr>
<th>Документ</th>
<th>Engineer: Просмотр</th>
<th>Engineer: Редактирование</th>
<th>Technician: Просмотр</th>
</tr>
</thead>
<tbody>
{% for slug, doc in perms.items()|sort(attribute='value.sort_order') %}
<tr>
<td>{{ doc.title }}</td>
<td>
<input type="checkbox" name="{{ slug }}_engineer_view" {% if doc.permissions.engineer.view %}checked{% endif %}>
</td>
<td>
<input type="checkbox" name="{{ slug }}_engineer_edit" {% if doc.permissions.engineer.edit %}checked{% endif %}>
</td>
<td>
<input type="checkbox" name="{{ slug }}_technician_view" {% if doc.permissions.technician and doc.permissions.technician.view %}checked{% endif %}>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="form-actions">
<button type="submit" class="btn btn-primary">Сохранить</button>
<a href="/service/documents/" class="btn btn-secondary">Отмена</a>
</div>
</form>
</div>
{% endblock %}
@@ -0,0 +1,36 @@
{% extends "page.html" %}
{% block breadcrumb %}<a href="/service/documents/">Документация</a> / Доступ техников{% endblock %}
{% block page_actions %}<a href="/service/documents/" class="btn btn-secondary btn-sm">← Назад</a>{% endblock %}
{% block page_content %}
<div class="card">
<p style="color:var(--text-muted);margin-bottom:20px;">Вы можете открыть техникам просмотр документов, к которым у вас есть доступ на редактирование.</p>
<form method="post" action="/service/documents/tech-access">
<table class="permissions-table">
<thead>
<tr>
<th>Документ</th>
<th>Technician: Просмотр</th>
</tr>
</thead>
<tbody>
{% for slug, doc in perms.items() %}
{% if doc.permissions.engineer.edit %}
<tr>
<td>{{ doc.title }}</td>
<td>
<input type="checkbox" name="{{ slug }}_technician_view" {% if doc.permissions.technician and doc.permissions.technician.view %}checked{% endif %}>
</td>
</tr>
{% endif %}
{% else %}
<tr><td colspan="2">Нет документов с правом редактирования</td></tr>
{% endfor %}
</tbody>
</table>
<div class="form-actions">
<button type="submit" class="btn btn-primary">Сохранить</button>
<a href="/service/documents/" class="btn btn-secondary">Отмена</a>
</div>
</form>
</div>
{% endblock %}
@@ -0,0 +1,16 @@
{% extends "page.html" %}
{% block breadcrumb %}<a href="/service/documents/">Документация</a>{% endblock %}
{% block page_actions %}
{% if can_edit %}
<a href="/service/documents/{{ doc.filename | replace('.md', '') }}/edit" class="btn btn-secondary btn-sm">Редактировать</a>
{% endif %}
{% if can_download %}
<a href="/service/documents/{{ doc.filename | replace('.md', '') }}/download" class="btn btn-primary btn-sm">Скачать</a>
{% endif %}
<a href="/service/documents/" class="btn btn-secondary btn-sm">← Назад</a>
{% endblock %}
{% block page_content %}
<div class="card">
<div class="doc-content">{{ content | safe }}</div>
</div>
{% endblock %}