1+ import TagHandler from "./TagHandler.js" ;
12class VueDashboard {
23 constructor ( ) {
34 this . months = [
@@ -66,6 +67,18 @@ class VueDashboard {
6667 yearRange : 1 ,
6768 defaultDate : new Date ( ) ,
6869 } ) ;
70+ document . querySelectorAll ( ".channels_wrapper" ) . forEach ( el => new TagHandler ( {
71+ elementWrapper : el ,
72+ dataset : document . channels ,
73+ textarea : el . parentElement . querySelector ( "textarea" ) ,
74+ type : "channel"
75+ } ) ) ;
76+ document . querySelectorAll ( ".users_wrapper" ) . forEach ( el => new TagHandler ( {
77+ elementWrapper : el ,
78+ dataset : document . users ,
79+ textarea : el . parentElement . querySelector ( "textarea" ) ,
80+ type : "user"
81+ } ) ) ;
6982 M . FormSelect . init ( document . querySelectorAll ( "select" ) ) ;
7083 this . addEventListener ( ) ;
7184 }
@@ -75,13 +88,7 @@ class VueDashboard {
7588 document . querySelector ( ".schedule-add-btn" ) . addEventListener ( "click" , ( ) => this . addCronModal . open ( ) ) ;
7689 document . querySelector ( ".timer-add-btn" ) . addEventListener ( "click" , ( ) => this . addTimerModal . open ( ) ) ;
7790 document . querySelector ( ".guild-timezone" ) . addEventListener ( "click" , ( ) => this . timezoneModal . open ( ) ) ;
78- document . querySelectorAll ( "textarea" ) . forEach ( el => {
79- el . addEventListener ( "input" , ( ) => this . onInputTextarea ( el ) ) ;
80- el . addEventListener ( "keydown" , ( event ) => this . onKeyPressedTextarea ( event , el ) ) ;
81- } ) ;
8291 document . querySelector ( ".autocomplete" ) . addEventListener ( "change" , ( e ) => this . onInputAutoComplete ( e ) ) ;
83- document . querySelectorAll ( ".user_el" ) . forEach ( el => el . addEventListener ( "click" , ( ) => this . onUserClick ( el ) ) ) ;
84- document . querySelectorAll ( ".channel_el" ) . forEach ( el => el . addEventListener ( "click" , ( ) => this . onChannelClick ( el ) ) ) ;
8592 document . querySelector ( "#setTimezone .modal-confirm" ) . addEventListener ( "click" , ( ) => this . onConfirmSetTimer ( ) ) ;
8693 document . querySelector ( "#options_modal .delete" ) . addEventListener ( "click" , ( ) => this . onRemoveEl ( ) ) ;
8794 document . querySelector ( "#options_modal .edit" ) . addEventListener ( "click" , ( ) => this . onOpenEdit ( ) ) ;
@@ -97,37 +104,6 @@ class VueDashboard {
97104 } ) ;
98105 this . removeCron_modalConfirm . addEventListener ( "click" , ( ) => this . onConfirmRemoveCron ( ) ) ;
99106 }
100-
101- onInputTextarea ( element ) {
102- const data = element . value ;
103- const channels_wrapper = element . parentNode . querySelector ( ".channels_wrapper" ) ;
104- const users_wrapper = element . parentNode . querySelector ( ".users_wrapper" ) ;
105- if ( data . charAt ( data . length - 1 ) == "@" ) {
106- users_wrapper . classList . remove ( "scale-out" ) ;
107- users_wrapper . classList . add ( "scale-in" ) ;
108- this . sortUsers ( element , true ) ;
109- } else if ( data . charAt ( data . length - 1 ) == "#" ) {
110- channels_wrapper . classList . remove ( "scale-out" ) ;
111- channels_wrapper . classList . add ( "scale-in" ) ;
112- this . sortUsers ( element , true ) ;
113- } else if ( ( data . charAt ( data . length - 1 ) == " " || data == "" ) && channels_wrapper . classList . contains ( "scale-in" ) ) {
114- channels_wrapper . classList . remove ( "scale-in" ) ;
115- channels_wrapper . classList . add ( "scale-out" ) ;
116- this . sortUsers ( element , true ) ;
117- } else if ( ( data . charAt ( data . length - 1 ) == " " || data == "" ) && users_wrapper . classList . contains ( "scale-in" ) ) {
118- users_wrapper . classList . remove ( "scale-in" ) ;
119- users_wrapper . classList . add ( "scale-out" ) ;
120- this . sortUsers ( element , true ) ;
121- if ( users_wrapper . querySelector ( ".selected" ) )
122- users_wrapper . querySelector ( ".selected" ) . classList . remove ( "selected" ) ;
123- } else if ( channels_wrapper . classList . contains ( "scale-in" ) ) {
124- this . sortChannels ( element ) ;
125- } else if ( users_wrapper . classList . contains ( "scale-in" ) ) {
126- this . sortUsers ( element ) ;
127- if ( channels_wrapper . querySelector ( ".selected" ) )
128- channels_wrapper . querySelector ( ".selected" ) . classList . remove ( "selected" ) ;
129- }
130- }
131107 onInputAutoComplete ( e ) {
132108 //Bug patched for selecting :
133109 if ( e . target . value in this . timezoneSelector . options . data || " " + e . target . value in this . timezoneSelector . options . data )
@@ -136,134 +112,6 @@ class VueDashboard {
136112 this . addTimezone . classList . add ( "disabled" ) ;
137113 }
138114
139- onUserClick ( element ) {
140- const user = element . innerText ;
141- const textarea = element . parentNode . parentNode . querySelector ( "textarea" ) ;
142- const users_wrapper = element . parentNode . parentNode . querySelector ( ".users_wrapper" ) ;
143- textarea . value = textarea . value . substring ( 0 , textarea . value . lastIndexOf ( "@" ) ) + user ;
144- for ( let el of document . users ) {
145- const nickname = el . nickname || el . username ;
146- if ( "@" + nickname == user ) {
147- document . users . push ( el ) ;
148- break ;
149- }
150- }
151- M . textareaAutoResize ( textarea ) ;
152- users_wrapper . classList . remove ( "scale-in" ) ;
153- users_wrapper . classList . add ( "scale-out" ) ;
154- if ( users_wrapper . querySelector ( ".selected" ) )
155- users_wrapper . querySelector ( ".selected" ) . classList . remove ( "selected" ) ;
156- }
157- onChannelClick ( element ) {
158- const channel = element . innerText ;
159- const textarea = element . parentNode . parentNode . querySelector ( "textarea" ) ;
160- const channels_wrapper = element . parentNode . parentNode . querySelector ( ".channels_wrapper" ) ;
161- textarea . value = textarea . value . substring ( 0 , textarea . value . lastIndexOf ( "#" ) ) + channel ;
162- M . textareaAutoResize ( textarea ) ;
163- channels_wrapper . classList . remove ( "scale-in" ) ;
164- channels_wrapper . classList . add ( "scale-out" ) ;
165- if ( channels_wrapper . querySelector ( ".selected" ) )
166- channels_wrapper . querySelector ( ".selected" ) . classList . remove ( "selected" ) ;
167- }
168-
169- sortChannels ( element , clear ) {
170- const data = element . value ;
171- const wrapper = element . parentNode . querySelector ( ".channels_wrapper" ) ;
172- const keyword = data . substring ( data . lastIndexOf ( "#" ) + 1 , data . length ) ;
173- if ( ! clear ) {
174- const elsToHide = document . channels . filter ( el => ! el . name . toLowerCase ( ) . includes ( keyword . toLowerCase ( ) ) ) ;
175- const elsToShow = document . channels . filter ( el => el . name . toLowerCase ( ) . includes ( keyword . toLowerCase ( ) ) ) ;
176- elsToHide . forEach ( el => wrapper . querySelector ( 'div[data-id="' + el . id + '"]' ) . classList . add ( "hidden" ) ) ;
177- elsToShow . forEach ( el => wrapper . querySelector ( 'div[data-id="' + el . id + '"]' ) . classList . remove ( "hidden" ) ) ;
178- } else {
179- wrapper . querySelectorAll ( ".hidden" ) . forEach ( el => el . classList . remove ( "hidden" ) ) ;
180- }
181- }
182- sortUsers ( element , clear ) {
183- const data = element . value ;
184- const wrapper = element . parentNode . querySelector ( ".users_wrapper" ) ;
185- const keyword = data . substring ( data . lastIndexOf ( "@" ) + 1 , data . length ) ;
186- if ( ! clear ) {
187- const elsToHide = document . users . filter ( el => el . nickname ? ! el . nickname . toLowerCase ( ) . includes ( keyword . toLowerCase ( ) ) : ! el . username . toLowerCase ( ) . includes ( keyword . toLowerCase ( ) ) ) ;
188- const elsToShow = document . users . filter ( el => el . nickname ? el . nickname . toLowerCase ( ) . includes ( keyword . toLowerCase ( ) ) : el . username . toLowerCase ( ) . includes ( keyword . toLowerCase ( ) ) ) ;
189- elsToHide . forEach ( el => wrapper . querySelector ( 'div[data-id="' + el . id + '"]' ) . classList . add ( "hidden" ) ) ;
190- elsToShow . forEach ( el => wrapper . querySelector ( 'div[data-id="' + el . id + '"]' ) . classList . remove ( "hidden" ) ) ;
191- } else {
192- wrapper . querySelectorAll ( ".hidden" ) . forEach ( el => el . classList . remove ( "hidden" ) ) ;
193- }
194- }
195-
196- onKeyPressedTextarea ( event , element ) {
197- const tag_wrapper = element . parentNode . querySelector ( ".scale-in" ) ;
198- if ( ! tag_wrapper ) return ; //Si la fenêtre est pas affiché on fait rien
199- //Sinon on fait un déplacement gauche/droite/haut/bas des flêches pour sélectionner les tags
200- if ( event . keyCode == 40 || event . keyCode == 39 ) {
201- event . preventDefault ( ) ;
202- this . moveTagRight ( tag_wrapper ) ;
203- } else if ( event . keyCode == 38 || event . keyCode == 37 ) {
204- event . preventDefault ( ) ;
205- this . moveTagLeft ( tag_wrapper ) ;
206- } else if ( event . keyCode == 13 ) {
207- event . preventDefault ( ) ;
208- tag_wrapper . querySelector ( ".selected" ) . click ( ) ;
209- }
210- }
211-
212- moveTagRight ( tag_wrapper ) {
213- const selected = tag_wrapper . querySelector ( ".selected" ) ;
214- if ( selected ) {
215- if ( selected . nextElementSibling ) {
216- for ( let i = Array . prototype . indexOf . call ( tag_wrapper . children , selected ) + 1 ; i < tag_wrapper . children . length ; i ++ ) {
217- const el = tag_wrapper . children [ i ] ;
218- if ( ! el . classList . contains ( "hidden" ) ) {
219- el . classList . add ( "selected" ) ;
220- selected . classList . remove ( "selected" ) ;
221- break ;
222- }
223- }
224- } else {
225- for ( let el of tag_wrapper . children ) {
226- if ( ! el . classList . contains ( "hidden" ) ) {
227- selected . classList . remove ( "selected" ) ;
228- el . classList . add ( "selected" ) ;
229- break ;
230- }
231- }
232- }
233- } else {
234- //Si jamais l'utilisateur n'a pas encore appuyé sur une flèche alors le premier élément sera celui sans hidden
235- for ( let el of tag_wrapper . children ) {
236- if ( ! el . classList . contains ( "hidden" ) ) {
237- el . classList . add ( "selected" ) ;
238- break ;
239- }
240- }
241- }
242- }
243- moveTagLeft ( tag_wrapper ) {
244- const selected = tag_wrapper . querySelector ( ".selected" ) ;
245- if ( selected ) {
246- if ( selected . previousElementSibling ) {
247- for ( let i = Array . prototype . indexOf . call ( tag_wrapper . children , selected ) - 1 ; i >= 0 ; i -- ) {
248- const el = tag_wrapper . children [ i ] ;
249- if ( ! el . classList . contains ( "hidden" ) ) {
250- el . classList . add ( "selected" ) ;
251- selected . classList . remove ( "selected" ) ;
252- break ;
253- }
254- }
255- }
256- } else {
257- for ( let i = tag_wrapper . children . length - 1 ; i >= 0 ; i -- ) {
258- const el = tag_wrapper . children [ i ] ;
259- if ( ! el . classList . contains ( "hidden" ) ) {
260- el . classList . add ( "selected" ) ;
261- break ;
262- }
263- }
264- }
265- }
266-
267115 onChangeEachSelect ( ) {
268116 if ( this . eachSelect . value == "week" ) {
269117 this . timePickerWrapper . style . display = "block" ;
@@ -282,7 +130,7 @@ class VueDashboard {
282130
283131 onConfirmAddCron ( ) {
284132 if ( ! this . form . checkValidity ( ) ) {
285- M . toast ( { html : "You message has to be more thicc!" } ) ;
133+ M . toast ( { html : "You're message has to be more thicc!" } ) ;
286134 return ;
287135 }
288136 const eachVal = this . eachSelect . value ;
0 commit comments