Lucas ARRIESSE commited on
Commit
daecf53
·
1 Parent(s): 551031a

Attempt to fix JS

Browse files
Files changed (1) hide show
  1. static/script.js +46 -16
static/script.js CHANGED
@@ -720,37 +720,47 @@ async function categorizeRequirements(max_categories) {
720
  */
721
  function displayCategorizedRequirements(categorizedData) {
722
  const container = document.getElementById('categorized-requirements-list');
 
 
 
 
723
  container.innerHTML = '';
724
 
725
  categorizedData.forEach((category, categoryIndex) => {
726
  const categoryDiv = document.createElement('div');
727
- categoryDiv.tabIndex = 0;
728
- categoryDiv.className = 'collapse collapse-arrow mb-2 border border-gray-200 rounded-lg bg-white';
729
-
730
 
731
- // Generate unique IDs for checkboxes
732
  const globalCheckboxId = `global-checkbox-${categoryIndex}`;
733
 
 
734
  const requirementsHTML = category.requirements.map((req, reqIndex) => {
735
  const checkboxId = `checkbox-${categoryIndex}-${reqIndex}`;
736
  return `
737
- <div class="p-2 bg-gray-50 rounded border-l-4 border-blue-400 flex items-start gap-2" data-category-index="${categoryIndex}" data-cat-req-id="${reqIndex}">
738
- <input type="checkbox" class="item-checkbox" id="${checkboxId}" data-category-index="${categoryIndex}" />
739
- <label for="${checkboxId}" class="flex-1">
740
- <div class="text-sm font-medium text-gray-700">${req.document}</div>
741
  <div class="text-sm text-gray-600">${req.requirement}</div>
742
  </label>
743
  </div>`;
744
  }).join('');
745
 
 
746
  categoryDiv.innerHTML = `
747
- <div class="collapse-title font-semibold flex items-center gap-2">
748
- <input type="checkbox" class="global-checkbox" id="${globalCheckboxId}" data-category-index="${categoryIndex}" />
749
- <label for="${globalCheckboxId}" class="text-lg font-semibold text-blue-600">${category.title}</label>
750
- </div>
751
- <input type="checkbox" />
 
 
 
 
 
 
752
  <div class="collapse-content text-sm">
753
- <div class="space-y-2">
754
  ${requirementsHTML}
755
  </div>
756
  </div>
@@ -759,7 +769,16 @@ function displayCategorizedRequirements(categorizedData) {
759
  container.appendChild(categoryDiv);
760
  });
761
 
762
- // Event delegation to handle global checkbox logic
 
 
 
 
 
 
 
 
 
763
  container.querySelectorAll('.global-checkbox').forEach(globalCheckbox => {
764
  globalCheckbox.addEventListener('change', (e) => {
765
  const categoryIndex = e.target.dataset.categoryIndex;
@@ -770,7 +789,7 @@ function displayCategorizedRequirements(categorizedData) {
770
  });
771
  });
772
 
773
- // Update global checkbox state when individual checkboxes change
774
  container.querySelectorAll('.item-checkbox').forEach(itemCheckbox => {
775
  itemCheckbox.addEventListener('change', (e) => {
776
  const categoryIndex = e.target.dataset.categoryIndex;
@@ -778,7 +797,18 @@ function displayCategorizedRequirements(categorizedData) {
778
  const globalCheckbox = container.querySelector(`.global-checkbox[data-category-index="${categoryIndex}"]`);
779
 
780
  const allChecked = Array.from(itemCheckboxes).every(cb => cb.checked);
 
 
781
  globalCheckbox.checked = allChecked;
 
 
 
 
 
 
 
 
 
782
  });
783
  });
784
  }
 
720
  */
721
  function displayCategorizedRequirements(categorizedData) {
722
  const container = document.getElementById('categorized-requirements-list');
723
+ if (!container) {
724
+ console.error('Container element with ID "categorized-requirements-list" not found.');
725
+ return;
726
+ }
727
  container.innerHTML = '';
728
 
729
  categorizedData.forEach((category, categoryIndex) => {
730
  const categoryDiv = document.createElement('div');
731
+ categoryDiv.className = 'collapse collapse-arrow mb-2 border border-gray-200 rounded-lg bg-white shadow-sm';
 
 
732
 
733
+ // Generate unique IDs for all checkboxes
734
  const globalCheckboxId = `global-checkbox-${categoryIndex}`;
735
 
736
+ // Create the HTML for the individual requirement items within a category
737
  const requirementsHTML = category.requirements.map((req, reqIndex) => {
738
  const checkboxId = `checkbox-${categoryIndex}-${reqIndex}`;
739
  return `
740
+ <div class="p-2.5 bg-gray-50 rounded border-l-4 border-blue-400 flex items-start gap-3" data-category-index="${categoryIndex}" data-cat-req-id="${reqIndex}">
741
+ <input type="checkbox" class="item-checkbox checkbox checkbox-sm mt-1" id="${checkboxId}" data-category-index="${categoryIndex}" />
742
+ <label for="${checkboxId}" class="flex-1 cursor-pointer">
743
+ <div class="text-sm font-medium text-gray-800">${req.document}</div>
744
  <div class="text-sm text-gray-600">${req.requirement}</div>
745
  </label>
746
  </div>`;
747
  }).join('');
748
 
749
+ // Set the innerHTML for the entire collapsible category component
750
  categoryDiv.innerHTML = `
751
+ <!-- This hidden checkbox controls the collapse state -->
752
+ <input type="checkbox" name="collapse-accordion-${categoryIndex}" />
753
+
754
+ <div class="collapse-title text-lg font-semibold text-blue-600">
755
+ <!-- This wrapper prevents the collapse from triggering when clicking the checkbox or its label -->
756
+ <div class="checkbox-and-title-wrapper flex items-center gap-3">
757
+ <input type="checkbox" class="global-checkbox checkbox" id="${globalCheckboxId}" data-category-index="${categoryIndex}" />
758
+ <label for="${globalCheckboxId}" class="cursor-pointer">${category.title}</label>
759
+ </div>
760
+ </div>
761
+
762
  <div class="collapse-content text-sm">
763
+ <div class="space-y-2 p-2">
764
  ${requirementsHTML}
765
  </div>
766
  </div>
 
769
  container.appendChild(categoryDiv);
770
  });
771
 
772
+ // --- Event Listeners ---
773
+
774
+ // Stop click propagation on the checkbox wrapper to isolate it from the collapse trigger
775
+ container.querySelectorAll('.checkbox-and-title-wrapper').forEach(wrapper => {
776
+ wrapper.addEventListener('click', (e) => {
777
+ e.stopPropagation();
778
+ });
779
+ });
780
+
781
+ // Handle "select all" logic when the global checkbox is changed
782
  container.querySelectorAll('.global-checkbox').forEach(globalCheckbox => {
783
  globalCheckbox.addEventListener('change', (e) => {
784
  const categoryIndex = e.target.dataset.categoryIndex;
 
789
  });
790
  });
791
 
792
+ // Update the global checkbox state when any individual item checkbox is changed
793
  container.querySelectorAll('.item-checkbox').forEach(itemCheckbox => {
794
  itemCheckbox.addEventListener('change', (e) => {
795
  const categoryIndex = e.target.dataset.categoryIndex;
 
797
  const globalCheckbox = container.querySelector(`.global-checkbox[data-category-index="${categoryIndex}"]`);
798
 
799
  const allChecked = Array.from(itemCheckboxes).every(cb => cb.checked);
800
+ const someChecked = Array.from(itemCheckboxes).some(cb => cb.checked);
801
+
802
  globalCheckbox.checked = allChecked;
803
+
804
+ // Set indeterminate state for better UX
805
+ if (allChecked) {
806
+ globalCheckbox.indeterminate = false;
807
+ } else if (someChecked) {
808
+ globalCheckbox.indeterminate = true;
809
+ } else {
810
+ globalCheckbox.indeterminate = false;
811
+ }
812
  });
813
  });
814
  }