From 665cd2c249e73989145c28125644e8c44f54842a Mon Sep 17 00:00:00 2001
From: Gordon Lin <75815453+gordlin@users.noreply.github.com>
Date: Fri, 4 Oct 2024 13:00:19 -0400
Subject: [PATCH] Implement ToC redesign/refactor, both-language previews
---
src/app.vue | 2 +-
src/components/editor.vue | 215 ++++++--
src/components/metadata-editor.vue | 69 ++-
src/components/preview.vue | 2 +-
src/components/slide-editor.vue | 10 +-
src/components/slide-toc.vue | 757 +++++++++++++++++++++++------
src/definitions.ts | 5 +
src/lang/lang.csv | 24 +-
8 files changed, 875 insertions(+), 209 deletions(-)
diff --git a/src/app.vue b/src/app.vue
index e2a0351d..b892b25f 100644
--- a/src/app.vue
+++ b/src/app.vue
@@ -29,7 +29,7 @@ export default class App extends Vue {
diff --git a/src/components/metadata-editor.vue b/src/components/metadata-editor.vue
index 873d1d42..87b2389d 100644
--- a/src/components/metadata-editor.vue
+++ b/src/components/metadata-editor.vue
@@ -248,7 +248,7 @@
:configFileStructure="configFileStructure"
:sourceCounts="sourceCounts"
:metadata="metadata"
- :slides="slides"
+ :bothLanguageSlides="bothLanguageSlides"
:configLang="configLang"
:saving="saving"
:unsavedChanges="unsavedChanges"
@@ -257,20 +257,6 @@
@refresh-config="refreshConfig"
ref="mainEditor"
>
-
-
-
-
-
{
+ return {
+ en: engSlide
+ };
+ });
+ const engSlides = props.configs.fr?.slides.map((frSlide) => {
+ return {
+ fr: frSlide
+ };
+ });
+
+ const maxLength = Math.max(frSlides!.length ?? 0, engSlides!.length ?? 0);
+ this.bothLanguageSlides = Array.from({ length: maxLength }, (_, index) =>
+ Object.assign({}, engSlides?.[index] || { en: undefined }, frSlides?.[index] || { fr: undefined })
+ );
+
if (logo) {
const logoFile = this.configFileStructure?.zip.file(logoSrc);
if (logoFile) {
@@ -918,6 +923,22 @@ export default class MetadataEditorV extends Vue {
this.slides = config.slides;
+ const frSlides = this.configs.fr?.slides.map((frSlide) => {
+ return {
+ fr: frSlide
+ };
+ });
+ const engSlides = this.configs.en?.slides.map((enSlide) => {
+ return {
+ en: enSlide
+ };
+ });
+
+ const maxLength = Math.max(frSlides!.length ?? 0, engSlides!.length ?? 0);
+ this.bothLanguageSlides = Array.from({ length: maxLength }, (_, index) =>
+ Object.assign({}, engSlides?.[index] || { en: undefined }, frSlides?.[index] || { fr: undefined })
+ );
+
const logo = config.introSlide.logo?.src;
if (logo) {
// Set the alt text for the logo.
@@ -963,11 +984,15 @@ export default class MetadataEditorV extends Vue {
generateConfig(): ConfigFileStructure {
this.saving = true;
- // Update the configuration file.
- const fileName = `${this.uuid}_${this.configLang}.json`;
- const formattedConfigFile = JSON.stringify(this.configs[this.configLang], null, 4);
+ // Update the configuration files, for both languages.
+ const engFileName = `${this.uuid}_en.json`;
+ const frFileName = `${this.uuid}_fr.json`;
+
+ const engFormattedConfigFile = JSON.stringify(this.configs.en, null, 4);
+ const frFormattedConfigFile = JSON.stringify(this.configs.fr, null, 4);
- this.configFileStructure?.zip.file(fileName, formattedConfigFile);
+ this.configFileStructure?.zip.file(engFileName, engFormattedConfigFile);
+ this.configFileStructure?.zip.file(frFileName, frFormattedConfigFile);
// Upload the ZIP file.
this.configFileStructure?.zip.generateAsync({ type: 'blob' }).then((content: Blob) => {
@@ -1131,7 +1156,7 @@ export default class MetadataEditorV extends Vue {
returnTop: true
};
this.configs = { en: undefined, fr: undefined };
- this.slides = [];
+ this.bothLanguageSlides = [];
}
/**
@@ -1145,7 +1170,7 @@ export default class MetadataEditorV extends Vue {
this.loadConfig(this.configs[this.configLang]);
if (this.loadEditor) {
- (this.$refs.mainEditor as EditorV).updateSlides(this.slides);
+ (this.$refs.mainEditor as EditorV).updateSlides(this.bothLanguageSlides);
(this.$refs.mainEditor as EditorV).selectSlide(-1);
}
}
@@ -1365,7 +1390,7 @@ export default class MetadataEditorV extends Vue {
diff --git a/src/definitions.ts b/src/definitions.ts
index abc784dc..4a54affe 100644
--- a/src/definitions.ts
+++ b/src/definitions.ts
@@ -143,6 +143,11 @@ export interface Slide {
includeInToc?: boolean;
}
+export interface SlideForBothLanguages {
+ en: Slide | undefined;
+ fr: Slide | undefined;
+}
+
export enum PanelType {
Text = 'text',
Image = 'image',
diff --git a/src/lang/lang.csv b/src/lang/lang.csv
index 7848585a..f5e9080a 100644
--- a/src/lang/lang.csv
+++ b/src/lang/lang.csv
@@ -32,7 +32,7 @@ editor.window.title,RAMP Storylines Editor,1,Éditeur de scénarios de la PCAR,1
editor.configOverwrite,Are you sure you want to overwrite product '{uuid}'?,1,Êtes-vous sûr de vouloir remplacer le produit « {uuid} » ?,0
editor.createProduct,Create New Storylines Product,1,Créer un nouveau produit de scénarios,1
editor.editProduct,Edit Existing Storylines Product,1,Modifier un produit de scénarios,1
-editor.editMetadata,Edit Project Metadata,1,Modifier les métadonnées d’un projet,1
+editor.editMetadata,Edit Project Metadata,1,Modifier les métadonnées,1
editor.productDetails,Storylines product details,1,Détails du produit de scénarios,1
editor.metadata.instructions,Fill in metadata details about your new Storylines product. Use the "Preview" button to see what your slides will look like.,1,Inscrivez les métadonnées de votre nouveau produit de scénario. Utilisez la fonction « Afficher l’aperçu » pour voir à quoi ressemblent vos diapositives.,1
editor.uuid,UUID,1,UUID,1
@@ -123,8 +123,9 @@ editor.slideshow.label.edit,Edit existing item,1,Modifier un élément existant,
editor.slideshow.label.type,Type,1,Type,0
editor.slideshow.label.add,Add,1,Ajouter,1
editor.slideshow.label.slideNumber,Slide Number,1,Numéro de diapositive,0
-editor.slides.title,SLIDES,1,DIAPOSITIVES,1
-editor.slides.addSlide,"New Slide",1,Nouvelle diapositive,1
+editor.slides.title,Intro title,1,Titre de l’introduction,1
+editor.slides.addSlide,"New blank slide",1,Nouvelle diapositive,0
+editor.slides.currentLangLabel,({lang} slide),1,(Diapositive en {lang}),0
editor.slides.copyFromLang,"Copy slides from the other language",1,"Copier les diapositives de l’autre langue",1
editor.slides.deleteSlide.confirm,"Are you sure you want to delete the slide {title}?",1,"Voulez-vous vraiment supprimer la diapositive {titre}?",1
editor.slides.changeSlide.confirm,"Are you sure you want to change the slide {title}? All unsaved progress will be lost.",1,"Voulez-vous vraiment modifier la diapositive {titre}? Toute modification non enregistrée sera perdue.",1
@@ -135,6 +136,22 @@ editor.slides.copyAll,Copy all,1,Copier tout,1
editor.slides.copyAll.confirm,Are you sure you want to copy all slides?,1,Êtes-vous sûr de vouloir copier toutes les diapositives ?,0
editor.slides.copy,Copy,1,Copier,1
editor.slides.slide,Slide,1,Diapositive,1
+editor.slides.toc.copySlide,Copy Slide,1,Copier la diapositive,0
+editor.slides.toc.deleteSlide,Delete Slide,1,Supprimer la diapositive,0
+editor.slides.toc.newENGSlideText,New ENG Slide *,1,Nouvelle diapositive ANG *,0
+editor.slides.toc.newFRSlideText,New FR Slide *,1,Novelle diapositive FR *,0
+editor.slides.toc.noENGslide,(No English Config),1,(Pas de configuration Anglais),0
+editor.slide.toc.noFRSlide,(No French Config),1,(Pas de configuration française),0
+editor.slides.toc.prevEngDNE,Cannot create this config if previous slide EN config does not exist.,1,Impossible de créer cette configuration si la configuration EN de la diapositive précédente n'existe pas.,0
+editor.slide.toc.prevFrDNE,Cannot create this config if previous slide FR config does not exist.,1,Impossible de créer cette configuration si la configuration FR de la diapositive précédente n'existe pas.,0
+editor.slides.toc.newBlankConfig,Create new blank config,1,Créer une nouvelle configuration vierge,0
+editor.slides.toc.newConfigFromFR,Copy config from French slide,1,Copier la configuration à partir de la diapositive française,0
+editor.slides.toc.newConfigFromEng,Copy config from English slide,1,Copier la configuration à partir de la diapositive anglais,0
+editor.slides.toc.moveSlideUp,Move slide up,1,Déplacer la diapositive vers le haut,0
+editor.slides.toc.moveSlideDown,Move slide down,1,Déplacer la diapositive vers le bas,0
+editor.slides.toc.isolatedUndefinedFRconfig,This is an isolated undefined config; ALL existing FR configs in below slides will be automatically moved up upon save & reload! Configs MUST be defined continuously without undefined breaks.,1,Il s'agit d'une configuration non définie isolée ; TOUTES les configurations FR existantes dans les diapositives ci-dessous seront automatiquement déplacées vers le haut lors de l'enregistrement et du rechargement ! Les configurations DOIVENT être définies en continu sans interruptions indéfinies.,0
+editor.slides.toc.isolatedUndefinedENGconfig,This is an isolated undefined config; ALL existing EN configs in below slides will be automatically moved up upon save & reload! Configs MUST be defined continuously without undefined breaks.,1,Il s'agit d'une configuration non définie isolée ; TOUTES les configurations EN existantes dans les diapositives ci-dessous seront automatiquement déplacées vers le haut lors de l'enregistrement et du rechargement ! Les configurations DOIVENT être définies en continu sans interruptions indéfinies.,0
+editor.slides.toc.deleteConfig,Delete Config (You can delete the last configs for each lang),1,Supprimer la configuration (vous pouvez supprimer les dernières configurations pour chaque langue),0
editor.slides.previousSlide,Previous slide,1,Diapositive précédente,1
editor.slides.nextSlide,Next slide,1,Diapositive suivante,1
editor.slides.leftPanel,Left panel,1,Panneau de gauche,1
@@ -154,6 +171,7 @@ editor.slides.panel.body,Panel body,1,Corps du panneau,1
editor.slides.panel.title,Panel title,1,Titre du panneau,1
editor.slides.intro,Intro subtitle,1,Sous-titre de l’introduction,1
editor.slides.title,Intro title,1,Titre de l’introduction,1
+editor.slides.slideHeader,SLIDES,1,DIAPOSITIVES,0
editor.slides.includeInToc,Include in table of contents,1,Inclure dans la table des matières,0
editor.slide.untitled,Untitled slide,1,Diapositive sans titre,0
editor.slide.copy.success,Slide copied successfully!,1,Diapositive copiée avec succès !,0