From 63fc89538d7ecffd0f3f135fd998a6222659ac80 Mon Sep 17 00:00:00 2001
From: Laurent Laffont <llaffont@afi-sa.fr>
Date: Fri, 16 Sep 2022 12:54:06 +0000
Subject: [PATCH] dev #132136 Admin print models: switch from CKEditor to
 CodeMirror

---
 FEATURES/132136                               | 10 ++++
 VERSIONS_WIP/132136                           |  1 +
 .../admin/controllers/PrintController.php     |  6 +-
 .../Plugin/Manager/ModeleFusion.php           | 21 ++++++-
 .../ResourceDefinition/ModeleFusion.php       |  6 +-
 library/ZendAfi/Form/ModeleFusion.php         |  4 +-
 public/admin/skins/bokeh74/global.css         |  5 ++
 .../admin/controllers/PrintControllerTest.php | 59 +++++++++++++------
 8 files changed, 85 insertions(+), 27 deletions(-)
 create mode 100644 FEATURES/132136
 create mode 100644 VERSIONS_WIP/132136

diff --git a/FEATURES/132136 b/FEATURES/132136
new file mode 100644
index 00000000000..2dcff8ef88f
--- /dev/null
+++ b/FEATURES/132136
@@ -0,0 +1,10 @@
+        '132136' =>
+            ['Label' => $this->_('Modèles d\'impression : export PDF'),
+             'Desc' => $this->_('Adaptation de l\'éditeur de modèles d\'impression pour éditer des modèles avancés'),
+             'Image' => '',
+             'Video' => '',
+             'Category' => '',
+             'Right' => function($feature_description, $user) {return true;},
+             'Wiki' => 'https://wiki.bokeh-library-portal.org/index.php?title=Cat%C3%A9gorie:Mod%C3%A8les_d%27impressions',
+             'Test' => '',
+             'Date' => '2022-09-16'],
\ No newline at end of file
diff --git a/VERSIONS_WIP/132136 b/VERSIONS_WIP/132136
new file mode 100644
index 00000000000..e91fca499fc
--- /dev/null
+++ b/VERSIONS_WIP/132136
@@ -0,0 +1 @@
+ - fonctionnalité #132136 : Editeur de modèle d'impressions : utilisation de CodeMirror, plus adapté que l'éditeur CKEditor
\ No newline at end of file
diff --git a/application/modules/admin/controllers/PrintController.php b/application/modules/admin/controllers/PrintController.php
index a0bd2cedcac..9860de03a76 100644
--- a/application/modules/admin/controllers/PrintController.php
+++ b/application/modules/admin/controllers/PrintController.php
@@ -22,8 +22,8 @@
 
 class Admin_PrintController extends ZendAfi_Controller_Action {
   public function getPlugins() {
-    return ['ZendAfi_Controller_Plugin_ResourceDefinition_ModeleFusion',
-            'ZendAfi_Controller_Plugin_Manager_ModeleFusion'];
+    return [ZendAfi_Controller_Plugin_ResourceDefinition_ModeleFusion::class,
+            ZendAfi_Controller_Plugin_Manager_ModeleFusion::class];
   }
 
 
@@ -31,4 +31,4 @@ class Admin_PrintController extends ZendAfi_Controller_Action {
     $this->view->titre=$this->view->_('Modèles d\'impressions');
     $this->view->models= Class_ModeleFusion::getTemplates();
   }
-}
\ No newline at end of file
+}
diff --git a/library/ZendAfi/Controller/Plugin/Manager/ModeleFusion.php b/library/ZendAfi/Controller/Plugin/Manager/ModeleFusion.php
index e37d6a3eb64..eda6588bd95 100644
--- a/library/ZendAfi/Controller/Plugin/Manager/ModeleFusion.php
+++ b/library/ZendAfi/Controller/Plugin/Manager/ModeleFusion.php
@@ -38,5 +38,24 @@ class ZendAfi_Controller_Plugin_Manager_ModeleFusion extends ZendAfi_Controller_
     Class_ModeleFusion::generateDefaults($this->_view);
     $this->_redirectToReferer();
   }
