Compare commits

...

17 commits

Author SHA1 Message Date
Gerry Demaret 16f5d1ec66 docs: WiP, uncommitted changes I might not want to lose 2023-10-16 10:21:31 +02:00
Lionel Laffineur 88f6870bca Fix links going over body 2023-10-16 10:21:31 +02:00
Roy-Orbison e24219d137 Repair table filter plugin
Undo accidental reversion of commit 2b41f629a0
Check no other modifier keys & not already focussed for shortcut.
2023-10-16 10:21:31 +02:00
Lionel Laffineur c21d644947 Added a clipboard icon next to SQL command to expand and copy to clipboard 2023-10-16 10:21:31 +02:00
Lionel Laffineur ecbbe8de33 Fix issue with truncated queries and prevent copying queries > 1Mb to clipboard 2023-10-16 10:21:31 +02:00
SirTimme 9d25eff31f Updates pepe-linha-dark submodule to the lastest commit 2023-10-16 10:21:31 +02:00
Lionel Laffineur 5487e5ea8d Make sure DISTINCT function is seen as a group query 2023-10-16 10:21:31 +02:00
Lukáš Rajchl ee07a11465 Use links bar for "Create ..." functions 2023-10-16 10:21:31 +02:00
Lionel Laffineur d6d2050e99 Make sure table is marked active in select mode 2023-10-16 10:21:31 +02:00
Lionel Laffineur c75f437c77 Replaced icons from PNG to SVG to reduce CSS file size 2023-10-16 10:21:31 +02:00
Lukáš Rajchl 8b522c88e7 Remove undefined variable removed by #7442183 (for IE9 compatibility) 2023-10-16 10:21:31 +02:00
Lionel Laffineur 30bad1c1d2 Replaced Edit and Edit all of SQL Command history by icons 2023-10-16 10:21:31 +02:00
Lionel e62f5e5e52 Added key shortcut Ctrl+Shift+F to focus filter field and disabled enter key 2023-10-16 10:21:31 +02:00
Roy-Orbison f4532fa957 Filter tables plugin cleanup
- Put markup first and consolidate all script into single block
- Fix some JS oddities
- Put into IIFE no does not pollute the global namespace (prevents
  conflicts)
- Hide when JS disabled
2023-10-16 10:21:31 +02:00
Lionel Laffineur be135d2ed9 Fix JS error if #dbs is not in the page + add fieldset around input and add clear button next to input 2023-10-16 10:21:31 +02:00
Lionel Laffineur 7a8f9ec454 Fieldset rounded corners 2023-10-16 10:21:31 +02:00
Gerry Demaret 762a8948b9 docs: WiP - phpdocumentor templates
This is mainly to not lose what I have so far. The idea is to run
phpdocumentor on a select number of source code files, with the goal
of rendering something like https://www.adminer.org/en/extension/

The output should be in Markdown, ideally injected into a file in the
docs/ folder, and auto-deployed to the docs website.
2023-08-14 14:42:09 +02:00
16 changed files with 244 additions and 52 deletions

1
.gitignore vendored
View file

@ -1,4 +1,5 @@
/adminer/adminer.css
/adminer*.php
/editor*.php
/.phpdoc/
/vendor/

2
.gitmodules vendored
View file

@ -9,4 +9,4 @@
url = https://github.com/Niyko/Hydra-Dark-Theme-for-Adminer
[submodule "designs/pepa-linha-dark"]
path = designs/pepa-linha-dark
url = https://github.com/pepa-linha/Adminer-Design-Dark/
url = https://github.com/pepa-linha/Adminer-Design-Dark

View file

