Newer
Older
dmpopidor / lib / assets / javascripts / views / org_admin / phases / show.js
@Bodacious Bodacious on 16 Oct 2018 2 KB Refactor JS in section sorting
import 'jquery-ui/ui/widgets/sortable';
import { renderAlert } from '../../../utils/notificationHelper';

$(() => {
  // Is there already one prefix section on this Phase?
  //
  // draggableSections - A jQuery object, the sortable element.
  //
  // Returns Boolean
  function prefixSectionExists(draggableSections) {
    // Collect an Array of the .section-group id attributes (the unmodifiable sections are
    // in a block called '#baseline-sections'.
    const ids = [];
    draggableSections.find('.section-group').each((_i, e) => {
      // Sortable adds an element within this with a blank id
      if (e.id.trim() !== '') { ids.push(e.id); }
    });
    // If the index of the baseline section is greater than 1, we have too many prefixes.
    return ids.indexOf('baseline-sections') > 1;
  }

  // Does the page have any unmodifiable sections (Do we need to police ordering?)
  //
  // Returns Boolean
  function hasUnmodifiableSections() {
    return $('[data-modifiable=false]').length > 0;
  }

  // Initialize the draggable-sections element as a jQuery sortable.
  // Read the docs here for more info: http://api.jqueryui.com/sortable/
  $('.draggable-sections').sortable({
    handle: 'i.fa-arrows',
    axis: 'y',
    cursor: 'move',
    // Remove the placeholder object from the DOM once the item has been placed
    receive(event, ui) { ui.placeholder.remove(); },
    beforeStop() {
      if (hasUnmodifiableSections() && prefixSectionExists($(this))) {
        // Prevent the sort action from completing. Moves element back to source
        $(this).sortable('cancel');
        renderAlert(`You can only place one section before the funder template.
          Multiple can go afterwards.`, {
          floating: true, autoDismiss: true,
        });
      }
    },
    update() {
      // Collect the section-id from each section element on the page.
      const sectionIds = $('.section[data-section-id]')
        .map((i, element) => $(element).data('section-id')).toArray();

      // Post the section IDs to the server in their new order on the page.
      $.rails.ajax({
        url: $(this).data('url'),
        method: 'post',
        data: { sort_order: sectionIds },
      });
    },
  });
});