annotate .cms/js/menu.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 document.addEventListener( "DOMContentLoaded", function( event ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 function _( str ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 return __( str, "menu.mod.php" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 function select3( selects ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 selects.forEach( function( select ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 // именно keyup чтобы не пересекалось с input
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 select.querySelector( "input" ).addEventListener( "keyup", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 api( { fn: "get_search_pages_list", search: this.value }, function( r ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 if ( r.html ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 select.querySelector( ".list-search" ).innerHTML = r.html;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 select.querySelectorAll( ".list-search li" ).forEach( function( li ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 li.addEventListener( "click", select3_li );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 // prevent close dropdown when click on input
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 select.querySelector( "input" ).addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 e.stopPropagation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 // show/hide dropdown list
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 select.querySelector( ".field-select" ).addEventListener( "click", function ( event ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 event.stopPropagation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 this.parentElement.classList.toggle( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 let list = event.currentTarget.nextElementSibling;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 // это можно убрать если переставить стили на родителя
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 list.classList.toggle( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 if ( list.classList.contains( "open" ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 let input = select.querySelector( "input" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 input.focus();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 input.dispatchEvent( new Event( "keyup" ) );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 // click selected item
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 function select3_li( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 let id = this.getAttribute( "data-id" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 let url = this.getAttribute( "data-url" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 let title = this.innerText;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 let input_title = this.closest( ".select-grid" ).querySelector( ".field-select" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 let old_id = input_title.getAttribute( "data-old-id" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 input_title.querySelector( ".value" ).innerText = title;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 input_title.setAttribute( "data-id", id );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 // поменять url в поле ввода
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 let input_url = this.closest( ".menu-prop" ).querySelector( "input[name='url']" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 input_url.value = url;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 // поменять заголовок и ссылку вверху
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 let a = this.closest( ".item" ).querySelector( ":scope > a" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 a.setAttribute( "href", cms.base_path + url );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 let replaced_title = this.closest( ".menu-prop" ).querySelector( `input[name="title"]` ).value;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 if ( replaced_title ) title = replaced_title;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 a.innerText = title;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 if ( id === "0" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 input_url.removeAttribute( "disabled" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 input_url.setAttribute( "disabled", true );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 // remove li except data-id=0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 Array.from( this.parentElement.children ).forEach( function( li ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 if ( li.getAttribute( "data-id" ) !== "0" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 li.remove();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 // close dropdown list
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 input_title.click();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 // изменение
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 if ( old_id != id ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 input_title.dispatchEvent( new Event( "input" ) );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 api( { fn: "get_menu_items" }, set_menu_items );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 function set_menu_items( r ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 document.querySelector( "#menu .menu-grid" ).innerHTML = r.list;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 // set parents for each menu item
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 document.querySelectorAll( "#menu [data-parent]" ).forEach( function( el ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 el.nextElementSibling.insertAdjacentHTML( "beforeend", r.parents );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 let pid = el.getAttribute( "data-parent" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 let parent = el.nextElementSibling.querySelector( `[value="${pid}"]` ).innerText.trim();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 el.querySelector( ".value" ).innerText = parent;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 // remove self
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 let self = el.closest( "[data-item]" ).getAttribute( "data-item" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 self = el.nextElementSibling.querySelector( `[value="${self}"]` );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 if ( self ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 self.remove();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 // selects
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 let selects = document.querySelectorAll( "#menu .select-grid" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 select3( selects );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 // Select
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 document.querySelectorAll( "#menu .area-select-grid .field-select-menu, #menu .parent-select-grid .field-select" ).forEach( function( select ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 select.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 e.stopPropagation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 this.parentElement.classList.toggle( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 // это можно убрать если переставить стили на родителя
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 select.nextElementSibling.classList.toggle( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 // Option for menu
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 document.querySelectorAll( "#menu .area-select-grid .field-options .option" ).forEach( function( option ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 option.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 let input = this.closest( ".area-select-grid" ).querySelector( ".field-select-menu" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 let old_val = input.getAttribute( "data-menu-area" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 let new_val = this.getAttribute( "value" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 if ( old_val != new_val ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 input.querySelector( ".value" ).innerText = this.innerText;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 input.setAttribute( "data-menu-area", new_val );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 // Событие изменения
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 let event = new Event( "input" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 input.dispatchEvent( event );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 //e.stopPropagation(); убираем чтобы закрылось автоматически
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 // Option for item
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 document.querySelectorAll( "#menu .parent-select-grid .field-options .option" ).forEach( function( option ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 option.addEventListener( "click", parent_li_click );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 function parent_li_click( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 let input = this.closest( ".parent-select-grid" ).querySelector( ".field-select" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 let old_val = input.getAttribute( "data-parent" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 let new_val = this.getAttribute( "value" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 if ( old_val != new_val ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 input.querySelector( ".value" ).innerText = this.innerText.trim();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 input.setAttribute( "data-parent", new_val );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 // Событие изменения
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 let event = new Event( "input" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 input.dispatchEvent( event );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 //e.stopPropagation(); убираем чтобы закрылось автоматически
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 // Toggle Menu Properties
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 let prop_buttons = document.querySelectorAll( "#menu .menu-buttons .prop" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 prop_buttons.forEach( function( button ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 button.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 e.stopPropagation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 this.closest( "[data-item]" ).classList.toggle( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 // Отлавливать изменения полей в меню чтобы показать Сохранить
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 document.querySelectorAll( "#menu .menu" ).forEach( function( menu ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 menu.querySelectorAll( "input, .field-select-menu" ).forEach( function( input ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 input.addEventListener( "input", function( event ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 let menu = this.closest( ".menu" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 menu.classList.add( "changed" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 // Отлавливать изменения полей в пунктах чтобы показать Сохранить
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 document.querySelectorAll( "#menu .item" ).forEach( function( item ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 item.querySelectorAll( "input, .field-select" ).forEach( function( input ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 input.addEventListener( "input", function( event ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 let item = this.closest( ".item" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 item.classList.add( "changed" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 // Save Properties
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 document.querySelectorAll( "#menu .menu-buttons .save" ).forEach( function( button ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 button.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 e.stopPropagation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 let item = this.closest( "[data-item]" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 let mid = item.getAttribute( "data-item" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 let area = item.querySelector( "[data-menu-area]" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 if ( area ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 area = area.getAttribute( "data-menu-area" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 let tag_title = item.querySelector( "[name='tag_title']" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 if ( tag_title ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 tag_title = tag_title.value;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 let url = item.querySelector( "[name='url']" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 if ( url ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 url = url.value;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 let id = item.querySelector( "[name='id']" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 if ( id ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 id = id.getAttribute( "data-id" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 let pid_el = item.querySelector( "[data-parent]" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 let pid,old_pid;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 if ( pid_el ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 pid = pid_el.getAttribute( "data-parent" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 old_pid = pid_el.getAttribute( "data-old-parent" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 let target = item.querySelector( "[name='targetblank']" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 if ( target ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213 target = target.checked;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 let old_sort_el = item.querySelector( "[name='sort']" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217 let old_sort = old_sort_el.getAttribute( "data-sort" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 let data = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 fn: "save_menu_item",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 mid: mid,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222 title: item.querySelector( "[name='title']" ).value,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223 tag_title: tag_title,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
224 url: url,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
225 id: id,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
226 pid: pid,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
227 old_pid: old_pid,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
228 classes: item.querySelector( "[name='classes']" ).value,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
229 sort: item.querySelector( "[name='sort']" ).value,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
230 area: area,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
231 target: target
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
232 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
233 document.querySelectorAll( `#menu [data-item]` ).forEach( function( el ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
234 el.classList.remove( "last-edited" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
235 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
236 api( data, function( r ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
237 if ( r.ok == "false" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
238 notify( r.info_text, r.info_class, r.info_time );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
239 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
240 if ( r.ok == "true" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
241 item.classList.remove( "changed" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
242 let item_with_childs = item.parentElement;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
243 if ( r.list ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
244 set_menu_items( r );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
245 } else if ( old_sort != data.sort ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
246 // пересортировка имеет смысл если не было замены всего списка
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
247 // обновить сортировку для сравнения
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
248 old_sort_el.setAttribute( "data-sort", data.sort );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
249 let grid;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
250 if ( data.area === null ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
251 grid = item.closest( ".items-grid" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
252 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
253 grid = item.closest( ".menu-grid" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
254 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
255 let before = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
256 for ( let n = 0; n < grid.children.length; n++ ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
257 let node = grid.children[n];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
258 if ( node != item_with_childs ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
259 let sort = node.querySelector( '[data-item] [name="sort"]' ).value;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
260 if ( +data.sort < +sort ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
261 before = node;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
262 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
263 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
264 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
265 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
266 grid.insertBefore( item_with_childs, before );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
267 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
268
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
269 // Замена title
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
270 let title;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
271 if ( data.title != "" )
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
272 title = data.title;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
273 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
274 title = item.querySelector( ".select-grid .value" ).innerText;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
275 item.querySelector( ":scope > a" ).innerText = title;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
276
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
277 // обновить родителей у подпунктов
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
278 // поскольку мог измениться title
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
279 // и только у строго дочерних, которых может и не быть
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
280 let childs_grid = item.nextElementSibling;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
281 if ( childs_grid ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
282 let childs_selector = childs_grid.querySelectorAll( ":scope > div > .item .parent-select-grid" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
283
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
284 if ( childs_selector ) childs_selector.forEach( function( grid ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
285 let input = grid.querySelector( "[data-parent]" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
286 let pid = input.getAttribute( "data-parent" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
287 let options = grid.querySelector( ":scope > .field-options" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
288 options.innerHTML = r.parents;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
289 options.querySelectorAll( ".option" ).forEach( function( option ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
290 option.addEventListener( "click", parent_li_click );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
291 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
292 // тайтл вычисляется выше
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
293 input.querySelector( ".value" ).innerText = title;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
294 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
295 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
296
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
297 // Last Edited Marker
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
298 setTimeout( function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
299 document.querySelector( `#menu [data-item="${data.mid}"]` ).classList.add( "last-edited" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
300 }, 200 );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
301 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
302 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
303 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
304 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
305
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
306 // Delete Menu or Item
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
307 document.querySelectorAll( "#menu .menu-buttons .del" ).forEach( function( button ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
308 button.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
309 e.stopPropagation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
310 clear_highlite();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
311 let item = button.closest( ".item,.menu" ).parentNode;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
312 item.classList.add( "will-be-deleted" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
313 setTimeout( function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
314 if ( ! confirm( __( "confirm_delete", "menu.mod.php" ) ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
315 item.classList.remove( "will-be-deleted" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
316 return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
317 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
318 let data = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
319 fn: "del_menu_item",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
320 mid: button.closest( "[data-item]" ).getAttribute( "data-item" )
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
321 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
322 api( data, function( r ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
323 if ( r.info_text ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
324 notify( r.info_text, r.info_class, r.info_time );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
325 if ( r.info_class == "info-success" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
326 set_menu_items( r );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
327 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
328 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
329 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
330 }, 20 );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
331 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
332 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
333
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
334 // Create Item
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
335 document.querySelectorAll( "#menu .main-main .append" ).forEach( function( button ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
336 button.addEventListener( "click", modMenuCreate );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
337 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
338
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
339 // Линия к родителю
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
340 let items = document.querySelectorAll( "#menu .item" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
341 items.forEach( function( el ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
342 el.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
343 // Если опускание мыши было не на нас, то игнорим
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
344 if ( mouse_down_el != this ) return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
345 mouse_down_el = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
346 let highlited = this.classList.contains( "highlite-children" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
347 clear_highlite();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
348 // Назначить классы
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
349 if ( ! highlited ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
350 this.classList.add( "highlite-children" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
351 this.closest( ".items-grid" ).classList.add( "highlite-parent" );;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
352 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
353 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
354 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
355 // Опускание мыши
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
356 // Возможна ситуация когда нажатие мыши было на кнопке Свойства,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
357 // а отпускание на плашке. В этом случае может появиться линия к родителю.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
358 // Поэтому нужно записывать что опускание было на плашке или панельке кнопок.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
359 let mouse_down_el; // элемент на котором было опускание мыши
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
360 items.forEach( function( el ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
361 el.addEventListener( "mousedown", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
362 // чтобы проигнорировать клики по дочерним
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
363 if ( e.target == this )
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
364 mouse_down_el = this;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
365 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
366 // див с кнопками можно тыкать
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
367 let mb = el.querySelector( ".menu-buttons" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
368 if ( mb ) mb.addEventListener( "mousedown", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
369 // чтобы проигнорировать клики по дочерним
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
370 if ( e.target == this )
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
371 mouse_down_el = this.parentElement;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
372 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
373 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
374 // Сбросить классы
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
375 function clear_highlite() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
376 document.querySelectorAll( "#menu .items-grid.highlite-parent" ).forEach( function( el ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
377 el.classList.remove( "highlite-parent" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
378 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
379 document.querySelectorAll( "#menu .item.highlite-children" ).forEach( function( el ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
380 el.classList.remove( "highlite-children" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
381 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
382 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
383
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
384 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
385
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
386 // Select
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
387 // Закрытие выпадающих списков при кликах вне их, а так же по ним
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
388 document.body.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
389 // это можно убрать если переставить стили на родителя
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
390 document.querySelectorAll( "#menu .field-options" ).forEach( function( list ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
391 list.classList.remove( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
392 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
393
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
394 document.querySelectorAll( "#menu .area-select-grid, #menu .select-grid, #menu .parent-select-grid" ).forEach( function( list ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
395 list.classList.remove( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
396 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
397 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
398
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
399 // Создание меню или пункта меню
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
400 function modMenuCreate( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
401 e.stopPropagation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
402 let pid = this.closest( "[data-item]" ).getAttribute( "data-item" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
403 api( { fn : "create_menu_item", pid : pid }, function( r ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
404 if ( r.info_text ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
405 notify( r.info_text, r.info_class, r.info_time );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
406 if ( r.info_class == "info-success" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
407 set_menu_items( r );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
408 let item = document.querySelector( `#menu [data-item="${r.mid}"]` );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
409 item.classList.add( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
410 item.classList.add( "last-edited" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
411 // Докрутить к новому элементу
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
412 item.scrollIntoView( { behavior: "smooth", block: "center" } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
413 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
414 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
415 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
416 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
417
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
418 // Create Menu
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
419 document.querySelector( "#menu .main-footer .create" ).addEventListener( "click", modMenuCreate );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
420
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
421 // update page used in menu
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
422 document.body.addEventListener( "update_menu", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
423 api( { fn: "get_menu_items" }, set_menu_items );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
424 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
425
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
426 } );