Fix beforeunload dialog appearing on edit.php when no changes made

This commit is contained in:
Pontoporeia
2026-05-19 22:38:29 +02:00
parent 42222abe7c
commit 2e75a3b35c
3 changed files with 20 additions and 2 deletions

View File

@@ -1 +1 @@
{"php":"8.5.6","version":"3.95.1","indent":" ","lineEnding":"\n","rules":{"binary_operator_spaces":{"default":"at_least_single_space"},"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"braces_position":{"allow_single_line_anonymous_functions":false,"allow_single_line_empty_anonymous_classes":true},"class_definition":{"inline_constructor_arguments":false,"space_before_parenthesis":true},"compact_nullable_type_declaration":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"modifier_keywords":true,"new_with_parentheses":{"anonymous_class":true},"no_blank_lines_after_class_opening":true,"no_extra_blank_lines":{"tokens":["use"]},"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"sort_algorithm":"alpha"},"return_type_declaration":true,"short_scalar_cast":true,"single_import_per_statement":{"group_to_single_imports":false},"single_space_around_construct":{"constructs_followed_by_a_single_space":["abstract","as","case","catch","class","const_import","do","else","elseif","final","finally","for","foreach","function","function_import","if","insteadof","interface","namespace","new","private","protected","public","static","switch","trait","try","use","use_lambda","while"],"constructs_preceded_by_a_single_space":["as","else","elseif","use_lambda"]},"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"unary_operator_spaces":{"only_dec_inc":true},"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":{"closure_fn_spacing":"one"},"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"after_heredoc":true},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_line_after_imports":true,"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true,"clean_namespace":true,"no_unset_cast":true,"assign_null_coalescing_to_coalesce_equal":true,"normalize_index_brace":true,"heredoc_indentation":true,"no_whitespace_before_comma_in_array":{"after_heredoc":true},"trailing_comma_in_multiline":true,"list_syntax":true,"ternary_to_null_coalescing":true,"array_syntax":{"syntax":"short"},"no_unused_imports":true,"single_quote":true},"ruleCustomisationPolicyVersion":"null-policy","hashes":{"app\/src\/SystemCache.php":"4ead28637fa3a9281bdad42cdb9e00c2","app\/src\/SmtpRelay.php":"22c9b92eab1575c14c393917138a6e3b","app\/src\/AdminAuth.php":"14677d94cd04b7d455c43e74f7ec5d14","app\/src\/ShareLink.php":"84f06935f015221c39c517c1072795c9","app\/src\/StudentEmail.php":"84f7b438defaadf9d5d8a7821b3a4e78","app\/tests\/Security\/SecurityTest.php":"ff9996affd0ca42095d34e0ac0650050","app\/tests\/run-tests.php":"89ccc4a9cff85fb8f2c92903eb866b79","app\/tests\/Integration\/SearchTest.php":"29aba0f9da3c115fb5d2722576815361","app\/tests\/Unit\/DatabaseTest.php":"2dd249e28ac632ba222a8cead3ae16a1","app\/tests\/Unit\/RateLimitTest.php":"4fc2ffe64d2c889835ef4fcd2e89d835","app\/src\/Database.php":"57bcebbb33c8a7ba9e6c7b6f60a5ec23","app\/src\/Controllers\/ExportController.php":"8872052f3e9e171955df9c9198cfc708","app\/src\/Controllers\/TfeController.php":"7e67f11af8ae38ac683d2246717c4ecf","app\/src\/Controllers\/SystemController.php":"aaf106e4c73fa846344513346a1236a6","app\/src\/Controllers\/SearchController.php":"cc2ecf70d496f4e05448f4ec9670a3bc","app\/src\/Controllers\/LicenceController.php":"be382174f80b1dbcda03450cabc531a7","app\/src\/Controllers\/FileAccessController.php":"9665edaa0ab1fd7c94b9a3d9fad95c5f","app\/src\/Controllers\/MediaController.php":"2cadef1d1d249ceaaf33abca2f79a8ad","app\/src\/Controllers\/HomeController.php":"d3a36adcdb969448c23cea34fb6d7896","app\/src\/Controllers\/AboutController.php":"0be7251ba310770cb9702320026a8562","app\/src\/Controllers\/LiveReloadController.php":"e2ff21e7155e769b2684a51accf1699d","app\/src\/Controllers\/ThesisEditController.php":"34cd474e80c63acb99ded2bd46ff1dab","app\/src\/Controllers\/ThesisCreateController.php":"74aa55467df95e0efe5e30784baa2ac8","app\/src\/Dispatcher.php":"d1d693bdacbe0006cb806b15d067cbbb","app\/src\/Parsedown.php":"d98c00dfbbb11933a86407ee9cf9215d","app\/src\/App.php":"2fa0253736fdd6bfd28135e0c0ecb3f2","app\/src\/AppLogger.php":"139735566a1cc21d64eacc5b63de1d3c","app\/src\/DuplicateThesisException.php":"52abe5f40ef48cfbfd44c119d91309e9","app\/src\/RateLimit.php":"2e1df734570cb3eb584682bed33a2636","app\/src\/AdminLogger.php":"ba9ac9d222771b952ea6451b66ca6821"}} {"php":"8.5.6","version":"3.95.1","indent":" ","lineEnding":"\n","rules":{"binary_operator_spaces":{"default":"at_least_single_space"},"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"braces_position":{"allow_single_line_anonymous_functions":false,"allow_single_line_empty_anonymous_classes":true},"class_definition":{"inline_constructor_arguments":false,"space_before_parenthesis":true},"compact_nullable_type_declaration":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"modifier_keywords":true,"new_with_parentheses":{"anonymous_class":true},"no_blank_lines_after_class_opening":true,"no_extra_blank_lines":{"tokens":["use"]},"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"sort_algorithm":"alpha"},"return_type_declaration":true,"short_scalar_cast":true,"single_import_per_statement":{"group_to_single_imports":false},"single_space_around_construct":{"constructs_followed_by_a_single_space":["abstract","as","case","catch","class","const_import","do","else","elseif","final","finally","for","foreach","function","function_import","if","insteadof","interface","namespace","new","private","protected","public","static","switch","trait","try","use","use_lambda","while"],"constructs_preceded_by_a_single_space":["as","else","elseif","use_lambda"]},"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"unary_operator_spaces":{"only_dec_inc":true},"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":{"closure_fn_spacing":"one"},"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"after_heredoc":true},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_line_after_imports":true,"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true,"clean_namespace":true,"no_unset_cast":true,"assign_null_coalescing_to_coalesce_equal":true,"normalize_index_brace":true,"heredoc_indentation":true,"no_whitespace_before_comma_in_array":{"after_heredoc":true},"trailing_comma_in_multiline":true,"list_syntax":true,"ternary_to_null_coalescing":true,"array_syntax":{"syntax":"short"},"no_unused_imports":true,"single_quote":true},"ruleCustomisationPolicyVersion":"null-policy","hashes":{"app\/src\/SystemCache.php":"4ead28637fa3a9281bdad42cdb9e00c2","app\/src\/AdminAuth.php":"14677d94cd04b7d455c43e74f7ec5d14","app\/tests\/Security\/SecurityTest.php":"ff9996affd0ca42095d34e0ac0650050","app\/tests\/Integration\/SearchTest.php":"29aba0f9da3c115fb5d2722576815361","app\/tests\/Unit\/DatabaseTest.php":"2dd249e28ac632ba222a8cead3ae16a1","app\/tests\/Unit\/RateLimitTest.php":"4fc2ffe64d2c889835ef4fcd2e89d835","app\/src\/Controllers\/FileAccessController.php":"9665edaa0ab1fd7c94b9a3d9fad95c5f","app\/src\/Controllers\/LiveReloadController.php":"e2ff21e7155e769b2684a51accf1699d","app\/src\/Parsedown.php":"d98c00dfbbb11933a86407ee9cf9215d","app\/src\/AppLogger.php":"139735566a1cc21d64eacc5b63de1d3c","app\/src\/DuplicateThesisException.php":"52abe5f40ef48cfbfd44c119d91309e9","app\/src\/RateLimit.php":"2e1df734570cb3eb584682bed33a2636","app\/src\/Audit.php":"6f795cbdf5d81b0ae337dd2df5084f75","app\/src\/Crypto.php":"e72e65eeaf5b6fa8e41ba4501643440b","app\/tests\/Unit\/ErrorHandlerTest.php":"4fcf8c4f4eedb257b0a0ade70d98d231","app\/tests\/Unit\/ShareLinkTest.php":"c1d03602f8f71c047fdf688990ab392d","app\/tests\/Unit\/FormSaveTest.php":"84e3fa5fe9848470debd7c9d2ba61a9a","app\/src\/PeerTubeService.php":"2e6c39ffe11f96ddca4fb355aa419dbd","app\/src\/FragmentRenderer.php":"52083e1f2ff98f01e074a93bf6765366","app\/src\/ErrorHandler.php":"56d3dc0af9ce6b5ef07291419073a6b1","app\/tests\/Unit\/PureLogicTest.php":"bb046d24f4b10b44283f2eb355ec17a0","app\/src\/EmailObfuscator.php":"ff946c10add222870223b9626990e75c","app\/src\/FilepondHandler.php":"7ba1547b7cb8daeecd69f32566d6a755","app\/src\/Controllers\/validate-file-fragment-shared.php":"d572b9564076e22b6a3f9baddf7bdb46","app\/src\/Controllers\/ThesisFileHandler.php":"d66e212b11d32c9056fb1646787f5434"}}

