diff --git a/plugins/suggest-tablefields.php b/plugins/suggest-tablefields.php new file mode 100644 index 00000000..8e1a07c9 --- /dev/null +++ b/plugins/suggest-tablefields.php @@ -0,0 +1,185 @@ + [ + 'DELETE FROM', 'DISTINCT', 'EXPLAIN', 'FROM', 'GROUP BY', 'HAVING', 'INSERT INTO', 'INNER JOIN', 'IGNORE', + 'LIMIT', 'LEFT JOIN', 'NULL', 'ORDER BY', 'ON DUPLICATE KEY UPDATE', 'SELECT', 'UPDATE', 'WHERE', + ] + ]; + + foreach (array_keys(tables_list()) as $table) { + $suggests['___tables___'][] = $table; + foreach (fields($table) as $field => $foo) { + $suggests[$table][] = $field; + } + } + + ?> + + type="text/javascript"> + + function domReady(fn) { + document.addEventListener("DOMContentLoaded", fn) + if (document.readyState === "interactive" || document.readyState === "complete" ) { + fn() + } + } + + function insertNodeAtCaret(node) { + if (typeof window.getSelection != "undefined") { + var sel = window.getSelection() + if (sel.rangeCount) { + var range = sel.getRangeAt(0) + range.collapse(false) + range.insertNode(node) + range = range.cloneRange() + range.selectNodeContents(node) + range.collapse(false) + sel.removeAllRanges() + sel.addRange(range) + } + } else if (typeof document.selection != "undefined" && document.selection.type != "Control") { + var html = (node.nodeType == 1) ? node.outerHTML : node.data + var id = "marker_" + ("" + Math.random()).slice(2) + html += '' + var textRange = document.selection.createRange() + textRange.collapse(false) + textRange.pasteHTML(html) + var markerSpan = document.getElementById(id) + textRange.moveToElementText(markerSpan) + textRange.select() + markerSpan.parentNode.removeChild(markerSpan) + } + } + + function getTable(suggests, tableName){ + var table = "
"+ tableName +"
" + for(var k in suggests[tableName]){ + table += "
"+ suggests[tableName][k] +"
" + } + return table + } + + function compile(data){ + document.getElementById('suggest_tablefields').innerHTML = data + document.getElementById('suggest_search').value = ''; + //console.log(data) + } + + domReady(() => { + const suggests = JSON.parse('') + const form = document.getElementById('form') + const sqlarea = document.getElementsByClassName('sqlarea')[0] + form.style.position = "relative" + + var suggests_mysql = "" + + suggests_mysql += "
" + for(var k in suggests['___tables___']){ + suggests_mysql += "
"+ suggests['___tables___'][k] +"
" + } + suggests_mysql += "
" + for(var k in suggests['___mysql___']){ + suggests_mysql += "
"+ suggests['___mysql___'][k] +"
" + } + + form.insertAdjacentHTML('afterbegin', '
') + compile(suggests_mysql) + + + document.addEventListener('click', function (event) { + if(event.target.getAttribute('id') === 'suggest_search'){ + return + } + if (event.target.matches('.jush-custom')) { + var table = getTable(suggests, event.target.textContent) + compile(table) + return + } + + if (!event.target.matches('#suggest_tablefields') && !event.target.matches('a') && !event.target.matches('strong') && !event.target.matches('.sqlarea') && !event.target.matches('.jush-sql_code') && !event.target.matches('.jush-bac') && !event.target.matches('.jush-op')){ + compile(suggests_mysql) + return + } + + }, false) + + document.getElementById('suggest_tablefields').addEventListener('click', function (event){ + if(event.target.matches('a') || event.target.matches('strong')){ + var target, text, bt = "`" + if(event.target.matches('strong')) { + target = event.target = event.target.parentElement + } + else{ + target = event.target + } + + text = target.textContent + sqlarea.focus() + + if(target.getAttribute("data-text")){ + text = target.getAttribute("data-text") + } + if(target.getAttribute("data-nobt")){ + bt = "" + } + + insertNodeAtCaret(document.createTextNode(bt + text + bt + " ")) + + if(target.getAttribute("data-table")){ + var table = getTable(suggests, target.textContent) + compile(table) + } + + sqlarea.dispatchEvent(new KeyboardEvent('keyup')) + } + }, false) + + + document.getElementById('suggest_search').addEventListener('keyup', function () { + var value = this.value.toLowerCase() + + if (value != '') { + var reg = (value + '').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, '\\$1') + reg = new RegExp('('+ reg + ')', 'gi') + } + + var tables = qsa('dd a', qs('#suggest_tablefields')) + for (var i = 0; i < tables.length; i++) { + var a = tables[i] + var text = tables[i].textContent + if (value == '') { + tables[i].className = '' + a.innerHTML = text + } else { + tables[i].className = (text.toLowerCase().indexOf(value) == -1 ? 'hidden' : '') + a.innerHTML = text.replace(reg, '$1') + } + } + + }, false) + + }) + + +