暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

cards-actions.js 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /**
  2. * Cards Actions
  3. */
  4. 'use strict';
  5. document.addEventListener('DOMContentLoaded', function () {
  6. const collapseElementList = Array.from(document.querySelectorAll('.card-collapsible'));
  7. const expandElementList = Array.from(document.querySelectorAll('.card-expand'));
  8. const closeElementList = Array.from(document.querySelectorAll('.card-close'));
  9. const cardDnD = document.getElementById('sortable-4');
  10. // Collapsible card
  11. // --------------------------------------------------------------------
  12. collapseElementList.forEach(function (collapseElement) {
  13. collapseElement.addEventListener('click', function (event) {
  14. event.preventDefault();
  15. // Collapse the element
  16. new bootstrap.Collapse(collapseElement.closest('.card').querySelector('.collapse'));
  17. // Toggle collapsed class in `.card-header` element
  18. collapseElement.closest('.card-header').classList.toggle('collapsed');
  19. // Toggle class bx-chevron-down & bx-chevron-up
  20. Helpers._toggleClass(collapseElement.firstElementChild, 'bx-chevron-down', 'bx-chevron-up');
  21. });
  22. });
  23. // Card Toggle fullscreen
  24. // --------------------------------------------------------------------
  25. expandElementList.forEach(function (expandElement) {
  26. expandElement.addEventListener('click', function (event) {
  27. event.preventDefault();
  28. // Toggle class bx-fullscreen & bx-exit-fullscreen
  29. Helpers._toggleClass(expandElement.firstElementChild, 'bx-fullscreen', 'bx-exit-fullscreen');
  30. expandElement.closest('.card').classList.toggle('card-fullscreen');
  31. });
  32. });
  33. // Toggle fullscreen on ESC key
  34. document.addEventListener('keyup', function (event) {
  35. event.preventDefault();
  36. //Esc button
  37. if (event.key === 'Escape') {
  38. const cardFullscreen = document.querySelector('.card-fullscreen');
  39. // Toggle class bx-fullscreen & bx-exit-fullscreen
  40. if (cardFullscreen) {
  41. Helpers._toggleClass(
  42. cardFullscreen.querySelector('.card-expand').firstElementChild,
  43. 'bx-fullscreen',
  44. 'bx-exit-fullscreen'
  45. );
  46. cardFullscreen.classList.toggle('card-fullscreen');
  47. }
  48. }
  49. });
  50. // Card close
  51. // --------------------------------------------------------------------
  52. closeElementList.forEach(function (closeElement) {
  53. closeElement.addEventListener('click', function (event) {
  54. event.preventDefault();
  55. closeElement.closest('.card').classList.add('d-none');
  56. });
  57. });
  58. // Sortable.js (Drag & Drop cards)
  59. // --------------------------------------------------------------------
  60. if (cardDnD) {
  61. Sortable.create(cardDnD, {
  62. animation: 500,
  63. handle: '.card'
  64. });
  65. }
  66. // Card reload (js)
  67. // --------------------------------------------------------------------
  68. const cardReload = document.querySelectorAll('.card-reload');
  69. if (cardReload) {
  70. // Add unique data attributes to each card
  71. const cards = document.querySelectorAll('.card-action');
  72. cards.forEach((card, index) => {
  73. card.dataset.cardId = `card-${index + 1}`;
  74. });
  75. cardReload.forEach(button => {
  76. button.addEventListener('click', function (e) {
  77. e.preventDefault();
  78. // Find the closest card with the "card-action" class
  79. const card = button.closest('.card-action');
  80. if (!card) {
  81. console.error('Closest card with .card-action class not found!');
  82. return;
  83. }
  84. // Get the unique identifier for the card
  85. const cardId = card.dataset.cardId;
  86. // Apply Notiflix Block to the specific card
  87. Block.standard(`[data-card-id="${cardId}"]`, {
  88. backgroundColor:
  89. document.documentElement.getAttribute('data-bs-theme') === 'dark'
  90. ? 'rgba(' + window.Helpers.getCssVar('black-rgb') + ', 0.5)'
  91. : 'rgba(' + window.Helpers.getCssVar('white-rgb') + ', 0.5)',
  92. svgSize: '0px'
  93. });
  94. // Inject custom spinner HTML into the blocked card
  95. const customSpinnerHTML = `
  96. <div class="sk-fold sk-primary">
  97. <div class="sk-fold-cube"></div>
  98. <div class="sk-fold-cube"></div>
  99. <div class="sk-fold-cube"></div>
  100. <div class="sk-fold-cube"></div>
  101. </div>
  102. <h5>LOADING...</h5>
  103. `;
  104. const notiflixBlock = card.querySelector('.notiflix-block');
  105. if (notiflixBlock) {
  106. notiflixBlock.innerHTML = customSpinnerHTML;
  107. }
  108. // Simulate an async operation and unblock the card
  109. setTimeout(function () {
  110. Block.remove(`[data-card-id="${cardId}"]`);
  111. // Check if a card alert exists, and add the alert message
  112. const cardAlert = card.querySelector('.card-alert');
  113. if (cardAlert) {
  114. cardAlert.innerHTML = `
  115. <div class="alert alert-solid-danger alert-dismissible fade show" role="alert">
  116. <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
  117. <span class="fw-medium">Holy grail!</span> Your success/error message here.
  118. </div>
  119. `;
  120. }
  121. }, 2500); // Adjust the timeout duration as needed
  122. });
  123. });
  124. }
  125. });