inputAccordion.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. function inputAccordionChecked(id, checked) {
  2. var accordion = gradioApp().getElementById(id);
  3. accordion.visibleCheckbox.checked = checked;
  4. accordion.onVisibleCheckboxChange();
  5. }
  6. function setupAccordion(accordion) {
  7. var labelWrap = accordion.querySelector('.label-wrap');
  8. var gradioCheckbox = gradioApp().querySelector('#' + accordion.id + "-checkbox input");
  9. var extra = gradioApp().querySelector('#' + accordion.id + "-extra");
  10. var span = labelWrap.querySelector('span');
  11. var linked = true;
  12. var isOpen = function() {
  13. return labelWrap.classList.contains('open');
  14. };
  15. var observerAccordionOpen = new MutationObserver(function(mutations) {
  16. mutations.forEach(function(mutationRecord) {
  17. accordion.classList.toggle('input-accordion-open', isOpen());
  18. if (linked) {
  19. accordion.visibleCheckbox.checked = isOpen();
  20. accordion.onVisibleCheckboxChange();
  21. }
  22. });
  23. });
  24. observerAccordionOpen.observe(labelWrap, {attributes: true, attributeFilter: ['class']});
  25. if (extra) {
  26. labelWrap.insertBefore(extra, labelWrap.lastElementChild);
  27. }
  28. accordion.onChecked = function(checked) {
  29. if (isOpen() != checked) {
  30. labelWrap.click();
  31. }
  32. };
  33. var visibleCheckbox = document.createElement('INPUT');
  34. visibleCheckbox.type = 'checkbox';
  35. visibleCheckbox.checked = isOpen();
  36. visibleCheckbox.id = accordion.id + "-visible-checkbox";
  37. visibleCheckbox.className = gradioCheckbox.className + " input-accordion-checkbox";
  38. span.insertBefore(visibleCheckbox, span.firstChild);
  39. accordion.visibleCheckbox = visibleCheckbox;
  40. accordion.onVisibleCheckboxChange = function() {
  41. if (linked && isOpen() != visibleCheckbox.checked) {
  42. labelWrap.click();
  43. }
  44. gradioCheckbox.checked = visibleCheckbox.checked;
  45. updateInput(gradioCheckbox);
  46. };
  47. visibleCheckbox.addEventListener('click', function(event) {
  48. linked = false;
  49. event.stopPropagation();
  50. });
  51. visibleCheckbox.addEventListener('input', accordion.onVisibleCheckboxChange);
  52. }
  53. onUiLoaded(function() {
  54. for (var accordion of gradioApp().querySelectorAll('.input-accordion')) {
  55. setupAccordion(accordion);
  56. }
  57. });