| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | import { ReactiveCache } from '/imports/reactiveCache';import LockoutSettings from '/models/lockoutSettings';BlazeComponent.extendComponent({  onCreated() {    this.lockedUsers = new ReactiveVar([]);    this.isLoadingLockedUsers = new ReactiveVar(false);    // Don't load immediately to prevent unnecessary spinner    // The data will be loaded when the tab is selected in peopleBody.js switchMenu  },  refreshLockedUsers() {    // Set loading state initially, but we'll hide it if no users are found    this.isLoadingLockedUsers.set(true);    Meteor.call('getLockedUsers', (err, users) => {      if (err) {        this.isLoadingLockedUsers.set(false);        const reason = err.reason || '';        const message = `${TAPi18n.__(err.error)}\n${reason}`;        alert(message);        return;      }      // If no users are locked, don't show loading spinner and set empty array      if (!users || users.length === 0) {        this.isLoadingLockedUsers.set(false);        this.lockedUsers.set([]);        return;      }      // Format the remaining time to be more human-readable      users.forEach(user => {        if (user.remainingLockTime > 60) {          const minutes = Math.floor(user.remainingLockTime / 60);          const seconds = user.remainingLockTime % 60;          user.remainingTimeFormatted = `${minutes}m ${seconds}s`;        } else {          user.remainingTimeFormatted = `${user.remainingLockTime}s`;        }      });      this.lockedUsers.set(users);      this.isLoadingLockedUsers.set(false);    });  },  unlockUser(event) {    const userId = $(event.currentTarget).data('user-id');    if (!userId) return;    if (confirm(TAPi18n.__('accounts-lockout-confirm-unlock'))) {      Meteor.call('unlockUser', userId, (err, result) => {        if (err) {          const reason = err.reason || '';          const message = `${TAPi18n.__(err.error)}\n${reason}`;          alert(message);          return;        }        if (result) {          alert(TAPi18n.__('accounts-lockout-user-unlocked'));          this.refreshLockedUsers();        }      });    }  },  unlockAllUsers() {    if (confirm(TAPi18n.__('accounts-lockout-confirm-unlock-all'))) {      Meteor.call('unlockAllUsers', (err, result) => {        if (err) {          const reason = err.reason || '';          const message = `${TAPi18n.__(err.error)}\n${reason}`;          alert(message);          return;        }        if (result) {          alert(TAPi18n.__('accounts-lockout-user-unlocked'));          this.refreshLockedUsers();        }      });    }  },  saveLockoutSettings() {    // Get values from form    const knownFailuresBeforeLockout = parseInt($('#known-failures-before-lockout').val(), 10) || 3;    const knownLockoutPeriod = parseInt($('#known-lockout-period').val(), 10) || 60;    const knownFailureWindow = parseInt($('#known-failure-window').val(), 10) || 15;    const unknownFailuresBeforeLockout = parseInt($('#unknown-failures-before-lockout').val(), 10) || 3;    const unknownLockoutPeriod = parseInt($('#unknown-lockout-period').val(), 10) || 60;    const unknownFailureWindow = parseInt($('#unknown-failure-window').val(), 10) || 15;    // Update the database    LockoutSettings.update('known-failuresBeforeLockout', {      $set: { value: knownFailuresBeforeLockout },    });    LockoutSettings.update('known-lockoutPeriod', {      $set: { value: knownLockoutPeriod },    });    LockoutSettings.update('known-failureWindow', {      $set: { value: knownFailureWindow },    });    LockoutSettings.update('unknown-failuresBeforeLockout', {      $set: { value: unknownFailuresBeforeLockout },    });    LockoutSettings.update('unknown-lockoutPeriod', {      $set: { value: unknownLockoutPeriod },    });    LockoutSettings.update('unknown-failureWindow', {      $set: { value: unknownFailureWindow },    });    // Reload the AccountsLockout configuration    Meteor.call('reloadAccountsLockout', (err, ret) => {      if (!err && ret) {        const message = TAPi18n.__('accounts-lockout-settings-updated');        alert(message);      } else {        const reason = err?.reason || '';        const message = `${TAPi18n.__(err?.error || 'error-updating-settings')}\n${reason}`;        alert(message);      }    });  },  knownFailuresBeforeLockout() {    return LockoutSettings.findOne('known-failuresBeforeLockout')?.value || 3;  },  knownLockoutPeriod() {    return LockoutSettings.findOne('known-lockoutPeriod')?.value || 60;  },  knownFailureWindow() {    return LockoutSettings.findOne('known-failureWindow')?.value || 15;  },  unknownFailuresBeforeLockout() {    return LockoutSettings.findOne('unknown-failuresBeforeLockout')?.value || 3;  },  unknownLockoutPeriod() {    return LockoutSettings.findOne('unknown-lockoutPeriod')?.value || 60;  },  unknownFailureWindow() {    return LockoutSettings.findOne('unknown-failureWindow')?.value || 15;  },  lockedUsers() {    return this.lockedUsers.get();  },  isLoadingLockedUsers() {    return this.isLoadingLockedUsers.get();  },  events() {    return [      {        'click button.js-refresh-locked-users': this.refreshLockedUsers,        'click button#refreshLockedUsers': this.refreshLockedUsers,        'click button.js-unlock-user': this.unlockUser,        'click button.js-unlock-all-users': this.unlockAllUsers,        'click button.js-lockout-save': this.saveLockoutSettings,      },    ];  },}).register('lockedUsersGeneral');
 |