2026-02-05 17:08:59 +03:00

418 lines
11 KiB
JavaScript

/**
* Contains all dynamic functionality needed on post and term pages.
*
* @summary Control page and term functionality.
*/
// Make sure the wp object exists.
window.wp = window.wp || {};
let mainwp_post_newmeta_submit = function (action, me) {
if (action != 'add' && action != 'delete' && action != 'update')
return false;
let data;
let newkey;
if (action == 'add') {
let metakey = jQuery('#metakeyselect').val();
newkey = false;
if (jQuery('#metakeyinput').is(':visible')) {
metakey = '#NONE#';
newkey = true;
}
data = mainwp_secure_data({
action: 'mainwp_post_addmeta',
post_id: jQuery('#post_ID').val(),
metavalue: jQuery('#metavalue').val(),
metakeyinput: jQuery('#metakeyinput').val(),
metakeyselect: metakey
});
} else {
let row = jQuery(me).closest('.row');
let metaid = row.attr('meta-id');
if ((row.length == 0) || !metaid)
return false;
data = mainwp_secure_data({
action: 'mainwp_post_addmeta',
post_id: jQuery('#post_ID').val()
});
if (action == 'update') {
row.addClass('yellow');
data['meta'] = {};
data['meta'][metaid] = {
'key': row.find('#meta-' + metaid + '-key').val(),
'value': row.find('#meta-' + metaid + '-value').val()
};
} else {
row.addClass('red');
data['delete_meta'] = 'yes';
data['meta_nonce'] = jQuery(me).attr('_ajax_nonce');
data['id'] = metaid;
}
}
jQuery.post(ajaxurl, data, function (response) {
if (response) {
if (response.error) {
feedback('mainwp-message-zone', response.error, 'red');
return;
}
if (action == 'update' && response.result) {
row.replaceWith(response.result);
} else if (action == 'add' && response.result) {
jQuery(response.result).insertBefore('#mainwp-metaform-row');
if (newkey) {
jQuery('#metakeyinput').val('');
} else {
jQuery('#metakeyselect').val('#NONE#');
}
} else if (action == 'delete' && response.ok) {
row.remove();
}
}
}, 'json');
};
/**
* All post and postbox controls and functionality.
*/
jQuery(function ($) {
let updateText,
$textarea = $('#content'),
$document = $(document),
$timestampdiv = $('#timestampdiv');
/*
* Clear the window name. Otherwise if this is a former preview window where the user navigated to edit another post,
* and the first post is still being edited, clicking Preview there will use this window to show the preview.
*/
window.name = '';
//Show/Hide visibility additional fields
jQuery('input[name="visibility"').on('change', function () {
if (jQuery(this).val() == 'public') {
jQuery('#sticky-field').show();
jQuery('#post_password-field').hide();
} else if (jQuery(this).val() == 'password') {
jQuery('#sticky-field').hide();
jQuery('#post_password-field').show();
} else {
jQuery('#sticky-field').hide();
jQuery('#post_password-field').hide();
}
});
//Show timestamp field
jQuery('#post_timestamp').on('change', function () {
if (jQuery(this).val() == 'schedule') {
jQuery('#post_timestamp_value-field').show();
} else {
jQuery('#post_timestamp_value-field').hide();
// cancel edit date time.
$('#mm').val($('#hidden_mm').val());
$('#jj').val($('#hidden_jj').val());
$('#aa').val($('#hidden_aa').val());
$('#hh').val($('#hidden_hh').val());
$('#mn').val($('#hidden_mn').val());
}
});
/**
* Make sure all labels represent the current settings.
*
* @returns {boolean} False when an invalid timestamp has been selected, otherwise True.
*/
updateText = function () {
if (!$timestampdiv.length)
return true;
let attemptedDate,
aa = $('#aa').val(),
mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val();
attemptedDate = new Date(aa, mm - 1, jj, hh, mn);
// Catch unexpected date problems.
if (attemptedDate.getFullYear() != aa || (1 + attemptedDate.getMonth()) != mm || attemptedDate.getDate() != jj || attemptedDate.getMinutes() != mn) {
$timestampdiv.find('.timestamp-wrap').addClass('form-invalid');
return false;
} else {
$timestampdiv.find('.timestamp-wrap').removeClass('form-invalid');
}
return true;
};
// init post datetime calendar
jQuery('#schedule_post_datetime').calendar({
type: 'datetime',
initialDate: function () {
let aa = $('#aa').val(), mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val();
let ind = new Date(aa, mm - 1, jj, hh, mn);
console.log(ind);
return ind;
}(),
monthFirst: false,
formatter: {
date: function (date) {
if (!date) return '';
let jj = date.getDate();
let mm = date.getMonth() + 1;
let aa = date.getFullYear();
return aa + '-' + mm + '-' + jj;
}
},
onChange: function (attemptedDate, textDate) {
console.log('onChange:' + textDate);
let aa = attemptedDate.getFullYear(), mm = attemptedDate.getMonth() + 1, jj = attemptedDate.getDate(), mn = attemptedDate.getMinutes(), hh = attemptedDate.getHours();
mm = ('0' + mm).slice(-2); // to format 01,02,03, ... 11,12
$('#aa').val(aa);
$('#mm').val(mm).trigger("change"); // selector element
$('#jj').val(jj);
$('#hh').val(hh);
$('#mn').val(mn);
return updateText(); // not set if invalid date
},
onSelect: function (attemptedDate, mode) {
console.log('onSelect mode:' + mode);
let aa = attemptedDate.getFullYear(), mm = attemptedDate.getMonth() + 1, jj = attemptedDate.getDate(), mn = attemptedDate.getMinutes(), hh = attemptedDate.getHours();
mm = ('0' + mm).slice(-2); // to format 01,02,03, ... 11,12
$('#aa').val(aa);
$('#mm').val(mm).trigger("change"); // selector element
$('#jj').val(jj);
$('#hh').val(hh);
$('#mn').val(mn);
console.log(aa + ' ' + mm + ' ' + jj + ' ' + hh + ' ' + mn);
return updateText(); // not set if invalid date
},
});
// Post locks: contain focus inside the dialog. If the dialog is shown, focus the first item.
$('#post-lock-dialog .notification-dialog').on('keydown', function (e) {
// Don't do anything when [tab] is pressed.
if (e.which != 9)
return;
let target = $(e.target);
// [shift] + [tab] on first tab cycles back to last tab.
if (target.hasClass('wp-tab-first') && e.shiftKey) {
$(this).find('.wp-tab-last').trigger('focus');
e.preventDefault();
// [tab] on last tab cycles back to first tab.
} else if (target.hasClass('wp-tab-last') && !e.shiftKey) {
$(this).find('.wp-tab-first').trigger('focus');
e.preventDefault();
}
}).filter(':visible').find('.wp-tab-first').trigger('focus');
// This code is meant to allow tabbing from Title to Post content.
$('#title').on('keydown.editor-focus', function (event) {
let editor;
if (event.keyCode === 9 && !event.ctrlKey && !event.altKey && !event.shiftKey) {
editor = typeof tinymce != 'undefined' && tinymce.get('content');
if (editor && !editor.isHidden()) {
editor.focus();
} else if ($textarea.length) {
$textarea.trigger('focus');
} else {
return;
}
event.preventDefault();
}
});
// Resize the WYSIWYG and plain text editors.
(function () {
let editor, offset, mce,
$handle = $('#post-status-info'),
$postdivrich = $('#postdivrich');
// If there are no textareas or we are on a touch device, we can't do anything.
if (!$textarea.length || 'ontouchstart' in window) {
// Hide the resize handle.
$('#content-resize-handle').hide();
return;
}
/**
* Handle drag event.
*
* @param {Object} event Event containing details about the drag.
*/
function dragging(event) {
if ($postdivrich.hasClass('wp-editor-expand')) {
return;
}
if (mce) {
editor.theme.resizeTo(null, offset + event.pageY);
} else {
$textarea.height(Math.max(50, offset + event.pageY));
}
event.preventDefault();
}
/**
* When the dragging stopped make sure we return focus and do a sanity check on the height.
*/
function endDrag() {
let height, toolbarHeight;
if ($postdivrich.hasClass('wp-editor-expand')) {
return;
}
if (mce) {
editor.focus();
toolbarHeight = parseInt($('#wp-content-editor-container .mce-toolbar-grp').height(), 10);
if (toolbarHeight < 10 || toolbarHeight > 200) {
toolbarHeight = 30;
}
height = parseInt($('#content_ifr').css('height'), 10) + toolbarHeight - 28;
} else {
$textarea.trigger('focus');
height = parseInt($textarea.css('height'), 10);
}
$document.off('.wp-editor-resize');
// Sanity check: normalize height to stay within acceptable ranges.
if (height && height > 50 && height < 5000) {
setUserSetting('ed_size', height);
}
}
$handle.on('mousedown.wp-editor-resize', function (event) {
if (typeof tinymce !== 'undefined') {
editor = tinymce.get('content');
}
if (editor && !editor.isHidden()) {
mce = true;
offset = $('#content_ifr').height() - event.pageY;
} else {
mce = false;
offset = $textarea.height() - event.pageY;
$textarea.blur();
}
$document.on('mousemove.wp-editor-resize', dragging)
.on('mouseup.wp-editor-resize mouseleave.wp-editor-resize', endDrag);
event.preventDefault();
}).on('mouseup.wp-editor-resize', endDrag);
})();
// TinyMCE specific handling of Post Format changes to reflect in the editor.
if (typeof tinymce !== 'undefined') {
// When changing post formats, change the editor body class.
$('#post-formats-select input.post-format').on('change.set-editor-class', function () {
let editor, body, format = this.id;
if (format && $(this).prop('checked') && (editor = tinymce.get('content'))) {
body = editor.getBody();
body.className = body.className.replace(/\bpost-format-[^ ]+/, '');
editor.dom.addClass(body, format == 'post-format-0' ? 'post-format-standard' : format);
$(document).trigger('editor-classchange');
}
});
// When changing page template, change the editor body class
$('#page_template').on('change.set-editor-class', function () {
let editor, body, pageTemplate = $(this).val() || '';
pageTemplate = pageTemplate.substring(pageTemplate.lastIndexOf('/') + 1)
.replace(/\.php$/, '')
.replace(/\./g, '-');
if (pageTemplate && (editor = tinymce.get('content'))) {
body = editor.getBody();
body.className = body.className.replace(/\bpage-template-[^ ]+/, '');
editor.dom.addClass(body, 'page-template-' + pageTemplate);
$(document).trigger('editor-classchange');
}
});
}
});
/**
* TinyMCE word count display
*/
(function ($, counter) {
$(function () {
let $content = $('#content'),
$count = $('#wp-word-count').find('.word-count'),
prevCount = 0,
contentEditor;
/**
* Get the word count from TinyMCE and display it
*/
function update() {
let text, count;
if (!contentEditor || contentEditor.isHidden()) {
text = $content.val();
} else {
text = contentEditor.getContent({ format: 'raw' });
}
count = counter.count(text);
if (count !== prevCount) {
$count.text(count);
}
prevCount = count;
}
/**
* Bind the word count update triggers.
*
* When a node change in the main TinyMCE editor has been triggered.
* When a key has been released in the plain text content editor.
*/
$(document).on('tinymce-editor-init', function (event, editor) {
if (editor.id !== 'content') {
return;
}
contentEditor = editor;
editor.on('nodechange keyup', _.debounce(update, 1000));
});
$content.on('input keyup', _.debounce(update, 1000));
update();
});
})(jQuery, new wp.utils.WordCounter());