PluginProbe ʕ •ᴥ•ʔ
Code Manager / 1.0.44
Code Manager v1.0.44
1.0.48 1.0.47 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.2 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 1.0.25 1.0.26 1.0.27 1.0.28 1.0.3 1.0.30 1.0.31 1.0.32 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.38 1.0.39 1.0.4 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9
code-manager / assets / js / code_manager_tabmode.js
code-manager / assets / js Last commit date
code_manager.js 9 months ago code_manager_dashboard.js 9 months ago code_manager_listmode.js 9 months ago code_manager_message.js 9 months ago code_manager_tabmode.js 9 months ago notify.min.js 9 months ago
code_manager_tabmode.js
899 lines
1 /**
2 * JavaScript code to build Code Manager IDE in tab mode
3 *
4 * @author Peter Schulz
5 * @since 1.0.0
6 */
7
8 const PHP_DEFAULT = '<?php\n\n?>';
9
10 var user_has_edited = {};
11
12 var current_url = window.location.href.split('?');
13 var default_url = current_url[0] + '?page=code_manager';
14
15 var href = window.location.href;
16 var pathname = href.substring(0, href.lastIndexOf('/')) + '/admin-ajax.php';
17
18 var tabs = 0;
19 var cm_editors = {};
20 var new_label_index = 0;
21
22 function option_in_code_list(option_value) {
23 found = false;
24 jQuery('#code_manager_code_list option').each(function() {
25 if (this.value === option_value) {
26 found = true;
27 return true;
28 }
29 });
30 return found;
31 }
32
33 function get_code_list(callback) {
34 jQuery.ajax({
35 method: 'POST',
36 url: pathname + '?action=code_manager_get_code_list',
37 data: {
38 wpnonce: wpnonce,
39 page: 'code_manager_post'
40 }
41 }).done(
42 function(msg) {
43 try {
44 obj = JSON.parse(msg);
45
46 if (Array.isArray(obj)) {
47 jQuery('#code_manager_code_list').empty();
48 maxLength = 0;
49 codeTypes = {};
50 // Determine max length
51 for (var key in obj) {
52 if (obj[key].code_name.length>maxLength) {
53 maxLength = obj[key].code_name.length;
54 }
55 }
56 // Add option - use monospace to right align code types
57 for (var key in obj) {
58 if (!is_code_edited(obj[key].code_id)) {
59 jQuery('#code_manager_code_list')
60 .append(
61 jQuery('<option>', {value: obj[key].code_id})
62 .html(obj[key].code_name + "&nbsp;".repeat( maxLength - obj[key].code_name.length) + "&nbsp;&nbsp;&minus;&nbsp;&nbsp;" + obj[key].code_type)
63 .attr('data-name', obj[key].code_name)
64 .attr('data-type', obj[key].code_type)
65 .attr('data-enabled', obj[key].code_enabled)
66 .attr('data-preview', obj[key].preview_enabled)
67 );
68 codeTypes[obj[key].code_type] = true;
69 }
70 }
71 // Update filters
72 jQuery("#code_manager_filter_code_type").empty();
73 jQuery("#code_manager_filter_code_type")
74 .append(
75 jQuery("<option>", {value: ""})
76 .html("Filter code type")
77 );
78
79 var code_types = "";
80 if (typeof code_manager_code_groups !== "undefined") {
81 for (var code_group in code_manager_code_groups) {
82 code_types += '<optgroup label="' + code_group + '">';
83 code_manager_code_group = code_manager_code_groups[code_group];
84 for (var label in code_manager_code_group) {
85 code_types +=
86 '<option class="hide" value="' + label + '">' +
87 code_manager_code_group[label] +
88 '</option>';
89 }
90 code_types += '</optgroup>';
91 }
92 }
93 jQuery("#code_manager_filter_code_type").append(code_types);
94 Object.keys(codeTypes).sort().forEach(function(codeType, index) {
95 jQuery("#code_manager_filter_code_type option[value='" + codeType + "']").removeClass("hide");
96 });
97 jQuery("#code_manager_filter_code_type option.hide").remove();
98 jQuery(jQuery("#code_manager_filter_code_type optgroup").each(function(index) {
99 if (jQuery(jQuery("#code_manager_filter_code_type optgroup")[index]).children().length===0) {
100 jQuery(jQuery("#code_manager_filter_code_type optgroup")[index]).remove();
101 }
102 }));
103
104 callback();
105 }
106 }
107 catch (e) {
108 if (msg.substr(0, 3) === 'ERR') {
109 jQuery.notify(msg, "error");
110 } else {
111 jQuery.notify(e, "error");
112 }
113 }
114 }
115 );
116 }
117
118 function is_code_edited(code_id) {
119 for (var editor in cm_editors) {
120 if (cm_editors[editor].tab_code_index==code_id) {
121 return true;
122 }
123 }
124 return false;
125 }
126
127 function get_code(code_id, code_name, code_type, code_enabled, preview_enabled) {
128 jQuery.ajax({
129 method: 'POST',
130 url: pathname + '?action=code_manager_get_code',
131 data: {
132 wpnonce: wpnonce_get_code,
133 code_id: code_id,
134 page: 'code_manager_post'
135 }
136 }).done(
137 function(msg) {
138 if (msg==='ERR-Not authorized') {
139 jQuery.notify('Not authorized', 'error');
140 } else if (msg==='ERR-Wrong arguments') {
141 jQuery.notify('Wrong arguments', 'error');
142 } else {
143 tab_load(code_id, code_name, code_type, msg, code_enabled, preview_enabled);
144 }
145 }
146 );
147 }
148
149 function set_copy_shortcode_link(tab) {
150 if (cm_editors[tab].tab_code_index!==-1 && jQuery("#tab-" + tab + "-code_type").val().includes("shortcode")) {
151 code_name = jQuery("#tab-" + tab + "-label").text();
152 jQuery("#tab-" + tab + "-shortcode_link").html(`
153 <a href="javascript:void(0)" class="dashicons dashicons-image-rotate" onclick="jQuery('#cm_copy_id${tab}').toggle(); jQuery('#cm_copy_name${tab}').toggle();" style="vertical-align:middle"></a>
154 <span id="cm_copy_id${tab}" style="display:none">
155 [cmruncode id="${cm_editors[tab].tab_code_index}"]
156 <a href="javascript:void(0)" class="dashicons dashicons-clipboard c2c"
157 onclick="jQuery.notify(&quot;Shortcode copied to clipboard&quot;, &quot;info&quot;)"
158 data-clipboard-text="[cmruncode id=&quot;${cm_editors[tab].tab_code_index}&quot;]"
159 title="Copy shortcode to clipboard" style="vertical-align:middle"
160 ></a>
161 </span>
162 <span id="cm_copy_name${tab}">
163 [cmruncode name="${code_name}"]
164 <a href="javascript:void(0)" class="dashicons dashicons-clipboard c2c"
165 onclick="jQuery.notify(&quot;Shortcode copied to clipboard&quot;, &quot;info&quot;)"
166 data-clipboard-text="[cmruncode name=&quot;${code_name}&quot;]"
167 title="Copy shortcode to clipboard" style="vertical-align:middle"
168 ></a>
169 </span>
170 `);
171 new ClipboardJS('.c2c');
172 } else {
173 jQuery("#tab-" + tab + "-shortcode_link").html('');
174 }
175 }
176
177 function tab_unselect() {
178 jQuery('.nav-tab-active').removeClass('nav-tab-active');
179 jQuery('.nav-tab-content').hide();
180 }
181
182 function tab_new(tab_label, code_id = -1, code_type = 'PHP Shortcode', code = '', code_enabled = 0, preview_enabled = 'false') {
183 tab_unselect();
184
185 code_types = '';
186 if (code_manager_code_groups) {
187 for (var code_group in code_manager_code_groups) {
188 code_types += '<optgroup label="' + code_group + '">';
189 code_manager_code_group = code_manager_code_groups[code_group];
190 for (var label in code_manager_code_group) {
191 if (code_type === label) {
192 selected = ' selected';
193 } else {
194 selected = '';
195 }
196 code_types +=
197 '<option value="' + label + '"' + selected + '>' +
198 code_manager_code_group[label] +
199 '</option>';
200 }
201 code_types += '</optgroup>';
202 }
203 }
204
205 jQuery('#code_manager_taskbar_tabmode')
206 .append(
207 '<a id="tab-' + tabs + '" href="javascript:void(0)" class="nav-tab nav-tab-active" onclick="tab_clicked(' + tabs + ')" data-code-manager-tab="' + tabs + '">' +
208 '<span id="tab-' + tabs + '-label" contenteditable="true" class="code_manager_tab_label cm_tooltip" data-code-manager-tab="' + tabs + '" title="Double click to change code name">' + tab_label + '</span>' +
209 '<span id="tab-' + tabs + '-icon" class="dashicons dashicons-dismiss icon_close" onclick="tab_close(this,event,' + tabs + ')"></span>' +
210 '</a>'
211 );
212
213 var editorSettings = cm_settings;
214 if (code_type.includes('html')) {
215 // Load HTML settings
216 editorSettings = wp.codeEditor.defaultSettings ? _.clone( wp.codeEditor.defaultSettings ) : {};
217 editorSettings.codemirror = _.extend(
218 {},
219 editorSettings.codemirror,
220 {
221 mode: 'html',
222 }
223 );
224 } else if (code_type.includes('css')) {
225 // Load CSS settings
226 editorSettings = wp.codeEditor.defaultSettings ? _.clone( wp.codeEditor.defaultSettings ) : {};
227 editorSettings.codemirror = _.extend(
228 {},
229 editorSettings.codemirror,
230 {
231 mode: 'css',
232 }
233 );
234 } if (code_type.includes('javascript')) {
235 // Load JavaScript settings
236 editorSettings = wp.codeEditor.defaultSettings ? _.clone( wp.codeEditor.defaultSettings ) : {};
237 editorSettings.codemirror = _.extend(
238 {},
239 editorSettings.codemirror,
240 {
241 mode: 'javascript',
242 }
243 );
244 } else {
245 // Load PHP settings (default = cm_settings)
246 if (code==='') {
247 code = PHP_DEFAULT;
248 }
249 }
250
251 code_id_displayed = code_id==-1 ? 'new' : code_id;
252 code_is_enabled = code_enabled==0 ? '' : 'checked';
253 code_preview_enabled = preview_enabled=='false' ? '' : 'checked';
254
255 if (code_type.includes('file')) {
256 element_code_enabled =
257 '<select id="tab-' + tabs + '-cb-enable" ' + code_is_enabled + ' onchange="return tab_icon_enable(' + tabs + ')" title="Enable code" class="cm_tooltip" style="margin-right:15px">' +
258 '<option value="0">Disabled</option>' +
259 '<option value="1">Admin enabled</option>' +
260 '<option value="2">Public enabled</option>' +
261 '<option value="3">Both enabled</option>' +
262 '</select>';
263 } else {
264 element_code_enabled =
265 '<label class="cm_tooltip" style="padding-right:15px" title="Enable code">' +
266 '<input type="checkbox" id="tab-' + tabs + '-cb-enable" ' + code_is_enabled + ' onclick="return tab_icon_enable(' + tabs + ')" />' +
267 'Enable' +
268 '</label>';
269 }
270
271 jQuery('#code_manager_workspace_tabmode')
272 .append(
273 '<div id="tab-' + tabs + '-div" class="nav-tab-content">' +
274 '<div id="tab-' + tabs + '-taskbar" class="tab_task_bar">' +
275 '<a href="javascript:void(0)" class="button non-active cm_tooltip" id="tab-' + tabs + '-icon-save" disabled="true" onclick="tab_icon_save(' + tabs + ')" title="Save code">' +
276 '<span class="dashicons dashicons-yes-alt" style="padding-top: 4px;"></span>' +
277 '</a>' +
278 '&nbsp;' +
279 '<select id="tab-' + tabs + '-code_type" class="cm_tooltip" title="Select code type">' +
280 code_types +
281 '</select>' +
282 '&nbsp;' +
283 '<span>ID: ' +
284 '<span id="tab-' + tabs + '-code_id" style="font-weight: bold">' + code_id_displayed + '</span>' +
285 '</span>' +
286 '<span id="tab-' + tabs + '-shortcode_link" style="padding-left:10px"></span>' +
287 '<span style="float:right;line-height:2">' +
288 element_code_enabled +
289 '<label class="cm_tooltip" style="padding-right:5px" title="Enable preview mode for this code"><input type="checkbox" class="cm-cb-preview" id="tab-' + tabs + '-cb-preview"' + code_preview_enabled + ' onclick="return tab_icon_preview(' + tabs + ')" />Preview</label>' +
290 '<a href="javascript:void(0)"><i class="fas fa-redo cm_tooltip" style="font-size: 20px; vertical-align: middle" title="Refresh tab" onclick="return tab_refresh(' + tabs + ')"></i></a>' +
291 '</span>' +
292 '</div>' +
293 '<div id="tab-' + tabs + '-code" class="tab_code" data-code-manager-tab="' + tabs + '">' +
294 '<textarea id="tab-' + tabs + '-content">' +
295 code.replace(/<\/textarea>/g, '&lt;/textarea&gt;').replace(/&(?!amp;)/g, '&amp;') +
296 '</textarea>' +
297 '</div>' +
298 '</div>'
299 );
300
301 // Rewrite textarea closing tag if applicable
302 let textArea = jQuery("#tab-" + tabs + "-content").text();
303 jQuery("#tab-" + tabs + "-content").text(textArea.replace(/&lt;\/textarea&gt;/g, '<\/textarea>'));
304
305 var tab_editor = wp.codeEditor.initialize(jQuery('#tab-' + tabs + '-content'), editorSettings);
306
307 tab_editor.codemirror.focus();
308 tab_editor.codemirror.setCursor(1);
309 tab_editor.codemirror.setOption('tabindex', tabs);
310
311 var editor = {
312 tab_index: tabs,
313 tab_code_index: code_id,
314 tab_label: tab_label,
315 tab_editor: tab_editor
316 };
317 cm_editors[tabs] = editor;
318 user_has_edited[tabs] = false;
319
320 tab_editor.codemirror.on('change', function(cm_editor){
321 tab_changed(cm_editor.getOption('tabindex'));
322 });
323
324 // Enable tooltip
325 jQuery('.cm_tooltip').tooltip();
326
327 // Add shortcode link if applicable
328 set_copy_shortcode_link(tabs);
329
330 jQuery('#tab-' + tabs + '-code_type').on('focus', function(event) {
331 jQuery(this).data({current_value:jQuery(this).val()});
332 });
333
334 jQuery('#tab-' + tabs + '-code_type').on('change', {tab:tabs,cid:code_id}, function(event) {
335 if (event.data.cid===-1) {
336 if (jQuery('#tab-' + event.data.tab + '-code_type option:selected').text().toLowerCase().includes('php')) {
337 // Add php tags
338 if (cm_editors[event.data.tab].tab_editor.codemirror.getValue()==='') {
339 cm_editors[event.data.tab].tab_editor.codemirror.setValue(PHP_DEFAULT);
340 }
341 } else {
342 // Remove php tags (clear field)
343 if (cm_editors[event.data.tab].tab_editor.codemirror.getValue()===PHP_DEFAULT) {
344 cm_editors[event.data.tab].tab_editor.codemirror.setValue('');
345 }
346 }
347
348 tab_changed(event.data.tab);
349 return;
350 }
351
352 html = '<div>Are you sure you want to change the code type? Due to possible errors, this code will be disabled!</div>';
353 var dialog =
354 jQuery(html)
355 .data('current_element',jQuery(this))
356 .data('current_value',jQuery.data(this, 'current_value'))
357 .data('current_tab',event.data.tab)
358 .dialog({
359 dialogClass: 'no-close',
360 title: 'Change code type?',
361 buttons: {
362 'Yes': function() {
363 tab_changed(jQuery.data(this, 'current_tab'));
364 jQuery("#tab-" + event.data.tab + "-cb-enable").prop("checked", false);
365 set_copy_shortcode_link(event.data.tab);
366 dialog.dialog('destroy');
367 },
368 'No': function() {
369 jQuery(jQuery.data(this, 'current_element')).val(jQuery.data(this, 'current_value'));
370 dialog.dialog('destroy');
371 },
372 'Cancel': function() {
373 jQuery(jQuery.data(this, 'current_element')).val(jQuery.data(this, 'current_value'));
374 dialog.dialog('destroy');
375 }
376 }
377 });
378 });
379
380 jQuery('#tab-' + tabs + '-label').on('input', {tab:tabs}, function(event) {
381 tab_changed(event.data.tab);
382 });
383
384 jQuery('#tab-' + tabs + '-label').on('dblclick', function() {
385 var cell = this;
386 var range, selection;
387 if (document.body.createTextRange) {
388 range = document.body.createTextRange();
389 range.moveToElementText(cell);
390 range.select();
391 } else if (window.getSelection) {
392 selection = window.getSelection();
393 range = document.createRange();
394 range.selectNodeContents(cell);
395 selection.removeAllRanges();
396 selection.addRange(range);
397 }
398 });
399
400 tabs++;
401 }
402
403 function tab_changed(tabindex) {
404 user_has_edited[tabindex] = true;
405 jQuery('#tab-' + tabindex + '-icon').addClass('tab_unsaved_changes');
406 jQuery('#tab-' + tabindex + '-icon-save').removeClass('non-active').attr('disabled', false);
407 }
408
409 function activate_code_on_server(tab, val, txt) {
410 jQuery.ajax({
411 type: 'POST',
412 url: pathname + '?action=code_manager_activate_code',
413 data: {
414 code_id: cm_editors[tab].tab_code_index,
415 code_item_value: val,
416 wpnonce: wpnonce,
417 page: 'code_manager_post'
418 }
419 }).done(
420 function (msg) {
421 if ( msg.substr(0, 3) === 'UPD' ) {
422 jQuery.notify(txt, 'success');
423 } else {
424 jQuery.notify('Settings not saved', 'error');
425 }
426 }
427 ).fail(
428 function () {
429 jQuery.notify('The request could not be handled', 'error');
430 }
431 );
432
433 }
434
435 function tab_refresh(tab) {
436 if (cm_editors[tab].tab_code_index===-1) {
437 jQuery.notify('Code needs to be saved first', 'error');
438 } else {
439 jQuery.ajax({
440 method: 'POST',
441 url: pathname + '?action=code_manager_get_code',
442 data: {
443 wpnonce: wpnonce_get_code,
444 code_id: cm_editors[tab].tab_code_index,
445 page: 'code_manager_post',
446 wpda_action: 'all'
447 }
448 }).done(
449 function(json) {
450 cm_editors[tab].tab_label = json.code_name;
451
452 cm = cm_editors[tab].tab_editor.codemirror;
453 cm.setValue(json.code);
454 cm.save();
455
456 jQuery("#tab-" + tab + "-label").text(json.code_name);
457 jQuery("#tab-" + tab + "-code_type").val(json.code_type);
458 jQuery("#tab-" + tab + "-cb-enable").prop("checked", json.code_enabled==="1");
459
460 mark_tab_as_unchanged(cm);
461
462 set_copy_shortcode_link(tab);
463
464 jQuery.notify('Refresh completed', 'success');
465 }
466 );
467 jQuery.ajax({
468 method: 'POST',
469 url: pathname + '?action=code_manager_is_code_preview_enabled',
470 data: {
471 wpnonce: wpnonce_get_code,
472 code_id: cm_editors[tab].tab_code_index,
473 page: 'code_manager_post',
474 }
475 }).done(
476 function(data) {
477 jQuery("#tab-" + tab + "-cb-preview").prop("checked", data==="true");
478 }
479 );
480 }
481 }
482
483 function activate_preview_on_server(tab) {
484 jQuery.ajax({
485 method: 'POST',
486 url: pathname + '?action=code_manager_activate_code_preview',
487 data: {
488 wpnonce: wpnonce,
489 code_id: cm_editors[tab].tab_code_index,
490 page: 'code_manager_post'
491 }
492 }).done(
493 function(msg) {
494 if (msg==='OK') {
495 jQuery.notify('Preview activated', 'success');
496 } else {
497 jQuery.notify(msg, 'error');
498 }
499 }
500 );
501 }
502
503 function tab_open() {
504 removeIntro();
505 get_code_list(tab_open_callback);
506 }
507
508 function tab_open_callback() {
509 var dialog = jQuery(jQuery('#code_manager_open_frame')).dialog({
510 dialogClass: 'no-close',
511 width: "inherit",
512 resizable: false,
513 title: 'Select code from list',
514 buttons: {
515 'Open': function() {
516 var code_list = [];
517 jQuery('#code_manager_code_list option:selected').each(function() {
518 if (jQuery(this).is(":visible")) {
519 code_list.push(jQuery(this).val());
520 }
521 });
522 if (code_list.length===0) {
523 alert("Nothing selected!")
524 } else {
525 if (code_list[0]==='Loading data...') {
526 alert("Nothing selected!")
527 } else {
528 for (var i=0; i<code_list.length; i++) {
529 get_code(
530 code_list[i],
531 jQuery('#code_manager_code_list option[value=' + code_list[i] + ']').attr('data-name'),
532 jQuery('#code_manager_code_list option[value=' + code_list[i] + ']').attr('data-type'),
533 jQuery('#code_manager_code_list option[value=' + code_list[i] + ']').attr('data-enabled'),
534 jQuery('#code_manager_code_list option[value=' + code_list[i] + ']').attr('data-preview')
535 );
536 }
537 dialog.dialog('close');
538 }
539 }
540 },
541 'Cancel': function() {
542 dialog.dialog('close');
543 }
544 }
545 });
546
547 jQuery("#code_manager_code_list").unbind("dblclick");
548 jQuery("#code_manager_code_list").on("dblclick", function() {
549 tab = jQuery(this).val()[0];
550 get_code(
551 tab,
552 jQuery('#code_manager_code_list option[value=' + tab + ']').attr('data-name'),
553 jQuery('#code_manager_code_list option[value=' + tab + ']').attr('data-type'),
554 jQuery('#code_manager_code_list option[value=' + tab + ']').attr('data-enabled'),
555 jQuery('#code_manager_code_list option[value=' + tab + ']').attr('data-preview')
556 );
557 dialog.dialog('close');
558 });
559 }
560
561 function tab_close(elem, event, tab) {
562 if (user_has_edited[tab]===true) {
563 html = '<div>Your changes will not be saved!</div>';
564 var dialog = jQuery(html).dialog({
565 dialogClass: 'no-close',
566 title: 'Close tab?',
567 buttons: {
568 'Yes': function() {
569 close_tab(elem, tab);
570 dialog.dialog('destroy');
571 },
572 'No': function() {
573 dialog.dialog('destroy');
574 },
575 'Cancel': function() {
576 dialog.dialog('destroy');
577 }
578 }
579 });
580 } else {
581 close_tab(elem, tab);
582 }
583 event.stopPropagation();
584 }
585 function close_tab(elem, tab) {
586 jQuery(elem).parent().remove();
587 jQuery('#tab-' + tab + '-div').remove();
588
589 cm = cm_editors[tab].tab_editor.codemirror;
590 cm.setOption('mode', 'text/x-csrc');
591 cm.getWrapperElement().parentNode.removeChild(cm.getWrapperElement());
592 cm=null;
593 delete cm_editors[tab];
594 delete user_has_edited[tab];
595
596 if (!jQuery('.nav-tab-active').length) {
597 index_selected = -1;
598
599 for (editor in cm_editors) {
600 tab_index = cm_editors[editor].tab_editor.codemirror.getOption('tabindex');
601 if (index_selected>tab) {
602 break;
603 }
604 index_selected = tab_index;
605 }
606
607 if (index_selected>-1) {
608 tab_activate(index_selected);
609 }
610 }
611 }
612
613 function tab_activate(tab) {
614 jQuery('#tab-' + tab).addClass('nav-tab-active');
615 jQuery('#tab-' + tab + '-div').show();
616 }
617
618 function tab_load(code_id, tab_label, code_type, code, code_enabled, preview_enabled) {
619 tab_new(tab_label, code_id, code_type, code, code_enabled, preview_enabled);
620 }
621
622 function tab_clicked(tab) {
623 source_id = jQuery('.nav-tab-active').attr('data-code-manager-tab');
624 if (source_id===tab) {
625 return;
626 }
627
628 jQuery('.nav-tab-active').removeClass('nav-tab-active');
629 jQuery('.nav-tab-content').hide();
630 jQuery('#tab-' + tab).addClass('nav-tab-active');
631 jQuery('#tab-' + tab + '-div').show();
632 }
633
634 function tab_icon_save(tab) {
635 tab_label = jQuery('#tab-' + tab + '-label').text();
636 old_label = cm_editors[tab].tab_label;
637 if (old_label!==tab_label) {
638 code_name_exists(tab_label, old_label, tab)
639 } else {
640 save_code(tab);
641 }
642 }
643
644 function code_name_exists(code_name, old_label, tab) {
645 jQuery.ajax({
646 method: 'POST',
647 url: pathname + '?action=code_manager_code_name_exists',
648 data: {
649 wpnonce: wpnonce_get_code,
650 code_name: code_name,
651 page: 'code_manager_post'
652 }
653 }).done(
654 function(msg) {
655 if (msg!=='OK') {
656 jQuery.notify('Name already exists', 'error');
657 jQuery('#tab-' + tab + '-label').text(old_label);
658 } else {
659 save_code(tab);
660 }
661 }
662 );
663 }
664
665 function save_code(tab, successmsg = 'Code saved') {
666 if (user_has_edited[tab]===false) {
667 return;
668 }
669
670 cm = cm_editors[tab].tab_editor.codemirror;
671 cm.save();
672
673 jQuery.ajax({
674 method: 'POST',
675 url: pathname + '?action=code_manager_update_code',
676 data: {
677 wpnonce: wpnonce,
678 code_id: cm_editors[tab].tab_code_index>0 ? cm_editors[tab].tab_code_index : -1,
679 code_name: jQuery('#tab-' + tab + '-label').text(),
680 code_type: jQuery('#tab-' + tab + '-code_type').val(),
681 code: jQuery('#tab-' + tab + '-content').val(),
682 page: 'code_manager_post'
683 }
684 }).done(
685 function(msg) {
686 if ( msg.substr(0, 3) === 'UPD' ) {
687 jQuery.notify(successmsg, 'success');
688 mark_tab_as_unchanged(cm);
689 set_copy_shortcode_link(tab);
690 } else if ( msg.substr(0, 3) === 'INS' ) {
691 code_id = msg.substr(4);
692 cm_editors[tab].tab_code_index = code_id;
693 jQuery('#tab-' + tab + '-code_id').html(code_id);
694 set_copy_shortcode_link(tab);
695 jQuery.notify(successmsg, 'success');
696 mark_tab_as_unchanged(cm);
697 } else {
698 if (msg.length>50) {
699 errormsg = 'ERROR : ' + msg.substr(0,50) + '...';
700 } else {
701 errormsg = msg;
702 }
703 jQuery.notify(errormsg, 'error');
704 }
705 }
706 );
707 }
708
709 function mark_tab_as_unchanged(cm_editor) {
710 tabindex = cm_editor.getOption('tabindex');
711 user_has_edited[tabindex] = false;
712 jQuery('#tab-' + tabindex + '-icon').removeClass('tab_unsaved_changes');
713 jQuery('#tab-' + tabindex + '-icon-save').addClass('non-active').attr('disabled', true);
714 }
715
716 function tab_icon_enable(tab) {
717 if (cm_editors[tab].tab_code_index===-1) {
718 jQuery.notify('Your code must be saved before it can be enabled', 'info');
719 return false;
720 }
721
722 if (jQuery('#tab-' + tab + '-cb-enable').attr('type')==='checkbox') {
723 if (jQuery('#tab-' + tab + '-cb-enable').is(':checked')) {
724 val = '1';
725 txt = 'Code enabled';
726 } else {
727 val = '0';
728 txt = 'Code disabled';
729 }
730 } else {
731 val = jQuery('#tab-' + tab + '-cb-enable').val();
732 txt = 'Code ' + jQuery('#tab-' + tab + '-cb-enable :selected').text().toLowerCase();
733 }
734
735 activate_code_on_server(tab, val, txt);
736
737 return true;
738 }
739
740 function tab_icon_preview(tab) {
741 if (cm_editors[tab].tab_code_index===-1) {
742 jQuery.notify('Your code must be saved before it can be previewed', 'info');
743 return false;
744 }
745
746 if (jQuery('#tab-' + tab + '-cb-preview').is(':checked')) {
747 // Activate preview
748 activate_preview_on_server(tab);
749 } else {
750 // Deactivate preview
751 tab_icon_deactivate(tab);
752 }
753
754 return true;
755 }
756
757 function tab_icon_deactivate(tab) {
758 jQuery.ajax({
759 method: 'POST',
760 url: pathname + '?action=code_manager_deactivate_code_preview',
761 data: {
762 wpnonce: wpnonce,
763 code_id: cm_editors[tab].tab_code_index,
764 page: 'code_manager_post'
765 }
766 }).done(
767 function(msg) {
768 if ( msg === 'OK' ) {
769 jQuery.notify('Preview deactivated', 'success');
770 } else {
771 jQuery.notify(msg, 'error');
772 }
773 }
774 );
775 }
776
777 function unsaved_changes() {
778 has_edited = false;
779
780 for (var tabindex in user_has_edited) {
781 if (user_has_edited[tabindex]===true) {
782 has_edited = true;
783 }
784 }
785
786 return has_edited;
787 }
788
789 function reset_preview() {
790 jQuery.ajax({
791 type: 'POST',
792 url: pathname + '?action=code_manager_reset_preview',
793 data: {
794 wpnonce: wpnonce,
795 page: 'code_manager_post'
796 }
797 }).done(
798 function (msg) {
799 if ( msg === 'OK' ) {
800 jQuery.notify(msg, 'success');
801 jQuery('.cm-cb-preview').prop('checked', false);
802 } else {
803 jQuery.notify(msg, 'info');
804 }
805 }
806 ).fail(
807 function () {
808 jQuery.notify(msg, 'error');
809 }
810 );
811 }
812
813 function removeIntro() {
814 jQuery(".cm_tab_mode_intro").remove();
815 }
816
817 jQuery(function() {
818 jQuery('#code_manager_new').on('click', function(e) {
819 removeIntro();
820
821 var tabLabel = "New";
822 if (new_label_index>0) {
823 tabLabel += "_" + new_label_index;
824 }
825 tab_new(tabLabel, -1);
826 new_label_index++;
827 });
828
829 jQuery('#code_manager_open').on('click', function(e) {
830 tab_open();
831 });
832
833 jQuery('#code_manager_cancel_file').on('click', function() {
834 jQuery('#code_manager_open_frame').hide();
835 });
836
837 jQuery('#code_manager_taskbar_tabmode').sortable();
838
839 jQuery(window).on('keydown', function(event) {
840 if ((event.ctrlKey || event.metaKey) && String.fromCharCode(event.which).toLowerCase()==='s') {
841 if (
842 jQuery(event.target).hasClass('CodeMirror-code') ||
843 jQuery(event.target).hasClass('code_manager_tab_label')
844 ) {
845 if (jQuery(event.target).hasClass('CodeMirror-code')) {
846 tab_code = jQuery(event.target).closest('.tab_code');
847 tab = tab_code.attr('data-code-manager-tab');
848 } else {
849 tab = jQuery(event.target).attr('data-code-manager-tab');
850 }
851 if (typeof tab !== typeof undefined && tab !== false) {
852 save_code(tab);
853 event.preventDefault();
854 }
855 }
856 } else if (
857 (event.ctrlKey || event.metaKey) &&
858 String.fromCharCode(event.which).toLowerCase()==='v' &&
859 jQuery(event.target).hasClass('code_manager_tab_label')
860 ) {
861 event.preventDefault(); // Prevent ctrl-v on tab label
862 }
863 });
864
865 jQuery('.cm_menu_title').tooltip();
866 jQuery('#disable_preview').tooltip();
867 jQuery('#disable_preview').on('click', function() {
868 html = "<div>This turns of preview mode for all code IDs for all users. Do you want to continue?</div>";
869 var dialog = jQuery(html).dialog({
870 dialogClass: 'no-close',
871 title: 'Reset preview',
872 buttons: {
873 'Yes': function() {
874 dialog.dialog('destroy');
875 reset_preview();
876 },
877 'No': function() {
878 dialog.dialog('destroy');
879 },
880 'Cancel': function() {
881 dialog.dialog('destroy');
882 }
883 }
884 });
885 });
886
887 jQuery(window).on('beforeunload', function() {
888 if ( unsaved_changes() ) {
889 return 'Your changes will not be saved! Are you sure you want to leave this page?';
890 }
891 });
892
893 setTimeout(function() {
894 jQuery(".cm_tab_mode_intro").fadeOut(2000, function() {
895 removeIntro();
896 });
897 }, 4000);
898 });
899