Browse Source

search is ok! (remains to sync search and corpus map

Bachir Soussi Chiadmi 6 years ago
parent
commit
a7f736f919
29 changed files with 653 additions and 144 deletions
  1. 15 12
      sites/all/modules/figli/edlp_corpus/assets/dist/scripts/corpus.min.js
  2. 15 12
      sites/all/modules/figli/edlp_corpus/assets/scripts/corpus.js
  3. 77 2
      sites/all/modules/figli/edlp_search/assets/js/edlp_search.js
  4. 9 1
      sites/all/modules/figli/edlp_search/edlp_search.module
  5. 2 2
      sites/all/modules/figli/edlp_search/edlp_search.routing.yml
  6. 17 0
      sites/all/modules/figli/edlp_search/includes/edlp_search_results.inc
  7. 143 15
      sites/all/modules/figli/edlp_search/src/Controller/EdlpSearchController.php
  8. 3 0
      sites/all/modules/figli/edlp_search/templates/edlp-search-results.html.twig
  9. 11 6
      sites/all/themes/custom/edlptheme/assets/dist/scripts/main.min.js
  10. 68 3
      sites/all/themes/custom/edlptheme/assets/dist/styles/app.min.css
  11. 11 6
      sites/all/themes/custom/edlptheme/assets/scripts/main.js
  12. 35 1
      sites/all/themes/custom/edlptheme/assets/styles/app.scss
  13. 6 0
      sites/all/themes/custom/edlptheme/assets/styles/base/_grid.scss
  14. 10 4
      sites/all/themes/custom/edlptheme/assets/styles/base/_layout.scss
  15. 26 3
      sites/all/themes/custom/edlptheme/edlptheme.theme
  16. 10 12
      sites/all/themes/custom/edlptheme/templates/content/edlp-agenda.html.twig
  17. 3 5
      sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--node--article.html.twig
  18. 5 7
      sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--node--default.html.twig
  19. 3 5
      sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--node--transcript.html.twig
  20. 3 5
      sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--taxonomy-term--index.html.twig
  21. 3 5
      sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--taxonomy-term--notice.html.twig
  22. 15 17
      sites/all/themes/custom/edlptheme/templates/content/edlp-home.html.twig
  23. 6 8
      sites/all/themes/custom/edlptheme/templates/content/edlp-productions.html.twig
  24. 7 0
      sites/all/themes/custom/edlptheme/templates/content/edlp-search-results.html.twig
  25. 3 5
      sites/all/themes/custom/edlptheme/templates/content/edlp-search-search-form.html.twig
  26. 5 7
      sites/all/themes/custom/edlptheme/templates/content/edlp-studio-ui.html.twig
  27. 96 0
      sites/all/themes/custom/edlptheme/templates/content/node--enregistrement--search-index.html.twig
  28. 9 1
      sites/all/themes/custom/edlptheme/templates/layout/page.html.twig
  29. 37 0
      sites/default/config/sync/search_api.index.collection.yml

+ 15 - 12
sites/all/modules/figli/edlp_corpus/assets/dist/scripts/corpus.min.js

@@ -592,12 +592,16 @@
     // show opened audio node
     function openNode(id){
       closeNode();
-      _node_opened_id = id;
-      _nodes[id].open();
+      if(typeof _nodes[id] !== 'undefined'){
+        _node_opened_id = id;
+        _nodes[id].open();
+      }
     }
     function closeNode(){
       if(_node_opened_id != -1){
-        _nodes[_node_opened_id].close();
+        // if(typeof _nodes[_node_opened_id] !== 'undefined'){
+          _nodes[_node_opened_id].close();
+        // }
         _node_opened_id = -1;
       }
     }
@@ -794,18 +798,17 @@
           scrambleCollection();
           _$body.trigger({'type':'close_entree', 'tid':tid});
         }
-
         return false;
       });
 
-      // $('body').trigger({
-      //       'type':'chutier-action-done',
-      //       'action_done':data.action_done,
-      //       'target_id':$link.attr('target_id'),
-      //     });
-      _$body.on('chutier-action-done', function(e) {
-        _nodes_by_nid[e.target_id].chutier_action = e.new_action;
-      });
+      _$body
+        .on('chutier-action-done', function(e) {
+          _nodes_by_nid[e.target_id].chutier_action = e.new_action;
+        })
+        .on('search-results-loaded', function(e){
+          console.log("Edlp Corpus, search-results-loaded",e.results);
+          // TODO: filter map's nodes
+        });
     };
 
     //  _  _         _     ___          _   _

+ 15 - 12
sites/all/modules/figli/edlp_corpus/assets/scripts/corpus.js

@@ -592,12 +592,16 @@
     // show opened audio node
     function openNode(id){
       closeNode();
-      _node_opened_id = id;
-      _nodes[id].open();
+      if(typeof _nodes[id] !== 'undefined'){
+        _node_opened_id = id;
+        _nodes[id].open();
+      }
     }
     function closeNode(){
       if(_node_opened_id != -1){
-        _nodes[_node_opened_id].close();
+        // if(typeof _nodes[_node_opened_id] !== 'undefined'){
+          _nodes[_node_opened_id].close();
+        // }
         _node_opened_id = -1;
       }
     }
