From d0f55c4ee98aff7eb7e5d53cbf2e3cc6889a8b5a Mon Sep 17 00:00:00 2001 From: Romain Courteaud <romain@nexedi.com> Date: Mon, 17 May 2021 16:43:43 +0000 Subject: [PATCH] romain_dev: wip presentation viewer --- .../romain_dev/OOoDocument_viewAsWeb.xml | 149 ++++++++++++++ .../your_text_content.xml | 183 ++++++++++++++++++ .../presentationviewer.gadget.html.html | 27 +++ .../presentationviewer.gadget.html.xml | 32 +++ .../presentationviewer.gadget.js.js | 178 +++++++++++++++++ .../presentationviewer.gadget.js.xml | 32 +++ 6 files changed, 601 insertions(+) create mode 100644 bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/OOoDocument_viewAsWeb.xml create mode 100644 bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/OOoDocument_viewAsWeb/your_text_content.xml create mode 100644 bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.html.html create mode 100644 bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.html.xml create mode 100644 bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.js.js create mode 100644 bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.js.xml diff --git a/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/OOoDocument_viewAsWeb.xml b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/OOoDocument_viewAsWeb.xml new file mode 100644 index 0000000000..e2bdc6cf20 --- /dev/null +++ b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/OOoDocument_viewAsWeb.xml @@ -0,0 +1,149 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="ERP5 Form" module="erp5.portal_type"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary/> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_objects</string> </key> + <value> + <tuple/> + </value> + </item> + <item> + <key> <string>action</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>action_title</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>description</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>edit_order</string> </key> + <value> + <list/> + </value> + </item> + <item> + <key> <string>encoding</string> </key> + <value> <string>UTF-8</string> </value> + </item> + <item> + <key> <string>enctype</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>group_list</string> </key> + <value> + <list> + <string>left (Page Properties)</string> + <string>right (Publication)</string> + <string>center</string> + <string>bottom</string> + </list> + </value> + </item> + <item> + <key> <string>groups</string> </key> + <value> + <dictionary> + <item> + <key> <string>bottom</string> </key> + <value> + <list> + <string>your_text_content</string> + </list> + </value> + </item> + <item> + <key> <string>center</string> </key> + <value> + <list/> + </value> + </item> + <item> + <key> <string>left (Page Properties)</string> </key> + <value> + <list/> + </value> + </item> + <item> + <key> <string>right (Publication)</string> </key> + <value> + <list/> + </value> + </item> + </dictionary> + </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>OOoDocument_viewAsWeb</string> </value> + </item> + <item> + <key> <string>method</string> </key> + <value> <string>POST</string> </value> + </item> + <item> + <key> <string>name</string> </key> + <value> <string>OOoDocument_viewAsWeb</string> </value> + </item> + <item> + <key> <string>pt</string> </key> + <value> <string>form_view</string> </value> + </item> + <item> + <key> <string>row_length</string> </key> + <value> <int>4</int> </value> + </item> + <item> + <key> <string>stored_encoding</string> </key> + <value> <string>UTF-8</string> </value> + </item> + <item> + <key> <string>title</string> </key> + <value> <string>Presentation</string> </value> + </item> + <item> + <key> <string>unicode_mode</string> </key> + <value> <int>0</int> </value> + </item> + <item> + <key> <string>update_action</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>update_action_title</string> </key> + <value> <string></string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/OOoDocument_viewAsWeb/your_text_content.xml b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/OOoDocument_viewAsWeb/your_text_content.xml new file mode 100644 index 0000000000..c503cb2160 --- /dev/null +++ b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/OOoDocument_viewAsWeb/your_text_content.xml @@ -0,0 +1,183 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="ProxyField" module="Products.ERP5Form.ProxyField"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>delegated_list</string> </key> + <value> + <list> + <string>default</string> + <string>description</string> + <string>enabled</string> + <string>gadget_url</string> + <string>js_sandbox</string> + <string>title</string> + </list> + </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>your_text_content</string> </value> + </item> + <item> + <key> <string>message_values</string> </key> + <value> + <dictionary> + <item> + <key> <string>external_validator_failed</string> </key> + <value> <string>The input failed the external validator.</string> </value> + </item> + </dictionary> + </value> + </item> + <item> + <key> <string>overrides</string> </key> + <value> + <dictionary> + <item> + <key> <string>field_id</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>form_id</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>target</string> </key> + <value> <string></string> </value> + </item> + </dictionary> + </value> + </item> + <item> + <key> <string>tales</string> </key> + <value> + <dictionary> + <item> + <key> <string>default</string> </key> + <value> + <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> + </value> + </item> + <item> + <key> <string>description</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>enabled</string> </key> + <value> + <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> + </value> + </item> + <item> + <key> <string>field_id</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>form_id</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>gadget_url</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>height</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>js_sandbox</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>target</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>title</string> </key> + <value> <string></string> </value> + </item> + </dictionary> + </value> + </item> + <item> + <key> <string>values</string> </key> + <value> + <dictionary> + <item> + <key> <string>default</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>description</string> </key> + <value> <string>Content of the web page</string> </value> + </item> + <item> + <key> <string>enabled</string> </key> + <value> <int>1</int> </value> + </item> + <item> + <key> <string>field_id</string> </key> + <value> <string>my_text_content</string> </value> + </item> + <item> + <key> <string>form_id</string> </key> + <value> <string>Base_viewWebFieldLibrary</string> </value> + </item> + <item> + <key> <string>gadget_url</string> </key> + <value> <string>presentationviewer.gadget.html</string> </value> + </item> + <item> + <key> <string>height</string> </key> + <value> <int>40</int> </value> + </item> + <item> + <key> <string>js_sandbox</string> </key> + <value> <string>iframe</string> </value> + </item> + <item> + <key> <string>target</string> </key> + <value> <string>Click to edit the target</string> </value> + </item> + <item> + <key> <string>title</string> </key> + <value> <string>Page Content</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </pickle> + </record> + <record id="2" aka="AAAAAAAAAAI="> + <pickle> + <global name="TALESMethod" module="Products.Formulator.TALESField"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>_text</string> </key> + <value> <string>python: here.asEntireHTML()</string> </value> + </item> + </dictionary> + </pickle> + </record> + <record id="3" aka="AAAAAAAAAAM="> + <pickle> + <global name="TALESMethod" module="Products.Formulator.TALESField"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>_text</string> </key> + <value> <string>not:here/isExternalDocument</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.html.html b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.html.html new file mode 100644 index 0000000000..9ce0437981 --- /dev/null +++ b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.html.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <head> + <!-- + data-i18n=Maximize + --> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Presentation Viewer Gadget</title> + + <link rel="stylesheet" href="reveal/reveal.css"> + <link rel="stylesheet" href="reveal/reveal_theme_white.css"> + + <script src="rsvp.js" type="text/javascript"></script> + <script src="renderjs.js" type="text/javascript"></script> + + <script src="gadget_global.js"></script> + <script src="domsugar.js"></script> + <script src="jiodev.js"></script> + + <script src="reveal/reveal.js" type="text/javascript"></script> + <script src="presentationviewer.gadget.js" type="text/javascript"></script> + + </head> + <body> + </body> +</html> \ No newline at end of file diff --git a/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.html.xml b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.html.xml new file mode 100644 index 0000000000..a4d02bcaad --- /dev/null +++ b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.html.xml @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="File" module="OFS.Image"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>_Cacheable__manager_id</string> </key> + <value> <string>must_revalidate_http_cache</string> </value> + </item> + <item> + <key> <string>__name__</string> </key> + <value> <string>presentationviewer.gadget.html</string> </value> + </item> + <item> + <key> <string>content_type</string> </key> + <value> <string>text/html</string> </value> + </item> + <item> + <key> <string>precondition</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>title</string> </key> + <value> <string></string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.js.js b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.js.js new file mode 100644 index 0000000000..2c398ae93f --- /dev/null +++ b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.js.js @@ -0,0 +1,178 @@ +/*global window, rJS, RSVP, domsugar, Reveal, URL, DOMParser*/ +/*jslint nomen: true, maxlen:80, indent:2*/ +(function (window, rJS, RSVP, domsugar, Reveal, URL, DOMParser) { + "use strict"; + + function fixupERP5UrlCompatibility(jio_key, url) { + if (!jio_key) { + return url; + } + return new URL( + url, + new URL(jio_key + '/', window.location.href).href + ).href; + } + +/* + function getSlideElementList(presentation_html) { + // Convert to an Array so that array methods can be used to reorder slides + return Array.prototype.slice.call(domsugar('div', { + 'class': 'slide_list', + html: presentation_html + }).querySelectorAll(':scope > section')); + } +*/ + + function replaceNode(current_node, new_tag) { + var fragment = domsugar(new_tag); + + while (current_node.firstChild) { + fragment.appendChild(current_node.firstChild); + } + current_node.parentNode.removeChild( + current_node + ); + return fragment; + } + + function cleanupSlide(slide_html, jio_key) { + var slide_doc = (new DOMParser()).parseFromString(slide_html, + 'text/html').body, + // slide_doc = domsugar('div', {html: slide_html}), + slide_img_url = slide_doc.querySelector('img').getAttribute('src'), + br_element = slide_doc.querySelector('h3').nextSibling, + note_list = [], + note; + console.log(slide_img_url, br_element); + + if (br_element !== null) { + note = br_element.nextSibling; + while (note) { + note_list.push(note); + note = note.nextSibling; + } + } + + return domsugar('section', [ + domsugar('section', [ + domsugar('img', {src: fixupERP5UrlCompatibility(jio_key, slide_img_url)}) + ]), + domsugar('section', note_list) + ]); + + + var detail_list = Array.prototype.slice.call( + slide_element.querySelectorAll(':scope > details') + ), + len = detail_list.length, + i, + section_element; + + if (len > 0) { + // Create the first vertical section containing every else than details + section_element = domsugar('section'); + while (slide_element.firstChild) { + section_element.appendChild(slide_element.firstChild); + } + slide_element.appendChild(section_element); + + // Transform every details into a section, + // and move it outside the first vertical section + for (i = 0; i < len; i += 1) { + if (detail_list[i].firstChild) { + slide_element.appendChild(replaceNode(detail_list[i], 'section')); + } else { + // Drop empty details element + section_element.removeChild(detail_list[i]); + } + } + } + + // Rewrite img url to support sub document ID + detail_list = Array.prototype.slice.call( + slide_element.querySelectorAll('img') + ); + len = detail_list.length; + for (i = 0; i < len; i += 1) { + detail_list[i].src = fixupERP5UrlCompatibility( + jio_key, + detail_list[i].getAttribute('src') + ) + } + + + return slide_element; + } + + function calculateFullPresentationFormat(first_slide_html, jio_key) { + + return domsugar('div', {class: 'reveal'}, [ + domsugar('div', {class: 'slides'}, [ + cleanupSlide(first_slide_html, jio_key) + ]) + ]); + + console.log(result.outerHTML); + return result; +/* + var slide_list = getSlideElementList(presentation_html), + i, + len = slide_list.length; + for (i = 0; i < len; i += 1) { + cleanupSlide(slide_list[i], jio_key); + } + return domsugar('div', {class: 'reveal'}, [ + domsugar('div', {class: 'slides'}, slide_list) + ]); +*/ + } + + /////////////////////////////////////////////////// + // Gadget + /////////////////////////////////////////////////// + rJS(window) + + + .declareMethod('render', function (options) { + return this.changeState({ + value: options.value || "", + jio_key: options.jio_key + }); + }) + + .onStateChange(function () { + var gadget = this; + return new RSVP.Queue() + .push(function () { + domsugar(gadget.element, [ + calculateFullPresentationFormat(gadget.state.value, gadget.state.jio_key) + ]); + + return Reveal.initialize(gadget.element, { + controls: true, + progress: true, + history: true, + center: false, + transition: 'slide', + // Exposes the reveal.js API through window.postMessage + postMessage: true, + // Dispatches all reveal.js events to the parent window + // through postMessage + postMessageEvents: false + }); + }) + .push(function () { + Reveal.configure({ + slideNumber: 'c / t', + // XXX This will not work if iframe is from another domain + width: window.parent.innerWidth, + height: window.parent.innerHeight, + minScale: 0.01, + maxScale: 10 + }); + Reveal.layout(); + }); + }); + + +}(window, rJS, RSVP, domsugar, Reveal, URL, DOMParser)); \ No newline at end of file diff --git a/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.js.xml b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.js.xml new file mode 100644 index 0000000000..590497d84c --- /dev/null +++ b/bt5/romain_dev/SkinTemplateItem/portal_skins/romain_dev/presentationviewer.gadget.js.xml @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="File" module="OFS.Image"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>_Cacheable__manager_id</string> </key> + <value> <string>must_revalidate_http_cache</string> </value> + </item> + <item> + <key> <string>__name__</string> </key> + <value> <string>presentationviewer.gadget.js</string> </value> + </item> + <item> + <key> <string>content_type</string> </key> + <value> <string>application/javascript</string> </value> + </item> + <item> + <key> <string>precondition</string> </key> + <value> <string></string> </value> + </item> + <item> + <key> <string>title</string> </key> + <value> <string></string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> -- 2.30.9