index.html 21 KB

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