dialogs/AvertDlg.js

/*
 * Created by yvesb on 30/12/2016.
 */
/*
 * MathGraph32 Javascript : Software for animating online dynamic mathematics figures
 * https://www.mathgraph32.org/
 * @Author Yves Biton (yves.biton@sesamath.net)
 * @License: GNU AGPLv3 https://www.gnu.org/licenses/agpl-3.0.html
 */

import { ce, getStr } from '../kernel/kernel'
import MtgDlg from './MtgDlg'
import $ from 'jquery'

let lastMessage

export default AvertDlg
/**
 * Boîte de dialogue d'avertissement
 * @param {MtgApp} app
 * @param {string} message
 * @param {VoidCallback} callBackOK
 * @constructor
 * @extends MtgDlg
 */
function AvertDlg (app, message, callBackOK = null) {
  // Si on appuie deux fois très rapidement sur entrée en validant un input
  // d'une boîte de dialogue (alors qu'on a redonné le focus à l'input après une erreur de saisie)
  // il peut arriver qu'un deuxième dialogue d'avertissement soit lancé alors que le premier est déjà présent.
  // Mais on veut quand même gérer plusieurs messages d'erreur => on ignore seulement si c'est le même message
  // Version 7.0 : Pour pouvoir éventuellement avoir plusieurs messages d'avertissements empilés sans causer
  // de plantage, on ajoute à l'id normale avertDlg un nombre qui est le nombre de dialogues déjà ouverts
  // if (app.lastDlgId() === 'avertDlg' && lastMessage === message) return
  if (app.lastDlgId().startsWith('avertDlg') && lastMessage === message) return
  lastMessage = message
  MtgDlg.call(this, app, 'avertDlg' + app.dlg.length, callBackOK)
  const label = ce('label')
  // Si le message n'est pas défini, c'est un message composé
  // (mais message peut être un truc qui vient déjà de getStr, d'où le lax ci-dessous)
  let mes = getStr(message, { lax: true })
  if (mes === '') mes = message
  $(label).html(mes)
  this.appendChild(label)
  const self = this
  $('#' + self.id).dialog({
    modal: true,
    title: getStr('Avert'),
    maxHeight: Math.min(window.innerHeight * 0.98, this.app.svg.clientHeight),
    buttons: [{
      text: getStr('Fermer'),
      id: 'btnClose',
      click: function (ev) {
        self.OK()
        self.stopEvent(ev) // Rajouté version 6.9.3
      }
    }],
    open: function () {
      self.onOpen()
    },
    closeOnEscape: false,
    width: 500,
    // On centre la boîte de dialogue sur le div parent de l'application
    position: { my: 'center', at: 'center', of: this.app.svg.parentElement }
  })
}

AvertDlg.prototype = new MtgDlg()

AvertDlg.prototype.onOpen = function () {
  setTimeout(function () { // Ne marche pas sans un setTimeOut
    $('#btnClose').focus() // Pour que le focus soit donné au bouton Fermer
  }, 100)
}

AvertDlg.prototype.OK = function () {
  this.destroy()
  if (typeof this.callBackOK === 'function') {
    // Dans certains cas rappeler la callback trop rapidement pose pb sur iPad,
    // avec le clavier virtuel qui apparaît au mauvais endroit et cache un input.
    setTimeout(this.callBackOK, 250)
  }
}