From ed30ca9979906f29105cd79fddbd3f7a835035c7 Mon Sep 17 00:00:00 2001
From: s j <sj@1729.be>
Date: Sat, 16 Mar 2024 07:42:11 +0000
Subject: [PATCH 1/2] imp: I-7853 calendar performance

---
 modules/druplan_fc/js/druplan_fc.js           | 25 ++++++++++++++-----
 .../templates/views-view-druplan-fc.html.twig | 10 +++++---
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/modules/druplan_fc/js/druplan_fc.js b/modules/druplan_fc/js/druplan_fc.js
index 9aab4b3..13a4a73 100644
--- a/modules/druplan_fc/js/druplan_fc.js
+++ b/modules/druplan_fc/js/druplan_fc.js
@@ -115,7 +115,9 @@
   }
 
   function eventContent (info) {
-    return { html: info.event.extendedProps.renderedContent };
+    var div = document.createElement('div');
+    div.innerHTML = info.event.extendedProps.renderedContent;
+    return { html: div.textContent };
   }
   function eventDidMount(info){
     // Hier moeten we de variabele uit iets anders als de bordercolor weten halen, want nu worden er op sommige events extra borders geplaatst.
@@ -226,17 +228,18 @@
 	  refreshView(views_container);
 	  return;
 	}
+	  /*	  
 	var events = $('#fc-1-events li').map(
 	  function (i, e) {
 	    // TODO: refactor to loop, but start and end have time element and first/last selector.
-
+	 
 	    var url = new URL($.trim($(e).find('.' + viewSettings['event_popup_url_field']).text()), window.location.origin);
 	    url.searchParams.append('exit_offcanvas_redirect', window.location.pathname + window.location.search);
-
 	    var ev = {
-	      title: $.trim($(e).find('.' + viewSettings['title_field']).text()),
+		title: 'test', //$.trim($(e).find('.' + viewSettings['title_field']).text()),
 	      start: $(e).find('.' + viewSettings['start_field'] + ' time').first().attr('datetime'),
-	      end: $(e).find('.' + viewSettings['end_field'] + ' time').last().attr('datetime'),
+		end: $(e).find('.' + viewSettings['end_field'] + ' time').last().attr('datetime'),
+
 	      allDay: !!$(e).find('.' + viewSettings['all_day_field']).text(),
 	      borderColor: $.trim($(e).find('.' + viewSettings['color_field']).text()),
 	      classNames: $.trim($(e).find('.' + viewSettings['classes_field']).text()),
@@ -251,7 +254,17 @@
 	    return ev;
 	  }
 	);
-	successCallback(events.get());
+	  */
+	  // successCallback(events.get());
+	  event_data = $("#fc-1-events").html();
+	  if (event_data === undefined || event_data.trim().length === 0) {
+	      successCallback([]);
+	  }
+	  else {
+	      var events = $.parseJSON(event_data);
+	      console.log(events);
+	      successCallback(events);
+	  }
       };
 
       calendarOptions['events'] = extractEvents;
diff --git a/modules/druplan_fc/templates/views-view-druplan-fc.html.twig b/modules/druplan_fc/templates/views-view-druplan-fc.html.twig
index ddb09a7..38f060f 100644
--- a/modules/druplan_fc/templates/views-view-druplan-fc.html.twig
+++ b/modules/druplan_fc/templates/views-view-druplan-fc.html.twig
@@ -27,11 +27,15 @@
   </div>
 
   <ul id="fc-{{ view_index }}-events" class="druplan-fc-data">
+    {% set first=1 %}
+    [
     {% for row in rows %}
-    <li>
+    {% if first %}{% set first=0 %}{% else %},{% endif %}
+    {
       {{- row.content -}}
-    </li>
+    }
     {% endfor %}
+    ]
   </ul>
-
+  
 </div>
-- 
GitLab


From b9327f1aa6e95c466ee62e1eb9ff77082303753a Mon Sep 17 00:00:00 2001
From: s j <sj@1729.be>
Date: Sat, 16 Mar 2024 19:53:22 +0000
Subject: [PATCH 2/2] imp: I-7853 calendar performance

---
 modules/druplan_fc/druplan_fc.module          |  6 ++
 modules/druplan_fc/js/druplan_fc.js           | 17 +++++-
 .../Plugin/views/field/DruplanRestEmbed.php   | 55 +++++++++++++++++++
 .../templates/views-view-druplan-fc.html.twig | 21 +++----
 4 files changed, 87 insertions(+), 12 deletions(-)
 create mode 100644 modules/druplan_fc/src/Plugin/views/field/DruplanRestEmbed.php

