Admin Settings in all CPTs are already set. Continue to frontend.

This commit is contained in:
dwindown
2025-10-13 15:20:14 +07:00
parent 6f6b039441
commit 0446eb1064
11 changed files with 1610 additions and 884 deletions

View File

@@ -23,6 +23,10 @@ input.formipay-post-shortcode-input {
#sidebar_panel { #sidebar_panel {
background-color: #2c3e50; background-color: #2c3e50;
flex: 0 0 273px; flex: 0 0 273px;
transition: all .35s ease-in-out;
}
#sidebar_panel.expand-sidebar {
flex: 0 0 calc(273px * 2);
} }
#fields_panel { #fields_panel {
background-color: #f0f3f5; background-color: #f0f3f5;
@@ -40,6 +44,7 @@ input.formipay-post-shortcode-input {
top: 140px; top: 140px;
} }
#add_field_form input[type=text], #add_field_form input[type=text],
#add_field_form input[type=number],
#add_field_form select, #add_field_form select,
div#preview-wrapper input:not([type=checkbox],[type=radio]), div#preview-wrapper input:not([type=checkbox],[type=radio]),
div#preview-wrapper select { div#preview-wrapper select {

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,946 @@
jQuery(function($){
let wpcftoLoaded = false;
var checkWpcftoLoaded = setInterval(() => {
const container = $('.wpcfto-tab');
if(container.length > 0){
wpcftoLoaded = true;
$(document).trigger('wpcftoLoaded');
clearInterval(checkWpcftoLoaded);
}
}, 250);
$(document).on('wpcftoLoaded', function(){
update_option_to_data_mapping('initial');
});
function all_active_payments() {
var items = $('.payment_gateways #active .list-group-item');
var active_payments = [];
if(items.length > 0){
$.each(items, function(i, item){
var gateway = $(item).attr('id');
if(gateway.indexOf(':::') !== -1){
gateway = gateway.split(':::')[0];
gateway = gateway.replace('_', '-');
}
// $('[data-submenu=payments_'+gateway+']').show();
active_payments.push(gateway);
});
}
return active_payments;
}
function hide_inactive_payment_submenu() {
var div = $('[data-section=payments]').siblings('.wpcfto-submenus').find('[data-submenu]:not([data-submenu=payments_general])');
var active_payments = all_active_payments();
if(div.length > 0) {
$.each(div, function(x, y){
var gateway = $(y).attr('data-submenu').replace('payments_', '');
if(jQuery.inArray(gateway, active_payments) !== -1){
$(y).slideDown();
}else{
$(y).slideUp();
}
});
}
}
setTimeout(() => {
hide_inactive_payment_submenu();
}, 1000);
$(document).on('mouseleave', '.payment_gateways .list-group', function(){
hide_inactive_payment_submenu();
});
$(document).on('click', '.formipay-editor-nav .nav-link', function(){
$('.formipay-editor-nav').find('.nav-link').removeClass('active');
$(this).addClass('active');
$('.formipay-editor-tab-content.nav-content-section').addClass('d-none');
var tab_content = $(this).data('tab-content');
$('.formipay-editor-tab-content'+tab_content).removeClass('d-none');
});
$('.formipay-editor-nav .nav-item:first-child > .nav-link').trigger('click');
$(document).on('click', '#is_required', function(){
if($(this).is(':checked')) {
$(this).val('yes');
}else{
$(this).val('no');
}
});
$(document).on('blur change', '#add_field_form .field select.form-select', function(){
var array = ['divider', 'page_break'];
if( $.inArray( $(this).val(), array ) !== -1 ) {
$('#add_field_form .field:not(.main-field)').slideUp();
}else{
$('#add_field_form .field:not(.main-field):not(.has-conditional)').slideDown();
}
});
function formipay_sortable(){
$('#preview-wrapper').sortable({
opacity: 0.75,
items: '> .preview-field',
handle: 'span.grab',
change: function(event, ui) {
ui.placeholder.css({
visibility: 'visible',
border : '2px dashed #8c8f94',
borderRadius: '10px'
});
},
stop: function(event, ui){
update_option_to_data_mapping('update');
}
});
$('.repeater-child-wrapper').sortable({
opacity: 0.75,
items: '> .repeater-child-input',
handle: 'span.grab',
change: function(event, ui) {
ui.placeholder.css({
visibility: 'visible',
border : '2px dashed #cccccc',
borderRadius: '5px'
});
}
});
}
formipay_sortable();
$(document).on('change blur', '#add_field_form [name=label]', function(){
$('#add_field_form [name=field_id]').val($(this).val().toLowerCase().replace(' ', '_'));
});
$(document).on('click', '.add-option', function(e){
e.preventDefault();
var content = $(this).closest('.repeater-child-input').html();
$(this).closest('.repeater-child-wrapper').append(`
<div class="repeater-child-input d-flex justify-content-start align-items-start gap-2 my-2">`+content+`
</div>`);
$('.repeater-child-input:last-child').find('input').val('');
$('.repeater-child-input:last-child').find('.add-thumbnail').removeClass('text-info').addClass('text-white');
});
$(document).on('click', '.delete-option', function(e){
e.preventDefault();
$(this).closest('.repeater-child-input').remove();
});
$(document).on('click', 'input.option-field-toggle', function(){
var target = $(this).attr('data-child-field');
if($(this).is(':checked')){
$('.child-field-'+target).show();
}else{
$('.child-field-'+target).hide();
}
});
$(document).on('change', '#add_field_form .formipay-builder-field:not(.formipay-builder-option-field, [type=checkbox], [type=checkbox])', function(){
var value = $(this).val();
var name = $(this).attr('name');
var the_dependent = $('#add_field_form [data-if-'+name+']');
if('' !== value && the_dependent.length > 0){
// var all_dependents = $('.has-conditional');
$.each(the_dependent, function(x, y){
var decoded_value = JSON.parse($(y).attr('data-if-'+name));
if($.inArray(value, decoded_value) !== -1){
$(y).slideDown();
}else{
$(y).slideUp();
}
});
}
});
$(document).on('click', '.add-field', function(e){
e.preventDefault();
var option_image_toggle = 'no';
if($('#repeater-child-0_thumbnail').is(':checked')){
option_image_toggle = 'yes';
}
var option_value_toggle = 'no';
if($('#repeater-child-2_value').is(':checked')){
option_value_toggle = 'yes';
}
var option_amount_toggle = 'no';
if($('#repeater-child-3_amount').is(':checked')){
option_amount_toggle = 'yes';
}
var setup = {
'label' : $('#add_field_form [name=label]').val(),
'field_id' : $('#add_field_form [name=field_id]').val(),
'field_type' : $('#add_field_form [name=field_type]').val(),
'options_type' : $('#add_field_form [name=options_type]').val(),
'placeholder' : $('#add_field_form [name=placeholder]').val(),
'default_value' : $('#add_field_form [name=default_value]').val(),
'description' : $('#add_field_form [name=description]').val(),
'is_required' : $('#add_field_form [name=is_required]').val(),
'show_toggle' : {
'image' : option_image_toggle,
'value' : option_value_toggle,
'amount': option_amount_toggle
},
'layout' : $('#option_grid_columns').val()
};
var options = [];
var calculable_field = ['select', 'radio', 'checkbox'];
if($.inArray(setup.field_type, calculable_field) !== -1){
var single_option = $('.repeater-child-input');
if(single_option.length > 0){
$.each(single_option, function(a, b){
var check_qty;
if($(b).find('.repeater-child-input-qty').is(':checked')){
check_qty = 'yes';
}else{
check_qty = 'no';
}
var option = {
'image_id': $(b).find('.field-image-id').val(),
'image_url': $(b).find('.field-image-url').val(),
'label': $(b).find('.repeater-child-input-label').find('input').val(),
'value': $(b).find('.repeater-child-input-value').find('input').val(),
'amount': $(b).find('.repeater-child-input-amount').find('input').val(),
'weight': $(b).find('.repeater-child-input-weight').find('input').val(),
'qty': check_qty
}
options.push(option);
});
}
}
setup.field_options = options;
// console.log(setup);
var setup_string = JSON.stringify(setup);
var not_input = ['select', 'checkbox', 'radio'];
var is_required = '';
var asterisk = '';
if(setup.is_required == 'yes'){
is_required = '';
asterisk = ' <span style="color:red;">(*)</span>';
}
var hidden = '';
if(setup.field_type == 'hidden'){
hidden = ' style="opacity: .75;"'
}
if(!setup.calc_value){
setup.calc_value = 0;
}
var preview_content = '';
if($.inArray(setup.field_type, not_input) == -1){
if($.inArray(setup.field_type, ['divider', 'page_break']) !== -1){
preview_content = `
<div class="formipay-field w-100"`+hidden+`>
<div class="d-flex justify-content-between field-controls">
<label for="`+setup.field_id+`" class="label-`+setup.field_type+`">`+setup.label+`</label>
<div class="field-icons d-flex gap-2 align-items-center the_buttons">
<button class="btn btn-sm edit-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M5 19h1.425L16.2 9.225L14.775 7.8L5 17.575zm-2 2v-4.25L16.2 3.575q.3-.275.663-.425t.762-.15t.775.15t.65.45L20.425 5q.3.275.438.65T21 6.4q0 .4-.137.763t-.438.662L7.25 21zM19 6.4L17.6 5zm-3.525 2.125l-.7-.725L16.2 9.225z" />
</svg>
</button>
<button class="btn btn-sm delete-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M7 21q-.825 0-1.412-.587T5 19V6H4V4h5V3h6v1h5v2h-1v13q0 .825-.587 1.413T17 21zm2-4h2V8H9zm4 0h2V8h-2z" />
</svg>
</button>
</div>
</div>
<input type="hidden" name="`+setup.field_id+`_config" class="formipay-field-setup" value='`+setup_string+`'>
<span class="divider-line"></span>
<p class="formipay-inline-desc">`+setup.description+`</p>
</div>`;
}else if(setup.field_type == 'country_list') {
var country_json = formipay_admin.preset.country_list;
// Check if country_json is a string (indicating it might need to be parsed)
if (typeof country_json === 'string') {
try {
country_json = JSON.parse(country_json); // Parse the JSON string into an object
} catch (e) {
console.error('Error parsing JSON:', e); // Log any parsing errors
country_json = []; // Fallback to an empty array
}
}
// Validate the data type
if (!Array.isArray(country_json)) {
console.error('Expected an array but got:', country_json);
country_json = []; // Fallback to an empty array if not an array
}
var options_html = `<option>-- ${setup.placeholder}</option>`;
// Loop through each country object
$.each(country_json, function(index, country) {
// Assuming each country object has 'id' for the value and 'name' for the display text
options_html += `<option value="${country.name}">${country.name}</option>`;
});
preview_content = `
<div class="formipay-field w-100"`+hidden+`>
<div class="d-flex justify-content-between field-controls">
<label for="`+setup.field_id+`">`+setup.label+asterisk+`</label>
<div class="field-icons d-flex gap-2 align-items-center the_buttons">
<button class="btn btn-sm edit-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M5 19h1.425L16.2 9.225L14.775 7.8L5 17.575zm-2 2v-4.25L16.2 3.575q.3-.275.663-.425t.762-.15t.775.15t.65.45L20.425 5q.3.275.438.65T21 6.4q0 .4-.137.763t-.438.662L7.25 21zM19 6.4L17.6 5zm-3.525 2.125l-.7-.725L16.2 9.225z" />
</svg>
</button>
<button class="btn btn-sm delete-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M7 21q-.825 0-1.412-.587T5 19V6H4V4h5V3h6v1h5v2h-1v13q0 .825-.587 1.413T17 21zm2-4h2V8H9zm4 0h2V8h-2z" />
</svg>
</button>
</div>
</div>
<input type="hidden" name="`+setup.field_id+`_config" class="formipay-field-setup" value='`+setup_string+`'>
<select id="`+setup.field_id+`" class="formipay-input formipay-form-field" `+is_required+`>
`+options_html+`
</select>
<p class="formipay-inline-desc">`+setup.description+`</p>
</div>`;
}else if(setup.field_type !== 'textarea'){
preview_content = `
<div class="formipay-field w-100"`+hidden+`>
<div class="d-flex justify-content-between field-controls">
<label for="`+setup.field_id+`">`+setup.label+asterisk+`</label>
<div class="field-icons d-flex gap-2 align-items-center the_buttons">
<button class="btn btn-sm edit-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M5 19h1.425L16.2 9.225L14.775 7.8L5 17.575zm-2 2v-4.25L16.2 3.575q.3-.275.663-.425t.762-.15t.775.15t.65.45L20.425 5q.3.275.438.65T21 6.4q0 .4-.137.763t-.438.662L7.25 21zM19 6.4L17.6 5zm-3.525 2.125l-.7-.725L16.2 9.225z" />
</svg>
</button>
<button class="btn btn-sm delete-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M7 21q-.825 0-1.412-.587T5 19V6H4V4h5V3h6v1h5v2h-1v13q0 .825-.587 1.413T17 21zm2-4h2V8H9zm4 0h2V8h-2z" />
</svg>
</button>
</div>
</div>
<input type="hidden" name="`+setup.field_id+`_config" class="formipay-field-setup" value='`+setup_string+`'>
<input type="`+setup.field_type+`" id="`+setup.field_id+`" class="formipay-input formipay-form-field" placeholder="`+setup.placeholder+`" data-calc-value="`+setup.calc_value+`" `+is_required+` />
<p class="formipay-inline-desc">`+setup.description+`</p>
</div>`;
}else{
preview_content = `
<div class="formipay-field w-100"`+hidden+`>
<div class="d-flex justify-content-between field-controls">
<label for="`+setup.field_id+`">`+setup.label+asterisk+`</label>
<div class="field-icons d-flex gap-2 align-items-center the_buttons">
<button class="btn btn-sm edit-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M5 19h1.425L16.2 9.225L14.775 7.8L5 17.575zm-2 2v-4.25L16.2 3.575q.3-.275.663-.425t.762-.15t.775.15t.65.45L20.425 5q.3.275.438.65T21 6.4q0 .4-.137.763t-.438.662L7.25 21zM19 6.4L17.6 5zm-3.525 2.125l-.7-.725L16.2 9.225z" />
</svg>
</button>
<button class="btn btn-sm delete-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M7 21q-.825 0-1.412-.587T5 19V6H4V4h5V3h6v1h5v2h-1v13q0 .825-.587 1.413T17 21zm2-4h2V8H9zm4 0h2V8h-2z" />
</svg>
</button>
</div>
</div>
<input type="hidden" name="`+setup.field_id+`_config" class="formipay-field-setup" value='`+setup_string+`'>
<textarea rows="4" id="`+setup.field_id+`" class="formipay-input formipay-form-field" placeholder="`+setup.placeholder+`" data-calc-value="`+setup.calc_value+`" `+is_required+`></textarea>
<p class="formipay-inline-desc">`+setup.description+`</p>
</div>`;
}
}else{
if(setup.field_type == 'select'){
var options = setup.field_options;
var options_html = '';
if(setup.placeholder !== ''){
options_html = '<option>'+setup.placeholder+'</option>';
}
$.each(options, function(j, k){
var label = k.label;
var value = label;
if('' !== k.value && setup.show_toggle.value == 'yes'){
value = k.value;
}
var calc = 0;
if('' !== k.amount && setup.show_toggle.amount == 'yes'){
calc = k.amount;
}
options_html += '<option value="'+value+'" data-calc-value="'+calc+'">'+label+'</option>';
});
preview_content = `
<div class="formipay-field w-100"`+hidden+`>
<div class="d-flex justify-content-between field-controls">
<label for="`+setup.field_id+`">`+setup.label+asterisk+`</label>
<div class="field-icons d-flex gap-2 align-items-center the_buttons">
<button class="btn btn-sm edit-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M5 19h1.425L16.2 9.225L14.775 7.8L5 17.575zm-2 2v-4.25L16.2 3.575q.3-.275.663-.425t.762-.15t.775.15t.65.45L20.425 5q.3.275.438.65T21 6.4q0 .4-.137.763t-.438.662L7.25 21zM19 6.4L17.6 5zm-3.525 2.125l-.7-.725L16.2 9.225z" />
</svg>
</button>
<button class="btn btn-sm delete-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M7 21q-.825 0-1.412-.587T5 19V6H4V4h5V3h6v1h5v2h-1v13q0 .825-.587 1.413T17 21zm2-4h2V8H9zm4 0h2V8h-2z" />
</svg>
</button>
</div>
</div>
<input type="hidden" name="`+setup.field_id+`_config" class="formipay-field-setup" value='`+setup_string+`'>
<select id="`+setup.field_id+`" class="formipay-input formipay-form-field" `+is_required+`>
`+options_html+`
</select>
<p class="formipay-inline-desc">`+setup.description+`</p>
</div>`;
}else{
var options = setup.field_options;
var options_html = '';
$.each(options, function(j, k){
var name = setup.field_id+`-`+j;
if(setup.field_type == 'radio'){
name = setup.field_id;
}
var label = k.label;
var value = label;
if('' !== k.value && setup.show_toggle.value == 'yes'){
value = k.value;
}
var calc = 0;
if('' !== k.amount && setup.show_toggle.amount == 'yes'){
calc = k.amount;
}
var image = '';
if('' !== k.image_id && '' !== k.image_url){
image = `<img src="`+k.image_url+`" style="width: 100%; height: 150px; object-fit: contain;">`;
}
options_html +=
`<div class="formipay-checkbox-group">
`+image+`
<input type="`+setup.field_type+`" id="`+setup.field_id+`-`+j+`" name="`+name+`" class="formipay-input formipay-form-field" value="`+k.value+`" />
<label for="`+setup.field_id+`-`+j+`">`+k.label+`</label>
</div>`;
});
if(setup.layout == ''){
setup.layout = 1;
}
preview_content = `
<div class="formipay-field w-100"`+hidden+`>
<div class="d-flex justify-content-between field-controls">
<label for="`+setup.field_id+`">`+setup.label+asterisk+`</label>
<div class="field-icons d-flex gap-2 align-items-center the_buttons">
<button class="btn btn-sm edit-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M5 19h1.425L16.2 9.225L14.775 7.8L5 17.575zm-2 2v-4.25L16.2 3.575q.3-.275.663-.425t.762-.15t.775.15t.65.45L20.425 5q.3.275.438.65T21 6.4q0 .4-.137.763t-.438.662L7.25 21zM19 6.4L17.6 5zm-3.525 2.125l-.7-.725L16.2 9.225z" />
</svg>
</button>
<button class="btn btn-sm delete-preview-field">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path fill="#000" d="M7 21q-.825 0-1.412-.587T5 19V6H4V4h5V3h6v1h5v2h-1v13q0 .825-.587 1.413T17 21zm2-4h2V8H9zm4 0h2V8h-2z" />
</svg>
</button>
</div>
</div>
<input type="hidden" name="`+setup.field_id+`_config" class="formipay-field-setup" value='`+setup_string+`'>
<div class="formipay-checkbox-wrapper" style="display: grid; grid-template-columns: repeat(`+setup.layout+`, 1fr); gap: 10px;">
`+options_html+`
</div>
<p class="formipay-inline-desc">`+setup.description+`</p>
</div>`;
}
}
var hidden = is_required = '';
if(setup.type == 'hidden'){
hidden = ' style="display: none;"';
}
if(setup.require == 'yes'){
is_required = ' required';
}
// Check if any
var edit_to = $('.add-field').attr('data-edit-to');
var the_existed_field = $('.preview-field[data-field="'+edit_to+'"]');
if(the_existed_field.length > 0){
$('.preview-field[data-field="'+edit_to+'"]').html(`
<span class="grab pb-4">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24">
<path fill="#000" d="M9 20q-.825 0-1.412-.587T7 18t.588-1.412T9 16t1.413.588T11 18t-.587 1.413T9 20m6 0q-.825 0-1.412-.587T13 18t.588-1.412T15 16t1.413.588T17 18t-.587 1.413T15 20m-6-6q-.825 0-1.412-.587T7 12t.588-1.412T9 10t1.413.588T11 12t-.587 1.413T9 14m6 0q-.825 0-1.412-.587T13 12t.588-1.412T15 10t1.413.588T17 12t-.587 1.413T15 14M9 8q-.825 0-1.412-.587T7 6t.588-1.412T9 4t1.413.588T11 6t-.587 1.413T9 8m6 0q-.825 0-1.412-.587T13 6t.588-1.412T15 4t1.413.588T17 6t-.587 1.413T15 8" />
</svg>
</span>
`+preview_content+`
`);
}else{
$('#preview-wrapper').append(`
<div class="preview-field d-flex gap-2 align-items-center" data-field="`+setup.field_id+`" data-field-type="`+setup.field_type+`">
<span class="grab pb-4">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24">
<path fill="#000" d="M9 20q-.825 0-1.412-.587T7 18t.588-1.412T9 16t1.413.588T11 18t-.587 1.413T9 20m6 0q-.825 0-1.412-.587T13 18t.588-1.412T15 16t1.413.588T17 18t-.587 1.413T15 20m-6-6q-.825 0-1.412-.587T7 12t.588-1.412T9 10t1.413.588T11 12t-.587 1.413T9 14m6 0q-.825 0-1.412-.587T13 12t.588-1.412T15 10t1.413.588T17 12t-.587 1.413T15 14M9 8q-.825 0-1.412-.587T7 6t.588-1.412T9 4t1.413.588T11 6t-.587 1.413T9 8m6 0q-.825 0-1.412-.587T13 6t.588-1.412T15 4t1.413.588T17 6t-.587 1.413T15 8" />
</svg>
</span>
`+preview_content+`
</div>
`);
}
$('.preview-field[data-field="'+setup.field_id+'"]').attr('data-field-type', setup.field_type);
// scissors icon
if(setup.field_type == 'page_break'){
$('.preview-field[data-field="'+setup.field_id+'"]').append(`
<span class="scissors">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24">
<path fill="#000" d="m12 14l-2.35 2.35q.2.375.275.8T10 18q0 1.65-1.175 2.825T6 22t-2.825-1.175T2 18t1.175-2.825T6 14q.425 0 .85.075t.8.275L10 12L7.65 9.65q-.375.2-.8.275T6 10q-1.65 0-2.825-1.175T2 6t1.175-2.825T6 2t2.825 1.175T10 6q0 .425-.075.85t-.275.8L20.6 18.6q.675.675.3 1.538T19.575 21q-.275 0-.537-.112t-.463-.313zm3-3l-2-2l5.575-5.575q.2-.2.463-.312T19.574 3q.95 0 1.313.875t-.313 1.55zM6 8q.825 0 1.413-.587T8 6t-.587-1.412T6 4t-1.412.588T4 6t.588 1.413T6 8m6 4.5q.2 0 .35-.15t.15-.35t-.15-.35t-.35-.15t-.35.15t-.15.35t.15.35t.35.15M6 20q.825 0 1.413-.587T8 18t-.587-1.412T6 16t-1.412.588T4 18t.588 1.413T6 20" />
</svg>
</span>
`)
}else{
$('.preview-field[data-field="'+setup.field_id+'"] > span.scissors').remove();
}
var builder_fields = $('#add_field_form').find('.formipay-builder-field');
if(builder_fields.length > 0){
$.each(builder_fields, function(a, b){
if($(b).attr('type') == 'checkbox'){
$(b).val('no').prop('checked', false);
}else{
$(b).val('');
}
});
}
$('.repeater-child-input:not(:first-child)').remove();
$('.repeater-child-input > input').val('');
$('.repeater-child-input > .add-thumbnail').removeClass('text-info').addClass('text-white');
$('.repeater-child-input .check-qty').prop('checked', false);
$('#add_field_form .field.has-conditional').slideUp();
var all_option_toggle = $('.option-field-toggle');
$.each(all_option_toggle, function(p, q){
if($(q).is(':checked')){
$(q).trigger('click');
}
});
$('.child-field-image-wrapper').find('img').attr('src', '').hide();
$('.child-field-image-wrapper').find('i').attr('src', '').show();
$('#add_field_form .field:not(.has-conditional)').show();
$('[name=field_type]').val('text').change();
$('.add-field').removeAttr('data-edit-to').text('Add Field');
formipay_sortable();
setTimeout(() => {
update_option_to_data_mapping('update');
}, 1000);
});
$(document).on('change', '#customer_data-buyer_allow_choose_country_code', function() {
update_option_to_data_mapping('update');
});
function update_option_to_data_mapping(initiation) {
var fields = $('#preview-wrapper').find('input[type=hidden]');
var options = [];
$.each(fields, function(increment, field){
var value = $(field).val();
var config = JSON.parse(value);
options.push(config);
});
var target = $('#customer_data').find('select');
target.html('');
target.append(`<option value="">${formipay_admin.config.datamapping.placeholder}</option>`);
if(options.length > 0){
$.each(options, function(increment, option){
target.append(`<option value="${option.field_id}">${option.label}</option>`);
});
}
if(initiation == 'initial'){
$.ajax({
type: 'post',
url: formipay_admin.ajax_url,
data: {
action: 'formipay_check_for_data_mapping_saved_value',
post: $('#post_ID').val(),
_wpnonce: formipay_admin.nonce
},
success: function(res) {
$.each(res, function(name, value){
if(value){
$(`[name="${name}"]`).attr('data-current-value', value).val(value);
}
});
}
});
}else if(initiation == 'update'){
$.each(target, function(increment, select){
const current_value = $(select).attr('data-current-value');
$(select).attr('data-current-value', current_value).val(current_value);
})
}
}
$(document).on('click', '.delete-preview-field', function(e){
e.preventDefault();
$(this).parents('.preview-field').remove();
update_option_to_data_mapping('update');
});
$(document).on('click', '.edit-preview-field', function(e){
e.preventDefault();
// recondition all fields
$('.option-field-toggle').prop('checked', false);
$('.repeater-child-input:not(:first-child)').remove();
$('.repeater-child-input:first-child').find('input').val('');
// $('.repeater-child-input:first-child').find('.add-thumbnail').removeClass('text-info').addClass('text-white');
var setup = $(this).closest('.preview-field').find('.formipay-field-setup').val();
setup = JSON.parse(setup);
console.log(setup);
$.each(setup, function(x, y){
if(x == 'field_options'){
if(y.length > 0){
var first_repeater = $('.repeater-child-input:first-child')
var repeater_template = first_repeater.html();
var repeater_wrapper = $('.repeater-child-wrapper');
$.each(y, function(p, q){
repeater_wrapper.append(
`<div class="repeater-child-input d-flex justify-content-start align-items-start gap-2 my-2">
`+repeater_template+`
</div>`);
var repeater_target = $('.repeater-child-input:last-child');
repeater_target.find('.the_title').text(q.label);
repeater_target.find('.child-field-label').find('input').val(q.label);
repeater_target.find('.child-field-value').find('input').val(q.value);
repeater_target.find('.child-field-amount').find('input').val(q.amount);
if(q.qty == 'yes'){
repeater_target.find('.check-qty').val('yes').prop('checked', true);
}else{
repeater_target.find('.check-qty').val('no').prop('checked', false);
}
if('' !== q.image){
repeater_target.find('.field-image-id').val(q.image_id);
repeater_target.find('.field-image-url').val(q.image_url);
repeater_target.find('img').attr('src', q.image_url).removeClass('d-none');
repeater_target.find('.child-field-image').hide();
// repeater_target.find('.add-thumbnail').removeClass('text-white').addClass('text-info');
}
repeater_target.show();
first_repeater.hide();
first_repeater.remove();
});
$('.repeater-child-input:first-child').find('.open-option');
}
}else if(x == 'layout'){
$('#add_field_form [name="option_grid_columns"]').val(y);
}else{
$('#add_field_form [name="' + x + '"]').val(y);
}
});
$('#add_field_form [name=is_required]').prop('checked', setup.is_required === 'yes');
// Handle show_toggle options
if ('show_toggle' in setup) {
if(setup.show_toggle.image === 'yes'){
$('#repeater-child-0_thumbnail').trigger('click');
}
if(setup.show_toggle.value === 'yes'){
$('#repeater-child-2_value').trigger('click');
}
if(setup.show_toggle.amount === 'yes'){
$('#repeater-child-3_amount').trigger('click');
}
}
formipay_sortable();
// Trigger recondition and form change
$('.formipay-builder-field[name=field_type]').trigger('change');
$('.add-field').attr('data-edit-to', setup.field_id).text('Edit Field');
});
if( $('[name=daterange]').val() == '' ){
$('[name=daterange]').daterangepicker({
timePicker: true,
startDate: moment().startOf('hour'),
endDate: moment().startOf('hour').add(32, 'hour'),
showDropdowns: true,
timePicker24Hour: true,
locale: {
format: 'D-M-Y HH:mm'
}
});
}else{
$('[name=daterange]').daterangepicker({
timePicker: true,
showDropdowns: true,
timePicker24Hour: true,
locale: {
format: 'D-M-Y HH:mm'
}
});
}
$(document).on('click', '[role=switch]', function(){
var id = $(this).attr('id');
if($(this).is(':checked')){
$('#add_field_form [data-if-'+id+'=active]').show();
$(this).val('no');
}else{
$('#add_field_form [data-if-'+id+'=active]').hide();
$(this).val('yes');
}
});
$(document).on('click change', '#add_field_form [type=radio]', function(){
var id = $(this).attr('name');
var value = $(this).val();
$('#add_field_form [data-if-'+id+']').hide();
if($(this).is(':checked')){
$('#add_field_form [data-if-'+id+'='+value+']').show();
}
});
$('[type=radio]').trigger('change');
$(document).on('change', '.config-dropdown', function(){
var id = $(this).attr('id');
var value = $(this).val();
var attr_value = $('#add_field_form [data-if-'+id+']');
$('#add_field_form [data-if-'+id+']').hide();
if(attr_value.length > 0){
$.each(attr_value, function(x,y){
var this_attr_value = $(y).attr('data-if-'+id);
if(this_attr_value.indexOf('::') !== -1){
var split = this_attr_value.split('::');
if($.inArray(value, split) !== -1){
$(y).show();
}
}else{
if(this_attr_value == value){
$(y).show();
}
}
});
}
});
$('.config-dropdown').trigger('change');
$(document).on('click', '.open-option', function(e){
e.preventDefault();
$(this).find('.bi').toggleClass('bi-arrow-up').toggleClass('bi-arrow-down');
$(this).closest('.child-fields-wrapper').find('.child-field-wrapper').slideToggle();
$(this).closest('.child-field-title').toggleClass('option-detail-opened');
});
// var all_checkbox = $('[type="checkbox"]');
// if(all_checkbox.length > 0){
// $.each(all_checkbox, function(a,b){
// if($(b).val() == 'yes'){
// $(b).val('no').trigger('click');
// }
// });
// }
// function modify_payment_box_behavior() {
// var allbox = $('#payments multi_checkbox');
// var checkbox_input = $('.payments-payment input[type=checkbox]');
// var checked_value = [];
// if(checkbox_input.length > 0){
// $.each(checkbox_input, function(x, y){
// if($(y).is(':checked')){
// checked_value.push($(y).val());
// $('[data-field=wpcfto_addon_option_payment_'+$(y).val()+']').show();
// }else{
// $('[data-field=wpcfto_addon_option_payment_'+$(y).val()+']').hide();
// }
// });
// }
// }
// setTimeout(() => {
// modify_payment_box_behavior();
// }, 500);
// $(document).on('click', '.payments-payment input[type=checkbox]', function(){
// modify_payment_box_behavior();
// });
$(document).on('mouseover', 'span.grab', function(){
$(this).css('pointer', 'grab');
});
$(document).on('click', 'span.grab', function(){
$(this).css('pointer', 'grabbing');
});
$(document).on('change blur', '.child-field-label input.formipay-builder-field', function(){
$(this).closest('.child-fields-wrapper').find('.the_title').text($(this).val());
});
$(document).on('change', '#customer_data select', function() {
var value = $(this).val();
$(this).attr('data-current-value', value);
});
});
// jQuery(function($){
// setTimeout(() => {
// var autocomplete_fields = $('.wpcfto-box .autocomplete');
// if(autocomplete_fields.length > 0){
// $.each(autocomplete_fields, function(increment, field){
// var label = $(field).find('.wpcfto-field-aside__label').text();
// var placeholder = formipay_admin.config.autocomplete.placeholder.replace('{field_label}', label);
// var search_input = $(field).find('input');
// search_input.attr('placeholder', placeholder);
// search_input.parent().attr('data-input-placeholder', placeholder);
// });
// }
// }, 1000);
// $(document).on('mouseleave blur focusout', '.wpcfto-autocomplete-search input', function(){
// var placeholder = $(this).parent().attr('data-input-placeholder');
// setTimeout(() => {
// $(this).attr('placeholder', placeholder);
// }, 500);
// });
// $( document ).on( 'click', '.add-thumbnail', function( event ) {
// var gallery_items_frame;
// const $el = $( this );
// var target_field = $el.attr('data-field');
// var target_id = $el.siblings('.'+target_field+'-id');
// var target_url = $el.siblings('.'+target_field+'-url');
// var selected = target_id.val();
// var able_multiple = $el.attr('data-able-multiple');
// event.preventDefault();
// if ( gallery_items_frame ) {
// // Select the attachment when the frame opens
// gallery_items_frame.on( 'open', function() {
// var selection = gallery_items_frame.state().get( 'selection' );
// selection.reset( selected ? [ wp.media.attachment( selected ) ] : [] );
// });
// // Open the modal.
// gallery_items_frame.open();
// return;
// }
// // Create the media frame.
// gallery_items_frame = wp.media.frames.gallery_items = wp.media({
// // Set the title of the modal.
// title: 'Choose or upload media',
// button: {
// text: 'Select'
// },
// states: [
// new wp.media.controller.Library({
// title: 'Choose or upload media',
// filterable: 'all',
// multiple: able_multiple
// })
// ]
// });
// // Select the attachment when the frame opens
// gallery_items_frame.on( 'open', function() {
// var selection = gallery_items_frame.state().get( 'selection' );
// selection.reset( selected ? [ wp.media.attachment( selected ) ] : [] );
// });
// gallery_items_frame.on( 'select', function() {
// attachment = gallery_items_frame.state().get('selection').first().toJSON();
// target_id.val( attachment.id );
// target_url.val( attachment.url );
// if(target_id.val() !== ''){
// // $el.removeClass('text-white').addClass('text-info d-none');
// if($el.hasClass('btn')){
// $el.siblings('i').hide();
// }else{
// $el.hide();
// }
// $el.siblings('img').removeClass('d-none').attr('src', attachment.url).show();
// }else{
// // $el.removeClass('text-info d-none').addClass('text-white');
// if($el.hasClass('btn')){
// $el.siblings('i').show();
// }else{
// $el.show();
// }
// $el.siblings('img').addClass('d-none').hide();
// }
// });
// // Open the modal.
// gallery_items_frame.open();
// });
// $( document ).on( 'click', '.trumbowyg-button-group:has(.trumbowyg-insertImage-button)', function( event ) {
// var gallery_items_frame;
// event.preventDefault();
// // Create the media frame.
// gallery_items_frame = wp.media.frames.gallery_items = wp.media({
// // Set the title of the modal.
// title: 'Choose or upload media',
// button: {
// text: 'Select'
// },
// states: [
// new wp.media.controller.Library({
// title: 'Choose or upload media',
// filterable: 'all',
// multiple: false
// })
// ]
// });
// gallery_items_frame.on( 'select', function() {
// attachment = gallery_items_frame.state().get('selection').first().toJSON();
// var target_input_url = $('.trumbowyg-modal.trumbowyg-fixed-top .trumbowyg-input-html input');
// var target_confirm = $('.trumbowyg-modal.trumbowyg-fixed-top .trumbowyg-modal-submit');
// target_input_url.val( attachment.url );
// target_confirm.trigger('click');
// });
// // Open the modal.
// gallery_items_frame.open();
// });
// });