View File

@@ -1,10 +1,16 @@
# Current tasks # Current tasks
## Commit history cleanup (round 2)
- [ ] Squash 6x duplicate "cleanup modal + storage restructure" commits (vp→tt→m→tp→nm→ky) into one
- [ ] Squash stray TODO.md commit (vx) into dialog margins commit (kx)
- [ ] Abandon working-copy log-only commit (yr)
## Récapitulatif admin: fieldset + table fichiers ## Récapitulatif admin: fieldset + table fichiers
- [x] Convert all sections to fieldsets with legends - [x] Convert all sections to fieldsets with legends
- [x] Convert files list to table (recap-files-table) - [x] Convert files list to table (recap-files-table)
- [x] Add bottom margins on fieldsets (admin-main--recap class) - [x] Add bottom margins on fieldsets (admin-main--recap class)
- [x] Remove image thumbnails from files table (emoji icon only) - [x] Remove image thumbnails from files table (emoji icon only)
- [x] Fix spurious beforeunload dialog on edit page (FilePond addfile on existing files)
## Mots-clés fieldset in contenus ## Mots-clés fieldset in contenus
- [x] Create contenus-motscles-fragment.php (tags fragment mirroring langues) - [x] Create contenus-motscles-fragment.php (tags fragment mirroring langues)

