1
1
/*
2
- Copyright 2017 New Vector Ltd.
2
+ Copyright 2017, 2019 New Vector Ltd.
3
3
4
4
Licensed under the Apache License, Version 2.0 (the "License");
5
5
you may not use this file except in compliance with the License.
@@ -18,140 +18,132 @@ import React from 'react';
18
18
import PropTypes from 'prop-types' ;
19
19
import sdk from '../../../index' ;
20
20
import { _t } from '../../../languageHandler.js' ;
21
+ import Field from "./Field" ;
22
+ import AccessibleButton from "./AccessibleButton" ;
21
23
22
- const EditableItem = React . createClass ( {
23
- displayName : 'EditableItem' ,
24
-
25
- propTypes : {
26
- initialValue : PropTypes . string ,
24
+ export class EditableItem extends React . Component {
25
+ static propTypes = {
27
26
index : PropTypes . number ,
28
- placeholder : PropTypes . string ,
29
-
30
- onChange : PropTypes . func ,
27
+ value : PropTypes . string ,
31
28
onRemove : PropTypes . func ,
32
- onAdd : PropTypes . func ,
29
+ } ;
33
30
34
- addOnChange : PropTypes . bool ,
35
- } ,
31
+ constructor ( ) {
32
+ super ( ) ;
36
33
37
- onChange : function ( value ) {
38
- this . setState ( { value } ) ;
39
- if ( this . props . onChange ) this . props . onChange ( value , this . props . index ) ;
40
- if ( this . props . addOnChange && this . props . onAdd ) this . props . onAdd ( value ) ;
41
- } ,
34
+ this . state = {
35
+ verifyRemove : false ,
36
+ } ;
37
+ }
42
38
43
- onRemove : function ( ) {
44
- if ( this . props . onRemove ) this . props . onRemove ( this . props . index ) ;
45
- } ,
46
-
47
- onAdd : function ( ) {
48
- if ( this . props . onAdd ) this . props . onAdd ( this . state . value ) ;
49
- } ,
50
-
51
- render : function ( ) {
52
- const EditableText = sdk . getComponent ( 'elements.EditableText' ) ;
53
- return < div className = "mx_EditableItem" >
54
- < EditableText
55
- className = "mx_EditableItem_editable"
56
- placeholderClassName = "mx_EditableItem_editablePlaceholder"
57
- placeholder = { this . props . placeholder }
58
- blurToCancel = { false }
59
- editable = { true }
60
- initialValue = { this . props . initialValue }
61
- onValueChanged = { this . onChange } />
62
- { this . props . onAdd ?
63
- < div className = "mx_EditableItem_addButton" >
64
- < img className = "mx_filterFlipColor"
65
- src = { require ( "../../../../res/img/plus.svg" ) } width = "14" height = "14"
66
- alt = { _t ( "Add" ) } onClick = { this . onAdd } />
67
- </ div >
68
- :
69
- < div className = "mx_EditableItem_removeButton" >
70
- < img className = "mx_filterFlipColor"
71
- src = { require ( "../../../../res/img/cancel-small.svg" ) } width = "14" height = "14"
72
- alt = { _t ( "Delete" ) } onClick = { this . onRemove } />
73
- </ div >
74
- }
75
- </ div > ;
76
- } ,
77
- } ) ;
78
-
79
- // TODO: Make this use the new Field element
80
- module . exports = React . createClass ( {
81
- displayName : 'EditableItemList' ,
82
-
83
- propTypes : {
84
- items : PropTypes . arrayOf ( PropTypes . string ) . isRequired ,
85
- onNewItemChanged : PropTypes . func ,
86
- onItemAdded : PropTypes . func ,
87
- onItemEdited : PropTypes . func ,
88
- onItemRemoved : PropTypes . func ,
39
+ _onRemove = ( e ) => {
40
+ e . stopPropagation ( ) ;
41
+ e . preventDefault ( ) ;
89
42
90
- canEdit : PropTypes . bool ,
91
- } ,
92
-
93
- getDefaultProps : function ( ) {
94
- return {
95
- onItemAdded : ( ) => { } ,
96
- onItemEdited : ( ) => { } ,
97
- onItemRemoved : ( ) => { } ,
98
- onNewItemChanged : ( ) => { } ,
99
- } ;
100
- } ,
43
+ this . setState ( { verifyRemove : true } ) ;
44
+ } ;
101
45
102
- onItemAdded : function ( value ) {
103
- this . props . onItemAdded ( value ) ;
104
- } ,
46
+ _onDontRemove = ( e ) => {
47
+ e . stopPropagation ( ) ;
48
+ e . preventDefault ( ) ;
105
49
106
- onItemEdited : function ( value , index ) {
107
- if ( value . length === 0 ) {
108
- this . onItemRemoved ( index ) ;
109
- } else {
110
- this . props . onItemEdited ( value , index ) ;
111
- }
112
- } ,
50
+ this . setState ( { verifyRemove : false } ) ;
51
+ } ;
113
52
114
- onItemRemoved : function ( index ) {
115
- this . props . onItemRemoved ( index ) ;
116
- } ,
53
+ _onActuallyRemove = ( e ) => {
54
+ e . stopPropagation ( ) ;
55
+ e . preventDefault ( ) ;
117
56
118
- onNewItemChanged : function ( value ) {
119
- this . props . onNewItemChanged ( value ) ;
120
- } ,
57
+ if ( this . props . onRemove ) this . props . onRemove ( this . props . index ) ;
58
+ this . setState ( { verifyRemove : false } ) ;
59
+ } ;
60
+
61
+ render ( ) { if ( this . state . verifyRemove ) {
62
+ return (
63
+ < div className = "mx_EditableItem" >
64
+ < span className = "mx_EditableItem_promptText" >
65
+ { _t ( "Are you sure?" ) }
66
+ </ span >
67
+ < AccessibleButton onClick = { this . _onActuallyRemove } kind = "primary_sm"
68
+ className = "mx_EditableItem_confirmBtn" >
69
+ { _t ( "Yes" ) }
70
+ </ AccessibleButton >
71
+ < AccessibleButton onClick = { this . _onDontRemove } kind = "danger_sm"
72
+ className = "mx_EditableItem_confirmBtn" >
73
+ { _t ( "No" ) }
74
+ </ AccessibleButton >
75
+ </ div >
76
+ ) ;
77
+ }
78
+
79
+ return (
80
+ < div className = "mx_EditableItem" >
81
+ < img src = { require ( "../../../../res/img/feather-icons/cancel.svg" ) } width = { 14 } height = { 14 }
82
+ onClick = { this . _onRemove } className = "mx_EditableItem_delete" alt = { _t ( "Remove" ) } />
83
+ < span className = "mx_EditableItem_item" > { this . props . value } </ span >
84
+ </ div >
85
+ ) ;
86
+ }
87
+ }
88
+
89
+ export default class EditableItemList extends React . Component {
90
+ static propTypes = {
91
+ items : PropTypes . arrayOf ( PropTypes . string ) . isRequired ,
92
+ itemsLabel : PropTypes . string ,
93
+ noItemsLabel : PropTypes . string ,
94
+ placeholder : PropTypes . string ,
121
95
122
- render : function ( ) {
96
+ onItemAdded : PropTypes . func ,
97
+ onItemRemoved : PropTypes . func ,
98
+
99
+ canEdit : PropTypes . bool ,
100
+ } ;
101
+
102
+ _onItemAdded = ( e ) => {
103
+ e . stopPropagation ( ) ;
104
+ e . preventDefault ( ) ;
105
+
106
+ if ( ! this . refs . newItem ) return ;
107
+
108
+ const value = this . refs . newItem . value ;
109
+ if ( this . props . onItemAdded ) this . props . onItemAdded ( value ) ;
110
+ } ;
111
+
112
+ _onItemRemoved = ( index ) => {
113
+ if ( this . props . onItemRemoved ) this . props . onItemRemoved ( index ) ;
114
+ } ;
115
+
116
+ _renderNewItemField ( ) {
117
+ return (
118
+ < form onSubmit = { this . _onAddClick } autoComplete = { false }
119
+ noValidate = { true } className = "mx_EditableItemList_newItem" >
120
+ < Field id = "newEmailAddress" ref = "newItem" label = { this . props . placeholder }
121
+ type = "text" autoComplete = "off" />
122
+ < AccessibleButton onClick = { this . _onItemAdded } kind = "primary" >
123
+ { _t ( "Add" ) }
124
+ </ AccessibleButton >
125
+ </ form >
126
+ )
127
+ }
128
+
129
+ render ( ) {
123
130
const editableItems = this . props . items . map ( ( item , index ) => {
124
131
return < EditableItem
125
132
key = { index }
126
133
index = { index }
127
- initialValue = { item }
128
- onChange = { this . onItemEdited }
129
- onRemove = { this . onItemRemoved }
130
- placeholder = { this . props . placeholder }
134
+ value = { item }
135
+ onRemove = { this . _onItemRemoved }
131
136
/> ;
132
137
} ) ;
133
138
134
- const label = this . props . items . length > 0 ?
135
- this . props . itemsLabel : this . props . noItemsLabel ;
139
+ const label = this . props . items . length > 0 ? this . props . itemsLabel : this . props . noItemsLabel ;
136
140
137
141
return ( < div className = "mx_EditableItemList" >
138
142
< div className = "mx_EditableItemList_label" >
139
143
{ label }
140
144
</ div >
141
145
{ editableItems }
142
- { this . props . canEdit ?
143
- // This is slightly evil; we want a new instance of
144
- // EditableItem when the list grows. To make sure it's
145
- // reset to its initial state.
146
- < EditableItem
147
- key = { editableItems . length }
148
- initialValue = { this . props . newItem }
149
- onAdd = { this . onItemAdded }
150
- onChange = { this . onNewItemChanged }
151
- addOnChange = { true }
152
- placeholder = { this . props . placeholder }
153
- /> : < div />
154
- }
146
+ { this . props . canEdit ? this . _renderNewItemField ( ) : < div /> }
155
147
</ div > ) ;
156
- } ,
157
- } ) ;
148
+ }
149
+ }
0 commit comments