/*
* 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 Outil from './Outil'
import { getStr } from 'src/kernel/kernel'
import AvertDlg from 'src/dialogs/AvertDlg'
import SaveDlg from 'src/dialogs/SaveDlg'
export default OutilSave
/**
* Outil servant à modifier un objet qui a été créé par un menu
* @param {MtgApp} app L'application propriétaire
* @constructor
* @extends Outil
*/
function OutilSave (app) {
Outil.call(this, app, 'Save', -1, false, false, app.save) // Le dernier false car l'outil n'est pas sélectionnable
}
OutilSave.prototype = new Outil()
OutilSave.prototype.select = function () {
const app = this.app
try {
if (app.electron) {
if (app.functionOnSave) {
app.functionOnSave()
} else {
saveForIcon() // eslint-disable-line no-undef
app.doc.setDirty(true, false)
app.activeOutilCapt()
} // saveForIcon est une fonction globale de la page index.html pour la version electron
} else {
// Si on est en mode affichage (et pas édition) de la ressource éditable, app.preview vaut true et app.functionOnSave peut être nullish
// (si une figure mathgraph éditable se retrouve dans une séquence élève, on devrait avoir preview à true
// et functionOnSave fourni pour récupérer le résultat et le sauvegarder)
const isExercicePreview = app.estExercice && app.preview // c'est l'affichage d'un exo de construction (pas son édition)
if (isExercicePreview) {
// pour les exos de construction en preview (affichage et pas modif), le bouton save fait un truc en plus avant la sauvegarde
// il évalue la construction, et lorsqu'il manque des trucs affiche un message et arrête là
// sinon ça continue normalement
// Pour un exercice de construction, s'il manque des objest ayant le nom d'objets à construire, on refuse d'enregistrer
if (app.objectConstructed()) {
let mes2 = ''
let mes1 = ''
// Si on est dans un composant MathGraph32 de la bibli ou de LaboMep et si l'élève est en train de compléter une figure
const missingTypes = app.getMissingTypes()
const bMissingTypes = missingTypes.length !== 0
if (bMissingTypes) {
mes1 = getStr('aconst') + ' '
for (let k = 0; k < missingTypes.length; k++) {
mes1 += missingTypes[k]
if (k !== missingTypes.length - 1) mes1 += ', '
}
}
const missingNames = app.getMissingNames()
const bMissingNames = missingNames.length !== 0
if (bMissingNames) {
mes2 = getStr('anom') + ' '
for (let k = 0; k < missingNames.length; k++) {
mes2 += missingNames[k]
if (k !== missingNames.length - 1) mes2 += ', '
}
}
// S'il manque des objets de type demandé ou si des objets n'ont pas été nommés, on refuse d'enregistrer
// et on affiche un message d'avertissement
if (bMissingTypes || bMissingNames) {
let mes = bMissingTypes ? mes1 : ''
if (bMissingNames) {
if (missingTypes) mes += '</br>'
mes += mes2
}
new AvertDlg(app, mes)
// On ne sauvegarde pas car par exemple l'élève a pu bien construire un objet mais oublier de le nommer
// d'où le return
return
}
} else {
// On avertit qu'aucun objet n'a été construit et on n'enregistre pas la figure d'où le return
new AvertDlg(app, 'none')
return
}
}
// on passe à la sauvegarde "ordinaire", mais on veut aussi passer là pour le message OK|KO des exos de construction
if (app.functionOnSave || isExercicePreview) {
const result = app.getResult()
const sendResult = app.functionOnSave
? () => app.functionOnSave(result)
: () => undefined
if (app.avertOnSave) {
const msgId = app.estExercice
? (result.score === 1 ? 'res' : 'notres')
: 'saved'
const msg = getStr(msgId)
new AvertDlg(app, msg, sendResult)
// sendResult sera appelé au clic sur le bouton fermer du dialog précédent
} else {
sendResult()
}
} else {
// on affiche le dialog qui va demander un nom et où mettre ça sauf si on n'est pas dans electron
// et on a déjà chargé une figure via ouverture de fichier
if (app.fileName) {
app.doc.saveAs(app.fileName)
} else {
new SaveDlg(app)
}
}
}
} catch (error) {
console.error(error)
// @todo afficher un truc à l'utilisateur pour lui dire que ça a planté
}
}