diff --git a/dt-core/admin/admin-settings-endpoints.php b/dt-core/admin/admin-settings-endpoints.php index 45d399ef7..264733adf 100644 --- a/dt-core/admin/admin-settings-endpoints.php +++ b/dt-core/admin/admin-settings-endpoints.php @@ -215,6 +215,64 @@ public function add_api_routes() { 'permission_callback' => [ $this, 'default_permission_check' ], ] ); + + register_rest_route( + $this->namespace, '/languages', [ + 'methods' => 'POST', + 'callback' => [ $this, 'update_languages' ], + 'permission_callback' => [ $this, 'default_permission_check' ], + ] + ); + } + + public function update_languages( WP_REST_REQUEST $request ) { + /** + * @todo: + * only save user provided customizations to the dt_working_languages options + * this includes labels, the iso code, the enabled status and translations + * does not include: the key, default labels etc + */ + $params = $request->get_params(); + $languages = dt_get_option( 'dt_working_languages' ); + + $langs = dt_get_available_languages(); + foreach ( $languages as $language_key => $language_options ){ + + if ( isset( $params[$language_key]['label'] ) ){ + $label = sanitize_text_field( wp_unslash( $params[$language_key]['label'] ) ); + if ( ( $language_options['label'] ?? '' ) != $label ){ + $languages[$language_key]['label'] = $label; + } + } + if ( isset( $params[$language_key]['iso_639-3'] ) ){ + $code = sanitize_text_field( wp_unslash( $params[$language_key]['iso_639-3'] ) ); + if ( ( $language_options['iso_639-3'] ?? '' ) != $code ) { + $languages[$language_key]['iso_639-3'] = $code; + } + } + if ( isset( $params[$language_key]['enabled'] ) ){ + $enabled = sanitize_text_field( wp_unslash( $params[$language_key]['enabled'] ) ); + if ( ( $language_options['enabled'] ?? '' ) != $enabled ) { + $languages[$language_key]['enabled'] = $enabled; + } + } + if ( isset( $params[$language_key]['translations'] ) ) { + foreach ( $langs as $lang => $val ){ + $langcode = $val['language']; + $translations = sanitize_text_field( wp_unslash( $params[$language_key]['translations'][$langcode] ) ); + if ( isset( $params[$language_key]['translations'][$langcode] ) ) { + $translated_label = sanitize_text_field( wp_unslash( $params[$language_key]['translations'][$langcode] ) ); + if ( ( empty( $translated_label ) && !empty( $languages[$language_key]['translations'][$langcode] ) ) || !empty( $translated_label ) ){ + $languages[$language_key]['translations'][$langcode] = $translated_label; + } + } + } + } + $languages[$language_key]['deleted'] = !isset( $params[$language_key]['deleted'] ); + } + + update_option( 'dt_working_languages', $languages, false ); + return true; } public static function get_post_fields() { diff --git a/dt-core/admin/js/dt-options.js b/dt-core/admin/js/dt-options.js index 38e6c8dd3..a9f187b10 100644 --- a/dt-core/admin/js/dt-options.js +++ b/dt-core/admin/js/dt-options.js @@ -1,20 +1,105 @@ jQuery(document).ready(function ($) { - $('.expand_translations').click(function (e) { + $(".expand_translations").click(function (e) { e.preventDefault(); display_translation_dialog( $(this).siblings(), - $(this).data('form_name'), - $(this).data('source'), + $(this).data("form_name"), + $(this).data("source"), + $(this).data("value"), + $(this).data("callback") ); }); - $('.change-icon-button').click(function (e) { + // Handle label language translations on a language + window.update_language_translations = function (source, value) { + let translations_list = {}; + $( + `#language_table .language_label_translations[data-field="${value}"]` + ).each(function (index, element) { + const language = $(element).data("field"); + if (!translations_list[language]) { + translations_list[language] = {}; + } + if (!translations_list[language].translations) { + translations_list[language].translations = {}; + } + const translation_key = $(element).data("value"); + translations_list[language].translations[translation_key] = + $(element).val(); + }); + + $.ajax({ + type: "POST", + dataType: "json", + data: JSON.stringify(translations_list), + contentType: "application/json; charset=utf-8", + url: `${window.dt_admin_scripts.rest_root}dt-admin-settings/languages/`, + beforeSend: (xhr) => { + xhr.setRequestHeader("X-WP-Nonce", window.dt_admin_scripts.nonce); + }, + success: function (response) { + var languages = JSON.parse(response); + console.log(languages); + }, + error: function (xhr, status, error) { + console.log(error); + console.log(status); + console.error(xhr.responseText); + }, + }); + }; + + // Handle languages tables + $("#save_lang_button").click(function (e) { + e.preventDefault(); + let tableLangs = {}; + $("#language_table .language-row").each(function (index, element) { + const lang = $(element).data("lang"); + const label = $(element).find(".custom_label input").val(); + const iso_code = $(element).find(".iso_code input").val(); + const enabled = $(element).find(".enabled input").prop("checked"); + + if (!tableLangs[lang]) { + tableLangs[lang] = { + label: "", + "iso_639-3": "", + enabled: "", + }; + } + + tableLangs[lang]["label"] = label; + tableLangs[lang]["iso_639-3"] = iso_code; + tableLangs[lang]["enabled"] = enabled; + }); + + $.ajax({ + type: "POST", + dataType: "json", + data: JSON.stringify(tableLangs), + contentType: "application/json; charset=utf-8", + url: `${window.dt_admin_scripts.rest_root}dt-admin-settings/languages/`, + beforeSend: (xhr) => { + xhr.setRequestHeader("X-WP-Nonce", window.dt_admin_scripts.nonce); + }, + success: function (response) { + var languages = JSON.parse(response); + console.log(languages, "success"); + }, + error: function (xhr, status, error) { + console.log(error); + console.log(status); + console.error(xhr.responseText); + }, + }); + }); + + $(".change-icon-button").click(function (e) { e.preventDefault(); // Fetch handle to key workflow elements - let parent_form = $("form[name='" + $(e.currentTarget).data('form') + "']"); + let parent_form = $("form[name='" + $(e.currentTarget).data("form") + "']"); let icon_input = $( - "input[name='" + $(e.currentTarget).data('icon-input') + "']", + "input[name='" + $(e.currentTarget).data("icon-input") + "']" ); // Display icon selector dialog @@ -22,11 +107,11 @@ jQuery(document).ready(function ($) { }); // Support DT customization icon picker requests. - $('.dt-admin-modal-box').on('click', '.change-icon-button', function (e) { + $(".dt-admin-modal-box").on("click", ".change-icon-button", function (e) { let icon_input = $( - "input[name='" + $(e.currentTarget).data('icon-input') + "']", + "input[name='" + $(e.currentTarget).data("icon-input") + "']" ); - let dialog = $('#dt_icon_selector_dialog'); + let dialog = $("#dt_icon_selector_dialog"); if (dialog) { dialog.dialog({ @@ -34,31 +119,31 @@ jQuery(document).ready(function ($) { autoOpen: false, hide: 0, show: 0, - height: 'auto', - width: 'auto', + height: "auto", + width: "auto", resizable: false, - title: 'Icon Selector Dialog', + title: "Icon Selector Dialog", buttons: [ { - text: 'Cancel', - icon: 'ui-icon-close', + text: "Cancel", + icon: "ui-icon-close", click: function () { - $(this).dialog('close'); + $(this).dialog("close"); }, }, { - text: 'Save', - icon: 'ui-icon-copy', + text: "Save", + icon: "ui-icon-copy", click: function () {}, }, { - text: 'Upload Custom Icon', - icon: 'ui-icon-circle-zoomout', + text: "Upload Custom Icon", + icon: "ui-icon-circle-zoomout", click: function () {}, }, ], open: function (event, ui) { - let ui_dialog = $(document).find('.ui-dialog')[0]; + let ui_dialog = $(document).find(".ui-dialog")[0]; // Fetch and set font icon picker dialog contents. if (ui_dialog) { @@ -68,19 +153,19 @@ jQuery(document).ready(function ($) { - ${$(cloned).find('.ui-dialog-titlebar').html()} + ${$(cloned).find(".ui-dialog-titlebar").html()}
- ${$(cloned).find('.ui-dialog-content').html()} + ${$(cloned).find(".ui-dialog-content").html()}
- ${$(cloned).find('.ui-dialog-buttonpane').html()} + ${$(cloned).find(".ui-dialog-buttonpane").html()} @@ -88,17 +173,17 @@ jQuery(document).ready(function ($) { `; // Set some initial defaults to aid downstream processing. - let content = $('.dt-admin-modal-icon-picker-box-content'); + let content = $(".dt-admin-modal-icon-picker-box-content"); content.html(html); - content.find('button.ui-dialog-titlebar-close').hide(); - content.find('span.ui-dialog-title').css('font-weight', 'bold'); + content.find("button.ui-dialog-titlebar-close").hide(); + content.find("span.ui-dialog-title").css("font-weight", "bold"); content - .find('button.ui-button') - .data('icon-input', icon_input.attr('name')); + .find("button.ui-button") + .data("icon-input", icon_input.attr("name")); } // Force an immediate close, to draw attention to flipped content! - $(this).dialog('close'); + $(this).dialog("close"); // Display some initial icons execute_icon_selection_filter_query(false); @@ -107,65 +192,65 @@ jQuery(document).ready(function ($) { }); // Insert selection area div, within dialog button footer - let ui_dialog_buttonset = $('.ui-dialog-buttonset'); - ui_dialog_buttonset.css('margin', '1.5em'); + let ui_dialog_buttonset = $(".ui-dialog-buttonset"); + ui_dialog_buttonset.css("margin", "1.5em"); ui_dialog_buttonset.prepend( - $('') - .attr('id', 'dialog_icon_selector_icon_selection_div') - .css('display', 'inline-block') - .css('vertical-align', 'middle') - .css('padding', '0') - .css('margin-right', '175px'), + $("") + .attr("id", "dialog_icon_selector_icon_selection_div") + .css("display", "inline-block") + .css("vertical-align", "middle") + .css("padding", "0") + .css("margin-right", "175px") ); // Display updated dialog - dialog.dialog('open'); + dialog.dialog("open"); } }); - $('.dt-admin-modal-box').on('click', '.ui-button', function (e) { + $(".dt-admin-modal-box").on("click", ".ui-button", function (e) { // Determine action to be taken. let button = $(e.currentTarget); - let icon_input = $("input[name='" + $(button).data('icon-input') + "']"); - let close_button = button.find('span.ui-icon-close'); - let save_button = button.find('span.ui-icon-copy'); - let upload_button = button.find('span.ui-icon-circle-zoomout'); + let icon_input = $("input[name='" + $(button).data("icon-input") + "']"); + let close_button = button.find("span.ui-icon-close"); + let save_button = button.find("span.ui-icon-copy"); + let upload_button = button.find("span.ui-icon-circle-zoomout"); if (close_button && close_button.length > 0) { - $('.dt-admin-modal-icon-picker-box-close-button').click(); + $(".dt-admin-modal-icon-picker-box-close-button").click(); } else if (save_button && save_button.length > 0) { handle_icon_save(null, null, icon_input, function (source) { // Refresh icon image accordingly, to capture any changes. let icon_img_wrapper = $(icon_input) .parent() - .find('.field-icon-wrapper'); + .find(".field-icon-wrapper"); if (icon_img_wrapper) { let icon = $(icon_input).val(); $(icon_img_wrapper).html( - icon && icon.trim().toLowerCase().startsWith('mdi') + icon && icon.trim().toLowerCase().startsWith("mdi") ? `` - : ``, + : `` ); } - $('.dt-admin-modal-icon-picker-box-close-button').click(); + $(".dt-admin-modal-icon-picker-box-close-button").click(); }); } else if (upload_button && upload_button.length > 0) { handle_icon_upload(null, null, icon_input, function (source) { // Refresh icon image accordingly, to capture any changes. let icon_img_wrapper = $(icon_input) .parent() - .find('.field-icon-wrapper'); + .find(".field-icon-wrapper"); if (icon_img_wrapper) { let icon = $(icon_input).val(); $(icon_img_wrapper).html( - icon && icon.trim().toLowerCase().startsWith('mdi') + icon && icon.trim().toLowerCase().startsWith("mdi") ? `` - : ``, + : `` ); } - $('.dt-admin-modal-icon-picker-box-close-button').click(); + $(".dt-admin-modal-icon-picker-box-close-button").click(); }); } }); @@ -174,7 +259,7 @@ jQuery(document).ready(function ($) { * Icon selector modal dialog - Process icon selection filter queries & selections */ - $(document).on('keyup', '#dialog_icon_selector_filter_input', function (e) { + $(document).on("keyup", "#dialog_icon_selector_filter_input", function (e) { let code = e.keyCode || e.which; // Only get excited over specific key codes. @@ -183,7 +268,7 @@ jQuery(document).ready(function ($) { } }); - $(document).on('click', '.dialog-icon-selector-icon', function (e) { + $(document).on("click", ".dialog-icon-selector-icon", function (e) { handle_icon_selection($(e.currentTarget)); }); @@ -194,40 +279,48 @@ jQuery(document).ready(function ($) { * Translation modal dialog */ - function display_translation_dialog(container, form_name, source = '') { - let dialog = $('#dt_translation_dialog'); - if (container && form_name && dialog) { + function display_translation_dialog( + container, + form_name, + source = "", + value = "", + callback = "" + ) { + let dialog = $("#dt_translation_dialog"); + if (container && dialog) { // Update dialog div $(dialog) .empty() - .append($($(container).find('table')[0]).clone()); + .append($($(container).find("table")[0]).clone()); // Refresh dialog config dialog.dialog({ modal: true, autoOpen: false, - hide: 'fade', - show: 'fade', - height: 'auto', - width: 'auto', + hide: "fade", + show: "fade", + height: "auto", + width: "auto", resizable: true, - title: 'Translation Dialog', + title: "Translation Dialog", buttons: { Update: function () { // Update source translation container $(container).empty().append($(this).children()); // Close dialog - $(this).dialog('close'); + $(this).dialog("close"); // Finally, auto save changes, accordingly, based on source. - if (window.lodash.includes(['fields'], source)) { + if (window.lodash.includes(["fields"], source)) { handle_custom_field_save_request( null, - $('.dt-custom-fields-save-button')[0], - true, + $(".dt-custom-fields-save-button")[0], + true ); - } else { + } else if (callback) { + window[callback](source, value); + } else if (form_name) { $('form[name="' + form_name + '"]').submit(); } }, @@ -235,11 +328,7 @@ jQuery(document).ready(function ($) { }); // Display updated dialog - dialog.dialog('open'); - } else { - console.log( - 'Unable to reference a valid: [container, form-name, dialog]', - ); + dialog.dialog("open"); } } @@ -250,39 +339,39 @@ jQuery(document).ready(function ($) { function display_icon_selector_dialog( parent_form, icon_input, - callback = function (source) {}, + callback = function (source) {} ) { - let dialog = $('#dt_icon_selector_dialog'); + let dialog = $("#dt_icon_selector_dialog"); if (dialog) { // Refresh dialog config dialog.dialog({ modal: true, autoOpen: false, - hide: 'fade', - show: 'fade', - height: 'auto', - width: 'auto', + hide: "fade", + show: "fade", + height: "auto", + width: "auto", resizable: false, - title: 'Icon Selector Dialog', + title: "Icon Selector Dialog", buttons: [ { - text: 'Cancel', - icon: 'ui-icon-close', + text: "Cancel", + icon: "ui-icon-close", click: function () { - $(this).dialog('close'); - callback('cancel'); + $(this).dialog("close"); + callback("cancel"); }, }, { - text: 'Save', - icon: 'ui-icon-copy', + text: "Save", + icon: "ui-icon-copy", click: function () { handle_icon_save(this, parent_form, icon_input, callback); }, }, { - text: 'Upload Custom Icon', - icon: 'ui-icon-circle-zoomout', + text: "Upload Custom Icon", + icon: "ui-icon-circle-zoomout", click: function () { handle_icon_upload(this, parent_form, icon_input, callback); }, @@ -293,24 +382,24 @@ jQuery(document).ready(function ($) { execute_icon_selection_filter_query(); }, close: function (event, ui) { - callback('dialogclose'); + callback("dialogclose"); }, }); // Insert selection area div, within dialog button footer - $('.ui-dialog-buttonset').prepend( - $('') - .attr('id', 'dialog_icon_selector_icon_selection_div') - .css('display', 'inline-block') - .css('vertical-align', 'middle') - .css('padding', '0') - .css('margin-right', '175px'), + $(".ui-dialog-buttonset").prepend( + $("") + .attr("id", "dialog_icon_selector_icon_selection_div") + .css("display", "inline-block") + .css("vertical-align", "middle") + .css("padding", "0") + .css("margin-right", "175px") ); // Display updated dialog - dialog.dialog('open'); + dialog.dialog("open"); } else { - console.log('Unable to reference a valid: [dialog]'); + console.log("Unable to reference a valid: [dialog]"); } } @@ -324,15 +413,15 @@ jQuery(document).ready(function ($) { if ( window.lodash.includes( style_sheet.href, - 'dt-core/dependencies/mdi/css/materialdesignicons.min.css', + "dt-core/dependencies/mdi/css/materialdesignicons.min.css" ) ) { $.each(style_sheet.cssRules, function (key, rule) { - if (rule.constructor.name === 'CSSStyleRule') { + if (rule.constructor.name === "CSSStyleRule") { icon_class_names.push({ class: rule.selectorText.substring( 1, - rule.selectorText.indexOf(':'), + rule.selectorText.indexOf(":") ), }); } @@ -365,22 +454,22 @@ jQuery(document).ready(function ($) { function execute_icon_selection_filter_query(enable_tooltips = true) { // Always default to a somewhat wildcard search if input text is blank - let query = $('#dialog_icon_selector_filter_input').val().trim(); - query = window.lodash.isEmpty(query) ? 'a' : query; + let query = $("#dialog_icon_selector_filter_input").val().trim(); + query = window.lodash.isEmpty(query) ? "a" : query; // Proceed with icon display refresh - $('#dialog_icon_selector_icons_div').fadeOut('fast', function () { - $('#dialog_icon_selector_icons_search_msg').text('').fadeOut('fast'); - $('#dialog_icon_selector_icons_search_spinner') - .addClass('active') - .fadeIn('fast', function () { + $("#dialog_icon_selector_icons_div").fadeOut("fast", function () { + $("#dialog_icon_selector_icons_search_msg").text("").fadeOut("fast"); + $("#dialog_icon_selector_icons_search_spinner") + .addClass("active") + .fadeIn("fast", function () { // Clear currently displayed icons - $('#dialog_icon_selector_icons_table > tbody > tr').remove(); + $("#dialog_icon_selector_icons_table > tbody > tr").remove(); // Obtain filtered icon list let filtered_icons = window.lodash.filter(icons, function (icon) { return ( - icon['class'] && window.lodash.includes(icon['class'], query) + icon["class"] && window.lodash.includes(icon["class"], query) ); }); @@ -390,12 +479,12 @@ jQuery(document).ready(function ($) { // Populate icons table let loop_counter = 0; let icon_counter = 0; - let tds = ''; + let tds = ""; $.each(filtered_icons, function (idx, filtered_icon) { loop_counter++; - let icon_class_name = filtered_icon['class']; + let icon_class_name = filtered_icon["class"]; if (icon_class_name && is_icon_valid(icon_class_name)) { tds += ''; if (++icon_counter > 5 || loop_counter >= filtered_icons.length) { - $('#dialog_icon_selector_icons_table > tbody').append( - '' + tds + '', + $("#dialog_icon_selector_icons_table > tbody").append( + "" + tds + "" ); icon_counter = 0; - tds = ''; + tds = ""; } } }); // If requested, activate icon tooltips if (enable_tooltips) { - $('#dialog_icon_selector_icons_table > tbody') - .find('.mdi') + $("#dialog_icon_selector_icons_table > tbody") + .find(".mdi") .each(function (idx, icon) { $(icon).tooltip({ - show: { effect: 'fade', duration: 100 }, + show: { effect: "fade", duration: 100 }, }); }); } - $('#dialog_icon_selector_icons_search_spinner') - .removeClass('active') - .fadeOut('fast', function () { + $("#dialog_icon_selector_icons_search_spinner") + .removeClass("active") + .fadeOut("fast", function () { // Display results or no icons found message if (filtered_icons.length > 0) { - $('#dialog_icon_selector_icons_div').fadeIn('fast'); + $("#dialog_icon_selector_icons_div").fadeIn("fast"); } else { - $('#dialog_icon_selector_icons_search_msg') - .text('No Icons Found') - .fadeIn('fast'); + $("#dialog_icon_selector_icons_search_msg") + .text("No Icons Found") + .fadeIn("fast"); } }); }); @@ -449,19 +538,19 @@ jQuery(document).ready(function ($) { function is_icon_valid(icon_class_name) { // Firstly, empty sandbox... - $('#dialog_icon_selector_icons_sandbox_div').empty(); + $("#dialog_icon_selector_icons_sandbox_div").empty(); // Add corresponding icon - let icon = $('') - .addClass('mdi ' + icon_class_name) - .appendTo('#dialog_icon_selector_icons_sandbox_div'); + let icon = $("") + .addClass("mdi " + icon_class_name) + .appendTo("#dialog_icon_selector_icons_sandbox_div"); // Determine icon validity let valid = - window.getComputedStyle(icon[0], ':before')['content'] !== 'none'; + window.getComputedStyle(icon[0], ":before")["content"] !== "none"; // Clear down sandbox and return findings - $('#dialog_icon_selector_icons_sandbox_div').empty(); + $("#dialog_icon_selector_icons_sandbox_div").empty(); return valid; } @@ -476,21 +565,21 @@ jQuery(document).ready(function ($) { let cloned_icon = $(icon).clone(true); // Using some fancy transitions, assign new cloned selection - $('#dialog_icon_selector_icon_selection_div').fadeOut( - 'fast', + $("#dialog_icon_selector_icon_selection_div").fadeOut( + "fast", function () { // Clear out previous selections - $('#dialog_icon_selector_icon_selection_div').empty(); + $("#dialog_icon_selector_icon_selection_div").empty(); // Make use of selection css class - $(cloned_icon).removeClass('dialog-icon-selector-icon'); - $(cloned_icon).addClass('dialog-icon-selector-icon-selected'); - $(cloned_icon).attr('title', $(icon).data('icon_class')); + $(cloned_icon).removeClass("dialog-icon-selector-icon"); + $(cloned_icon).addClass("dialog-icon-selector-icon-selected"); + $(cloned_icon).attr("title", $(icon).data("icon_class")); // Append and display selection - $('#dialog_icon_selector_icon_selection_div').append($(cloned_icon)); - $('#dialog_icon_selector_icon_selection_div').fadeIn('fast'); - }, + $("#dialog_icon_selector_icon_selection_div").append($(cloned_icon)); + $("#dialog_icon_selector_icon_selection_div").fadeIn("fast"); + } ); } } @@ -503,19 +592,19 @@ jQuery(document).ready(function ($) { dialog, parent_form, icon_input, - callback = function (source) {}, + callback = function (source) {} ) { // Determine if there is a valid selection - let selected_icon = $('#dialog_icon_selector_icon_selection_div').find( - '.dialog-icon-selector-icon-selected', + let selected_icon = $("#dialog_icon_selector_icon_selection_div").find( + ".dialog-icon-selector-icon-selected" ); if ($(selected_icon).length) { // Update form icon class input - icon_input.val('mdi ' + $(selected_icon).data('icon_class')); + icon_input.val("mdi " + $(selected_icon).data("icon_class")); // If present, close dialog if (dialog) { - $(dialog).dialog('close'); + $(dialog).dialog("close"); } // If present, auto-submit; to refresh changes @@ -524,7 +613,7 @@ jQuery(document).ready(function ($) { } // Execute callback with relevant source flag. - callback('save'); + callback("save"); } } @@ -536,17 +625,17 @@ jQuery(document).ready(function ($) { dialog, parent_form, icon_input, - callback = function (source) {}, + callback = function (source) {} ) { // Build media uploader modal let mediaFrame = window.wp.media({ // Accepts [ 'select', 'post', 'image', 'audio', 'video' ] // Determines what kind of library should be rendered. - frame: 'select', + frame: "select", // Modal title. title: window.dt_admin_shared.escape( - window.dt_admin_scripts.upload.title, + window.dt_admin_scripts.upload.title ), // Enable/disable multiple select @@ -554,13 +643,13 @@ jQuery(document).ready(function ($) { // Library wordpress query arguments. library: { - order: 'DESC', + order: "DESC", // [ 'name', 'author', 'date', 'title', 'modified', 'uploadedTo', 'id', 'post__in', 'menuOrder' ] - orderby: 'date', + orderby: "date", // mime type. e.g. 'image', 'image/jpeg' - type: ['image'], + type: ["image"], // Searches the attachment title. search: null, @@ -571,22 +660,22 @@ jQuery(document).ready(function ($) { button: { text: window.dt_admin_shared.escape( - window.dt_admin_scripts.upload.button_txt, + window.dt_admin_scripts.upload.button_txt ), }, }); // Handle selected files - mediaFrame.on('select', function () { + mediaFrame.on("select", function () { // Fetch and convert selected into json object - let selected = mediaFrame.state().get('selection').first().toJSON(); + let selected = mediaFrame.state().get("selection").first().toJSON(); // Update form icon link icon_input.val(selected.url); // If present, close dialog if (dialog) { - $(dialog).dialog('close'); + $(dialog).dialog("close"); } // If present, auto-submit; to refresh changes @@ -595,7 +684,7 @@ jQuery(document).ready(function ($) { } // Execute callback with relevant source flag. - callback('upload'); + callback("upload"); }); // Open the media uploader. @@ -605,39 +694,39 @@ jQuery(document).ready(function ($) { /** * Sorting code for tiles */ - $('.connectedSortable') + $(".connectedSortable") .sortable({ - connectWith: '.connectedSortable', - placeholder: 'ui-state-highlight', + connectWith: ".connectedSortable", + placeholder: "ui-state-highlight", }) .disableSelection(); - $('#sort-tiles') + $("#sort-tiles") .sortable({ - items: 'div.sort-tile:not(.disabled-drag)', - placeholder: 'ui-state-highlight', - cancel: '.connectedSortable', + items: "div.sort-tile:not(.disabled-drag)", + placeholder: "ui-state-highlight", + cancel: ".connectedSortable", }) .disableSelection(); - $('.save-drag-changes').on('click', function () { + $(".save-drag-changes").on("click", function () { let order = []; - $('.sort-tile').each((a, b) => { - let tile_key = $(b).attr('id'); + $(".sort-tile").each((a, b) => { + let tile_key = $(b).attr("id"); let tile = { key: tile_key, fields: [], }; $(`#${tile_key} .connectedSortable li`).each((field_index, field) => { - tile.fields.push($(field).attr('id')); + tile.fields.push($(field).attr("id")); }); order.push(tile); }); - let input = $('') - .attr('type', 'hidden') - .attr('name', 'order') + let input = $("") + .attr("type", "hidden") + .attr("name", "order") .val(JSON.stringify(order)); - $('#tile-order-form').append(input).submit(); + $("#tile-order-form").append(input).submit(); }); /** @@ -645,74 +734,74 @@ jQuery(document).ready(function ($) { */ //show more fields when connection option selected - $('#new_field_type_select').on('change', function () { - if (this.value === 'connection') { - $('.connection_field_target_row').show(); - $('#private_field_row').hide(); - $('#connection_field_target').prop('required', true); + $("#new_field_type_select").on("change", function () { + if (this.value === "connection") { + $(".connection_field_target_row").show(); + $("#private_field_row").hide(); + $("#connection_field_target").prop("required", true); } else { - $('.connection_field_reverse_row').hide(); - $('.connection_field_target_row').hide(); - $('#private_field_row').show(); - $('#connection_field_target').prop('required', false); + $(".connection_field_reverse_row").hide(); + $(".connection_field_target_row").hide(); + $("#private_field_row").show(); + $("#connection_field_target").prop("required", false); } }); //show the reverse connection field name row if the post type is not "self" - $('#connection_field_target').on('change', function () { - let post_type_label = $('#connection_field_target option:selected').text(); - $('.connected_post_type').html(post_type_label); - if (this.value === $('#current_post_type').val()) { - $('.same_post_type_other_field_name').toggle( - !$('#multidirectional_checkbox').is(':checked'), + $("#connection_field_target").on("change", function () { + let post_type_label = $("#connection_field_target option:selected").text(); + $(".connected_post_type").html(post_type_label); + if (this.value === $("#current_post_type").val()) { + $(".same_post_type_other_field_name").toggle( + !$("#multidirectional_checkbox").is(":checked") ); - $('.connection_field_reverse_row').hide(); - $('.same_post_type_row').show(); + $(".connection_field_reverse_row").hide(); + $(".same_post_type_row").show(); } else { - $('.same_post_type_other_field_name').hide(); - $('.connection_field_reverse_row').show(); - $('.same_post_type_row').hide(); + $(".same_post_type_other_field_name").hide(); + $(".connection_field_reverse_row").show(); + $(".same_post_type_row").hide(); } }); - $('#multidirectional_checkbox').on('change', function () { - $('.same_post_type_other_field_name').toggle(!this.checked); + $("#multidirectional_checkbox").on("change", function () { + $(".same_post_type_other_field_name").toggle(!this.checked); }); /** * Sorting code for field options */ - $('.sortable-field-options') + $(".sortable-field-options") .sortable({ - connectWith: '.sortable-field-options', - placeholder: 'ui-state-highlight', + connectWith: ".sortable-field-options", + placeholder: "ui-state-highlight", update: function (evt, ui) { let updated_field_options_ordering = []; // Snapshot updated field options ordering by key. - $('.sortable-field-options') - .find('.sortable-field-options-key') + $(".sortable-field-options") + .find(".sortable-field-options-key") .each(function (idx, key_div) { let key = $(key_div).text().trim(); if (key) { updated_field_options_ordering.push( - encode_field_key_special_characters(key), + encode_field_key_special_characters(key) ); } }); // Persist updated field options ordering. - $('#sortable_field_options_ordering').val( - JSON.stringify(updated_field_options_ordering), + $("#sortable_field_options_ordering").val( + JSON.stringify(updated_field_options_ordering) ); }, }) .disableSelection(); function encode_field_key_special_characters(key) { - key = window.lodash.replace(key, '<', '_less_than_'); - key = window.lodash.replace(key, '>', '_more_than_'); + key = window.lodash.replace(key, "<", "_less_than_"); + key = window.lodash.replace(key, ">", "_more_than_"); return key; } @@ -722,20 +811,20 @@ jQuery(document).ready(function ($) { */ $(document).on( - 'click', + "click", 'input:radio[name="tile_display_option"]', function (e) { handle_tile_display_condition_selection($(e.currentTarget)); - }, + } ); function handle_tile_display_condition_selection(display_condition) { let show_custom = - display_condition && $(display_condition).val() == 'custom'; - let custom_elements = $('#tile_display_custom_elements'); + display_condition && $(display_condition).val() == "custom"; + let custom_elements = $("#tile_display_custom_elements"); show_custom - ? $(custom_elements).slideDown('slow') - : $(custom_elements).slideUp('slow'); + ? $(custom_elements).slideDown("slow") + : $(custom_elements).slideUp("slow"); } /** @@ -746,29 +835,29 @@ jQuery(document).ready(function ($) { * Tile Display Help Modal - [START] */ - $(document).on('click', '.help-button', function (e) { + $(document).on("click", ".help-button", function (e) { handle_tile_display_help_modal($(e.currentTarget)); }); function handle_tile_display_help_modal(help_button) { - let dialog = $('#' + $(help_button).data('dialog_id')); + let dialog = $("#" + $(help_button).data("dialog_id")); if (dialog) { // Refresh help dialog config dialog.dialog({ modal: true, autoOpen: false, - hide: 'fade', - show: 'fade', + hide: "fade", + show: "fade", height: 600, width: 450, resizable: true, - title: 'Help Dialog', + title: "Help Dialog", buttons: [ { - text: 'OK', - icon: 'ui-icon-check', + text: "OK", + icon: "ui-icon-check", click: function () { - $(this).dialog('close'); + $(this).dialog("close"); }, }, ], @@ -776,9 +865,9 @@ jQuery(document).ready(function ($) { }); // Display help dialog - dialog.dialog('open'); + dialog.dialog("open"); } else { - console.log('Unable to reference a valid: [dialog]'); + console.log("Unable to reference a valid: [dialog]"); } } @@ -790,14 +879,14 @@ jQuery(document).ready(function ($) { * Alternative Save Flow - [START] */ - $(document).on('click', '.dt-custom-fields-save-button', function (e) { + $(document).on("click", ".dt-custom-fields-save-button", function (e) { handle_custom_field_save_request(e, $(e.currentTarget), false); }); function handle_custom_field_save_request( event, save_button, - translate_update_only, + translate_update_only ) { // If defined, short-circuit default save flow and adopt ajax approach if needed. if (event) { @@ -806,19 +895,19 @@ jQuery(document).ready(function ($) { // Determine which save path is to be taken. if (!translate_update_only) { - $('form[name="' + $(save_button).data('form_id') + '"]').submit(); + $('form[name="' + $(save_button).data("form_id") + '"]').submit(); } else { // Always capture field parent level name & description translations; which is present across all fields. let payload = { - post_type: $(save_button).data('post_type'), - field_id: $(save_button).data('field_id'), - field_type: $(save_button).data('field_type'), + post_type: $(save_button).data("post_type"), + field_id: $(save_button).data("field_id"), + field_type: $(save_button).data("field_type"), translations: package_custom_field_translations( - $(save_button).data('field_id'), + $(save_button).data("field_id") ), option_translations: window.lodash.includes( - ['key_select', 'multi_select', 'link'], - $(save_button).data('field_type'), + ["key_select", "multi_select", "link"], + $(save_button).data("field_type") ) ? package_custom_field_option_translations() : [], @@ -826,72 +915,72 @@ jQuery(document).ready(function ($) { // Have core endpoint process field translations accordingly. $.ajax({ - type: 'POST', - contentType: 'application/json; charset=utf-8', - dataType: 'json', + type: "POST", + contentType: "application/json; charset=utf-8", + dataType: "json", data: JSON.stringify(payload), url: `${window.dt_admin_scripts.rest_root}dt-admin/scripts/update_custom_field_translations`, beforeSend: (xhr) => { - xhr.setRequestHeader('X-WP-Nonce', window.dt_admin_scripts.nonce); + xhr.setRequestHeader("X-WP-Nonce", window.dt_admin_scripts.nonce); }, }) .done(function (response) { // Update translation counts. - $('#custom_name_translation_count').html( - response['translations'] - ? Object.keys(response['translations']).length - : 0, + $("#custom_name_translation_count").html( + response["translations"] + ? Object.keys(response["translations"]).length + : 0 ); - $('#custom_description_translation_count').html( - response['description_translations'] - ? Object.keys(response['description_translations']).length - : 0, + $("#custom_description_translation_count").html( + response["description_translations"] + ? Object.keys(response["description_translations"]).length + : 0 ); if ( - response['defaults'] && + response["defaults"] && window.lodash.includes( - ['key_select', 'multi_select', 'link'], - $(save_button).data('field_type'), + ["key_select", "multi_select", "link"], + $(save_button).data("field_type") ) ) { - $('.sortable-field-options') - .find('tr.ui-sortable-handle') + $(".sortable-field-options") + .find("tr.ui-sortable-handle") .each(function (idx, tr) { let option_key = $(tr) - .find('.sortable-field-options-key') + .find(".sortable-field-options-key") .text() .trim(); $(tr) - .find('#option_name_translation_count') + .find("#option_name_translation_count") .html( - response['defaults'] && - response['defaults'][option_key] && - response['defaults'][option_key]['translations'] + response["defaults"] && + response["defaults"][option_key] && + response["defaults"][option_key]["translations"] ? Object.keys( - response['defaults'][option_key]['translations'], + response["defaults"][option_key]["translations"] ).length - : 0, + : 0 ); $(tr) - .find('#option_description_translation_count') + .find("#option_description_translation_count") .html( - response['defaults'] && - response['defaults'][option_key] && - response['defaults'][option_key][ - 'description_translations' + response["defaults"] && + response["defaults"][option_key] && + response["defaults"][option_key][ + "description_translations" ] ? Object.keys( - response['defaults'][option_key][ - 'description_translations' - ], + response["defaults"][option_key][ + "description_translations" + ] ).length - : 0, + : 0 ); }); } }) .fail(function (error) { - console.log('error'); + console.log("error"); console.log(error); }); } @@ -904,12 +993,12 @@ jQuery(document).ready(function ($) { }; // Locate field name translations. - let field_name_prefix = 'field_key_' + field_id + '_translation-'; + let field_name_prefix = "field_key_" + field_id + "_translation-"; $("input[id^='" + field_name_prefix + "']").each(function (idx, input) { - let locale = window.lodash.split($(input).attr('id'), '-')[1]; + let locale = window.lodash.split($(input).attr("id"), "-")[1]; let value = $(input).val(); if (locale && value) { - packaged_translations['translations'].push({ + packaged_translations["translations"].push({ locale: locale, value: value, }); @@ -917,19 +1006,20 @@ jQuery(document).ready(function ($) { }); // Locate field description translations. - let field_description_prefix = 'field_description_translation-'; - $("input[id^='" + field_description_prefix + "']").each( - function (idx, input) { - let locale = window.lodash.split($(input).attr('id'), '-')[1]; - let value = $(input).val(); - if (locale && value) { - packaged_translations['description_translations'].push({ - locale: locale, - value: value, - }); - } - }, - ); + let field_description_prefix = "field_description_translation-"; + $("input[id^='" + field_description_prefix + "']").each(function ( + idx, + input + ) { + let locale = window.lodash.split($(input).attr("id"), "-")[1]; + let value = $(input).val(); + if (locale && value) { + packaged_translations["description_translations"].push({ + locale: locale, + value: value, + }); + } + }); return packaged_translations; } @@ -937,33 +1027,33 @@ jQuery(document).ready(function ($) { function package_custom_field_option_translations() { let packaged_translations = []; - $('.sortable-field-options') - .find('tr.ui-sortable-handle') + $(".sortable-field-options") + .find("tr.ui-sortable-handle") .each(function (idx, tr) { let translations = { - option_key: '', + option_key: "", option_translations: [], option_description_translations: [], }; // Determine option key. let option_key = $(tr) - .find('.sortable-field-options-key') + .find(".sortable-field-options-key") .text() .trim(); if (option_key) { - translations['option_key'] = option_key; + translations["option_key"] = option_key; // Locate option key translations. let option_key_prefix = - 'field_option_' + option_key + '_translation-'; + "field_option_" + option_key + "_translation-"; $(tr) .find("input[id^='" + option_key_prefix + "']") .each(function (okt_idx, okt_input) { - let locale = window.lodash.split($(okt_input).attr('id'), '-')[1]; + let locale = window.lodash.split($(okt_input).attr("id"), "-")[1]; let value = $(okt_input).val(); if (locale && value) { - translations['option_translations'].push({ + translations["option_translations"].push({ locale: locale, value: $(okt_input).val(), }); @@ -972,17 +1062,17 @@ jQuery(document).ready(function ($) { // Locate option key description translations. let option_key_description_prefix = - 'option_description_' + option_key + '_translation-'; + "option_description_" + option_key + "_translation-"; $(tr) .find("input[id^='" + option_key_description_prefix + "']") .each(function (okdt_idx, okdt_input) { let locale = window.lodash.split( - $(okdt_input).attr('id'), - '-', + $(okdt_input).attr("id"), + "-" )[1]; let value = $(okdt_input).val(); if (locale && value) { - translations['option_description_translations'].push({ + translations["option_description_translations"].push({ locale: locale, value: $(okdt_input).val(), }); diff --git a/dt-core/admin/menu/tabs/tab-custom-lists.php b/dt-core/admin/menu/tabs/tab-custom-lists.php index baee73025..ea8c3a4d8 100644 --- a/dt-core/admin/menu/tabs/tab-custom-lists.php +++ b/dt-core/admin/menu/tabs/tab-custom-lists.php @@ -624,9 +624,7 @@ private function languages_box(){ }); $form_name = 'languages_box'; ?> -
- - +
@@ -640,23 +638,26 @@ private function languages_box(){ $language_option ) : - $enabled = !isset( $language_option['deleted'] ) || $language_option['deleted'] == false; ?> + $enabled = !isset( $language_option['enabled'] ) || $language_option['enabled'] == true; ?> + + + + + + - - - - - - - - +
+ /> +
@@ -683,21 +690,24 @@ private function languages_box(){ -
- + + +