/* globals dropdownSelector animateSpinner */ (function() { 'use strict'; function reloadRecaptchaIfExists() { if (typeof grecaptcha !== 'undefined') { grecaptcha.reset(); } } window.recaptchaCallback = function recaptchaCallback(response) { $('#recaptcha-invite-modal').val(response); }; function initializeModal(modal) { var modalDialog = modal.find('.modal-dialog'); var type = modal.attr('data-type'); var stepForm = modal.find('[data-role=step-form]'); var stepResults = modal.find('[data-role=step-results]'); var stepResultsDiv = modal.find('[data-role=step-results][data-clear]'); var inviteBtn = modal.find('[data-role=invite-btn]'); var inviteWithRoleDiv = modal.find('[data-role=invite-with-role-div]'); var inviteWithRoleBtn = modal.find('[data-role=invite-with-role-btn]'); var teamSelectorCheckbox = modal.find('[data-role=team-selector-checkbox]'); var teamSelectorDropdown = modal.find('[data-role=team-selector-dropdown]'); var teamSelectorDropdown2 = $(); var emailsInput = modal.find('.emails-input'); var emailTagsInput = modal.find('.email-tags-input'); var teamsInput = modal.find('.teams-input'); var roleInput = modal.find('.role-input'); var recaptchaErrorMsgDiv = modal.find('#recaptcha-error-msg'); var recaptchaErrorText = modal.find('#recaptcha-error-msg>span'); emailTagsInput.tagsinput({ maxTags: modal.data('max-tags') }); emailTagsInput.on('change', function() { if (emailTagsInput.val()) { inviteBtn.removeAttr('disabled'); } else { inviteBtn.attr('disabled', 'disabled'); } }); dropdownSelector.init(emailsInput, { delimiter: true, optionClass: 'users-dropdown-list', optionLabel: (data) => { return ` ${data.label} ${data.params.email}`; }, tagLabel: (data) => { if (data.params) { return ` ${data.label}`; } return data.label; }, labelHTML: true, tagClass: 'users-dropdown-list', inputTagMode: true, customDropdownIcon: () => { return ''; }, onChange: () => { let values = dropdownSelector.getValues(emailsInput); if (values.length > 0) { inviteBtn.removeAttr('disabled'); inviteWithRoleBtn.removeAttr('disabled'); } else { inviteBtn.attr('disabled', 'disabled'); inviteWithRoleBtn.attr('disabled', 'disabled'); } } }); modal.off('show.bs.modal').on('show.bs.modal', function() { // This cannot be scoped outside this function // because it is generated via JS teamSelectorDropdown2 = teamSelectorDropdown.parent() .find('button.dropdown-toggle, li'); // Show/hide correct step stepForm.show(); stepResults.hide(); // Show/hide buttons & other elements switch (type) { case 'invite_to_team_with_role': case 'invite': case 'invite_with_team_selector': case 'invite_with_team_selector_and_role': inviteBtn.show(); inviteWithRoleDiv.hide(); break; case 'invite_to_team': inviteBtn.hide(); inviteWithRoleDiv.show(); break; case 'invite_new_members': inviteBtn.show(); inviteWithRoleDiv.hide(); break; default: break; } // Checkbox toggle event if ( type === 'invite_with_team_selector' || type === 'invite_with_team_selector_and_role' ) { teamSelectorCheckbox.on('change', function() { if ($(this).is(':checked')) { teamSelectorDropdown.removeAttr('disabled'); teamSelectorDropdown2.removeClass('disabled'); if (type === 'invite_with_team_selector') { inviteBtn.hide(); inviteWithRoleDiv.show(); } } else { teamSelectorDropdown.attr('disabled', 'disabled'); teamSelectorDropdown2.addClass('disabled'); if (type === 'invite_with_team_selector') { inviteBtn.show(); inviteWithRoleDiv.hide(); } } }); } // Click action modal.find('[data-action=invite]').off('click').on('click', function() { var data = { emails: dropdownSelector.getValues(emailsInput) || emailTagsInput.val(), team_ids: dropdownSelector.getValues(teamsInput), role: roleInput.val(), 'g-recaptcha-response': $('#recaptcha-invite-modal').val() }; animateSpinner(modalDialog); switch (type) { case 'invite_to_team': data.team_ids = [modal.attr('data-team-id')]; data.role = $(this).attr('data-team-role'); break; case 'invite_to_team_with_role': data.team_ids = [modal.attr('data-team-id')]; data.role = modal.attr('data-team-role'); break; case 'invite': break; case 'invite_with_team_selector': if (teamSelectorCheckbox.is(':checked')) { data.team_ids = [teamSelectorDropdown.val()]; data.role = $(this).attr('data-team-role'); } break; case 'invite_with_team_selector_and_role': if (teamSelectorCheckbox.is(':checked')) { data.team_ids = [teamSelectorDropdown.val()]; data.role = modal.attr('data-team-role'); } break; default: break; } $.ajax({ method: 'POST', url: modal.attr('data-url'), dataType: 'json', data: data, success: function(data) { animateSpinner(modalDialog, false); stepForm.hide(); stepResultsDiv.html(data.html); stepResults.show(); // Add 'data-invited="true"' status to modal element modal.attr('data-invited', 'true'); }, error: function(jqXHR) { // ReCaptcha fails if (jqXHR.status === 422) { recaptchaErrorMsgDiv.removeClass('hidden'); recaptchaErrorText.text(jqXHR.responseJSON.recaptcha_error); } else { modal.modal('hide'); alert('Error inviting users.'); } reloadRecaptchaIfExists(); animateSpinner(modalDialog, false); } }); }); }).on('shown.bs.modal', function() { var script = document.createElement('script'); emailsInput.focus(); recaptchaErrorMsgDiv.addClass('hidden'); script.type = 'text/javascript'; script.src = 'https://www.google.com/recaptcha/api.js?hl=en'; $(script).insertAfter('#recaptcha-service'); // Remove 'data-invited="true"' status dropdownSelector.init(teamsInput, { optionClass: 'checkbox-icon' }); modal.removeAttr('data-invited'); }).on('hide.bs.modal', function() { // 'Reset' modal state dropdownSelector.clearData(emailsInput); teamSelectorCheckbox.prop('checked', false); inviteBtn.attr('disabled', 'disabled'); inviteWithRoleBtn.attr('disabled', 'disabled'); teamSelectorDropdown2.addClass('disabled'); animateSpinner(modalDialog, false); recaptchaErrorMsgDiv.addClass('hidden'); $('#recaptcha-service').next().remove(); // Unbind event listeners teamSelectorCheckbox.off('change'); modal.find('[data-action=invite]').off('click'); // Hide contents of the results
stepResultsDiv.html(''); stepResults.hide(); stepForm.show(); reloadRecaptchaIfExists(); $('#recaptcha-invite-modal').val(''); }); } function initializeModalsToggle() { $(document).off('click', "[data-trigger='invite-users']") .on('click', "[data-trigger='invite-users']", function(event) { var id = $(this).attr('data-modal-id'); event.preventDefault(); event.stopPropagation(); $('[data-role=invite-users-modal][data-id=' + id + ']') .modal('show'); }); } $(document).on('turbolinks:load', function() { $('[data-role=invite-users-modal]').each(function() { initializeModal($(this)); }); initializeModalsToggle(); }); }());