annotate .cms/js/template.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, "template.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 // Edit file
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 document.querySelectorAll( "#template .template-files .file" ).forEach( function( button ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 button.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 let file = this.innerText;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 // get file from server
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 api( { fn: "get_template_file", file: file }, function( r ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 if ( r.ok == "true" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 document.querySelector( ".template-editor-title" ).innerText = file;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 document.querySelector( ".template-editor > textarea" ).value = r.file;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 // Show Editor
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 document.querySelector( ".template-editor-bg" ).classList.remove( "hidden" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 document.body.classList.add( "editor" ); // for notifications
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 let ext = file.match( /\.[^\.]+$/, "" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 let aext = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 ".php" : "application/x-httpd-php",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 ".html" : "application/x-httpd-php",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 ".css" : "text/css"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 let atags = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 ".php" : "php",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 ".html" : "html",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 ".css" : "css"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 // Отображаем подходящие теги, остальные прячем
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 document.querySelectorAll( `#template .template-editor-bg .snip-grid > *` ).forEach( function( el ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 if ( el.classList.contains( atags[ext] ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 el.classList.remove( "hidden" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 el.classList.add( "hidden" );
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 // Подключаем редактор Codemirror функцией расположенной в admin.js
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 codemirror_connect( "#template .template-editor > textarea", "cmt", { mode: aext[ext] } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 // track changes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 document.querySelector( ".close-template-button" ).setAttribute( "data-changed", "false" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 cmt.on( "change", function( cmt, change ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 document.querySelector( ".close-template-button" ).setAttribute( "data-changed", "true" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 document.querySelector( ".template-editor-grid" ).setAttribute( "data-changed", "true" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 // set cursor to editor
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 cmt.focus();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 // Save Teplate Ctrl+S
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 document.querySelector( "body" ).addEventListener( "keydown", CtrlS );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 document.querySelector( ".template-editor-grid" ).setAttribute( "data-changed", "false" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 // Для сниппетов
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 document.querySelectorAll( "#template .snip-grid [data-type='snip']" ).forEach( function( btn ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 btn.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 let text = this.getAttribute( "data-text" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 let cm = window["cmt"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 if ( cm ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 let otag = this.getAttribute( "data-otag" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 let ctag = this.getAttribute( "data-ctag" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 let selections = cm.getSelections();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 let replacements = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 for ( let i = 0; i < selections.length; i++ ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 replacements[i] = otag + selections[i] + ctag;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 cm.replaceSelections( replacements );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 // с курсорами пока не понятен алгоритм
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 /*
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 selections = cm.listSelections();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 let shift = +this.getAttribute( "data-len" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 if ( shift != 0 ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 for ( let i = 0; i < selections.length; i++ ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 selections[i].head.ch += shift;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 selections[i].anchor.ch += shift;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 cm.focus();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 cm.refresh();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 // Close Editor
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 document.querySelectorAll( ".close-template-button" ).forEach( function( button ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 button.onclick = function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 document.querySelector( "body" ).removeEventListener( "keydown", CtrlS );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 // detach
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 if ( window.cmt !== undefined ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 if ( this.getAttribute( "data-changed" ) === "true" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 if ( confirm( _( "confirm_save" ) ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 document.querySelector( ".save-template-button" ).setAttribute( "data-close", "true" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 document.querySelector( ".save-template-button" ).click();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 window.cmt.toTextArea();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 window.cmt = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 // hide editor
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 document.querySelector( ".template-editor-bg" ).classList.add( "hidden" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 document.body.classList.remove( "template_editor" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 //window.prevent_reload = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 // Save File
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 document.querySelectorAll( ".save-template-button" ).forEach( function( button ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 button.onclick = function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 window.cmt.save(); // drop changes to textarea
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 let data = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 fn: "save_template_file",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 file: document.querySelector( ".template-editor-title" ).innerText,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 content: document.querySelector( ".template-editor > textarea" ).value
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 api( data, function( r ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 if ( r.info_text ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 notify( r.info_text, r.info_class, r.info_time );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 if ( r.ok == "true" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 //?
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 document.querySelector( ".close-template-button" ).setAttribute( "data-changed", "false" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 // hide changed indicator
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 document.querySelector( ".template-editor-grid" ).setAttribute( "data-changed", "false" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 // highlight save button
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 document.querySelector( ".save-template-button" ).classList.add( "saved" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 setTimeout( function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 document.querySelector( ".save-template-button" ).classList.remove( "saved" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 }, 1000 );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 // close editor after save only if ok
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 if ( document.querySelector( ".save-template-button" ).getAttribute( "data-close" ) === "true" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 document.querySelector( ".save-template-button" ).setAttribute( "data-close", "false" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 document.querySelector( ".close-template-button" ).click();
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 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 function CtrlS( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 // ы and і - fix for librewolf
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 if ( ( e.code == "KeyS" || e.key == "ы" || e.key == "і" ) && e.ctrlKey == true ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 e.preventDefault(); // don't save page
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 if ( window.location.hash == "#template" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 document.querySelector( ".save-template-button" ).click();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 // Install template (upload template)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 let input = document.querySelector( "#template-upload" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 input.addEventListener( "change", async function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 const formData = new FormData();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 formData.append( "fn", "install_template" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 for ( let i = 0; i < input.files.length; i++ ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 formData.append( "myfile[]", input.files[i] );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 try {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 const response = await fetch( cms.api, { method: "POST", body: formData } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 const r = await response.json();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 input.value = ""; // chrome fix
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 if ( r.info_text ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 notify( r.info_text, r.info_class, r.info_time );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 setTimeout( function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 window.location.reload( true );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 }, r.info_time );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 } catch ( error ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 console.error( "Error:", error );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 // prevent hide cursor when window resize
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 window.addEventListener( "resize", function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 if ( window.cmt ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 let cursor = window.cmt.getCursor();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 window.cmt.scrollIntoView( { line:cursor.line, ch:cursor.ch } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 // Select
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 document.querySelectorAll( "#template .field-select" ).forEach( function( select ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 select.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 e.stopPropagation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 this.parentElement.classList.toggle( "open" );
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 select.nextElementSibling.classList.toggle( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 // Option
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 document.querySelectorAll( "#template .field-options .option" ).forEach( function( option ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 option.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 let input = this.closest( ".template-select-grid" ).querySelector( ".field-select" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 input.querySelector( ".value" ).innerText = this.innerText;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 document.querySelector( "#template input[name='template']" ).value = this.innerText;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 // Select
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 // Закрытие выпадающих списков при кликах вне их, а так же по ним
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 document.body.addEventListener( "click", function( e ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213 document.querySelectorAll( "#template .template-select-grid" ).forEach( function( list ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 list.classList.remove( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217 // это можно убрать если переставить стили на родителя
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218 document.querySelectorAll( "#template .field-options" ).forEach( function( list ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 list.classList.remove( "open" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 } );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223 } );