index.html 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. {% load static %}
  2. <!DOCTYPE html>
  3. <html lang="en"> <!--begin::Head-->
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  6. <title>Upload</title><!--begin::Primary Meta Tags-->
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <meta name="title" content="AdminLTE | Dashboard v2">
  9. <meta name="author" content="ColorlibHQ">
  10. <meta name="description"
  11. content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS.">
  12. <meta name="keywords"
  13. 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">
  14. <!--end::Primary Meta Tags--><!--begin::Fonts-->
  15. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
  16. integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q=" crossorigin="anonymous">
  17. <!--end::Fonts--><!--begin::Third Party Plugin(OverlayScrollbars)-->
  18. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.3.0/styles/overlayscrollbars.min.css"
  19. integrity="sha256-dSokZseQNT08wYEWiz5iLI8QPlKxG+TswNRD8k35cpg=" crossorigin="anonymous">
  20. <!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Third Party Plugin(Bootstrap Icons)-->
  21. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.min.css"
  22. integrity="sha256-Qsx5lrStHZyR9REqhUF8iQt73X06c8LGIUPzpOhwRrI=" crossorigin="anonymous">
  23. <!--end::Third Party Plugin(Bootstrap Icons)--><!--begin::Required Plugin(AdminLTE)-->
  24. <link rel="stylesheet" href="{% static './css/adminlte.css' %}"><!--end::Required Plugin(AdminLTE)--><!-- apexcharts -->
  25. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/apexcharts@3.37.1/dist/apexcharts.css"
  26. integrity="sha256-4MX+61mt9NVvvuPjUWdUdyfZfxSB1/Rf9WtqRHgG5S0=" crossorigin="anonymous">
  27. <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
  28. <link rel="stylesheet" href="{% static './css/select2-bootstrap4.min.css' %}">
  29. <link rel="stylesheet" href="{% static './css/custom.css' %}">
  30. <style>
  31. .select2-container .select2-search--inline .select2-search__field {
  32. position: absolute;
  33. top: 3px;
  34. font-size: 14px;
  35. }
  36. </style>
  37. <style>
  38. #full-page-loader {
  39. position: fixed;
  40. top: 0;
  41. left: 0;
  42. width: 100%;
  43. height: 100%;
  44. background-color: rgba(0, 0, 0, 0.6); /* semi-transparent black */
  45. z-index: 9999;
  46. display: flex;
  47. justify-content: center;
  48. align-items: center;
  49. }
  50. .loader-overlay .spinner-border {
  51. width: 3rem;
  52. height: 3rem;
  53. }
  54. </style>
  55. </head>
  56. <body class="layout-fixed sidebar-expand-lg sidebar-mini app-loaded sidebar-collapse">
  57. <!--begin::App Wrapper-->
  58. <div class="app-wrapper"> <!--begin::Header-->
  59. <nav class="app-header navbar navbar-expand bg-body"> <!--begin::Container-->
  60. <div class="container-fluid"> <!--begin::Start Navbar Links-->
  61. <ul class="navbar-nav">
  62. <li class="nav-item"> <a class="nav-link" data-lte-toggle="sidebar" href="#" role="button"> <i
  63. class="bi bi-list"></i> </a> </li>
  64. <li class="nav-item d-none d-md-block"> <a href="{% url 'file-upload' %}" class="nav-link">Home</a> </li>
  65. <!-- <li class="nav-item d-none d-md-block"> <a href="#" class="nav-link">Contact</a> </li> -->
  66. </ul> <!--end::Start Navbar Links--> <!--begin::End Navbar Links-->
  67. <ul class="navbar-nav ms-auto"> <!--begin::Navbar Search-->
  68. <!-- <li class="nav-item"> <a class="nav-link" data-widget="navbar-search" href="search.html"
  69. role="button"> <i class="bi bi-search"></i> </a> </li>
  70. <li class="nav-item dropdown"> <a class="nav-link" data-bs-toggle="dropdown" href="#"> <i
  71. class="bi bi-bell-fill"></i> <span class="navbar-badge badge text-bg-warning">15</span>
  72. </a>
  73. <div class="dropdown-menu dropdown-menu-lg dropdown-menu-end"> <span
  74. class="dropdown-item dropdown-header">3 Notifications</span>
  75. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
  76. class="bi bi-people-fill me-2"></i> filename_22_09_2024.xml is ready for review.
  77. <span class="float-end text-secondary fs-7">1 hours</span> </a>
  78. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
  79. class="bi bi-people-fill me-2"></i> filename_22_09_2024.xml is uploaded
  80. successfully.
  81. <span class="float-end text-secondary fs-7">12 hours</span> </a>
  82. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
  83. class="bi bi-file-earmark-fill me-2"></i> filename_12_09_2024.xml is uploaded
  84. successfully.
  85. <span class="float-end text-secondary fs-7">2 days</span> </a>
  86. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item dropdown-footer">
  87. See All Notifications
  88. </a>
  89. </div>
  90. </li> -->
  91. <li class="nav-item"> <a class="nav-link" href="#" data-lte-toggle="fullscreen"> <i
  92. data-lte-icon="maximize" class="bi bi-arrows-fullscreen"></i> <i
  93. data-lte-icon="minimize" class="bi bi-fullscreen-exit" style="display: none;"></i> </a>
  94. </li> <!--end::Fullscreen Toggle--> <!--begin::User Menu Dropdown-->
  95. <li class="nav-item dropdown user-menu"> <a href="#" class="nav-link dropdown-toggle"
  96. data-bs-toggle="dropdown"> <img src="{% static './images/user2-160x160.jpg' %}"
  97. class="user-image rounded-circle shadow" alt="User Image"> <span
  98. class="d-none d-md-inline">{{ request.session.user_email }}</span> </a>
  99. <ul class="dropdown-menu dropdown-menu-lg dropdown-menu-end"> <!--begin::User Image-->
  100. <li class="user-header text-bg-secondary"> <img src="{% static './images/user2-160x160.jpg' %}"
  101. class="rounded-circle shadow" alt="User Image">
  102. <p>
  103. {{ request.session.user_email }} - Admin
  104. <!-- <small>Since Nov. 2023</small> -->
  105. </p>
  106. </li> <!--end::User Image--> <!--begin::Menu Body-->
  107. <li class="user-footer"> <a href="#" class="btn btn-default btn-flat">Profile</a> <a
  108. href="{% url 'logout' %}" class="btn btn-default btn-flat float-end">Sign out</a> </li>
  109. <!--end::Menu Footer-->
  110. </ul>
  111. </li> <!--end::User Menu Dropdown-->
  112. </ul> <!--end::End Navbar Links-->
  113. </div> <!--end::Container-->
  114. </nav> <!--end::Header--> <!--begin::Sidebar-->
  115. <aside class="app-sidebar shadow"> <!--begin::Sidebar Brand-->
  116. <div class="sidebar-brand"> <!--begin::Brand Link--> <a href="{% url 'file-upload' %}" class="brand-link">
  117. <!--begin::Brand Image--> <img src="{% static './images/logo-mini.png' %}" alt="Lumina Datamatics"
  118. class="brand-image logo-mini"> <!--end::Brand Image--> <!--begin::Brand Text--> <span
  119. class="brand-text fw-light" style="position:relative; left: -40px;"><img
  120. src="{% static './images/logo.png' %}" alt="Lumina Datamatics" class="brand-image"></span>
  121. <!--end::Brand Text--> </a>
  122. <!--end::Brand Link-->
  123. </div> <!--end::Sidebar Brand--> <!--begin::Sidebar Wrapper-->
  124. <div class="sidebar-wrapper">
  125. <nav class="mt-2"> <!--begin::Sidebar Menu-->
  126. <ul class="nav sidebar-menu flex-column" data-lte-toggle="treeview" role="menu"
  127. data-accordion="false">
  128. <li class="nav-item"> <a href="{% url 'file-upload' %}" class="nav-link active"> <i
  129. class="nav-icon bi bi-upload"></i>
  130. <p>Upload</p>
  131. </a> </li>
  132. <li class="nav-item"> <a href="{% url 'tool-check' %}" class="nav-link"> <i
  133. class="nav-icon bi bi-house"></i>
  134. <p>Home</p>
  135. </a> </li>
  136. </ul> <!--end::Sidebar Menu-->
  137. </nav>
  138. </div> <!--end::Sidebar Wrapper-->
  139. </aside> <!--end::Sidebar--> <!--begin::App Main-->
  140. <main class="app-main"> <!--begin::App Content Header-->
  141. <div class="app-content-header"> <!--begin::Container-->
  142. <div class="container-fluid"> <!--begin::Row-->
  143. <div class="row">
  144. <div class="col-sm-6">
  145. <h3 class="mb-0">Upload</h3>
  146. </div>
  147. <div class="col-sm-6">
  148. <ol class="breadcrumb float-sm-end">
  149. <li class="breadcrumb-item"><a href="{% url 'file-upload' %}">Home</a></li>
  150. <li class="breadcrumb-item active" aria-current="page"><a href="{% url 'tool-check' %}"></a>
  151. Upload</a>
  152. </li>
  153. </ol>
  154. </div>
  155. </div> <!--end::Row-->
  156. </div> <!--end::Container-->
  157. </div>
  158. <div class="app-content"> <!--begin::Container-->
  159. <div class="container-fluid"> <!-- Info boxes -->
  160. <div id="full-page-loader" style="display: none;">
  161. <div class="loader-overlay">
  162. <div class="spinner-border text-light" role="status">
  163. <!-- <span class="sr-only">Loading...</span> -->
  164. </div>
  165. </div>
  166. </div>
  167. <div class="row">
  168. <div class="col-md-12">
  169. <div class="card mb-4">
  170. <div class="card-header">
  171. <h5 class="card-title">Upload</h5>
  172. <!-- <a href="#" class="btn btn-sm btn-primary float-sm-end me-2">Download Template</a> -->
  173. </div> <!-- /.card-header -->
  174. <div class="card-body p-0">
  175. <!-- {% if success %}
  176. <div class="alert alert-success mt-3">
  177. File uploaded successfully! {{ file_url }}View File</a>
  178. </div>
  179. {% endif %} -->
  180. <form id="uploadForm" method="POST" enctype="multipart/form-data"> <!--begin::Body-->
  181. {% csrf_token %}
  182. <div class="card-body">
  183. <div class="form-group row mb-3">
  184. <label for="file" class="col-sm-2 col-form-label">Select Input
  185. File <span class="text-danger">*</span></label>
  186. <div class="col-sm-6">
  187. <div class="input-group mb-3">
  188. <input type="file" class="form-control"
  189. id="fileInput" name="file" required
  190. >
  191. <!-- onchange="enableSubmitButton()" -->
  192. <!-- <input type="file"
  193. onchange="$(this).parents('.form-group').next().removeClass('d-none')"
  194. class="form-control" id="file" required>
  195. </div> -->
  196. </div>
  197. </div>
  198. <div class="form-group row mb-3 ">
  199. <label for="file" class="col-sm-2 col-form-label"></label>
  200. <div class="col-sm-6">
  201. <button type="submit" class="btn btn-primary" id="submitBtn" disabled>Upload</button>
  202. </div>
  203. </div>
  204. </div>
  205. </form>
  206. <div id="responseMessage" class="mt-3"></div>
  207. </div>
  208. </div> <!-- /.card -->
  209. </div> <!-- /.col -->
  210. </div> <!--end::Row--> <!--begin::Row-->
  211. </div> <!--end::Container-->
  212. </div> <!--end::App Content-->
  213. </main> <!--end::App Main--> <!--begin::Footer-->
  214. <footer class="app-footer"> <!--begin::To the end-->
  215. <!-- <div class="float-end d-none d-sm-inline">Anything you want</div>--> <!--end::To the end-->
  216. <!--begin::Copyright--> <strong>
  217. Copyright &copy; 2014-2025&nbsp;
  218. <a href="https://www.luminadatamatics.com/" target="_blank" class="text-decoration-none">Lumina
  219. Datamatics LTD</a>.
  220. </strong>
  221. All rights reserved.
  222. <!--end::Copyright-->
  223. </footer> <!--end::Footer-->
  224. </div> <!--end::App Wrapper--> <!--begin::Script--> <!--begin::Third Party Plugin(OverlayScrollbars)-->
  225. <script src="https://code.jquery.com/jquery-3.7.1.min.js"
  226. integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
  227. <script src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.3.0/browser/overlayscrollbars.browser.es6.min.js"
  228. integrity="sha256-H2VM7BKda+v2Z4+DRy69uknwxjyDRhszjXFhsL4gD3w=" crossorigin="anonymous"></script>
  229. <!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Required Plugin(popperjs for Bootstrap 5)-->
  230. <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
  231. integrity="sha256-whL0tQWoY1Ku1iskqPFvmZ+CHsvmRWx/PIoEvIeWh4I=" crossorigin="anonymous"></script>
  232. <!--end::Required Plugin(popperjs for Bootstrap 5)--><!--begin::Required Plugin(Bootstrap 5)-->
  233. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js"
  234. integrity="sha256-YMa+wAM6QkVyz999odX7lPRxkoYAan8suedu4k2Zur8=" crossorigin="anonymous"></script>
  235. <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
  236. <!--end::Required Plugin(Bootstrap 5)--><!--begin::Required Plugin(AdminLTE)-->
  237. <script src="{% static './js/adminlte.js' %}"></script>
  238. <!--end::Required Plugin(AdminLTE)--><!--begin::OverlayScrollbars Configure-->
  239. <script>
  240. const SELECTOR_SIDEBAR_WRAPPER = ".sidebar-wrapper";
  241. const Default = {
  242. scrollbarTheme: "os-theme-light",
  243. scrollbarAutoHide: "leave",
  244. scrollbarClickScroll: true,
  245. };
  246. document.addEventListener("DOMContentLoaded", function () {
  247. const sidebarWrapper = document.querySelector(SELECTOR_SIDEBAR_WRAPPER);
  248. if (
  249. sidebarWrapper &&
  250. typeof OverlayScrollbarsGlobal?.OverlayScrollbars !== "undefined"
  251. ) {
  252. OverlayScrollbarsGlobal.OverlayScrollbars(sidebarWrapper, {
  253. scrollbars: {
  254. theme: Default.scrollbarTheme,
  255. autoHide: Default.scrollbarAutoHide,
  256. clickScroll: Default.scrollbarClickScroll,
  257. },
  258. });
  259. }
  260. });
  261. $(document).ready(function () {
  262. $('.select2').select2({
  263. theme: 'bootstrap4',
  264. placeholder: 'Select Competitors'
  265. });
  266. });
  267. //$('#myForm').on('submit', function (e) {
  268. // e.preventDefault(); //stop submit
  269. // if ($('#file').val() != "") {
  270. // //Check if checkbox is checked then show modal
  271. // $('#myModal').modal('show');
  272. // }
  273. //});
  274. </script> <!--end::OverlayScrollbars Configure--> <!-- OPTIONAL SCRIPTS --> <!-- apexcharts -->
  275. <script src="https://cdn.jsdelivr.net/npm/apexcharts@3.37.1/dist/apexcharts.min.js"
  276. integrity="sha256-+vh8GkaU7C9/wbSLIcwq82tQ2wTf44aOHA8HlBMwRI8=" crossorigin="anonymous"></script>
  277. <!-- <script>
  278. function enableSubmitButton() {
  279. const fileInput = document.getElementById('fileInput');
  280. const submitBtn = document.getElementById('submitBtn');
  281. if (fileInput.files.length > 0) {
  282. submitBtn.disabled = false;
  283. } else {
  284. submitBtn.disabled = true;
  285. }
  286. }
  287. </script> -->
  288. <script>
  289. document.addEventListener('DOMContentLoaded', function () {
  290. const form = document.getElementById('uploadForm');
  291. const fileInput = document.getElementById('fileInput');
  292. const submitBtn = document.getElementById('submitBtn');
  293. const responseDiv = document.getElementById('responseMessage');
  294. // Enable submit button when file is selected
  295. fileInput.addEventListener('change', function () {
  296. submitBtn.disabled = fileInput.files.length === 0;
  297. });
  298. // Handle form submission
  299. form.addEventListener('submit', function (e) {
  300. e.preventDefault();
  301. $('#full-page-loader').show();
  302. // Disable button during upload
  303. submitBtn.disabled = true;
  304. submitBtn.textContent = 'Uploading...';
  305. const formData = new FormData(form);
  306. fetch('/core/api/upload-rules/', {
  307. method: 'POST',
  308. body: formData,
  309. headers: {
  310. 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
  311. }
  312. })
  313. .then(response => response.json())
  314. .then(data => {
  315. if (data.success) {
  316. responseDiv.innerHTML = `<div class="alert alert-success">✅ ${data.message}</div>`;
  317. fileInput.value = ''; // Clear file input
  318. submitBtn.disabled = true; // Keep disabled until new file selected
  319. $('#full-page-loader').hide();
  320. } else {
  321. responseDiv.innerHTML = `<div class="alert alert-danger">❌ ${data.error}</div>`;
  322. submitBtn.disabled = false;
  323. $('#full-page-loader').hide();
  324. }
  325. })
  326. .catch(error => {
  327. responseDiv.innerHTML = `<div class="alert alert-danger">❌ Upload failed: ${error}</div>`;
  328. submitBtn.disabled = false;
  329. $('#full-page-loader').hide();
  330. })
  331. .finally(() => {
  332. submitBtn.textContent = 'Upload';
  333. $('#full-page-loader').hide();
  334. // Remove message after 5 seconds
  335. setTimeout(() => {
  336. responseDiv.innerHTML = '';
  337. window.location.href = "/tool-check";
  338. }, 3000);
  339. });
  340. });
  341. });
  342. </script>
  343. <!-- <script>
  344. function enableSubmitButton() {
  345. const fileInput = document.getElementById('fileInput');
  346. const submitBtn = document.getElementById('submitBtn');
  347. submitBtn.disabled = fileInput.files.length === 0;
  348. }
  349. document.addEventListener('DOMContentLoaded', function () {
  350. const form = document.getElementById('uploadForm');
  351. form.addEventListener('submit', function(e) {
  352. e.preventDefault(); // prevent default form submission
  353. const form = e.target;
  354. const formData = new FormData(form);
  355. const responseDiv = document.getElementById('responseMessage');
  356. fetch('/core/api/upload-rules/', {
  357. method: 'POST',
  358. body: formData,
  359. headers: {
  360. 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
  361. }
  362. })
  363. .then(response => response.json())
  364. .then(data => {
  365. if (data.success) {
  366. responseDiv.innerHTML = `<div class="alert alert-success">✅ ${data.message}</div>`;
  367. } else {
  368. responseDiv.innerHTML = `<div class="alert alert-danger">❌ ${data.error}</div>`;
  369. }
  370. })
  371. .catch(error => {
  372. responseDiv.innerHTML = `<div class="alert alert-danger">❌ Upload failed: ${error}</div>`;
  373. });
  374. });
  375. });
  376. </script> -->
  377. </body><!--end::Body-->
  378. </html>