@@ -66,6 +66,8 @@ export class MDCChipFoundation extends MDCFoundation<MDCChipAdapter> {
66
66
hasLeadingIcon : ( ) => false ,
67
67
isRTL : ( ) => false ,
68
68
isTrailingActionNavigable : ( ) => false ,
69
+ notifyEditFinish : ( ) => undefined ,
70
+ notifyEditStart : ( ) => undefined ,
69
71
notifyInteraction : ( ) => undefined ,
70
72
notifyNavigation : ( ) => undefined ,
71
73
notifyRemoval : ( ) => undefined ,
@@ -97,6 +99,14 @@ export class MDCChipFoundation extends MDCFoundation<MDCChipAdapter> {
97
99
return this . adapter . hasClass ( cssClasses . SELECTED ) ;
98
100
}
99
101
102
+ isEditable ( ) {
103
+ return this . adapter . hasClass ( cssClasses . EDITABLE ) ;
104
+ }
105
+
106
+ isEditing ( ) {
107
+ return this . adapter . hasClass ( cssClasses . EDITING ) ;
108
+ }
109
+
100
110
setSelected ( selected : boolean ) {
101
111
this . setSelected_ ( selected ) ;
102
112
this . notifySelection_ ( selected ) ;
@@ -162,6 +172,12 @@ export class MDCChipFoundation extends MDCFoundation<MDCChipAdapter> {
162
172
this . setPrimaryActionFocusable_ ( this . getFocusBehavior_ ( ) ) ;
163
173
}
164
174
175
+ handleDoubleClick ( ) {
176
+ if ( this . isEditable ( ) ) {
177
+ this . startEditing ( ) ;
178
+ }
179
+ }
180
+
165
181
/**
166
182
* Handles a transition end event on the root element.
167
183
*/
@@ -239,6 +255,10 @@ export class MDCChipFoundation extends MDCFoundation<MDCChipAdapter> {
239
255
return ;
240
256
}
241
257
258
+ if ( this . isEditing ( ) ) {
259
+ this . finishEditing ( ) ;
260
+ }
261
+
242
262
this . adapter . removeClass ( cssClasses . PRIMARY_ACTION_FOCUSED ) ;
243
263
}
244
264
@@ -255,6 +275,23 @@ export class MDCChipFoundation extends MDCFoundation<MDCChipAdapter> {
255
275
* Handles a keydown event from the root element.
256
276
*/
257
277
handleKeydown ( evt : KeyboardEvent ) {
278
+ if ( this . isEditing ( ) ) {
279
+ if ( this . shouldFinishEditing ( evt ) ) {
280
+ evt . preventDefault ( ) ;
281
+ this . finishEditing ( ) ;
282
+ }
283
+ // When editing, the foundation should only handle key events that finish
284
+ // the editing process.
285
+ return ;
286
+ }
287
+
288
+ if ( this . isEditable ( ) ) {
289
+ if ( this . shouldStartEditing ( evt ) ) {
290
+ evt . preventDefault ( ) ;
291
+ this . startEditing ( ) ;
292
+ }
293
+ }
294
+
258
295
if ( this . shouldNotifyInteraction_ ( evt ) ) {
259
296
this . adapter . notifyInteraction ( ) ;
260
297
this . setPrimaryActionFocusable_ ( this . getFocusBehavior_ ( ) ) ;
@@ -366,6 +403,14 @@ export class MDCChipFoundation extends MDCFoundation<MDCChipAdapter> {
366
403
}
367
404
}
368
405
406
+ private shouldStartEditing ( evt : KeyboardEvent ) : boolean {
407
+ return this . eventFromPrimaryAction_ ( evt ) && evt . key === strings . ENTER_KEY ;
408
+ }
409
+
410
+ private shouldFinishEditing ( evt : KeyboardEvent ) : boolean {
411
+ return evt . key === strings . ENTER_KEY ;
412
+ }
413
+
369
414
private shouldNotifyInteraction_ ( evt : KeyboardEvent ) : boolean {
370
415
return evt . key === strings . ENTER_KEY || evt . key === strings . SPACEBAR_KEY ;
371
416
}
@@ -399,6 +444,16 @@ export class MDCChipFoundation extends MDCFoundation<MDCChipAdapter> {
399
444
return this . adapter . eventTargetHasClass (
400
445
evt . target , cssClasses . PRIMARY_ACTION ) ;
401
446
}
447
+
448
+ private startEditing ( ) {
449
+ this . adapter . addClass ( cssClasses . EDITING ) ;
450
+ this . adapter . notifyEditStart ( ) ;
451
+ }
452
+
453
+ private finishEditing ( ) {
454
+ this . adapter . removeClass ( cssClasses . EDITING ) ;
455
+ this . adapter . notifyEditFinish ( ) ;
456
+ }
402
457
}
403
458
404
459
// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.
0 commit comments