@ -155,10 +155,12 @@ if ($adminer->homepage()) {
echo "</form>\n";
echo script("tableCheck();");
}
echo '<p class="links"><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n";
echo (support("view") ? ' | <a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n" : "");
echo '</p>';
$links = [];
$links[] = "<a href='" . h(ME) . "create='>" . lang('Create table') . "</a>";
if (support("view")) {
$links[] = "<a href='" . h(ME) . "view='>" . lang('Create view') . "</a>";
}
echo generate_linksbar($links);
if (support("routine")) {
echo "<h3 id='routines'>" . lang('Routines') . "</h3>\n";
@ -177,10 +179,12 @@ if ($adminer->homepage()) {
}
echo "</table>\n";
}
echo '<p class="links">'
. (support("procedure") ? '<a href="' . h(ME) . 'procedure=">' . lang('Create procedure') . '</a> | ' : '')
. '<a href="' . h(ME) . 'function=">' . lang('Create function') . "</a>\n"
;
$links = [];
if (support('procedure')) {
$links[] = "<a href='" . h(ME) . "procedure='>" . lang('Create procedure') . "</a>";
}
$links[] = "<a href='" . h(ME) . "function='>" . lang('Create function') . "</a>";
echo generate_linksbar($links);
}
if (support("sequence")) {
@ -232,7 +236,7 @@ if ($adminer->homepage()) {
echo "<p class='error'><code class='jush-sqlset'>event_scheduler</code>: " . h($event_scheduler) . "\n";
}
}
echo '<p class="links"><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n";
echo generate_linksbar(["<a href='" . h(ME) . "event='>" . lang('Create event') . "</a>"]);
}
if ($tables_list) {

View file

@ -236,7 +236,7 @@ class Adminer {
if (!$failed && ($warnings = $driver->warnings())) {
$id = "warnings";
$return = ", <a href='#$id'>" . lang('Warnings') . "</a>" . script("qsl('a').onclick = partial(toggle, '$id');", "")
. "$return<div id='$id' class='hidden'>\n$warnings</div>\n"
. "<div id='$id' class='hidden'>\n$warnings</div>\n"
;
}
$links = [
@ -649,7 +649,7 @@ class Adminer {
}
$history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
$sql_id = "sql-" . count($history[$_GET["db"]]);
$return = "<a href='#$sql_id' class='toggle'>" . lang('SQL command') . "</a>\n";
$return = "<a href='#$sql_id' class='toggle'>" . lang('SQL command') . "</a> <a href='#' class='copy-to-clipboard icon expand' data-expand-id='$sql_id'></a>\n";
if (!$failed && ($warnings = $driver->warnings())) {
$id = "warnings-" . count($history[$_GET["db"]]);
$return = "<a href='#$id' class='toggle'>" . lang('Warnings') . "</a>, $return<div id='$id' class='hidden'>\n$warnings</div>\n";
@ -1083,7 +1083,7 @@ bodyLoad('<?php echo (is_object($connection) ? preg_replace('~^(\d\.?\d).*~s', '
;
echo (support("table") || support("indexes")
? '<a href="' . h(ME) . 'table=' . urlencode($table) . '"'
. bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"])), (is_view($status) ? "view" : "structure"))
. bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"], $_GET["select"])), (is_view($status) ? "view" : "structure"))
. " title='" . lang('Show structure') . "'>$name</a>"
: "<span>$name</span>"
) . "\n";

View file

@ -22,7 +22,7 @@ foreach ($fields as $key => $field) {
}
list($select, $group) = $adminer->selectColumnsProcess($columns, $indexes);
$is_group = count($group) < count($select);
$is_group = count($group) < count($select) || strstr($select[0], "DISTINCT");
$where = $adminer->selectSearchProcess($fields, $indexes);
$order = $adminer->selectOrderProcess($fields, $indexes);
$limit = $adminer->selectLimitProcess();
@ -315,7 +315,7 @@ if (!$columns && support("table")) {
echo "<thead><tr>" . (!$group && $select
? ""
: "<td><input type='checkbox' id='all-page' class='jsonly'>" . script("qs('#all-page').onclick = partial(formCheck, /check/);", "")
. " <a href='" . h($_GET["modify"] ? remove_from_uri("modify") : $_SERVER["REQUEST_URI"] . "&modify=1") . "' title='" . lang('Modify') . "'>" . lang('Modify') . "</a>");
. " <a href='" . h($_GET["modify"] ? remove_from_uri("modify") : $_SERVER["REQUEST_URI"] . "&modify=1") . "' title='" . lang('Modify') . "' class='edit-all'>" . lang('Modify') . "</a>");
$names = array();
$functions = array();
reset($select);

View file

@ -97,7 +97,7 @@ if (!$error && $_POST) {
$empty = false;
$q = substr($query, 0, $pos);
$commands++;
$print = "<pre id='sql-$commands'><code class='jush-$jush copy-to-clipboard'>" . $adminer->sqlCommandQuery($q) . "</code></pre>\n";
$print = "<pre id='sql-$commands'><code class='jush-$jush'>" . $adminer->sqlCommandQuery($q) . "</code></pre>\n";
$print .= generate_linksbar(["<a href='#' class='copy-to-clipboard'>" . lang('Copy to clipboard') . "</a>"]);
if ($jush == "sqlite" && preg_match("~^$space*+ATTACH\\b~i", $q, $match)) {
// PHP doesn't support setting SQLITE_LIMIT_ATTACHED
@ -254,7 +254,7 @@ if (!isset($_GET["import"]) && $history) {
for ($val = end($history); $val; $val = prev($history)) { // not array_reverse() to save memory
$key = key($history);
list($q, $time, $elapsed) = $val;
echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . "</a>"
echo '<a href="' . h(ME . "sql=&history=$key") . '" class="edit" title="' . lang('Edit') . '">' . lang('Edit') . "</a>"
. " <span class='time' title='" . @date('Y-m-d', $time) . "'>" . @date("H:i:s", $time) . "</span>" // @ - time zone may be not set
. " <code class='jush-$jush'>" . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $q)))), 80, "</code>")
. ($elapsed ? " <span class='time'>($elapsed)</span>" : "")
@ -262,7 +262,7 @@ if (!isset($_GET["import"]) && $history) {
;
}
echo "<input type='submit' name='clear' value='" . lang('Clear') . "'>\n";
echo "<a href='" . h(ME . "sql=&history=all") . "'>" . lang('Edit all') . "</a>\n";
echo "<a href='" . h(ME . "sql=&history=all") . "' class='edit-all' title='" . lang('Edit all') . "'>" . lang('Edit all') . "</a>\n";
echo "</div></fieldset>\n";
}
?>

View file

@ -16,7 +16,7 @@ td, th { border: 1px solid #999; padding: .2em .3em; }
th { background: #eee; text-align: left; }
thead th { text-align: center; padding: .2em .5em; }
thead td, thead th { background: #ddf; } /* position: sticky; causes Firefox to lose borders */
fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: .8em .5em 0 0; border: 1px solid #999; }
fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: .8em .5em 0 0; border: 1px solid #999; border-radius: 5px; }
p { margin: .8em 20px 0 0; }
img { vertical-align: middle; border: 0; }
td img { max-width: 200px; max-height: 200px; }
@ -67,7 +67,7 @@ span.separator { margin-left: 5px; margin-right: 5px; }
.footer { position: sticky; bottom: 0; margin-right: -20px; border-top: 20px solid rgba(255, 255, 255, .7); border-image: linear-gradient(rgba(255, 255, 255, .2), #fff) 100% 0; }
.footer > div { background: #fff; padding: 0 0 .5em; }
.footer fieldset { margin-top: 0; }
.links a { white-space: nowrap; }
.links a { display: inline-block; }
.logout { margin-top: .5em; position: absolute; top: 0; right: 0; }
.loadmore { margin-left: 1ex; }
/* .edit used in designs */
@ -75,9 +75,9 @@ span.separator { margin-left: 5px; margin-right: 5px; }
#menu h1 { border-top: 1px solid #999; padding-left: 50px; background-repeat: no-repeat; background-position: top 14px left 15px; background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='32' height='32' version='1.1' viewBox='64.7 124.1 80.9 96.4' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m103.41 219.69c-5.8574-2.8071-15.54-10.873-20.554-17.123-8.4331-10.511-13.554-22-16.256-36.469-0.61313-3.2837-0.94886-7.2042-1.3892-16.222-0.49913-10.223-0.51449-13.203-0.06891-13.372 0.21381-0.0812 2.4952-0.48891 5.0697-0.9064 13.6-2.2054 20.623-4.4565 32.562-10.438 2.405-1.2048 2.0374-1.2525 6.2745 0.81404 11.41 5.5651 17.35 7.4133 30.893 9.6133 1.4204 0.23065 3.1637 0.5438 3.8739 0.6957l1.2913 0.27615 0.0503 1.1299c0.18503 4.1624-0.92338 23-1.6052 27.279-3.0098 18.889-11.655 34.733-25.401 46.551-5.2062 4.476-7.3971 6.017-11.166 7.8534-2.1324 1.0391-2.0779 1.0343-3.5755 0.3166zm2.9787-3.3031c6.1816-2.8968 15.622-10.943 20.558-17.522 7.8262-10.432 12.201-20.542 14.378-33.229 0.75313-4.3896 1.7534-20.732 1.5769-25.763l-0.0537-1.5295-1.5334-0.2868c-0.84339-0.1578-2.6956-0.46995-4.116-0.69376-11.476-1.8083-17.455-3.6872-28.486-8.9523-3.9955-1.9071-3.5582-1.8595-5.9706-0.65024-10.907 5.4675-17.902 7.6897-30.755 9.7708-2.4858 0.4025-4.6474 0.77143-4.8036 0.81989-0.32192 0.0998-0.3193 0.30415 0.13497 10.557 0.44397 10.021 0.80438 14.248 1.5136 17.752 4.0571 20.047 12.361 33.554 28.093 45.694 2.0354 1.5708 7.3043 4.6699 7.9393 4.6699 0.0905 0 0.7763-0.2867 1.524-0.63714z' fill='%232d4159' stroke-width='0'/%3E%3Cg fill='none' stroke='%232d4159' stroke-linecap='round'%3E%3Cpath d='m117.12 167.89h10.555' stroke-width='1.5366'/%3E%3Cpath d='m82.309 167.91h15.836' stroke-width='1.5366'/%3E%3Cpath d='m117.21 173.98c3.4115-9e-3 6.822-0.0178 8.5265 2.5195s1.7043 7.6198 1.704 12.701' stroke-linejoin='round' stroke-width='2.0479'/%3E%3C/g%3E%3Ca transform='matrix(1.3101,0,0,1.3101,-32.778,-49.614)' stroke-width='2.2613'%3E%3Cpath d='m102.94 183.03c-3.5765-0.48481-6.4446-3.0846-7.2878-6.6062-0.24955-1.0422-0.24955-15.526 0-16.569 0.78951-3.2971 3.3213-5.7688 6.6636-6.5054 0.90662-0.1998 4.7806-0.1998 5.6872 0 3.3422 0.73656 5.8741 3.2083 6.6636 6.5054 0.24956 1.0422 0.24956 15.526 0 16.569-0.78643 3.2843-3.2115 5.8758-6.5248 6.608-0.62799 0.13877-4.4 0.10692-5.2017-2e-3zm4.8475-1.2499c3.0163-0.68834 5.2113-2.9219 5.7878-5.8896 0.10298-0.53012 0.11102-0.88647 0.11102-4.9205v-4.349h-17.054v4.349c0 4.034 8e-3 4.3904 0.11102 4.9205 0.60507 3.1148 3.0017 5.4265 6.1674 5.9488 0.72013 0.1188 4.2865 0.0756 4.8767-0.0591zm-3.2122-17.428c0-1.1003 0-1.1003-0.1459-1.1668-0.23048-0.10501-0.66958-0.53783-0.80808-0.7965-0.1736-0.32424-0.22738-3.2901-0.0683-3.7689 0.11347-0.34163 0.48553-0.78056 0.79582-0.93886l0.2265-0.11555v-3.2264l-0.77385 0.0317c-3.5466 0.14528-6.388 2.5676-7.058 6.0171-0.0973 0.50068-0.11102 0.84993-0.11102 2.818v2.2465h7.9429zm9.111-1.1462c0-1.9681-0.0138-2.3173-0.11102-2.818-0.6701-3.4496-3.5114-5.8718-7.058-6.0171l-0.77385-0.0317v3.2264l0.2265 0.11555c0.30422 0.1552 0.67838 0.59148 0.79118 0.92253 0.1538 0.45138 0.13354 3.2291-0.0267 3.6574-0.12251 0.32742-0.54083 0.78574-0.84273 0.9233-0.14828 0.0676-0.14828 0.0676-0.14828 1.1678v1.1003h7.9429z' fill='%232d4159' stroke-width='2.2613'/%3E%3C/a%3E%3Cg fill='none' stroke='%232d4159' stroke-linecap='round' stroke-linejoin='round' stroke-width='2.0479'%3E%3Cpath d='m92.778 174.02c-3.4115-9e-3 -6.8219-0.0178-8.5265 2.5195s-1.7043 7.6198-1.704 12.701'/%3E%3Cpath d='m117.22 163.17c3.4115 9e-3 6.822 0.0178 8.5265-2.5195 1.7046-2.5373 1.7043-7.6198 1.704-12.701'/%3E%3Cpath d='m92.793 163.13c-3.4115 9e-3 -6.8219 0.0178-8.5265-2.5195s-1.7043-7.6198-1.704-12.701'/%3E%3C/g%3E%3C/svg%3E%0A"); }
#menu p, #logins, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
#logins li, #tables li { list-style: none; }
#tables li a.select { font-size: 0; padding: 12px 8px 5px 8px; background-size: 16px; background-repeat: no-repeat; background-position: 0 0; background-image: url('data:image/png;base64,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'); }
#table tbody tr td a.edit { font-size: 0; padding: 12px 8px 5px 8px; background-size: 16px; background-repeat: no-repeat; background-position: 0 0; background-image: url('data:image/png;base64,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'); }
#table thead tr td a { font-size: 0; padding: 12px 8px 5px 8px; background-size: 16px; background-repeat: no-repeat; background-position: 0 0; background-image: url('data:image/png;base64,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'); }
#tables li a.select { font-size: 0; padding: 12px 8px 5px 8px; background-size: 16px; background-repeat: no-repeat; background-position: 0 0; background-image: url('data:image/svg+xml;utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-article" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M3 4m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z"></path><path d="M7 8h10"></path><path d="M7 12h10"></path><path d="M7 16h10"></path></svg>'); }
#table tbody tr td a.edit, #fieldset-history a.edit { font-size: 0; padding: 12px 8px 5px 8px; background-size: 16px; background-repeat: no-repeat; background-position: 0 0; background-image: url('data:image/svg+xml;utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-pencil" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4"/><path d="M13.5 6.5l4 4"/></svg>'); }
#table thead tr td a.edit-all, #fieldset-history a.edit-all { font-size: 0; padding: 12px 8px 5px 8px; background-size: 16px; background-repeat: no-repeat; background-position: 0 0; background-image: url('data:image/svg+xml;utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-edit" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1"></path><path d="M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z"></path><path d="M16 5l3 3"></path></svg>'); }
#dbs { font-size: 100%; width: 100%; margin: 0; border-collapse: separate; border-spacing: 1em .8em; }
#dbs select { width: 100%; }
#dbs td { padding: 0; border: 0 none; }
@ -93,6 +93,7 @@ span.separator { margin-left: 5px; margin-right: 5px; }
#schema .table { border: 1px solid silver; padding: 0 2px; cursor: move; position: absolute; }
#schema .references { position: absolute; }
#help { position: absolute; border: 1px solid #999; background: #eee; padding: 5px; font-family: monospace; z-index: 1; }
a.copy-to-clipboard.icon { font-size: 0; padding: 12px 8px 5px 8px; margin-left: 5px; background-size: 16px; background-repeat: no-repeat; background-position: 0 0; background-color: transparent; background-image: url('data:image/svg+xml;utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-clipboard-copy" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h3m9 -9v-5a2 2 0 0 0 -2 -2h-2"></path><path d="M13 17v-1a1 1 0 0 1 1 -1h1m3 0h1a1 1 0 0 1 1 1v1m0 3v1a1 1 0 0 1 -1 1h-1m-3 0h-1a1 1 0 0 1 -1 -1v-1"></path><path d="M9 3m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path></svg>'); }
.rtl h2 { margin: 0 -18px 20px 0; }
.rtl p, .rtl table, .rtl .error, .rtl .message { margin: 1em 0 0 20px; }

View file

@ -868,7 +868,16 @@ function setupCopyToClipboard(document) {
var node = document.querySelector("a.copy-to-clipboard");
if (node) {
node.addEventListener("click", function() {
copyToClipboard(document.querySelector("code.copy-to-clipboard"));
var nodeSql = document.querySelector("code.copy-to-clipboard");
if (nodeSql == null || nodeSql == undefined) {
nodeSql = document.querySelector("textarea.sqlarea");
}
if (nodeSql != null && nodeSql != undefined) {
if (node.classList.contains('expand')) {
document.getElementById(node.getAttribute('data-expand-id')).classList.remove("hidden");
}
copyToClipboard(nodeSql);
}
});
}
}
@ -877,12 +886,24 @@ function setupCopyToClipboard(document) {
* @param HTMLElement
*/
function copyToClipboard(el) {
var range = document.createRange();
range.selectNode(el);
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
document.execCommand("copy");
window.getSelection().removeAllRanges();
var nodeName = el.nodeName.toLowerCase();
if (nodeName == 'code') {
var range = document.createRange();
range.selectNode(el);
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
document.execCommand("copy");
window.getSelection().removeAllRanges();
} else if (nodeName == 'textarea') {
el.select();
if (document.getSelection().toString().length > 1024 * 1024) {
alert('Too large for clipboard');
} else {
document.execCommand("copy");
document.getSelection().removeAllRanges();
}
}
}
/** Add event listener

@ -1 +1 @@
Subproject commit 81eb3c48708b0132977d63a1948920cc1cefdefa
Subproject commit 0f4f3789af97c47f789e1a90d11b00797584f5b2

View file

@ -0,0 +1,31 @@
## {{ class.name }}
{{ class.summary|raw }}
{{ class.description|raw }}
* Full name: {{ class.FullyQualifiedStructuralElementName }}
{% if class.parent %}* Parent class: {{ class.parent.FullyQualifiedStructuralElementName }}
{% endif %}
{% if class.interfaces is not empty %}* This class implements: {{ class.interfaces|join(', ')|raw }}
{% endif %}
{% if class.deprecated %}* **Warning:** this class is **deprecated**. This means that this class will likely be removed in a future version.
{% endif %}
{% if class.tags.see is not empty or class.tags.link is not empty %}
**See Also:**
{% for see in class.tags.see %}
* {{ see.reference }} {% if see.description %}- {{ see.description|raw }}{% endif %}
{% endfor %}
{% for link in class.tags.link %}
* {{ link.link }} {% if link.description and link.description != link.link %}- {{ link.description|raw }}{% endif %}
{% endfor %}
{% endif %}{# class.tags.see || class.tags.link #}
{% for method in class.methods %}
{% if method.visibility == 'public' %}
{% include 'method.md.twig' %}
{% endif %}
{% endfor %}

View file

@ -0,0 +1,9 @@
# {{ project.name|raw }}
{% include 'toc.md.twig' %}
{% for class in project.indexes.classes|sort_asc %}
{% if not class.abstract %}
{% include 'class.md.twig' %}
{% endif %}
{% endfor %}

View file

@ -0,0 +1,52 @@
### {{ class.name }}::{{ method.name }}
{{ method.summary|raw }}
{# Method signature #}
```php
{{ class.name }}::{{ method.name }}( {% for argument in method.arguments %}
{{- argument.types ? argument.types|join('|')~' ' }}
{{- argument.byReference ? '&' }}
{{- argument.name }}{{ argument.default ? (' = '~argument.default)|raw }}
{%- if not loop.last %}, {% endif %}
{%- endfor %} )
{{- method.response.types ? ': '~method.response.types|join('|') }}
```
{{ method.description|raw }}
{% if method.static %}* This method is **static**.{% endif %}
{% if method.deprecated %}* **Warning:** this method is **deprecated**. This means that this method will likely be removed in a future version.
{% endif %}
{% if method.arguments is not empty %}
**Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
{% for argument in method.arguments %}
| `{{ argument.name }}` | **{{ argument.types ? argument.types|join('\\|')|raw|replace({'|': '\\|'}) }}** | {{ argument.description|raw|replace({'|': '\\|'}) }} |
{% endfor %}
{% endif %}{# method.arguments is not empty #}
{% if method.response.description %}
**Return Value:**
{{ method.response.description|raw }}
{% endif %}
{% if method.tags.see is not empty or method.tags.link is not empty %}
**See Also:**
{% for see in method.tags.see %}
* {{ see.reference }} {% if see.description %}- {{ see.description|raw }}{% endif %}
{% endfor %}
{% for link in method.tags.link %}
* {{ link.link }} {% if link.description and link.description != link.link %}- {{ link.description|raw }}{% endif %}
{% endfor %}
{% endif %}{# method.tags.see || method.tags.link #}
---

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<template>
<version>0.3.1</version>
<description>Generate usage documentation (documents only it's public API) for a small library in Markdown format so it can be published in GitHub.</description>
<transformations>
<transformation writer="twig" source="templates/public-onefile/index.md.twig" artifact="README.md" />
</transformations>
<parameters>
<parameter key="twig-debug">true</parameter>
</parameters>
</template>

View file

@ -0,0 +1,14 @@
## Table of Contents
| Method | Description |
|--------|-------------|
{% for class in project.indexes.classes|sort_asc %}
{% if not class.abstract %}
| [**{{ class.name }}**](#{{ class.name }}) | {{ class.summary|raw|replace({'\n': '', '\r': '', '|': '\\|'}) }} |
{% for method in class.methods %}
{% if method.visibility == 'public' %}
| [{{ class.name }}::{{ method.name }}](#{{ class.name }}{{ method.name }}) | {{ method.summary|raw|replace({'\n': '', '\r': '', '|': '\\|'}) }} {{ method.line }} {{ dump(method.getPath) }} |
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}

View file

@ -1,3 +1,5 @@
# ~/Downloads/phpDocumentor.phar --template=docs/phpdoc-template/ -f adminer/include/adminer.inc.php -f adminer/include/functions.inc.php -f adminer/include/lang.inc.php -f adminer/include/driver.inc.php -f adminer/include/editing.inc.php -f adminer/drivers/mysql.inc.php
site_name: AdminerEvo
site_description: AdminerEvo documentation
docs_dir: docs/
@ -12,6 +14,7 @@ theme:
- toc.integrate
- content.code.annotate
favicon: assets/favicon.png
font: false
extra_css:
- assets/local.css
markdown_extensions:

View file

@ -6,29 +6,43 @@
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
class AdminerTablesFilter {
function tablesPrint($tables) { ?>
<script<?php echo nonce(); ?>>
var tablesFilterTimeout = null;
var tablesFilterValue = '';
<fieldset class="jsonly" style="margin-left: .8em;">
<legend><?php echo lang('Filter tables'); ?></legend>
<div>
<input type="search" id="filter-field" autocomplete="off" placeholder="Ctrl + Shift + F">
<input type="button" id="filter-field-reset" value="<?php echo lang('Clear'); ?>">
</div>
</fieldset>
function tablesFilter(){
var value = qs('#filter-field').value.toLowerCase();
if (value == tablesFilterValue) {
<script<?php echo nonce(); ?>>
(function() {
var timeout;
var lastValue = '';
var filterField = qs('#filter-field');
function filter() {
timeout && (timeout = null);
var value = filterField.value.toLowerCase();
if (value == lastValue) {
return;
}
tablesFilterValue = value;
lastValue = value;
if (value != '') {
var reg = (value + '').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, '\\$1');
var reg = (value + '').replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
reg = new RegExp('('+ reg + ')', 'gi');
}
if (sessionStorage) {
if (window.sessionStorage) {
sessionStorage.setItem('adminer_tables_filter', value);
}
var tables = qsa('li', qs('#tables'));
var a;
var text;
for (var i = 0; i < tables.length; i++) {
var a = null;
var text = tables[i].getAttribute('data-table-name');
text = tables[i].getAttribute('data-table-name');
if (text == null) {
a = qsa('a', tables[i])[1];
text = a.innerHTML.trim();
@ -48,22 +62,53 @@ function tablesFilter(){
}
}
function tablesFilterInput() {
window.clearTimeout(tablesFilterTimeout);
tablesFilterTimeout = window.setTimeout(tablesFilter, 200);
}
filterField.addEventListener('input', function input() {
timeout && window.clearTimeout(timeout);
timeout = window.setTimeout(filter, 200);
});
document.addEventListener('keyup', function(event) {
if (
event.ctrlKey
&& event.shiftKey
&& event.key == 'F'
&& !event.altKey
&& !event.metaKey
&& (
!document.activeElement
|| document.activeElement != filterField
)
) {
filterField.focus();
}
});
filterField.addEventListener('keydown', function(event) {
if (event.key == 'Enter' || event.keyCode == 13 || event.which == 13) {
event.preventDefault();
return false;
}
});
sessionStorage && document.addEventListener('DOMContentLoaded', function () {
var db = qs('#dbs').querySelector('select');
qs('#filter-field-reset').addEventListener('click', function() {
filterField.value = '';
filterField.dispatchEvent(new Event('input'));
});
window.sessionStorage && document.addEventListener('DOMContentLoaded', function restore() {
var db = qs('#dbs select');
var value;
db = db.options[db.selectedIndex].text;
if (db == sessionStorage.getItem('adminer_tables_filter_db') && sessionStorage.getItem('adminer_tables_filter')){
qs('#filter-field').value = sessionStorage.getItem('adminer_tables_filter');
tablesFilter();
if (
db == sessionStorage.getItem('adminer_tables_filter_db')
&& (value = sessionStorage.getItem('adminer_tables_filter'))
) {
filterField.value = value;
filter();
}
sessionStorage.setItem('adminer_tables_filter_db', db);
});
})();
</script>
<p class="jsonly"><input id="filter-field" autocomplete="off"><?php echo script("qs('#filter-field').oninput = tablesFilterInput;"); ?>
<?php
}
}