Skip to content
Snippets Groups Projects
Select Git revision
  • 1c0af61ffd69ab0517aa71d9f634b47aa7942280
  • mui5-annotation-on-video-stable default
  • get_setter_canvasSizeInformations
  • fix-error-div-into-p
  • annotation-on-video-v2
  • detached
  • annotation-on-video-r17
  • mui5
  • mui5-react-18
  • jacob-test
  • annotation-on-video protected
  • master
  • test-antoinev1
  • 20-fetch-thumbnail-on-annotation
  • add-research-field
  • Save
  • add-plugin
  • 14-wip-no-seek-to
  • 14-bug-on-video-time-control
  • 9_wip_videotests
  • _upgrade_material_ui
  • latest-tetras-16
  • v3.3.0
  • v3.2.0
  • v3.1.1
  • v3.1.0
  • v3.0.0
  • v3.0.0-rc.7
  • v3.0.0-rc.6
  • v3.0.0-rc.5
  • v3.0.0-rc.4
  • v3.0.0-rc.3
  • v3.0.0-rc.2
  • v3.0.0-rc.1
  • v3.0.0-beta.10
  • v3.0.0-beta.9
  • v3.0.0-beta.8
  • v3.0.0-beta.7
  • v3.0.0-beta.6
  • v3.0.0-beta.5
  • v3.0.0-beta.3
41 results

ranges.js

Blame
  • ranges.js 4.33 KiB
    import { createSelector } from 'reselect';
    import union from 'lodash/union';
    import without from 'lodash/without';
    import { Utils } from 'manifesto.js/dist-esmodule/Utils';
    import { getVisibleCanvasIds } from './canvases';
    import { getCompanionWindow } from './companionWindows';
    import { getSequenceTreeStructure } from './sequences';
    
    /** */
    function rangeContainsCanvasId(range, canvasId) {
      const canvasIds = range.getCanvasIds();
      for (let i = 0; i < canvasIds.length; i += 1) {
        if (Utils.normalisedUrlsMatch(canvasIds[i], canvasId)) {
          return true;
        }
      }
      return false;
    }
    
    /** */
    function getAllParentIds(node) {
      if (node.parentNode === undefined) {
        return [];
      }
      if (node.parentNode.parentNode === undefined) {
        return [node.parentNode.id];
      }
      return [...getAllParentIds(node.parentNode), node.parentNode.id];
    }
    
    /** */
    function getVisibleNodeIdsInSubTree(nodes, canvasIds) {
      return nodes.reduce((nodeIdAcc, node) => {
        const result = [];
        result.push(...nodeIdAcc);
        const nodeContainsVisibleCanvas = canvasIds.reduce(
          (acc, canvasId) => acc || rangeContainsCanvasId(node.data, canvasId),
          false,
        );
        const subTreeVisibleNodeIds = node.nodes.length > 0
          ? getVisibleNodeIdsInSubTree(node.nodes, canvasIds)
          : [];
        result.push(...subTreeVisibleNodeIds);
        if (nodeContainsVisibleCanvas || subTreeVisibleNodeIds.length > 0) {
          result.push({
            containsVisibleCanvas: nodeContainsVisibleCanvas,
            descendantsContainVisibleCanvas: subTreeVisibleNodeIds.length > 0,
            id: node.id,
            leaf: node.nodes.length === 0,
            parentIds: getAllParentIds(node),
          });
        }
        return result;
      }, []);
    }
    
    /** */
    const getVisibleLeafAndBranchNodeIds = createSelector(
      [
        getSequenceTreeStructure,
        getVisibleCanvasIds,
      ],
      (tree, canvasIds) => {
        if (canvasIds.length === 0 || !tree) return [];
        return getVisibleNodeIdsInSubTree(tree.nodes, canvasIds);
      },
    );
    
    /** */
    export const getVisibleNodeIds = createSelector(
      [
        getVisibleLeafAndBranchNodeIds,
      ],
      visibleLeafAndBranchNodeIds => visibleLeafAndBranchNodeIds.map(item => item.id),
    );
    
    const getVisibleBranchNodeIds = createSelector(
      [
        getVisibleLeafAndBranchNodeIds,
      ],
      visibleLeafAndBranchNodeIds => visibleLeafAndBranchNodeIds.reduce(
        (acc, item) => (item.leaf || !item.descendantsContainVisibleCanvas ? acc : [...acc, item.id]),
        [],
      ),
    );
    
    const getCanvasContainingNodeIds = createSelector(
      [
        getVisibleLeafAndBranchNodeIds,
      ],
      visibleLeafAndBranchNodeIds => visibleLeafAndBranchNodeIds.reduce(
        (acc, item) => (item.containsVisibleCanvas ? [...acc, item] : acc),
        [],
      ),
    );
    
    /** */
    export function getManuallyExpandedNodeIds(state, { companionWindowId }, expanded) {
      const companionWindow = getCompanionWindow(state, { companionWindowId });
      return companionWindow.tocNodes ? Object.keys(companionWindow.tocNodes).reduce(
        (acc, nodeId) => (companionWindow.tocNodes[nodeId].expanded === expanded
          ? [...acc, nodeId]
          : acc),
        [],
      ) : [];
    }
    
    /** */
    export function getExpandedNodeIds(state, { companionWindowId, windowId }) {
      const visibleBranchNodeIds = getVisibleBranchNodeIds(state, { companionWindowId, windowId });
      const manuallyExpandedNodeIds = getManuallyExpandedNodeIds(state, { companionWindowId }, true);
      const manuallyClosedNodeIds = getManuallyExpandedNodeIds(state, { companionWindowId }, false);
      return without(union(manuallyExpandedNodeIds, visibleBranchNodeIds), ...manuallyClosedNodeIds);
    }
    
    /** */
    export function getNodeIdToScrollTo(state, { ...args }) {
      const canvasContainingNodeIds = getCanvasContainingNodeIds(state, { ...args });
      const collapsedNodeIds = getManuallyExpandedNodeIds(state, args, false);
      if (canvasContainingNodeIds && canvasContainingNodeIds.length > 0) {
        for (let i = 0; i < canvasContainingNodeIds[0].parentIds.length; i += 1) {
          if (collapsedNodeIds.indexOf(canvasContainingNodeIds[0].parentIds[i]) !== -1) {
            return canvasContainingNodeIds[0].parentIds[i];
          }
        }
        return canvasContainingNodeIds[0].id;
      }
      return null;
    }
    
    /**
     * Returns the default sidebar variant depending on whether or not ranges exist
     */
    export const getDefaultSidebarVariant = createSelector(
      [
        getSequenceTreeStructure,
      ],
      tree => (
        tree && tree.nodes && tree.nodes.length > 0 ? 'tableOfContents' : 'item'
      ),
    );