Newer
Older
dmpopidor / app / javascript / views / madmp_fragments / edit.js
import {
  doneCallback,
  failCallback,
} from '../answers/edit';
import { Tinymce } from '../../utils/tinymce.js.erb';
import { Select2 } from '../../utils/select2';
// import TimeagoFactory from '../../utils/timeagoFactory';

$(() => {
  const showSavingMessage = jQuery => jQuery.parents('.question-form').find('[data-status="saving"]').show();
  const hideSavingMessage = jQuery => jQuery.parents('.question-form').find('[data-status="saving"]').hide();
  const showLoadingOverlay = jQuery => jQuery.find('.overlay').show();
  const hideLoadingOverlay = jQuery => jQuery.find('.overlay').hide();
  const toolbar = 'bold italic | bullist numlist | link | table';

  $('.panel-collapse').on('shown.bs.collapse reload.form', (e) => {
    const target = $(e.target);
    const fragmentId = target.find('.fragment-id').val();
    if (!target.hasClass('fragment-content')) {
      return;
    }
    if (fragmentId) {
      $.ajax({
        method: 'get',
        url: `/madmp_fragments/load_form/${fragmentId}`,
        beforeSend: () => {
          showLoadingOverlay(target);
        },
        complete: () => {
          hideLoadingOverlay(target);
        },
      }).done((data) => {
        doneCallback(data, target);
        $(`#runs-${data.question.id}-research-output-${data.research_output.id} .run-zone`).html(data.question.form_run);
        Tinymce.init({
          selector: `#research_output_${data.research_output.id}_section_${data.section.id} .note`,
          toolbar,
        });
        target.find('.toggle-guidance-section').removeClass('disabled');
        Select2.init(`#answer-form-${data.question.id}-research-output-${data.research_output.id}`);
      }).fail((error) => {
        failCallback(error, target);
      });
    } else {
      const form = target.find('.new-fragment');
      if (form.length === 0) return;

      $.ajax({
        method: 'get',
        url: '/madmp_fragments/load_new_form',
        data: form.serializeArray(),
        beforeSend: () => {
          showSavingMessage(target);
          showLoadingOverlay(target);
        },
        complete: () => {
          hideSavingMessage(target);
          hideLoadingOverlay(target);
        },
      }).done((data) => {
        doneCallback(data, target);
        Tinymce.init({
          selector: `#research_output_${data.research_output.id}_section_${data.section.id} .note`,
          toolbar,
        });
        Select2.init(`#answer-form-${data.question.id}-research-output-${data.research_output.id}`);
        target.find('.schema_picker').data('fragment-id', data.fragment_id);
        target.find('.toggle-guidance-section').removeClass('disabled');
      }).fail((error) => {
        failCallback(error, target);
      });
    }
  });

  $('.panel-collapse').on('hide.bs.collapse.fragment-content', (e) => {
    const target = $(e.target);
    if (target.find('.guidance-section').is(':visible')) {
      target.find('.toggle-guidance-section').trigger('click');
    }
    target.find('.toggle-guidance-section').addClass('disabled');
  });

  $('body').on('click', '.question .heading-button', (e) => {
    $(e.currentTarget)
      .find('i.fa-chevron-right, i.fa-chevron-down')
      .toggleClass('fa-chevron-right fa-chevron-down');
  });


  // When selecting a new form in the form selector, sends the new schema and
  // fragment id to the server
  $(document).on('change', '.schema_picker', (e) => {
    const target = $(e.target);
    const schemaId = target.val();
    const fragmentId = target.data('fragment-id');
    const form = target.parents('.question').find('.form-answer');
    $.ajax({
      url: `/madmp_fragments/change_schema/${fragmentId}?schema_id=${schemaId}`,
      method: 'get',
      beforeSend: () => {
        showSavingMessage(form);
        showLoadingOverlay(form);
      },
      complete: () => {
        hideSavingMessage(form);
        hideLoadingOverlay(form);
      },
    }).done((data) => {
      doneCallback(data, target);
      $(`#runs-${data.question.id}-research-output-${data.research_output.id} .run-zone`).html(data.question.form_run);
      Select2.init(`#answer-form-${data.question.id}-research-output-${data.research_output.id}`);
    }).fail((error) => {
      failCallback(error, target);
    });
  });
});