editGraphe/editGraphe.js

/**
 * Initialise l’éditeur de graphes en mode édition de ressource (si elle est fournie) ou création
 * Pour l’autre mode (coloration de parcours) voir showParcours.js
 * @module
 */
import { empty } from 'src/lib/utils/dom/main'
import { init as menuInit } from './menu'
import { importerGrapheFin, importerGraphe } from './importGraphe'
import { init as sceneInit, getCurrentRessourceParametres, actualiseGestionnaireEvenements } from './scene'
import { findOrCreateElement } from './fonctionsUtiles'
import { resize } from './separateur'
import edgModale from './boiteDialogue'
import fullscreen from './fullscreen'
import { dispatch, setRootElt } from './store'
import { init, setRessource } from 'src/editGraphe/actions'

import './css/layout.css'

// dispatch(incrementeMaxNN())
// dispatch(decrementeMaxNN())
// const nodetest = { section: 'parallelesfaisceau', parametres: {'inclinaison': '[-90;90]', 'nbdroites': 8, 'nbrepetitions': 3}, left: 200, top: 50, title: 'Nœud 1', style: '', branchements: [{'pe': '>=0.9', 'nn': 'fin', 'conclusion': 'Bravo ! Parcours terminé '}] }
// dispatch(setObjetGrapheNode(3, nodetest))
// dispatch(setObjetGrapheNode(5, nodetest))
// dispatch(delObjetGrapheNode(3))
// dispatch(toggleExplicationsGraphique())

/**
 * @private
 * @param {Error} error
 */
function showError (error) {
  console.error(error)
  edgModale({ id: 'modaleError', titre: 'Editeur de graphes', contenu: error.message, width: 600, height: 200 })
}

/**
 * @typedef EditGrapheOptions
 * @property {boolean} [isFullscreenAllowed=true]
 * @property {string} [sourceTreeRid]
 */

/**
 * Charge l’éditeur de graphe dans rootElt et l’initialise avec un graphe (au format ressource d’une sesatheque)
 * Passera à la callback la fct permettant de récupérer le graphe
 * @param {HTMLElement} rootElt
 * @param {Ressource} ressource
 * @param {object} [options]
 * @param {boolean} [options.isFullscreenAllowed=true] passer false pour ne pas mettre le bouton fullscreen
 * @param {string} [options.sourceTreeRid] Le rid de l’arbre racine à charger à gauche (sinon on prendra celui de la configuration par défaut)
 * @param {editCallback} [next] Sera appelé à la fin du chargement en passant une erreur éventuelle et la méthode getRessourceParametres en 2e argument
 */
function editGraphe (rootElt, ressource, options, next) {
  // récupère l’élément ou le crée, à ajouter à sesajstools.dom
  try {
    if (typeof options === 'function') {
      next = options
      options = {}
    } else if (!options) {
      options = {}
    }

    // console.debug('le state à l’init d’editGraphe', getState())
    empty(rootElt)
    setRootElt(rootElt)
    dispatch(init())

    // pour mes tests :
    // optionsDisparue = {noeuds: ['1', '2'], scores: [0.5, 1], pe: [0.5, 1], graphe: [['1', 'EtudeFonction_derivee', [{'nn': '2', 'score': 'sans condition', 'conclusion': 'Etudions les limites', 'label': 'Sans condition'}, {'imposer_fct': '', 'modele': [3], 'nbrepetitions': '1', 'indication': '', 'limite': '', 'nbchances': '2', 'imposer_domaine': []}]], ['2', 'EtudeFonction_limite', [{'nn': '3', 'pe': 'sans condition', 'conclusion': 'Etude du signe de la dérivée', 'label': 'Sans condition'}, {'imposer_fct': 'j3p.parcours.donnees[1]'}]], ['3', 'EtudeFonction_facteursderivee', [{'nn': '4', 'pe': 'sans condition', 'conclusion': 'Poursuivons l’étude de la dérivée', 'label': 'Sans condition'}, {'imposer_fct': 'j3p.parcours.donnees[1]'}]], ['4', 'EtudeFonction_signederivee', [{'nn': '5', 'pe': 'sans condition', 'conclusion': 'Passons aux variations de la fonction', 'label': 'Sans condition'}, {'imposer_fct': 'j3p.parcours.donnees[1]'}]], ['5', 'EtudeFonction_variations', [{'nn': '6', 'pe': 'sans condition', 'conclusion': 'Etude de fonction terminée', 'label': 'Sans condition'}, {'imposer_fct': 'j3p.parcours.donnees[1]'}]], ['6', 'fin', [null]]], editgraphes: {'positionNodes': [[213, 287], [441, 415], [663, 372], [853, 398], [929, 470], [1019, 576]], 'titreNodes': ['Dérivée de (ax+b)exp(x)', 'Limites aux bornes de l’ensemble de définition', 'Nombre de facteurs de la dérivée', 'Signe de la dérivée', 'Variations', 'Fin']}}
    dispatch(setRessource(ressource)) // on file la ressource pour déjà renseigner des trucs
    // un message d’attente avec une variable dessus pour faire un remove à la fin
    const waitElt = findOrCreateElement(rootElt, 'p', { id: 'edgWait' }, 'Chargement en cours…')
    // header
    const headerElt = findOrCreateElement(rootElt, 'div', { id: 'edgHeader' }, 'Éditeur de graphe')
    // bouton fullscreen par défaut
    if (!options || options.isFullscreenAllowed !== false) {
      const fullScreenButton = findOrCreateElement(headerElt, 'button', { id: 'edgFullScreenButton' }, 'Plein écran')
      fullscreen(fullScreenButton)
    }
    // contenu
    const contentElt = findOrCreateElement(rootElt, 'div', { id: 'edgContent' })
    // footer
    findOrCreateElement(rootElt, 'div', { id: 'edgFooter' }, 'Sésamath')
    const menuElt = findOrCreateElement(contentElt, 'div', { id: 'edgMenu' })
    const sepElt = findOrCreateElement(contentElt, 'div', { id: 'edgSeparateur' })
    const sceneElt = findOrCreateElement(contentElt, 'div', { id: 'edgScene' })
    // redimensionnement possible des div
    resize(menuElt, sepElt, sceneElt)
    // ici on appelle nos autres modules en leur filant une callback à appeller quand ce sera fini, attention là c’est la cascade de callbacks...
    sceneInit(sceneElt, function () { // la callback
      menuInit(menuElt, options, function (error) {
        if (error) showError(error)
        // on continue même si le menu n’a pas réussi à s’initialiser
        importerGraphe(ressource, function () {
          // var graphe = ressource && ressource.parametres && ressource.parametres.g || []
          importerGrapheFin(function () {
            // c’est fini, on vire notre message d’attente
            waitElt.parentNode.removeChild(waitElt)
            actualiseGestionnaireEvenements()
            if (next) next(null, getCurrentRessourceParametres)
            else console.error('pas de callback fournie à editGraphe')
          }) // importerGrapheFin
        }) // importerGraphe
      }) // menuInit
    }) // sceneInit
  } catch (error) {
    console.error(error)
    if (next) next(error)
  }
}

export default editGraphe

/**
 * @callback editCallback
 * @param {Error|null} error une erreur éventuelle
 * @param {getRessourceParametres} getRessourceParametres Une fonction pour récupérer les paramètre du graphe en cours d’édition
 */
/**
 * @callback getRessourceParametres
 * @return {RessourceJ3pParametresV1}
 */