Files
formipay/vendor/wpcfto/metaboxes/general_components/js/tinymce.js
2025-08-21 20:39:34 +07:00

162 lines
12 KiB
JavaScript

(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
"use strict";
Vue.component('wpcfto_tinymce', {
props: ['fields', 'field_label', 'field_name', 'field_id', 'field_value', 'required'],
data: function() {
return {
value: this.field_value || '', // initialize with prop value
editorInitialized: false
};
},
mounted: function() {
const vm = this;
// Initialize TinyMCE on the hidden textarea (with id = field_id)
tinymce.init({
selector: `#${this.field_id}`,
height: 400,
menubar: false,
highlight_on_focus: false,
plugins: 'advlist autolink lists link image charmap preview anchor searchreplace visualblocks code fullscreen insertdatetime table code help wordcount',
toolbar: 'undo redo | formatselect | bold italic backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | code wp_media | help',
setup: function(editor) {
editor.on('init', function() {
// Set initial content from Vue data
editor.setContent(vm.value || '');
vm.editorInitialized = true;
});
editor.on('Change KeyUp', function() {
const content = editor.getContent();
vm.value = content;
vm.$emit('wpcfto-get-value', content);
});
editor.on('Paste', function (e) {
var clipboardData = e.clipboardData || e.originalEvent.clipboardData;
if (clipboardData && clipboardData.items) {
for (var i = 0; i < clipboardData.items.length; i++) {
var item = clipboardData.items[i];
if (item.type.indexOf('image') !== -1) {
var file = item.getAsFile();
// Upload the file to server here via AJAX
var formData = new FormData();
formData.append('file', file);
formData.append('action', 'upload_pasted_image');
formData.append('_wpnonce', wpcfto_tinymce.nonce);
fetch(ajaxurl, {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
// Insert uploaded image URL into editor
editor.insertContent('<img src="' + data.data.url + '" />');
}
})
.catch(console.error);
// Prevent default paste to avoid blob URL insertion
e.preventDefault();
break;
}
}
}
});
editor.ui.registry.addButton('wp_media', {
icon: 'image',
tooltip: 'Insert Media',
onAction: function() {
// Open WordPress media modal
var frame = wp.media({
title: 'Select or Upload Media',
button: {
text: 'Insert into editor'
},
multiple: false
});
frame.on('select', function() {
var attachment = frame.state().get('selection').first().toJSON();
// Insert media HTML into TinyMCE editor
if (attachment.type === 'image') {
editor.insertContent('<img src="' + attachment.url + '" alt="' + (attachment.alt || '') + '" />');
} else if (attachment.type === 'video') {
editor.insertContent('<video controls src="' + attachment.url + '"></video>');
} else {
// For other media types, insert a link
editor.insertContent('<a href="' + attachment.url + '">' + attachment.filename + '</a>');
}
});
frame.open();
}
});
},
// Use your self-hosted skin path if needed, e.g.:
skin_url: '/wp-content/plugins/formipay/vendor/wpcfto/metaboxes/assets/vendors/tinymce/skins/ui/oxide',
content_css: '/wp-content/plugins/formipay/vendor/wpcfto/metaboxes/assets/vendors/tinymce/skins/content/default/content.min.css',
license_key: 'gpl',
branding: false,
});
},
beforeDestroy() {
// Properly remove TinyMCE instance when component is destroyed
if (tinymce.get(this.field_id)) {
tinymce.get(this.field_id).remove();
}
},
methods: {
enterHint: function(hint) {
this.value += ' {{' + hint + '}}';
if (tinymce.get(this.field_id)) {
tinymce.get(this.field_id).setContent(this.value);
}
}
},
template: `
<div class="wpcfto_generic_field wpcfto_generic_field_trumbowyg">
<wpcfto_fields_aside_before
:fields="fields"
:field_label="field_label"
:required="fields.required === true"
></wpcfto_fields_aside_before>
<div class="wpcfto-field-content">
<div class="hints" v-if="fields.hints && Object.keys(fields.hints).length">
<span
v-for="(hint_text, hint_key) in fields.hints"
:key="hint_key"
@click="enterHint(hint_key)"
class="hint-token"
>{{ hint_text }}</span>
</div>
<!-- Replace <vue-trumbowyg> with a simple textarea for TinyMCE -->
<textarea
:id="field_id"
:name="field_name"
:required="fields.required === true"
style="width: 100%; min-height: 300px;"
></textarea>
<!-- Hidden textarea for form submission and validation (optional) -->
<textarea
:name="field_name"
:id="field_id + '_hidden'"
v-model="value"
:required="fields.required === true"
style="display:none;"
></textarea>
</div>
<wpcfto_fields_aside_after :fields="fields"></wpcfto_fields_aside_after>
</div>
`,
watch: {
value: function(newValue) {
this.$emit('wpcfto-get-value', newValue);
}
}
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWdWUiLCJjb21wb25lbnQiLCJWdWVUcnVtYm93eWciLCJwcm9wcyIsImRhdGEiLCJ2YWx1ZSIsImNvbnRlbnQiLCJjb25maWciLCJidG5zIiwidGVtcGxhdGUiLCJtb3VudGVkIiwiZmllbGRfdmFsdWUiLCIkc2V0IiwibWV0aG9kcyIsImVudGVySGludCIsImhpbnQiLCJ3YXRjaCIsIl92YWx1ZSIsIiRlbWl0Il0sInNvdXJjZXMiOlsiZmFrZV8zMTAwMmFlNy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuVnVlLmNvbXBvbmVudCgndnVlLXRydW1ib3d5ZycsIFZ1ZVRydW1ib3d5Z1tcImRlZmF1bHRcIl0pO1xuVnVlLmNvbXBvbmVudCgnd3BjZnRvX3RydW1ib3d5ZycsIHtcbiAgcHJvcHM6IFsnZmllbGRzJywgJ2ZpZWxkX2xhYmVsJywgJ2ZpZWxkX25hbWUnLCAnZmllbGRfaWQnLCAnZmllbGRfdmFsdWUnXSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6ICcnLFxuICAgICAgY29udGVudDogbnVsbCxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBidG5zOiBbWyd2aWV3SFRNTCddLCBbJ3VuZG8nLCAncmVkbyddLCAvLyBPbmx5IHN1cHBvcnRlZCBpbiBCbGluayBicm93c2Vyc1xuICAgICAgICBbJ2Zvcm1hdHRpbmcnXSwgWydzdHJvbmcnLCAnZW0nLCAnZGVsJ10sIFsnZm9yZUNvbG9yJywgJ2JhY2tDb2xvciddLCBbJ2xpbmsnXSwgWydpbnNlcnRJbWFnZSddLCBbJ2p1c3RpZnlMZWZ0JywgJ2p1c3RpZnlDZW50ZXInLCAnanVzdGlmeVJpZ2h0JywgJ2p1c3RpZnlGdWxsJ10sIFsndW5vcmRlcmVkTGlzdCcsICdvcmRlcmVkTGlzdCddLCBbJ2hvcml6b250YWxSdWxlJ10sIFsncmVtb3ZlZm9ybWF0J10sIFsnZnVsbHNjcmVlbiddXVxuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIHRlbXBsYXRlOiBcIlxcbiAgICAgICAgPHRlbXBsYXRlPlxcbiAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIndwY2Z0b19nZW5lcmljX2ZpZWxkXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIndwY2Z0by1maWVsZC1hc2lkZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHYtaHRtbD1cXFwiZmllbGRfbGFiZWxcXFwiIGNsYXNzPVxcXCJ3cGNmdG8tZmllbGQtYXNpZGVfX2xhYmVsXFxcIj48L2xhYmVsPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ3cGNmdG8tZmllbGQtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiaGludHNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBAY2xpY2s9XFxcImVudGVySGludChoaW50X2tleSlcXFwiIHYtZm9yPVxcXCIoaGludF90ZXh0LCBoaW50X2tleSkgaW4gZmllbGRzLmhpbnRzXFxcIj57e2hpbnRfdGV4dH19PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8dnVlLXRydW1ib3d5ZyB2LW1vZGVsPVxcXCJ2YWx1ZVxcXCIgOmNvbmZpZz1cXFwiY29uZmlnXFxcIiAgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwiY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgIDwvdnVlLXRydW1ib3d5Zz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvdGVtcGxhdGU+XCIsXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmZpZWxkX3ZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy4kc2V0KHRoaXMsICd2YWx1ZScsIHRoaXMuZmllbGRfdmFsdWUpO1xuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGVudGVySGludDogZnVuY3Rpb24gZW50ZXJIaW50KGhpbnQpIHtcbiAgICAgIHRoaXMudmFsdWUgKz0gJyB7eycgKyBoaW50ICsgJ319JztcbiAgICB9XG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKF92YWx1ZSkge1xuICAgICAgdGhpcy4kZW1pdCgnd3BjZnRvLWdldC12YWx1ZScsIF92YWx1ZSk7XG4gICAgfVxuICB9XG59KTsiXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBQSxHQUFHLENBQUNDLFNBQUosQ0FBYyxlQUFkLEVBQStCQyxZQUFZLENBQUMsU0FBRCxDQUEzQztBQUNBRixHQUFHLENBQUNDLFNBQUosQ0FBYyxrQkFBZCxFQUFrQztFQUNoQ0UsS0FBSyxFQUFFLENBQUMsUUFBRCxFQUFXLGFBQVgsRUFBMEIsWUFBMUIsRUFBd0MsVUFBeEMsRUFBb0QsYUFBcEQsQ0FEeUI7RUFFaENDLElBQUksRUFBRSxTQUFTQSxJQUFULEdBQWdCO0lBQ3BCLE9BQU87TUFDTEMsS0FBSyxFQUFFLEVBREY7TUFFTEMsT0FBTyxFQUFFLElBRko7TUFHTEMsTUFBTSxFQUFFO1FBQ05DLElBQUksRUFBRSxDQUFDLENBQUMsVUFBRCxDQUFELEVBQWUsQ0FBQyxNQUFELEVBQVMsTUFBVCxDQUFmLEVBQWlDO1FBQ3ZDLENBQUMsWUFBRCxDQURNLEVBQ1UsQ0FBQyxRQUFELEVBQVcsSUFBWCxFQUFpQixLQUFqQixDQURWLEVBQ21DLENBQUMsV0FBRCxFQUFjLFdBQWQsQ0FEbkMsRUFDK0QsQ0FBQyxNQUFELENBRC9ELEVBQ3lFLENBQUMsYUFBRCxDQUR6RSxFQUMwRixDQUFDLGFBQUQsRUFBZ0IsZUFBaEIsRUFBaUMsY0FBakMsRUFBaUQsYUFBakQsQ0FEMUYsRUFDMkosQ0FBQyxlQUFELEVBQWtCLGFBQWxCLENBRDNKLEVBQzZMLENBQUMsZ0JBQUQsQ0FEN0wsRUFDaU4sQ0FBQyxjQUFELENBRGpOLEVBQ21PLENBQUMsWUFBRCxDQURuTztNQURBO0lBSEgsQ0FBUDtFQVFELENBWCtCO0VBWWhDQyxRQUFRLEVBQUUscXhCQVpzQjtFQWFoQ0MsT0FBTyxFQUFFLFNBQVNBLE9BQVQsR0FBbUI7SUFDMUIsSUFBSSxPQUFPLEtBQUtDLFdBQVosS0FBNEIsV0FBaEMsRUFBNkM7TUFDM0MsS0FBS0MsSUFBTCxDQUFVLElBQVYsRUFBZ0IsT0FBaEIsRUFBeUIsS0FBS0QsV0FBOUI7SUFDRDtFQUNGLENBakIrQjtFQWtCaENFLE9BQU8sRUFBRTtJQUNQQyxTQUFTLEVBQUUsU0FBU0EsU0FBVCxDQUFtQkMsSUFBbkIsRUFBeUI7TUFDbEMsS0FBS1YsS0FBTCxJQUFjLFFBQVFVLElBQVIsR0FBZSxJQUE3QjtJQUNEO0VBSE0sQ0FsQnVCO0VBdUJoQ0MsS0FBSyxFQUFFO0lBQ0xYLEtBQUssRUFBRSxTQUFTQSxLQUFULENBQWVZLE1BQWYsRUFBdUI7TUFDNUIsS0FBS0MsS0FBTCxDQUFXLGtCQUFYLEVBQStCRCxNQUEvQjtJQUNEO0VBSEk7QUF2QnlCLENBQWxDIn0=
},{}]},{},[1])