mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-17 09:41:24 +01:00
162 lines
5 KiB
JavaScript
162 lines
5 KiB
JavaScript
'use strict';
|
|
function editNotes(id, name) {
|
|
// update list of objects
|
|
const select = document.getElementById('notesSelect');
|
|
select.options.length = 0;
|
|
for (const note of notes) {
|
|
select.options.add(new Option(note.id, note.id));
|
|
}
|
|
|
|
// initiate pell (html editor)
|
|
const editor = Pell.init({
|
|
element: document.getElementById('notesText'),
|
|
onChange: (html) => {
|
|
const id = document.getElementById('notesSelect').value;
|
|
const note = notes.find((note) => note.id === id);
|
|
if (!note) return;
|
|
note.legend = html;
|
|
showNote(note);
|
|
}
|
|
});
|
|
|
|
// select an object
|
|
if (notes.length || id) {
|
|
if (!id) id = notes[0].id;
|
|
let note = notes.find((note) => note.id === id);
|
|
if (note === undefined) {
|
|
if (!name) name = id;
|
|
note = {id, name, legend: ''};
|
|
notes.push(note);
|
|
select.options.add(new Option(id, id));
|
|
}
|
|
select.value = id;
|
|
notesName.value = note.name;
|
|
editor.content.innerHTML = note.legend;
|
|
showNote(note);
|
|
} else {
|
|
editor.content.innerHTML = 'There are no added notes. Click on element (e.g. label) and add a free text note';
|
|
document.getElementById('notesName').value = '';
|
|
}
|
|
|
|
// open a dialog
|
|
$('#notesEditor').dialog({
|
|
title: 'Notes Editor',
|
|
minWidth: '40em',
|
|
width: '50vw',
|
|
position: {my: 'center', at: 'center', of: 'svg'},
|
|
close: () => (notesText.innerHTML = '')
|
|
});
|
|
|
|
if (modules.editNotes) return;
|
|
modules.editNotes = true;
|
|
|
|
// add listeners
|
|
document.getElementById('notesSelect').addEventListener('change', changeObject);
|
|
document.getElementById('notesName').addEventListener('input', changeName);
|
|
document.getElementById('notesPin').addEventListener('click', () => (options.pinNotes = !options.pinNotes));
|
|
document.getElementById('notesSpeak').addEventListener('click', () => speak(editor.content.innerHTML));
|
|
document.getElementById('notesFocus').addEventListener('click', validateHighlightElement);
|
|
document.getElementById('notesDownload').addEventListener('click', downloadLegends);
|
|
document.getElementById('notesUpload').addEventListener('click', () => legendsToLoad.click());
|
|
document.getElementById('legendsToLoad').addEventListener('change', function () {
|
|
uploadFile(this, uploadLegends);
|
|
});
|
|
document.getElementById('notesClearStyle').addEventListener('click', clearStyle);
|
|
document.getElementById('notesRemove').addEventListener('click', triggerNotesRemove);
|
|
|
|
function showNote(note) {
|
|
document.getElementById('notes').style.display = 'block';
|
|
document.getElementById('notesHeader').innerHTML = note.name;
|
|
document.getElementById('notesBody').innerHTML = note.legend;
|
|
}
|
|
|
|
function changeObject() {
|
|
const note = notes.find((note) => note.id === this.value);
|
|
if (!note) return;
|
|
notesName.value = note.name;
|
|
editor.content.innerHTML = note.legend;
|
|
}
|
|
|
|
function changeName() {
|
|
const id = document.getElementById('notesSelect').value;
|
|
const note = notes.find((note) => note.id === id);
|
|
if (!note) return;
|
|
note.name = this.value;
|
|
showNote(note);
|
|
}
|
|
|
|
function validateHighlightElement() {
|
|
const select = document.getElementById('notesSelect');
|
|
const element = document.getElementById(select.value);
|
|
|
|
if (element === null) {
|
|
alertMessage.innerHTML = 'Related element is not found. Would you like to remove the note?';
|
|
$('#alert').dialog({
|
|
resizable: false,
|
|
title: 'Element not found',
|
|
buttons: {
|
|
Remove: function () {
|
|
$(this).dialog('close');
|
|
removeLegend();
|
|
},
|
|
Keep: function () {
|
|
$(this).dialog('close');
|
|
}
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
highlightElement(element); // if element is found
|
|
}
|
|
|
|
function downloadLegends() {
|
|
const data = JSON.stringify(notes);
|
|
const name = getFileName('Notes') + '.txt';
|
|
downloadFile(data, name);
|
|
}
|
|
|
|
function uploadLegends(dataLoaded) {
|
|
if (!dataLoaded) {
|
|
tip('Cannot load the file. Please check the data format', false, 'error');
|
|
return;
|
|
}
|
|
notes = JSON.parse(dataLoaded);
|
|
document.getElementById('notesSelect').options.length = 0;
|
|
editNotes(notes[0].id, notes[0].name);
|
|
}
|
|
|
|
function clearStyle() {
|
|
editor.content.innerHTML = editor.content.textContent;
|
|
}
|
|
|
|
function triggerNotesRemove() {
|
|
alertMessage.innerHTML = 'Are you sure you want to remove the selected note?';
|
|
$('#alert').dialog({
|
|
resizable: false,
|
|
title: 'Remove note',
|
|
buttons: {
|
|
Remove: function () {
|
|
$(this).dialog('close');
|
|
removeLegend();
|
|
},
|
|
Keep: function () {
|
|
$(this).dialog('close');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function removeLegend() {
|
|
const select = document.getElementById('notesSelect');
|
|
const index = notes.findIndex((n) => n.id === select.value);
|
|
notes.splice(index, 1);
|
|
select.options.length = 0;
|
|
if (!notes.length) {
|
|
$('#notesEditor').dialog('close');
|
|
return;
|
|
}
|
|
notesText.innerHTML = '';
|
|
editNotes(notes[0].id, notes[0].name);
|
|
}
|
|
}
|