View File

@@ -249,10 +249,25 @@ function formipay_get_currency_data_by_value($value, $data='') {
} }
function formipay_get_post_meta($post_id, $metakey) { function formipay_get_post_meta($post_id, $metakey = '') {
$value = get_post_meta($post_id, $metakey, true); $value = get_post_meta($post_id, $metakey, true);
if($metakey == '') {
$flattened_meta = array();
foreach ($value as $key => $values) {
if (count($values) === 1) {
$flattened_meta[$key] = maybe_unserialize($values[0]);
} else {
// Keep multiple values as array (or handle as needed)
$flattened_meta[$key] = array_map('maybe_unserialize', $values);
}
}
return $flattened_meta;
}
if(!empty($value) && false !== $value && '' !== $value){ if(!empty($value) && false !== $value && '' !== $value){
return $value; return $value;
} }
@@ -951,4 +966,18 @@ function formipay_thankyoupage_allowed_html() {
'td' => [], 'td' => [],
'br' => [] 'br' => []
]; ];
}
function formipay_is_donation($post_id) {
return boolval(formipay_get_post_meta($post_id, 'donation_active'));
}
function formipay_product_has_variation($product_id) {
$has_variation = formipay_get_post_meta($product_id, 'product_has_variation');
if( $has_variation == 'on' ){
return true;
}
return false;
} }

