diff --git a/modules/profile/profile.js b/modules/profile/profile.js
index 503fc12ae..61bb3b5dc 100644
--- a/modules/profile/profile.js
+++ b/modules/profile/profile.js
@@ -14,54 +14,143 @@ function ProfileJS(gRootPath) {
this.futureRoleCount = 0;
this.userUuid = "";
this.errorID = 0;
+ this._reloadInFlight = { current: false, former: false, future: false };
+ this._reloadPending = { current: false, former: false, future: false };
+ this._reloadTimer = null;
+ this._additionalRolesLoaded = false;
+
+ this._sectionExists = function (selector) {
+ return $(selector).length > 0;
+ };
+
+ this._loadingIndicatorHtml = function () {
+ return '
'
+ + '
'
+ + 'Loading...'
+ + '
'
+ + '
Loading role memberships...'
+ + '
';
+ };
+
+ this._setMembershipSectionLoading = function (sectionSelector, isLoading) {
+ if (!this._sectionExists(sectionSelector)) {
+ return;
+ }
+
+ var cardBody = $(sectionSelector + " .card-body");
+ if (isLoading) {
+ cardBody.html(this._loadingIndicatorHtml());
+ }
+ };
+
+ this._reloadMembershipSection = function (mode, requestUrl, tabSelector, accordionSelector) {
+ if (!this._sectionExists(tabSelector) && !this._sectionExists(accordionSelector)) {
+ return;
+ }
+
+ if (this._reloadInFlight[mode]) {
+ this._reloadPending[mode] = true;
+ return;
+ }
+
+ var self = this;
+ this._reloadInFlight[mode] = true;
+
+ self._setMembershipSectionLoading(tabSelector, true);
+ self._setMembershipSectionLoading(accordionSelector, true);
- this.reloadRoleMemberships = function () {
$.get({
- url: this.url + "?mode=reload_current_memberships&user_uuid=" + this.userUuid,
- dataType: "html",
- success: function(responseText) {
- /* Tabs */
- $("#adm_profile_role_memberships_current_pane_content .card-body").html(responseText);
- formSubmitEvent('#adm_profile_role_memberships_current_pane_content .card-body');
- /* Accordions */
- $("#adm_profile_role_memberships_current_accordion_content .card-body").html(responseText);
- formSubmitEvent('#adm_profile_role_memberships_current_accordion_content .card-body');
+ url: requestUrl,
+ dataType: "html"
+ }).done(function (responseText) {
+ if (self._sectionExists(tabSelector)) {
+ $(tabSelector + " .card-body").html(responseText);
+ formSubmitEvent(tabSelector + " .card-body");
+ }
+
+ if (self._sectionExists(accordionSelector)) {
+ $(accordionSelector + " .card-body").html(responseText);
+ formSubmitEvent(accordionSelector + " .card-body");
+ }
+ }).fail(function () {
+ var errorHtml = 'Failed to load role memberships. Please retry.
';
+ if (self._sectionExists(tabSelector)) {
+ $(tabSelector + " .card-body").html(errorHtml);
+ }
+ if (self._sectionExists(accordionSelector)) {
+ $(accordionSelector + " .card-body").html(errorHtml);
+ }
+ }).always(function () {
+ self._reloadInFlight[mode] = false;
+
+ if (self._reloadPending[mode]) {
+ self._reloadPending[mode] = false;
+ self._reloadMembershipSection(mode, requestUrl, tabSelector, accordionSelector);
}
});
};
+
+ this.reloadRoleMemberships = function () {
+ this._reloadMembershipSection(
+ "current",
+ this.url + "?mode=reload_current_memberships&user_uuid=" + this.userUuid,
+ "#adm_profile_role_memberships_current_pane_content",
+ "#adm_profile_role_memberships_current_accordion_content"
+ );
+ };
+
this.reloadFormerRoleMemberships = function () {
- $.get(
- {
- url: this.url + "?mode=reload_former_memberships&user_uuid=" + this.userUuid,
- dataType: "html",
- success: function(responseText) {
- /* Tabs */
- $("#adm_profile_role_memberships_former_pane_content .card-body").html(responseText);
- formSubmitEvent('#adm_profile_role_memberships_former_pane_content .card-body');
- /* Accordions */
- $("#adm_profile_role_memberships_former_accordion_content .card-body").html(responseText);
- formSubmitEvent('#adm_profile_role_memberships_former_accordion_content .card-body');
- }
- }
+ this._reloadMembershipSection(
+ "former",
+ this.url + "?mode=reload_former_memberships&user_uuid=" + this.userUuid,
+ "#adm_profile_role_memberships_former_pane_content",
+ "#adm_profile_role_memberships_former_accordion_content"
);
};
+
this.reloadFutureRoleMemberships = function () {
- $.get(
- {
- url: this.url + "?mode=reload_future_memberships&user_uuid=" + this.userUuid,
- dataType: "html",
- success: function(responseText) {
- /* Tabs */
- $("#adm_profile_role_memberships_future_pane_content .card-body").html(responseText);
- formSubmitEvent('#adm_profile_role_memberships_future_pane_content .card-body');
- /* Accordions */
- $("#adm_profile_role_memberships_future_accordion_content .card-body").html(responseText);
- formSubmitEvent('#adm_profile_role_memberships_future_accordion_content .card-body');
- }
- }
+ this._reloadMembershipSection(
+ "future",
+ this.url + "?mode=reload_future_memberships&user_uuid=" + this.userUuid,
+ "#adm_profile_role_memberships_future_pane_content",
+ "#adm_profile_role_memberships_future_accordion_content"
);
};
+ this.reloadAdditionalRoleMemberships = function () {
+ this.reloadFormerRoleMemberships();
+ this.reloadFutureRoleMemberships();
+ };
+
+ this.scheduleRoleMembershipReloads = function () {
+ var self = this;
+
+ if (this._reloadTimer !== null) {
+ clearTimeout(this._reloadTimer);
+ }
+
+ this._reloadTimer = setTimeout(function () {
+ self.reloadRoleMemberships();
+ self.reloadAdditionalRoleMemberships();
+ self._reloadTimer = null;
+ }, 200);
+ };
+
+ this.initializeDeferredRoleMemberships = function () {
+ var self = this;
+ var loadAdditionalMembershipsOnce = function () {
+ if (self._additionalRolesLoaded) {
+ return;
+ }
+
+ self._additionalRolesLoaded = true;
+ self.reloadAdditionalRoleMemberships();
+ };
+
+ $("#adm_profile_role_memberships_tab").on("shown.bs.tab", loadAdditionalMembershipsOnce);
+ $("#adm_profile_role_memberships_accordion").on("shown.bs.collapse", loadAdditionalMembershipsOnce);
+ };
+
this.toggleDetailsOn = function (memberUuid) {
/* Tabs */
// find the element in different containers (current, former, future)