|
@@ -6,13 +6,7 @@
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
|
<title>Upload</title><!--begin::Primary Meta Tags-->
|
|
<title>Upload</title><!--begin::Primary Meta Tags-->
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
- <meta name="title" content="AdminLTE | Dashboard v2">
|
|
|
|
|
- <meta name="author" content="ColorlibHQ">
|
|
|
|
|
- <meta name="description"
|
|
|
|
|
- content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS.">
|
|
|
|
|
- <meta name="keywords"
|
|
|
|
|
- content="bootstrap 5, bootstrap, bootstrap 5 admin dashboard, bootstrap 5 dashboard, bootstrap 5 charts, bootstrap 5 calendar, bootstrap 5 datepicker, bootstrap 5 tables, bootstrap 5 datatable, vanilla js datatable, colorlibhq, colorlibhq dashboard, colorlibhq admin dashboard">
|
|
|
|
|
- <!--end::Primary Meta Tags--><!--begin::Fonts-->
|
|
|
|
|
|
|
+ <meta name="title" content="CQT | Upload">
|
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
|
|
|
integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q=" crossorigin="anonymous">
|
|
integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q=" crossorigin="anonymous">
|
|
|
<!--end::Fonts--><!--begin::Third Party Plugin(OverlayScrollbars)-->
|
|
<!--end::Fonts--><!--begin::Third Party Plugin(OverlayScrollbars)-->
|
|
@@ -34,8 +28,6 @@
|
|
|
top: 3px;
|
|
top: 3px;
|
|
|
font-size: 14px;
|
|
font-size: 14px;
|
|
|
}
|
|
}
|
|
|
- </style>
|
|
|
|
|
- <style>
|
|
|
|
|
#full-page-loader {
|
|
#full-page-loader {
|
|
|
position: fixed;
|
|
position: fixed;
|
|
|
top: 0;
|
|
top: 0;
|
|
@@ -60,90 +52,8 @@
|
|
|
<body class="layout-fixed sidebar-expand-lg sidebar-mini app-loaded sidebar-collapse">
|
|
<body class="layout-fixed sidebar-expand-lg sidebar-mini app-loaded sidebar-collapse">
|
|
|
<!--begin::App Wrapper-->
|
|
<!--begin::App Wrapper-->
|
|
|
<div class="app-wrapper"> <!--begin::Header-->
|
|
<div class="app-wrapper"> <!--begin::Header-->
|
|
|
- <nav class="app-header navbar navbar-expand bg-body"> <!--begin::Container-->
|
|
|
|
|
- <div class="container-fluid"> <!--begin::Start Navbar Links-->
|
|
|
|
|
- <ul class="navbar-nav">
|
|
|
|
|
- <li class="nav-item"> <a class="nav-link" data-lte-toggle="sidebar" href="#" role="button"> <i
|
|
|
|
|
- class="bi bi-list"></i> </a> </li>
|
|
|
|
|
- <li class="nav-item d-none d-md-block"> <a href="{% url 'file-upload' %}" class="nav-link">Home</a> </li>
|
|
|
|
|
- <!-- <li class="nav-item d-none d-md-block"> <a href="#" class="nav-link">Contact</a> </li> -->
|
|
|
|
|
- </ul> <!--end::Start Navbar Links--> <!--begin::End Navbar Links-->
|
|
|
|
|
- <ul class="navbar-nav ms-auto"> <!--begin::Navbar Search-->
|
|
|
|
|
- <!-- <li class="nav-item"> <a class="nav-link" data-widget="navbar-search" href="search.html"
|
|
|
|
|
- role="button"> <i class="bi bi-search"></i> </a> </li>
|
|
|
|
|
-
|
|
|
|
|
- <li class="nav-item dropdown"> <a class="nav-link" data-bs-toggle="dropdown" href="#"> <i
|
|
|
|
|
- class="bi bi-bell-fill"></i> <span class="navbar-badge badge text-bg-warning">15</span>
|
|
|
|
|
- </a>
|
|
|
|
|
- <div class="dropdown-menu dropdown-menu-lg dropdown-menu-end"> <span
|
|
|
|
|
- class="dropdown-item dropdown-header">3 Notifications</span>
|
|
|
|
|
- <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
|
|
|
|
|
- class="bi bi-people-fill me-2"></i> filename_22_09_2024.xml is ready for review.
|
|
|
|
|
- <span class="float-end text-secondary fs-7">1 hours</span> </a>
|
|
|
|
|
- <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
|
|
|
|
|
- class="bi bi-people-fill me-2"></i> filename_22_09_2024.xml is uploaded
|
|
|
|
|
- successfully.
|
|
|
|
|
- <span class="float-end text-secondary fs-7">12 hours</span> </a>
|
|
|
|
|
- <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
|
|
|
|
|
- class="bi bi-file-earmark-fill me-2"></i> filename_12_09_2024.xml is uploaded
|
|
|
|
|
- successfully.
|
|
|
|
|
- <span class="float-end text-secondary fs-7">2 days</span> </a>
|
|
|
|
|
- <div class="dropdown-divider"></div> <a href="#" class="dropdown-item dropdown-footer">
|
|
|
|
|
- See All Notifications
|
|
|
|
|
- </a>
|
|
|
|
|
- </div>
|
|
|
|
|
- </li> -->
|
|
|
|
|
- <li class="nav-item"> <a class="nav-link" href="#" data-lte-toggle="fullscreen"> <i
|
|
|
|
|
- data-lte-icon="maximize" class="bi bi-arrows-fullscreen"></i> <i
|
|
|
|
|
- data-lte-icon="minimize" class="bi bi-fullscreen-exit" style="display: none;"></i> </a>
|
|
|
|
|
- </li> <!--end::Fullscreen Toggle--> <!--begin::User Menu Dropdown-->
|
|
|
|
|
- <li class="nav-item dropdown user-menu"> <a href="#" class="nav-link dropdown-toggle"
|
|
|
|
|
- data-bs-toggle="dropdown"> <img src="{% static './images/user2-160x160.jpg' %}"
|
|
|
|
|
- class="user-image rounded-circle shadow" alt="User Image"> <span
|
|
|
|
|
- class="d-none d-md-inline">{{ request.session.user_email }}</span> </a>
|
|
|
|
|
- <ul class="dropdown-menu dropdown-menu-lg dropdown-menu-end"> <!--begin::User Image-->
|
|
|
|
|
- <li class="user-header text-bg-secondary"> <img src="{% static './images/user2-160x160.jpg' %}"
|
|
|
|
|
- class="rounded-circle shadow" alt="User Image">
|
|
|
|
|
- <p>
|
|
|
|
|
- {{ request.session.user_email }} - Admin
|
|
|
|
|
- <!-- <small>Since Nov. 2023</small> -->
|
|
|
|
|
- </p>
|
|
|
|
|
- </li> <!--end::User Image--> <!--begin::Menu Body-->
|
|
|
|
|
-
|
|
|
|
|
- <li class="user-footer"> <a href="#" class="btn btn-default btn-flat">Profile</a> <a
|
|
|
|
|
- href="{% url 'logout' %}" class="btn btn-default btn-flat float-end">Sign out</a> </li>
|
|
|
|
|
- <!--end::Menu Footer-->
|
|
|
|
|
- </ul>
|
|
|
|
|
- </li> <!--end::User Menu Dropdown-->
|
|
|
|
|
- </ul> <!--end::End Navbar Links-->
|
|
|
|
|
- </div> <!--end::Container-->
|
|
|
|
|
- </nav> <!--end::Header--> <!--begin::Sidebar-->
|
|
|
|
|
- <aside class="app-sidebar shadow"> <!--begin::Sidebar Brand-->
|
|
|
|
|
- <div class="sidebar-brand"> <!--begin::Brand Link--> <a href="{% url 'file-upload' %}" class="brand-link">
|
|
|
|
|
- <!--begin::Brand Image--> <img src="{% static './images/logo-mini.png' %}" alt="Lumina Datamatics"
|
|
|
|
|
- class="brand-image logo-mini"> <!--end::Brand Image--> <!--begin::Brand Text--> <span
|
|
|
|
|
- class="brand-text fw-light" style="position:relative; left: -40px;"><img
|
|
|
|
|
- src="{% static './images/logo.png' %}" alt="Lumina Datamatics" class="brand-image"></span>
|
|
|
|
|
- <!--end::Brand Text--> </a>
|
|
|
|
|
- <!--end::Brand Link-->
|
|
|
|
|
- </div> <!--end::Sidebar Brand--> <!--begin::Sidebar Wrapper-->
|
|
|
|
|
- <div class="sidebar-wrapper">
|
|
|
|
|
- <nav class="mt-2"> <!--begin::Sidebar Menu-->
|
|
|
|
|
- <ul class="nav sidebar-menu flex-column" data-lte-toggle="treeview" role="menu"
|
|
|
|
|
- data-accordion="false">
|
|
|
|
|
- <li class="nav-item"> <a href="{% url 'file-upload' %}" class="nav-link active"> <i
|
|
|
|
|
- class="nav-icon bi bi-upload"></i>
|
|
|
|
|
- <p>Upload</p>
|
|
|
|
|
- </a> </li>
|
|
|
|
|
- <li class="nav-item"> <a href="{% url 'tool-check' %}" class="nav-link"> <i
|
|
|
|
|
- class="nav-icon bi bi-house"></i>
|
|
|
|
|
- <p>Home</p>
|
|
|
|
|
- </a> </li>
|
|
|
|
|
-
|
|
|
|
|
- </ul> <!--end::Sidebar Menu-->
|
|
|
|
|
- </nav>
|
|
|
|
|
- </div> <!--end::Sidebar Wrapper-->
|
|
|
|
|
- </aside> <!--end::Sidebar--> <!--begin::App Main-->
|
|
|
|
|
|
|
+ {% include 'header.html' %}
|
|
|
|
|
+ {% include 'sidebar.html' %}
|
|
|
<main class="app-main"> <!--begin::App Content Header-->
|
|
<main class="app-main"> <!--begin::App Content Header-->
|
|
|
<div class="app-content-header"> <!--begin::Container-->
|
|
<div class="app-content-header"> <!--begin::Container-->
|
|
|
<div class="container-fluid"> <!--begin::Row-->
|
|
<div class="container-fluid"> <!--begin::Row-->
|
|
@@ -224,17 +134,9 @@
|
|
|
</div> <!--end::Container-->
|
|
</div> <!--end::Container-->
|
|
|
</div> <!--end::App Content-->
|
|
</div> <!--end::App Content-->
|
|
|
</main> <!--end::App Main--> <!--begin::Footer-->
|
|
</main> <!--end::App Main--> <!--begin::Footer-->
|
|
|
- <footer class="app-footer"> <!--begin::To the end-->
|
|
|
|
|
- <!-- <div class="float-end d-none d-sm-inline">Anything you want</div>--> <!--end::To the end-->
|
|
|
|
|
- <!--begin::Copyright--> <strong>
|
|
|
|
|
- Copyright © 2014-2025
|
|
|
|
|
- <a href="https://www.luminadatamatics.com/" target="_blank" class="text-decoration-none">Lumina
|
|
|
|
|
- Datamatics LTD</a>.
|
|
|
|
|
- </strong>
|
|
|
|
|
- All rights reserved.
|
|
|
|
|
- <!--end::Copyright-->
|
|
|
|
|
- </footer> <!--end::Footer-->
|
|
|
|
|
- </div> <!--end::App Wrapper--> <!--begin::Script--> <!--begin::Third Party Plugin(OverlayScrollbars)-->
|
|
|
|
|
|
|
+ {% include 'footer.html' %}
|
|
|
|
|
+
|
|
|
|
|
+ </div>
|
|
|
<script src="https://code.jquery.com/jquery-3.7.1.min.js"
|
|
<script src="https://code.jquery.com/jquery-3.7.1.min.js"
|
|
|
integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
|
|
integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
|
|
|
<script src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.3.0/browser/overlayscrollbars.browser.es6.min.js"
|
|
<script src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.3.0/browser/overlayscrollbars.browser.es6.min.js"
|
|
@@ -277,110 +179,30 @@
|
|
|
placeholder: 'Select Competitors'
|
|
placeholder: 'Select Competitors'
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
-
|
|
|
|
|
- //$('#myForm').on('submit', function (e) {
|
|
|
|
|
- // e.preventDefault(); //stop submit
|
|
|
|
|
-
|
|
|
|
|
- // if ($('#file').val() != "") {
|
|
|
|
|
- // //Check if checkbox is checked then show modal
|
|
|
|
|
- // $('#myModal').modal('show');
|
|
|
|
|
- // }
|
|
|
|
|
- //});
|
|
|
|
|
</script> <!--end::OverlayScrollbars Configure--> <!-- OPTIONAL SCRIPTS --> <!-- apexcharts -->
|
|
</script> <!--end::OverlayScrollbars Configure--> <!-- OPTIONAL SCRIPTS --> <!-- apexcharts -->
|
|
|
<script src="https://cdn.jsdelivr.net/npm/apexcharts@3.37.1/dist/apexcharts.min.js"
|
|
<script src="https://cdn.jsdelivr.net/npm/apexcharts@3.37.1/dist/apexcharts.min.js"
|
|
|
integrity="sha256-+vh8GkaU7C9/wbSLIcwq82tQ2wTf44aOHA8HlBMwRI8=" crossorigin="anonymous"></script>
|
|
integrity="sha256-+vh8GkaU7C9/wbSLIcwq82tQ2wTf44aOHA8HlBMwRI8=" crossorigin="anonymous"></script>
|
|
|
-
|
|
|
|
|
- <!-- <script>
|
|
|
|
|
- function enableSubmitButton() {
|
|
|
|
|
|
|
+ <script>
|
|
|
|
|
+ document.addEventListener('DOMContentLoaded', function () {
|
|
|
|
|
+ const form = document.getElementById('uploadForm');
|
|
|
const fileInput = document.getElementById('fileInput');
|
|
const fileInput = document.getElementById('fileInput');
|
|
|
const submitBtn = document.getElementById('submitBtn');
|
|
const submitBtn = document.getElementById('submitBtn');
|
|
|
|
|
+ const responseDiv = document.getElementById('responseMessage');
|
|
|
|
|
|
|
|
- if (fileInput.files.length > 0) {
|
|
|
|
|
- submitBtn.disabled = false;
|
|
|
|
|
- } else {
|
|
|
|
|
- submitBtn.disabled = true;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- </script> -->
|
|
|
|
|
-
|
|
|
|
|
- <script>
|
|
|
|
|
-document.addEventListener('DOMContentLoaded', function () {
|
|
|
|
|
- const form = document.getElementById('uploadForm');
|
|
|
|
|
- const fileInput = document.getElementById('fileInput');
|
|
|
|
|
- const submitBtn = document.getElementById('submitBtn');
|
|
|
|
|
- const responseDiv = document.getElementById('responseMessage');
|
|
|
|
|
-
|
|
|
|
|
- // Enable submit button when file is selected
|
|
|
|
|
- fileInput.addEventListener('change', function () {
|
|
|
|
|
- submitBtn.disabled = fileInput.files.length === 0;
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- // Handle form submission
|
|
|
|
|
- form.addEventListener('submit', function (e) {
|
|
|
|
|
- e.preventDefault();
|
|
|
|
|
- $('#full-page-loader').show();
|
|
|
|
|
- // Disable button during upload
|
|
|
|
|
- submitBtn.disabled = true;
|
|
|
|
|
- submitBtn.textContent = 'Uploading...';
|
|
|
|
|
-
|
|
|
|
|
- const formData = new FormData(form);
|
|
|
|
|
-
|
|
|
|
|
- fetch('/core/api/upload-rules/', {
|
|
|
|
|
- method: 'POST',
|
|
|
|
|
- body: formData,
|
|
|
|
|
- headers: {
|
|
|
|
|
- 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- .then(response => response.json())
|
|
|
|
|
- .then(data => {
|
|
|
|
|
- if (data.success) {
|
|
|
|
|
- responseDiv.innerHTML = `<div class="alert alert-success">✅ ${data.message}</div>`;
|
|
|
|
|
- fileInput.value = ''; // Clear file input
|
|
|
|
|
- submitBtn.disabled = true; // Keep disabled until new file selected
|
|
|
|
|
- $('#full-page-loader').hide();
|
|
|
|
|
- } else {
|
|
|
|
|
- responseDiv.innerHTML = `<div class="alert alert-danger">❌ ${data.error}</div>`;
|
|
|
|
|
- submitBtn.disabled = false;
|
|
|
|
|
- $('#full-page-loader').hide();
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- .catch(error => {
|
|
|
|
|
- responseDiv.innerHTML = `<div class="alert alert-danger">❌ Upload failed: ${error}</div>`;
|
|
|
|
|
- submitBtn.disabled = false;
|
|
|
|
|
- $('#full-page-loader').hide();
|
|
|
|
|
- })
|
|
|
|
|
- .finally(() => {
|
|
|
|
|
- submitBtn.textContent = 'Upload';
|
|
|
|
|
- $('#full-page-loader').hide();
|
|
|
|
|
-
|
|
|
|
|
- // Remove message after 5 seconds
|
|
|
|
|
- setTimeout(() => {
|
|
|
|
|
- responseDiv.innerHTML = '';
|
|
|
|
|
- window.location.href = "/tool-check";
|
|
|
|
|
- }, 3000);
|
|
|
|
|
- });
|
|
|
|
|
- });
|
|
|
|
|
-});
|
|
|
|
|
-</script>
|
|
|
|
|
-
|
|
|
|
|
- <!-- <script>
|
|
|
|
|
- function enableSubmitButton() {
|
|
|
|
|
- const fileInput = document.getElementById('fileInput');
|
|
|
|
|
- const submitBtn = document.getElementById('submitBtn');
|
|
|
|
|
|
|
+ // Enable submit button when file is selected
|
|
|
|
|
+ fileInput.addEventListener('change', function () {
|
|
|
submitBtn.disabled = fileInput.files.length === 0;
|
|
submitBtn.disabled = fileInput.files.length === 0;
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- document.addEventListener('DOMContentLoaded', function () {
|
|
|
|
|
-
|
|
|
|
|
- const form = document.getElementById('uploadForm');
|
|
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
- form.addEventListener('submit', function(e) {
|
|
|
|
|
- e.preventDefault(); // prevent default form submission
|
|
|
|
|
|
|
+ // Handle form submission
|
|
|
|
|
+ form.addEventListener('submit', function (e) {
|
|
|
|
|
+ e.preventDefault();
|
|
|
|
|
+ $('#full-page-loader').show();
|
|
|
|
|
+ // Disable button during upload
|
|
|
|
|
+ submitBtn.disabled = true;
|
|
|
|
|
+ submitBtn.textContent = 'Uploading...';
|
|
|
|
|
|
|
|
- const form = e.target;
|
|
|
|
|
const formData = new FormData(form);
|
|
const formData = new FormData(form);
|
|
|
- const responseDiv = document.getElementById('responseMessage');
|
|
|
|
|
|
|
|
|
|
fetch('/core/api/upload-rules/', {
|
|
fetch('/core/api/upload-rules/', {
|
|
|
method: 'POST',
|
|
method: 'POST',
|
|
@@ -393,18 +215,33 @@ document.addEventListener('DOMContentLoaded', function () {
|
|
|
.then(data => {
|
|
.then(data => {
|
|
|
if (data.success) {
|
|
if (data.success) {
|
|
|
responseDiv.innerHTML = `<div class="alert alert-success">✅ ${data.message}</div>`;
|
|
responseDiv.innerHTML = `<div class="alert alert-success">✅ ${data.message}</div>`;
|
|
|
|
|
+ fileInput.value = ''; // Clear file input
|
|
|
|
|
+ submitBtn.disabled = true; // Keep disabled until new file selected
|
|
|
|
|
+ $('#full-page-loader').hide();
|
|
|
} else {
|
|
} else {
|
|
|
responseDiv.innerHTML = `<div class="alert alert-danger">❌ ${data.error}</div>`;
|
|
responseDiv.innerHTML = `<div class="alert alert-danger">❌ ${data.error}</div>`;
|
|
|
|
|
+ submitBtn.disabled = false;
|
|
|
|
|
+ $('#full-page-loader').hide();
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
.catch(error => {
|
|
.catch(error => {
|
|
|
responseDiv.innerHTML = `<div class="alert alert-danger">❌ Upload failed: ${error}</div>`;
|
|
responseDiv.innerHTML = `<div class="alert alert-danger">❌ Upload failed: ${error}</div>`;
|
|
|
|
|
+ submitBtn.disabled = false;
|
|
|
|
|
+ $('#full-page-loader').hide();
|
|
|
|
|
+ })
|
|
|
|
|
+ .finally(() => {
|
|
|
|
|
+ submitBtn.textContent = 'Upload';
|
|
|
|
|
+ $('#full-page-loader').hide();
|
|
|
|
|
+
|
|
|
|
|
+ // Remove message after 5 seconds
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ responseDiv.innerHTML = '';
|
|
|
|
|
+ window.location.href = "/tool-check";
|
|
|
|
|
+ }, 3000);
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
-
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- </script> -->
|
|
|
|
|
|
|
+ });
|
|
|
|
|
+</script>
|
|
|
|
|
|
|
|
</body><!--end::Body-->
|
|
</body><!--end::Body-->
|
|
|
|
|
|