Enhancement: above and below doc detail save buttons ()

* Show doc detail nav buttons above & below fields

* Fix tests for additional button nav

* Use flexbox to fix tab order but retain visual order

* Update screenshots
This commit is contained in:
shamoon 2023-12-17 16:11:12 -08:00 committed by GitHub
parent 6ee2d023d5
commit d22b27afe7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 34 additions and 20 deletions

Binary file not shown.

Before

(image error) Size: 2.2 MiB

After

(image error) Size: 2.2 MiB

Binary file not shown.

Before

(image error) Size: 2.7 MiB

After

(image error) Size: 2.3 MiB

Binary file not shown.

Before

(image error) Size: 550 KiB

After

(image error) Size: 559 KiB

@ -12,13 +12,9 @@ test('should activate / deactivate save button when changes are saved', async ({
await expect(page.getByTitle('Storage path', { exact: true })).toHaveText( await expect(page.getByTitle('Storage path', { exact: true })).toHaveText(
/\w+/ /\w+/
) )
await expect( await expect(page.getByRole('button', { name: 'Save' }).nth(1)).toBeDisabled()
page.getByRole('button', { name: 'Save', exact: true })
).toBeDisabled()
await page.getByTitle('Storage path').getByTitle('Clear all').click() await page.getByTitle('Storage path').getByTitle('Clear all').click()
await expect( await expect(page.getByRole('button', { name: 'Save' }).nth(1)).toBeEnabled()
page.getByRole('button', { name: 'Save', exact: true })
).toBeEnabled()
}) })
test('should warn on unsaved changes', async ({ page }) => { test('should warn on unsaved changes', async ({ page }) => {
@ -27,16 +23,12 @@ test('should warn on unsaved changes', async ({ page }) => {
await expect(page.getByTitle('Correspondent', { exact: true })).toHaveText( await expect(page.getByTitle('Correspondent', { exact: true })).toHaveText(
/\w+/ /\w+/
) )
await expect( await expect(page.getByRole('button', { name: 'Save' }).nth(1)).toBeDisabled()
page.getByRole('button', { name: 'Save', exact: true })
).toBeDisabled()
await page await page
.getByTitle('Storage path', { exact: true }) .getByTitle('Storage path', { exact: true })
.getByTitle('Clear all') .getByTitle('Clear all')
.click() .click()
await expect( await expect(page.getByRole('button', { name: 'Save' }).nth(1)).toBeEnabled()
page.getByRole('button', { name: 'Save', exact: true })
).toBeEnabled()
await page.getByRole('button', { name: 'Close', exact: true }).click() await page.getByRole('button', { name: 'Close', exact: true }).click()
await expect(page.getByRole('dialog')).toHaveText(/unsaved changes/) await expect(page.getByRole('dialog')).toHaveText(/unsaved changes/)
await page.getByRole('button', { name: 'Cancel' }).click() await page.getByRole('button', { name: 'Cancel' }).click()

@ -96,14 +96,7 @@
</button> </button>
</div> </div>
<div class="btn-group ms-auto"> <ng-container *ngTemplateOutlet="saveButtons"></ng-container>
<button type="button" class="btn btn-sm btn-outline-secondary" (click)="discard()" i18n [disabled]="!userCanEdit || networkActive || (isDirty$ | async) !== true">Discard</button>
<ng-container *pngxIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Document }">
<button *ngIf="hasNext()" type="button" class="btn btn-sm btn-outline-primary" (click)="saveEditNext()" i18n [disabled]="!userCanEdit || networkActive || (isDirty$ | async) !== true">Save &amp; next</button>
<button *ngIf="!hasNext()" type="button" class="btn btn-sm btn-outline-primary" (click)="save(true)" i18n [disabled]="!userCanEdit || networkActive || (isDirty$ | async) !== true">Save &amp; close</button>
<button type="submit" class="btn btn-sm btn-primary" i18n [disabled]="!userCanEdit || networkActive || (isDirty$ | async) !== true">Save</button>
</ng-container>
</div>
</div> </div>
<ul ngbNav #nav="ngbNav" class="nav-underline flex-nowrap flex-md-wrap overflow-auto" (navChange)="onNavChange($event)" [(activeId)]="activeNavID"> <ul ngbNav #nav="ngbNav" class="nav-underline flex-nowrap flex-md-wrap overflow-auto" (navChange)="onNavChange($event)" [(activeId)]="activeNavID">
@ -135,6 +128,10 @@
</div> </div>
</ng-container> </ng-container>
</div> </div>
<div class="d-flex border-top pt-3">
<ng-container *ngTemplateOutlet="saveButtons"></ng-container>
</div>
</ng-template> </ng-template>
</li> </li>
@ -241,6 +238,17 @@
</div> </div>
<ng-template #saveButtons>
<div class="btn-group ms-auto">
<ng-container *pngxIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Document }">
<button type="submit" class="order-3 btn btn-sm btn-primary" i18n [disabled]="!userCanEdit || networkActive || (isDirty$ | async) !== true">Save</button>
<button *ngIf="hasNext()" type="button" class="order-1 btn btn-sm btn-outline-primary" (click)="saveEditNext()" i18n [disabled]="!userCanEdit || networkActive || (isDirty$ | async) !== true">Save &amp; next</button>
<button *ngIf="!hasNext()" type="button" class="order-2 btn btn-sm btn-outline-primary" (click)="save(true)" i18n [disabled]="!userCanEdit || networkActive || (isDirty$ | async) !== true">Save &amp; close</button>
</ng-container>
<button type="button" class="order-0 btn btn-sm btn-outline-secondary" (click)="discard()" i18n [disabled]="!userCanEdit || networkActive || (isDirty$ | async) !== true">Discard</button>
</div>
</ng-template>
<ng-template #previewContent> <ng-template #previewContent>
<div *ngIf="!metadata" class="w-100 h-100 d-flex align-items-center justify-content-center"> <div *ngIf="!metadata" class="w-100 h-100 d-flex align-items-center justify-content-center">
<div> <div>

@ -44,3 +44,17 @@ textarea.rtl {
.input-group .btn-outline-secondary { .input-group .btn-outline-secondary {
border-color: var(--bs-border-color); border-color: var(--bs-border-color);
} }
.btn-group .btn.order-0 {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-top-left-radius: var(--bs-border-radius-sm);
border-bottom-left-radius: var(--bs-border-radius-sm);
}
.btn-group .btn.order-3 {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
border-top-right-radius: var(--bs-border-radius-sm);
border-bottom-right-radius: var(--bs-border-radius-sm);
}