1
- import ListComponent from "./list-component.js" ;
2
1
import store from "./store/index.js" ;
3
2
import { request } from "./network.js" ;
3
+ import ButtonsComponent from "./buttons-component.js" ;
4
4
5
- export default class ItemComponent extends ListComponent {
5
+ export default class ItemComponent extends ButtonsComponent {
6
6
constructor ( ) {
7
7
super ( ) ;
8
- this . itemsArray = document
9
- . getElementsByClassName ( 'content__main-results-list-item-buttons' ) ;
10
8
11
9
this . itemAnchor = document
12
10
. querySelector ( '.content__main-results-list' ) ;
13
11
14
12
15
13
}
16
14
17
- onInit ( ) {
15
+ onInitItem ( item , value ) {
18
16
console . log ( 'ItemComponent initialized' ) ;
19
- this . render ( ) ;
20
-
17
+ this . render ( item , value ) ;
18
+ this . setupListeners ( item ) ;
21
19
}
22
20
23
- editItem ( ) {
21
+ /*
22
+ TODO: найти причину и исправить ошибку
23
+ (описание): после срабатывания 3го раза продряд условия if, консоль выдает
24
+ ошибку, окно редактора не открывается, если завершать редктирование (менять
25
+ значение элемента), то ошибка не всплывает.
26
+ */
27
+ // Подставляет в элемент списка форму для редактирования
28
+ onReadyToEditItem ( item , value ) {
29
+ const list = document . querySelector ( '.content__main-results-list' ) ;
30
+ let editingItem = list . getElementsByClassName ( 'edit-list-form' ) ;
31
+ console . log ( editingItem ) ;
32
+
33
+ /*
34
+ Условие If срабатывает тогда, когда у нас уже один элемент открыт в режиме
35
+ редактирования но мы хотим незавершая его переключиться на редактирование
36
+ другого элемента
37
+ */
38
+ if ( editingItem . length ) {
39
+ let anchor = editingItem [ 0 ] . parentElement ;
40
+ let value = editingItem [ 0 ] . firstElementChild . getAttribute ( 'value' ) ;
41
+ // console.log( anchor );
42
+ // console.log( value );
43
+ this . renderList ( value , anchor ) ;
44
+ this . renderButtons ( anchor ) ;
45
+ this . render ( anchor . lastElementChild ) ;
24
46
47
+ } else {
48
+ this . onInitItem ( item , value ) ;
49
+ console . log ( item , value ) ;
50
+ }
25
51
}
26
52
27
- render ( ) {
28
- console . log ( 'ItemComponent rendered' ) ;
29
- // console.log( this.anchorItem );
30
- Array . prototype . forEach . call ( this . itemsArray , item => item . innerHTML = `
31
- <a class="content__main-results-list-item-buttons-done done-button"></a>
32
- <a class="content__main-results-list-item-buttons-delete delete-button"></a>
33
- <a class="content__main-results-list-item-buttons-edit edit-button"></a>
34
- ` ) ;
35
- this . setupListeners ( )
53
+ async applyEditingItem ( event ) {
54
+ if ( event . key === 'Enter' || event . type === 'click' ) {
55
+ event . preventDefault ( ) ;
56
+
57
+ let item = document . querySelector ( '#edit-item-input' ) ;
58
+ let value = item . value . trim ( ) ;
59
+ let anchor = item . parentElement . parentElement ;
60
+ let id = item . parentElement . parentElement . id ;
61
+
62
+ if ( value . length >= 5 ) {
63
+
64
+ this . value = '' ;
65
+ await request . updateItemRequest ( id , false , value ) ;
66
+
67
+ this . renderList ( value , anchor ) ;
68
+ this . onInitButtons ( ) ;
69
+
70
+ request . readSingleTodoRequest ( id ) . then ( obj => {
71
+ store . dispatch ( 'addItem' , {
72
+ createDate : obj . createDate ,
73
+ completed : obj . completed ,
74
+ completedAt : obj . completedAt ,
75
+ id : obj . _id ,
76
+ text : obj . text ,
77
+ creator : obj . creator ,
78
+ } ) ;
79
+ } ) ;
80
+ } else {
81
+ // TODO: rework it!
82
+ alert ( '5 characters minimum' ) ;
83
+ this . form . focus ( ) ;
84
+ }
85
+ }
86
+ } ;
87
+
88
+ render ( item , value ) {
89
+ console . log ( value , item ) ;
90
+ if ( item && value ) {
91
+ console . log ( value , item . parentElement ) ;
92
+ item . parentElement . innerHTML = `
93
+ <form class="content__main-header-form-block edit-list-form">
94
+ <input id="edit-item-input" class="content__main-header-form-block-input"
95
+ type="text" placeholder="Type your note" value="${ value } ">
96
+ <a id="edit-item-button"
97
+ class="content__main-header-form-block-button">Add</a>
98
+ </form>
99
+ ` ;
100
+ console . log ( 'ItemComponent rendered' ) ;
101
+ }
36
102
}
37
103
38
- setupListeners ( ) {
39
- this . anchor . querySelectorAll ( '.delete-button' ) . forEach ( ( button , id ) => {
40
- let idNumber = button . parentElement . parentElement . id ;
41
- button . addEventListener ( 'click' , async ( ) => {
42
- store . dispatch ( 'removeItem' , { id} ) ;
43
- await request . deleteItem ( idNumber ) ;
104
+ setupListeners ( value ) {
105
+ if ( value ) {
106
+ const form = this . itemAnchor . querySelector ( '.content__main-header-form-block' ) ;
107
+ const editButton = document . getElementById ( 'edit-item-button' ) ;
44
108
45
- this . renderList ( ) ;
46
- } )
109
+ form . addEventListener ( 'keydown' , this . applyEditingItem . bind ( this ) ) ;
110
+ editButton . addEventListener ( 'click' , this . applyEditingItem . bind ( this ) ) ;
47
111
}
48
112
49
- )
50
- // this.anchor.querySelectorAll('.delete-button').forEach
51
- // console.log( this.anchor.getElementsByClassName('delete -button') );
52
- // Array.prototype. forEach.call(this.anchor.getElementsByClassName('delete-button'), (button , id) => {
53
- //
54
- // let a = button .parentElement.parentElement.id ;
55
- //
56
- // button .addEventListener('click', (function() {
57
- // store.dispatch('removeItem ', {id});
58
- // // console.log( button.parentElement.parentElement.id );
59
- //
60
- // console.log( a );
61
- //
62
- // request.deleteItem(a);
63
- // this.renderList();
64
- //
65
- // }).bind(this)
66
- // )
67
- //
68
- // }
69
- //
70
- //
71
- // )
113
+ // Добавляем событие на кнопку списка, которое открывает редактор элемента
114
+ // (кнопка доступна только на мобильных устройствах)
115
+ this . itemAnchor . querySelectorAll ( '.edit -button')
116
+ . forEach ( ( listItem , id ) => {
117
+ let itemText = listItem . parentElement . previousElementSibling . innerText ;
118
+ let editedItem = listItem . parentElement ;
119
+
120
+ listItem . addEventListener ( 'click' , ( ) => {
121
+ store . dispatch ( 'editItem ' , { id} ) ;
122
+ this . onReadyToEditItem ( editedItem , itemText ) ;
123
+ } )
124
+ } ) ;
125
+
126
+ // Добавляем событие на элемент списка, которое открывает редактор элемента
127
+ this . itemAnchor . querySelectorAll ( '.content__main-results-list-item-text' )
128
+ . forEach ( ( listItem , id ) => {
129
+ let itemText = listItem . innerText ;
130
+
131
+ listItem . addEventListener ( 'click' , ( ) => {
132
+ store . dispatch ( 'editItem' , { id } ) ;
133
+ this . onReadyToEditItem ( listItem , itemText ) ;
134
+ } )
135
+ } ) ;
72
136
}
73
137
}
0 commit comments