Skip to content
This repository was archived by the owner on Jan 13, 2025. It is now read-only.

Commit 5f06dce

Browse files
authored
feat(checkbox): Toggle selected class with state (#4612)
1 parent 5e294f9 commit 5f06dce

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

packages/mdc-checkbox/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export const cssClasses = {
3131
CHECKED: 'mdc-checkbox--checked',
3232
DISABLED: 'mdc-checkbox--disabled',
3333
INDETERMINATE: 'mdc-checkbox--indeterminate',
34+
SELECTED: 'mdc-checkbox--selected',
3435
UPGRADED: 'mdc-checkbox--upgraded',
3536
};
3637

packages/mdc-checkbox/foundation.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ export class MDCCheckboxFoundation extends MDCFoundation<MDCCheckboxAdapter> {
117117

118118
this.updateAriaChecked_();
119119

120+
const {TRANSITION_STATE_UNCHECKED} = strings;
121+
const {SELECTED} = cssClasses;
122+
if (newState === TRANSITION_STATE_UNCHECKED) {
123+
this.adapter_.removeClass(SELECTED);
124+
} else {
125+
this.adapter_.addClass(SELECTED);
126+
}
127+
120128
// Check to ensure that there isn't a previously existing animation class, in case for example
121129
// the user interacted with the checkbox before the animation was finished.
122130
if (this.currentAnimationClass_.length > 0) {

test/unit/mdc-checkbox/foundation.test.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,58 @@ testChangeHandler('no transition classes applied when no state change', [
241241
},
242242
], cssClasses.ANIM_UNCHECKED_CHECKED, {times: 1});
243243

244+
test('changing from unchecked to checked adds selected class', () => {
245+
const {mockAdapter, change} = setupChangeHandlerTest();
246+
change({
247+
checked: false,
248+
indeterminate: false,
249+
});
250+
change({
251+
checked: true,
252+
indeterminate: false,
253+
});
254+
td.verify(mockAdapter.addClass(cssClasses.SELECTED), {times: 1});
255+
});
256+
257+
test('changing from unchecked to indeterminate adds selected class', () => {
258+
const {mockAdapter, change} = setupChangeHandlerTest();
259+
change({
260+
checked: false,
261+
indeterminate: false,
262+
});
263+
change({
264+
checked: false,
265+
indeterminate: true,
266+
});
267+
td.verify(mockAdapter.addClass(cssClasses.SELECTED), {times: 1});
268+
});
269+
270+
test('changing from checked to unchecked removes selected class', () => {
271+
const {mockAdapter, change} = setupChangeHandlerTest();
272+
change({
273+
checked: true,
274+
indeterminate: false,
275+
});
276+
change({
277+
checked: false,
278+
indeterminate: false,
279+
});
280+
td.verify(mockAdapter.removeClass(cssClasses.SELECTED), {times: 1});
281+
});
282+
283+
test('changing from indeterminate to unchecked removes selected class', () => {
284+
const {mockAdapter, change} = setupChangeHandlerTest();
285+
change({
286+
checked: false,
287+
indeterminate: true,
288+
});
289+
change({
290+
checked: false,
291+
indeterminate: false,
292+
});
293+
td.verify(mockAdapter.removeClass(cssClasses.SELECTED), {times: 1});
294+
});
295+
244296
test('animation end handler removes animation class after short delay', () => {
245297
const clock = installClock();
246298
const {ANIM_UNCHECKED_CHECKED} = cssClasses;

0 commit comments

Comments
 (0)