Skip to content

Commit

Permalink
Fixed MID-3241: Saving with no changes and "Keep displaying results" …
Browse files Browse the repository at this point in the history
…results in a messy screen
  • Loading branch information
mederly committed Jun 30, 2016
1 parent 2201a71 commit 850bec3
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 31 deletions.
Expand Up @@ -160,7 +160,7 @@ private void executeChangesSync(Collection<ObjectDelta<? extends ObjectType>> de
result.recordFatalError(e.getMessage(), e);
}
}
parentPage.finishProcessing(target, result);
parentPage.finishProcessing(target, result, false);
}

private void executeChangesAsync(final Collection<ObjectDelta<? extends ObjectType>> deltas, final boolean previewOnly,
Expand Down Expand Up @@ -227,7 +227,7 @@ protected void onPostProcessTarget(AjaxRequestTarget target) {

stopRefreshingProgressPanel();

parentPage.finishProcessing(target, asyncOperationResult);
parentPage.finishProcessing(target, asyncOperationResult, true);
asyncOperationResult = null;
}
}
Expand Down
Expand Up @@ -41,7 +41,7 @@ public interface ProgressReportingAwarePage {

void startProcessing(AjaxRequestTarget target, OperationResult result);

void finishProcessing(AjaxRequestTarget target, OperationResult result);
void finishProcessing(AjaxRequestTarget target, OperationResult result, boolean returningFromAsync);

// things from PageBase (todo factor this out eventually)

Expand Down
Expand Up @@ -170,7 +170,7 @@ protected ObjectWrapper<F> loadFocusWrapper(PrismObject<F> userToEdit) {
}

@Override
public void finishProcessing(AjaxRequestTarget target, OperationResult result) {
public void finishProcessing(AjaxRequestTarget target, OperationResult result, boolean returningFromAsync) {

if (previewRequested) {
finishPreviewProcessing(target, result);
Expand All @@ -187,32 +187,33 @@ public void finishProcessing(AjaxRequestTarget target, OperationResult result) {
setTimeZone(WebModelServiceUtils.getTimezone(user));
LOGGER.debug("Using {} as time zone", WebSession.get().getClientInfo().getProperties().getTimeZone());
}
boolean userAdded = getDelta() != null && getDelta().isAdd() && StringUtils.isNotEmpty(getDelta().getOid());
if (!isKeepDisplayingResults() && getProgressReporter().isAllSuccess()
&& (userAdded || !result.isFatalError())) { // TODO
boolean focusAddAttempted = getDelta() != null && getDelta().isAdd();
boolean focusAddSucceeded = focusAddAttempted && StringUtils.isNotEmpty(getDelta().getOid());

// we don't want to allow resuming editing if a new focal object was created (on second 'save' there would be a conflict with itself)
// and also in case of partial errors, like those related to projections (many deltas would be already executed, and this could cause problems on second 'save').
boolean canContinueEditing = !focusAddSucceeded && result.isFatalError();

boolean canExitPage;
if (returningFromAsync) {
canExitPage = getProgressReporter().isAllSuccess(); // if there's at least a warning in the progress table, we would like to keep the table open
} else {
canExitPage = !canContinueEditing; // no point in staying on page if we cannot continue editing (in synchronous case i.e. no progress table present)
}

if (!isKeepDisplayingResults() && canExitPage) {
showResult(result);
// todo refactor this...what is this for? why it's using some
// "shadow" param from result???
PrismObject<F> focus = getObjectWrapper().getObject();
F focusType = focus.asObjectable();
for (ObjectReferenceType ref : focusType.getLinkRef()) {
Object o = findParam("shadow", ref.getOid(), result);
if (o != null && o instanceof ShadowType) {
ShadowType accountType = (ShadowType) o;
OperationResultType fetchResult = accountType.getFetchResult();
showResult(OperationResult.createOperationResult(fetchResult), false);

}
}
redirectBack();
} else {
getProgressReporter().showBackButton(target);
getProgressReporter().hideAbortButton(target);
if (returningFromAsync) {
getProgressReporter().showBackButton(target);
getProgressReporter().hideAbortButton(target);
}
showResult(result);
target.add(getFeedbackPanel());

if (!userAdded && result.isFatalError()) {
getProgressReporter().hideBackButton(target); // not to confuse the user
if (canContinueEditing) {
getProgressReporter().hideBackButton(target);
getProgressReporter().showContinueEditingButton(target);
}
}
Expand Down
Expand Up @@ -487,6 +487,7 @@ public void saveOrPreviewPerformed(AjaxRequestTarget target, OperationResult res
} catch (Exception ex) {
result.recordFatalError(getString("pageFocus.message.cantCreateFocus"), ex);
LoggingUtils.logUnexpectedException(LOGGER, "Create user failed", ex);
showResult(result);
}
break;

Expand Down Expand Up @@ -532,7 +533,15 @@ public void saveOrPreviewPerformed(AjaxRequestTarget target, OperationResult res
}
progressReporter.executeChanges(deltas, previewOnly, options, task, result, target);
} else {
result.recordSuccess();
progressReporter.clearProgressPanel(); // from previous attempts (useful only if we would call finishProcessing at the end, but that's not the case now)
if (!previewOnly) {
result.recordWarning(getString("PageAdminObjectDetails.noChangesSave"));
showResult(result);
redirectBack();
} else {
warn(getString("PageAdminObjectDetails.noChangesPreview"));
target.add(getFeedbackPanel());
}
}

} catch (Exception ex) {
Expand All @@ -542,19 +551,20 @@ public void saveOrPreviewPerformed(AjaxRequestTarget target, OperationResult res
} else {
result.recomputeStatus();
}
showResult(result);
}
break;
// support for add/delete containers (e.g. delete credentials)
default:
error(getString("pageAdminFocus.message.unsupportedState", objectWrapper.getStatus()));
}

result.recomputeStatus();

if (!result.isInProgress()) {
LOGGER.trace("Result NOT in progress, calling finishProcessing");
finishProcessing(target, result);
}
// result.recomputeStatus();
//
// if (!result.isInProgress()) {
// LOGGER.trace("Result NOT in progress, calling finishProcessing");
// finishProcessing(target, result, false);
// }

LOGGER.trace("returning from saveOrPreviewPerformed");
}
Expand Down
Expand Up @@ -1019,6 +1019,8 @@ PageAdminObjectDetails.title.editServiceType=Edit service '{0}'
PageAdminObjectDetails.title.newRoleType=Create new role
PageAdminObjectDetails.title.editOrgType=Edit organization '{0}'
PageAdminObjectDetails.title.newOrgType=Create new organization
PageAdminObjectDetails.noChangesSave=There were no changes to be saved.
PageAdminObjectDetails.noChangesPreview=There are no changes to be previewed.
pageAdminFocus.message.cantEditFocus=Unknown error occurred, can't edit focus object.
pageAdminFocus.message.cantNewFocus=Unknown error occurred, can't create new focus object.
pageAdminFocus.message.illegalAccountState=Illegal shadow state '{0}'.
Expand Down

0 comments on commit 850bec3

Please sign in to comment.