From 78c52573ef5d0f305d9800f605f17ed57ee72a34 Mon Sep 17 00:00:00 2001 From: 1307-Dev Date: Tue, 16 Sep 2025 09:28:13 +0530 Subject: [PATCH 01/14] Added code for angular --- .../angular/src/providers/modal/modal.service.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/angular/src/providers/modal/modal.service.ts b/packages/angular/src/providers/modal/modal.service.ts index b7dc73eb9d1..a324e3c445f 100644 --- a/packages/angular/src/providers/modal/modal.service.ts +++ b/packages/angular/src/providers/modal/modal.service.ts @@ -36,9 +36,22 @@ export class ModalService extends BaseModalService { super(appRef, componentFactoryResolver, injector); } + public open( config: ModalConfig ): Promise> { return super.open(config); } + + + /** + * Closes the given modal instance, optionally passing a result/reason. + */ + public close(instance: ModalInstance, reason?: TReason): void { + if (instance && instance.htmlElement && typeof instance.htmlElement.closeModal === 'function') { + instance.htmlElement.closeModal(reason); + } else { + throw new Error('Invalid modal instance: cannot close'); + } + } } From 133ee192342d4177b495d976b983e25cef099d16 Mon Sep 17 00:00:00 2001 From: 1307-Dev Date: Wed, 17 Sep 2025 10:54:20 +0530 Subject: [PATCH 02/14] Added dismissmodal for react and vue --- packages/react/src/modal/index.ts | 12 ++++++++++++ packages/vue/src/modal/index.ts | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/packages/react/src/modal/index.ts b/packages/react/src/modal/index.ts index 6d2303aef71..ba55b3588ec 100644 --- a/packages/react/src/modal/index.ts +++ b/packages/react/src/modal/index.ts @@ -22,3 +22,15 @@ export async function showModal( ) { return _showModal(config); } + +/** + * Dismisses a modal instance returned by showModal. + * @param modalInstance The modal instance returned by showModal + * @param dismissResult Optional result to pass to the dismiss event + */ +export function dismissModal( + modalInstance: { htmlElement: any }, + dismissResult?: any +) { + modalInstance?.htmlElement?.dismissModal?.(dismissResult); +} diff --git a/packages/vue/src/modal/index.ts b/packages/vue/src/modal/index.ts index 8dbf931be0d..deda9535e30 100644 --- a/packages/vue/src/modal/index.ts +++ b/packages/vue/src/modal/index.ts @@ -18,3 +18,15 @@ export async function showModal( ) { return _showModal(config); } + +/** + * Dismisses a modal instance returned by showModal. + * @param modalInstance The modal instance returned by showModal + * @param dismissResult Optional result to pass to the dismiss event + */ +export function dismissModal( + modalInstance: { htmlElement: any }, + dismissResult?: any +) { + modalInstance?.htmlElement?.dismissModal?.(dismissResult); +} From 6cbd4671b2464eacecd55e4eb0d7a77280f079ec Mon Sep 17 00:00:00 2001 From: 1307-Dev Date: Fri, 19 Sep 2025 10:29:41 +0530 Subject: [PATCH 03/14] Added close event to angular standalone --- .../common/src/providers/modal/modal.service.ts | 15 +++++++++++++++ .../angular/src/providers/modal/modal.service.ts | 16 +++++----------- .../angular/standalone/src/providers/modal.ts | 7 +++++++ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/angular/common/src/providers/modal/modal.service.ts b/packages/angular/common/src/providers/modal/modal.service.ts index c129d7fbef9..cdfaf929b72 100644 --- a/packages/angular/common/src/providers/modal/modal.service.ts +++ b/packages/angular/common/src/providers/modal/modal.service.ts @@ -36,6 +36,21 @@ export class ModalService { private injector: Injector ) {} + public close( + instance: { htmlElement: any }, + reason?: TReason + ): void { + if ( + instance && + instance.htmlElement && + typeof instance.htmlElement.closeModal === 'function' + ) { + instance.htmlElement.closeModal(reason); + } else { + throw new Error('Invalid modal instance: cannot close'); + } + } + public async open(config: ModalConfig) { const context: ModalContext = { close: null, diff --git a/packages/angular/src/providers/modal/modal.service.ts b/packages/angular/src/providers/modal/modal.service.ts index a324e3c445f..6ba79396f92 100644 --- a/packages/angular/src/providers/modal/modal.service.ts +++ b/packages/angular/src/providers/modal/modal.service.ts @@ -36,22 +36,16 @@ export class ModalService extends BaseModalService { super(appRef, componentFactoryResolver, injector); } - public open( config: ModalConfig ): Promise> { return super.open(config); } - - /** - * Closes the given modal instance, optionally passing a result/reason. - */ - public close(instance: ModalInstance, reason?: TReason): void { - if (instance && instance.htmlElement && typeof instance.htmlElement.closeModal === 'function') { - instance.htmlElement.closeModal(reason); - } else { - throw new Error('Invalid modal instance: cannot close'); - } + public close( + instance: ModalInstance, + reason?: TReason + ): void { + super.close(instance, reason); } } diff --git a/packages/angular/standalone/src/providers/modal.ts b/packages/angular/standalone/src/providers/modal.ts index 3e92b6270b0..2df8450e326 100644 --- a/packages/angular/standalone/src/providers/modal.ts +++ b/packages/angular/standalone/src/providers/modal.ts @@ -37,4 +37,11 @@ export class ModalService extends BaseModalService { defineCustomElement(); return super.open(config); } + + public close( + instance: ModalInstance, + reason?: TReason + ): void { + super.close(instance, reason); + } } From db59916509b38859741d6e4cea07034e4281b6bb Mon Sep 17 00:00:00 2001 From: 1307-Dev Date: Mon, 22 Sep 2025 12:11:01 +0530 Subject: [PATCH 04/14] Renamed some functions --- packages/react/src/modal/index.ts | 12 ++---------- packages/vue/src/modal/index.ts | 12 ++---------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/packages/react/src/modal/index.ts b/packages/react/src/modal/index.ts index ba55b3588ec..9b83c42f83e 100644 --- a/packages/react/src/modal/index.ts +++ b/packages/react/src/modal/index.ts @@ -23,14 +23,6 @@ export async function showModal( return _showModal(config); } -/** - * Dismisses a modal instance returned by showModal. - * @param modalInstance The modal instance returned by showModal - * @param dismissResult Optional result to pass to the dismiss event - */ -export function dismissModal( - modalInstance: { htmlElement: any }, - dismissResult?: any -) { - modalInstance?.htmlElement?.dismissModal?.(dismissResult); +export function close(modalInstance: { htmlElement: any }, closeResult?: any) { + modalInstance?.htmlElement?.close?.(closeResult); } diff --git a/packages/vue/src/modal/index.ts b/packages/vue/src/modal/index.ts index deda9535e30..3e2cdc01bb8 100644 --- a/packages/vue/src/modal/index.ts +++ b/packages/vue/src/modal/index.ts @@ -19,14 +19,6 @@ export async function showModal( return _showModal(config); } -/** - * Dismisses a modal instance returned by showModal. - * @param modalInstance The modal instance returned by showModal - * @param dismissResult Optional result to pass to the dismiss event - */ -export function dismissModal( - modalInstance: { htmlElement: any }, - dismissResult?: any -) { - modalInstance?.htmlElement?.dismissModal?.(dismissResult); +export function close(modalInstance: { htmlElement: any }, closeResult?: any) { + modalInstance?.htmlElement?.closeModal?.(closeResult); } From f643c2e51c739fc4031831e3f130aed32282b886 Mon Sep 17 00:00:00 2001 From: 1307-Dev Date: Tue, 23 Sep 2025 12:40:09 +0530 Subject: [PATCH 05/14] Added preview examples for modal close --- .../src/app/app.routes.ts | 14 +++ .../modal-close-by-instance.ts | 34 +++++++ .../modal-close-by-template.ts | 77 +++++++++++++++ .../src/app/app-routing.module.ts | 10 ++ .../angular-test-app/src/app/app.module.ts | 4 + .../modal-close-by-instance.ts | 30 ++++++ .../modal-close-by-template.ts | 67 +++++++++++++ .../src/preview-examples/modal-close.html | 97 +++++++++++++++++++ packages/react-test-app/src/main.tsx | 2 + .../src/preview-examples/modal-close.tsx | 64 ++++++++++++ packages/react/src/modal/index.ts | 2 +- packages/vue-test-app/src/Root.vue | 2 + .../src/preview-examples/modal-close.vue | 48 +++++++++ 13 files changed, 450 insertions(+), 1 deletion(-) create mode 100644 packages/angular-standalone-test-app/src/preview-examples/modal-close-by-instance.ts create mode 100644 packages/angular-standalone-test-app/src/preview-examples/modal-close-by-template.ts create mode 100644 packages/angular-test-app/src/preview-examples/modal-close-by-instance.ts create mode 100644 packages/angular-test-app/src/preview-examples/modal-close-by-template.ts create mode 100644 packages/html-test-app/src/preview-examples/modal-close.html create mode 100644 packages/react-test-app/src/preview-examples/modal-close.tsx create mode 100644 packages/vue-test-app/src/preview-examples/modal-close.vue diff --git a/packages/angular-standalone-test-app/src/app/app.routes.ts b/packages/angular-standalone-test-app/src/app/app.routes.ts index c795dc5d59e..847578c30c6 100644 --- a/packages/angular-standalone-test-app/src/app/app.routes.ts +++ b/packages/angular-standalone-test-app/src/app/app.routes.ts @@ -909,6 +909,13 @@ export const routes: Routes = [ (m) => m.default ), }, + { + path: 'modal-close-by-instance', + loadComponent: () => + import('../preview-examples/modal-close-by-instance').then( + (m) => m.default + ), + }, { path: 'modal-by-template', loadComponent: () => @@ -916,6 +923,13 @@ export const routes: Routes = [ (m) => m.default ), }, + { + path: 'modal-close-by-template', + loadComponent: () => + import('../preview-examples/modal-close-by-template').then( + (m) => m.default + ), + }, { path: 'modal-form-ix-button-submit', loadComponent: () => diff --git a/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-instance.ts b/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-instance.ts new file mode 100644 index 00000000000..16728b1e22d --- /dev/null +++ b/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-instance.ts @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2025 Siemens AG + * + * SPDX-License-Identifier: MIT + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { Component } from '@angular/core'; +import { IxButton } from '@siemens/ix-angular/standalone'; + +import { ModalService } from '@siemens/ix-angular'; +import ModalByInstanceExample from './modal-by-instance-content'; + +@Component({ + standalone: true, + selector: 'app-example', + imports: [IxButton], + template: 'Show modal for 5 seconds', +}) +export default class ModalCloseByInstance { + constructor(private readonly modalService: ModalService) {} + + async openModal() { + const modalInstance = await this.modalService.open({ + content: ModalByInstanceExample, + data: 'Some data', + }); + setTimeout(() => { + this.modalService.close(modalInstance, 'closed after 5 seconds'); + }, 5000); + } +} diff --git a/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-template.ts b/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-template.ts new file mode 100644 index 00000000000..4c61347b3d6 --- /dev/null +++ b/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-template.ts @@ -0,0 +1,77 @@ +/* + * SPDX-FileCopyrightText: 2025 Siemens AG + * + * SPDX-License-Identifier: MIT + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { Component, TemplateRef, ViewChild } from '@angular/core'; +import { + IxButton, + IxModal, + IxModalHeader, + IxModalContent, + IxModalFooter, +} from '@siemens/ix-angular/standalone'; + +import { ModalService } from '@siemens/ix-angular'; + +@Component({ + standalone: true, + selector: 'app-example', + imports: [IxButton, IxModal, IxModalHeader, IxModalContent, IxModalFooter], + template: ` + Show modal for 5 seconds + + + + Message headline + Message text lorem ipsum: {{ modal.data }} + + + Cancel + + + OK + + + + + `, +}) +export default class Modal { + @ViewChild('customModal', { read: TemplateRef }) + customModalRef!: TemplateRef; + + constructor(private readonly modalService: ModalService) {} + + async openModal() { + const instance = await this.modalService.open({ + content: this.customModalRef, + data: 'Some data', + }); + + setTimeout(() => { + this.modalService.close(instance, 'closed after 5 seconds'); + }, 5000); + + instance.onClose.on((a) => { + console.log(a); + }); + + instance.htmlElement.addEventListener( + 'keydown', + (keyboardEvent: KeyboardEvent) => { + console.log(keyboardEvent.key); + } + ); + } +} diff --git a/packages/angular-test-app/src/app/app-routing.module.ts b/packages/angular-test-app/src/app/app-routing.module.ts index e20ba380ed2..be91d700cae 100644 --- a/packages/angular-test-app/src/app/app-routing.module.ts +++ b/packages/angular-test-app/src/app/app-routing.module.ts @@ -158,8 +158,10 @@ import Message from '../preview-examples/message'; import MessageBar from '../preview-examples/message-bar'; import MessageBarRemoval from '../preview-examples/message-bar-removal'; import ModalByInstance from '../preview-examples/modal-by-instance'; +import ModalCloseByInstance from '../preview-examples/modal-close-by-instance'; import ModalByInstanceContent from '../preview-examples/modal-by-instance-content'; import ModalByTemplate from '../preview-examples/modal-by-template'; +import ModalCloseByTemplate from '../preview-examples/modal-close-by-template'; import ModalFormIxButtonSubmit from '../preview-examples/modal-form-ix-button-submit'; import ModalSizes from '../preview-examples/modal-sizes'; import NumberInput from '../preview-examples/number-input'; @@ -757,10 +759,18 @@ const routes: Routes = [ path: 'modal-by-instance', component: ModalByInstance, }, + { + path: 'modal-close-by-instance', + component: ModalCloseByInstance, + }, { path: 'modal-by-template', component: ModalByTemplate, }, + { + path: 'modal-close-by-template', + component: ModalCloseByTemplate, + }, { path: 'modal-form-ix-button-submit', component: ModalFormIxButtonSubmit, diff --git a/packages/angular-test-app/src/app/app.module.ts b/packages/angular-test-app/src/app/app.module.ts index 7dbadc13625..04d61ce0752 100644 --- a/packages/angular-test-app/src/app/app.module.ts +++ b/packages/angular-test-app/src/app/app.module.ts @@ -169,6 +169,8 @@ import MessageBarRemoval from '../preview-examples/message-bar-removal'; import ModalByInstance from '../preview-examples/modal-by-instance'; import ModalByInstanceContent from '../preview-examples/modal-by-instance-content'; import ModalByTemplate from '../preview-examples/modal-by-template'; +import ModalCloseByInstance from '../preview-examples/modal-close-by-instance'; +import ModalCloseByTemplate from '../preview-examples/modal-close-by-template'; import ModalSizes from '../preview-examples/modal-sizes'; import NumberInput from '../preview-examples/number-input'; import NumberInputDisabled from '../preview-examples/number-input-disabled'; @@ -392,6 +394,8 @@ import ProgressIndicatorCircular from '../preview-examples/progress-indicator-ci ModalByInstanceContent, ModalByInstance, ModalByTemplate, + ModalCloseByInstance, + ModalCloseByTemplate, ModalFormIxButtonSubmit, ModalSizes, PaginationAdvanced, diff --git a/packages/angular-test-app/src/preview-examples/modal-close-by-instance.ts b/packages/angular-test-app/src/preview-examples/modal-close-by-instance.ts new file mode 100644 index 00000000000..a0b07ea88b4 --- /dev/null +++ b/packages/angular-test-app/src/preview-examples/modal-close-by-instance.ts @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2024 Siemens AG + * + * SPDX-License-Identifier: MIT + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { Component } from '@angular/core'; +import { ModalService } from '@siemens/ix-angular'; +import ModalByInstanceExample from './modal-by-instance-content'; + +@Component({ + selector: 'app-example', + template: 'Show modal for 5 seconds', +}) +export default class ModalCloseByInstance { + constructor(private readonly modalService: ModalService) {} + + async openModal() { + const modalInstance = await this.modalService.open({ + content: ModalByInstanceExample, + data: 'Some data', + }); + setTimeout(() => { + this.modalService.close(modalInstance, 'closed after 5 seconds'); + }, 5000); + } +} diff --git a/packages/angular-test-app/src/preview-examples/modal-close-by-template.ts b/packages/angular-test-app/src/preview-examples/modal-close-by-template.ts new file mode 100644 index 00000000000..a554ebd75a9 --- /dev/null +++ b/packages/angular-test-app/src/preview-examples/modal-close-by-template.ts @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2024 Siemens AG + * + * SPDX-License-Identifier: MIT + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { Component, TemplateRef, ViewChild } from '@angular/core'; +import { ModalService } from '@siemens/ix-angular'; + +@Component({ + selector: 'app-example', + template: ` + Show modal for 5 seconds + + + + Message headline + Message text lorem ipsum: {{ modal.data }} + + + Cancel + + + OK + + + + + `, +}) +export default class Modal { + @ViewChild('customModal', { read: TemplateRef }) + customModalRef!: TemplateRef; + + constructor(private readonly modalService: ModalService) {} + + async openModal() { + const instance = await this.modalService.open({ + content: this.customModalRef, + data: 'Some data', + }); + + setTimeout(() => { + this.modalService.close(instance, 'closed after 5 seconds'); + }, 5000); + + instance.onClose.on((a) => { + console.log(a); + }); + + instance.htmlElement.addEventListener( + 'keydown', + (keyboardEvent: KeyboardEvent) => { + console.log(keyboardEvent.key); + } + ); + } +} diff --git a/packages/html-test-app/src/preview-examples/modal-close.html b/packages/html-test-app/src/preview-examples/modal-close.html new file mode 100644 index 00000000000..859bcb8b828 --- /dev/null +++ b/packages/html-test-app/src/preview-examples/modal-close.html @@ -0,0 +1,97 @@ + + + + + + + + Modal example + + + Show modal for 5 seconds + + + + + + diff --git a/packages/react-test-app/src/main.tsx b/packages/react-test-app/src/main.tsx index 3f4250ff524..7acb624a55f 100644 --- a/packages/react-test-app/src/main.tsx +++ b/packages/react-test-app/src/main.tsx @@ -156,6 +156,7 @@ import Message from './preview-examples/message'; import MessageBar from './preview-examples/message-bar'; import MessageBarRemoval from './preview-examples/message-bar-removal.tsx'; import Modal from './preview-examples/modal'; +import ModalClose from './preview-examples/modal-close.tsx'; import ModalSizes from './preview-examples/modal-sizes'; import NumberInput from './preview-examples/number-input'; import NumberInputDisabled from './preview-examples/number-input-disabled'; @@ -580,6 +581,7 @@ ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( /> } /> + } /> } diff --git a/packages/react-test-app/src/preview-examples/modal-close.tsx b/packages/react-test-app/src/preview-examples/modal-close.tsx new file mode 100644 index 00000000000..fa9440cb268 --- /dev/null +++ b/packages/react-test-app/src/preview-examples/modal-close.tsx @@ -0,0 +1,64 @@ +/* + * SPDX-FileCopyrightText: 2024 Siemens AG + * + * SPDX-License-Identifier: MIT + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { + IxButton, + IxModalContent, + IxModalFooter, + IxModalHeader, + Modal, + ModalRef, + showModal, + close, +} from '@siemens/ix-react'; +import { useRef } from 'react'; + +function CustomModal() { + const modalRef = useRef(null); + + const close = () => { + modalRef.current?.close('close payload!'); + }; + const dismiss = () => { + modalRef.current?.dismiss('dismiss payload'); + }; + + return ( + + dismiss()}> + Message headline + + Message text lorem ipsum + + dismiss()}> + Cancel + + close()}>OK + + + ); +} + +export default () => { + async function show() { + const modalInstance = await showModal({ + content: , + }); + // Auto-close after 5 seconds + setTimeout(() => { + close(modalInstance, 'closed after 5 seconds'); + }, 5000); + } + + return ( + <> + Show modal for 5 seconds + + ); +}; diff --git a/packages/react/src/modal/index.ts b/packages/react/src/modal/index.ts index 9b83c42f83e..d0cecaf9ab9 100644 --- a/packages/react/src/modal/index.ts +++ b/packages/react/src/modal/index.ts @@ -24,5 +24,5 @@ export async function showModal( } export function close(modalInstance: { htmlElement: any }, closeResult?: any) { - modalInstance?.htmlElement?.close?.(closeResult); + modalInstance?.htmlElement?.closeModal?.(closeResult); } diff --git a/packages/vue-test-app/src/Root.vue b/packages/vue-test-app/src/Root.vue index be647e2f64c..431de6e38cd 100644 --- a/packages/vue-test-app/src/Root.vue +++ b/packages/vue-test-app/src/Root.vue @@ -161,6 +161,7 @@ import MessageBarRemoval from './preview-examples/message-bar-removal.vue'; import Message from './preview-examples/message.vue'; import ModalSizes from './preview-examples/modal-sizes.vue'; import ModalExample from './preview-examples/modal.vue'; +import ModalClose from './preview-examples/modal-close.vue'; import NumberInputDisabled from './preview-examples/number-input-disabled.vue'; import NumberInputLabel from './preview-examples/number-input-label.vue'; import NumberInputReadOnly from './preview-examples/number-input-readonly.vue'; @@ -397,6 +398,7 @@ const routes: any = { '/preview/settings': Settings, '/preview/kpi': Kpi, '/preview/modal': ModalExample, + '/preview/modal-close': ModalClose, '/preview/modal-form-ix-button-submit': ModalFormIxButtonSubmit, '/preview/number-input': NumberInput, '/preview/number-input-disabled': NumberInputDisabled, diff --git a/packages/vue-test-app/src/preview-examples/modal-close.vue b/packages/vue-test-app/src/preview-examples/modal-close.vue new file mode 100644 index 00000000000..ef72da65f1c --- /dev/null +++ b/packages/vue-test-app/src/preview-examples/modal-close.vue @@ -0,0 +1,48 @@ + + + + + From 7c22e26c85def41dcf91faf6e131897e9c76a167 Mon Sep 17 00:00:00 2001 From: 1307-Dev Date: Tue, 23 Sep 2025 13:32:13 +0530 Subject: [PATCH 06/14] Sonarlint error fix --- .../angular/common/src/providers/modal/modal.service.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/angular/common/src/providers/modal/modal.service.ts b/packages/angular/common/src/providers/modal/modal.service.ts index cdfaf929b72..aaf4b0894bf 100644 --- a/packages/angular/common/src/providers/modal/modal.service.ts +++ b/packages/angular/common/src/providers/modal/modal.service.ts @@ -40,11 +40,7 @@ export class ModalService { instance: { htmlElement: any }, reason?: TReason ): void { - if ( - instance && - instance.htmlElement && - typeof instance.htmlElement.closeModal === 'function' - ) { + if (typeof instance?.htmlElement?.closeModal === 'function') { instance.htmlElement.closeModal(reason); } else { throw new Error('Invalid modal instance: cannot close'); From 16dab325839fce46ffbf6df66964a41f69b8a46d Mon Sep 17 00:00:00 2001 From: 1307-Dev Date: Tue, 23 Sep 2025 13:54:57 +0530 Subject: [PATCH 07/14] Added lint error fix --- packages/angular/common/src/providers/modal/modal.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/angular/common/src/providers/modal/modal.service.ts b/packages/angular/common/src/providers/modal/modal.service.ts index aaf4b0894bf..fb315a93242 100644 --- a/packages/angular/common/src/providers/modal/modal.service.ts +++ b/packages/angular/common/src/providers/modal/modal.service.ts @@ -43,7 +43,7 @@ export class ModalService { if (typeof instance?.htmlElement?.closeModal === 'function') { instance.htmlElement.closeModal(reason); } else { - throw new Error('Invalid modal instance: cannot close'); + throw new TypeError('Invalid modal instance: cannot close'); } } From d44eaa91e1b63bba6912eec1f15b2e0787bf5a03 Mon Sep 17 00:00:00 2001 From: 1307-Dev Date: Sun, 28 Sep 2025 23:34:58 +0530 Subject: [PATCH 08/14] Addressing review comments --- .../src/app/app.routes.ts | 13 +--- .../modal-close-by-template.ts | 77 ------------------- ...al-close-by-instance.ts => modal-close.ts} | 3 +- .../src/app/app-routing.module.ts | 11 +-- .../angular-test-app/src/app/app.module.ts | 6 +- .../modal-close-by-template.ts | 67 ---------------- ...al-close-by-instance.ts => modal-close.ts} | 5 +- .../src/preview-examples/modal-close.html | 5 +- .../src/preview-examples/modal-close.tsx | 9 +-- packages/react/src/modal/index.ts | 8 +- .../src/preview-examples/modal-close.vue | 8 +- packages/vue/src/modal/index.ts | 6 +- 12 files changed, 32 insertions(+), 186 deletions(-) delete mode 100644 packages/angular-standalone-test-app/src/preview-examples/modal-close-by-template.ts rename packages/angular-standalone-test-app/src/preview-examples/{modal-close-by-instance.ts => modal-close.ts} (90%) delete mode 100644 packages/angular-test-app/src/preview-examples/modal-close-by-template.ts rename packages/angular-test-app/src/preview-examples/{modal-close-by-instance.ts => modal-close.ts} (84%) diff --git a/packages/angular-standalone-test-app/src/app/app.routes.ts b/packages/angular-standalone-test-app/src/app/app.routes.ts index 847578c30c6..e212f03ecc1 100644 --- a/packages/angular-standalone-test-app/src/app/app.routes.ts +++ b/packages/angular-standalone-test-app/src/app/app.routes.ts @@ -910,11 +910,9 @@ export const routes: Routes = [ ), }, { - path: 'modal-close-by-instance', + path: 'modal-close', loadComponent: () => - import('../preview-examples/modal-close-by-instance').then( - (m) => m.default - ), + import('../preview-examples/modal-close').then((m) => m.default), }, { path: 'modal-by-template', @@ -923,13 +921,6 @@ export const routes: Routes = [ (m) => m.default ), }, - { - path: 'modal-close-by-template', - loadComponent: () => - import('../preview-examples/modal-close-by-template').then( - (m) => m.default - ), - }, { path: 'modal-form-ix-button-submit', loadComponent: () => diff --git a/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-template.ts b/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-template.ts deleted file mode 100644 index 4c61347b3d6..00000000000 --- a/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-template.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2025 Siemens AG - * - * SPDX-License-Identifier: MIT - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { Component, TemplateRef, ViewChild } from '@angular/core'; -import { - IxButton, - IxModal, - IxModalHeader, - IxModalContent, - IxModalFooter, -} from '@siemens/ix-angular/standalone'; - -import { ModalService } from '@siemens/ix-angular'; - -@Component({ - standalone: true, - selector: 'app-example', - imports: [IxButton, IxModal, IxModalHeader, IxModalContent, IxModalFooter], - template: ` - Show modal for 5 seconds - - - - Message headline - Message text lorem ipsum: {{ modal.data }} - - - Cancel - - - OK - - - - - `, -}) -export default class Modal { - @ViewChild('customModal', { read: TemplateRef }) - customModalRef!: TemplateRef; - - constructor(private readonly modalService: ModalService) {} - - async openModal() { - const instance = await this.modalService.open({ - content: this.customModalRef, - data: 'Some data', - }); - - setTimeout(() => { - this.modalService.close(instance, 'closed after 5 seconds'); - }, 5000); - - instance.onClose.on((a) => { - console.log(a); - }); - - instance.htmlElement.addEventListener( - 'keydown', - (keyboardEvent: KeyboardEvent) => { - console.log(keyboardEvent.key); - } - ); - } -} diff --git a/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-instance.ts b/packages/angular-standalone-test-app/src/preview-examples/modal-close.ts similarity index 90% rename from packages/angular-standalone-test-app/src/preview-examples/modal-close-by-instance.ts rename to packages/angular-standalone-test-app/src/preview-examples/modal-close.ts index 16728b1e22d..5984bdb76fa 100644 --- a/packages/angular-standalone-test-app/src/preview-examples/modal-close-by-instance.ts +++ b/packages/angular-standalone-test-app/src/preview-examples/modal-close.ts @@ -17,7 +17,8 @@ import ModalByInstanceExample from './modal-by-instance-content'; standalone: true, selector: 'app-example', imports: [IxButton], - template: 'Show modal for 5 seconds', + template: + 'Show modal (auto-dismiss)', }) export default class ModalCloseByInstance { constructor(private readonly modalService: ModalService) {} diff --git a/packages/angular-test-app/src/app/app-routing.module.ts b/packages/angular-test-app/src/app/app-routing.module.ts index be91d700cae..1839322bef8 100644 --- a/packages/angular-test-app/src/app/app-routing.module.ts +++ b/packages/angular-test-app/src/app/app-routing.module.ts @@ -158,10 +158,9 @@ import Message from '../preview-examples/message'; import MessageBar from '../preview-examples/message-bar'; import MessageBarRemoval from '../preview-examples/message-bar-removal'; import ModalByInstance from '../preview-examples/modal-by-instance'; -import ModalCloseByInstance from '../preview-examples/modal-close-by-instance'; +import ModalClose from '../preview-examples/modal-close'; import ModalByInstanceContent from '../preview-examples/modal-by-instance-content'; import ModalByTemplate from '../preview-examples/modal-by-template'; -import ModalCloseByTemplate from '../preview-examples/modal-close-by-template'; import ModalFormIxButtonSubmit from '../preview-examples/modal-form-ix-button-submit'; import ModalSizes from '../preview-examples/modal-sizes'; import NumberInput from '../preview-examples/number-input'; @@ -760,17 +759,13 @@ const routes: Routes = [ component: ModalByInstance, }, { - path: 'modal-close-by-instance', - component: ModalCloseByInstance, + path: 'modal-close', + component: ModalClose, }, { path: 'modal-by-template', component: ModalByTemplate, }, - { - path: 'modal-close-by-template', - component: ModalCloseByTemplate, - }, { path: 'modal-form-ix-button-submit', component: ModalFormIxButtonSubmit, diff --git a/packages/angular-test-app/src/app/app.module.ts b/packages/angular-test-app/src/app/app.module.ts index 04d61ce0752..18d68b3353e 100644 --- a/packages/angular-test-app/src/app/app.module.ts +++ b/packages/angular-test-app/src/app/app.module.ts @@ -169,8 +169,7 @@ import MessageBarRemoval from '../preview-examples/message-bar-removal'; import ModalByInstance from '../preview-examples/modal-by-instance'; import ModalByInstanceContent from '../preview-examples/modal-by-instance-content'; import ModalByTemplate from '../preview-examples/modal-by-template'; -import ModalCloseByInstance from '../preview-examples/modal-close-by-instance'; -import ModalCloseByTemplate from '../preview-examples/modal-close-by-template'; +import ModalClose from '../preview-examples/modal-close'; import ModalSizes from '../preview-examples/modal-sizes'; import NumberInput from '../preview-examples/number-input'; import NumberInputDisabled from '../preview-examples/number-input-disabled'; @@ -394,8 +393,7 @@ import ProgressIndicatorCircular from '../preview-examples/progress-indicator-ci ModalByInstanceContent, ModalByInstance, ModalByTemplate, - ModalCloseByInstance, - ModalCloseByTemplate, + ModalClose, ModalFormIxButtonSubmit, ModalSizes, PaginationAdvanced, diff --git a/packages/angular-test-app/src/preview-examples/modal-close-by-template.ts b/packages/angular-test-app/src/preview-examples/modal-close-by-template.ts deleted file mode 100644 index a554ebd75a9..00000000000 --- a/packages/angular-test-app/src/preview-examples/modal-close-by-template.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2024 Siemens AG - * - * SPDX-License-Identifier: MIT - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { Component, TemplateRef, ViewChild } from '@angular/core'; -import { ModalService } from '@siemens/ix-angular'; - -@Component({ - selector: 'app-example', - template: ` - Show modal for 5 seconds - - - - Message headline - Message text lorem ipsum: {{ modal.data }} - - - Cancel - - - OK - - - - - `, -}) -export default class Modal { - @ViewChild('customModal', { read: TemplateRef }) - customModalRef!: TemplateRef; - - constructor(private readonly modalService: ModalService) {} - - async openModal() { - const instance = await this.modalService.open({ - content: this.customModalRef, - data: 'Some data', - }); - - setTimeout(() => { - this.modalService.close(instance, 'closed after 5 seconds'); - }, 5000); - - instance.onClose.on((a) => { - console.log(a); - }); - - instance.htmlElement.addEventListener( - 'keydown', - (keyboardEvent: KeyboardEvent) => { - console.log(keyboardEvent.key); - } - ); - } -} diff --git a/packages/angular-test-app/src/preview-examples/modal-close-by-instance.ts b/packages/angular-test-app/src/preview-examples/modal-close.ts similarity index 84% rename from packages/angular-test-app/src/preview-examples/modal-close-by-instance.ts rename to packages/angular-test-app/src/preview-examples/modal-close.ts index a0b07ea88b4..5e913189900 100644 --- a/packages/angular-test-app/src/preview-examples/modal-close-by-instance.ts +++ b/packages/angular-test-app/src/preview-examples/modal-close.ts @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Siemens AG + * SPDX-FileCopyrightText: 2025 Siemens AG * * SPDX-License-Identifier: MIT * @@ -13,7 +13,8 @@ import ModalByInstanceExample from './modal-by-instance-content'; @Component({ selector: 'app-example', - template: 'Show modal for 5 seconds', + template: + 'Show modal (auto-dismiss)', }) export default class ModalCloseByInstance { constructor(private readonly modalService: ModalService) {} diff --git a/packages/html-test-app/src/preview-examples/modal-close.html b/packages/html-test-app/src/preview-examples/modal-close.html index 859bcb8b828..a15a597fb24 100644 --- a/packages/html-test-app/src/preview-examples/modal-close.html +++ b/packages/html-test-app/src/preview-examples/modal-close.html @@ -1,5 +1,5 @@