CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/new-dashboard/utils/shift-click.service.js

Summary

Maintainability
A
0 mins
Test Coverage
import removeElementsFromArray from './remove-items-from-array';

export function shiftClick (items, selectedItems, currentClickedItem, singleSelectedItem) {
  // Get indexes from items
  const lastSelectedItemIndex = items.findIndex(item => item.id === selectedItems[selectedItems.length - 1].id);
  const currentClickedItemIndex = items.indexOf(currentClickedItem);
  const singleSelectedItemIndex = items.findIndex(item => item.id === singleSelectedItem.id);

  // Calculate items to select
  const currentSelectedRangeStart = Math.min(singleSelectedItemIndex, currentClickedItemIndex);
  const itemsToSelect = Math.abs(singleSelectedItemIndex - currentClickedItemIndex) + 1;
  const nextSelectedItems = items.slice(currentSelectedRangeStart, currentSelectedRangeStart + itemsToSelect);

  // If the selection is upwards, reverse selected items so that the delete range is correct
  if (currentClickedItemIndex < singleSelectedItemIndex) {
    nextSelectedItems.reverse();
  }

  // Calculate items to delete
  const previousSelectedRangeStart = Math.min(lastSelectedItemIndex, currentClickedItemIndex);
  const itemsToDelete = Math.abs(lastSelectedItemIndex - currentClickedItemIndex) + 1;
  const previousSelectedRange = items.slice(previousSelectedRangeStart, previousSelectedRangeStart + itemsToDelete);

  // Delete previous items from array and add the new ones
  selectedItems = removeElementsFromArray(selectedItems, previousSelectedRange);
  const currentSelectedItems = selectedItems.concat(nextSelectedItems);
  return Array.from(new Set(currentSelectedItems));
}