diff --git a/modules/druplan_fc/druplan_fc.module b/modules/druplan_fc/druplan_fc.module
index c0750ae..b37e476 100644
--- a/modules/druplan_fc/druplan_fc.module
+++ b/modules/druplan_fc/druplan_fc.module
@@ -193,5 +193,11 @@ function druplan_fc_views_data_alter(array &$data) {
       'id' => 'druplan_color_field',
     ],
   ];
+  $data['rp_event']['druplan_rest_embed'] = [
+    'title' => t('Druplan REST embed'),
+    'field' => [
+      'id' => 'druplan_rest_embed_field',
+    ],
+  ];
 
 }
diff --git a/modules/druplan_fc/js/druplan_fc.js b/modules/druplan_fc/js/druplan_fc.js
index 13a4a73..d7f168b 100644
--- a/modules/druplan_fc/js/druplan_fc.js
+++ b/modules/druplan_fc/js/druplan_fc.js
@@ -115,9 +115,12 @@
   }
 
   function eventContent (info) {
+    /*
     var div = document.createElement('div');
     div.innerHTML = info.event.extendedProps.renderedContent;
     return { html: div.textContent };
+    */
+      return { html: info.event.extendedProps.renderedContent.replace('data-replacement-style=', 'style=') };
   }
   function eventDidMount(info){
     // Hier moeten we de variabele uit iets anders als de bordercolor weten halen, want nu worden er op sommige events extra borders geplaatst.
@@ -262,8 +265,18 @@
 	  }
 	  else {
 	      var events = $.parseJSON(event_data);
-	      console.log(events);
-	      successCallback(events);
+	      var transformed_events = $.map(events, function (e) {
+		  return {
+		      start: e[0].start,
+		      end: e[0].end,
+		      title: e[0].title,
+		      extendedProps: {
+			  renderedContent: e[0].renderedContent
+		      }
+		  }
+	      });
+	      console.log(transformed_events);
+	      successCallback(transformed_events);
 	  }
       };
 
diff --git a/modules/druplan_fc/src/Plugin/views/field/DruplanRestEmbed.php b/modules/druplan_fc/src/Plugin/views/field/DruplanRestEmbed.php
new file mode 100644
index 0000000..9ad7b65
--- /dev/null
+++ b/modules/druplan_fc/src/Plugin/views/field/DruplanRestEmbed.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Drupal\druplan_fc\Plugin\views\field;
+
+use Drupal\views\Plugin\views\field\FieldPluginBase;
+use Drupal\views\ResultRow;
+
+/**
+ * A handler to provide a field for the druplan event background color.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @ViewsField("druplan_rest_embed_field")
+ */
+class DruplanRestEmbed extends FieldPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function usesGroupBy() {
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    // Do nothing -- to override the parent query.
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+    // $options['hide_alter_empty'] = ['default' => FALSE];
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render(ResultRow $values) {
+    $entity = $this->getEntity($values);
+    return [
+        "#type" => "view",
+        "#name" => "druplan_calendar_event",
+        "#display_id" => "rest_export_1",
+        "#arguments" => [
+            $entity->id(),
+        ],
+    ];
+  }
+
+}
diff --git a/modules/druplan_fc/templates/views-view-druplan-fc.html.twig b/modules/druplan_fc/templates/views-view-druplan-fc.html.twig
index 38f060f..cdf7f79 100644
--- a/modules/druplan_fc/templates/views-view-druplan-fc.html.twig
+++ b/modules/druplan_fc/templates/views-view-druplan-fc.html.twig
@@ -25,17 +25,18 @@
   <div class="js-druplan-fc" calendar-view-index="{{ view_index }}" calendar-view-name="{{ view_id }}" calendar-display="{{ display_id }}"></div>
   <div class="bottom-buttons fc-button-group">
   </div>
+  <div id="fc-{{ view_index }}-events" class="druplan-fc-data">
+  {% set first = 1 %}
+  [
 
-  <ul id="fc-{{ view_index }}-events" class="druplan-fc-data">
-    {% set first=1 %}
-    [
     {% for row in rows %}
-    {% if first %}{% set first=0 %}{% else %},{% endif %}
-    {
-      {{- row.content -}}
-    }
+    {% if first == 1 %}
+    {% set first = 0 %}
+    {% else %}
+    ,
+    {% endif %}
+        {{- row.content -}}
     {% endfor %}
-    ]
-  </ul>
-  
+  ]
+  </div>
 </div>
-- 
GitLab