ftpAccounts.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import handleFtpAccountHints from './ftpAccountHints';
  2. import { debounce, randomPassword } from './helpers';
  3. // Add/remove FTP accounts on Edit Web Domain page
  4. export default function handleFtpAccounts() {
  5. // Listen to FTP user "Password" field changes and insert
  6. // "Send FTP credentials to email" field if it doesn't exist
  7. handlePasswordInputChange();
  8. // Listen to FTP user "Password" generate button clicks and generate a random password
  9. // Also insert "Send FTP credentials to email" field if it doesn't exist
  10. handleGeneratePasswordClick();
  11. // Listen to "Add FTP account" button click and add new FTP account form
  12. handleAddAccountClick();
  13. // Listen to FTP account "Delete" button clicks and delete FTP account
  14. handleDeleteAccountClick();
  15. // Listen to "Additional FTP account(s)" checkbox and show/hide FTP accounts section
  16. handleToggleFtpAccountsCheckbox();
  17. }
  18. function handlePasswordInputChange() {
  19. document.querySelectorAll('.js-ftp-user-psw').forEach((ftpPasswordInput) => {
  20. ftpPasswordInput.addEventListener(
  21. 'input',
  22. debounce((evt) => insertEmailField(evt.target))
  23. );
  24. });
  25. }
  26. function handleGeneratePasswordClick() {
  27. document.querySelectorAll('.js-ftp-password-generate').forEach((generateButton) => {
  28. generateButton.addEventListener('click', () => {
  29. const ftpPasswordInput =
  30. generateButton.parentElement.parentElement.querySelector('.js-ftp-user-psw');
  31. ftpPasswordInput.value = randomPassword();
  32. insertEmailField(ftpPasswordInput);
  33. });
  34. });
  35. }
  36. function handleAddAccountClick() {
  37. const addFtpAccountButton = document.querySelector('.js-add-ftp-account');
  38. if (addFtpAccountButton) {
  39. addFtpAccountButton.addEventListener('click', () => {
  40. const template = document
  41. .querySelector('.js-ftp-account-template .js-ftp-account-nrm')
  42. .cloneNode(true);
  43. const ftpAccounts = document.querySelectorAll('.js-active-ftp-accounts .js-ftp-account');
  44. const newIndex = ftpAccounts.length;
  45. template.querySelectorAll('input').forEach((input) => {
  46. const name = input.getAttribute('name');
  47. const id = input.getAttribute('id');
  48. input.setAttribute('name', name.replace('%INDEX%', newIndex));
  49. if (id) {
  50. input.setAttribute('id', id.replace('%INDEX%', newIndex));
  51. }
  52. });
  53. template.querySelectorAll('input + label').forEach((label) => {
  54. const forAttr = label.getAttribute('for');
  55. label.setAttribute('for', forAttr.replace('%INDEX%', newIndex));
  56. });
  57. template.querySelector('.js-ftp-user-number').textContent = newIndex;
  58. document.querySelector('.js-active-ftp-accounts').appendChild(template);
  59. updateUserNumbers();
  60. // Refresh input listeners
  61. handleFtpAccountHints();
  62. handleGeneratePasswordClick();
  63. handleDeleteAccountClick();
  64. });
  65. }
  66. }
  67. function handleDeleteAccountClick() {
  68. document.querySelectorAll('.js-delete-ftp-account').forEach((deleteButton) => {
  69. deleteButton.addEventListener('click', () => {
  70. const ftpAccount = deleteButton.closest('.js-ftp-account');
  71. ftpAccount.querySelector('.js-ftp-user-deleted').value = '1';
  72. if (ftpAccount.querySelector('.js-ftp-user-is-new').value == 1) {
  73. return ftpAccount.remove();
  74. }
  75. ftpAccount.classList.remove('js-ftp-account-nrm');
  76. ftpAccount.style.display = 'none';
  77. updateUserNumbers();
  78. if (document.querySelectorAll('.js-active-ftp-accounts .js-ftp-account-nrm').length == 0) {
  79. document.querySelector('.js-add-ftp-account').style.display = 'none';
  80. document.querySelector('input[name="v_ftp"]').checked = false;
  81. }
  82. });
  83. });
  84. }
  85. function updateUserNumbers() {
  86. const ftpUserNumbers = document.querySelectorAll('.js-active-ftp-accounts .js-ftp-user-number');
  87. ftpUserNumbers.forEach((number, index) => {
  88. number.textContent = index + 1;
  89. });
  90. }
  91. function handleToggleFtpAccountsCheckbox() {
  92. const toggleFtpAccountsCheckbox = document.querySelector('.js-toggle-ftp-accounts');
  93. if (!toggleFtpAccountsCheckbox) {
  94. return;
  95. }
  96. toggleFtpAccountsCheckbox.addEventListener('change', (evt) => {
  97. const isChecked = evt.target.checked;
  98. const addFtpAccountButton = document.querySelector('.js-add-ftp-account');
  99. const ftpAccounts = document.querySelectorAll('.js-ftp-account-nrm');
  100. addFtpAccountButton.style.display = isChecked ? 'block' : 'none';
  101. ftpAccounts.forEach((ftpAccount) => {
  102. const usernameInput = ftpAccount.querySelector('.js-ftp-user');
  103. const hiddenUserDeletedInput = ftpAccount.querySelector('.js-ftp-user-deleted');
  104. if (usernameInput.value.trim() !== '') {
  105. hiddenUserDeletedInput.value = isChecked ? '0' : '1';
  106. }
  107. ftpAccount.style.display = isChecked ? 'block' : 'none';
  108. });
  109. });
  110. }
  111. // Insert "Send FTP credentials to email" field if not present in FTP account
  112. function insertEmailField(ftpPasswordInput) {
  113. const accountWrapper = ftpPasswordInput.closest('.js-ftp-account');
  114. if (accountWrapper.querySelector('.js-email-alert-on-psw')) {
  115. return;
  116. }
  117. const hiddenIsNewInput = accountWrapper.querySelector('.js-ftp-user-is-new');
  118. const inputName = hiddenIsNewInput.name.replace('is_new', 'v_ftp_email');
  119. const emailFieldHTML = `
  120. <div class="u-pl30 u-mb10">
  121. <label for="${inputName}" class="form-label">
  122. Send FTP credentials to email
  123. </label>
  124. <input type="email" class="form-control js-email-alert-on-psw"
  125. value="" name="${inputName}" id="${inputName}">
  126. </div>`;
  127. accountWrapper.insertAdjacentHTML('beforeend', emailFieldHTML);
  128. }