<ul><li><strong>module.controller.php:</strong> Fixed 34 bare $_REQUEST['action'] comparisons — all guarded with <code>?? ''</code> to eliminate PHP 8 Undefined array key warnings</li><li><strong>module.controller.php (filterByStatus):</strong> Fixed missing <code>?? ''</code> on <code>$value['module_type_key_fk']</code> call to <code>getPortalbyIds()</code> — could throw TypeError when DB value is NULL</li><li><strong>module.controller.php (getCategoriesTable):</strong> Fixed DOCUMENT_ROOT path concatenation — added <code>rtrim()</code> and explicit <code>/</code> separator to prevent broken include path in non-Apache contexts</li><li><strong>modules_tabs.php:</strong> Replaced all 18 deprecated <code>$.parseJSON()</code> calls with native <code>JSON.parse()</code></li><li><strong>modules_tabs.php (filterByStatus/filterByPortal/filterByCategory):</strong> Converted from bare <code>$.post()</code> to <code>$.ajax()</code> with proper <code>error:</code> handlers — swal loader no longer gets stuck on AJAX failure</li><li><strong>modules_tabs.php (getAllModules):</strong> Added missing AJAX error handler</li><li><strong>modules_tabs.php (deleteModule):</strong> Added missing AJAX error handler</li><li><strong>modules_tabs.php (getModuleById):</strong> Fixed unsafe <code>$.parseJSON(data.image_path)</code> when image_path is null — now guarded with <code>(data.image_path) ? JSON.parse(...) : null</code></li><li><strong>modules_tabs.php:</strong> Fixed duplicate <code>class</code> attribute on two img elements (lines 326 and 1077) — merged into single class string</li><li><strong>modules_tabs.php:</strong> Fixed malformed HTML comments <code>&lt;!- End Tab --&gt;</code> corrected to <code>&lt;!-- End Tab --&gt;</code></li><li><strong>inc/crud.php:</strong> Fixed bare <code>$_POST['action']</code> comparison on updateCategory case — guarded with <code>?? ''</code></li></ul>