Skip to content

Commit febb1b8

Browse files
committed
fix(core/icon-button): dispatch submit event with shadow button
1 parent 7ca99a1 commit febb1b8

File tree

2 files changed

+77
-5
lines changed

2 files changed

+77
-5
lines changed

packages/core/src/components/icon-button/icon-button.tsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,26 @@ export class IconButton implements Button {
7878
*/
7979
@Prop() type: 'button' | 'submit' = 'button';
8080

81-
dispatchFormEvents() {
81+
/**
82+
* Temp. workaround until stencil issue is fixed (https://github.com/ionic-team/stencil/issues/2284)
83+
*/
84+
submitButtonElement: HTMLButtonElement;
85+
86+
componentDidLoad() {
8287
if (this.type === 'submit') {
83-
const form = this.hostElement.closest('form');
84-
form?.dispatchEvent(
85-
new Event('submit', { bubbles: true, cancelable: true })
86-
);
88+
const submitButton = document.createElement('button');
89+
submitButton.style.display = 'none';
90+
submitButton.type = 'submit';
91+
submitButton.tabIndex = -1;
92+
this.hostElement.appendChild(submitButton);
93+
94+
this.submitButtonElement = submitButton;
95+
}
96+
}
97+
98+
dispatchFormEvents() {
99+
if (this.type === 'submit' && this.submitButtonElement) {
100+
this.submitButtonElement.click();
87101
}
88102
}
89103

packages/core/src/components/icon-button/test/icon-button.spec.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,62 @@ describe('icon-button', () => {
2020
const btn = page.doc.querySelector('ix-icon-button');
2121
expect(btn.className).toContain('disabled');
2222
});
23+
24+
it('should submit form if type is submit', async () => {
25+
const page = await newSpecPage({
26+
components: [IconButton],
27+
html: `
28+
<form>
29+
<input type="text" />
30+
<ix-icon-button type="submit">Submit</ix-icon-button>s
31+
</form>
32+
`,
33+
});
34+
35+
await page.waitForChanges();
36+
37+
const btn = page.doc
38+
.querySelector('ix-icon-button[type="submit"]')
39+
.shadowRoot.querySelector('button');
40+
const shadowButton = page.doc.querySelector(
41+
'ix-icon-button[type="submit"] > button'
42+
) as HTMLButtonElement;
43+
44+
const onClick = jest.fn();
45+
46+
shadowButton.addEventListener('click', onClick);
47+
48+
expect(btn).toBeDefined();
49+
expect(shadowButton).toBeDefined();
50+
expect(shadowButton.style.display).toStrictEqual('none');
51+
expect(shadowButton.type).toStrictEqual('submit');
52+
expect(shadowButton.tabIndex).toStrictEqual(-1);
53+
54+
btn.click();
55+
expect(onClick).toHaveBeenCalled();
56+
});
57+
58+
it('should not render submit button if normal button is requirers', async () => {
59+
const page = await newSpecPage({
60+
components: [IconButton],
61+
html: `
62+
<form>
63+
<input type="text" />
64+
<ix-icon-button>Submit</ix-icon-button>s
65+
</form>
66+
`,
67+
});
68+
69+
await page.waitForChanges();
70+
71+
const btn = page.doc
72+
.querySelector('ix-icon-button')
73+
.shadowRoot.querySelector('button');
74+
const shadowButton = page.doc.querySelector(
75+
'ix-icon-button > button'
76+
) as HTMLButtonElement;
77+
78+
expect(btn).toBeDefined();
79+
expect(shadowButton).toBeNull();
80+
});
2381
});

0 commit comments

Comments
 (0)