@govtechsg/sgds-web-component 0.0.7 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/publish-latest.yml +22 -0
- package/.github/workflows/publish-pr.yml +28 -0
- package/.husky/commit-msg +4 -0
- package/.husky/prepare-commit-msg +8 -0
- package/.storybook/main.js +16 -0
- package/.storybook/preview-head.html +11 -0
- package/.storybook/preview.js +9 -0
- package/.vscode/settings.json +7 -0
- package/CONTRIBUTING.md +56 -0
- package/LICENSE +20 -0
- package/amplify.yml +22 -0
- package/commitlint.config.js +1 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/button-element.scss.html +112 -0
- package/coverage/lcov-report/button-element.ts.html +145 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +116 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov.info +32 -0
- package/index.html +430 -0
- package/{Button → lib/Button}/index.d.ts +0 -0
- package/{Button → lib/Button}/index.js +304 -39
- package/lib/Button/index.js.map +1 -0
- package/{Button → lib/Button}/package.json +0 -0
- package/lib/Button/sgds-button.d.ts +48 -0
- package/lib/Card/index.d.ts +1 -0
- package/lib/Card/index.js +6150 -0
- package/lib/Card/index.js.map +1 -0
- package/lib/Card/package.json +7 -0
- package/lib/Card/sgds-action-card.d.ts +20 -0
- package/lib/Checkbox/index.d.ts +1 -0
- package/lib/Checkbox/index.js +6366 -0
- package/lib/Checkbox/index.js.map +1 -0
- package/lib/Checkbox/package.json +7 -0
- package/lib/Checkbox/sgds-checkbox.d.ts +36 -0
- package/lib/Dropdown/index.d.ts +3 -0
- package/{Mainnav → lib/Dropdown}/index.js +2786 -9258
- package/lib/Dropdown/index.js.map +1 -0
- package/lib/Dropdown/package.json +7 -0
- package/lib/Dropdown/sgds-dropdown-item.d.ts +7 -0
- package/lib/Dropdown/sgds-dropdown.d.ts +7 -0
- package/{Footer → lib/Footer}/index.d.ts +0 -0
- package/{Footer → lib/Footer}/index.js +111 -95
- package/lib/Footer/index.js.map +1 -0
- package/{Footer → lib/Footer}/package.json +0 -0
- package/{Footer → lib/Footer}/sgds-footer.d.ts +2 -2
- package/lib/Input/index.d.ts +1 -0
- package/lib/Input/index.js +6656 -0
- package/lib/Input/index.js.map +1 -0
- package/lib/Input/package.json +7 -0
- package/lib/Input/sgds-input.d.ts +42 -0
- package/{Mainnav → lib/Mainnav}/index.d.ts +1 -0
- package/{index.js → lib/Mainnav/index.js} +3876 -23415
- package/lib/Mainnav/index.js.map +1 -0
- package/{Mainnav → lib/Mainnav}/package.json +0 -0
- package/lib/Mainnav/sgds-mainnav-dropdown.d.ts +5 -0
- package/lib/Mainnav/sgds-mainnav-item.d.ts +4 -0
- package/{Mainnav → lib/Mainnav}/sgds-mainnav.d.ts +3 -2
- package/{Masthead → lib/Masthead}/index.d.ts +0 -0
- package/{Masthead → lib/Masthead}/index.js +140 -114
- package/lib/Masthead/index.js.map +1 -0
- package/{Masthead → lib/Masthead}/package.json +0 -0
- package/{Masthead → lib/Masthead}/sgds-masthead.d.ts +1 -1
- package/lib/Modal/index.d.ts +1 -0
- package/lib/Modal/index.js +6432 -0
- package/lib/Modal/index.js.map +1 -0
- package/lib/Modal/package.json +7 -0
- package/lib/Modal/sgds-modal.d.ts +28 -0
- package/lib/QuantityToggle/index.d.ts +1 -0
- package/lib/QuantityToggle/index.js +7049 -0
- package/lib/QuantityToggle/index.js.map +1 -0
- package/lib/QuantityToggle/package.json +7 -0
- package/lib/QuantityToggle/sgds-quantitytoggle.d.ts +30 -0
- package/lib/Radio/index.d.ts +2 -0
- package/lib/Radio/index.js +12607 -0
- package/lib/Radio/index.js.map +1 -0
- package/lib/Radio/package.json +7 -0
- package/lib/Radio/sgds-radio.d.ts +31 -0
- package/lib/Radio/sgds-radiogroup.d.ts +41 -0
- package/{Sidenav → lib/Sidenav}/index.d.ts +0 -0
- package/{Sidenav → lib/Sidenav}/index.js +2266 -2171
- package/lib/Sidenav/index.js.map +1 -0
- package/{Sidenav → lib/Sidenav}/package.json +0 -0
- package/{Sidenav → lib/Sidenav}/sgds-sidenav-item.d.ts +2 -1
- package/lib/Sidenav/sgds-sidenav-link.d.ts +4 -0
- package/{Sidenav → lib/Sidenav}/sgds-sidenav.d.ts +1 -1
- package/lib/Tab/index.d.ts +3 -0
- package/lib/Tab/index.js +13557 -0
- package/lib/Tab/index.js.map +1 -0
- package/lib/Tab/package.json +7 -0
- package/lib/Tab/sgds-tab.d.ts +26 -0
- package/lib/Tab/sgds-tabgroup.d.ts +47 -0
- package/lib/Tab/sgds-tabpanel.d.ts +25 -0
- package/lib/Textarea/index.d.ts +1 -0
- package/lib/Textarea/index.js +6696 -0
- package/lib/Textarea/index.js.map +1 -0
- package/lib/Textarea/package.json +7 -0
- package/lib/Textarea/sgds-textarea.d.ts +53 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.js +134580 -0
- package/lib/index.js.map +1 -0
- package/lib/umd/index.js +134587 -0
- package/lib/umd/index.js.map +1 -0
- package/lib/utils/animate.d.ts +10 -0
- package/lib/utils/animation-registry.d.ts +18 -0
- package/{utils → lib/utils}/breakpoints.d.ts +0 -0
- package/lib/utils/card-element.d.ts +11 -0
- package/lib/utils/defaultvalue.d.ts +2 -0
- package/lib/utils/dropdown-element.d.ts +37 -0
- package/lib/utils/event.d.ts +2 -0
- package/lib/utils/form.d.ts +38 -0
- package/{utils → lib/utils}/generateId.d.ts +0 -0
- package/lib/utils/link-element.d.ts +7 -0
- package/lib/utils/mergeDeep.d.ts +2 -0
- package/lib/utils/modal.d.ts +12 -0
- package/lib/utils/object.d.ts +2 -0
- package/lib/utils/offset.d.ts +4 -0
- package/lib/utils/scroll.d.ts +13 -0
- package/{utils → lib/utils}/sgds-element.d.ts +0 -0
- package/lib/utils/slot.d.ts +22 -0
- package/lib/utils/tabbable.d.ts +8 -0
- package/lib/utils/watch.d.ts +14 -0
- package/mocks/dropdown.d.ts +4 -0
- package/mocks/dropdown.ts +27 -0
- package/mocks/link.d.ts +3 -0
- package/mocks/link.ts +6 -0
- package/package.json +65 -10
- package/rollup.config.js +73 -0
- package/rollup.test.config.js +42 -0
- package/scripts/buildUtils.js +30 -0
- package/scripts/frankBuild.js +49 -0
- package/src/Button/index.ts +1 -0
- package/src/Button/sgds-button.scss +28 -0
- package/src/Button/sgds-button.ts +153 -0
- package/src/Card/index.ts +1 -0
- package/src/Card/sgds-action-card.scss +27 -0
- package/src/Card/sgds-action-card.ts +115 -0
- package/src/Checkbox/index.ts +1 -0
- package/src/Checkbox/sgds-checkbox.scss +4 -0
- package/src/Checkbox/sgds-checkbox.ts +149 -0
- package/src/Dropdown/index.ts +3 -0
- package/src/Dropdown/sgds-dropdown-item.ts +39 -0
- package/src/Dropdown/sgds-dropdown.scss +5 -0
- package/src/Dropdown/sgds-dropdown.ts +54 -0
- package/src/Footer/index.ts +3 -0
- package/src/Footer/sgds-footer.scss +5 -0
- package/src/Footer/sgds-footer.ts +121 -0
- package/src/Input/index.ts +1 -0
- package/src/Input/sgds-input.scss +20 -0
- package/src/Input/sgds-input.ts +178 -0
- package/src/Mainnav/index.ts +4 -0
- package/src/Mainnav/sgds-mainnav-dropdown.scss +13 -0
- package/src/Mainnav/sgds-mainnav-dropdown.ts +45 -0
- package/src/Mainnav/sgds-mainnav-item.scss +24 -0
- package/src/Mainnav/sgds-mainnav-item.ts +8 -0
- package/src/Mainnav/sgds-mainnav.scss +39 -0
- package/src/Mainnav/sgds-mainnav.ts +183 -0
- package/src/Masthead/index.ts +1 -0
- package/src/Masthead/sgds-masthead.scss +217 -0
- package/src/Masthead/sgds-masthead.ts +189 -0
- package/src/Modal/index.ts +1 -0
- package/src/Modal/sgds-modal.scss +128 -0
- package/src/Modal/sgds-modal.ts +309 -0
- package/src/QuantityToggle/index.ts +1 -0
- package/src/QuantityToggle/sgds-quantitytoggle.scss +10 -0
- package/src/QuantityToggle/sgds-quantitytoggle.ts +130 -0
- package/src/Radio/index.ts +2 -0
- package/src/Radio/sgds-radio.scss +5 -0
- package/src/Radio/sgds-radio.ts +120 -0
- package/src/Radio/sgds-radiogroup.scss +22 -0
- package/src/Radio/sgds-radiogroup.ts +221 -0
- package/src/Sidenav/index.ts +4 -0
- package/src/Sidenav/sgds-sidenav-item.scss +73 -0
- package/src/Sidenav/sgds-sidenav-item.ts +145 -0
- package/src/Sidenav/sgds-sidenav-link.scss +25 -0
- package/src/Sidenav/sgds-sidenav-link.ts +8 -0
- package/src/Sidenav/sgds-sidenav.scss +6 -0
- package/src/Sidenav/sgds-sidenav.ts +33 -0
- package/src/Tab/index.ts +3 -0
- package/src/Tab/sgds-tab.scss +84 -0
- package/src/Tab/sgds-tab.ts +87 -0
- package/src/Tab/sgds-tabgroup.scss +198 -0
- package/src/Tab/sgds-tabgroup.ts +295 -0
- package/src/Tab/sgds-tabpanel.scss +12 -0
- package/src/Tab/sgds-tabpanel.ts +55 -0
- package/src/Textarea/index.ts +1 -0
- package/src/Textarea/sgds-textarea.scss +23 -0
- package/src/Textarea/sgds-textarea.ts +201 -0
- package/src/index.ts +16 -0
- package/src/utils/animate.ts +69 -0
- package/src/utils/animation-registry.ts +71 -0
- package/src/utils/base.scss +14 -0
- package/src/utils/breakpoints.ts +5 -0
- package/src/utils/card-element.ts +42 -0
- package/src/utils/components.style.scss +531 -0
- package/src/utils/defaultvalue.ts +51 -0
- package/src/utils/dropdown-element.ts +244 -0
- package/src/utils/event.ts +13 -0
- package/src/utils/form.ts +183 -0
- package/src/utils/generateId.ts +4 -0
- package/src/utils/link-element.ts +34 -0
- package/src/utils/mergeDeep.ts +22 -0
- package/src/utils/modal.ts +64 -0
- package/src/utils/object.ts +2 -0
- package/src/utils/offset.ts +6 -0
- package/src/utils/scroll.ts +57 -0
- package/src/utils/sgds-element.ts +18 -0
- package/src/utils/slot.ts +102 -0
- package/src/utils/tabbable.ts +81 -0
- package/src/utils/watch.ts +62 -0
- package/stories/ActionCard.stories.mdx +199 -0
- package/stories/Button.stories.mdx +194 -0
- package/stories/Checkbox.stories.mdx +196 -0
- package/stories/Dropdown.stories.mdx +152 -0
- package/stories/Footer.stories.mdx +261 -0
- package/stories/Input.stories.mdx +236 -0
- package/stories/MainNav.stories.mdx +169 -0
- package/stories/Masthead.stories.mdx +112 -0
- package/stories/Modal.stories.mdx +103 -0
- package/stories/QuantityToggle.stories.mdx +97 -0
- package/stories/Radio.stories.mdx +262 -0
- package/stories/Sample.stories.js +29 -0
- package/stories/Sample.stories.mdx +33 -0
- package/stories/SideNav.stories.mdx +245 -0
- package/stories/common.js +185 -0
- package/stories/textarea.stories.mdx +253 -0
- package/test/button.element.test.ts +185 -0
- package/test/checkbox.test.ts +240 -0
- package/test/dropdown.test.ts +637 -0
- package/test/footer.test.ts +181 -0
- package/test/generateId.test.ts +18 -0
- package/test/input.element.test.ts +316 -0
- package/test/link-element.test.ts +38 -0
- package/test/mainnav.test.ts +313 -0
- package/test/masthead.test.ts +116 -0
- package/test/modal.test.ts +149 -0
- package/test/quantitytoggle.test.ts +76 -0
- package/test/radio.test.ts +310 -0
- package/test/selectable-card.test.ts +159 -0
- package/test/sidenav.test.ts +390 -0
- package/test/tab.test.ts +76 -0
- package/test/textarea.test.ts +126 -0
- package/tsconfig.json +26 -0
- package/tsconfig.test.json +24 -0
- package/typings/scss.d.ts +5 -0
- package/web-dev-server.config.mjs +7 -0
- package/web-test-runner.config.mjs +47 -0
- package/Button/index.js.map +0 -1
- package/Button/sgds-button.d.ts +0 -23
- package/Footer/index.js.map +0 -1
- package/Mainnav/index.js.map +0 -1
- package/Mainnav/sgds-mainnav-item.d.ts +0 -7
- package/Masthead/index.js.map +0 -1
- package/Sidenav/index.js.map +0 -1
- package/Sidenav/sgds-sidenav-link.d.ts +0 -7
- package/index.d.ts +0 -5
- package/index.js.map +0 -1
- package/umd/index.js +0 -52092
- package/umd/index.js.map +0 -1
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import { SgdsSidenav, SgdsSidenavItem, SgdsSidenavLink } from "../src/Sidenav";
|
|
2
|
+
import "../src/Sidenav";
|
|
3
|
+
import {
|
|
4
|
+
fixture,
|
|
5
|
+
assert,
|
|
6
|
+
expect,
|
|
7
|
+
waitUntil,
|
|
8
|
+
elementUpdated,
|
|
9
|
+
aTimeout,
|
|
10
|
+
} from "@open-wc/testing";
|
|
11
|
+
import { html } from "lit";
|
|
12
|
+
import sinon from "sinon";
|
|
13
|
+
|
|
14
|
+
describe("sgds-sidenav", () => {
|
|
15
|
+
it("is defined", () => {
|
|
16
|
+
const el = document.createElement("sgds-sidenav");
|
|
17
|
+
assert.instanceOf(el, SgdsSidenav);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("can be semantically compare with shadowDom trees", async () => {
|
|
21
|
+
const el = await fixture(html`<sgds-sidenav></sgds-sidenav>`);
|
|
22
|
+
assert.shadowDom.equal(
|
|
23
|
+
el,
|
|
24
|
+
` <nav class="sidenav">
|
|
25
|
+
<ul>
|
|
26
|
+
<slot></slot>
|
|
27
|
+
</ul>
|
|
28
|
+
</nav>`
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe("sgds-sidenav-item", () => {
|
|
34
|
+
it("is defined", () => {
|
|
35
|
+
const el = document.createElement("sgds-sidenav-item");
|
|
36
|
+
assert.instanceOf(el, SgdsSidenavItem);
|
|
37
|
+
});
|
|
38
|
+
it("without href, can be semantically compare with shadowDom trees", async () => {
|
|
39
|
+
const el = await fixture(html`<sgds-sidenav-item collapseId="collapseEg" buttonId="buttonEg"></sgds-sidenav-item>`);
|
|
40
|
+
assert.shadowDom.equal(
|
|
41
|
+
el,
|
|
42
|
+
` <li class="sidenav-item" aria-haspopup="true">
|
|
43
|
+
<button class="collapsed sidenav-btn" aria-expanded="false" aria-controls="collapseEg" aria-selected="false" id="buttonEg" aria-disabled="false">
|
|
44
|
+
<slot name="title">
|
|
45
|
+
</slot>
|
|
46
|
+
</button>
|
|
47
|
+
<div class="collapse" id="collapseEg">
|
|
48
|
+
<ul class="sidenav-list" aria-labelledby="buttonEg">
|
|
49
|
+
<slot>
|
|
50
|
+
</slot>
|
|
51
|
+
</ul>
|
|
52
|
+
</div>
|
|
53
|
+
</li>`
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
it("with href, can be semantically compare with shadowDom trees", async () => {
|
|
57
|
+
const el = await fixture(html`<sgds-sidenav-item href="#"></sgds-sidenav-item>`);
|
|
58
|
+
assert.shadowDom.equal(
|
|
59
|
+
el,
|
|
60
|
+
` <li class="sidenav-item" aria-haspopup="false">
|
|
61
|
+
<a
|
|
62
|
+
class="sidenav-btn"
|
|
63
|
+
href="#"
|
|
64
|
+
aria-selected="false"
|
|
65
|
+
aria-disabled="false"
|
|
66
|
+
>
|
|
67
|
+
<slot name="title">
|
|
68
|
+
</slot>
|
|
69
|
+
</a>`
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
it("when active is true, it conveys active class to .sidenav-btn", async () => {
|
|
73
|
+
const el = await fixture(html`<sgds-sidenav-item active></sgds-sidenav-item>`);
|
|
74
|
+
const sideNavBtn = el.shadowRoot?.querySelector(".sidenav-btn");
|
|
75
|
+
expect(sideNavBtn?.classList.value).to.contain("active");
|
|
76
|
+
});
|
|
77
|
+
it("when active is true, with href defined, it conveys active class to .sidenav-btn", async () => {
|
|
78
|
+
const el = await fixture(
|
|
79
|
+
html`<sgds-sidenav-item active href="#"></sgds-sidenav-item>`
|
|
80
|
+
);
|
|
81
|
+
const sideNavBtn = el.shadowRoot?.querySelector(".sidenav-btn");
|
|
82
|
+
expect(sideNavBtn?.classList.value).to.contain("active");
|
|
83
|
+
});
|
|
84
|
+
it("when disabled is true it conveys disabled class to .sidenav-btn and attributes", async () => {
|
|
85
|
+
const el = await fixture(
|
|
86
|
+
html`<sgds-sidenav-item disabled ></sgds-sidenav-item>`
|
|
87
|
+
);
|
|
88
|
+
const sideNavBtn = el.shadowRoot?.querySelector(".sidenav-btn");
|
|
89
|
+
expect(sideNavBtn?.classList.value).to.contain("disabled");
|
|
90
|
+
expect(sideNavBtn).to.have.attribute("disabled");
|
|
91
|
+
expect(sideNavBtn).to.have.attribute("aria-disabled", "true");
|
|
92
|
+
});
|
|
93
|
+
it("should emit sgds-toggle event when button is clicked", async () => {
|
|
94
|
+
const el = await fixture(html`<sgds-sidenav-item></sgds-sidenav-item>`);
|
|
95
|
+
const toggleHandler = sinon.spy();
|
|
96
|
+
el.addEventListener("sgds-toggle", toggleHandler);
|
|
97
|
+
el.shadowRoot?.querySelector("button")?.click();
|
|
98
|
+
expect(toggleHandler).to.have.been.calledOnce;
|
|
99
|
+
});
|
|
100
|
+
it("as a link (href defined), should emit sgds-toggle event when button is clicked", async () => {
|
|
101
|
+
const el = await fixture<SgdsSidenavItem>(
|
|
102
|
+
html`<sgds-sidenav-item href="#"></sgds-sidenav-item>`
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const toggleHandler = sinon.spy();
|
|
106
|
+
el.addEventListener("sgds-toggle", toggleHandler);
|
|
107
|
+
|
|
108
|
+
el.shadowRoot?.querySelector("a")?.click();
|
|
109
|
+
expect(toggleHandler).to.have.been.calledOnce;
|
|
110
|
+
});
|
|
111
|
+
it("openItem and closeItem methods changes active class of sidenav button", async () => {
|
|
112
|
+
const el = await fixture<SgdsSidenavItem>(html`<sgds-sidenav-item></sgds-sidenav-item>`);
|
|
113
|
+
expect(
|
|
114
|
+
el.shadowRoot?.querySelector("button")?.classList.value
|
|
115
|
+
).not.to.contain("active");
|
|
116
|
+
el.openItem();
|
|
117
|
+
await elementUpdated(el);
|
|
118
|
+
expect(el.shadowRoot?.querySelector("button")?.classList.value).to.contain(
|
|
119
|
+
"active"
|
|
120
|
+
);
|
|
121
|
+
el.closeItem();
|
|
122
|
+
await elementUpdated(el);
|
|
123
|
+
expect(
|
|
124
|
+
el.shadowRoot?.querySelector("button")?.classList.value
|
|
125
|
+
).not.to.contain("active");
|
|
126
|
+
});
|
|
127
|
+
it("openItem and closeItem methods changes active class of sidenav button when href defined", async () => {
|
|
128
|
+
const el = await fixture<SgdsSidenavItem>(
|
|
129
|
+
html`<sgds-sidenav-item href="#"></sgds-sidenav-item>`
|
|
130
|
+
);
|
|
131
|
+
expect(el.shadowRoot?.querySelector("a")?.classList.value).not.to.contain(
|
|
132
|
+
"active"
|
|
133
|
+
);
|
|
134
|
+
el.openItem();
|
|
135
|
+
await elementUpdated(el);
|
|
136
|
+
expect(el.shadowRoot?.querySelector("a")?.classList.value).to.contain(
|
|
137
|
+
"active"
|
|
138
|
+
);
|
|
139
|
+
el.closeItem();
|
|
140
|
+
await elementUpdated(el);
|
|
141
|
+
expect(el.shadowRoot?.querySelector("a")?.classList.value).not.to.contain(
|
|
142
|
+
"active"
|
|
143
|
+
);
|
|
144
|
+
});
|
|
145
|
+
it("when clicked on an inactive sidenav-btn, turns it into active", async () => {
|
|
146
|
+
const el = await fixture<SgdsSidenavItem>(html`<sgds-sidenav-item></sgds-sidenav-item>`);
|
|
147
|
+
expect(
|
|
148
|
+
el.shadowRoot?.querySelector("button")?.classList.value
|
|
149
|
+
).not.to.contain("active");
|
|
150
|
+
el.shadowRoot?.querySelector("button")?.click();
|
|
151
|
+
await elementUpdated(el);
|
|
152
|
+
expect(el.shadowRoot?.querySelector("button")).to.have.class("active");
|
|
153
|
+
});
|
|
154
|
+
it("when clicked on an inactive sidenav-btn link, turns it into active", async () => {
|
|
155
|
+
const el = await fixture<SgdsSidenavItem>(
|
|
156
|
+
html`<sgds-sidenav-item href="#"></sgds-sidenav-item>`
|
|
157
|
+
);
|
|
158
|
+
expect(el.shadowRoot?.querySelector("a")?.classList.value).not.to.contain(
|
|
159
|
+
"active"
|
|
160
|
+
);
|
|
161
|
+
el.shadowRoot?.querySelector("a")?.click();
|
|
162
|
+
await elementUpdated(el);
|
|
163
|
+
expect(el.shadowRoot?.querySelector("a")).to.have.class("active");
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
describe("sgds-sidenav-link", () => {
|
|
168
|
+
it("is defined", () => {
|
|
169
|
+
const el = document.createElement("sgds-sidenav-link");
|
|
170
|
+
assert.instanceOf(el, SgdsSidenavLink);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
describe("sgds-sidenav, -item, -link interactions", () => {
|
|
175
|
+
it("by default when click on another item (link or button) should close opened sidenav", async () => {
|
|
176
|
+
const el = await fixture(html` <sgds-sidenav>
|
|
177
|
+
<sgds-sidenav-item active>
|
|
178
|
+
<span slot="title">Title 1</span>
|
|
179
|
+
<sgds-sidenav-link href="https://google.com" active>1</sgds-sidenav-link>
|
|
180
|
+
<sgds-sidenav-link href="https://google.com">2</sgds-sidenav-link>
|
|
181
|
+
<sgds-sidenav-link href="https://google.com">3</sgds-sidenav-link>
|
|
182
|
+
</sgds-sidenav-item>
|
|
183
|
+
<sgds-sidenav-item>
|
|
184
|
+
<span slot="title">Title 2</span>
|
|
185
|
+
<sgds-sidenav-link href="https://google.com">4</sgds-sidenav-link>
|
|
186
|
+
<sgds-sidenav-link href="https://google.com">5</sgds-sidenav-link>
|
|
187
|
+
<sgds-sidenav-link href="https://google.com">6</sgds-sidenav-link>
|
|
188
|
+
</sgds-sidenav-item>
|
|
189
|
+
<sgds-sidenav-item href="#">
|
|
190
|
+
<span slot="title">Title 3</span>
|
|
191
|
+
</sgds-sidenav-item>
|
|
192
|
+
</sgds-sidenav>`);
|
|
193
|
+
// assert.shadowDom.equal(el, 'test')
|
|
194
|
+
expect(el.querySelectorAll("sgds-sidenav-item").length).to.equal(3);
|
|
195
|
+
const SgdsSidenavItemOne = el.querySelectorAll("sgds-sidenav-item")[0];
|
|
196
|
+
const SgdsSidenavItemTwo = el.querySelectorAll("sgds-sidenav-item")[1];
|
|
197
|
+
const SgdsSidenavItemThree = el.querySelectorAll("sgds-sidenav-item")[2];
|
|
198
|
+
|
|
199
|
+
expect(SgdsSidenavItemThree.shadowRoot?.querySelector("div")).to.be.null;
|
|
200
|
+
await waitUntil(() =>
|
|
201
|
+
SgdsSidenavItemOne.shadowRoot?.querySelector("div.collapse")
|
|
202
|
+
);
|
|
203
|
+
await waitUntil(() =>
|
|
204
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse")
|
|
205
|
+
);
|
|
206
|
+
expect(
|
|
207
|
+
SgdsSidenavItemOne.shadowRoot?.querySelector("div.collapse")
|
|
208
|
+
).to.have.class("show");
|
|
209
|
+
expect(
|
|
210
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse")
|
|
211
|
+
).not.to.have.class("show");
|
|
212
|
+
|
|
213
|
+
//onclick SgdsSidenavItemTwo button, should remove show from first
|
|
214
|
+
SgdsSidenavItemTwo?.shadowRoot?.querySelector("button")?.click();
|
|
215
|
+
|
|
216
|
+
await waitUntil(() =>
|
|
217
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse.show")
|
|
218
|
+
);
|
|
219
|
+
expect(
|
|
220
|
+
SgdsSidenavItemOne.shadowRoot?.querySelector("div.collapse")
|
|
221
|
+
).not.to.have.class("show");
|
|
222
|
+
expect(
|
|
223
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse")
|
|
224
|
+
).to.have.class("show");
|
|
225
|
+
|
|
226
|
+
// click on link should collapse the other two side navs
|
|
227
|
+
SgdsSidenavItemThree?.shadowRoot?.querySelector("a")?.click();
|
|
228
|
+
|
|
229
|
+
// wait sometime for collapse to take place
|
|
230
|
+
await aTimeout(500);
|
|
231
|
+
expect(
|
|
232
|
+
SgdsSidenavItemOne.shadowRoot?.querySelector("div.collapse")
|
|
233
|
+
).not.to.have.class("show");
|
|
234
|
+
expect(
|
|
235
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse")
|
|
236
|
+
).not.to.have.class("show");
|
|
237
|
+
expect(
|
|
238
|
+
SgdsSidenavItemThree.shadowRoot?.querySelector("a.sidenav-btn")
|
|
239
|
+
).to.have.class("active");
|
|
240
|
+
});
|
|
241
|
+
it("when alwaysOpen is true, click on another item (link or button) should NOT close other opened sidenav", async () => {
|
|
242
|
+
const el = await fixture(html` <sgds-sidenav alwaysOpen>
|
|
243
|
+
<sgds-sidenav-item active>
|
|
244
|
+
<span slot="title">Title 1</span>
|
|
245
|
+
<sgds-sidenav-link href="https://google.com" active>1</sgds-sidenav-link>
|
|
246
|
+
<sgds-sidenav-link href="https://google.com">2</sgds-sidenav-link>
|
|
247
|
+
<sgds-sidenav-link href="https://google.com">3</sgds-sidenav-link>
|
|
248
|
+
</sgds-sidenav-item>
|
|
249
|
+
<sgds-sidenav-item>
|
|
250
|
+
<span slot="title">Title 2</span>
|
|
251
|
+
<sgds-sidenav-link href="https://google.com">4</sgds-sidenav-link>
|
|
252
|
+
<sgds-sidenav-link href="https://google.com">5</sgds-sidenav-link>
|
|
253
|
+
<sgds-sidenav-link href="https://google.com">6</sgds-sidenav-link>
|
|
254
|
+
</sgds-sidenav-item>
|
|
255
|
+
<sgds-sidenav-item href="#">
|
|
256
|
+
<span slot="title">Title 3</span>
|
|
257
|
+
</sgds-sidenav-item>
|
|
258
|
+
</sgds-sidenav>`);
|
|
259
|
+
|
|
260
|
+
expect(el.querySelectorAll("sgds-sidenav-item").length).to.equal(3);
|
|
261
|
+
const SgdsSidenavItemOne = el.querySelectorAll("sgds-sidenav-item")[0];
|
|
262
|
+
const SgdsSidenavItemTwo = el.querySelectorAll("sgds-sidenav-item")[1];
|
|
263
|
+
const SgdsSidenavItemThree = el.querySelectorAll("sgds-sidenav-item")[2];
|
|
264
|
+
|
|
265
|
+
expect(SgdsSidenavItemThree.shadowRoot?.querySelector("div")).to.be.null;
|
|
266
|
+
await waitUntil(() =>
|
|
267
|
+
SgdsSidenavItemOne.shadowRoot?.querySelector("div.collapse")
|
|
268
|
+
);
|
|
269
|
+
await waitUntil(() =>
|
|
270
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse")
|
|
271
|
+
);
|
|
272
|
+
expect(
|
|
273
|
+
SgdsSidenavItemOne.shadowRoot?.querySelector("div.collapse")
|
|
274
|
+
).to.have.class("show");
|
|
275
|
+
expect(
|
|
276
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse")
|
|
277
|
+
).not.to.have.class("show");
|
|
278
|
+
|
|
279
|
+
//onclick SgdsSidenavItemTwo button, should NOT remove show from first
|
|
280
|
+
SgdsSidenavItemTwo?.shadowRoot?.querySelector("button")?.click();
|
|
281
|
+
|
|
282
|
+
await waitUntil(() =>
|
|
283
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse.show")
|
|
284
|
+
);
|
|
285
|
+
expect(
|
|
286
|
+
SgdsSidenavItemOne.shadowRoot?.querySelector("div.collapse")
|
|
287
|
+
).to.have.class("show");
|
|
288
|
+
expect(
|
|
289
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse")
|
|
290
|
+
).to.have.class("show");
|
|
291
|
+
|
|
292
|
+
// click on link should NOT collapse the other two side navs
|
|
293
|
+
SgdsSidenavItemThree?.shadowRoot?.querySelector("a")?.click();
|
|
294
|
+
|
|
295
|
+
// wait sometime for collapse to take place
|
|
296
|
+
await aTimeout(500);
|
|
297
|
+
expect(
|
|
298
|
+
SgdsSidenavItemOne.shadowRoot?.querySelector("div.collapse")
|
|
299
|
+
).to.have.class("show");
|
|
300
|
+
expect(
|
|
301
|
+
SgdsSidenavItemTwo.shadowRoot?.querySelector("div.collapse")
|
|
302
|
+
).to.have.class("show");
|
|
303
|
+
expect(
|
|
304
|
+
SgdsSidenavItemThree.shadowRoot?.querySelector("a.sidenav-btn")
|
|
305
|
+
).to.have.class("active");
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe("a11y - sgds-sidenav-item", () => {
|
|
309
|
+
it("button have aria-expanded=true when active", async () => {
|
|
310
|
+
const el = await fixture(html`
|
|
311
|
+
<sgds-sidenav-item active>
|
|
312
|
+
<span slot="title">Title 1</span>
|
|
313
|
+
<sgds-sidenav-link href="https://google.com" active>1</sgds-sidenav-link>
|
|
314
|
+
<sgds-sidenav-link href="https://google.com">2</sgds-sidenav-link>
|
|
315
|
+
<sgds-sidenav-link href="https://google.com">3</sgds-sidenav-link>
|
|
316
|
+
</sgds-sidenav-item>
|
|
317
|
+
`);
|
|
318
|
+
const button = el.shadowRoot?.querySelector("button");
|
|
319
|
+
expect(button).to.have.attribute("aria-expanded", "true");
|
|
320
|
+
});
|
|
321
|
+
it("button to have aria-expanded=false when not active", async () => {
|
|
322
|
+
const el = await fixture(html`
|
|
323
|
+
<sgds-sidenav-item>
|
|
324
|
+
<span slot="title">Title 1</span>
|
|
325
|
+
<sgds-sidenav-link href="https://google.com" active>1</sgds-sidenav-link>
|
|
326
|
+
<sgds-sidenav-link href="https://google.com">2</sgds-sidenav-link>
|
|
327
|
+
<sgds-sidenav-link href="https://google.com">3</sgds-sidenav-link>
|
|
328
|
+
</sgds-sidenav-item>
|
|
329
|
+
`);
|
|
330
|
+
const button = el.shadowRoot?.querySelector("button");
|
|
331
|
+
expect(button).to.have.attribute("aria-expanded", "false");
|
|
332
|
+
});
|
|
333
|
+
it("button to have a default aria-controls pointing to id of div.collapse element", async () => {
|
|
334
|
+
const el = await fixture(html`
|
|
335
|
+
<sgds-sidenav-item>
|
|
336
|
+
<span slot="title">Title 1</span>
|
|
337
|
+
<sgds-sidenav-link href="https://google.com" active>1</sgds-sidenav-link>
|
|
338
|
+
<sgds-sidenav-link href="https://google.com">2</sgds-sidenav-link>
|
|
339
|
+
<sgds-sidenav-link href="https://google.com">3</sgds-sidenav-link>
|
|
340
|
+
</sgds-sidenav-item>
|
|
341
|
+
`);
|
|
342
|
+
const button = el.shadowRoot?.querySelector("button");
|
|
343
|
+
const buttonAriaControlAttr = button?.getAttribute('aria-controls')
|
|
344
|
+
const collapseId = el.shadowRoot?.querySelector("div.collapse")?.getAttribute('id')
|
|
345
|
+
expect(collapseId).to.contain('sidenav')
|
|
346
|
+
expect(collapseId).to.contain('collapse')
|
|
347
|
+
expect(buttonAriaControlAttr).to.equal(collapseId)
|
|
348
|
+
});
|
|
349
|
+
it("ul.sidenav-list el to have a default aria-labelledby pointing to id of button element", async () => {
|
|
350
|
+
const el = await fixture(html`
|
|
351
|
+
<sgds-sidenav-item>
|
|
352
|
+
<span slot="title">Title 1</span>
|
|
353
|
+
<sgds-sidenav-link href="https://google.com" active>1</sgds-sidenav-link>
|
|
354
|
+
<sgds-sidenav-link href="https://google.com">2</sgds-sidenav-link>
|
|
355
|
+
<sgds-sidenav-link href="https://google.com">3</sgds-sidenav-link>
|
|
356
|
+
</sgds-sidenav-item>
|
|
357
|
+
`);
|
|
358
|
+
const button = el.shadowRoot?.querySelector("button");
|
|
359
|
+
const buttonId = button?.getAttribute('id')
|
|
360
|
+
expect(buttonId).to.contain('button')
|
|
361
|
+
expect(buttonId).to.contain('sidenav')
|
|
362
|
+
const ulSideNavListAttr = el.shadowRoot?.querySelector("ul.sidenav-list")?.getAttribute('aria-labelledby')
|
|
363
|
+
expect(buttonId).to.equal(ulSideNavListAttr)
|
|
364
|
+
});
|
|
365
|
+
it("when active, button should have aria-selected=true ", async () => {
|
|
366
|
+
const el = await fixture(html`
|
|
367
|
+
<sgds-sidenav-item active>
|
|
368
|
+
<span slot="title">Title 1</span>
|
|
369
|
+
<sgds-sidenav-link href="https://google.com" active>1</sgds-sidenav-link>
|
|
370
|
+
<sgds-sidenav-link href="https://google.com">2</sgds-sidenav-link>
|
|
371
|
+
<sgds-sidenav-link href="https://google.com">3</sgds-sidenav-link>
|
|
372
|
+
</sgds-sidenav-item>
|
|
373
|
+
`);
|
|
374
|
+
const button = el.shadowRoot?.querySelector("button");
|
|
375
|
+
expect(button).to.have.attribute('aria-selected', 'true')
|
|
376
|
+
});
|
|
377
|
+
it("when active, anchor should have aria-selected=true ", async () => {
|
|
378
|
+
const el = await fixture(html`
|
|
379
|
+
<sgds-sidenav-item href="#" active>
|
|
380
|
+
<span slot="title">Title 1</span>
|
|
381
|
+
<sgds-sidenav-link href="https://google.com" active>1</sgds-sidenav-link>
|
|
382
|
+
<sgds-sidenav-link href="https://google.com">2</sgds-sidenav-link>
|
|
383
|
+
<sgds-sidenav-link href="https://google.com">3</sgds-sidenav-link>
|
|
384
|
+
</sgds-sidenav-item>
|
|
385
|
+
`);
|
|
386
|
+
const anchor = el.shadowRoot?.querySelector("a");
|
|
387
|
+
expect(anchor).to.have.attribute('aria-selected', 'true')
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
});
|
package/test/tab.test.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
|
2
|
+
import { SgdsTab } from '../src/Tab/sgds-tab'
|
|
3
|
+
import '../src/Tab';
|
|
4
|
+
|
|
5
|
+
describe('<sgds-tab>', () => {
|
|
6
|
+
it('passes accessibility test', async () => {
|
|
7
|
+
const el = await fixture<SgdsTab>(html`
|
|
8
|
+
<sgds-tab-group>
|
|
9
|
+
<sgds-tab slot="nav">Test</sgds-tab>
|
|
10
|
+
</sgds-tab-group>
|
|
11
|
+
`);
|
|
12
|
+
await expect(el).to.be.accessible();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should render default tab', async () => {
|
|
16
|
+
const el = await fixture<SgdsTab>(html` <sgds-tab>Test</sgds-tab> `);
|
|
17
|
+
|
|
18
|
+
const tab = el.shadowRoot!.querySelector<HTMLElement>('.tab')!;
|
|
19
|
+
expect(el.getAttribute('role')).to.equal('tab');
|
|
20
|
+
expect(el.getAttribute('aria-disabled')).to.equal('false');
|
|
21
|
+
expect(el.getAttribute('aria-selected')).to.equal('false');
|
|
22
|
+
expect(tab.getAttribute('tabindex')).to.equal('0');
|
|
23
|
+
expect(tab.getAttribute('class')).to.equal(' tab ');
|
|
24
|
+
expect(el.active).to.equal(false);
|
|
25
|
+
expect(el.disabled).to.equal(false);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('should disable tab by attribute', async () => {
|
|
29
|
+
const el = await fixture<SgdsTab>(html` <sgds-tab disabled>Test</sgds-tab> `);
|
|
30
|
+
|
|
31
|
+
const tab = el.shadowRoot!.querySelector<HTMLElement>('.tab')!;
|
|
32
|
+
|
|
33
|
+
expect(el.disabled).to.equal(true);
|
|
34
|
+
expect(el.getAttribute('aria-disabled')).to.equal('true');
|
|
35
|
+
expect(tab.getAttribute('class')).to.equal(' tab tab--disabled ');
|
|
36
|
+
expect(tab.getAttribute('tabindex')).to.equal('-1');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should set active tab by attribute', async () => {
|
|
40
|
+
const el = await fixture<SgdsTab>(html` <sgds-tab active>Test</sgds-tab> `);
|
|
41
|
+
|
|
42
|
+
const tab = el.shadowRoot!.querySelector<HTMLElement>('.tab')!;
|
|
43
|
+
|
|
44
|
+
expect(el.active).to.equal(true);
|
|
45
|
+
expect(el.getAttribute('aria-selected')).to.equal('true');
|
|
46
|
+
expect(tab.getAttribute('class')).to.equal(' tab tab--active ');
|
|
47
|
+
expect(tab.getAttribute('tabindex')).to.equal('0');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('focus', () => {
|
|
51
|
+
it('should focus inner div', async () => {
|
|
52
|
+
const el = await fixture<SgdsTab>(html` <sgds-tab>Test</sgds-tab> `);
|
|
53
|
+
|
|
54
|
+
const tab = el.shadowRoot!.querySelector<HTMLElement>('.tab')!;
|
|
55
|
+
|
|
56
|
+
el.focus();
|
|
57
|
+
await el.updateComplete;
|
|
58
|
+
|
|
59
|
+
expect(el.shadowRoot!.activeElement).to.equal(tab);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('blur', () => {
|
|
64
|
+
it('should blur inner div', async () => {
|
|
65
|
+
const el = await fixture<SgdsTab>(html` <sgds-tab>Test</sgds-tab> `);
|
|
66
|
+
|
|
67
|
+
el.focus();
|
|
68
|
+
await el.updateComplete;
|
|
69
|
+
|
|
70
|
+
el.blur();
|
|
71
|
+
await el.updateComplete;
|
|
72
|
+
|
|
73
|
+
expect(el.shadowRoot!.activeElement).to.equal(null);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { SgdsTextArea } from '../src/Textarea/sgds-textarea';
|
|
2
|
+
import '../src/Textarea';
|
|
3
|
+
import {SgdsButton} from '../src/Button/sgds-button';
|
|
4
|
+
import '../src/Button';
|
|
5
|
+
import { assert, fixture, html, expect, waitUntil, oneEvent } from '@open-wc/testing';
|
|
6
|
+
import sinon from 'sinon';
|
|
7
|
+
|
|
8
|
+
describe('sgds-textarea', () => {
|
|
9
|
+
it('is defined', () => {
|
|
10
|
+
const el = document.createElement('sgds-textarea');
|
|
11
|
+
assert.instanceOf(el, SgdsTextArea)
|
|
12
|
+
})
|
|
13
|
+
it('renders with default values', async () => {
|
|
14
|
+
const el = await fixture(html`<sgds-textarea textareaId="test" required invalidFeedback="Do not leave blank" maxlength="10"></sgds-textarea>`);
|
|
15
|
+
assert.shadowDom.equal(
|
|
16
|
+
el,
|
|
17
|
+
`
|
|
18
|
+
<div class="text-area-label-wrapper d-flex justify-content-between">
|
|
19
|
+
<label class="form-label" for="test">label</label>
|
|
20
|
+
<div class="form-text">0/10</div>
|
|
21
|
+
</div>
|
|
22
|
+
<textarea class=" form-control textarea-resize-vertical " id="test" rows="4" placeholder="Placeholder" maxlength="10" aria-invalid="false" spellcheck="false" required=""></textarea>
|
|
23
|
+
<div class="invalid-feedback" id="test-invalid">Do not leave blank</div>
|
|
24
|
+
`
|
|
25
|
+
);
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
it('should be disabled with the disabled attribute', async () => {
|
|
30
|
+
const el = await fixture<SgdsTextArea>(html` <sgds-textarea disabled></sgds-textarea> `);
|
|
31
|
+
const textarea = el.shadowRoot!.querySelector<HTMLTextAreaElement>('textarea')!;
|
|
32
|
+
|
|
33
|
+
expect(textarea.disabled).to.be.true;
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should focus the textarea when clicking on the label', async () => {
|
|
37
|
+
const el = await fixture<SgdsTextArea>(html` <sgds-textarea label="Name"></sgds-textarea> `);
|
|
38
|
+
const label = el.shadowRoot!.querySelector('.form-label')!;
|
|
39
|
+
const submitHandler = sinon.spy();
|
|
40
|
+
|
|
41
|
+
el.addEventListener('sgds-focus', submitHandler);
|
|
42
|
+
(label as HTMLLabelElement).click();
|
|
43
|
+
await waitUntil(() => submitHandler.calledOnce);
|
|
44
|
+
|
|
45
|
+
expect(submitHandler).to.have.been.calledOnce;
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('when using constraint validation', () => {
|
|
51
|
+
it('should be valid by default', async () => {
|
|
52
|
+
const el = await fixture<SgdsTextArea>(html` <sgds-textarea></sgds-textarea> `);
|
|
53
|
+
expect(el.invalid).to.be.false;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should be valid when required and empty by default', async () => {
|
|
57
|
+
const el = await fixture<SgdsTextArea>(html` <sgds-textarea required></sgds-textarea> `);
|
|
58
|
+
|
|
59
|
+
expect(el.invalid).to.be.false;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('should be invalid when required and after removing disabled ', async () => {
|
|
63
|
+
const el = await fixture<SgdsTextArea>(html` <sgds-textarea disabled required></sgds-textarea> `);
|
|
64
|
+
|
|
65
|
+
el.disabled = false;
|
|
66
|
+
await el.updateComplete;
|
|
67
|
+
|
|
68
|
+
expect(el.invalid).to.be.true;
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('should be invalid when required and disabled is removed', async () => {
|
|
72
|
+
const el = await fixture<SgdsTextArea>(html` <sgds-textarea disabled required></sgds-textarea> `);
|
|
73
|
+
el.disabled = false;
|
|
74
|
+
await el.updateComplete;
|
|
75
|
+
expect(el.invalid).to.be.true;
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe('when resetting a form', () => {
|
|
80
|
+
it('should reset the element to its initial value', async () => {
|
|
81
|
+
const form = await fixture<HTMLFormElement>(html`
|
|
82
|
+
<form>
|
|
83
|
+
<sgds-textarea name="a" value="test"></sgds-textarea>
|
|
84
|
+
<sgds-button type="reset">Reset</sgds-button>
|
|
85
|
+
</form>
|
|
86
|
+
`);
|
|
87
|
+
const button = form.querySelector<SgdsButton>('sgds-button')!;
|
|
88
|
+
const textarea = form.querySelector<SgdsTextArea>('sgds-textarea')!;
|
|
89
|
+
textarea.value = '1234';
|
|
90
|
+
|
|
91
|
+
await textarea.updateComplete;
|
|
92
|
+
|
|
93
|
+
setTimeout(() => button.click());
|
|
94
|
+
await oneEvent(form, 'reset');
|
|
95
|
+
await textarea.updateComplete;
|
|
96
|
+
|
|
97
|
+
expect(textarea.value).to.equal('test');
|
|
98
|
+
|
|
99
|
+
textarea.defaultValue = '';
|
|
100
|
+
|
|
101
|
+
setTimeout(() => button.click());
|
|
102
|
+
await oneEvent(form, 'reset');
|
|
103
|
+
await textarea.updateComplete;
|
|
104
|
+
|
|
105
|
+
expect(textarea.value).to.equal('');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('when maxlength is declared', () => {
|
|
110
|
+
it('form text should exist', async () => {
|
|
111
|
+
const el = await fixture<SgdsTextArea>(html`
|
|
112
|
+
<sgds-textarea required maxlength="250"></sgds-textarea>
|
|
113
|
+
`);
|
|
114
|
+
const formtext = el.shadowRoot?.querySelector('.form-text');
|
|
115
|
+
|
|
116
|
+
expect(formtext).to.exist;
|
|
117
|
+
expect(formtext?.textContent).to.contain('0/250')
|
|
118
|
+
|
|
119
|
+
el.setAttribute('maxlength', '300')
|
|
120
|
+
await el.updateComplete;
|
|
121
|
+
|
|
122
|
+
expect(formtext).to.exist;
|
|
123
|
+
expect(formtext?.textContent).to.contain('0/300')
|
|
124
|
+
|
|
125
|
+
});
|
|
126
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2017",
|
|
4
|
+
"module": "es2015",
|
|
5
|
+
"moduleResolution": "node",
|
|
6
|
+
"lib": ["es2017", "dom", "dom.iterable"],
|
|
7
|
+
"declaration": true,
|
|
8
|
+
"declarationDir": "lib",
|
|
9
|
+
"sourceMap": true,
|
|
10
|
+
"inlineSources": true,
|
|
11
|
+
"experimentalDecorators": true,
|
|
12
|
+
"skipLibCheck": true,
|
|
13
|
+
"noImplicitAny": false,
|
|
14
|
+
"importHelpers": true,
|
|
15
|
+
"rootDir": "src",
|
|
16
|
+
},
|
|
17
|
+
"include": [
|
|
18
|
+
"**/*.ts",
|
|
19
|
+
],
|
|
20
|
+
"exclude": [
|
|
21
|
+
"node_modules",
|
|
22
|
+
"lib",
|
|
23
|
+
"test",
|
|
24
|
+
"mocks"
|
|
25
|
+
],
|
|
26
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2017",
|
|
4
|
+
"module": "es2015",
|
|
5
|
+
"moduleResolution": "node",
|
|
6
|
+
"lib": ["es2017", "dom", "dom.iterable"],
|
|
7
|
+
"declaration": true,
|
|
8
|
+
"sourceMap": true,
|
|
9
|
+
"inlineSources": true,
|
|
10
|
+
"experimentalDecorators": true,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"noImplicitAny": false,
|
|
13
|
+
"importHelpers": true,
|
|
14
|
+
"allowSyntheticDefaultImports": true,
|
|
15
|
+
},
|
|
16
|
+
"include": [
|
|
17
|
+
"**/*.ts",
|
|
18
|
+
],
|
|
19
|
+
"exclude": [
|
|
20
|
+
"node_modules",
|
|
21
|
+
"lib",
|
|
22
|
+
"src",
|
|
23
|
+
],
|
|
24
|
+
}
|