diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 55878a81ec..4a2f2adb85 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -68,7 +68,7 @@ import { SectionService } from './features/section/section.service'; import { DialogPromptComponent } from './ui/dialog-prompt/dialog-prompt.component'; import { TODAY_TAG } from './features/tag/tag.const'; import { normalizeBackgroundImageBlur } from './features/work-context/work-context.const'; -import type { WorkContextSettingsDialogData } from './features/work-context/dialog-work-context-settings/dialog-work-context-settings.component'; +import { openWorkContextSettingsDialog } from './features/work-context/dialog-work-context-settings/open-work-context-settings-dialog'; import { isInputElement } from './util/dom-element'; import { MobileBottomNavComponent } from './core-ui/mobile-bottom-nav/mobile-bottom-nav.component'; import { StartupService } from './core/startup/startup.service'; @@ -468,16 +468,13 @@ export class AppComponent implements OnDestroy, AfterViewInit { const entity = isForProject ? await firstValueFrom(this._projectService.getByIdOnce$(contextId)) : await firstValueFrom(this._tagService.getTagById$(contextId).pipe(first())); + if (!entity) { + return; + } - const { DialogWorkContextSettingsComponent } = - await import('./features/work-context/dialog-work-context-settings/dialog-work-context-settings.component'); - this._matDialog.open(DialogWorkContextSettingsComponent, { - restoreFocus: true, - backdropClass: 'cdk-overlay-transparent-backdrop', - data: { - isProject: isForProject, - entity, - } as WorkContextSettingsDialogData, + await openWorkContextSettingsDialog(this._matDialog, { + isProject: isForProject, + entity, }); } diff --git a/src/app/core-ui/work-context-menu/work-context-menu.component.ts b/src/app/core-ui/work-context-menu/work-context-menu.component.ts index ea5da8bdfd..d5e7632c52 100644 --- a/src/app/core-ui/work-context-menu/work-context-menu.component.ts +++ b/src/app/core-ui/work-context-menu/work-context-menu.component.ts @@ -31,7 +31,7 @@ import { TaskSharedActions } from '../../root-store/meta/task-shared.actions'; import { TaskWithSubTasks } from '../../features/tasks/task.model'; import { firstValueFrom, Observable, of } from 'rxjs'; import { AsyncPipe } from '@angular/common'; -import type { WorkContextSettingsDialogData } from '../../features/work-context/dialog-work-context-settings/dialog-work-context-settings.component'; +import { openWorkContextSettingsDialog } from '../../features/work-context/dialog-work-context-settings/open-work-context-settings-dialog'; @Component({ selector: 'work-context-menu', @@ -306,16 +306,13 @@ export class WorkContextMenuComponent implements OnInit { : await firstValueFrom( this._tagService.getTagById$(this.contextId).pipe(first()), ); + if (!entity) { + throw new Error(`Unable to find work context ${this.contextId}`); + } - const { DialogWorkContextSettingsComponent } = - await import('../../features/work-context/dialog-work-context-settings/dialog-work-context-settings.component'); - this._matDialog.open(DialogWorkContextSettingsComponent, { - restoreFocus: true, - backdropClass: 'cdk-overlay-transparent-backdrop', - data: { - isProject: this.isForProject, - entity, - } as WorkContextSettingsDialogData, + await openWorkContextSettingsDialog(this._matDialog, { + isProject: this.isForProject, + entity, }); } catch (err) { this._snackService.open({ diff --git a/src/app/features/work-context/dialog-work-context-settings/open-work-context-settings-dialog.spec.ts b/src/app/features/work-context/dialog-work-context-settings/open-work-context-settings-dialog.spec.ts new file mode 100644 index 0000000000..3d14b28b6a --- /dev/null +++ b/src/app/features/work-context/dialog-work-context-settings/open-work-context-settings-dialog.spec.ts @@ -0,0 +1,37 @@ +import type { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { DEFAULT_PROJECT } from '../../project/project.const'; +import { DialogWorkContextSettingsComponent } from './dialog-work-context-settings.component'; +import { + openWorkContextSettingsDialog, + WORK_CONTEXT_SETTINGS_DIALOG_CONFIG, +} from './open-work-context-settings-dialog'; +import type { WorkContextSettingsDialogData } from './dialog-work-context-settings.component'; + +describe('openWorkContextSettingsDialog', () => { + it('uses a shared responsive width for project and tag settings dialogs', () => { + expect(WORK_CONTEXT_SETTINGS_DIALOG_CONFIG).toEqual({ + restoreFocus: true, + backdropClass: 'cdk-overlay-transparent-backdrop', + width: '600px', + maxWidth: '95vw', + }); + }); + + it('opens the dialog with the shared size config and caller data', async () => { + const matDialog = jasmine.createSpyObj('MatDialog', ['open']); + matDialog.open.and.returnValue( + {} as MatDialogRef, + ); + const data: WorkContextSettingsDialogData = { + isProject: true, + entity: DEFAULT_PROJECT, + }; + + await openWorkContextSettingsDialog(matDialog, data); + + expect(matDialog.open).toHaveBeenCalledOnceWith(DialogWorkContextSettingsComponent, { + ...WORK_CONTEXT_SETTINGS_DIALOG_CONFIG, + data, + }); + }); +}); diff --git a/src/app/features/work-context/dialog-work-context-settings/open-work-context-settings-dialog.ts b/src/app/features/work-context/dialog-work-context-settings/open-work-context-settings-dialog.ts new file mode 100644 index 0000000000..9a2b466a95 --- /dev/null +++ b/src/app/features/work-context/dialog-work-context-settings/open-work-context-settings-dialog.ts @@ -0,0 +1,26 @@ +import type { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog'; +import type { + DialogWorkContextSettingsComponent, + WorkContextSettingsDialogData, +} from './dialog-work-context-settings.component'; + +export const WORK_CONTEXT_SETTINGS_DIALOG_CONFIG: MatDialogConfig = + { + restoreFocus: true, + backdropClass: 'cdk-overlay-transparent-backdrop', + width: '600px', + maxWidth: '95vw', + }; + +export const openWorkContextSettingsDialog = async ( + matDialog: MatDialog, + data: WorkContextSettingsDialogData, +): Promise> => { + const { DialogWorkContextSettingsComponent } = + await import('./dialog-work-context-settings.component'); + + return matDialog.open(DialogWorkContextSettingsComponent, { + ...WORK_CONTEXT_SETTINGS_DIALOG_CONFIG, + data, + }); +};