@@ -794,18 +798,17 @@
           scrambleCollection();
           _$body.trigger({'type':'close_entree', 'tid':tid});
         }
-
         return false;
       });
 
-      // $('body').trigger({
-      //       'type':'chutier-action-done',
-      //       'action_done':data.action_done,
-      //       'target_id':$link.attr('target_id'),
-      //     });
-      _$body.on('chutier-action-done', function(e) {
-        _nodes_by_nid[e.target_id].chutier_action = e.new_action;
-      });
+      _$body
+        .on('chutier-action-done', function(e) {
+          _nodes_by_nid[e.target_id].chutier_action = e.new_action;
+        })
+        .on('search-results-loaded', function(e){
+          console.log("Edlp Corpus, search-results-loaded",e.results);
+          // TODO: filter map's nodes
+        });
     };
 
     //  _  _         _     ___          _   _

+ 77 - 2
sites/all/modules/figli/edlp_search/assets/js/edlp_search.js

@@ -1,9 +1,84 @@
 (function ($, Drupal, drupalSettings) {
 
-  var settings = drupalSettings.edlp_studio;
+  var settings = drupalSettings.edlp_search;
+  var _$body = $('body');
+  var _$container;
+  var _$form;
 
   function init(){
-    console.log('Edlp Search Init');
+    console.log('EdlpSearch Init', settings);
+    initEvents();
+    initAjax();
+  };
+
+  function initEvents(){
+    $('body')
+      .on('new-content-ajax-loaded', initAjax);
+  };
+
+  function initAjax(){
+    console.log('EdlpSearch initAjaxForm()');
+    _$form = $('#edlp-search-form:not(.ajax-enabled)')
+      .on('submit', onSubmitForm)
+      .addClass('ajax-enabled');
+    _$container = _$form.parents('.row');
+    if(!_$container.length){
+      _$container = _$form.parent();
+    }
+  };
+
+  function onSubmitForm(e){
+    e.preventDefault();
+    // console.log('onSubmitForm',e);
+    var args = {};
+
+    // search for key words
+    args.keys = $('input[type="search"]', this).val();
+
+    // entries filter
+    args.entries = [];
+    $('input[type="checkbox"]:checked', '#edit-entries').each(function(index, el) {
+      args.entries.push($(this).val());
+    });
+
+    loadResults(args)
+
+    return false;
+  };
+
+  function loadResults(args){
+    console.log('EdlpSearch loadResults() : args', args);
+    _$form.addClass('ajax-loading');
+    var path = window.location.origin + drupalSettings.path.baseUrl +settings.results_ajax_url;
+    $.getJSON(path, args)
+      .done(function(data){
+        onResultsLoaded(data);
+      })
+      .fail(function(jqxhr, textStatus, error){
+        onResultsLoadFail(jqxhr, textStatus, error);
+      });
+  };
+
+  function onResultsLoaded(data){
+    console.log('EdlpSearch onResultsLoaded()', data);
+    // insert results col
+    $prev_results = $('[theme="edlp_search_results"]', _$container);
+    if($prev_results.length){
+      $prev_results.replaceWith(data.rendered);
+    }else{
+      _$container.append(data.rendered);
+    }
+    
+    // trigger event
+    _$body.trigger({
+      'type':'search-results-loaded',
+      'results':data.results_nids
+    });
+
+  };
+
+  function onResultsLoadFail(jqxhr, textStatus, error){
+    console.warn('EdlpSearch : search results ajax load failed : '+error, jqxhr.responseText);
   };
 
   init();

+ 9 - 1
sites/all/modules/figli/edlp_search/edlp_search.module

@@ -30,7 +30,7 @@ function edlp_search_help($route_name, RouteMatchInterface $route_match) {
  */
 function edlp_search_page_attachments(array &$attachments) {
   $attachments['#attached']['library'][] = 'edlp_search/edlp_search-library';
-  $url = Url::fromRoute('edlp_search.edlp_search_controller_searchResults_ajax', [], ['absolute' => TRUE]);
+  $url = Url::fromRoute('edlp_search.edlp_search_controller_search_results_ajax');
   $attachments['#attached']['drupalSettings']['edlp_search']['results_ajax_url'] = $url->getInternalPath();
 }
 
@@ -46,5 +46,13 @@ function edlp_search_theme($existing, $type, $theme, $path) {
         'form' => null,
       ),
     ),
+    'edlp_search_results' => array(
+      'file' => 'includes/edlp_search_results.inc',
+      'variables' => array(
+        'items' => null,
+        'no_results_found' => '',
+        'search_help' => ''
+      ),
+    ),
   );
 }

+ 2 - 2
sites/all/modules/figli/edlp_search/edlp_search.routing.yml

@@ -15,7 +15,7 @@ edlp_search.edlp_search_controller_searchForm_ajax:
   requirements:
     _permission: 'access content'
 
-edlp_search.edlp_search_controller_searchResults:
+edlp_search.edlp_search_controller_search_results:
   path: '/edlp_search/searchresults'
   defaults:
     _controller: '\Drupal\edlp_search\Controller\EdlpSearchController::searchResults'
@@ -23,7 +23,7 @@ edlp_search.edlp_search_controller_searchResults:
   requirements:
     _permission: 'access content'
 