View File

@@ -225,6 +225,4 @@ if(isset($_GET['post']) && isset($_GET['action']) && $_GET['action'] == 'edit'){
{{/ifEquals}} {{/ifEquals}}
</div> </div>
{{/each}} {{/each}}
</script> </script>

View File

@@ -841,10 +841,13 @@ class Form {
$last_cart_behavior = array_key_last($cart_behavior); $last_cart_behavior = array_key_last($cart_behavior);
$cart_behavior[$last_cart_behavior]['group'] = 'ended'; $cart_behavior[$last_cart_behavior]['group'] = 'ended';
$global_currencies = get_global_currency_array();
$default_currency = formipay_default_currency();
$cart_items = [ $cart_items = [
'cart_items_group' => [ 'cart_items_group' => [
'type' => 'group_title', 'type' => 'group_title',
'label' => __( 'Cart Items', 'formipay' ), 'label' => __( 'Additional Order Items', 'formipay' ),
'group' => 'started', 'group' => 'started',
'description' => __( 'Add static product or custom item to form as default and non-editable item in order items.', 'formipay' ) 'description' => __( 'Add static product or custom item to form as default and non-editable item in order items.', 'formipay' )
], ],
@@ -852,11 +855,12 @@ class Form {
'type' => 'autocomplete', 'type' => 'autocomplete',
'post_type' => ['formipay-product'], 'post_type' => ['formipay-product'],
'label' => __( 'Assign Product', 'formipay' ), 'label' => __( 'Assign Product', 'formipay' ),
'description' => __( 'Selected products will added to the order items automatically.', 'formipay' ) 'description' => __( 'Selected products will be added to the order items automatically, even if it is not added to cart.', 'formipay' )
], ],
'static_items' => [ 'static_items' => [
'type' => 'repeater', 'type' => 'repeater',
'label' => __( 'Assign Items', 'formipay' ), 'label' => __( 'Static Items', 'formipay' ),
'description' => __( 'Static items will behave like fee that will affect to order calculation but nothing will be delivered.', 'formipay' ),
'fields' => [ 'fields' => [
'label' => [ 'label' => [
'type' => 'text', 'type' => 'text',
@@ -870,16 +874,46 @@ class Form {
'value' => 1, 'value' => 1,
'required' => true 'required' => true
], ],
'amount' => [
'type' => 'number',
'label' => __( 'Item Amount', 'formipay' ),
'description' => __( 'Will be calculated to item quantity', 'formipay' ),
'required' => true
]
] ]
] ]
]; ];
foreach($global_currencies as $currency){
$default_currency_symbol = formipay_get_currency_data_by_value($default_currency, 'symbol');
$currency_symbol = formipay_get_currency_data_by_value($currency['currency'], 'symbol');
$currency_title = ucwords(formipay_get_currency_data_by_value($currency['currency'], 'title'));
$decimal_digits = intval($currency['decimal_digits']);
$step = $decimal_digits * 10;
$step = $step > 0 ? 1 / $step : 1;
$cart_items['static_items']['fields']['amount_'.$currency_symbol] = [
'type' => 'number',
'step' => $step,
'min' => 0,
'label' => __( 'Item Price in '.$currency_symbol, 'formipay' ),
'description' => __( 'Will be calculated to item quantity', 'formipay' ),
'placeholder' => __( 'Auto', 'formipay' )
];
if(count($global_currencies) > 1){
if($default_currency_symbol === $currency_symbol){
$cart_items['static_items']['fields']['amount_'.$currency_symbol]['description'] = sprintf(
__( 'This is your default currency. <a href="%s" target="_blank">Change in Settings</a>', 'formipay' ),
admin_url('/admin.php?page=formipay-settings')
);
$cart_items['static_items']['fields']['amount_'.$currency_symbol]['required'] = true;
$cart_items['static_items']['fields']['amount_'.$currency_symbol]['placeholder'] = __( 'Enter Price...', 'formipay' );
}else{
$cart_items['static_items']['fields']['amount_'.$currency_symbol]['description'] = sprintf(
__( 'System will calculate the price in %s based on exchange rate against %s when you leave these empty.', 'formipay' ),
$currency_symbol, $default_currency_symbol
);
}
}else{
$cart_items['static_items']['fields']['amount_'.$currency_symbol]['label'] = __( 'Item Price', 'formipay' );
$cart_items['static_items']['fields']['amount_'.$currency_symbol]['placeholder'] = __( 'Enter Price...', 'formipay' );
}
}
$cart_items = apply_filters( 'formipay/form-settings/tab:cart/group:items', $cart_items ); $cart_items = apply_filters( 'formipay/form-settings/tab:cart/group:items', $cart_items );
$last_cart_items = array_key_last($cart_items); $last_cart_items = array_key_last($cart_items);

View File

@@ -15,6 +15,8 @@ class Order {
private $order_details; private $order_details;
private $chosen_currency;
/** /**
* Initializes the plugin by setting filters and administration functions. * Initializes the plugin by setting filters and administration functions.
*/ */
@@ -78,7 +80,6 @@ class Order {
wp_send_json_error([ wp_send_json_error([
'message' => 'Nonce verification failed' 'message' => 'Nonce verification failed'
]); ]);
// wp_send_json_error() dies internally, no need for exit
} }
// Sanitize and unslash inputs explicitly // Sanitize and unslash inputs explicitly
@@ -89,6 +90,7 @@ class Order {
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$order_meta_data = isset($_REQUEST['meta_data']) ? wp_unslash($_REQUEST['meta_data']) : []; $order_meta_data = isset($_REQUEST['meta_data']) ? wp_unslash($_REQUEST['meta_data']) : [];
$purpose = isset($_REQUEST['purpose']) ? sanitize_text_field(wp_unslash($_REQUEST['purpose'])) : ''; $purpose = isset($_REQUEST['purpose']) ? sanitize_text_field(wp_unslash($_REQUEST['purpose'])) : '';
$this->currency = isset($_REQUEST['currency']) ? wp_unslash($_REQUEST['currency']) : formipay_default_currency('symbol');
$this->form_id = $form_id; $this->form_id = $form_id;
@@ -104,6 +106,7 @@ class Order {
if ($purpose === 'calculate') { if ($purpose === 'calculate') {
$order_data['total'] = $total; $order_data['total'] = $total;
$order_data['items'] = $order_details; $order_data['items'] = $order_details;
$order_data['form_data'] = formipay_get_post_meta($form_id);
wp_send_json($order_data); wp_send_json($order_data);
} }
@@ -206,64 +209,98 @@ class Order {
public function process_order_details() { public function process_order_details() {
$currency_codes = [];
$allowed_currencies = formipay_get_post_meta($this->form_id, 'allowed_currencies');
if(!empty($allowed_currencies)){
$parse_currencies = json_decode($allowed_currencies, true);
foreach($parse_currencies as $currency_data){
$parse_currency = explode(':::', $currency_data);
$currency_codes[] = $parse_currency[0];
}
}
$details = []; $details = [];
$product_price = floatval(formipay_get_post_meta($this->form_id, 'product_price')); // $product_price = floatval(formipay_get_post_meta($this->form_id, 'product_price'));
$details[] = [ // $details[] = [
'item' => html_entity_decode(get_the_title($this->form_id)), // 'item' => html_entity_decode(get_the_title($this->form_id)),
'amount' => $product_price, // 'amount' => $product_price,
'qty' => $this->order_data['qty'], // 'qty' => (int) $this->order_data['qty'],
'subtotal' => floatval($product_price) * intval($this->order_data['qty']), // 'subtotal' => floatval($product_price) * intval($this->order_data['qty']),
'context' => 'main' // 'context' => 'main'
]; // ];
$check_fields = formipay_get_post_meta($this->form_id, 'formipay_settings'); // $check_fields = formipay_get_post_meta($this->form_id, 'formipay_settings');
if(!empty($check_fields['fields'])){ // if(!empty($check_fields['fields'])){
foreach($check_fields['fields'] as $field){ // foreach($check_fields['fields'] as $field){
// if($field['field_type'] == 'select'){ // // if($field['field_type'] == 'select'){
if(in_array($field['field_type'], ['select','checkbox', 'radio'])) { // if(in_array($field['field_type'], ['select','checkbox', 'radio'])) {
$options = $field['field_options']; // $options = $field['field_options'];
if(!empty($options)){ // if(!empty($options)){
foreach($options as $option){ // foreach($options as $option){
$option_value = ($field['show_toggle']['value'] && '' !== $option['value']) ? $option['value'] : $option['label']; // $option_value = ($field['show_toggle']['value'] && '' !== $option['value']) ? $option['value'] : $option['label'];
if(!empty($this->order_data[$field['field_id']])) { // if(!empty($this->order_data[$field['field_id']])) {
$field_value = $this->order_data[$field['field_id']]; // $field_value = $this->order_data[$field['field_id']];
if($field['field_type'] == 'select'){ // if($field['field_type'] == 'select'){
$field_value = ($field['show_toggle']['value']) ? // $field_value = ($field['show_toggle']['value']) ?
$this->order_data[$field['field_id']]['value'] : // $this->order_data[$field['field_id']]['value'] :
$this->order_data[$field['field_id']]['label']; // $this->order_data[$field['field_id']]['label'];
} // }
$field_value = explode(',', $field_value); // $field_value = explode(',', $field_value);
$context = 'no-context'; // $context = 'no-context';
if(floatval($option['amount']) < 0){ // if(floatval($option['amount']) < 0){
$context = 'sub'; // $context = 'sub';
}elseif(floatval($option['amount']) > 0){ // }elseif(floatval($option['amount']) > 0){
$context = 'add'; // $context = 'add';
} // }
if(!empty($field_value) && $field['show_toggle']['amount'] == 'yes'){ // if(!empty($field_value) && $field['show_toggle']['amount'] == 'yes'){
foreach($field_value as $f_value){ // foreach($field_value as $f_value){
if($option_value == $f_value){ // if($option_value == $f_value){
$qty = ($option['qty'] == 'yes') ? $this->order_data['qty'] : 1; // $qty = ($option['qty'] == 'yes') ? $this->order_data['qty'] : 1;
$details[] = [ // $details[] = [
'item' => $field['label'] .' - '. $option['label'], // 'item' => $field['label'] .' - '. $option['label'],
'amount' => floatval($option['amount']), // 'amount' => floatval($option['amount']),
'qty' => $qty, // 'qty' => (int) $qty,
'subtotal' => floatval($option['amount']) * intval($qty), // 'subtotal' => floatval($option['amount']) * intval($qty),
'context' => $context // 'context' => $context
]; // ];
} // }
} // }
} // }
} // }
} // }
} // }
} // }
// }
// }
/**
* Cart items (not implemented yet)
*/
/**
* Attached Product
*/
$products = formipay_get_post_meta($this->form_id, 'static_products');
if(!empty($products)){
$products = explode(',', $products);
foreach($products as $product_id){
$product_data = formipay_get_post_meta($product_id);
$regular_price = formipay_get_post_meta($product_id, 'setting_product_price_regular_'.$this->currency);
$sale_price = formipay_get_post_meta($product_id, 'setting_product_price_sale_'.$this->currency);
$this_item = [
'item' => html_entity_decode(get_the_title($product_id)),
'amount' => (float) $sale_price ?: $regular_price,
'qty' => 1,
'subtotal' => (float) $sale_price ?: $regular_price,
];
} }
} }

View File

@@ -45,6 +45,8 @@ class Render {
self::$form_ids[] = $post_id; self::$form_ids[] = $post_id;
} }
$isDonation = formipay_is_donation($post_id);
$form_settings = get_post_meta($post_id, 'formipay_settings', true); $form_settings = get_post_meta($post_id, 'formipay_settings', true);
$point_symbol = formipay_get_post_meta($post_id, 'multistep_point_symbol'); $point_symbol = formipay_get_post_meta($post_id, 'multistep_point_symbol');
$point_icons = formipay_get_post_meta($post_id, 'multistep_point_icons'); $point_icons = formipay_get_post_meta($post_id, 'multistep_point_icons');

View File

@@ -57,31 +57,38 @@ span.product-qty-wrapper {
gap: .5em; gap: .5em;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
border: 1px solid #ddd;
border-radius: .5rem;
background-color: white;
width: fit-content;
} }
span.product-qty-wrapper > button { span.product-qty-wrapper > button {
width: 40px;
height: 40px;
min-width: unset!important; min-width: unset!important;
text-align: center; text-align: center;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
padding: 0!important; padding: 0 .25rem;
border-radius: 50%; background-color: white;
background-color: var(--formipay-button-submit-bg-color);
} }
span.product-qty-wrapper > button svg path { span.product-qty-wrapper > button svg path {
stroke: var(--formipay-button-submit-text-color); stroke: var(--formipay-button-submit-text-color);
} }
span.product-qty-wrapper > button:disabled { span.product-qty-wrapper > button {
background-color: #efefef; background-color: transparent;
}
span.product-qty-wrapper > button svg path {
stroke: var(--formipay-button-submit-bg-color);
} }
span.product-qty-wrapper > button:disabled svg path { span.product-qty-wrapper > button:disabled svg path {
stroke: #666; stroke: #666;
} }
span.product-qty-wrapper > input { span.product-qty-wrapper > input {
height: 40px;
width: 40px!important; width: 40px!important;
padding: .25rem!important;
border: unset!important;
background-color: transparent;
min-width: unset;
text-align: center; text-align: center;
} }
span.product-qty-wrapper > input::-webkit-outer-spin-button, span.product-qty-wrapper > input::-webkit-outer-spin-button,

View File

@@ -1,5 +1,6 @@
jQuery(function($){ jQuery(function($){
console.info(formipay_form);
let formipay_form_id = $('[data-form-id]').attr('data-form-id'); let formipay_form_id = $('[data-form-id]').attr('data-form-id');
let formipay = formipay_form.forms[formipay_form_id]; let formipay = formipay_form.forms[formipay_form_id];
@@ -218,7 +219,8 @@ jQuery(function($){
form_inputs.append('action', 'formipay_submission'); form_inputs.append('action', 'formipay_submission');
form_inputs.append('nonce', formipay_form.nonce); form_inputs.append('nonce', formipay_form.nonce);
form_inputs.append('data[qty]', $('.formipay-qty-input').val()); form_inputs.append('data[qty]', $('.formipay-qty-input').val());
form_inputs.append('form_id', form_id); form_inputs.append('form_id', form_id);
form_inputs.append('currency', 'IDR');
var $valid = true; // Initialize as true var $valid = true; // Initialize as true

View File

@@ -76,41 +76,4 @@ Developed by Dwindi Ramadhana.
== Privacy == == Privacy ==
Formipay collects and processes user data in accordance with GDPR. Please review and customize the included privacy policy template for your site. Formipay collects and processes user data in accordance with GDPR. Please review and customize the included privacy policy template for your site.
== Mermaid Multi-Currency Implementation ==
flowchart TD
GS[Global Settings]
GS -->|Toggle: MultiCurrency ON/OFF| MODE{Mode}
%% SINGLE-CURRENCY MODE
MODE -->|OFF| SC[SingleCurrency Mode]
SC -->|GS Default Currency only| FS1[Form Settings]
SC -->|GS Default Currency only| PS1[Product Settings]
FS1 --> CO1[Checkout]
PS1 --> CO1
CO1 --> ORD1[Order Stored :: currency = GS default]
ORD1 --> RPT1[Reports for single currency]
%% MULTI-CURRENCY MODE
MODE -->|ON| MC[MultiCurrency Mode]
GS -->|Enabled Currencies + Rates| FS[Form Settings]
GS -->|Enabled Currencies + Rates| PS[Product Settings xN]
FS -->|FS.allowed ⊆ GS.enabled\nFS.default ∈ FS.allowed| CK[Checkout]
PS -->|Per Product:\nBase currency default GS\nManual overrides optional\nDerive from base via GS toggle| CK
CK -->|Compute CheckoutAllowed =\nFS.allowed ∩ as ProductSupported p| ALLOWED{CheckoutAllowed empty?}
ALLOWED -->|Yes| BLOCK[Block checkout + Admin diagnostic:\nEnable derive / add manual prices /\nadjust FS.allowed / remove product]
ALLOWED -->|No| CUR[Buyer selects currency ∈ CheckoutAllowed]
CUR --> PAY[Filter payment gateways by selected currency]
PAY --> TOT[Compute totals:\nManual price → else derive via GS]
TOT --> ORD[Persist Order:\norder_currency, total_in_order_currency,\nfx_rate_used, report_total_in_GS_base]
ORD --> RPT[Reports:\nSum in GS base with percurrency breakdown option]
%% CATALOG (when MC=ON)
MC --> CAT[Catalog]
CAT -->|Query: currency=USD,IDR,AUTO| RESOLVE[Resolve display currency AUTO→pref/GS default]
RESOLVE --> FILT[Filter products strictly:\nshow only products supporting the display currency\n derive ok if product toggle is ON]