PageSourceSearch

https://ffms.pt/themes/custom/ffms_theme/js/layout/login.js?tlrqeh

js ffms.pt collected 2026-09-24 09:09:44 UTC 16,856 bytes, 437 lines download raw bytes

1/* *
2 * @file
3 * Global utilities.
4 *
5 */
6(function ($, Drupal, once) {
7  'use strict';
8
9  // Focus effect.
10  Drupal.behaviors.loginFocus = {
11    attach: function (context) {
12      $('.user-login-form .form-item-name').addClass('focused');
13      $(
14        "input[type='text'], input[type='email'], input[type='tel'], input[type='number'], input[data-drupal-selector='edit-pass'], input[type='text'], .password-field, .password-confirm",
15        '.user-login-form, .user-pass, .user-register-form, .user-form'
16      )
17        .focus(function () {
18          $(this).parent('.js-form-item').addClass('focused');
19        })
20        .blur(function () {
21          if ($(this).val() == '') {
22            $(this).parent('.js-form-item').removeClass('focused');
23          }
24        });
25    }
26  };
27
28  Drupal.behaviors.togglePassword = {
29    attach: function (context, settings) {
30      $('.user-register-form, .user-login-form').each(function () {
31        var _this = $(this);
32        _this.find('.js-form-type-password').append('<span toggle="#password-field" class="toggle-password"></span>');
33        _this.find('.toggle-password').on('click', function () {
34          $(this).toggleClass('icon-eye-slash');
35          var input = $(this).parent().find('input');
36          if (input.attr('type') == 'password') {
37            input.attr('type', 'text');
38          } else {
39            input.attr('type', 'password');
40          }
41        });
42      });
43    }
44  };
45
46  Drupal.behaviors.loginModal = {
47    attach: function (context, settings) {
48      if (!once('loadedAjaxLoginModal', 'html').length) {
49        return;
50      }
51      $(document).ajaxSuccess(function (event, data) {
52        setTimeout(function () {
53          if ($('body').find('.modal--login').length > 0) {
54            $('html').addClass('overflow-hidden');
55            if (!window.location.href.includes('#login-modal')) {
56              var newurl = window.location.href + '#login-modal';
57              history.pushState('', 'open-modal', newurl);
58            }
59          }
60        }, 100);
61      });
62
63      $(document).on('click', '.modal-close-btn', function (e) {
64        $('html').removeClass('overflow-hidden');
65        $(this).parents('.modal--login').find('.ui-dialog-titlebar-close').click();
66        if (window.location.href.includes('#login-modal')) {
67          var newurl = window.location.href.replace('#login-modal', '');
68          history.pushState('', 'closed-modal', newurl);
69        }
70      });
71
72      var currentPageURL = window.location.href;
73      if (currentPageURL.includes('/user/login')) {
74        $('.modal-close-btn').on('click', function () {
75          history.go(-1);
76        });
77      }
78    }
79  };
80
81  // Fill placeholder and change labels on register.
82  Drupal.behaviors.registerChangePlaceholdersAndLabels = {
83    attach: function (context, settings) {
84      var user_register = $('.page-user-register .user-register-form');
85      var user_login = $('.user-login-form');
86      var user_password = $('.user-pass');
87      var user_recover = $('.page-user-reset .user-form');
88
89      //LOGIN.
90
91      // Insert placeholder login.
92      user_login.find('.form-type-email input').removeAttr('autofocus');
93      user_login.find('.form-type-email input').blur();
94      user_login.find('.form-type-email input').attr('placeholder', Drupal.t('Insira o seu email'));
95      user_login.find('.form-item-pass input').attr('placeholder', Drupal.t('Insira a sua palavra-passe'));
96
97      // Change labels login.
98      user_login.find('.form-item-mail label').text(Drupal.t('Email'));
99      user_login.find('.form-item-pass label').text(Drupal.t('Palavra-passe'));
100
101      // Add link forgot password login.
102      user_login
103        .find('.js-form-type-password')
104        .prepend(
105          '<a href="/user/password" class="forgot-password">' + Drupal.t('Esqueceu-se da palavra-passe?') + '</a>'
106        );
107
108      // Change submit button classes.
109      user_login.find('.form-actions button.js-form-submit.form-submit').addClass('button-ffms button-ffms-blue ');
110
111      // Disable button when not filled.
112      var submit = user_login.find(':input[type=submit]'),
113        inputs = user_login.find(':input[type=email],:input[type=password]');
114
115      submit.prop('disabled', true);
116      setTimeout(function () {
117        disableCheck();
118      }, 500);
119
120      inputs.keydown(function () {
121        disableCheck();
122      });
123
124      inputs.on('blur input', function () {
125        disableCheck();
126      });
127
128      function disableCheck() {
129        var input_status = true;
130        inputs.each(function () {
131          if ($(this).val() == '') {
132            input_status = false;
133          }
134        });
135        if (input_status == true) {
136          submit.prop('disabled', false);
137        } else {
138          submit.prop('disabled', true);
139        }
140      }
141
142      //REGISTO.
143
144      // Insert placeholder registo.
145      user_register.find('.field--name-field-user-name input').attr('placeholder', Drupal.t('Insira o seu nome'));
146      user_register.find('.field--name-field-user-surname input').attr('placeholder', Drupal.t('Insira o seu apelido'));
147      user_register
148        .find('.field--name-field-user-mobile-phone input')
149        .attr('placeholder', Drupal.t('Insira o seu número'));
150      user_register.find('.field--name-field-user-birth-date input').attr('placeholder', Drupal.t('DD/MM/AAAA'));
151      user_register.find('.form-item-mail input').attr('placeholder', Drupal.t('Insira o seu email'));
152      user_register
153        .find('.form-item-pass .form-item-pass-pass1 input')
154        .attr('placeholder', Drupal.t('Insira a sua palavra-passe'));
155      user_register
156        .find('.form-item-pass .form-item-pass-pass2 input')
157        .attr('placeholder', Drupal.t('Insira novamente a sua palavra-passe'));
158
159      // Change labels registo.
160      user_register.find('.form-item-mail label').text(Drupal.t('Email'));
161      user_register.find('.form-item-pass .form-item-pass-pass1 label').text(Drupal.t('Palavra-passe'));
162      user_register.find('.form-item-pass .form-item-pass-pass2 label').text(Drupal.t('Confirmar palavra-passe'));
163      user_register.find('.form-actions button.js-form-submit.form-submit').text(Drupal.t('Submeter'));
164
165      // Change submit button classes.
166      user_register.find('.form-actions button.js-form-submit.form-submit').addClass('button-ffms button-ffms-blue ');
167
168      // Add Required fields text.
169      $(once('loadPage', '.form-actions', user_register[0])).append(
170        '<div class="required-fields-text">' + Drupal.t('*Campos de preenchimento obrigatório') + '</div>'
171      );
172
173      // Password fields
174      var user_register_pass = user_register.find('.form-item-pass .form-item-pass-pass1');
175      var user_recover_pass = user_recover.find('.form-item-pass .form-item-pass-pass1');
176
177      // Add Required fields text.
178      user_register_pass.append(
179        '<span class="password-legend">' + Drupal.t('Enter a secure password: it must be at least 8 characters long and include at least one uppercase letter, one special character, and one number.') + '</span>'
180      );
181      user_recover_pass.append(
182        '<span class="password-legend">' + Drupal.t('Enter a secure password: it must be at least 8 characters long and include at least one uppercase letter, one special character, and one number.') + '</span>'
183      );
184
185      //Add select2.
186      $(once('genderSelect', '.js-form-item-field-user-gender .form-select', user_register[0])).select2({
187        placeholder: {
188          id: '_none', // the value of the option
189          text: 'Selecione uma opção'
190        },
191        allowClear: true,
192        minimumResultsForSearch: Infinity,
193        allowClear: true,
194        minimumResultsForSearch: Infinity,
195        selectionCssClass: 'filter-selector',
196        dropdownCssClass: 'filter-dropdown',
197        dropdownParent: $('.js-form-item-field-user-gender')
198      });
199      user_register.find('.js-form-item-field-country-state-0-country select').select2({
200        placeholder: 'Selecione uma opção',
201        allowClear: true,
202        minimumResultsForSearch: Infinity,
203        selectionCssClass: 'filter-selector',
204        dropdownCssClass: 'filter-dropdown',
205        dropdownParent: $('.js-form-item-field-country-state-0-country')
206      });
207      if (!once('loadedContries', 'html').length) {
208        return;
209      }
210      $(document).ajaxSuccess(function (event, data) {
211        setTimeout(function () {
212          user_register.find('.js-form-item-field-country-state-0-state select').select2({
213            placeholder: 'Selecione uma opção',
214            allowClear: true,
215            minimumResultsForSearch: Infinity,
216            selectionCssClass: 'filter-selector',
217            dropdownCssClass: 'filter-dropdown',
218            dropdownParent: $('.js-form-item-field-country-state-0-state')
219          });
220          lockedStatus(inputsRegister, submitRegister);
221        }, 100);
222      });
223
224      // Create dummy input birthdate for formatting.
225      var date = user_register.find('.field--name-field-user-birth-date .form-item-field-user-birth-date-0-value-date');
226
227      $(once('dateForFormatting', date.eq(0))).append(
228        '<input class="bef-datepicker-user" autocomplete="off" name="field_birthdate_dummy" id="edit-field-birthdate-dummy" type="text" maxlength="128" value="">'
229      );
230
231      user_register
232        .find('.field--name-field-user-birth-date .bef-datepicker-user')
233        .attr('placeholder', Drupal.t('DD/MM/AAAA'));
234      $(once('dateChange', '.bef-datepicker-user', user_register[0])).on('change', function () {
235        var _this = $(this),
236          _val = _this.val().split('/');
237        if (_this.attr('name') == 'field_birthdate_dummy') {
238          date.find('input#edit-field-user-birth-date-0-value-date').val(_val[2] + '-' + _val[1] + '-' + _val.eq(0));
239        }
240      });
241
242      date.find('input#edit-field-user-birth-date-0-value-date').each(function () {
243        var _this = $(this),
244          _val = _this.val().split('-');
245        if (_this.val() != '') {
246          _this
247            .parents('.form-item-field-user-birth-date-0-value-date ')
248            .find('.bef-datepicker-user')
249            .val(_val[2] + '/' + _val[1] + '/' + _val.eq(0));
250        }
251      });
252
253      // Create date picker with dd-mm-yyyy format
254      date.find('.bef-datepicker-user').each(function () {
255        $(this)
256          .datepicker({
257            format: 'dd/mm/yyyy',
258            language: 'pt',
259            container: '.form-item-field-user-birth-date-0-value-date'
260          })
261          .on('changeDate', function () {
262            $(this).datepicker('hide');
263          });
264      });
265
266      // Focused behaviour
267      $('.bef-datepicker-user').change(function () {
268        var _date = $(this).val();
269        if (_date != '') {
270          $(this).parents('.field--type-datetime').addClass('has-value');
271          $(this).parents('.field--type-datetime').addClass('focused');
272        } else {
273          $(this).parents('.field--type-datetime').removeClass('has-value');
274          $(this).parents('.field--type-datetime').removeClass('focused');
275        }
276      });
277
278      // Disable button when not filled.
279      var submitRegister = user_register.find(':input[type=submit]'),
280        inputsRegister = user_register.find('input[required="required"]');
281
282      submitRegister.prop('disabled', true);
283      inputsRegister.keyup(function () {
284        lockedStatus(inputsRegister, submitRegister);
285      });
286
287      inputsRegister.click(function () {
288        lockedStatus(inputsRegister, submitRegister);
289      });
290
291      var locked = false;
292
293      function lockedStatus(inputsRegister, submitRegister) {
294        locked = false;
295        inputsRegister.each(function () {
296          if ($(this).attr('type') == 'checkbox' && !$(this).prop('checked')) {
297            locked = true;
298          } else if ($(this).val() == '') {
299            locked = true;
300          }
301        });
302
303        if ($('.password-confirm-message .ok').length == 0) {
304          locked = true;
305        }
306
307        if (locked == false) {
308          submitRegister.prop('disabled', false);
309        } else {
310          submitRegister.prop('disabled', true);
311        }
312      }
313
314      //RECOVER PASSWORD.
315
316      //Change labels password.
317      user_password.find('.form-type-textfield label').text(Drupal.t('Email'));
318      user_password.find('.form-actions button.js-form-submit.form-submit').text(Drupal.t('Enviar'));
319
320      // Insert placeholder password.
321      user_password.find('.form-type-email input').removeAttr('autofocus');
322      user_password.find('.form-type-email input').blur();
323      user_password.find('.form-type-email input').attr('placeholder', Drupal.t('Insira o seu email'));
324
325      // Change submit button classes.
326      user_password.find('.form-actions button.js-form-submit.form-submit').addClass('button-ffms button-ffms-blue ');
327
328      // If the email comes pre-filled, add focused class.
329      if (user_password.find('.js-form-type-email input').val() != '') {
330        user_password.find('.js-form-type-email').addClass('focused');
331      }
332
333      //RECOVER.
334
335      // Change labels.
336      user_recover.find('.form-actions button').text(Drupal.t('Guardar alterações'));
337      user_recover.find('.form-actions a').addClass('clear-filters button-ffms button-ffms-black button-border');
338
339      // Change labels.
340      user_recover.find('.form-item-pass-pass1 label').text(Drupal.t('Palavra-passe nova'));
341      user_recover.find('.form-item-pass-pass2 label').text(Drupal.t('Confirmar palavra-passe'));
342
343      //Change placeholders.
344      user_recover.find('.form-item-pass-pass1 input').attr('placeholder', Drupal.t('Insira uma nova palavra-passe'));
345      user_recover.find('.form-item-pass-pass2 input').attr('placeholder', Drupal.t('Confirme a nova palavra-passe'));
346      user_recover.find('.form-actions button.js-form-submit.form-submit').addClass('button-ffms button-ffms-blue ');
347
348      // Disable button when not filled.
349      var submit_recover = user_recover.find(':input[type=submit]'),
350        inputs_recover = user_recover.find('.password-field,.password-confirm');
351
352      submit_recover.prop('disabled', true);
353      setTimeout(function () {
354        disableCheckRecover(inputs_recover, submit_recover);
355      }, 500);
356
357      inputs_recover.keydown(function () {
358        disableCheckRecover(inputs_recover, submit_recover);
359      });
360
361      inputs_recover.on('blur input', function () {
362        disableCheckRecover(inputs_recover, submit_recover);
363      });
364
365      function disableCheckRecover(inputs_recover, submit_recover) {
366        var input_status_recover = true;
367        inputs_recover.each(function () {
368          if ($(this).val() == '') {
369            input_status_recover = false;
370          }
371        });
372        if ($('.password-confirm-message .ok').length == 0) {
373          locked = true;
374        }
375
376        if (input_status_recover == true) {
377          submit_recover.prop('disabled', false);
378        } else {
379          submit_recover.prop('disabled', true);
380        }
381      }
382
383      // Disable button when not filled.
384      var submitRecover = user_password.find(':input[type=submit]'),
385        inputsRecover = user_password.find(':input[type=email]');
386
387      submitRecover.prop('disabled', true);
388
389      // Enable button when email is pre-filled.
390      if (user_password.find('.js-form-type-email input').val() != '') {
391        user_password.find(':input[type=submit]').prop('disabled', false);
392      }
393
394      inputsRecover.keyup(function () {
395        if ($(this).val() != '') {
396          submitRecover.prop('disabled', false);
397        } else {
398          submitRecover.prop('disabled', true);
399        }
400      });
401    }
402  };
403  Drupal.behaviors.registerFocus = {
404    attach: function (context) {
405      var _select = $('.select2-selection');
406
407      $(once('resgisterFocus', _select.eq(0))).each(function () {
408        var _this = $(this);
409        _this.click(function (e) {
410          e.stopPropagation();
411          if ($('span.select2-selection').attr('aria-expanded', 'true')) {
412            $(this).parents('.js-form-item').addClass('focused');
413          }
414        });
415        if (_this.find('.select2-selection__placeholder').length == 0) {
416          $(this).parents('.js-form-item').addClass('focused');
417        }
418      });
419
420      if (!once('resgisterFocus', 'html').length) {
421        return;
422      }
423      $(document).click(function () {
424        $('.form-date').parents('.field--type-datetime').removeClass('focused');
425
426        _select.each(function () {
427          var _this = $(this);
428          if (_this.find('.select2-selection__placeholder').length != 0) {
429            $(this).parents('.js-form-item').removeClass('focused');
430          } else {
431            $(this).parents('.js-form-item').addClass('focused');
432          }
433        });
434      });
435    }
436  };
437})(jQuery, Drupal, once);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.