-edlp_search.edlp_search_controller_searchResults_ajax:
+edlp_search.edlp_search_controller_search_results_ajax:
   path: '/edlp_search/searchresults/ajax'
   defaults:
     _controller: '\Drupal\edlp_search\Controller\EdlpSearchController::searchResultsJson'

+ 17 - 0
sites/all/modules/figli/edlp_search/includes/edlp_search_results.inc

@@ -0,0 +1,17 @@
+<?php
+
+function template_preprocess_edlp_search_results(&$vars){
+  // dpm($vars);
+
+  $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
+
+  $items = [];
+  if(count($vars['items'])){
+    foreach ($vars['items'] as $item) {
+      $items[] = $view_builder->view($item, 'search_index');
+    }
+  }
+
+  $vars['items'] = $items;
+
+}

+ 143 - 15
sites/all/modules/figli/edlp_search/src/Controller/EdlpSearchController.php

@@ -4,9 +4,9 @@ namespace Drupal\edlp_search\Controller;
 
 use Drupal\Core\Controller\ControllerBase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
-use Drupal\Core\Entity\EntityStorageInterface;
-use Symfony\Component\HttpFoundation\Request;
 use Drupal\Core\Form\FormBuilder;
+use Drupal\search_api\Entity\Index;
+use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\JsonResponse;
 
 /**
@@ -62,6 +62,9 @@ class EdlpSearchController extends ControllerBase {
     return $this->renderable;
   }
 
+  /**
+  * searchFormJson
+  */
   public function searchFormJson(){
     $this->buildRenderable();
 
@@ -76,27 +79,152 @@ class EdlpSearchController extends ControllerBase {
   }
 
   /**
-   * Searchresults.
-   *
-   * @return string
-   *   Return Hello string.
-   */
-  public function searchResults() {
-    return [
-      '#type' => 'markup',
-      '#markup' => $this->t('Implement method: searchResults')
-    ];
+  * searchResults
+  */
+  public function searchResults(Request $request) {
+
+    $this->request = $request;
+
+    // TODO: what if no results
+
+    return $this->getrenderable();
   }
+
+  /**
+  * searchResultsJson
+  */
   public function searchResultsJson(Request $request){
 
-    $keys = $request->query->get('keys');
+    $this->request = $request;
+
+    $renderable = $this->getrenderable();
+    $rendered = render($renderable);
+
+    // build an array of results's nids
+    $results_nids = [];
+    foreach ($this->items as $item) {
+      $results_nids[] = $item->id();
+    }
+
+    // TODO: what if no results
 
     $response = new JsonResponse();
     $response->setData([
       'test'=>'search results',
-      'keys'=>$keys
-      // 'rendered'=> $rendered,
+      'keys'=>$this->keys,
+      'entries' => $this->entries,
+      'rendered'=> $rendered,
+      'results_nids'=>$results_nids,
     ]);
     return $response;
   }
+
+  /**
+  * getRenderable
+  */
+  private function getRenderable(){
+    $this->query();
+
+    $build = array(
+      '#theme' => 'edlp_search_results',
+      '#items' => $this->items
+    );
+    if(!count($this->items)){
+      $build['#no_results_found'] = array(
+        '#markup' => t('Your search yielded no results.')
+      );
+      // $build['#search_help'] = array(
+      //   '#markup' => $this->t('<ul>
+      //     <li>Check if your spelling is correct.</li>
+      //     <li>Remove quotes around phrases to search for each word individually. <em>bike shed</em> will often show more results than <em>&quot;bike shed&quot;</em>.</li>
+      //     <li>Consider loosening your query with <em>OR</em>. <em>bike OR shed</em> will often show more results than <em>bike shed</em>.</li>
+      //     </ul>')
+      // );
+    }
+
+    return $build;
+
+  }
+
+  /**
+  * query
+  */
+  private function query(){
+
+    $this->getRequestArgs();
+
+    // TODO: get the sapi index id with settings
+    /* @var $sapi_index \Drupal\search_api\IndexInterface */
+    $sapi_index = Index::load('collection');
+    // dpm($sapi_index);
+
+    // Create the query.
+    $query = $sapi_index->query();
+    // dpm($query);
+
+    $query->setSearchID('edlp_search:ajaxsearch');
+
+    $parse_mode = \Drupal::getContainer()
+        ->get('plugin.manager.search_api.parse_mode')
+        ->createInstance('direct');
+    $query->setParseMode($parse_mode);
+
+    // workflow
+    $wf_condition_group = $query->createConditionGroup('OR');
+    $wf_condition_group->addCondition('field_workflow', 'corpus_documents_publie', "=");
+    // TODO: add condition with the other workflow field
+    $query->addConditionGroup($wf_condition_group);
+
+    // Search for keys.
+    if (!empty($this->keys)) {
+      $query->keys($this->keys);
+    }
+
+    // entries
+    if (!empty($this->entries)){
+      $entries_condition_group = $query->createConditionGroup();
+      foreach ($this->entries as $tid) {
+        $entries_condition_group->addCondition('field_entrees', (int)$tid, "=");
+      }
+      // dpm($entries_condition_group);
+      $query->addConditionGroup($entries_condition_group);
+    }
+
+
+    // TODO: genres
+
+    // TODO: locuteurs
+
+    // TODO: langues
+
+    $result = $query->execute();
+    $items = $result->getResultItems();
+    // dpm($items);
+
+    $this->items = [];
+    foreach ($items as $item) {
+      try {
+        /** @var \Drupal\Core\Entity\EntityInterface $entity */
+        $entity = $item->getOriginalObject()->getValue();
+      }
+      catch (SearchApiException $e) {
+        continue;
+      }
+      if (!$entity) {
+        continue;
+      }
+
+      $this->items[] = $entity;
+    }
+    // dpm($this->items);
+  }
+
+  /**
+  * getRequestArgs
+  */
+  private function getRequestArgs(){
+    $this->keys = $this->request->query->get('keys');
+    $this->entries = $this->request->query->get('entries');
+  }
+
 }

+ 3 - 0
sites/all/modules/figli/edlp_search/templates/edlp-search-results.html.twig

@@ -0,0 +1,3 @@
+{{ items }}
+{{ no_results_found }}
+{{ search_help }}

+ 11 - 6
sites/all/themes/custom/edlptheme/assets/dist/scripts/main.min.js

@@ -4,7 +4,7 @@
     var _$body = $('body');
     var _is_front = _$body.is('.path-frontpage');
     var _$corpus_canvas;
-    var _$content_container = $('main[role="main"]>.layout-content');
+    var _$row = $('main[role="main"]>.layout-content>.row');
     var _$ajaxLinks;
     var _audio_player;
     var _randomPlayer;
@@ -41,6 +41,9 @@
         .on('on-studio-chutier-updated', function(e){
           initAjaxLinks();
         })
+        .on('search-results-loaded',function(e){
+          initAjaxLinks();
+        })
         .on('open_entree', function(e){
           // e.tid available
           closeAllModals();
@@ -410,7 +413,9 @@
       _$body.removeClass('ajax-loading');
 
       // replace all content with newly loaded
-      _$content_container.html(data.rendered);
+      // TODO: build a system to replace or append contents (like studio + search)
+
+      _$row.html(data.rendered);
 
       // add body class for currently loaded content
       var body_classes = [
@@ -448,7 +453,7 @@
       _$body.trigger({'type':'new-content-ajax-loaded'});
 
       // TODO: call behaviours
-      Drupal.attachBehaviors(_$content_container);
+      Drupal.attachBehaviors(_$row[0]);
 
     };
 
@@ -553,7 +558,7 @@
     // |_| |_| \___/\__,_|\_,_\__|\__|_\___/_||_/__/
     function initProductions(){
       console.log('theme : initProductions');
-      var $grid = $('.row', _$content_container).masonry({
+      var $grid = $('.row', _$row).masonry({
         itemSelector:'.col',
         columnWidth:'.col-2'
       });
@@ -562,7 +567,7 @@
       $grid.imagesLoaded().progress( function() {
         $grid.masonry('layout');
       });
-      // var $grid = $('.row', _$content_container).imagesLoaded( function() {
+      // var $grid = $('.row', _$row).imagesLoaded( function() {
       //   // init Masonry after all images have loaded
       //   $grid.masonry({
       //     itemSelector:'.col',
@@ -591,7 +596,7 @@
     function closeAllModals(){
       console.log('theme : closeAllModals');
       // TODO: animate the remove
-      _$content_container.html('');
+      _$row.html('');
       _$ajaxLinks.removeClass('is-active');
     };
 

+ 68 - 3
sites/all/themes/custom/edlptheme/assets/dist/styles/app.min.css

@@ -1086,6 +1086,11 @@ a:focus {
   .col-11-offset-1:last-child {
     padding-right: 0; }
 
+.col.float-right {
+  float: right;
+  padding-right: 0;
+  padding-left: 1em; }
+
 body, html {
   position: relative;
   width: 100%;
@@ -1108,6 +1113,18 @@ header[role="banner"] {
       height: 100%;
       position: relative; }
 
+aside.messages {
+  border: none;
+  z-index: 99;
+  position: absolute;
+  left: 5%;
+  top: 100px;
+  width: 80%;
+  max-height: 600px;
+  background-color: rgba(255, 255, 255, 0.8);
+  padding: 0;
+  overflow-y: auto; }
+
 main[role="main"] {
   z-index: 1;
   position: absolute;
@@ -1124,9 +1141,6 @@ main[role="main"] {
     width: 100%;
     height: 100%;
     overflow: hidden; }
-    main[role="main"] .layout-content > .messages {
-      max-height: 500px;
-      overflow: auto; }
     main[role="main"] .layout-content > * {
       pointer-events: auto; }
 
@@ -1671,6 +1685,57 @@ body.ajax-loading main[role="main"]:before {
         padding-left: 1em;
         border-left: 1px solid #aaa; }
 
+.col[theme="edlp_search_results"] article .entrees span {
+  display: inline-block;
+  width: 8px;
+  height: 8px;
+  background-color: black;
+  margin-right: 3px; }
+  .col[theme="edlp_search_results"] article .entrees span[tid='134'] {
+    background-color: var(--e-col-134); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='121'] {
+    background-color: var(--e-col-121); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='125'] {
+    background-color: var(--e-col-125); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='119'] {
+    background-color: var(--e-col-119); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='132'] {
+    background-color: var(--e-col-132); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='122'] {
+    background-color: var(--e-col-122); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='129'] {
+    background-color: var(--e-col-129); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='120'] {
+    background-color: var(--e-col-120); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='130'] {
+    background-color: var(--e-col-130); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='118'] {
+    background-color: var(--e-col-118); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='127'] {
+    background-color: var(--e-col-127); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='133'] {
+    background-color: var(--e-col-133); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='128'] {
+    background-color: var(--e-col-128); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='124'] {
+    background-color: var(--e-col-124); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='116'] {
+    background-color: var(--e-col-116); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='117'] {
+    background-color: var(--e-col-117); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='131'] {
+    background-color: var(--e-col-131); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='126'] {
+    background-color: var(--e-col-126); }
+  .col[theme="edlp_search_results"] article .entrees span[tid='123'] {
+    background-color: var(--e-col-123); }
+
+.col[theme="edlp_search_results"] article h2.node-title {
+  margin: 0 0 0.3em 0;
+  font-size: 1em;
+  font-weight: 500;
+  text-transform: none; }
+
 body.path-agenda main .col > .wrapper {
   height: 100%; }
 

+ 11 - 6
sites/all/themes/custom/edlptheme/assets/scripts/main.js

@@ -4,7 +4,7 @@
     var _$body = $('body');
     var _is_front = _$body.is('.path-frontpage');
     var _$corpus_canvas;
-    var _$content_container = $('main[role="main"]>.layout-content');
+    var _$row = $('main[role="main"]>.layout-content>.row');
     var _$ajaxLinks;
     var _audio_player;
     var _randomPlayer;
@@ -41,6 +41,9 @@
         .on('on-studio-chutier-updated', function(e){
           initAjaxLinks();
         })
+        .on('search-results-loaded',function(e){
+          initAjaxLinks();
+        })
         .on('open_entree', function(e){
           // e.tid available
           closeAllModals();
@@ -410,7 +413,9 @@
       _$body.removeClass('ajax-loading');
 
       // replace all content with newly loaded
-      _$content_container.html(data.rendered);
+      // TODO: build a system to replace or append contents (like studio + search)
+
+      _$row.html(data.rendered);
 
       // add body class for currently loaded content
       var body_classes = [
@@ -448,7 +453,7 @@
       _$body.trigger({'type':'new-content-ajax-loaded'});
 
       // TODO: call behaviours
-      Drupal.attachBehaviors(_$content_container);
+      Drupal.attachBehaviors(_$row[0]);
 
     };
 
@@ -553,7 +558,7 @@
     // |_| |_| \___/\__,_|\_,_\__|\__|_\___/_||_/__/
     function initProductions(){
       console.log('theme : initProductions');
-      var $grid = $('.row', _$content_container).masonry({
+      var $grid = $('.row', _$row).masonry({
         itemSelector:'.col',
         columnWidth:'.col-2'
       });
@@ -562,7 +567,7 @@
       $grid.imagesLoaded().progress( function() {
         $grid.masonry('layout');
       });
-      // var $grid = $('.row', _$content_container).imagesLoaded( function() {
+      // var $grid = $('.row', _$row).imagesLoaded( function() {
       //   // init Masonry after all images have loaded
       //   $grid.masonry({
       //     itemSelector:'.col',
@@ -591,7 +596,7 @@
     function closeAllModals(){
       console.log('theme : closeAllModals');
       // TODO: animate the remove
-      _$content_container.html('');
+      _$row.html('');
       _$ajaxLinks.removeClass('is-active');
     };
 

+ 35 - 1
sites/all/themes/custom/edlptheme/assets/styles/app.scss

@@ -587,6 +587,39 @@ main[role="main"]{
   }
 }
 
+
+//  ___                  _
+// / __| ___ __ _ _ _ __| |_
+// \__ \/ -_) _` | '_/ _| ' \
+// |___/\___\__,_|_| \__|_||_|
+
+#edlp-search-form{
+
+}
+
+.col[theme="edlp_search_results"]{
+  article{
+    .entrees{
+      span{
+        @include entrie-micro-square;
+      }
+    }
+    h2.node-title{
+      margin:0 0 0.3em 0;
+      font-size: 1em;
+      font-weight: 500;
+      text-transform: none;
+    }
+    // .description{
+    //   p{
+    //     margin:0;
+    //     font-size: 0.75em;
+    //   }
+    // }
+  }
+}
+
+
  //    _    _            _  _         _
  //   /_\  (_)__ ___ __ | \| |___  __| |___
  //  / _ \ | / _` \ \ / | .` / _ \/ _` / -_)
@@ -692,6 +725,7 @@ body.path-productions{
     }
   }
 }
+
 //  ___         _
 // | __|__  ___| |_ ___ _ _
 // | _/ _ \/ _ \  _/ -_) '_|
@@ -1041,8 +1075,8 @@ footer{
     }
   }
 
+  $icons_w:20px;
   @mixin iconlinkblock($bgimgurl) {
-    $icons_w:20px;
     pointer-events: all;
     margin-left: 0.5em;
     a{

+ 6 - 0
sites/all/themes/custom/edlptheme/assets/styles/base/_grid.scss

@@ -73,3 +73,9 @@ $med-bp:1080px;
     }
   }
 }
+
+.col.float-right{
+  float: right;
+  padding-right: 0;
+  padding-left: $default_gap;
+}

+ 10 - 4
sites/all/themes/custom/edlptheme/assets/styles/base/_layout.scss

@@ -36,6 +36,16 @@ header[role="banner"]{
   }
 }
 
+aside.messages{
+  border: none;
+  z-index: 99;
+  position: absolute;
+  left:5%; top:100px;
+  width:80%; max-height: 600px;
+  background-color: rgba(255,255,255,0.8);
+  padding:0;
+  overflow-y: auto;
+}
 
 main[role="main"]{
   // outline:1px solid green;
@@ -51,10 +61,6 @@ main[role="main"]{
   .layout-content{
     width: 100%; height:100%;
     overflow:hidden;
-    &>.messages{
-      max-height: 500px;
-      overflow: auto;
-    }
     &>*{
       pointer-events: auto;
     }

+ 26 - 3
sites/all/themes/custom/edlptheme/edlptheme.theme

@@ -11,10 +11,9 @@ use Drupal\Core\Template\Attribute;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Render\Element;
 
-// function edlptheme_preprocess_input(&$vars){
+function edlptheme_preprocess_page(&$vars){
   // dsm($vars, 'vars');
-  // $vars['attributes']['placeholder'] = "salut";
-// }
+}
 
 function edlptheme_preprocess_node(&$vars){
   $node = $vars['elements']['#node'];
@@ -80,6 +79,30 @@ function edlptheme_preprocess_node__enregistrement__index(&$vars){
   // dpm($vars['link_attributes']);
 }
 
+function edlptheme_preprocess_node__enregistrement__search_index(&$vars){
+  $node = $vars['elements']['#node'];
+  $options = ['absolute' => TRUE];
+  $url = Url::fromRoute('entity.node.canonical', ['node' => $node->id()], $options);
+  $system_path = $url->getInternalPath();
+  // get the audio file url
+  $field_son_values = $node->get('field_son')->getValue();
+  $son_fid = count($field_son_values) ? $field_son_values[0]['target_id'] : "";
+  $son_file = \Drupal\file\Entity\File::load($son_fid);
+  $son_url = null;
+  if($son_file){
+    $son_uri = $son_file->getFileUri();
+    $son_url = file_create_url($son_uri);
+  }
+
+  $vars['link_attributes'] = new Attribute(array(
+    'data-drupal-link-system-path' => $system_path=='' ? '<front>' : $system_path,
+    'audio_url' => $son_url,
+    'nid' => $node->id(),
+    'class' => array('audio-link', 'ajax-link')
+  ));
+  // dpm($vars['link_attributes']);
+}
+
 function edlptheme_preprocess_node__enregistrement__player_cartel(&$vars){
   // dpm($vars);
   // if transcript not empty

+ 10 - 12
sites/all/themes/custom/edlptheme/templates/content/edlp-agenda.html.twig

@@ -1,17 +1,15 @@
-<div class="row">
-  <div class="col small-col-12 med-col-12 large-col-8 ">
-    <div class="wrapper">
-      <div id="agenda">
-
-        <div class="column next-event">
-          {{ next_event }}
-        </div>
-        <div class="column future-past-events os-scroll">
-          {{ coming_events }}
-          {{ past_events }}
-        </div>
+<div class="col small-col-12 med-col-12 large-col-8 ">
+  <div class="wrapper">
+    <div id="agenda">
 
+      <div class="column next-event">
+        {{ next_event }}
+      </div>
+      <div class="column future-past-events os-scroll">
+        {{ coming_events }}
+        {{ past_events }}
       </div>
+
     </div>
   </div>
 </div>

+ 3 - 5
sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--node--article.html.twig

@@ -1,7 +1,5 @@
-<div class="row">
-  <div class="col small-col-12 med-col-6 large-col-6">
-    <div class="wrapper">
-      {{ content }}
-    </div>
+<div class="col small-col-12 med-col-6 large-col-6">
+  <div class="wrapper">
+    {{ content }}
   </div>
 </div>

+ 5 - 7
sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--node--default.html.twig

@@ -1,9 +1,7 @@
-<div class="row">
-  <div class="col small-col-12 med-col-6 large-col-6">
-    <div class="wrapper">
-      {#<div class="os-scroll">#}
-        {{ content }}
-      {#</div>#}
-    </div>
+<div class="col small-col-12 med-col-6 large-col-6">
+  <div class="wrapper">
+    {#<div class="os-scroll">#}
+      {{ content }}
+    {#</div>#}
   </div>
 </div>

+ 3 - 5
sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--node--transcript.html.twig

@@ -1,7 +1,5 @@
-<div class="row">
-  <div class="col small-col-12 med-col-6 large-col-6">
-    <div class="wrapper">
-      {{ content }}
-    </div>
+<div class="col small-col-12 med-col-6 large-col-6">
+  <div class="wrapper">
+    {{ content }}
   </div>
 </div>

+ 3 - 5
sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--taxonomy-term--index.html.twig

@@ -1,7 +1,5 @@
-<div class="row">
-  <div class="col small-col-12 med-col-4 large-col-4">
-    <div class="wrapper">
-      {{ content }}
-    </div>
+<div class="col small-col-12 med-col-4 large-col-4">
+  <div class="wrapper">
+    {{ content }}
   </div>
 </div>

+ 3 - 5
sites/all/themes/custom/edlptheme/templates/content/edlp-ajax--taxonomy-term--notice.html.twig

@@ -1,7 +1,5 @@
-<div class="row">
-  <div class="col small-col-12 med-col-6 large-col-6">
-    <div class="wrapper">
-      {{ content }}
-    </div>
+<div class="col small-col-12 med-col-6 large-col-6">
+  <div class="wrapper">
+    {{ content }}
   </div>
 </div>

+ 15 - 17
sites/all/themes/custom/edlptheme/templates/content/edlp-home.html.twig

@@ -1,22 +1,20 @@
-<div class="row">
-  <div class="presentation col col-4">
-    <div class="wrapper">
-      {{ presentation }}
-    </div>
+<div class="presentation col col-4">
+  <div class="wrapper">
+    {{ presentation }}
   </div>
-  <div class="last-file col col-2">
-    <div class="wrapper">
-      {{ last_fil }}
-    </div>
+</div>
+<div class="last-file col col-2">
+  <div class="wrapper">
+    {{ last_fil }}
   </div>
-  <div class="last-prod col col-4">
-    <div class="wrapper">
-      {{ last_production }}
-    </div>
+</div>
+<div class="last-prod col col-4">
+  <div class="wrapper">
+    {{ last_production }}
   </div>
-  <div class="agenda col col-2">
-    <div class="wrapper">
-      {{ agenda }}
-    </div>
+</div>
+<div class="agenda col col-2">
+  <div class="wrapper">
+    {{ agenda }}
   </div>
 </div>

+ 6 - 8
sites/all/themes/custom/edlptheme/templates/content/edlp-productions.html.twig

@@ -1,9 +1,7 @@
-<div class="row">
-  {% for node in nodes %}
-    <div class="col col-{{ node.cols }}">
-      <div class="wrapper">
-        {{ node.build }}
-      </div>
+{% for node in nodes %}
+  <div class="col col-{{ node.cols }}">
+    <div class="wrapper">
+      {{ node.build }}
     </div>
-  {% endfor %}
-</div>
+  </div>
+{% endfor %}

+ 7 - 0
sites/all/themes/custom/edlptheme/templates/content/edlp-search-results.html.twig

@@ -0,0 +1,7 @@
+<div theme="{{ theme_hook_original }}" class="col small-col-12 med-col-4 large-col-3 float-right">
+  <div class="wrapper">
+    {{ items }}
+    {{ no_results_found }}
+    {{ search_help }}
+  </div>
+</div>

+ 3 - 5
sites/all/themes/custom/edlptheme/templates/content/edlp-search-search-form.html.twig

@@ -1,7 +1,5 @@
-<div class="row">
-  <div class="col small-col-12 med-col-6 large-col-6">
-    <div class="wrapper">
-      {{ form }}
-    </div>
+<div theme="{{ theme_hook_original }}" class="col small-col-12 med-col-4 large-col-3 float-right">
+  <div class="wrapper">
+    {{ form }}
   </div>
 </div>

+ 5 - 7
sites/all/themes/custom/edlptheme/templates/content/edlp-studio-ui.html.twig

@@ -1,10 +1,8 @@
-<div class="row">
-  <div class="col small-col-12 med-col-12 large-col-6">
-    <div class="wrapper studio-ui-wrapper">
-      <div id="studio-ui">
-        {{ chutier_ui }}
-        {{ composition_ui }}
-      </div>
+<div class="col small-col-12 med-col-12 large-col-6">
+  <div class="wrapper studio-ui-wrapper">
+    <div id="studio-ui">
+      {{ chutier_ui }}
+      {{ composition_ui }}
     </div>
   </div>
 </div>

+ 96 - 0
sites/all/themes/custom/edlptheme/templates/content/node--enregistrement--search-index.html.twig

@@ -0,0 +1,96 @@
+{#
+/**
+ * @file
+ * Theme override to display a node.
+ *
+ * Available variables:
+ * - node: The node entity with limited access to object properties and methods.
+ *   Only method names starting with "get", "has", or "is" and a few common
+ *   methods such as "id", "label", and "bundle" are available. For example:
+ *   - node.getCreatedTime() will return the node creation timestamp.
+ *   - node.hasField('field_example') returns TRUE if the node bundle includes
+ *     field_example. (This does not indicate the presence of a value in this
+ *     field.)
+ *   - node.isPublished() will return whether the node is published or not.
+ *   Calling other methods, such as node.delete(), will result in an exception.
+ *   See \Drupal\node\Entity\Node for a full list of public properties and
+ *   methods for the node object.
+ * - label: The title of the node.
+ * - content: All node items. Use {{ content }} to print them all,
+ *   or print a subset such as {{ content.field_example }}. Use
+ *   {{ content|without('field_example') }} to temporarily suppress the printing
+ *   of a given child element.
+ * - author_picture: The node author user entity, rendered using the "compact"
+ *   view mode.
+ * - metadata: Metadata for this node.
+ * - date: Themed creation date field.
+ * - author_name: Themed author name field.
+ * - url: Direct URL of the current node.
+ * - display_submitted: Whether submission information should be displayed.
+ * - attributes: HTML attributes for the containing element.
+ *   The attributes.class element may contain one or more of the following
+ *   classes:
+ *   - node: The current template type (also known as a "theming hook").
+ *   - node--type-[type]: The current node type. For example, if the node is an
+ *     "Article" it would result in "node--type-article". Note that the machine
+ *     name will often be in a short form of the human readable label.
+ *   - node--view-mode-[view_mode]: The View Mode of the node; for example, a
+ *     teaser would result in: "node--view-mode-teaser", and
+ *     full: "node--view-mode-full".
+ *   The following are controlled through the node publishing options.
+ *   - node--promoted: Appears on nodes promoted to the front page.
+ *   - node--sticky: Appears on nodes ordered above other non-sticky nodes in
+ *     teaser listings.
+ *   - node--unpublished: Appears on unpublished nodes visible only to site
+ *     admins.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - content_attributes: Same as attributes, except applied to the main
+ *   content tag that appears in the template.
+ * - author_attributes: Same as attributes, except applied to the author of
+ *   the node tag that appears in the template.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ * - view_mode: View mode; for example, "teaser" or "full".
+ * - teaser: Flag for the teaser state. Will be true if view_mode is 'teaser'.
+ * - page: Flag for the full page state. Will be true if view_mode is 'full'.
+ * - readmore: Flag for more state. Will be true if the teaser content of the
+ *   node cannot hold the main body content.
+ * - logged_in: Flag for authenticated user status. Will be true when the
+ *   current user is a logged-in member.
+ * - is_admin: Flag for admin user status. Will be true when the current user
+ *   is an administrator.
+ *
+ * @see template_preprocess_node()
+ *
+ * @todo Remove the id attribute (or make it a class), because if that gets
+ *   rendered twice on a page this is invalid CSS for example: two lists
+ *   in different view modes.
+ */
+#}
+{%
+  set classes = [
+    'node',
+    'node--type-' ~ node.bundle|clean_class,
+    node.isPromoted() ? 'node--promoted',
+    node.isSticky() ? 'node--sticky',
+    not node.isPublished() ? 'node--unpublished',
+    view_mode ? 'node--view-mode-' ~ view_mode|clean_class,
+  ]
+%}
+{{ attach_library('classy/node') }}
+<article{{ attributes.addClass(classes) }}>
+  <div class="entrees">
+    {# THIS IS REALLY DIRTY !! #}
+    {% for key, child in content.field_entrees if key|first != '#' %}
+      {% set tid = child['#cache']['tags'][0]|replace({'taxonomy_term:':''}) %}
+      <span class="entree" tid="{{ tid }}" title="{{ child }}"></span>
+    {% endfor %}
+  </div>
+  <h2{{ title_attributes.addClass('node-title') }}>
+    <a href="{{ url }}" rel="bookmark" {{ link_attributes }}>{{ label }}</a>
+  </h2>
+
+</article>

+ 9 - 1
sites/all/themes/custom/edlptheme/templates/layout/page.html.twig

@@ -50,9 +50,17 @@
     </div>
   </header>
 
+  {% if page.content.messages %}
+    <aside class="messages">
+      {{ page.content.messages }}
+    </aside>
+  {% endif %}
+
   <main role="main">
     <div class="layout-content">
-      {{ page.content }}
+      <div class="row">
+        {{ page.content|without('messages') }}
+      </div>
     </div>{# /.layout-content #}
   </main>
 

+ 37 - 0
sites/default/config/sync/search_api.index.collection.yml

@@ -8,6 +8,9 @@ dependencies:
     - field.storage.node.field_transcript_trad
     - field.storage.node.field_transcript_vo
     - field.storage.node.field_entrees
+    - field.storage.node.field_genres
+    - field.storage.node.field_locuteurs
+    - field.storage.node.field_workflow
     - search_api.server.edlp_db
   module:
     - taxonomy
@@ -90,6 +93,38 @@ field_settings:
         - field.storage.node.field_entrees
       module:
         - taxonomy
+  field_entrees:
+    label: Entrée(s)
+    datasource_id: 'entity:node'
+    property_path: field_entrees
+    type: integer
+    dependencies:
+      config:
+        - field.storage.node.field_entrees
+  field_genres:
+    label: Genre(s)
+    datasource_id: 'entity:node'
+    property_path: field_genres
+    type: integer
+    dependencies:
+      config:
+        - field.storage.node.field_genres
+  field_locuteurs:
+    label: Locuteur(s)
+    datasource_id: 'entity:node'
+    property_path: field_locuteurs
+    type: integer
+    dependencies:
+      config:
+        - field.storage.node.field_locuteurs
+  field_workflow:
+    label: Workflow
+    datasource_id: 'entity:node'
+    property_path: field_workflow
+    type: string
+    dependencies:
+      config:
+        - field.storage.node.field_workflow
 datasource_settings:
   'entity:node':
     bundles:
@@ -196,6 +231,7 @@ processor_settings:
       - field_transcript_trad
       - field_transcript_vo
       - name
+      - field_workflow
     weights:
       preprocess_index: -20
       preprocess_query: -20
@@ -208,6 +244,7 @@ processor_settings:
       - field_transcript_trad
       - field_transcript_vo
       - name
+      - field_workflow
     weights:
       preprocess_index: -20
       preprocess_query: -20