]> git.joonet.de Git - adminer.git/commitdiff
Move beforeunload to plugin
authorJakub Vrana <jakub@vrana.cz>
Mon, 24 Mar 2025 15:55:40 +0000 (16:55 +0100)
committerJakub Vrana <jakub@vrana.cz>
Mon, 24 Mar 2025 15:55:40 +0000 (16:55 +0100)
CHANGELOG.md
adminer/call.inc.php
adminer/include/html.inc.php
adminer/static/functions.js
plugins/before-unload.php [new file with mode: 0644]

index 99918e1e13dc209b8996bbcda4ff7401fa77ccda..aa9ed769a5ce9ba63f9ee6b801940bcd9fd61dbf 100644 (file)
@@ -1,5 +1,4 @@
 ## Adminer dev
-- Confirm before exiting edited edit form
 - Display collation at table structure if different from table
 - Ctrl+click in select moves the cursor in modern browsers
 - URL parameter ?ext=pdo to force using PDO
@@ -23,6 +22,7 @@
 - New plugin: IMAP driver created for fun
 - New plugin: Display links to tables referencing current row
 - New plugin: Allow switching light and dark mode (bug #926)
+- New plugin: Confirm before unloading page with changed form
 - Uzbek translation
 
 ## Adminer 5.0.6 (released 2025-03-17)
index 5ae5fa4416532f713aa90e5188ad06ff336138ba..a9df194d646afbeb05fec0e3593c56b831a117ef 100644 (file)
@@ -81,7 +81,6 @@ if ($in) {
                echo "\n";
        }
        echo "</table>\n";
-       echo script("setupEditChange(qsl('form'));");
 }
 ?>
 <p>
index f3baa751c0668b12a35bbd019a96543e14f5236b..5c41eb01bf0b01c5b987c7db045020e178d944f7 100644 (file)
@@ -513,7 +513,6 @@ function edit_form($table, $fields, $row, $update) {
                        ;
                }
                echo "</table>\n";
-               echo script("setupEditChange(qsl('form'));");
        }
        echo "<p>\n";
        if ($fields) {
index 35d80e6f7790fb66d76ca6db0d0625eb3a68f06b..9af1864c0dd71cc450fc1739b073cd262439b5d5 100644 (file)
@@ -567,27 +567,6 @@ function fieldChange() {
 
 
 
-let editChanged;
-
-/** Setup saving editChanged on form fields
-* @this HTMLFormElement
-*/
-function setupEditChange(form) {
-       for (const el of qsa('input, select, textarea', form)) {
-               addEvent(el, 'change', () => {
-                       editChanged = true;
-               });
-       }
-       form.onsubmit = () => {
-               editChanged = null; // false doesn't work in Chrome
-       }
-}
-
-// all modern browsers ignore string returned from here
-onbeforeunload = () => editChanged;
-
-
-
 /** Create AJAX request
 * @param string
 * @param function (XMLHttpRequest)
@@ -637,6 +616,8 @@ function ajaxSetHtml(url) {
        });
 }
 
+let editChanged; // used by plugins
+
 /** Save form contents through AJAX
 * @param HTMLFormElement
 * @param string
diff --git a/plugins/before-unload.php b/plugins/before-unload.php
new file mode 100644 (file)
index 0000000..5c37ca3
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+/** Display confirmation before unloading page if a form field was changed
+* @link https://www.adminer.org/plugins/#use
+* @author Jakub Vrana, https://www.vrana.cz/
+* @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 AdminerBeforeUnload {
+
+       function head($dark = null) {
+               ?>
+<script <?php echo Adminer\nonce(); ?>>
+// editChange is declared in functions.js
+// ajaxForm sets editChange to null on success
+
+addEvent(document, 'change', event => {
+       const el = event.target;
+       if (el.form && /post/i.test(el.form.method)) {
+               editChanged = true;
+       }
+});
+
+addEvent(document, 'submit', () => {
+       editChanged = null;
+});
+
+// all modern browsers ignore string returned from here
+onbeforeunload = () => editChanged;
+</script>
+<?php
+       }
+}