added animation to edlp loader, created edlp_ajax_node module

This commit is contained in:
Bachir Soussi Chiadmi
2018-03-01 13:06:19 +01:00
parent de3d9edc03
commit 432fb2367f
13 changed files with 321 additions and 67 deletions
@@ -0,0 +1,11 @@
# @Author: Bachir Soussi Chiadmi <bach>
# @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
@@ -0,0 +1,21 @@
<?php
# @Author: Bachir Soussi Chiadmi <bach>
# @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
),
),
);
}
@@ -0,0 +1,23 @@
# @Author: Bachir Soussi Chiadmi <bach>
# @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'
@@ -0,0 +1,12 @@
<?php
// use Drupal\Core\Url;
function template_preprocess_edlp_ajax_node(&$vars){
// dpm($vars);
/*
@see https://www.drupal8.ovh/index.php/en/tutoriels/339/render-a-node-or-an-entity
*/
$view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
$vars['node'] = $view_builder->view($vars['node'], 'default');
}
@@ -0,0 +1,54 @@
<?php
namespace Drupal\edlp_ajax_node\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\JsonResponse;
class EdlpAjaxNodeController extends ControllerBase {
private function query() {
$this->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;
}
}
@@ -0,0 +1 @@
{{ node }}
@@ -29,6 +29,7 @@ edlp_vars = {
var _is_front = _$body.is('.path-frontpage'); var _is_front = _$body.is('.path-frontpage');
var _$corpus_map; var _$corpus_map;
var _$content_container = $('.layout-container>main>.layout-content'); var _$content_container = $('.layout-container>main>.layout-content');
var _$ajaxLinks;
function init(){ function init(){
console.log("EdlpTheme init()"); console.log("EdlpTheme init()");
@@ -53,30 +54,59 @@ edlp_vars = {
// / _ \ | / _` \ \ / // / _ \ | / _` \ \ /
// /_/ \_\/ \__,_/_\_\ // /_/ \_\/ \__,_/_\_\
// |__/ // |__/
// TODO: add url hash nav
// TODO: implement history.js
function initAjaxLinks(){ function initAjaxLinks(){
console.log('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){ function onClickAjaxLink(e){
e.preventDefault(); 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'); var sys_path = $(this).attr('data-drupal-link-system-path');
if(sys_path == '<front>'){
closeAllModals();
return false;
}
// TODO: drupal settings not defined on NOT front page
var path = window.location.origin + drupalSettings.basepath + sys_path +'/ajax'; var path = window.location.origin + drupalSettings.basepath + sys_path +'/ajax';
closeAllModals(); closeAllModals();
_$body.addClass('ajax-loading'); _$body.addClass('ajax-loading');
$link.addClass('ajax-loading');
$.getJSON(path, {}, function(data){ $.getJSON(path, {}, function(data){
onAjaxLinkLoaded(data, sys_path); onAjaxLinkLoaded(data, $link, sys_path);
}); });
return false; return false;
}; };
function onAjaxLinkLoaded(data, sys_path){ function onAjaxLinkLoaded(data, $link, sys_path){
console.log('ajax link loaded : data', data); console.log('ajax link loaded : data', data);
_$content_container.html(data.rendered); _$content_container.html(data.rendered);
_$body.removeClass().addClass('path-'+sys_path);
_$body.removeClass('ajax-loading'); _$body.removeClass('ajax-loading');
_$body.removeClass().addClass('path-'+sys_path);
_$ajaxLinks.removeClass('is-active');
$link.removeClass('ajax-loading').addClass('is-active');
initScrollbars(); initScrollbars();
}; };
@@ -95,6 +125,9 @@ edlp_vars = {
console.log('theme : closeAllModals'); console.log('theme : closeAllModals');
// TODO: animate the remove // TODO: animate the remove
_$content_container.html(''); _$content_container.html('');
_$ajaxLinks.removeClass('is-active');
$('a[data-drupal-link-system-path="<front>"]').addClass('is-active');
}; };
init(); init();
@@ -1202,6 +1202,25 @@ header[role="banner"] {
height: 0.6em; height: 0.6em;
border: 1px solid #000; border: 1px solid #000;
margin-right: 0.3em; } 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 { #block-mainnavigation ul li a.is-active:before, #block-mainnavigation ul li a:hover:before {
border-color: red; border-color: red;
background-color: red; } background-color: red; }
@@ -1249,16 +1268,16 @@ body.ajax-loading main[role="main"]:before {
content: ""; content: "";
display: block; display: block;
position: absolute; position: absolute;
width: 50px; width: 60px;
height: 50px; height: 60px;
top: calc(50% - 25px); top: calc(50% - 30px);
left: calc(50% - 25px); left: calc(50% - 30px);
background-color: white; background-color: white;
background-image: url(../../img/edlp-loader.svg); background-image: url(../../img/edlp-loader-anim.svg);
background-size: 50%; background-size: 50%;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
border-radius: 25px; } border-radius: 30px; }
body.path-agenda main .col, body.path-agenda main .col > .wrapper { body.path-agenda main .col, body.path-agenda main .col > .wrapper {
height: 100%; } height: 100%; }
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="40"
height="40"
fill="#ffffff"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<rect
id="bg"
x="0" y="0"
width="40" height="40"
>
</rect>
<rect
id="blak-line"
x="0" y="19"
width="50" height="2"
fill="#000000"
transform="rotate(315 22 26)">
</rect>
<rect
id="red-line"
x="11" y="18"
width="18" height="4"
fill="#ff0004"
transform="rotate(45 20 20)">
</rect>
<animate
xlink:href="#red-line"
attributeName="y"
from="1"
to="1"
dur="1.5s"
values="1;18;35;18;1"
keyTimes="0;0.25;0.5;0.75;1"
keySplines=".42 0 1 1;
0 0 .59 1;
.42 0 1 1"
fill="freeze"
begin="0s"
repeatCount="indefinite"
id="red-anim-one"/>
</svg>

After

Width:  |  Height:  |  Size: 906 B

@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
@@ -9,45 +7,35 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="edlp-loader.svg" width="40"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
id="svg8"
version="1.1"
viewBox="0 0 10.583333 10.583334"
height="40" height="40"
width="40"> viewBox="0 0 10.583333 10.583334"
<defs version="1.1"
id="defs2"> id="svg8"
<inkscape:path-effect sodipodi:docname="edlp-loader.svg"
effect="interpolate_points" inkscape:version="0.92.2 5c3e80d, 2017-08-06">
id="path-effect866"
is_visible="true"
interpolator_type="CentripetalCatmullRom" />
</defs>
<sodipodi:namedview <sodipodi:namedview
inkscape:window-maximized="1"
inkscape:window-y="28"
inkscape:window-x="0"
inkscape:window-height="1025"
inkscape:window-width="1920"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:bbox-nodes="true"
inkscape:bbox-paths="true"
inkscape:snap-bbox="true"
units="px"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:document-units="mm"
inkscape:cy="12.514606"
inkscape:cx="17.614095"
inkscape:zoom="16"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff" pagecolor="#ffffff"
id="base" /> 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" />
<defs
id="defs2" />
<metadata <metadata
id="metadata5"> id="metadata5">
<rdf:RDF> <rdf:RDF>
@@ -61,19 +49,20 @@
</rdf:RDF> </rdf:RDF>
</metadata> </metadata>
<g <g
inkscape:label="Calque 1" transform="translate(0,-286.41665)"
inkscape:groupmode="layer" id="layer1">
id="layer1"
transform="translate(0,-286.41665)">
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" style="fill:#000000;fill-opacity:1;"
d="M 0.28364121,296.71886 C 10.346939,286.74502 10.346939,286.74502 10.346939,286.74502" d="m 10.160156,286.55664 c -3.3541666,3.32487 -6.7083332,6.64974 -10.06249975,9.97461 0.13135558,0.1048 0.26232471,0.31854 0.3939252,0.35431 3.34720715,-3.31732 6.69441435,-6.63465 10.04162155,-9.95197 -0.124349,-0.12565 -0.248698,-0.2513 -0.373047,-0.37695 z"
id="path815" id="black-line"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#ff0004;stroke-width:1.05833328;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;image-rendering:optimizeSpeed" style="fill:#ff0004;fill-opacity:1;"
d="m 3.636975,290.03857 c 3.3566295,3.38673 3.3566295,3.38673 3.3566295,3.38673" 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="path815-9" id="red-line"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" >
<!-- <animateMotion path="H 20 Z" dur="2s" repeatCount="indefinite" /> -->
</path>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -6,6 +6,7 @@
var _is_front = _$body.is('.path-frontpage'); var _is_front = _$body.is('.path-frontpage');
var _$corpus_map; var _$corpus_map;
var _$content_container = $('.layout-container>main>.layout-content'); var _$content_container = $('.layout-container>main>.layout-content');
var _$ajaxLinks;
function init(){ function init(){
console.log("EdlpTheme init()"); console.log("EdlpTheme init()");
@@ -30,30 +31,59 @@
// / _ \ | / _` \ \ / // / _ \ | / _` \ \ /
// /_/ \_\/ \__,_/_\_\ // /_/ \_\/ \__,_/_\_\
// |__/ // |__/
// TODO: add url hash nav
// TODO: implement history.js
function initAjaxLinks(){ function initAjaxLinks(){
console.log('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){ function onClickAjaxLink(e){
e.preventDefault(); 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'); var sys_path = $(this).attr('data-drupal-link-system-path');
if(sys_path == '<front>'){
closeAllModals();
return false;
}
// TODO: drupal settings not defined on NOT front page
var path = window.location.origin + drupalSettings.basepath + sys_path +'/ajax'; var path = window.location.origin + drupalSettings.basepath + sys_path +'/ajax';
closeAllModals(); closeAllModals();
_$body.addClass('ajax-loading'); _$body.addClass('ajax-loading');
$link.addClass('ajax-loading');
$.getJSON(path, {}, function(data){ $.getJSON(path, {}, function(data){
onAjaxLinkLoaded(data, sys_path); onAjaxLinkLoaded(data, $link, sys_path);
}); });
return false; return false;
}; };
function onAjaxLinkLoaded(data, sys_path){ function onAjaxLinkLoaded(data, $link, sys_path){
console.log('ajax link loaded : data', data); console.log('ajax link loaded : data', data);
_$content_container.html(data.rendered); _$content_container.html(data.rendered);
_$body.removeClass().addClass('path-'+sys_path);
_$body.removeClass('ajax-loading'); _$body.removeClass('ajax-loading');
_$body.removeClass().addClass('path-'+sys_path);
_$ajaxLinks.removeClass('is-active');
$link.removeClass('ajax-loading').addClass('is-active');
initScrollbars(); initScrollbars();
}; };
@@ -72,6 +102,9 @@
console.log('theme : closeAllModals'); console.log('theme : closeAllModals');
// TODO: animate the remove // TODO: animate the remove
_$content_container.html(''); _$content_container.html('');
_$ajaxLinks.removeClass('is-active');
$('a[data-drupal-link-system-path="<front>"]').addClass('is-active');
}; };
init(); init();
@@ -90,6 +90,13 @@ header[role="banner"]{
border: 1px solid #000; border: 1px solid #000;
margin-right: 0.3em; 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, &.is-active:before,
&:hover:before{ &:hover:before{
border-color: red; border-color: red;
@@ -144,11 +151,11 @@ main[role="main"]{
content:""; content:"";
display: block; display: block;
position: absolute; position: absolute;
$s:50px; $s:60px;
width:$s; height:$s; width:$s; height:$s;
top:calc(50% - #{$s/2}); left:calc(50% - #{$s/2}); top:calc(50% - #{$s/2}); left:calc(50% - #{$s/2});
background-color: white; background-color: white;
background-image: url(../../img/edlp-loader.svg); background-image: url(../../img/edlp-loader-anim.svg);
background-size: 50%; background-size: 50%;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
@@ -0,0 +1,7 @@
<div class="row">
<div class="col small-col-12 med-col-12 large-col-8 ">
<div class="wrapper">
{{ node }}
</div>
</div>
</div>