+
+
+  protected function _postEditAction($model) {
+    Class_ScriptLoader::getInstance()
+      ->loadCodeMirror()
+      ->addAdminScript('codemirror-4.4/mode/css/css')
+      ->addAdminScript('codemirror-4.4/mode/xml/xml')
+      ->addAdminScript('codemirror-4.4/mode/htmlmixed/htmlmixed')
+      ->addInlineStyle('.CodeMirror-wrap { height: 500px }')
+      ->addJQueryReady("
+         CodeMirror.fromTextArea($('textarea[name=\'contenu\']')[0],
+              {
+                lineNumbers:true,
+                tabSize:2,
+                matchBrackets:true,
+                lineWrapping:true,
+                mode: 'htmlmixed'
+              });");
+  }
 }
-?>
\ No newline at end of file
+?>
diff --git a/library/ZendAfi/Controller/Plugin/ResourceDefinition/ModeleFusion.php b/library/ZendAfi/Controller/Plugin/ResourceDefinition/ModeleFusion.php
index 3455f0763da..abd664d2ebf 100644
--- a/library/ZendAfi/Controller/Plugin/ResourceDefinition/ModeleFusion.php
+++ b/library/ZendAfi/Controller/Plugin/ResourceDefinition/ModeleFusion.php
@@ -23,7 +23,7 @@
 class ZendAfi_Controller_Plugin_ResourceDefinition_ModeleFusion extends ZendAfi_Controller_Plugin_ResourceDefinition_Abstract {
 
   public function getDefinitions() {
-    return ['model' => ['class' => 'Class_ModeleFusion',
+    return ['model' => ['class' => Class_ModeleFusion::class,
                         'name' => 'modele_fusion',
                         'order' => 'id'],
 
@@ -34,10 +34,10 @@ class ZendAfi_Controller_Plugin_ResourceDefinition_ModeleFusion extends ZendAfi_
             'actions' => ['edit' => ['title' => $this->_('Modifier le modèle d\'impression "%s"')],
                           'add' => ['title' => $this->_('Créer un nouveau modèle d\'impression')]],
 
-            'form_class_name' => 'ZendAfi_Form_ModeleFusion',
+            'form_class_name' => ZendAfi_Form_ModeleFusion::class,
 
             'after_delete' => function() { $this->_redirect('/admin/print/index');}
     ];
   }
 }
-?>
\ No newline at end of file
+?>
diff --git a/library/ZendAfi/Form/ModeleFusion.php b/library/ZendAfi/Form/ModeleFusion.php
index 89b5e7800eb..46ccb968bb6 100644
--- a/library/ZendAfi/Form/ModeleFusion.php
+++ b/library/ZendAfi/Form/ModeleFusion.php
@@ -44,7 +44,7 @@ class ZendAfi_Form_ModeleFusion extends ZendAfi_Form {
                       'profil_ids',
                       ['label' => $form->_('Afficher pour les profils (separé par des ;)'),
                       ])
-         ->addElement('ckeditor',
+         ->addElement('textarea',
                       'contenu',
                       [
                        'label' => '',
@@ -65,4 +65,4 @@ class ZendAfi_Form_ModeleFusion extends ZendAfi_Form {
   }
 
 }
-?>
\ No newline at end of file
+?>
diff --git a/public/admin/skins/bokeh74/global.css b/public/admin/skins/bokeh74/global.css
index 9531d3fea68..5f131b7499e 100755
--- a/public/admin/skins/bokeh74/global.css
+++ b/public/admin/skins/bokeh74/global.css
@@ -1207,3 +1207,8 @@ img.cke_slideShow {
     height: 100px;
     margin: 5px;
 }
+
+
+.CodeMirror pre {
+    box-shadow: none;
+}
diff --git a/tests/application/modules/admin/controllers/PrintControllerTest.php b/tests/application/modules/admin/controllers/PrintControllerTest.php
index e11c5a88981..6773ea9f4ab 100644
--- a/tests/application/modules/admin/controllers/PrintControllerTest.php
+++ b/tests/application/modules/admin/controllers/PrintControllerTest.php
@@ -21,11 +21,9 @@
 
 
 class PrintControllerIndexTest extends Admin_AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
-
   public function setUp() {
     parent::setUp();
-    $this->fixture('Class_ModeleFusion',
+    $this->fixture(Class_ModeleFusion::class,
                    ['id' => 5,
                     'nom' => 'Search result',
                     'type' => 'Notice_List',
@@ -56,8 +54,6 @@ class PrintControllerIndexTest extends Admin_AbstractControllerTestCase {
 
 
 class PrintControllerGenerateTest extends Admin_AbstractControllerTestCase {
- protected $_storm_default_to_volatile = true;
-
   public function setUp() {
     parent::setUp();
     $this->dispatch('/admin/print/generate', true);
@@ -98,21 +94,21 @@ class PrintControllerGenerateTest extends Admin_AbstractControllerTestCase {
 
 
 class PrintControllerIndexActionTest extends AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
   public function setUp() {
     parent::setUp();
-    $modele_lettre_stagiaires = $this->fixture('Class_ModeleFusion',
-                                               ['id' => 19,
-                                                'nom' =>'ACTIVITY_LISTE_STAGIAIRES',
-                                                'contenu' => '<h1>Liste des stagiaires pour la session du {session_activity.date_debut_texte} au {session_activity.date_fin_texte}</h1>
+    $this->fixture(Class_ModeleFusion::class,
+                   ['id' => 19,
+                    'nom' =>'ACTIVITY_LISTE_STAGIAIRES',
+                    'contenu' => '<h1>Liste des stagiaires pour la session du {session_activity.date_debut_texte} au {session_activity.date_fin_texte}</h1>
                     <h2>{session_activity.activity.libelle}</h2>
                     {session_activity.stagiaires["Nom":nom, "Prénom":prenom, "Bibliothèque":bib.libelle, "Téléphone":telephone]}']);
 
-    $this->fixture('Class_ModeleFusion', ['id' => 1,
-                                          'nom' => 'Template recherche',
-                                          'contenu' => '<p> {notices.each[<img src="{url_vignette}"/>  {titre_principal} <div>{article.contenu}</div>
+    $this->fixture(Class_ModeleFusion::class,
+                   ['id' => 1,
+                    'nom' => 'Template recherche',
+                    'contenu' => '<p> {notices.each[<img src="{url_vignette}"/>  {titre_principal} <div>{article.contenu}</div>
 ]}</p>',
-                                          'type' => 'Notice_List']);
+                    'type' => 'Notice_List']);
 
     $this->dispatch('/admin/print/index',true);
   }
@@ -134,8 +130,6 @@ class PrintControllerIndexActionTest extends AbstractControllerTestCase {
 
 
 class PrintControllerAddActionTest extends AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
-
   public function setUp() {
     parent::setUp();
     $this->dispatch('/admin/print/add',true);
@@ -158,7 +152,6 @@ class PrintControllerAddActionTest extends AbstractControllerTestCase {
 
 
 class PrintControllerPostActionTest extends AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
   public function setUp() {
     parent::setUp();
     $this->postDispatch('/admin/print/add', ['nom' => 'recherche',
@@ -170,6 +163,36 @@ class PrintControllerPostActionTest extends AbstractControllerTestCase {
 
   /** @test */
   public function templateShouldSaveProfils() {
-    $this->assertEquals('5;6',Class_ModeleFusion::find(1)->getProfilIds());
+    $this->assertEquals('5;6', Class_ModeleFusion::find(1)->getProfilIds());
+  }
+}
+
+
+
+
+class PrintControllerAdminEditTest extends AbstractControllerTestCase {
+  public function setUp() {
+    parent::setUp();
+    $this->fixture(Class_ModeleFusion::class,
+                       ['id' => 1,
+                        'nom' => 'Notices',
+                        'contenu' => '<p> {notices.each[<img src="{url_vignette}"/>  {titre_principal} <div>{article.contenu}</div>
+]}</p>',
+                        'type' => 'Notice_List']);
+
+    $this->dispatch('/admin/print/edit/id/1');
+  }
+
+
+  /** @test */
+  public function textAreaShouldContainsContentNoticesEach() {
+    $this->assertXPathContentContains('//textarea[@name="contenu"]',
+                                      'notices.each[');
+  }
+
+
+  /** @test */
+  public function pageShouldLoadCodeMirror() {
+    $this->assertXPathContentContains('//script', 'CodeMirror.fromTextArea($(\'textarea[name=\\\'contenu\\\'');
   }
 }
-- 
GitLab