Fixes 404 errors for CSS/JS when served behind IIS reverse proxy with /gomag prefix. Replaces hardcoded /static/ paths with request.url_for() and nav links with request.scope root_path prefix. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
159 lines
8.2 KiB
HTML
159 lines
8.2 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Mapari SKU - GoMag Import{% endblock %}
|
|
{% block nav_mappings %}active{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h4 class="mb-0">Mapari SKU</h4>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<!-- Desktop buttons -->
|
|
<button class="btn btn-sm btn-outline-secondary d-none d-md-inline-flex" onclick="downloadTemplate()"><i class="bi bi-file-earmark-arrow-down"></i> Template CSV</button>
|
|
<button class="btn btn-sm btn-outline-secondary d-none d-md-inline-flex" onclick="exportCsv()"><i class="bi bi-download"></i> Export CSV</button>
|
|
<button class="btn btn-sm btn-outline-primary d-none d-md-inline-flex" data-bs-toggle="modal" data-bs-target="#importModal"><i class="bi bi-upload"></i> Import CSV</button>
|
|
<button class="btn btn-sm btn-primary" onclick="showInlineAddRow()"><i class="bi bi-plus-lg"></i> <span class="d-none d-md-inline">Adauga Mapare</span><span class="d-md-none">Mapare</span></button>
|
|
<button class="btn btn-sm btn-outline-secondary d-none d-md-inline-flex" data-bs-toggle="modal" data-bs-target="#addModal"><i class="bi bi-box-arrow-up-right"></i> Formular complet</button>
|
|
<!-- Mobile ⋯ dropdown -->
|
|
<div class="dropdown d-md-none">
|
|
<button class="btn btn-sm btn-outline-secondary" type="button" data-bs-toggle="dropdown" aria-expanded="false"><i class="bi bi-three-dots-vertical"></i></button>
|
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
<li><a class="dropdown-item" href="#" onclick="downloadTemplate();return false"><i class="bi bi-file-earmark-arrow-down me-1"></i> Template CSV</a></li>
|
|
<li><a class="dropdown-item" href="#" onclick="exportCsv();return false"><i class="bi bi-download me-1"></i> Export CSV</a></li>
|
|
<li><a class="dropdown-item" href="#" data-bs-toggle="modal" data-bs-target="#importModal"><i class="bi bi-upload me-1"></i> Import CSV</a></li>
|
|
<li><a class="dropdown-item" href="#" data-bs-toggle="modal" data-bs-target="#addModal"><i class="bi bi-box-arrow-up-right me-1"></i> Formular complet</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Search -->
|
|
<div class="card mb-3">
|
|
<div class="card-body py-2">
|
|
<div class="input-group">
|
|
<span class="input-group-text"><i class="bi bi-search"></i></span>
|
|
<input type="text" class="form-control" id="searchInput" placeholder="Cauta SKU, CODMAT sau denumire..." oninput="debounceSearch()">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Filter controls -->
|
|
<div class="d-flex align-items-center mb-3 gap-3">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" id="showInactive" onchange="loadMappings()">
|
|
<label class="form-check-label" for="showInactive">Arata inactive</label>
|
|
</div>
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" id="showDeleted" onchange="loadMappings()">
|
|
<label class="form-check-label" for="showDeleted">Arata sterse</label>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Percentage filter pills -->
|
|
<div class="filter-bar" id="mappingsFilterBar">
|
|
<button class="filter-pill active d-none d-md-inline-flex" data-pct="all">Toate <span class="filter-count fc-neutral" id="mCntAll">0</span></button>
|
|
<button class="filter-pill d-none d-md-inline-flex" data-pct="complete">Complete <span class="filter-count fc-green" id="mCntComplete">0</span></button>
|
|
<button class="filter-pill d-none d-md-inline-flex" data-pct="incomplete">Incomplete <span class="filter-count fc-yellow" id="mCntIncomplete">0</span></button>
|
|
</div>
|
|
<div class="d-md-none mb-2" id="mappingsMobileSeg"></div>
|
|
|
|
<!-- Top pagination -->
|
|
<div id="mappingsPagTop" class="pag-strip"></div>
|
|
|
|
<!-- Flat-row list (unified desktop + mobile) -->
|
|
<div class="card">
|
|
<div class="card-body p-0">
|
|
<div id="mappingsFlatList" class="mappings-flat-list">
|
|
<div class="flat-row text-muted py-4 justify-content-center">Se incarca...</div>
|
|
</div>
|
|
</div>
|
|
<div id="mappingsPagBottom" class="pag-strip pag-strip-bottom"></div>
|
|
</div>
|
|
|
|
<!-- Add/Edit Modal with multi-CODMAT support (R11) -->
|
|
<div class="modal fade" id="addModal" tabindex="-1">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="addModalTitle">Adauga Mapare</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="mb-3">
|
|
<label class="form-label">SKU</label>
|
|
<input type="text" class="form-control" id="inputSku" placeholder="Ex: 8714858124284">
|
|
</div>
|
|
<div class="mb-2" id="addModalProductName" style="display:none;">
|
|
<small class="text-muted">Produs web:</small> <strong id="inputProductName"></strong>
|
|
</div>
|
|
<hr>
|
|
<div id="codmatLines">
|
|
<!-- Dynamic CODMAT lines will be added here -->
|
|
</div>
|
|
<button type="button" class="btn btn-sm btn-outline-secondary mt-2" onclick="addCodmatLine()">
|
|
<i class="bi bi-plus"></i> Adauga CODMAT
|
|
</button>
|
|
<div id="pctWarning" class="text-danger mt-2" style="display:none;"></div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuleaza</button>
|
|
<button type="button" class="btn btn-primary" onclick="saveMapping()">Salveaza</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Import CSV Modal -->
|
|
<div class="modal fade" id="importModal" tabindex="-1">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Import CSV</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<p class="text-muted small">Format CSV: sku, codmat, cantitate_roa, procent_pret</p>
|
|
<input type="file" class="form-control" id="csvFile" accept=".csv">
|
|
<div id="importResult" class="mt-3"></div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Inchide</button>
|
|
<button type="button" class="btn btn-primary" onclick="importCsv()">Import</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- Delete Confirmation Modal -->
|
|
<div class="modal fade" id="deleteConfirmModal" tabindex="-1">
|
|
<div class="modal-dialog modal-sm">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Confirmare stergere</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
Sigur vrei sa stergi maparea?<br>
|
|
SKU: <code id="deleteSkuText"></code><br>
|
|
CODMAT: <code id="deleteCodmatText"></code>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuleaza</button>
|
|
<button type="button" class="btn btn-danger" id="confirmDeleteBtn">Sterge</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Toast container for undo actions -->
|
|
<div class="toast-container position-fixed bottom-0 end-0 p-3" style="z-index:1080">
|
|
<div id="undoToast" class="toast" role="alert" data-bs-autohide="true" data-bs-delay="5000">
|
|
<div class="toast-body d-flex align-items-center gap-2">
|
|
<span id="toastMessage"></span>
|
|
<button class="btn btn-sm btn-outline-primary ms-auto" id="toastUndoBtn">Anuleaza</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block scripts %}
|
|
<script src="{{ request.url_for('static', path='js/mappings.js') }}?v=7"></script>
|
|
{% endblock %}
|