Massive rewrite

This commit is contained in:
2025-01-17 11:03:00 +01:00
parent 31ddea734e
commit 6477be00b6
169 changed files with 8295 additions and 5775 deletions
+35
View File
@@ -0,0 +1,35 @@
{% import 'macro/accordion.html' as accordion %}
{% import 'macro/card.html' as card %}
<div class="container">
<div class="card mb-3">
<div class="card-header">
<h5 class="mb-0"><i class="ri-file-line"></i> Instructions</h5>
</div>
<div class="accordion accordion-flush" id="instructions">
{{ accordion.header('Instructions danger zone', 'instructions-delete', 'instructions', expanded=true, danger=true) }}
{% if item.brickset %}
<div class="d-flex justify-content-center">
{% with item=item.brickset %}
{% include 'set/mini.html' %}
{% endwith %}
</div>
{% endif %}
<form action="{{ url_for('instructions.do_delete', name=item.filename) }}" method="post">
{% if error %}<div class="alert alert-danger" role="alert"><strong>Error:</strong> {{ error }}.</div>{% endif %}
<div class="alert alert-danger text-center" role="alert">You are about to <strong>delete the instruction file {{ item.filename }}</strong>. This action is irreversible.</div>
<div class="text-end">
<a class="btn btn-danger" href="{{ url_for('instructions.list') }}" role="button"><i class="ri-arrow-left-long-line"></i> Back to the instructions</a>
<button type="submit" class="btn btn-danger"><i class="ri-delete-bin-2-line"></i> Delete <strong>the instruction file {{ item.filename }}</strong></button>
</div>
</form>
{{ accordion.footer() }}
</div>
<div class="card-footer"></div>
</div>
</div>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", () => {
baguetteBox.run('[data-lightbox]');
});
</script>
+41
View File
@@ -0,0 +1,41 @@
{% import 'macro/accordion.html' as accordion %}
{% import 'macro/card.html' as card %}
<div class="container">
<div class="card mb-3">
<div class="card-header">
<h5 class="mb-0"><i class="ri-file-line"></i> Instructions</h5>
</div>
<div class="accordion accordion-flush" id="instructions">
{{ accordion.header('Management', 'instructions-rename', 'instructions', expanded=true) }}
{% if item.brickset %}
<div class="d-flex justify-content-center">
{% with item=item.brickset %}
{% include 'set/mini.html' %}
{% endwith %}
</div>
{% endif %}
<form action="{{ url_for('instructions.do_rename', name=item.filename) }}" method="post">
{% if error %}<div class="alert alert-danger" role="alert"><strong>Error:</strong> {{ error }}.</div>{% endif %}
<div class="mb-3">
<label for="filename" class="form-label">File name</label> (current name: <code>{{ item.filename }}</code>)
<div class="input-group">
<input type="input" class="form-control" id="filename" name="filename" value="{{ item.name }}" autocomplete="off">
<span class="input-group-text">{{ item.extension }}</span>
</div>
</div>
<div class="text-end">
<a class="btn btn-primary" href="{{ url_for('instructions.list') }}" role="button"><i class="ri-arrow-left-long-line"></i> Back to the instructions</a>
<button type="submit" class="btn btn-primary"><i class="ri-edit-line"></i> Rename</button>
</div>
</form>
{{ accordion.footer() }}
</div>
<div class="card-footer"></div>
</div>
</div>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", () => {
baguetteBox.run('[data-lightbox]');
});
</script>
+51
View File
@@ -0,0 +1,51 @@
{% import 'macro/table.html' as table %}
<div class="table-responsive-sm">
<table class="table table-striped align-middle" id="instructions">
<thead>
<tr>
<th scope="col"><i class="ri-file-line fw-normal"></i> Filename</th>
<th scope="col"><i class="ri-hashtag fw-normal"></i> Set</th>
<th class="no-sort" scope="col"><i class="ri-image-line fw-normal"></i> Image</th>
{% if g.login.is_authenticated() %}
<th class="no-sort" scope="col"><i class="ri-settings-4-line fw-normal"></i> Actions</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for item in table_collection %}
<tr>
<td>
{% if item.allowed %}
<a class="text-reset" href="{{ item.url() }}" target="_blank">
{%- endif -%}
<i class="ri-{{ item.icon() }}"></i> {{ item.filename }}
{%- if item.allowed -%}
</a>
{% endif %}
<span class="badge rounded-pill text-bg-info fw-normal"><i class="ri-hard-drive-line"></i> {{ item.human_size() }}</span>
<span class="badge rounded-pill text-bg-light border fw-normal"><i class="ri-calendar-line"></i> {{ item.human_time() }}</span>
</td>
<td>
{% if item.number %}<span class="badge text-bg-secondary fw-normal"><i class="ri-hashtag"></i> {{ item.number }}</span>{% endif %}
{% if item.brickset %}{{ item.brickset.fields.name }}{% endif %}
</td>
{% if item.brickset %}
{{ table.image(item.brickset.url_for_image(), caption=item.brickset.fields.name, alt=item.brickset.fields.set_num) }}
{% else %}
<td><i class="ri-file-warning-line"></i></td>
{% endif %}
{% if g.login.is_authenticated() %}
<td>
<a href="{{ url_for('instructions.rename', name=item.filename) }}" class="btn btn-sm btn-primary"><i class="ri-edit-line"></i> Rename</a>
<a href="{{ url_for('instructions.delete', name=item.filename) }}" class="btn btn-sm btn-danger"><i class="ri-delete-bin-2-line"></i> Delete</a>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if all %}
{{ table.dynamic('instructions', no_sort='2,3')}}
{% endif %}
+42
View File
@@ -0,0 +1,42 @@
{% import 'macro/accordion.html' as accordion %}
{% import 'macro/card.html' as card %}
<div class="container">
<div class="card mb-3">
<div class="card-header">
<h5 class="mb-0"><i class="ri-file-line"></i> Instructions</h5>
</div>
<div class="accordion accordion-flush" id="instructions">
{{ accordion.header('Management', 'instructions-upload', 'instructions', expanded=true) }}
<form action="{{ url_for('instructions.do_upload') }}" method="post" enctype="multipart/form-data">
{% if error %}<div class="alert alert-danger" role="alert"><strong>Error:</strong> {{ error }}.</div>{% endif %}
<div class="alert alert-info" role="alert">
<strong>File naming convention:</strong> You are free to use any name you want for your intructions files. <br>
However if you want an instructions file to be associated to a set, the filename must start with the set number (<code>number-version</code>). <br>
For instance, you could use:
<ul>
<li>Instructions.pdf: will <strong>not be</strong> matched to any set</li>
<li>107.pdf: will <strong>not be</strong> matched to set <code>107-1</code></li>
<li>107-1.pdf: will be matched to set <code>107-1</code></li>
<li>107-1-2.pdf: will be matched to set <code>107-1</code></li>
<li>107-1 Special instructions.pdf: will be matched to set <code>107-1</code></li>
<li>107-1_Special_instructions.pdf: will be matched to set <code>107-1</code></li>
</ul>
</div>
<div class="mb-3">
<label for="file" class="form-label">Instructions file</label>
<div class="input-group">
<input type="file" class="form-control" id="file" name="file" accept="{{ ','.join(config['INSTRUCTIONS_ALLOWED_EXTENSIONS'].value) }}">
<span class="input-group-text">{{ ', '.join(config['INSTRUCTIONS_ALLOWED_EXTENSIONS'].value) }}</span>
</div>
</div>
<div class="text-end">
<a class="btn btn-primary" href="{{ url_for('instructions.list') }}" role="button"><i class="ri-arrow-left-long-line"></i> Back to the instructions</a>
<button type="submit" class="btn btn-primary"><i class="ri-upload-line"></i> Upload an instructions file</button>
</div>
</form>
{{ accordion.footer() }}
</div>
<div class="card-footer"></div>
</div>
</div>