/* SQL Chart Builder 3.0 — admin chart builder UI */ jQuery(function ($) { 'use strict'; var $app = $('#gvnsql-app'); if (!$app.length) return; var cfg = window.gvnSqlBuilder || { tables: [], prefix: 'wp_', ajaxurl: window.ajaxurl, nonce: '' }; var $sql = $('#guaven_sqlcharts_code'); /* ============ tabs ============ */ $('#gvnsql-tabs').on('click', '.gvnsql-tab', function () { var tab = $(this).data('tab'); $('.gvnsql-tab').removeClass('active'); $(this).addClass('active'); $('.gvnsql-section').removeClass('active').filter('[data-tab="' + tab + '"]').addClass('active'); }); /* ============ chart type cards + guides ============ */ $app.on('change', '.gvnsql-typecard input[type=radio]', function () { var type = $(this).val(); $('.gvnsql-typecard').removeClass('selected'); $(this).closest('.gvnsql-typecard').addClass('selected'); $('.gvnsql-guide').hide().filter('[data-guide="' + type + '"]').show(); }); $app.on('click', '.gvnsql-use-example', function () { var $btn = $(this); if ($.trim($sql.val()) !== '' && !window.confirm('Replace the current SQL query with the example?')) return; $sql.val($btn.data('sql')); $('#guaven_sqlcharts_xarg_s').val($btn.data('x')); $('#guaven_sqlcharts_yarg_s').val($btn.data('y')); if ($('#guaven_sqlcharts_xarg_l').val() === '') $('#guaven_sqlcharts_xarg_l').val($btn.data('x')); if ($('#guaven_sqlcharts_yarg_l').val() === '') $('#guaven_sqlcharts_yarg_l').val($btn.data('yl')); prefetchTablesInQuery(); refreshColMapSelects(); refreshFilterNameSelects(); }); /* ============ insert-at-caret helper ============ */ function insertAtCaret(text) { var el = $sql.get(0); el.focus(); var start = el.selectionStart, end = el.selectionEnd, val = el.value; // add a space before if gluing to a word character if (start > 0 && /[\w)]/.test(val.charAt(start - 1)) && !/^[\s,)]/.test(text)) text = ' ' + text; el.value = val.substring(0, start) + text + val.substring(end); el.selectionStart = el.selectionEnd = start + text.length; $sql.trigger('input'); } /* ============ toolbar ============ */ $('#gvnsql-toolbar').on('click', '.gvnsql-kw', function () { insertAtCaret($(this).data('insert')); }); var $tableSel = $('#gvnsql-table-select'), $colSel = $('#gvnsql-column-select'), $tagSel = $('#gvnsql-tag-select'); $.each(cfg.tables, function (i, t) { $tableSel.append($('').attr('label', table); $.each(cols, function (i, c) { $dl.append($(''); $.each(info.selectCols, function (i, c) { $g.append($(''); $.each(rest, function (i, c) { $g2.append($(''; }); return $('
' + '' + '' + '' + '' + '' + '' + '' + '
') .find('.gvnsql-filter-name').val(f.name).end() .find('.gvnsql-filter-label').val(f.label).end() .find('.gvnsql-filter-default').val(f.def).end(); } function parseFilters(raw) { var out = []; $.each($.trim(raw || '').split('|'), function (i, chunk) { chunk = $.trim(chunk); if (!chunk) return; var p = chunk.split('~').map(function (s) { return $.trim(s); }); if (!p[0]) return; out.push({ name: p[0], def: p[1] || '', label: p[2] || '', type: p[3] || '' }); }); return out; } function serializeFilters() { var parts = []; $filterRows.find('.gvnsql-filter-row').each(function () { var $r = $(this); var name = $.trim($r.find('.gvnsql-filter-name').val()); if (!name) return; var seg = [name, $.trim($r.find('.gvnsql-filter-default').val()), $.trim($r.find('.gvnsql-filter-label').val())]; var type = $r.find('.gvnsql-filter-type').val(); if (type) seg.push(type); parts.push(seg.join('~')); }); $filterRaw.val(parts.join(' | ')); rebuildTagSelect(); } /* tag-name dropdown per row: suggests {tags} already in the query and WHERE-clause columns */ function refreshFilterNameSelects() { var info = parseQueryInfo(); $filterRows.find('.gvnsql-filter-row').each(function () { var $row = $(this); var $sel = $row.find('.gvnsql-filter-name-select'); var $input = $row.find('.gvnsql-filter-name'); var cur = $.trim($input.val()); var opts = []; $.each(info.tags.concat(info.whereCols), function (i, t) { if ($.inArray(t, opts) === -1) opts.push(t); }); $sel.empty().append($(''); $.each(info.tags, function (i, t) { $g.append($(''); $.each(rest, function (i, c) { $g2.append($('