diff --git a/composer.json b/composer.json index bd03c6f..5d076db 100644 --- a/composer.json +++ b/composer.json @@ -50,6 +50,7 @@ "drupal/search_api_solr": "^3.0", "drupal/select_translation": "1.x-dev", "drupal/simplenews": "1.x-dev", + "drupal/subrequests": "^2.0", "drupal/telephone_formatter": "^1.0@beta", "drupal/telephone_validation": "^2.1", "drupal/ultimate_cron": "2.x-dev", diff --git a/composer.lock b/composer.lock index 77c37ac..568e970 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "94914ee080097da2be34ee7047311647", + "content-hash": "659326ced02c2fe78453f4b0f66d7e4e", "packages": [ { "name": "alchemy/zippy", @@ -9205,6 +9205,58 @@ "source": "https://git.drupalcode.org/project/state_machine" } }, + { + "name": "drupal/subrequests", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/subrequests.git", + "reference": "8.x-2.2" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/subrequests-8.x-2.2.zip", + "reference": "8.x-2.2", + "shasum": "2d1a3240849ab708ff4b1eeb09ec3f67e261a2e3" + }, + "require": { + "drupal/core": "*", + "galbar/jsonpath": "^1.0" + }, + "require-dev": { + "justinrainbow/json-schema": "^5.2" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + }, + "drupal": { + "version": "8.x-2.2", + "datestamp": "1555921985", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "Mateu Aguiló Bosch", + "homepage": "https://www.drupal.org/user/550110", + "email": "mateu.aguilo.bosch@gmail.com" + } + ], + "description": "Add a front controller that you can use to make subrequests.", + "homepage": "https://www.drupal.org/project/subrequests", + "support": { + "source": "https://git.drupalcode.org/project/subrequests" + } + }, { "name": "drupal/synonyms", "version": "1.0.0-alpha1", @@ -10379,6 +10431,54 @@ ], "time": "2019-04-10T11:14:46+00:00" }, + { + "name": "galbar/jsonpath", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/Galbar/JsonPath-PHP.git", + "reference": "d08d1efeadad3345257249e35e8cfd65f21256ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Galbar/JsonPath-PHP/zipball/d08d1efeadad3345257249e35e8cfd65f21256ae", + "reference": "d08d1efeadad3345257249e35e8cfd65f21256ae", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "sami/sami": ">=3.3.0", + "satooshi/php-coveralls": ">=1.0.1" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonPath\\": "src/Skyscanner/", + "Utilities\\": "src/Skyscanner/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache 2.0" + ], + "authors": [ + { + "name": "Alessio Linares", + "email": "alessio.linares@skyscanner.net", + "role": "Software Engineer" + } + ], + "description": "JSONPath implementation for querying and updating JSON objects", + "keywords": [ + "json", + "jsonpath", + "path" + ], + "time": "2017-09-13T09:14:46+00:00" + }, { "name": "giggsey/libphonenumber-for-php", "version": "8.10.12", diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index cfeef60..d165bcb 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -77,9 +77,6 @@ module: inline_entity_form: 0 interval: 0 jsonapi: 0 - jsonrpc: 0 - jsonrpc_core: 0 - jsonrpc_discovery: 0 kint: 0 language: 0 link: 0 @@ -125,6 +122,7 @@ module: search_api: 0 search_api_db: 0 search_api_solr: 0 + search_api_solr_admin: 0 select_translation: 0 serialization: 0 simplenews: 0 diff --git a/config/sync/search_api.index.database.yml b/config/sync/search_api.index.database.yml index 2993d95..bbf53bd 100644 --- a/config/sync/search_api.index.database.yml +++ b/config/sync/search_api.index.database.yml @@ -8,8 +8,8 @@ dependencies: - taxonomy - search_api config: - - field.storage.node.body - field.storage.node.field_famille + - field.storage.node.body - field.storage.node.field_tags - field.storage.taxonomy_term.field_synonyms - field.storage.node.field_thesaurus @@ -20,7 +20,7 @@ third_party_settings: commit_before_finalize: false commit_after_finalize: false multilingual: - limit_to_content_language: false + limit_to_content_language: true include_language_independent: true highlighter: maxAnalyzedChars: 51200 diff --git a/config/sync/user.role.anonymous.yml b/config/sync/user.role.anonymous.yml index 0908804..4a169b6 100644 --- a/config/sync/user.role.anonymous.yml +++ b/config/sync/user.role.anonymous.yml @@ -20,6 +20,8 @@ permissions: - 'create generique workflow_transition' - 'create migration workflow_transition' - 'create workflow workflow_transition' + - 'issue subrequests' + - 'restful get config_rest_resource' - 'subscribe to newsletters' - 'use text format wysiwyg' - 'view commerce_product' diff --git a/config/sync/user.role.authenticated.yml b/config/sync/user.role.authenticated.yml index a99117c..c01234b 100644 --- a/config/sync/user.role.authenticated.yml +++ b/config/sync/user.role.authenticated.yml @@ -26,9 +26,11 @@ permissions: - 'edit own chutier entities' - 'edit own composition entities' - 'edit own fil entities' + - 'issue subrequests' - 'manage own commerce_payment_method' - 'materio_jsonapi ownroles' - 'opt-in or out of matomo tracking' + - 'restful get config_rest_resource' - 'subscribe to newsletters' - 'use chutier' - 'use text format wysiwyg' diff --git a/web/modules/custom/materio_home/materio_home.routing.yml b/web/modules/custom/materio_home/materio_home.routing.yml index d5f26d1..c5c777b 100644 --- a/web/modules/custom/materio_home/materio_home.routing.yml +++ b/web/modules/custom/materio_home/materio_home.routing.yml @@ -1,23 +1,7 @@ -# materio_home.home: -# path: '/home' -# defaults: -# _controller: '\Drupal\materio_home\Controller\HomeController::home' -# _title: 'Home' -# requirements: -# _permission: 'access content' - -# materio_home.home_mobile: -# path: '/home_m' -# defaults: -# _controller: '\Drupal\materio_home\Controller\HomeController::home_mobile' -# _title: 'Home' -# requirements: -# _permission: 'access content' -# -# materio_home.home_mobileajax: -# path: '/home_m/ajax' -# defaults: -# _controller: '\Drupal\materio_home\Controller\HomeController::home_mobilejson' -# _title: 'Home' -# requirements: -# _permission: 'access content' +materio_home.ajax_home: + path: 'materio_home/ajax/gethome' + defaults: + _controller: '\Drupal\materio_home\Controller\AjaxHomeController::getHome' + _title: 'ajaxGetHome' + requirements: + _permission: 'access content' diff --git a/web/modules/custom/materio_home/src/Controller/AjaxHomeController.php b/web/modules/custom/materio_home/src/Controller/AjaxHomeController.php new file mode 100644 index 0000000..cc577f4 --- /dev/null +++ b/web/modules/custom/materio_home/src/Controller/AjaxHomeController.php @@ -0,0 +1,106 @@ +entityManager = $entity_manager; + $this->languageManager = $language_manager; + $this->renderer = $renderer; + $this->entityTypeManager = $entity_type_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('entity.manager'), + $container->get('language_manager'), + $container->get('renderer'), + $container->get('entity_type.manager') + ); + } + + /** + * Hello. + * + * @return string + * Return Hello string. + */ + public function getHome() { + + $path = \Drupal::config('system.site')->get('page.front'); + + $params = Url::fromUri("internal:" . $path)->getRouteParameters(); + $entity_type = key($params); + $entity = $this->entityTypeManager()->getStorage($entity_type)->load($params[$entity_type]); + + $view_builder = $this->entityTypeManager()->getViewBuilder('node'); + $renderable = $view_builder->view($entity, 'default'); + $rendered = $this->renderer->executeInRenderContext(new RenderContext(), function () use ($renderable) { + return render($renderable); + }); + + $data['rendered'] = $rendered; + + $data['#cache'] = [ + 'max-age' => \Drupal\Core\Cache\Cache::PERMANENT, + 'tags' => ['edlp-home-cache'], + 'contexts' => [ + 'languages:language_content' + ] + ]; + // $response = new JsonResponse(); + // $response->setData($data); + $response = new CacheableJsonResponse($data); + $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($data)); + $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($renderable)); + + return $response; + } + +} diff --git a/web/modules/custom/materio_sapi/materio_sapi.routing.yml b/web/modules/custom/materio_sapi/materio_sapi.routing.yml index 833bba3..d3f6df1 100644 --- a/web/modules/custom/materio_sapi/materio_sapi.routing.yml +++ b/web/modules/custom/materio_sapi/materio_sapi.routing.yml @@ -30,9 +30,9 @@ materio_sapi.getresults: requirements: _permission: 'access materio search' -# materio_sapi.base: -# path: '/base/{keys}/{autocomplete}' -# defaults: -# _controller: '\Drupal\materio_sapi\Controller\Base::base' -# requirements: -# _permission: 'access materio search' +materio_sapi.base: + path: '/base' + defaults: + _controller: '\Drupal\materio_sapi\Controller\Base::pageHandler' + requirements: + _permission: 'access materio search' diff --git a/web/modules/custom/materio_sapi/src/Controller/Base.php b/web/modules/custom/materio_sapi/src/Controller/Base.php index a37e27c..5d485ae 100644 --- a/web/modules/custom/materio_sapi/src/Controller/Base.php +++ b/web/modules/custom/materio_sapi/src/Controller/Base.php @@ -1,5 +1,4 @@ index = Index::load('database'); + $this->query = $this->index->query(); + + // Change the parse mode for the search. + $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode') + ->createInstance('direct'); + $parse_mode->setConjunction('OR'); + $this->query->setParseMode($parse_mode); + + // Set fulltext search keywords and fields. + $this->query->keys($this->keys); + // $this->query->setFulltextFields(['name']); + + // Set additional conditions. + // $this->query->addCondition('status', 1) + // ->addCondition('author', 1, '<>'); + + // Restrict the search to specific languages. + // $this->query->setLanguages(['de', 'it']); + + // Do paging. + $this->query->range($this->offset, $this->limit); + + // Add sorting. + $this->query->sort('search_api_relevance', 'DESC'); + + // Set one or more tags for the query. + // @see hook_search_api_query_TAG_alter() + // @see hook_search_api_results_TAG_alter() + $this->query->addTag('materio_sapi_search'); + + $this->results = $this->query->execute(); + + } + /** - * Handler for autocomplete request. + * get params from request + */ + private function parseRequest(Request $request){ + // Get the typed string from the URL, if it exists. + $this->keys = $request->query->get('keys'); + if($this->keys){ + $this->keys = Unicode::strtolower($this->keys); + // $this->keys = Tags::explode($this->keys); + \Drupal::logger('materio_sapi')->notice($this->keys); + } + $this->term = $request->query->get('term'); + $this->offset = $request->query->get('offset') ?? $this->offset; + $this->limit = $request->query->get('limit') ?? $this->limit; + } + + /** + * Handler for ajax search. */ public function getResults(Request $request) { + $this->parseRequest($request); + $resp = [ - 'tes' => 'ok', - 'autocomplete' => $request->query->get('autocomplete'), - 'keys' => $request->query->get('keys'), + 'keys' => $this->keys, + 'term' => $this->term, 'range' => array( - 'offset' => $request->query->get('offset'), - 'limit' => $request->query->get('limit'), + 'offset' => $this->offset, + 'limit' => $this->limit ), ]; - // Get the typed string from the URL, if it exists. - if ($keys = $resp['keys']) { - $typed_string = Tags::explode($keys); - $typed_string = Unicode::strtolower($keys); - \Drupal::logger('materio_sapi')->notice($typed_string); - - $index = Index::load('database'); - $query = $index->query(); - - // Change the parse mode for the search. - $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode') - ->createInstance('direct'); - $parse_mode->setConjunction('OR'); - $query->setParseMode($parse_mode); - - // Set fulltext search keywords and fields. - $query->keys($typed_string); - // $query->setFulltextFields(['name']); - - // Set additional conditions. - // $query->addCondition('status', 1) - // ->addCondition('author', 1, '<>'); - - // Restrict the search to specific languages. - // $query->setLanguages(['de', 'it']); - - // Do paging. - $query->range($resp['range']['offset'], $resp['range']['limit']); - - // Add sorting. - $query->sort('search_api_relevance', 'DESC'); - - // Set one or more tags for the query. - // @see hook_search_api_query_TAG_alter() - // @see hook_search_api_results_TAG_alter() - $query->addTag('materio_sapi_search'); - - $results = $query->execute(); - - $resultitems = $results->getResultItems(); - $resp['count'] = $results->getResultCount(); - $resp['resultitems'] = array_keys($resultitems); - $resp['options'] = $query->getOptions(); + if ($this->keys) { + $this->sapiQuery(); + $resp['count'] = $this->results->getResultCount(); + $resp['options'] = $this->query->getOptions(); $items = []; - foreach ($results as $result) { - // \Drupal::logger('materio_sapi')->notice(print_r($result->getField('tid')->getValues(),true)); - // \Drupal::logger('materio_sapi')->notice(print_r($result->getField('name')->getValues(),true)); + foreach ($this->results as $result) { $nid = $result->getField('nid')->getValues()[0]; $title = $result->getField('title')->getValues()[0]->getText(); $items[] = [ @@ -94,4 +108,50 @@ class Base extends ControllerBase { return new JsonResponse($resp); } + + /** + * Handler for regular page search. + */ + function pageHandler(Request $request){ + // \Drupal::logger('materio_sapi')->notice(print_r($request, true)); + + $this->parseRequest($request); + + $resp = [ + "#title" => 'Base' + ]; + + if ($this->keys) { + $resp['#title'] = $this->keys; + + $this->sapiQuery(); + + $node_view_builder = \Drupal::entityTypeManager()->getViewBuilder('node'); + + $items = $this->results->getResultItems(); + + $this->items = []; + foreach ($items as $item) { + try { + /** @var \Drupal\Core\Entity\EntityInterface $entity */ + $entity = $item->getOriginalObject()->getValue(); + } + catch (SearchApiException $e) { + continue; + } + if (!$entity) { + continue; + } + // TODO: define dynamicly viewmode + $this->items[] = $node_view_builder->view($entity, 'teaser'); + + } + + $resp['items'] = $this->items; + }else{ + $resp['#markup'] = "no keys to search for"; + } + + return $resp; + } } diff --git a/web/modules/custom/materio_sapi/src/Form/MaterioSapiSearchForm.php b/web/modules/custom/materio_sapi/src/Form/MaterioSapiSearchForm.php index 01c9cf5..b714164 100644 --- a/web/modules/custom/materio_sapi/src/Form/MaterioSapiSearchForm.php +++ b/web/modules/custom/materio_sapi/src/Form/MaterioSapiSearchForm.php @@ -32,7 +32,7 @@ class MaterioSapiSearchForm extends FormBase { "placeholder" => $this->t('Search'), // "@keyup" => "keyup", "@keyup.enter" => "submit", - "v-model" => "keys", + "v-model" => "typed", // "v-on:select" => "typed", ], '#autocomplete_route_name' => 'materio_sapi.search_autocomplete', diff --git a/web/modules/custom/rest_config/rest_config.info.yml b/web/modules/custom/rest_config/rest_config.info.yml new file mode 100644 index 0000000..1fa5cc8 --- /dev/null +++ b/web/modules/custom/rest_config/rest_config.info.yml @@ -0,0 +1,7 @@ +name: 'REST Config' +type: module +description: 'Get site configiration through rest api' +core: 8.x +package: 'Custom' +dependencies: + - rest diff --git a/web/modules/custom/rest_config/rest_config.module b/web/modules/custom/rest_config/rest_config.module new file mode 100644 index 0000000..22064e8 --- /dev/null +++ b/web/modules/custom/rest_config/rest_config.module @@ -0,0 +1,24 @@ +' . t('About') . ''; + $output .= '

' . t('Get site configiration through rest api') . '

'; + return $output; + + default: + } +} diff --git a/web/modules/custom/rest_config/src/Plugin/rest/resource/ConfigRestResource.php b/web/modules/custom/rest_config/src/Plugin/rest/resource/ConfigRestResource.php new file mode 100644 index 0000000..ebcd23e --- /dev/null +++ b/web/modules/custom/rest_config/src/Plugin/rest/resource/ConfigRestResource.php @@ -0,0 +1,106 @@ +currentUser = $current_user; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->getParameter('serializer.formats'), + $container->get('logger.factory')->get('rest_config'), + $container->get('current_user') + ); + } + + /** + * Responds to GET requests. + * + * @return \Drupal\rest\ResourceResponse + * The HTTP response object. + * + * @throws \Symfony\Component\HttpKernel\Exception\HttpException + * Throws exception expected. + */ + public function get($file = null, $key = null) { + + // You must to implement the logic of your REST Resource here. + // Use current user after pass authentication to validate access. + if (!$this->currentUser->hasPermission('access content')) { + throw new AccessDeniedHttpException(); + } + + $data = []; + if($file && $key){ + $config = \Drupal::config($file); + if($config){ + $value = $config->get($key); + $data[$key] = $value; + } + } + + $response = new ResourceResponse($data, 200); + $response->addCacheableDependency($data); + return $response; + } + +} diff --git a/web/themes/custom/materiotheme/assets/dist/main.js b/web/themes/custom/materiotheme/assets/dist/main.js index e7f8ef0..48bbb39 100644 --- a/web/themes/custom/materiotheme/assets/dist/main.js +++ b/web/themes/custom/materiotheme/assets/dist/main.js @@ -429,7 +429,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _Card = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Content/Card */ \"./web/themes/custom/materiotheme/vuejs/components/Content/Card.vue\"));\n\nvar _vuex = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _default = {\n name: \"Base\",\n data: function data() {\n return {};\n },\n computed: _objectSpread({}, (0, _vuex.mapState)({\n items: function items(state) {\n return state.Search.items;\n }\n })),\n components: {\n Card: _Card.default\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Content/Base.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _Card = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Content/Card */ \"./web/themes/custom/materiotheme/vuejs/components/Content/Card.vue\"));\n\nvar _vuex = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _default = {\n name: \"Base\",\n data: function data() {\n return {};\n },\n computed: _objectSpread({}, (0, _vuex.mapState)({\n items: function items(state) {\n return state.Search.items;\n }\n })),\n methods: _objectSpread({}, (0, _vuex.mapActions)({\n newSearch: 'Search/newSearch'\n })),\n created: function created() {\n // laucnh a search if params exists in url query\n console.log('Base created() location', window.location);\n var params = new URLSearchParams(window.location.search);\n\n if (params.has('keys')) {\n this.$store.commit('Search/setKeys', params.get('keys'));\n this.newSearch();\n }\n },\n // beforeRouteEnter (to, from, next) {\n // console.log('Base beforeRouteEnter');//, to, from, next);\n // next()\n // },\n beforeRouteUpdate: function beforeRouteUpdate(to, from, next) {\n console.log('Base beforeRouteUpdate', to, from, next);\n this.$store.commit('Search/setKeys', to.query.keys);\n this.$store.commit('Search/setTerm', to.query.term);\n this.newSearch();\n next();\n },\n components: {\n Card: _Card.default\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Content/Base.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -453,7 +453,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _vue = _interopRequireDefault(__webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.js\"));\n\nvar _maAxios = __webpack_require__(/*! vuejs/api/ma-axios */ \"./web/themes/custom/materiotheme/vuejs/api/ma-axios.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\nvar _default = {\n props: ['html'],\n // get the html from parent with props\n data: function data() {\n return {\n template_src: null,\n // record the prop into data as it will be available in every hooks\n template: null // compiled template from html used in render\n\n };\n },\n beforeMount: function beforeMount() {\n var _this = this;\n\n // console.log('Home beforeMount this.html', this.html);\n if (!this.template_src) {\n if (this.html) {\n // if html prop is available record it has data\n this.template_src = this.html;\n } else {\n // else get it from ajax (e.g. if we didn't load the page from home)\n this.getHomeHtml();\n }\n } // compile the html src (coming from parent with props or from ajax call)\n\n\n if (this.template_src) {\n this.template = _vue.default.compile(this.template_src);\n this.$options.staticRenderFns = [];\n this._staticTrees = [];\n this.template.staticRenderFns.map(function (fn) {\n return _this.$options.staticRenderFns.push(fn);\n });\n }\n },\n methods: {\n getHomeHtml: function getHomeHtml() {\n var _this2 = this;\n\n _maAxios.MA.get(\"/materio_user/login_block\").then(function (_ref) {\n var data = _ref.data;\n _this2.template_src = data.rendered; // record the html src into data\n }).catch(function (error) {\n console.warn('Issue with getHomeHtml', error);\n });\n }\n },\n render: function render(h) {\n if (!this.template) {\n return h('span', 'Loading ...');\n } else {\n return this.template.render.call(this);\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Content/Home.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _vue = _interopRequireDefault(__webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = {\n props: ['html'],\n // get the html from parent with props\n data: function data() {\n return {\n template: null // compiled template from html used in render\n\n };\n },\n beforeMount: function beforeMount() {\n var _this = this;\n\n // console.log('Home beforeMount');\n // compile the html src (coming from parent with props or from ajax call)\n if (this.html) {\n // console.log('html', this.html);\n this.template = _vue.default.compile(this.html);\n this.$options.staticRenderFns = [];\n this._staticTrees = [];\n this.template.staticRenderFns.map(function (fn) {\n return _this.$options.staticRenderFns.push(fn);\n });\n }\n },\n render: function render(h) {\n if (!this.template) {\n return h('span', 'Loading ...');\n } else {\n return this.template.render.call(this);\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Content/Home.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -465,7 +465,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _vuex = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\nvar _route = _interopRequireDefault(__webpack_require__(/*! vuejs/route */ \"./web/themes/custom/materiotheme/vuejs/route/index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n router: _route.default,\n props: ['id', 'html'] // computed: {\n // ...mapState({\n // token: state => state.User.token,\n // isloggedin: state => state.User.isloggedin\n // })\n // },\n // beforeMount() {\n // console.log('MainContent beforeMount this.html', this.html);\n // },\n // mounted() {\n // console.log('MainContent this.$router', this.$router);\n // }\n\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Content/MainContent.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _vuex = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\nvar _maAxios = __webpack_require__(/*! vuejs/api/ma-axios */ \"./web/themes/custom/materiotheme/vuejs/api/ma-axios.js\");\n\nvar _route = _interopRequireDefault(__webpack_require__(/*! vuejs/route */ \"./web/themes/custom/materiotheme/vuejs/route/index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n router: _route.default,\n props: ['id', 'html', 'isfront'],\n data: function data() {\n return {\n home_template_src: null\n };\n },\n beforeMount: function beforeMount() {\n // console.log('MainContent beforeMount this.html', this.html);\n if (!this.home_template_src) {\n // console.log('no home_template_src');\n if (this.html && this.isfront) {\n // if html prop is available and we are landing on home then record it has data\n this.home_template_src = this.html;\n } else {\n // else get it from ajax (e.g. if we didn't load the page from home)\n this.getHomeHtml();\n }\n }\n },\n methods: {\n getHomeHtml: function getHomeHtml() {\n var _this = this;\n\n _maAxios.MA.get('materio_home/ajax/gethome').then(function (_ref) {\n var data = _ref.data;\n // console.log('Home getHomeHtml data', data);\n _this.home_template_src = data.rendered; // record the html src into data\n }).catch(function (error) {\n console.warn('Issue with getHomeHtml', error);\n });\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Content/MainContent.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -477,7 +477,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _vue = _interopRequireDefault(__webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.js\"));\n\nvar _route = _interopRequireDefault(__webpack_require__(/*! vuejs/route */ \"./web/themes/custom/materiotheme/vuejs/route/index.js\"));\n\nvar _vuex = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _default = {\n router: _route.default,\n props: ['form'],\n data: function data() {\n return {\n template: null,\n keys: \"\",\n autocomplete: \"\"\n };\n },\n methods: _objectSpread({}, (0, _vuex.mapActions)({\n newSearch: 'Search/newSearch'\n }), {\n submit: function submit() {\n var _this = this;\n\n console.log(\"search clicked\", this.keys, this.autocomplete);\n this.newSearch(this.keys, this.autocomplete).then(function () {\n _this.$router.push({\n name: 'base'\n });\n });\n },\n onAutoCompleteSelect: function onAutoCompleteSelect(event, ui) {\n event.preventDefault(); // console.log('autoCompleteSelect', event, ui);\n\n this.keys = ui.item.label;\n this.autocomplete = ui.item.value;\n }\n }),\n beforeMount: function beforeMount() {\n var _this2 = this;\n\n // console.log('SearchForm beforeMount');\n if (this._props.form) {\n // console.log('SearchForm beforeMount if this._props.form ok');\n this.template = _vue.default.compile(this._props.form); // https://github.com/vuejs/vue/issues/9911\n\n this.$options.staticRenderFns = [];\n this._staticTrees = [];\n this.template.staticRenderFns.map(function (fn) {\n return _this2.$options.staticRenderFns.push(fn);\n });\n }\n },\n watch: {\n keys: function keys() {\n console.log('keys changed', this.keys);\n }\n },\n mounted: function mounted() {\n // console.log('SearchForm mounted');\n Drupal.attachBehaviors(this.$el); // Catch the jquery ui events for autocmplete widget\n\n jQuery(this.$el.querySelector('#edit-search')).on('autocompleteselect', this.onAutoCompleteSelect);\n },\n render: function render(h) {\n // console.log('searchForm render');\n if (!this.template) {\n return h('span', 'Loading ...');\n } else {\n return this.template.render.call(this);\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Form/SearchForm.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _vue = _interopRequireDefault(__webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.js\"));\n\nvar _route = _interopRequireDefault(__webpack_require__(/*! vuejs/route */ \"./web/themes/custom/materiotheme/vuejs/route/index.js\"));\n\nvar _vuex = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _default = {\n router: _route.default,\n props: ['form'],\n data: function data() {\n return {\n template: null,\n typed: null,\n autocomplete: null\n };\n },\n computed: _objectSpread({}, (0, _vuex.mapState)({\n keys: function keys(state) {\n return state.Search.keys;\n },\n term: function term(state) {\n return state.Search.term;\n }\n })),\n methods: {\n submit: function submit() {\n console.log(\"search clicked\", this.keys, this.autocomplete); // New search is triggered by Base.vue with router (which will also fill the store)\n\n this.$router.push({\n name: 'base',\n query: {\n keys: this.typed,\n term: this.autocomplete\n }\n });\n },\n onAutoCompleteSelect: function onAutoCompleteSelect(event, ui) {\n event.preventDefault(); // console.log('autoCompleteSelect', event, ui);\n\n this.typed = ui.item.label;\n this.autocomplete = ui.item.value;\n }\n },\n beforeMount: function beforeMount() {\n var _this = this;\n\n // console.log('SearchForm beforeMount');\n if (this._props.form) {\n // console.log('SearchForm beforeMount if this._props.form ok');\n this.template = _vue.default.compile(this._props.form); // https://github.com/vuejs/vue/issues/9911\n\n this.$options.staticRenderFns = [];\n this._staticTrees = [];\n this.template.staticRenderFns.map(function (fn) {\n return _this.$options.staticRenderFns.push(fn);\n });\n }\n },\n watch: {\n keys: function keys(n, o) {\n console.log('keys changed', n, o);\n this.typed = n;\n },\n term: function term(n, o) {\n console.log('autocomplete changed', n, o);\n this.autocomplete = n;\n }\n },\n created: function created() {\n this.typed = this.keys;\n this.autocomplete = this.term;\n },\n mounted: function mounted() {\n // console.log('SearchForm mounted');\n Drupal.attachBehaviors(this.$el); // Catch the jquery ui events for autocmplete widget\n\n jQuery(this.$el.querySelector('#edit-search')).on('autocompleteselect', this.onAutoCompleteSelect);\n },\n render: function render(h) {\n // console.log('searchForm render');\n if (!this.template) {\n return h('span', 'Loading ...');\n } else {\n return this.template.render.call(this);\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Form/SearchForm.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -674,7 +674,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { attrs: { id: _vm.id } },\n [\n _c(\"router-view\", { attrs: { name: \"home\", html: _vm.html } }),\n _vm._v(\" \"),\n _c(\"router-view\", { attrs: { name: \"base\" } })\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Content/MainContent.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { attrs: { id: _vm.id } },\n [\n _c(\"router-view\", {\n attrs: { name: \"home\", html: _vm.home_template_src }\n }),\n _vm._v(\" \"),\n _c(\"router-view\", { attrs: { name: \"base\" } })\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Content/MainContent.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -802,7 +802,7 @@ eval("var g; // This works in non-strict mode\n\ng = function () {\n return thi /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nvar _vue = _interopRequireDefault(__webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.js\"));\n\nvar _store = _interopRequireDefault(__webpack_require__(/*! vuejs/store */ \"./web/themes/custom/materiotheme/vuejs/store/index.js\"));\n\nvar _route = _interopRequireDefault(__webpack_require__(/*! vuejs/route */ \"./web/themes/custom/materiotheme/vuejs/route/index.js\"));\n\nvar _UserBlock = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Block/UserBlock */ \"./web/themes/custom/materiotheme/vuejs/components/Block/UserBlock.vue\"));\n\nvar _MainContent = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Content/MainContent */ \"./web/themes/custom/materiotheme/vuejs/components/Content/MainContent.vue\"));\n\nvar _SearchBlock = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Block/SearchBlock */ \"./web/themes/custom/materiotheme/vuejs/components/Block/SearchBlock.vue\"));\n\nvar _vuex = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\n__webpack_require__(/*! theme/assets/styles/main.scss */ \"./web/themes/custom/materiotheme/assets/styles/main.scss\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// require('theme/assets/styles/main.scss');\n(function (Drupal, drupalSettings) {\n var MaterioTheme = function MaterioTheme() {\n var _v_sitebranding_block, _v_user_block, _v_main_content, _v_search_block;\n\n var _is_front = drupalSettings.path.isFront;\n console.log('drupalSettings', drupalSettings); // ___ _ _\n // |_ _|_ _ (_) |_\n // | || ' \\| | _|\n // |___|_||_|_|\\__|\n\n function init() {\n console.log(\"MaterioTheme init()\");\n initVues();\n }\n\n function initVues() {\n initVSiteBrandingBlock();\n initVUserBlock();\n initVMainContent();\n initVSearchBlock();\n }\n\n function initVSiteBrandingBlock() {\n _v_sitebranding_block = new _vue.default({\n store: _store.default,\n router: _route.default,\n el: '#block-sitebranding',\n methods: {\n onclick: function onclick() {\n console.log(\"Clicked on logo\");\n this.$router.push({\n name: 'home'\n });\n }\n }\n });\n }\n\n function initVUserBlock() {\n var mount_point = drupalSettings.user.uid !== 0 ? 'block-userblock' : 'block-userlogin';\n var props = {\n title: \"\",\n loginblock: \"\"\n };\n\n switch (mount_point) {\n case 'block-userlogin':\n var $block = document.getElementById(mount_point);\n console.log('initVUserBlock login form html', $block);\n props.loginblock = $block.outerHTML.trim();\n break;\n\n case 'block-userblock':\n default:\n break;\n }\n\n _v_user_block = new _vue.default({\n store: _store.default,\n // computed: {\n // ...mapState({\n // isloggedin: state => state.User.isloggedin\n // })\n // },\n created: function created() {\n // if already loggedin, call store.user to get the user infos\n if (drupalSettings.user.uid !== 0) {\n this.$store.commit('User/setUid', drupalSettings.user.uid);\n this.$store.dispatch('User/getUser');\n }\n },\n render: function render(h) {\n return h(_UserBlock.default, {\n props: props\n });\n }\n }).$mount('#' + mount_point); // console.log('initVUserBlock', _v_user_block);\n }\n\n function initVMainContent() {\n var id = \"main-content\";\n var $main_content = document.querySelector('#' + id); // console.log('main-content', $main_content);\n\n var main_html = $main_content.innerHTML;\n _v_main_content = new _vue.default({\n store: _store.default,\n render: function render(h) {\n return h(_MainContent.default, {\n props: {\n id: id,\n html: main_html\n }\n });\n }\n }).$mount('#' + id); // console.log('initTestVContent', v_test_content);\n }\n\n function initVSearchBlock() {\n // console.log('initVSearchBlock');\n var id = \"block-materiosapisearchblock\";\n var $search_block = document.getElementById(id);\n var formhtml = null;\n\n if ($search_block) {\n // get the search form html to pass it as template to the vue\n // we gain display speed vs async downloaded data\n formhtml = $search_block.innerHTML;\n } else {\n // else create the empty block to fill it later with async data\n $search_block = document.createElement('div');\n $search_block.setAttribute('id', id);\n var $region = document.getElementById('content-top');\n $region.appendChild($search_block);\n } // in any case create the vue\n\n\n _v_search_block = new _vue.default({\n store: _store.default,\n render: function render(h) {\n return h(_SearchBlock.default, {\n props: {\n blockid: id,\n formhtml: formhtml\n }\n });\n }\n }).$mount('#' + id);\n }\n\n init();\n }; // end MaterioTheme()\n\n\n var materiotheme = new MaterioTheme();\n})(Drupal, drupalSettings);\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/assets/scripts/main.js?"); +eval("\n\nvar _vue = _interopRequireDefault(__webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.js\"));\n\nvar _store = _interopRequireDefault(__webpack_require__(/*! vuejs/store */ \"./web/themes/custom/materiotheme/vuejs/store/index.js\"));\n\nvar _route = _interopRequireDefault(__webpack_require__(/*! vuejs/route */ \"./web/themes/custom/materiotheme/vuejs/route/index.js\"));\n\nvar _UserBlock = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Block/UserBlock */ \"./web/themes/custom/materiotheme/vuejs/components/Block/UserBlock.vue\"));\n\nvar _MainContent = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Content/MainContent */ \"./web/themes/custom/materiotheme/vuejs/components/Content/MainContent.vue\"));\n\nvar _SearchBlock = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Block/SearchBlock */ \"./web/themes/custom/materiotheme/vuejs/components/Block/SearchBlock.vue\"));\n\nvar _vuex = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\n__webpack_require__(/*! theme/assets/styles/main.scss */ \"./web/themes/custom/materiotheme/assets/styles/main.scss\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// require('theme/assets/styles/main.scss');\n(function (Drupal, drupalSettings) {\n var MaterioTheme = function MaterioTheme() {\n var _v_sitebranding_block, _v_user_block, _v_main_content, _v_search_block;\n\n var _is_front = drupalSettings.path.isFront;\n console.log('drupalSettings', drupalSettings); // ___ _ _\n // |_ _|_ _ (_) |_\n // | || ' \\| | _|\n // |___|_||_|_|\\__|\n\n function init() {\n console.log(\"MaterioTheme init()\");\n initVues();\n }\n\n function initVues() {\n initVSiteBrandingBlock();\n initVUserBlock();\n initVMainContent();\n initVSearchBlock();\n }\n\n function initVSiteBrandingBlock() {\n _v_sitebranding_block = new _vue.default({\n store: _store.default,\n router: _route.default,\n el: '#block-sitebranding',\n methods: {\n onclick: function onclick() {\n console.log(\"Clicked on logo\");\n this.$router.push({\n name: 'home'\n });\n }\n }\n });\n }\n\n function initVUserBlock() {\n var mount_point = drupalSettings.user.uid !== 0 ? 'block-userblock' : 'block-userlogin';\n var props = {\n title: \"\",\n loginblock: \"\"\n };\n\n switch (mount_point) {\n case 'block-userlogin':\n var $block = document.getElementById(mount_point);\n console.log('initVUserBlock login form html', $block);\n props.loginblock = $block.outerHTML.trim();\n break;\n\n case 'block-userblock':\n default:\n break;\n }\n\n _v_user_block = new _vue.default({\n store: _store.default,\n // computed: {\n // ...mapState({\n // isloggedin: state => state.User.isloggedin\n // })\n // },\n created: function created() {\n // if already loggedin, call store.user to get the user infos\n if (drupalSettings.user.uid !== 0) {\n this.$store.commit('User/setUid', drupalSettings.user.uid);\n this.$store.dispatch('User/getUser');\n }\n },\n render: function render(h) {\n return h(_UserBlock.default, {\n props: props\n });\n }\n }).$mount('#' + mount_point); // console.log('initVUserBlock', _v_user_block);\n }\n\n function initVMainContent() {\n var id = \"main-content\";\n var $main_content = document.querySelector('#' + id); // console.log('main-content', $main_content);\n\n var main_html = $main_content.innerHTML;\n _v_main_content = new _vue.default({\n store: _store.default,\n render: function render(h) {\n return h(_MainContent.default, {\n props: {\n id: id,\n html: main_html,\n isfront: drupalSettings.path.isFront\n }\n });\n }\n }).$mount('#' + id); // console.log('initTestVContent', v_test_content);\n }\n\n function initVSearchBlock() {\n // console.log('initVSearchBlock');\n var id = \"block-materiosapisearchblock\";\n var $search_block = document.getElementById(id);\n var formhtml = null;\n\n if ($search_block) {\n // get the search form html to pass it as template to the vue\n // we gain display speed vs async downloaded data\n formhtml = $search_block.innerHTML;\n } else {\n // else create the empty block to fill it later with async data\n $search_block = document.createElement('div');\n $search_block.setAttribute('id', id);\n var $region = document.getElementById('content-top');\n $region.appendChild($search_block);\n } // in any case create the vue\n\n\n _v_search_block = new _vue.default({\n store: _store.default,\n render: function render(h) {\n return h(_SearchBlock.default, {\n props: {\n blockid: id,\n formhtml: formhtml\n }\n });\n }\n }).$mount('#' + id);\n }\n\n init();\n }; // end MaterioTheme()\n\n\n var materiotheme = new MaterioTheme();\n})(Drupal, drupalSettings);\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/assets/scripts/main.js?"); /***/ }), @@ -1173,7 +1173,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _vue = _interopRequireDefault(__webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.js\"));\n\nvar _vueRouter = _interopRequireDefault(__webpack_require__(/*! vue-router */ \"./node_modules/vue-router/dist/vue-router.esm.js\"));\n\nvar _Home = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Content/Home */ \"./web/themes/custom/materiotheme/vuejs/components/Content/Home.vue\"));\n\nvar _Base = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Content/Base */ \"./web/themes/custom/materiotheme/vuejs/components/Content/Base.vue\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_vue.default.use(_vueRouter.default);\n\nvar _default = new _vueRouter.default({\n routes: [{\n path: '/',\n name: 'home',\n components: {\n 'home': _Home.default\n }\n }, {\n path: '/base',\n name: 'base',\n components: {\n 'base': _Base.default\n }\n }]\n});\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/route/index.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _vue = _interopRequireDefault(__webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.js\"));\n\nvar _vueRouter = _interopRequireDefault(__webpack_require__(/*! vue-router */ \"./node_modules/vue-router/dist/vue-router.esm.js\"));\n\nvar _Home = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Content/Home */ \"./web/themes/custom/materiotheme/vuejs/components/Content/Home.vue\"));\n\nvar _Base = _interopRequireDefault(__webpack_require__(/*! vuejs/components/Content/Base */ \"./web/themes/custom/materiotheme/vuejs/components/Content/Base.vue\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_vue.default.use(_vueRouter.default); // https://www.lullabot.com/articles/decoupled-hard-problems-routing\n\n\nvar _default = new _vueRouter.default({\n mode: 'history',\n routes: [{\n path: '/',\n name: 'home',\n components: {\n 'home': _Home.default\n }\n }, {\n path: '/base',\n name: 'base',\n components: {\n 'base': _Base.default\n }\n }]\n});\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/route/index.js?"); /***/ }), @@ -1197,7 +1197,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _jsonAxios = __webpack_require__(/*! vuejs/api/json-axios */ \"./web/themes/custom/materiotheme/vuejs/api/json-axios.js\");\n\nvar _maAxios = __webpack_require__(/*! vuejs/api/ma-axios */ \"./web/themes/custom/materiotheme/vuejs/api/ma-axios.js\");\n\nvar _querystring = _interopRequireDefault(__webpack_require__(/*! querystring */ \"./node_modules/querystring-es3/index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = {\n namespaced: true,\n // initial state\n state: {\n keys: \"\",\n autocomplete: \"\",\n items: [],\n limit: 15,\n offset: 0\n },\n // getters\n getters: {},\n // mutations\n mutations: {\n setItems: function setItems(state, items) {\n state.items = items;\n },\n setKeys: function setKeys(state, keys) {\n state.keys = keys;\n },\n setAutocomplete: function setAutocomplete(state, autocomplete) {\n state.autocomplete = autocomplete;\n },\n resetOffset: function resetOffset(state) {\n state.offset = 0;\n },\n incrementOffset: function incrementOffset(state) {\n state.offset += state.limit;\n }\n },\n // actions\n actions: {\n newSearch: function newSearch(_ref, keys, autocomplete) {\n var dispatch = _ref.dispatch,\n commit = _ref.commit,\n state = _ref.state;\n commit('resetOffset');\n commit('setKeys', keys);\n commit('setAutocomplete', autocomplete);\n dispatch('getResults');\n },\n getResults: function getResults(_ref2) {\n var dispatch = _ref2.dispatch,\n commit = _ref2.commit,\n state = _ref2.state;\n var params = {\n keys: state.keys,\n autocomplete: state.autocomplete,\n offset: state.offset,\n limit: state.limit\n };\n console.log('Search getResults params', params);\n\n var q = _querystring.default.stringify(params);\n\n return _maAxios.MA.get(\"/materio_sapi/getresults?\" + q).then(function (_ref3) {\n var data = _ref3.data;\n console.log('search MA getresults data', data);\n commit('setItems', data.items);\n }).catch(function (error) {\n console.warn('Issue with getResults', error);\n Promise.reject(error);\n });\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/store/modules/search.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _jsonAxios = __webpack_require__(/*! vuejs/api/json-axios */ \"./web/themes/custom/materiotheme/vuejs/api/json-axios.js\");\n\nvar _maAxios = __webpack_require__(/*! vuejs/api/ma-axios */ \"./web/themes/custom/materiotheme/vuejs/api/ma-axios.js\");\n\nvar _querystring = _interopRequireDefault(__webpack_require__(/*! querystring */ \"./node_modules/querystring-es3/index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = {\n namespaced: true,\n // initial state\n state: {\n keys: \"\",\n term: \"\",\n items: [],\n offset: 0,\n limit: 15\n },\n // getters\n getters: {},\n // mutations\n mutations: {\n setItems: function setItems(state, items) {\n state.items = items;\n },\n setKeys: function setKeys(state, keys) {\n state.keys = keys;\n },\n setTerm: function setTerm(state, term) {\n state.term = term;\n },\n resetOffset: function resetOffset(state) {\n state.offset = 0;\n },\n incrementOffset: function incrementOffset(state) {\n state.offset += state.limit;\n }\n },\n // actions\n actions: {\n newSearch: function newSearch(_ref) {\n var dispatch = _ref.dispatch,\n commit = _ref.commit,\n state = _ref.state;\n console.log('Search newSearch');\n commit('resetOffset');\n dispatch('getResults');\n },\n getResults: function getResults(_ref2) {\n var dispatch = _ref2.dispatch,\n commit = _ref2.commit,\n state = _ref2.state;\n var params = {\n keys: state.keys,\n term: state.term,\n offset: state.offset,\n limit: state.limit // console.log('Search getResults params', params);\n\n };\n\n var q = _querystring.default.stringify(params);\n\n return _maAxios.MA.get(\"/materio_sapi/getresults?\" + q).then(function (_ref3) {\n var data = _ref3.data;\n console.log('search MA getresults data', data);\n commit('setItems', data.items);\n }).catch(function (error) {\n console.warn('Issue with getResults', error);\n Promise.reject(error);\n });\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/store/modules/search.js?"); /***/ }), diff --git a/web/themes/custom/materiotheme/assets/scripts/main.js b/web/themes/custom/materiotheme/assets/scripts/main.js index 9ad5077..c35a183 100644 --- a/web/themes/custom/materiotheme/assets/scripts/main.js +++ b/web/themes/custom/materiotheme/assets/scripts/main.js @@ -94,7 +94,7 @@ import 'theme/assets/styles/main.scss' let main_html = $main_content.innerHTML _v_main_content = new Vue({ store, - render: h => h(VMainContent, {props:{id:id, html:main_html}}) + render: h => h(VMainContent, {props:{id:id, html:main_html, isfront:drupalSettings.path.isFront}}) }).$mount('#'+id) // console.log('initTestVContent', v_test_content); } diff --git a/web/themes/custom/materiotheme/vuejs/components/Content/Base.vue b/web/themes/custom/materiotheme/vuejs/components/Content/Base.vue index 3c3f8f6..1c681c6 100644 --- a/web/themes/custom/materiotheme/vuejs/components/Content/Base.vue +++ b/web/themes/custom/materiotheme/vuejs/components/Content/Base.vue @@ -28,6 +28,31 @@ export default { items: state => state.Search.items }) }, + methods: { + ...mapActions({ + newSearch: 'Search/newSearch' + }) + }, + created() { + // laucnh a search if params exists in url query + console.log('Base created() location',window.location); + let params = new URLSearchParams(window.location.search) + if(params.has('keys')){ + this.$store.commit('Search/setKeys', params.get('keys')) + this.newSearch() + } + }, + // beforeRouteEnter (to, from, next) { + // console.log('Base beforeRouteEnter');//, to, from, next); + // next() + // }, + beforeRouteUpdate (to, from, next) { + console.log('Base beforeRouteUpdate', to, from, next); + this.$store.commit('Search/setKeys', to.query.keys) + this.$store.commit('Search/setTerm', to.query.term) + this.newSearch() + next() + }, components: { Card } diff --git a/web/themes/custom/materiotheme/vuejs/components/Content/Home.vue b/web/themes/custom/materiotheme/vuejs/components/Content/Home.vue index dc4c0b5..bde1a03 100644 --- a/web/themes/custom/materiotheme/vuejs/components/Content/Home.vue +++ b/web/themes/custom/materiotheme/vuejs/components/Content/Home.vue @@ -1,45 +1,25 @@ - diff --git a/web/themes/custom/materiotheme/vuejs/components/Form/SearchForm.vue b/web/themes/custom/materiotheme/vuejs/components/Form/SearchForm.vue index bc37a84..04eefdc 100644 --- a/web/themes/custom/materiotheme/vuejs/components/Form/SearchForm.vue +++ b/web/themes/custom/materiotheme/vuejs/components/Form/SearchForm.vue @@ -4,7 +4,7 @@ import Vue from 'vue' import router from 'vuejs/route' -import { mapState, mapActions } from 'vuex' +import { mapState } from 'vuex' export default { router, @@ -12,25 +12,26 @@ export default { data() { return { template: null, - keys: "", - autocomplete: "" + typed: null, + autocomplete: null } }, + computed: { + ...mapState({ + keys: state => state.Search.keys, + term: state => state.Search.term + }) + }, methods: { - ...mapActions({ - newSearch: 'Search/newSearch' - }), submit() { console.log("search clicked", this.keys, this.autocomplete); - this.newSearch(this.keys, this.autocomplete) - .then(() => { - this.$router.push({name:'base'}) - }); + // New search is triggered by Base.vue with router (which will also fill the store) + this.$router.push({name:'base', query:{keys:this.typed,term:this.autocomplete}}) }, onAutoCompleteSelect(event, ui){ event.preventDefault(); // console.log('autoCompleteSelect', event, ui); - this.keys = ui.item.label + this.typed = ui.item.label this.autocomplete = ui.item.value } }, @@ -46,10 +47,19 @@ export default { } }, watch: { - keys(){ - console.log('keys changed', this.keys); + keys(n, o){ + console.log('keys changed', n, o); + this.typed = n + }, + term(n, o){ + console.log('autocomplete changed', n, o); + this.autocomplete = n } }, + created() { + this.typed = this.keys + this.autocomplete = this.term + }, mounted(){ // console.log('SearchForm mounted'); Drupal.attachBehaviors(this.$el); diff --git a/web/themes/custom/materiotheme/vuejs/route/index.js b/web/themes/custom/materiotheme/vuejs/route/index.js index 751c0e8..e9a99e7 100644 --- a/web/themes/custom/materiotheme/vuejs/route/index.js +++ b/web/themes/custom/materiotheme/vuejs/route/index.js @@ -6,7 +6,10 @@ import Base from 'vuejs/components/Content/Base' Vue.use(VueRouter) +// https://www.lullabot.com/articles/decoupled-hard-problems-routing + export default new VueRouter({ + mode: 'history', routes: [ { path: '/', @@ -22,5 +25,12 @@ export default new VueRouter({ 'base': Base } }, + // { + // path: '*', + // name: 'notfound', + // components: { + // 'notfound': NotFound + // } + // } ] }) diff --git a/web/themes/custom/materiotheme/vuejs/store/modules/search.js b/web/themes/custom/materiotheme/vuejs/store/modules/search.js index 959083a..6b56e8a 100644 --- a/web/themes/custom/materiotheme/vuejs/store/modules/search.js +++ b/web/themes/custom/materiotheme/vuejs/store/modules/search.js @@ -8,10 +8,10 @@ export default { // initial state state : { keys: "", - autocomplete: "", + term: "", items: [], - limit: 15, - offset: 0 + offset: 0, + limit: 15 }, // getters @@ -25,8 +25,8 @@ export default { setKeys (state, keys) { state.keys = keys }, - setAutocomplete (state, autocomplete) { - state.autocomplete = autocomplete + setTerm (state, term) { + state.term = term }, resetOffset(state) { state.offset = 0 @@ -38,20 +38,19 @@ export default { // actions actions : { - newSearch({ dispatch, commit, state }, keys, autocomplete) { + newSearch({ dispatch, commit, state }) { + console.log('Search newSearch'); commit('resetOffset') - commit('setKeys', keys) - commit('setAutocomplete', autocomplete) dispatch('getResults') }, getResults ({ dispatch, commit, state }) { let params = { keys: state.keys, - autocomplete: state.autocomplete, + term: state.term, offset:state.offset, limit: state.limit } - console.log('Search getResults params', params); + // console.log('Search getResults params', params); let q = qs.stringify(params) return MA.get(`/materio_sapi/getresults?`+q) .then(({ data }) => {