diff --git a/sites/all/modules/figli/edlp_ajax_node/edlp_ajax_node.info.yml b/sites/all/modules/figli/edlp_ajax_node/edlp_ajax_node.info.yml new file mode 100644 index 000000000..7645fa675 --- /dev/null +++ b/sites/all/modules/figli/edlp_ajax_node/edlp_ajax_node.info.yml @@ -0,0 +1,11 @@ +# @Author: Bachir Soussi Chiadmi +# @Email: bachir@figureslibres.io +# @Filename: edlp_ajax_node.info.yml +# @License: GPL-V3 + + +name: Edlp Ajax Node +type: module +description: Manage ajax node loading for edlp d8. +core: 8.x +package: Edlp diff --git a/sites/all/modules/figli/edlp_ajax_node/edlp_ajax_node.module b/sites/all/modules/figli/edlp_ajax_node/edlp_ajax_node.module new file mode 100644 index 000000000..605287674 --- /dev/null +++ b/sites/all/modules/figli/edlp_ajax_node/edlp_ajax_node.module @@ -0,0 +1,21 @@ + +# @Email: bachir@figureslibres.io +# @Filename: edlp_ajax_node.module +# @License: GPL-V3 + +/** + * Implements hook_theme(). + */ +function edlp_ajax_node_theme($existing, $type, $theme, $path) { + // @see https://www.drupal.org/docs/8/theming/twig/create-custom-twig-templates-from-custom-module + return array( + 'edlp_ajax_node' => array( + 'file' => 'includes/edlp_ajax_node.inc', + 'variables' => array( + 'node' => NULL + ), + ), + ); +} diff --git a/sites/all/modules/figli/edlp_ajax_node/edlp_ajax_node.routing.yml b/sites/all/modules/figli/edlp_ajax_node/edlp_ajax_node.routing.yml new file mode 100644 index 000000000..43f1bea66 --- /dev/null +++ b/sites/all/modules/figli/edlp_ajax_node/edlp_ajax_node.routing.yml @@ -0,0 +1,23 @@ +# @Author: Bachir Soussi Chiadmi +# @Date: 13-12-2017 +# @Email: bachir@figureslibres.io +# @Filename: edlp_corpus.routing.yml +# @Last modified by: bach +# @Last modified time: 20-12-2017 +# @License: GPL-V3 + +edlp_ajax_node.node: + path: '/edlp/node/{nid}' + defaults: + _controller: '\Drupal\edlp_ajax_node\Controller\EdlpAjaxNodeController::node' + _title: 'Node' + requirements: + _permission: 'access content' + +edlp_ajax_node.ajaxnode: + path: '/edlp/node/{nid}/ajax' + defaults: + _controller: '\Drupal\edlp_ajax_node\Controller\EdlpAjaxNodeController::nodejson' + _title: 'AjaxNode' + requirements: + _permission: 'access content' diff --git a/sites/all/modules/figli/edlp_ajax_node/includes/edlp_ajax_node.inc b/sites/all/modules/figli/edlp_ajax_node/includes/edlp_ajax_node.inc new file mode 100644 index 000000000..c344ec664 --- /dev/null +++ b/sites/all/modules/figli/edlp_ajax_node/includes/edlp_ajax_node.inc @@ -0,0 +1,12 @@ +getViewBuilder('node'); + $vars['node'] = $view_builder->view($vars['node'], 'default'); +} diff --git a/sites/all/modules/figli/edlp_ajax_node/src/Controller/EdlpAjaxNodeController.php b/sites/all/modules/figli/edlp_ajax_node/src/Controller/EdlpAjaxNodeController.php new file mode 100644 index 000000000..a76719254 --- /dev/null +++ b/sites/all/modules/figli/edlp_ajax_node/src/Controller/EdlpAjaxNodeController.php @@ -0,0 +1,54 @@ +node = entity_load('node', $this->nid); + } + + private function toRenderable(){ + $this->query(); + // dpm($this->future_nodes); + return array( + "#theme"=>'edlp_ajax_node', + '#node' => $this->node, + ); + } + + /** + * Display node as a page. + * + * @return renderable array + */ + public function node($nid) { + $this->nid = $nid; + return $this->toRenderable(); + } + + /** + * Get node as json through ajax. + * + * @return json + */ + public function nodejson($nid) { + $this->nid = $nid; + $response = new JsonResponse(); + $renderable = $this->toRenderable(); + $rendered = render($renderable); + + $response->setData([ + 'test'=>'hello edlp ajax node', + 'nid' => $this->nid, + 'rendered'=> $rendered + ]); + + return $response; + } + +} diff --git a/sites/all/modules/figli/edlp_ajax_node/templates/edlp-ajax-node.html.twig b/sites/all/modules/figli/edlp_ajax_node/templates/edlp-ajax-node.html.twig new file mode 100644 index 000000000..44667ef00 --- /dev/null +++ b/sites/all/modules/figli/edlp_ajax_node/templates/edlp-ajax-node.html.twig @@ -0,0 +1 @@ +{{ node }} diff --git a/sites/all/themes/custom/edlptheme/assets/dist/scripts/main.min.js b/sites/all/themes/custom/edlptheme/assets/dist/scripts/main.min.js index 3c50c4a87..612a9d3d7 100644 --- a/sites/all/themes/custom/edlptheme/assets/dist/scripts/main.min.js +++ b/sites/all/themes/custom/edlptheme/assets/dist/scripts/main.min.js @@ -29,6 +29,7 @@ edlp_vars = { var _is_front = _$body.is('.path-frontpage'); var _$corpus_map; var _$content_container = $('.layout-container>main>.layout-content'); + var _$ajaxLinks; function init(){ console.log("EdlpTheme init()"); @@ -53,30 +54,59 @@ edlp_vars = { // / _ \ | / _` \ \ / // /_/ \_\/ \__,_/_\_\ // |__/ + + // TODO: add url hash nav + // TODO: implement history.js function initAjaxLinks(){ console.log('initAjaxLinks'); - $('a', '#block-mainnavigation').on('click', onClickAjaxLink); + $('a', '#block-mainnavigation, #block-footer.menu--footer').addClass('ajax-link'); + + _$ajaxLinks = $('.ajax-link') + .each(function(i,e){ + var $this = $(this); + var sys_path = $this.attr('data-drupal-link-system-path'); + if(sys_path){ + // convert node link to edlp_ajax_node module links + m = sys_path.match(/^\/?(node\/\d+)$/g); + if(m) $this.attr('data-drupal-link-system-path', 'edlp/'+m[0]); + } + }) + .on('click', onClickAjaxLink); + ; }; function onClickAjaxLink(e){ e.preventDefault(); - // TODO: drupal settings not defined on NOT front page + var $link = $(this); + + if($link.is('.is-active')) + return false; + var sys_path = $(this).attr('data-drupal-link-system-path'); + if(sys_path == ''){ + closeAllModals(); + return false; + } + + // TODO: drupal settings not defined on NOT front page var path = window.location.origin + drupalSettings.basepath + sys_path +'/ajax'; closeAllModals(); _$body.addClass('ajax-loading'); + $link.addClass('ajax-loading'); $.getJSON(path, {}, function(data){ - onAjaxLinkLoaded(data, sys_path); + onAjaxLinkLoaded(data, $link, sys_path); }); return false; }; - function onAjaxLinkLoaded(data, sys_path){ + function onAjaxLinkLoaded(data, $link, sys_path){ console.log('ajax link loaded : data', data); _$content_container.html(data.rendered); - _$body.removeClass().addClass('path-'+sys_path); _$body.removeClass('ajax-loading'); + _$body.removeClass().addClass('path-'+sys_path); + _$ajaxLinks.removeClass('is-active'); + $link.removeClass('ajax-loading').addClass('is-active'); initScrollbars(); }; @@ -95,6 +125,9 @@ edlp_vars = { console.log('theme : closeAllModals'); // TODO: animate the remove _$content_container.html(''); + _$ajaxLinks.removeClass('is-active'); + $('a[data-drupal-link-system-path=""]').addClass('is-active'); + }; init(); diff --git a/sites/all/themes/custom/edlptheme/assets/dist/styles/app.min.css b/sites/all/themes/custom/edlptheme/assets/dist/styles/app.min.css index 465a0bff4..dba7ba177 100644 --- a/sites/all/themes/custom/edlptheme/assets/dist/styles/app.min.css +++ b/sites/all/themes/custom/edlptheme/assets/dist/styles/app.min.css @@ -1202,6 +1202,25 @@ header[role="banner"] { height: 0.6em; border: 1px solid #000; margin-right: 0.3em; } + #block-mainnavigation ul li a.ajax-loading:before { + -webkit-animation: rotation 2s infinite linear; + animation: rotation 2s infinite linear; } + +@-webkit-keyframes rotation { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + to { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); } } + +@keyframes rotation { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + to { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); } } #block-mainnavigation ul li a.is-active:before, #block-mainnavigation ul li a:hover:before { border-color: red; background-color: red; } @@ -1249,16 +1268,16 @@ body.ajax-loading main[role="main"]:before { content: ""; display: block; position: absolute; - width: 50px; - height: 50px; - top: calc(50% - 25px); - left: calc(50% - 25px); + width: 60px; + height: 60px; + top: calc(50% - 30px); + left: calc(50% - 30px); background-color: white; - background-image: url(../../img/edlp-loader.svg); + background-image: url(../../img/edlp-loader-anim.svg); background-size: 50%; background-repeat: no-repeat; background-position: center; - border-radius: 25px; } + border-radius: 30px; } body.path-agenda main .col, body.path-agenda main .col > .wrapper { height: 100%; } diff --git a/sites/all/themes/custom/edlptheme/assets/img/edlp-loader-anim.svg b/sites/all/themes/custom/edlptheme/assets/img/edlp-loader-anim.svg new file mode 100644 index 000000000..0ce20ab08 --- /dev/null +++ b/sites/all/themes/custom/edlptheme/assets/img/edlp-loader-anim.svg @@ -0,0 +1,44 @@ + + + + + + + + + + diff --git a/sites/all/themes/custom/edlptheme/assets/img/edlp-loader.svg b/sites/all/themes/custom/edlptheme/assets/img/edlp-loader.svg index 43efc4068..36fc73720 100644 --- a/sites/all/themes/custom/edlptheme/assets/img/edlp-loader.svg +++ b/sites/all/themes/custom/edlptheme/assets/img/edlp-loader.svg @@ -1,6 +1,4 @@ - - - - - + viewBox="0 0 10.583333 10.583334" + version="1.1" + id="svg8" + sodipodi:docname="edlp-loader.svg" + inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1025" + id="namedview941" + showgrid="false" + inkscape:zoom="22.5" + inkscape:cx="20" + inkscape:cy="20" + inkscape:window-x="0" + inkscape:window-y="28" + inkscape:window-maximized="1" + inkscape:current-layer="svg8" /> + @@ -61,19 +49,20 @@ + transform="translate(0,-286.41665)" + id="layer1"> + style="fill:#ff0004;fill-opacity:1;" + d="m 4.0136719,289.66602 c -0.250651,0.24805 -0.5013021,0.49609 -0.7519531,0.74414 1.1184896,1.12891 2.2369791,2.25781 3.3554687,3.38672 0.250651,-0.24805 0.5013021,-0.4961 0.7519531,-0.74415 -1.1184896,-1.1289 -2.2369791,-2.25781 -3.3554687,-3.38671 z" + id="red-line" + inkscape:connector-curvature="0" > + + + diff --git a/sites/all/themes/custom/edlptheme/assets/scripts/main.js b/sites/all/themes/custom/edlptheme/assets/scripts/main.js index af0d4ab4d..61cb2b1d0 100644 --- a/sites/all/themes/custom/edlptheme/assets/scripts/main.js +++ b/sites/all/themes/custom/edlptheme/assets/scripts/main.js @@ -6,6 +6,7 @@ var _is_front = _$body.is('.path-frontpage'); var _$corpus_map; var _$content_container = $('.layout-container>main>.layout-content'); + var _$ajaxLinks; function init(){ console.log("EdlpTheme init()"); @@ -30,30 +31,59 @@ // / _ \ | / _` \ \ / // /_/ \_\/ \__,_/_\_\ // |__/ + + // TODO: add url hash nav + // TODO: implement history.js function initAjaxLinks(){ console.log('initAjaxLinks'); - $('a', '#block-mainnavigation').on('click', onClickAjaxLink); + $('a', '#block-mainnavigation, #block-footer.menu--footer').addClass('ajax-link'); + + _$ajaxLinks = $('.ajax-link') + .each(function(i,e){ + var $this = $(this); + var sys_path = $this.attr('data-drupal-link-system-path'); + if(sys_path){ + // convert node link to edlp_ajax_node module links + m = sys_path.match(/^\/?(node\/\d+)$/g); + if(m) $this.attr('data-drupal-link-system-path', 'edlp/'+m[0]); + } + }) + .on('click', onClickAjaxLink); + ; }; function onClickAjaxLink(e){ e.preventDefault(); - // TODO: drupal settings not defined on NOT front page + var $link = $(this); + + if($link.is('.is-active')) + return false; + var sys_path = $(this).attr('data-drupal-link-system-path'); + if(sys_path == ''){ + closeAllModals(); + return false; + } + + // TODO: drupal settings not defined on NOT front page var path = window.location.origin + drupalSettings.basepath + sys_path +'/ajax'; closeAllModals(); _$body.addClass('ajax-loading'); + $link.addClass('ajax-loading'); $.getJSON(path, {}, function(data){ - onAjaxLinkLoaded(data, sys_path); + onAjaxLinkLoaded(data, $link, sys_path); }); return false; }; - function onAjaxLinkLoaded(data, sys_path){ + function onAjaxLinkLoaded(data, $link, sys_path){ console.log('ajax link loaded : data', data); _$content_container.html(data.rendered); - _$body.removeClass().addClass('path-'+sys_path); _$body.removeClass('ajax-loading'); + _$body.removeClass().addClass('path-'+sys_path); + _$ajaxLinks.removeClass('is-active'); + $link.removeClass('ajax-loading').addClass('is-active'); initScrollbars(); }; @@ -72,6 +102,9 @@ console.log('theme : closeAllModals'); // TODO: animate the remove _$content_container.html(''); + _$ajaxLinks.removeClass('is-active'); + $('a[data-drupal-link-system-path=""]').addClass('is-active'); + }; init(); diff --git a/sites/all/themes/custom/edlptheme/assets/styles/app.scss b/sites/all/themes/custom/edlptheme/assets/styles/app.scss index a77ace8cd..01b179c2f 100644 --- a/sites/all/themes/custom/edlptheme/assets/styles/app.scss +++ b/sites/all/themes/custom/edlptheme/assets/styles/app.scss @@ -90,6 +90,13 @@ header[role="banner"]{ border: 1px solid #000; margin-right: 0.3em; } + &.ajax-loading:before{ + @keyframes rotation { + from {transform: rotate(0deg);} + to {transform: rotate(359deg);} + } + animation: rotation 2s infinite linear; + } &.is-active:before, &:hover:before{ border-color: red; @@ -144,11 +151,11 @@ main[role="main"]{ content:""; display: block; position: absolute; - $s:50px; + $s:60px; width:$s; height:$s; top:calc(50% - #{$s/2}); left:calc(50% - #{$s/2}); background-color: white; - background-image: url(../../img/edlp-loader.svg); + background-image: url(../../img/edlp-loader-anim.svg); background-size: 50%; background-repeat: no-repeat; background-position: center; diff --git a/sites/all/themes/custom/edlptheme/templates/content/edlp-ajax-node.html.twig b/sites/all/themes/custom/edlptheme/templates/content/edlp-ajax-node.html.twig new file mode 100644 index 000000000..05542000f --- /dev/null +++ b/sites/all/themes/custom/edlptheme/templates/content/edlp-ajax-node.html.twig @@ -0,0 +1,7 @@ +
+
+
+ {{ node }} +
+
+