Skip to content

Commit 1b8f707

Browse files
committed
Add clickOutsideHandler
in case you'd render an element in the modal coming from an addon but this element would be rendered outside of the modal ( for example )
1 parent 98f980c commit 1b8f707

File tree

7 files changed

+782
-1349
lines changed

7 files changed

+782
-1349
lines changed

packages/ember-modal/addon/components/tpk-modal.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
title=@title
1717
isOpen=@isOpen
1818
onClose=@onClose
19+
onClickOutside=@onClickOutside
1920
Cover=(component 'tpk-modal/cover')
2021
)
2122
)
@@ -26,10 +27,11 @@
2627
@title={{@title}}
2728
@isOpen={{@isOpen}}
2829
@onClose={{@onClose}}
30+
@onClickOutside={{@onClickOutside}}
2931
>
3032
{{yield}}
3133
</TpkModal::Content>
3234
{{/if}}
3335
</div>
3436
{{/in-element}}
35-
{{/if}}
37+
{{/if}}

packages/ember-modal/addon/components/tpk-modal.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { action } from '@ember/object';
66
interface UiModalArgs {
77
isOpen: boolean;
88
onClose?: () => void;
9+
onClickOutside?: () => void;
910
title: string;
1011
coverClass: string;
1112
}

packages/ember-modal/addon/components/tpk-modal/content.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<div
22
data-test-tpk-modal
33
class='tpk-modal-content'
4-
{{on-click-outside @onClose}}
4+
{{on-click-outside this.onClickOutside}}
55
role='dialog'
66
aria-modal='true'
77
aria-labelledby='modal'
@@ -17,4 +17,4 @@
1717
<TpkModal::Content::Head @onClose={{@onClose}} @title={{@title}} />
1818
{{yield}}
1919
{{/if}}
20-
</div>
20+
</div>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { action } from '@ember/object';
2+
import Component from '@glimmer/component';
3+
4+
interface UiModalContentArgs {
5+
onClose: () => void;
6+
onClickOutside?: (_e: PointerEvent) => void;
7+
}
8+
9+
export default class UiModalContent extends Component<UiModalContentArgs> {
10+
@action
11+
public onClickOutside(e: PointerEvent) {
12+
if (this.args.onClickOutside) {
13+
return this.args.onClickOutside(e);
14+
}
15+
return this.args.onClose();
16+
}
17+
}

packages/ember-modal/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@triptyk/ember-modal",
3-
"version": "0.0.16",
3+
"version": "0.0.17",
44
"description": "Easy tailwindcss modal in Ember.JS",
55
"keywords": [
66
"ember-addon",

packages/ember-modal/tests/integration/components/modal-test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,40 @@ module('Integration | Component | modal', function (hooks) {
5555
assert.dom('[data-test-modal-toggle]').doesNotExist();
5656
assert.false(this.get('isOpen'));
5757
});
58+
59+
test('click outside', async function (assert) {
60+
this.set('onClose', () => {
61+
this.set('isOpen', false);
62+
});
63+
this.set('onClickOutside', () => {
64+
console.log('clicked');
65+
assert.step('clickOutside');
66+
});
67+
this.set('isOpen', false);
68+
this.set('title', 'My modal');
69+
70+
await render(hbs`
71+
<div id="tpk-modal"></div>
72+
<button type="button" id="other" class="absolute top-0 z-10 p-5">Banana</button>
73+
<TpkModal
74+
@isOpen={{this.isOpen}}
75+
@title={{this.title}}
76+
@onClose={{this.onClose}}
77+
@onClickOutside={{this.onClickOutside}}
78+
data-test-modal-toggle
79+
>
80+
Content
81+
</TpkModal>`);
82+
83+
assert.dom('[data-test-modal-toggle]').doesNotExist();
84+
85+
this.set('isOpen', true);
86+
87+
assert.dom('[data-test-modal-toggle]').exists('modal should be open');
88+
await click('#other');
89+
assert.verifySteps(
90+
['clickOutside'],
91+
'clickOutside function must have been called'
92+
);
93+
});
5894
});

0 commit comments

Comments
 (0)