418 lines
11 KiB
JavaScript
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());
|
|
|