View File

@@ -535,22 +535,34 @@
console.log('[filepond] htmx detected, registering swap listeners'); console.log('[filepond] htmx detected, registering swap listeners');
window.htmx.on("htmx:beforeSwap", onHtmxBeforeSwap); window.htmx.on("htmx:beforeSwap", onHtmxBeforeSwap);
window.htmx.on("htmx:afterSwap", () => { window.htmx.on("htmx:afterSwap", () => {
_xamxamFilepondReady = false;
window.XamxamInitFilePonds(); window.XamxamInitFilePonds();
setTimeout(() => { _xamxamFilepondReady = true; }, 0);
}); });
} }
// Flag set after FilePond instances are fully initialised.
// Before this flag is set, FilePond:addfile events are from initial load
// (e.g. existing files loaded in edit mode) and should not mark the form dirty.
let _xamxamFilepondReady = false;
tryRegisterHtmx(); tryRegisterHtmx();
if (document.readyState === "loading") { if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
window.XamxamInitFilePonds(); window.XamxamInitFilePonds();
_xamxamFilepondReady = true;
}); });
} else { } else {
window.XamxamInitFilePonds(); window.XamxamInitFilePonds();
_xamxamFilepondReady = true;
} }
// ── Mark form dirty on FilePond changes (beforeunload guard) ───────── // ── Mark form dirty on FilePond changes (beforeunload guard) ─────────
document.addEventListener("FilePond:addfile", () => { document.addEventListener("FilePond:addfile", () => {
window.__xamxamDirty = true; if (_xamxamFilepondReady) window.__xamxamDirty = true;
});
document.addEventListener("FilePond:removefile", () => {
if (_xamxamFilepondReady) window.__xamxamDirty = true;
}); });
document.addEventListener("submit", (e) => { document.addEventListener("submit", (e) => {