Browse Source

Version Conflict dialog fixes

pull/11426/head
mpetrov 2 years ago
parent
commit
59a7284b93
  1. 15
      ui-ngx/src/app/core/interceptors/entity-conflict.interceptor.ts
  2. 11
      ui-ngx/src/app/modules/home/components/entity/entity-details-panel.component.ts
  3. 10
      ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.html
  4. 2
      ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.scss
  5. 4
      ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.ts
  6. 5
      ui-ngx/src/assets/locale/locale.constant-en_US.json

15
ui-ngx/src/app/core/interceptors/entity-conflict.interceptor.ts

@ -20,6 +20,7 @@ import {
HttpEvent, HttpEvent,
HttpHandler, HttpHandler,
HttpInterceptor, HttpInterceptor,
HttpParams,
HttpRequest, HttpRequest,
HttpStatusCode HttpStatusCode
} from '@angular/common/http'; } from '@angular/common/http';
@ -32,6 +33,8 @@ import {
import { HasId } from '@shared/models/base-data'; import { HasId } from '@shared/models/base-data';
import { HasVersion } from '@shared/models/entity.models'; import { HasVersion } from '@shared/models/entity.models';
import { getInterceptorConfig } from './interceptor.util'; import { getInterceptorConfig } from './interceptor.util';
import { isDefined } from '@core/utils';
import { InterceptorConfig } from '@core/interceptors/interceptor-config';
@Injectable() @Injectable()
export class EntityConflictInterceptor implements HttpInterceptor { export class EntityConflictInterceptor implements HttpInterceptor {
@ -67,8 +70,12 @@ export class EntityConflictInterceptor implements HttpInterceptor {
return this.openConflictDialog(request.body, error.error.message).pipe( return this.openConflictDialog(request.body, error.error.message).pipe(
switchMap(result => { switchMap(result => {
if (result) { if (isDefined(result)) {
return next.handle(this.updateRequestVersion(request)); if (result) {
return next.handle(this.updateRequestVersion(request));
}
(request.params as HttpParams & { interceptorConfig: InterceptorConfig }).interceptorConfig.ignoreErrors = true;
return next.handle(request);
} }
return of(null); return of(null);
}) })
@ -82,7 +89,9 @@ export class EntityConflictInterceptor implements HttpInterceptor {
private openConflictDialog(entity: unknown & HasId & HasVersion, message: string): Observable<boolean> { private openConflictDialog(entity: unknown & HasId & HasVersion, message: string): Observable<boolean> {
const dialogRef = this.dialog.open(EntityConflictDialogComponent, { const dialogRef = this.dialog.open(EntityConflictDialogComponent, {
data: { message, entity } disableClose: true,
data: { message, entity },
panelClass: ['tb-fullscreen-dialog'],
}); });
return dialogRef.afterClosed(); return dialogRef.afterClosed();

11
ui-ngx/src/app/modules/home/components/entity/entity-details-panel.component.ts

@ -40,11 +40,11 @@ import { UntypedFormGroup } from '@angular/forms';
import { EntityComponent } from './entity.component'; import { EntityComponent } from './entity.component';
import { TbAnchorComponent } from '@shared/components/tb-anchor.component'; import { TbAnchorComponent } from '@shared/components/tb-anchor.component';
import { EntityAction } from '@home/models/entity/entity-component.models'; import { EntityAction } from '@home/models/entity/entity-component.models';
import { Observable, ReplaySubject, Subscription } from 'rxjs'; import { Observable, of, ReplaySubject, Subscription } from 'rxjs';
import { MatTab, MatTabGroup } from '@angular/material/tabs'; import { MatTab, MatTabGroup } from '@angular/material/tabs';
import { EntityTabsComponent } from '@home/components/entity/entity-tabs.component'; import { EntityTabsComponent } from '@home/components/entity/entity-tabs.component';
import { deepClone, mergeDeep } from '@core/utils'; import { deepClone, mergeDeep } from '@core/utils';
import { entityIdEquals } from '@shared/models/id/entity-id'; import { catchError, take } from 'rxjs/operators';
@Component({ @Component({
selector: 'tb-entity-details-panel', selector: 'tb-entity-details-panel',
@ -288,7 +288,12 @@ export class EntityDetailsPanelComponent extends PageComponent implements AfterV
editingEntity.additionalInfo = editingEntity.additionalInfo =
mergeDeep((this.editingEntity as any).additionalInfo, this.entityComponent.entityFormValue()?.additionalInfo); mergeDeep((this.editingEntity as any).additionalInfo, this.entityComponent.entityFormValue()?.additionalInfo);
} }
this.entitiesTableConfig.saveEntity(editingEntity, this.editingEntity).subscribe( this.entitiesTableConfig.saveEntity(editingEntity, this.editingEntity)
.pipe(
take(1),
catchError(() => of(this.entity))
)
.subscribe(
(entity) => { (entity) => {
this.entity = entity; this.entity = entity;
this.entityComponent.entity = entity; this.entityComponent.entity = entity;

10
ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.html

@ -16,7 +16,9 @@
--> -->
<mat-toolbar color="primary"> <mat-toolbar color="primary">
<h2 class="main-label">{{ 'entity.version-conflict.label' | translate }}</h2> <h2 class="main-label">
{{ data.message }}
</h2>
<span fxFlex></span> <span fxFlex></span>
<button mat-icon-button <button mat-icon-button
(click)="onCancel()" (click)="onCancel()"
@ -26,23 +28,23 @@
</mat-toolbar> </mat-toolbar>
<div mat-dialog-content> <div mat-dialog-content>
<div class="message-container"> <div class="message-container">
<span>{{ data.message }}.</span>
<span> <span>
{{ 'entity.version-conflict.link' | translate: {{ 'entity.version-conflict.link' | translate:
{ entityType: (entityTypeTranslations.get(data.entity.id.entityType).type | translate) } { entityType: (entityTypeTranslations.get(data.entity.id.entityType).type | translate) }
}} }}
<a class="cursor-pointer" (click)="onLinkClick($event)">{{ 'entity.link' | translate }}</a>. <a class="cursor-pointer" (click)="onLinkClick($event)">{{ 'entity.link' | translate }}</a>.
</span> </span>
<br/>
<span>{{ 'entity.version-conflict.message' | translate }}</span> <span>{{ 'entity.version-conflict.message' | translate }}</span>
</div> </div>
</div> </div>
<div mat-dialog-actions fxLayout="row" fxLayoutAlign="end center"> <div mat-dialog-actions fxLayout="row" fxLayoutAlign="end center">
<button mat-button color="primary" <button mat-button color="primary"
type="button" type="button"
(click)="onCancel()" (click)="onDiscard()"
cdkFocusInitial cdkFocusInitial
> >
{{ 'entity.version-conflict.cancel' | translate }} {{ 'entity.version-conflict.discard' | translate }}
</button> </button>
<button mat-raised-button color="primary" <button mat-raised-button color="primary"
type="submit" type="submit"

2
ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.scss

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
$conflict-dialog-width: 700px; $conflict-dialog-width: 520px;
:host { :host {
.main-label { .main-label {

4
ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.ts

@ -47,6 +47,10 @@ export class EntityConflictDialogComponent {
) {} ) {}
onCancel(): void { onCancel(): void {
this.dialogRef.close();
}
onDiscard(): void {
this.dialogRef.close(false); this.dialogRef.close(false);
} }

5
ui-ngx/src/assets/locale/locale.constant-en_US.json

@ -2285,11 +2285,10 @@
"list-of-edges": "{ count, plural, =1 {One edge} other {List of # edges} }", "list-of-edges": "{ count, plural, =1 {One edge} other {List of # edges} }",
"edge-name-starts-with": "Edges whose names start with '{{prefix}}'", "edge-name-starts-with": "Edges whose names start with '{{prefix}}'",
"version-conflict": { "version-conflict": {
"label": "Version conflict", "message": "Do you want to overwrite existing version or discard changes and load the latest version?",
"message": "Do you want to cancel your changes or overwrite existing version?",
"link": "You can download your version of the {{entityType}} using this", "link": "You can download your version of the {{entityType}} using this",
"overwrite": "Overwrite version", "overwrite": "Overwrite version",
"cancel": "Cancel changes" "discard": "Discard changes"
}, },
"type-tb-resource": "Resource", "type-tb-resource": "Resource",
"type-tb-resources": "Resources", "type-tb-resources": "Resources",

Loading…
Cancel
Save