diff --git a/packages/core/src/components.d.ts b/packages/core/src/components.d.ts index 457a33895..fc758be82 100644 --- a/packages/core/src/components.d.ts +++ b/packages/core/src/components.d.ts @@ -160,9 +160,11 @@ export namespace Components { } interface AtomModal { "alertType"?: 'alert' | 'error'; - "hasDivider"?: boolean; - "hasFooter"?: boolean; - "headerTitle"?: string; + "disablePrimary": boolean; + "disableSecondary": boolean; + "hasDivider": boolean; + "hasFooter": boolean; + "headerTitle": string; "primaryText"?: string; "progress"?: number; "secondaryText"?: string; @@ -696,6 +698,8 @@ declare namespace LocalJSX { } interface AtomModal { "alertType"?: 'alert' | 'error'; + "disablePrimary"?: boolean; + "disableSecondary"?: boolean; "hasDivider"?: boolean; "hasFooter"?: boolean; "headerTitle"?: string; diff --git a/packages/core/src/components/modal/modal.spec.ts b/packages/core/src/components/modal/modal.spec.ts index 303b93887..d00e18c2a 100644 --- a/packages/core/src/components/modal/modal.spec.ts +++ b/packages/core/src/components/modal/modal.spec.ts @@ -12,7 +12,8 @@ describe('atom-modal', () => { Modal content `, @@ -21,22 +22,22 @@ describe('atom-modal', () => { it('should render modal with default values', async () => { expect(page.root).toEqualHtml(` - + -
+
-
+
Modal content
-
+
Secondary - + Primary
@@ -116,6 +117,7 @@ describe('atom-modal', () => { page.rootInstance.modal = { dismiss: jest.fn(), + close: jest.fn(), } page.root?.addEventListener('atomCloseClick', spyClose) page.root?.addEventListener('atomPrimaryClick', spyPrimary) diff --git a/packages/core/src/components/modal/modal.tsx b/packages/core/src/components/modal/modal.tsx index 4d092c92a..42a0805fd 100644 --- a/packages/core/src/components/modal/modal.tsx +++ b/packages/core/src/components/modal/modal.tsx @@ -9,6 +9,8 @@ type AlertType = Record<'alert' | 'error', { icon: IconProps; color: string }> */ const BACKDROP_NO_SCROLL = 'backdrop-no-scroll' +type HTMLAtomModalElement = HTMLIonModalElement & { close: () => Promise } + @Component({ tag: 'atom-modal', styleUrl: 'modal.scss', @@ -17,13 +19,15 @@ const BACKDROP_NO_SCROLL = 'backdrop-no-scroll' }) export class AtomModal { @Prop() trigger?: string - @Prop() headerTitle?: string = '' + @Prop() headerTitle = '' @Prop() primaryText?: string @Prop() secondaryText?: string - @Prop() hasDivider?: boolean = false + @Prop() hasDivider = false @Prop() alertType?: 'alert' | 'error' @Prop() progress?: number - @Prop() hasFooter?: boolean = true + @Prop() hasFooter = true + @Prop() disablePrimary = false + @Prop() disableSecondary = false @Event() atomCloseClick: EventEmitter @Event() atomDidDismiss: EventEmitter @@ -31,7 +35,7 @@ export class AtomModal { @Event() atomPrimaryClick: EventEmitter @Event() atomSecondaryClick: EventEmitter - private modal: HTMLIonModalElement + private modal: HTMLAtomModalElement private alertMap: AlertType = { alert: { @@ -46,6 +50,12 @@ export class AtomModal { componentDidLoad() { document.body.classList.remove(BACKDROP_NO_SCROLL) + + this.modal.close = async () => { + await this.modal.dismiss() + + document.body.classList.remove(BACKDROP_NO_SCROLL) + } } private handleDidDimiss = () => { @@ -58,8 +68,7 @@ export class AtomModal { private handleCloseClick = async () => { this.atomCloseClick.emit(this.modal) - await this.modal.dismiss() - document.body.classList.remove(BACKDROP_NO_SCROLL) + this.modal.close() } private handleSecondaryClick = () => { @@ -78,7 +87,7 @@ export class AtomModal { (this.modal = el as HTMLIonModalElement)} + ref={(el) => (this.modal = el as HTMLAtomModalElement)} trigger={this.trigger} class={{ 'atom-modal': true, @@ -87,7 +96,7 @@ export class AtomModal { onIonModalDidDismiss={this.handleDidDimiss} onDidPresent={this.handleDidPresent} > -
+
{iconType && (
{this.hasFooter && ( -