From d5a619472797284bccc1878e515994b8cbbb8cae Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Mon, 7 Oct 2019 15:54:03 +0200 Subject: [PATCH] handeled login or register from a modal, YES git status --- composer.json | 1 + composer.lock | 64 +++++++++++++- config/sync/contact.settings.yml | 2 +- ....entity_form_display.user.user.default.yml | 15 ++-- ...re.entity_form_display.user.user.modal.yml | 43 ++++++++++ ...entity_form_display.user.user.register.yml | 83 +++++++++++++++++++ .../sync/core.entity_form_mode.user.modal.yml | 10 +++ config/sync/core.extension.yml | 1 + .../sync/field.storage.user.field_company.yml | 4 + .../field.storage.user.field_member_type.yml | 4 + config/sync/field.storage.user.field_memo.yml | 4 + .../field.storage.user.field_showroom.yml | 4 + config/sync/genpass.settings.yml | 2 +- config/sync/user.role.adherent.yml | 4 + config/sync/user.role.admin.yml | 14 ++++ config/sync/user.role.anonymous.yml | 2 + config/sync/user.role.authenticated.yml | 2 + .../custom/materio_user/materio_user.module | 66 +++++++++++++++ .../src/Controller/AjaxRegisterForm.php | 11 +-- .../custom/materiotheme/assets/dist/main.css | 13 +++ .../custom/materiotheme/assets/dist/main.js | 6 +- .../templates/form/form.html.twig | 15 ++++ .../vuejs/components/Form/LoginForm.vue | 4 +- .../vuejs/components/Form/RegisterForm.vue | 77 +++++++++-------- .../materiotheme/vuejs/store/modules/user.js | 5 +- 25 files changed, 398 insertions(+), 58 deletions(-) create mode 100644 config/sync/core.entity_form_display.user.user.modal.yml create mode 100644 config/sync/core.entity_form_display.user.user.register.yml create mode 100644 config/sync/core.entity_form_mode.user.modal.yml create mode 100644 web/themes/custom/materiotheme/templates/form/form.html.twig diff --git a/composer.json b/composer.json index bd882b0..b3eff82 100644 --- a/composer.json +++ b/composer.json @@ -37,6 +37,7 @@ "drupal/core": "^8.7.1", "drupal/entity_clone": "^1.0", "drupal/error_log": "^1.0", + "drupal/field_permissions": "^1.0", "drupal/genpass": "1.x-dev", "drupal/image_delta_formatter": "1.x-dev", "drupal/jsonapi_extras": "^3.7", diff --git a/composer.lock b/composer.lock index 1208e1e..29d3674 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": "bee8de31ae3bb4fa7aa201097983403f", + "content-hash": "e30f4a9dd3ad6f9179b3b52f60f7791b", "packages": [ { "name": "alchemy/zippy", @@ -6495,6 +6495,66 @@ "source": "https://git.drupalcode.org/project/field_group" } }, + { + "name": "drupal/field_permissions", + "version": "1.0.0-rc2", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/field_permissions.git", + "reference": "8.x-1.0-rc2" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/field_permissions-8.x-1.0-rc2.zip", + "reference": "8.x-1.0-rc2", + "shasum": "bbc0d4215b24f2613a02a365a22f2039ebcea421" + }, + "require": { + "drupal/core": "~8.0" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "drupal": { + "version": "8.x-1.0-rc2", + "datestamp": "1545332280", + "security-coverage": { + "status": "not-covered", + "message": "RC releases are not covered by Drupal security advisories." + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "RobLoach", + "homepage": "https://www.drupal.org/user/61114" + }, + { + "name": "jhedstrom", + "homepage": "https://www.drupal.org/user/208732" + }, + { + "name": "mariacha1", + "homepage": "https://www.drupal.org/user/2210776" + }, + { + "name": "markus_petrux", + "homepage": "https://www.drupal.org/user/39593" + } + ], + "description": "The Field Permissions module allows site administrators to set field-level permissions to edit, view and create fields on any entity.", + "homepage": "https://www.drupal.org/project/field_permissions", + "support": { + "source": "https://git.drupalcode.org/project/field_permissions", + "issues": "https://www.drupal.org/project/issues/field_permissions" + } + }, { "name": "drupal/file_mdm", "version": "1.1.0", @@ -15831,7 +15891,7 @@ "version": "8.3.5", "source": { "type": "git", - "url": "https://git.drupal.org/project/coder.git", + "url": "https://git.drupalcode.org/project/coder.git", "reference": "35277fc8675b6a2cbb194f8880145a9c85c845c4" }, "require": { diff --git a/config/sync/contact.settings.yml b/config/sync/contact.settings.yml index a2903f5..8b88cde 100644 --- a/config/sync/contact.settings.yml +++ b/config/sync/contact.settings.yml @@ -2,6 +2,6 @@ default_form: feedback flood: limit: 5 interval: 3600 -user_default_enabled: true +user_default_enabled: false _core: default_config_hash: U69DBeuvXuNVOC15rVNaBjDPK2fWFbo9v4takdYSSO8 diff --git a/config/sync/core.entity_form_display.user.user.default.yml b/config/sync/core.entity_form_display.user.user.default.yml index 54ff1b2..6838c6c 100644 --- a/config/sync/core.entity_form_display.user.user.default.yml +++ b/config/sync/core.entity_form_display.user.user.default.yml @@ -20,11 +20,6 @@ content: region: content settings: { } third_party_settings: { } - contact: - weight: 8 - region: content - settings: { } - third_party_settings: { } field_company: weight: 1 settings: @@ -58,12 +53,12 @@ content: type: entity_reference_autocomplete region: content language: - weight: 5 + weight: 6 region: content settings: { } third_party_settings: { } matomo: - weight: 6 + weight: 7 region: content settings: { } third_party_settings: { } @@ -75,9 +70,13 @@ content: third_party_settings: { } simplenews: weight: 5 + region: content settings: { } third_party_settings: { } - region: content hidden: commerce_remote_id: true + contact: true + contact_company_profiles: true + customer_profiles: true langcode: true + member_profiles: true diff --git a/config/sync/core.entity_form_display.user.user.modal.yml b/config/sync/core.entity_form_display.user.user.modal.yml new file mode 100644 index 0000000..ba53dbe --- /dev/null +++ b/config/sync/core.entity_form_display.user.user.modal.yml @@ -0,0 +1,43 @@ +uuid: 752dc176-50c8-47d0-8a20-c66e6210e8c9 +langcode: en +status: true +dependencies: + config: + - core.entity_form_mode.user.modal + - field.field.user.user.commerce_remote_id + - field.field.user.user.field_company + - field.field.user.user.field_member_type + - field.field.user.user.field_memo + - field.field.user.user.field_showroom + module: + - user +id: user.user.modal +targetEntityType: user +bundle: user +mode: modal +content: + account: + weight: 0 + region: content + settings: { } + third_party_settings: { } + path: + type: path + weight: 7 + region: content + settings: { } + third_party_settings: { } +hidden: + commerce_remote_id: true + contact: true + contact_company_profiles: true + customer_profiles: true + field_company: true + field_member_type: true + field_memo: true + field_showroom: true + langcode: true + language: true + matomo: true + member_profiles: true + simplenews: true diff --git a/config/sync/core.entity_form_display.user.user.register.yml b/config/sync/core.entity_form_display.user.user.register.yml new file mode 100644 index 0000000..1144274 --- /dev/null +++ b/config/sync/core.entity_form_display.user.user.register.yml @@ -0,0 +1,83 @@ +uuid: 260badeb-b09e-4f68-8fae-2a64784dae59 +langcode: en +status: true +dependencies: + config: + - core.entity_form_mode.user.register + - field.field.user.user.commerce_remote_id + - field.field.user.user.field_company + - field.field.user.user.field_member_type + - field.field.user.user.field_memo + - field.field.user.user.field_showroom + module: + - user +id: user.user.register +targetEntityType: user +bundle: user +mode: register +content: + account: + weight: 0 + region: content + settings: { } + third_party_settings: { } + field_company: + weight: 1 + settings: + match_operator: CONTAINS + size: 60 + placeholder: '' + third_party_settings: { } + type: entity_reference_autocomplete + region: content + field_member_type: + weight: 4 + settings: { } + third_party_settings: { } + type: options_select + region: content + field_memo: + weight: 3 + settings: + rows: 5 + placeholder: '' + third_party_settings: { } + type: string_textarea + region: content + field_showroom: + weight: 2 + settings: + match_operator: CONTAINS + size: 60 + placeholder: '' + third_party_settings: { } + type: entity_reference_autocomplete + region: content + language: + weight: 6 + region: content + settings: { } + third_party_settings: { } + matomo: + weight: 7 + region: content + settings: { } + third_party_settings: { } + path: + type: path + weight: 7 + region: content + settings: { } + third_party_settings: { } + simplenews: + weight: 5 + region: content + settings: { } + third_party_settings: { } +hidden: + commerce_remote_id: true + contact: true + contact_company_profiles: true + customer_profiles: true + langcode: true + member_profiles: true diff --git a/config/sync/core.entity_form_mode.user.modal.yml b/config/sync/core.entity_form_mode.user.modal.yml new file mode 100644 index 0000000..79960d7 --- /dev/null +++ b/config/sync/core.entity_form_mode.user.modal.yml @@ -0,0 +1,10 @@ +uuid: b87de49b-2838-4fdc-b361-2d2b8cb9b52c +langcode: en +status: true +dependencies: + module: + - user +id: user.modal +label: Modal +targetEntityType: user +cache: true diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index ccc7087..1abba82 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -68,6 +68,7 @@ module: error_log: 0 field: 0 field_group: 0 + field_permissions: 0 field_ui: 0 file: 0 filter: 0 diff --git a/config/sync/field.storage.user.field_company.yml b/config/sync/field.storage.user.field_company.yml index 48a00d2..c2009cc 100644 --- a/config/sync/field.storage.user.field_company.yml +++ b/config/sync/field.storage.user.field_company.yml @@ -3,8 +3,12 @@ langcode: en status: true dependencies: module: + - field_permissions - taxonomy - user +third_party_settings: + field_permissions: + permission_type: custom id: user.field_company field_name: field_company entity_type: user diff --git a/config/sync/field.storage.user.field_member_type.yml b/config/sync/field.storage.user.field_member_type.yml index b95cc28..19413b0 100644 --- a/config/sync/field.storage.user.field_member_type.yml +++ b/config/sync/field.storage.user.field_member_type.yml @@ -3,8 +3,12 @@ langcode: en status: true dependencies: module: + - field_permissions - options - user +third_party_settings: + field_permissions: + permission_type: custom id: user.field_member_type field_name: field_member_type entity_type: user diff --git a/config/sync/field.storage.user.field_memo.yml b/config/sync/field.storage.user.field_memo.yml index d1c54d7..f7eb370 100644 --- a/config/sync/field.storage.user.field_memo.yml +++ b/config/sync/field.storage.user.field_memo.yml @@ -3,7 +3,11 @@ langcode: en status: true dependencies: module: + - field_permissions - user +third_party_settings: + field_permissions: + permission_type: custom id: user.field_memo field_name: field_memo entity_type: user diff --git a/config/sync/field.storage.user.field_showroom.yml b/config/sync/field.storage.user.field_showroom.yml index 4201f6b..1878147 100644 --- a/config/sync/field.storage.user.field_showroom.yml +++ b/config/sync/field.storage.user.field_showroom.yml @@ -3,8 +3,12 @@ langcode: en status: true dependencies: module: + - field_permissions - taxonomy - user +third_party_settings: + field_permissions: + permission_type: custom id: user.field_showroom field_name: field_showroom entity_type: user diff --git a/config/sync/genpass.settings.yml b/config/sync/genpass.settings.yml index 9b5f43f..cc40b39 100644 --- a/config/sync/genpass.settings.yml +++ b/config/sync/genpass.settings.yml @@ -1,7 +1,7 @@ genpass_length: 12 genpass_algorithm: user genpass_entropy: 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789!#$%&*+-.?@^_' -genpass_mode: 1 +genpass_mode: 2 genpass_display: 3 _core: default_config_hash: HNSTwPQM5lvXFeH4cVlcB2gZFJ5S--Nbmfj7651HK24 diff --git a/config/sync/user.role.adherent.yml b/config/sync/user.role.adherent.yml index 6c777c7..1675c64 100644 --- a/config/sync/user.role.adherent.yml +++ b/config/sync/user.role.adherent.yml @@ -9,6 +9,10 @@ is_admin: null permissions: - 'access materio search' - 'create member profile' + - 'update own commerce_license' - 'update own member profile' - 'use jsonrpc services' + - 'view materio_order_type commerce_order' + - 'view own commerce_license' - 'view own member profile' + - 'view recurring commerce_order' diff --git a/config/sync/user.role.admin.yml b/config/sync/user.role.admin.yml index 05e9292..f56e043 100644 --- a/config/sync/user.role.admin.yml +++ b/config/sync/user.role.admin.yml @@ -37,6 +37,10 @@ permissions: - 'create default workflow_transition' - 'create enregistrement content' - 'create evenement content' + - 'create field_company' + - 'create field_member_type' + - 'create field_memo' + - 'create field_showroom' - 'create generique workflow_transition' - 'create materiau content' - 'create materio_order_type commerce_order' @@ -75,6 +79,10 @@ permissions: - 'edit any simplenews_issue content' - 'edit any static content' - 'edit any thematique content' + - 'edit field_company' + - 'edit field_member_type' + - 'edit field_memo' + - 'edit field_showroom' - 'edit own enregistrement content' - 'edit terms in collectionneurs' - 'edit terms in company' @@ -136,14 +144,20 @@ permissions: - 'update materio_order_type commerce_order' - 'use jsonrpc services' - 'use text format wysiwyg' + - 'view all login histories' - 'view any commerce_license' - 'view any contact_company profile' - 'view any member profile' - 'view article revisions' - 'view autre_son revisions' + - 'view commerce_promotion' - 'view contact_company profile' - 'view enregistrement revisions' - 'view evenement revisions' + - 'view field_company' + - 'view field_member_type' + - 'view field_memo' + - 'view field_showroom' - 'view frontpage revisions' - 'view materiau revisions' - 'view materio_order_type commerce_order' diff --git a/config/sync/user.role.anonymous.yml b/config/sync/user.role.anonymous.yml index a81ea9b..1d3df44 100644 --- a/config/sync/user.role.anonymous.yml +++ b/config/sync/user.role.anonymous.yml @@ -14,6 +14,7 @@ permissions: - 'access devel information' - 'access kint' - 'access synonyms entity autocomplete' + - 'access webprofiler' - 'create corpus_documents workflow_transition' - 'create defalut workflow_transition' - 'create default workflow_transition' @@ -28,3 +29,4 @@ permissions: - 'view commerce_product' - 'view published fil entities' - 'view search api pages' + - 'view webprofiler toolbar' diff --git a/config/sync/user.role.authenticated.yml b/config/sync/user.role.authenticated.yml index ace9b91..3e8b2c6 100644 --- a/config/sync/user.role.authenticated.yml +++ b/config/sync/user.role.authenticated.yml @@ -15,6 +15,7 @@ permissions: - 'access kint' - 'access synonyms entity autocomplete' - 'access user profiles' + - 'access webprofiler' - 'add composition entities' - 'add fil entities' - 'create corpus_documents workflow_transition' @@ -44,3 +45,4 @@ permissions: - 'view published composition entities' - 'view published fil entities' - 'view search api pages' + - 'view webprofiler toolbar' diff --git a/web/modules/custom/materio_user/materio_user.module b/web/modules/custom/materio_user/materio_user.module index 4f30a5c..d7ff693 100644 --- a/web/modules/custom/materio_user/materio_user.module +++ b/web/modules/custom/materio_user/materio_user.module @@ -30,6 +30,67 @@ function materio_user_form_user_login_form_alter(&$form, FormStateInterface $for } +function materio_user_form_user_modal_form_alter(&$form, FormStateInterface $form_state, $form_id) { + // Drupal::logger('materio_user')->notice(print_r($form['mail'], true)); + // ksm($form); + $form['account']['mail']['#attributes'] = array( + "v-model" => "mail", + "@keyup.enter" => "register", + "placeholder" => $form['account']['mail']['#title'], + "title" => $form['account']['mail']['#description'] + ); + + // https://drupal.stackexchange.com/a/217112 + // Get default process function array: + $element_info = element_info('password_confirm'); + $process = $element_info['#process']; + // Add our process function to the array: + $process[] = '_materio_user_process_password_confirm'; + $form['account']['pass']['#process'] = $process; + + $form['actions']['submit']['#attributes'] = array( + "@click.prevent" => "register", + "@keyup.enter" => "register" + ); + +} + +function _materio_user_process_password_confirm($element){ + // ksm($element); + $element['pass1']['#attributes'] += array( + "v-model" => "pass1", + "placeholder" => $element['pass1']['#title'] + ); + $element['pass2']['#attributes'] += array( + "v-model" => "pass2", + "placeholder" => $element['pass2']['#title'] + + ); + return $element; +} +/** + * Returns HTML for a form element. + * Prepares variables for form element templates. + * + * Default template: form-element.html.twig. + * + * @param array $variables + * An associative array containing: + * - element: An associative array containing the properties of the element. + * Properties used: #title, #title_display, #description, #id, #required, + * #children, #type, #name, #label_for. + */ +// function materio_user_preprocess_form_element(&$vars) { +// $element = $vars['element']; +// if($element['#type'] == 'password' && $element['#array_parents'][0] == 'account'){ +// ksm($vars); +// // $vars['attributes']['placeholder'] = $element['#title']; +// $vars['element']['#attributes']['placeholder'] = $element['#title']; +// } +// } + + + /** * implements hook_block_view_BASE_BLOCK_ID_alter() * @@ -55,3 +116,8 @@ function _materio_user_user_login_block_pre_render(array $build){ )); return $build; } + +function materio_user_entity_type_build(array &$entity_types) { + // https://drupal.stackexchange.com/a/230547 + $entity_types['user']->setFormClass('modal', 'Drupal\user\RegisterForm'); +} diff --git a/web/modules/custom/materio_user/src/Controller/AjaxRegisterForm.php b/web/modules/custom/materio_user/src/Controller/AjaxRegisterForm.php index aeacc5e..635e046 100644 --- a/web/modules/custom/materio_user/src/Controller/AjaxRegisterForm.php +++ b/web/modules/custom/materio_user/src/Controller/AjaxRegisterForm.php @@ -44,12 +44,13 @@ class AjaxRegisterForm extends ControllerBase { } private function getFormDefinition(){ - // $language = \Drupal::languageManager()->getCurrentLanguage()->getId(); - // \Drupal::logger('materio_user')->notice($language); - // $this->form_builded = $this->formBuilder->getForm('Drupal\user\Form\UserLoginForm'); - $entity = \Drupal::entityTypeManager()->getStorage('user')->create(array()); + // http://web-tricks.org/content/how-render-user-login-form-and-user-register-form-drupal-8 + $entity = \Drupal::entityTypeManager() + ->getStorage('user') + ->create(array()); + // to use modal form display see materio_user_entity_type_build() $formObject = \Drupal::entityTypeManager() - ->getFormObject('user', 'register') + ->getFormObject('user', 'modal') ->setEntity($entity); $this->form_builded = $this->formBuilder()->getForm($formObject); } diff --git a/web/themes/custom/materiotheme/assets/dist/main.css b/web/themes/custom/materiotheme/assets/dist/main.css index 84d0181..f2b22cc 100644 --- a/web/themes/custom/materiotheme/assets/dist/main.css +++ b/web/themes/custom/materiotheme/assets/dist/main.css @@ -40,6 +40,19 @@ div.description[data-v-7bb795f8] { display: none; } +.form-type-email[data-v-2acc57a0], +.form-type-password-confirm[data-v-2acc57a0] { + max-width: 30%; + margin: 0; +} +input[data-v-2acc57a0] { + box-sizing: content-box; + max-width: 100%; +} +label[data-v-2acc57a0], +div.description[data-v-2acc57a0] { + display: none; +} fieldset[data-v-340aa566] { padding: 0; diff --git a/web/themes/custom/materiotheme/assets/dist/main.js b/web/themes/custom/materiotheme/assets/dist/main.js index fe4d478..b3d3e9e 100644 --- a/web/themes/custom/materiotheme/assets/dist/main.js +++ b/web/themes/custom/materiotheme/assets/dist/main.js @@ -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 _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\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: \"LoginForm\",\n data: function data() {\n return {\n form: null,\n mail: null,\n password: null\n };\n },\n methods: _objectSpread({}, (0, _vuex.mapActions)({\n userLogin: 'User/userLogin'\n }), {\n getLoginForm: function getLoginForm() {\n var _this = this;\n\n // Form through ajax is provided by materio_user custom module\n // vuejs attributes a inserted by template in theme level\n _maAxios.MA.get(\"/materio_user/login_form\").then(function (_ref) {\n var data = _ref.data;\n console.log(\"getLoginForm data\");\n _this.form = _vue.default.compile(data.rendered);\n _this.$options.staticRenderFns = [];\n _this._staticTrees = [];\n\n _this.form.staticRenderFns.map(function (fn) {\n return _this.$options.staticRenderFns.push(fn);\n });\n }).catch(function (error) {\n console.warn('Issue with getLoginForm', error);\n });\n },\n login: function login() {\n var _this2 = this;\n\n this.userLogin({\n mail: this.mail,\n pass: this.password\n }).then(function () {\n console.log('logedin from login component');\n\n _this2.$emit('onLogedIn');\n }).catch(function (error) {\n console.warn('Issue with login from login component', error);\n Promise.reject(error);\n });\n }\n }),\n beforeMount: function beforeMount() {\n if (!this.form) {\n this.getLoginForm();\n }\n },\n mounted: function mounted() {\n // console.log('LoginBlock mounted');\n Drupal.attachBehaviors(this.$el);\n },\n render: function render(h) {\n // console.log('LoginBlock render');\n if (!this.form) {\n // console.log('LoginBlock render NAN');\n return h('span', 'Loading ...');\n } else {\n // console.log('LoginBlock render template');\n return this.form.render.call(this);\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Form/LoginForm.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 _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\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: \"LoginForm\",\n data: function data() {\n return {\n form: null,\n mail: null,\n password: null\n };\n },\n methods: _objectSpread({}, (0, _vuex.mapActions)({\n userLogin: 'User/userLogin'\n }), {\n getLoginForm: function getLoginForm() {\n var _this = this;\n\n // Form through ajax is provided by materio_user drupal custom module\n // vuejs attributes a inserted by form alter in same module\n _maAxios.MA.get(\"/materio_user/login_form\").then(function (_ref) {\n var data = _ref.data;\n console.log(\"getLoginForm data\");\n _this.form = _vue.default.compile(data.rendered);\n _this.$options.staticRenderFns = [];\n _this._staticTrees = [];\n\n _this.form.staticRenderFns.map(function (fn) {\n return _this.$options.staticRenderFns.push(fn);\n });\n }).catch(function (error) {\n console.warn('Issue with getLoginForm', error);\n });\n },\n login: function login() {\n var _this2 = this;\n\n this.userLogin({\n mail: this.mail,\n pass: this.password\n }).then(function () {\n console.log('logedin from login component');\n\n _this2.$emit('onLogedIn');\n }).catch(function (error) {\n console.warn('Issue with login from login component', error);\n Promise.reject(error);\n });\n }\n }),\n beforeMount: function beforeMount() {\n if (!this.form) {\n this.getLoginForm();\n }\n },\n mounted: function mounted() {\n // console.log('LoginBlock mounted');\n Drupal.attachBehaviors(this.$el);\n },\n render: function render(h) {\n // console.log('LoginBlock render');\n if (!this.form) {\n // console.log('LoginBlock render NAN');\n return h('span', 'Loading ...');\n } else {\n // console.log('LoginBlock render template');\n return this.form.render.call(this);\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Form/LoginForm.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -489,7 +489,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 _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\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: \"RegisterForm\",\n data: function data() {\n return {\n form: null,\n mail: null,\n password: null\n };\n },\n methods: _objectSpread({}, (0, _vuex.mapActions)({\n userRegister: 'User/userRegister'\n }), {\n getRegisterForm: function getRegisterForm() {\n var _this = this;\n\n // Form through ajax is provided by materio_user custom module\n // vuejs attributes a inserted by template in theme level\n _maAxios.MA.get(\"/materio_user/register_form\").then(function (_ref) {\n var data = _ref.data;\n console.log(\"getRegisterForm data\");\n _this.form = _vue.default.compile(data.rendered);\n _this.$options.staticRenderFns = [];\n _this._staticTrees = [];\n\n _this.form.staticRenderFns.map(function (fn) {\n return _this.$options.staticRenderFns.push(fn);\n });\n }).catch(function (error) {\n console.warn('Issue with getRegisterForm', error);\n });\n }\n }),\n beforeMount: function beforeMount() {\n if (!this.form) {\n this.getRegisterForm();\n }\n },\n mounted: function mounted() {\n // console.log('LoginBlock mounted');\n Drupal.attachBehaviors(this.$el);\n },\n render: function render(h) {\n // console.log('LoginBlock render');\n if (!this.form) {\n // console.log('LoginBlock render NAN');\n return h('span', 'Loading ...');\n } else {\n // console.log('LoginBlock render template');\n return this.form.render.call(this);\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Form/RegisterForm.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 _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\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: \"RegisterForm\",\n data: function data() {\n return {\n form: null,\n mail: null,\n pass1: null,\n pass2: null\n };\n },\n methods: _objectSpread({}, (0, _vuex.mapActions)({\n userRegister: 'User/userRegister'\n }), {\n getRegisterForm: function getRegisterForm() {\n var _this = this;\n\n // Form through ajax is provided by materio_user drupal custom module\n // vuejs attributes a inserted by form alter in same module\n _maAxios.MA.get(\"/materio_user/register_form\").then(function (_ref) {\n var data = _ref.data;\n console.log(\"getRegisterForm data\", data);\n _this.form = _vue.default.compile(data.rendered);\n _this.$options.staticRenderFns = [];\n _this._staticTrees = [];\n\n _this.form.staticRenderFns.map(function (fn) {\n return _this.$options.staticRenderFns.push(fn);\n });\n }).catch(function (error) {\n console.warn('Issue with getRegisterForm', error);\n });\n },\n register: function register() {\n var _this2 = this;\n\n console.log('register', this.mail, this.pass1, this.pass2); // TODO: check for identical password\n // TODO: check for valide email\n // TODO: check for unique email\n\n if (this.pass1 === this.pass2) {\n this.userRegister({\n name: this.mail,\n mail: this.mail,\n pass: this.pass1\n }).then(function () {\n console.log('registered from register component');\n\n _this2.$emit('onRegistered');\n }).catch(function (error) {\n console.warn('Issue with register from registerform component', error);\n Promise.reject(error);\n });\n }\n }\n }),\n beforeMount: function beforeMount() {\n if (!this.form) {\n this.getRegisterForm();\n }\n },\n mounted: function mounted() {\n // console.log('LoginBlock mounted');\n Drupal.attachBehaviors(this.$el);\n },\n render: function render(h) {\n // console.log('LoginBlock render');\n if (!this.form) {\n // console.log('LoginBlock render NAN');\n return h('span', 'Loading ...');\n } else {\n // console.log('LoginBlock render template');\n return this.form.render.call(this);\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/components/Form/RegisterForm.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1951,7 +1951,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 _restAxios = __webpack_require__(/*! vuejs/api/rest-axios */ \"./web/themes/custom/materiotheme/vuejs/api/rest-axios.js\");\n\nvar _jsonAxios = __webpack_require__(/*! vuejs/api/json-axios */ \"./web/themes/custom/materiotheme/vuejs/api/json-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 uid: null,\n // username: '',\n mail: '',\n token: null,\n logout_token: null,\n isloggedin: false,\n isAdmin: false,\n isAdherent: false,\n canSearch: false,\n roles: []\n },\n // getters\n getters: {},\n // mutations\n mutations: {\n setToken: function setToken(state, data) {\n state.uid = data.current_user.uid; // state.username = data.username\n\n state.mail = data.current_user.mail;\n state.token = data.csrf_token;\n state.isloggedin = true;\n state.logout_token = data.logout_token;\n },\n setUid: function setUid(state, uid) {\n state.uid = uid;\n state.isloggedin = true;\n },\n setUser: function setUser(state, data) {\n state.mail = data.mail[0].value;\n state.uuid = data.uuid[0].value;\n },\n setRoles: function setRoles(state, roles) {\n console.log(\"User setRoles\", roles);\n state.roles = [];\n\n for (var i = 0; i < roles.length; i++) {\n state.roles.push(roles[i].target_id);\n } // check if admin\n\n\n if (state.roles.indexOf('admin') != -1 || state.roles.indexOf('root') != -1) {\n // console.log('is admin');\n state.isAdmin = true;\n } // check if has access to search\n\n\n if (state.roles.indexOf('adherent') != -1) {\n // console.log('is admin');\n state.canSearch = true;\n state.isAdherent = true;\n }\n },\n setLoggedOut: function setLoggedOut(state) {\n console.log(\"setLoggedOut state\", state);\n state.uid = null;\n state.mail = '';\n state.token = null;\n state.isloggedin = false;\n state.logout_token = null;\n\n if (state.isAdmin) {\n window.location.reload(true);\n }\n\n state.asAdmin = false;\n state.canSearch = false;\n }\n },\n // actions\n actions: {\n userRegister: function userRegister(_ref, credentials) {\n var dispatch = _ref.dispatch,\n commit = _ref.commit,\n state = _ref.state;\n return new Promise(function (resolve, reject) {\n _restAxios.REST.post('/user/register?_format=json', credentials).then(function (_ref2) {\n var data = _ref2.data;\n console.log('user REST registered', data);\n resolve();\n }).catch(function (error) {\n console.warn('Issue with register', error);\n Promise.reject(error);\n });\n });\n },\n userLogin: function userLogin(_ref3, credentials) {\n var dispatch = _ref3.dispatch,\n commit = _ref3.commit,\n state = _ref3.state;\n return new Promise(function (resolve, reject) {\n dispatch('getToken', credentials).then(function () {\n dispatch('getUser').then(function (userdata) {\n console.log('User Loggedin');\n\n if (state.isAdmin) {\n window.location.reload(true);\n }\n\n resolve();\n });\n });\n });\n },\n getToken: function getToken(_ref4, credentials) {\n var dispatch = _ref4.dispatch,\n commit = _ref4.commit,\n state = _ref4.state;\n return _restAxios.REST.post('/user/login?_format=json', credentials).then(function (_ref5) {\n var data = _ref5.data;\n console.log('user REST getToken data', data);\n commit('setToken', data);\n }).catch(function (error) {\n console.warn('Issue with getToken', error);\n Promise.reject(error);\n });\n },\n getUser: function getUser(_ref6) {\n var dispatch = _ref6.dispatch,\n commit = _ref6.commit,\n state = _ref6.state;\n var params = {\n token: state.token\n };\n return _restAxios.REST.get(\"/user/\".concat(state.uid, \"?_format=json\"), params).then(function (_ref7) {\n var data = _ref7.data;\n console.log('user REST getUser data', data);\n console.log('roles', data['roles']);\n commit('setUser', data);\n\n if (data.roles) {\n commit('setRoles', data.roles);\n }\n }).catch(function (error) {\n console.warn('Issue with getUser', error);\n Promise.reject(error);\n });\n },\n userLogout: function userLogout(_ref8) {\n var commit = _ref8.commit,\n state = _ref8.state;\n\n var credentials = _querystring.default.stringify({\n token: state.token\n });\n\n _restAxios.REST.post('/user/logout', credentials).then(function (resp) {\n console.log('userLogout resp', resp);\n commit('setLoggedOut');\n }).catch(function (error) {\n console.warn('Issue with logout', error);\n Promise.reject(error);\n });\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/store/modules/user.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _restAxios = __webpack_require__(/*! vuejs/api/rest-axios */ \"./web/themes/custom/materiotheme/vuejs/api/rest-axios.js\");\n\nvar _jsonAxios = __webpack_require__(/*! vuejs/api/json-axios */ \"./web/themes/custom/materiotheme/vuejs/api/json-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 uid: null,\n // username: '',\n mail: '',\n token: null,\n logout_token: null,\n isloggedin: false,\n isAdmin: false,\n isAdherent: false,\n canSearch: false,\n roles: []\n },\n // getters\n getters: {},\n // mutations\n mutations: {\n setToken: function setToken(state, data) {\n state.uid = data.current_user.uid; // state.username = data.username\n\n state.mail = data.current_user.mail;\n state.token = data.csrf_token;\n state.isloggedin = true;\n state.logout_token = data.logout_token;\n },\n setUid: function setUid(state, uid) {\n state.uid = uid;\n state.isloggedin = true;\n },\n setUser: function setUser(state, data) {\n state.mail = data.mail[0].value;\n state.uuid = data.uuid[0].value;\n },\n setRoles: function setRoles(state, roles) {\n console.log(\"User setRoles\", roles);\n state.roles = [];\n\n for (var i = 0; i < roles.length; i++) {\n state.roles.push(roles[i].target_id);\n } // check if admin\n\n\n if (state.roles.indexOf('admin') != -1 || state.roles.indexOf('root') != -1) {\n // console.log('is admin');\n state.isAdmin = true;\n } // check if has access to search\n\n\n if (state.roles.indexOf('adherent') != -1) {\n // console.log('is admin');\n state.canSearch = true;\n state.isAdherent = true;\n }\n },\n setLoggedOut: function setLoggedOut(state) {\n console.log(\"setLoggedOut state\", state);\n state.uid = null;\n state.mail = '';\n state.token = null;\n state.isloggedin = false;\n state.logout_token = null;\n\n if (state.isAdmin) {\n window.location.reload(true);\n }\n\n state.asAdmin = false;\n state.canSearch = false;\n }\n },\n // actions\n actions: {\n userRegister: function userRegister(_ref, credentials) {\n var dispatch = _ref.dispatch,\n commit = _ref.commit,\n state = _ref.state;\n return new Promise(function (resolve, reject) {\n _restAxios.REST.post('/user/register?_format=json', credentials).then(function (_ref2) {\n var data = _ref2.data;\n console.log('user REST registered', data);\n dispatch('userLogin', credentials).then(function () {\n resolve();\n });\n }).catch(function (error) {\n console.warn('Issue with register', error);\n Promise.reject(error);\n });\n });\n },\n userLogin: function userLogin(_ref3, credentials) {\n var dispatch = _ref3.dispatch,\n commit = _ref3.commit,\n state = _ref3.state;\n return new Promise(function (resolve, reject) {\n dispatch('getToken', credentials).then(function () {\n dispatch('getUser').then(function (userdata) {\n console.log('User Loggedin');\n\n if (state.isAdmin) {\n window.location.reload(true);\n }\n\n resolve();\n });\n });\n });\n },\n getToken: function getToken(_ref4, credentials) {\n var dispatch = _ref4.dispatch,\n commit = _ref4.commit,\n state = _ref4.state;\n return _restAxios.REST.post('/user/login?_format=json', credentials).then(function (_ref5) {\n var data = _ref5.data;\n console.log('user REST getToken data', data);\n commit('setToken', data);\n }).catch(function (error) {\n console.warn('Issue with getToken', error);\n Promise.reject(error);\n });\n },\n getUser: function getUser(_ref6) {\n var dispatch = _ref6.dispatch,\n commit = _ref6.commit,\n state = _ref6.state;\n var params = {\n token: state.token\n };\n return _restAxios.REST.get(\"/user/\".concat(state.uid, \"?_format=json\"), params).then(function (_ref7) {\n var data = _ref7.data;\n console.log('user REST getUser data', data);\n console.log('roles', data['roles']);\n commit('setUser', data);\n\n if (data.roles) {\n commit('setRoles', data.roles);\n }\n }).catch(function (error) {\n console.warn('Issue with getUser', error);\n Promise.reject(error);\n });\n },\n userLogout: function userLogout(_ref8) {\n var commit = _ref8.commit,\n state = _ref8.state;\n\n var credentials = _querystring.default.stringify({\n token: state.token\n });\n\n _restAxios.REST.post('/user/logout', credentials).then(function (resp) {\n console.log('userLogout resp', resp);\n commit('setLoggedOut');\n }).catch(function (error) {\n console.warn('Issue with logout', error);\n Promise.reject(error);\n });\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./web/themes/custom/materiotheme/vuejs/store/modules/user.js?"); /***/ }) diff --git a/web/themes/custom/materiotheme/templates/form/form.html.twig b/web/themes/custom/materiotheme/templates/form/form.html.twig new file mode 100644 index 0000000..97b4b7a --- /dev/null +++ b/web/themes/custom/materiotheme/templates/form/form.html.twig @@ -0,0 +1,15 @@ +{# +/** + * @file + * Theme override for a 'form' element. + * + * Available variables + * - attributes: A list of HTML attributes for the wrapper element. + * - children: The child elements of the form. + * + * @see template_preprocess_form() + */ +#} + + {{ children }} + diff --git a/web/themes/custom/materiotheme/vuejs/components/Form/LoginForm.vue b/web/themes/custom/materiotheme/vuejs/components/Form/LoginForm.vue index e2c68c7..a812c00 100644 --- a/web/themes/custom/materiotheme/vuejs/components/Form/LoginForm.vue +++ b/web/themes/custom/materiotheme/vuejs/components/Form/LoginForm.vue @@ -16,8 +16,8 @@ export default { userLogin: 'User/userLogin' }), getLoginForm(){ - // Form through ajax is provided by materio_user custom module - // vuejs attributes a inserted by template in theme level + // Form through ajax is provided by materio_user drupal custom module + // vuejs attributes a inserted by form alter in same module MA.get(`/materio_user/login_form`) .then(({data}) => { console.log("getLoginForm data"); diff --git a/web/themes/custom/materiotheme/vuejs/components/Form/RegisterForm.vue b/web/themes/custom/materiotheme/vuejs/components/Form/RegisterForm.vue index 9c8dca0..cadb701 100644 --- a/web/themes/custom/materiotheme/vuejs/components/Form/RegisterForm.vue +++ b/web/themes/custom/materiotheme/vuejs/components/Form/RegisterForm.vue @@ -7,20 +7,21 @@ import { MA } from 'vuejs/api/ma-axios' export default { name: "RegisterForm", data: () => ({ - form:null, - mail:null, - password:null + form: null, + mail: null, + pass1: null, + pass2: null }), methods: { ...mapActions({ userRegister: 'User/userRegister' }), getRegisterForm(){ - // Form through ajax is provided by materio_user custom module - // vuejs attributes a inserted by template in theme level + // Form through ajax is provided by materio_user drupal custom module + // vuejs attributes a inserted by form alter in same module MA.get(`/materio_user/register_form`) .then(({data}) => { - console.log("getRegisterForm data"); + console.log("getRegisterForm data", data); this.form = Vue.compile(data.rendered) this.$options.staticRenderFns = []; this._staticTrees = []; @@ -30,19 +31,27 @@ export default { console.warn('Issue with getRegisterForm', error) }) }, - // login () { - // this.userLogin({ - // mail: this.mail, - // pass: this.password - // }).then( () => { - // console.log('logedin from login component'); - // this.$emit('onLogedIn') - // } - // ).catch(( error ) => { - // console.warn('Issue with login from login component', error) - // Promise.reject(error) - // }) - // } + register () { + console.log('register', this.mail, this.pass1, this.pass2); + // TODO: check for identical password + // TODO: check for valide email + // TODO: check for unique email + if(this.pass1 === this.pass2){ + this.userRegister({ + name: this.mail, + mail: this.mail, + pass: this.pass1 + }).then( () => { + console.log('registered from register component'); + this.$emit('onRegistered') + } + ).catch(( error ) => { + console.warn('Issue with register from registerform component', error) + Promise.reject(error) + }) + + } + } }, beforeMount () { if(!this.form){ @@ -67,20 +76,18 @@ export default { diff --git a/web/themes/custom/materiotheme/vuejs/store/modules/user.js b/web/themes/custom/materiotheme/vuejs/store/modules/user.js index fa27698..d6d130c 100644 --- a/web/themes/custom/materiotheme/vuejs/store/modules/user.js +++ b/web/themes/custom/materiotheme/vuejs/store/modules/user.js @@ -81,7 +81,10 @@ export default { REST.post('/user/register?_format=json', credentials) .then(({ data }) => { console.log('user REST registered', data); - resolve() + dispatch('userLogin', credentials) + .then(() => { + resolve() + }) }) .catch(( error ) => { console.warn('Issue with register', error)