Files
itflow/includes/footer.php
johnnyq fecd1cabff Credentials makeover: rebuilt credentials list with kind icons, username copy, password show/copy and live 2FA code buttons fetched on demand, where it opens, what it is for (asset, contact, vendors, licenses, services), password age pills and last used, filters for Starred, With 2FA, No 2FA, Not changed in 90 days and Shared with counts, search across notes, second link, tags, asset and contact, open straight to a credential with ?open=ID; new credential quick look with login, age, last viewed by, links with unlink, notes, open share links with turn off, and history; tabbed new/edit form with password generator (passphrase or random), strength meter, 2FA secret that accepts spaces or an otpauth:// link and shows the current code to check, copy buttons on both links, prefill from asset, contact or vendor; new Change password window that dates and logs the change; new Share window from anywhere (contact or email, 1 hour to 1 month, gone after opened once by default, link copied); same login controls on asset and contact pages and quick looks, vendor Logins tab, license page and quick look, service quick look, client overview favourites and search; credential pickers show icons and say when a credential moves from another asset or contact; client overview Passwords due for a change attention item and Active share links limited to live links; rotation report with selectable span, per client counts and oldest first; more export columns; demo data gets 2FA secrets, varied password ages and logins attached to their assets. Fixes passwords being blanked when the vault session had expired, other clients' assets, contacts and tags accepted on save, bulk star using the wrong permission, credential links to assets and contacts not checking the client, the edit or link permission, or which asset or contact an unlink was for, credentials left pointing at deleted assets and contacts, share links left open after a credential was deleted, import carrying values between rows and accepting any file type, 2FA secrets saved with spaces or lowercase giving no code, the service quick look listing credentials without credential access and repeating assets, an asset login with only a username being lost, and the API not dating new passwords. Adds functions/credential.php and js/credentials.js; removes credential_model.php and the old credential show password/OTP scripts. No DB change.
2026-10-14 23:33:29 -04:00

99 lines
4.2 KiB
PHP

<?php
?>
</div><!-- /.container-fluid -->
</div> <!-- /.app-content -->
</main> <!-- /.app-main -->
<?php /* AdminLTE 4's .app-wrapper is a three row grid - header, main, footer -
and the footer row is already reserved (grid-template-rows:
min-content 1fr min-content). Sitting in that row is what pins this to
the bottom: the 1fr main row absorbs the leftover height, so on a short
page the bar lands on the bottom edge of the viewport instead of
floating directly under the content.
It has to be a direct child of .app-wrapper - inside .app-main it is
just content again. */ ?>
<?php if (basename(dirname($_SERVER['REQUEST_URI'])) === 'admin') { ?>
<footer class="app-footer py-2 d-flex align-items-center">
<div class="w-100 text-end fw-light">ITFlow <?= APP_VERSION ?> &nbsp; · &nbsp; <a target="_blank" href="https://docs.itflow.org">Docs</a> &nbsp; · &nbsp; <a target="_blank" href="https://forum.itflow.org">Forum</a> &nbsp; · &nbsp; <a target="_blank" href="https://services.itflow.org">Services</a></div>
</footer>
<?php } ?>
<?php /* The guest portal shares this file and the same .app-wrapper grid (its
own guest_header.php opens it), so its footer goes in the same row.
guest_header.php renders no .app-header and no .app-sidebar, which the
grid handles on its own - the sidebar column is `auto` and the header
row is min-content, so both collapse to zero and .app-main still takes
the 1fr. */ ?>
<?php if (basename(dirname($_SERVER['REQUEST_URI'])) === 'guest') { ?>
<footer class="app-footer py-2 text-center">
<?php
echo escapeHtml($session_company_name);
if (!$config_whitelabel_enabled) {
echo '<br><small class="text-muted">Powered by ITFlow</small>';
}
?>
</footer>
<?php } ?>
</div> <!-- /.app-wrapper -->
<!-- Set the browser window title to the clients name -->
<script>document.title = <?= json_encode("$tab_title - $page_title") ?>;</script>
<!-- REQUIRED SCRIPTS -->
<?php /* The select picker goes FIRST, ahead of Bootstrap itself. Order is
load-bearing: until js/itflow_select.js runs, the browser is showing
the raw <select> controls it painted while parsing the body, so every
byte in front of it is time spent looking at the wrong widget. It
needs nothing else on the page, so nothing goes in front of it.
includes/header.php preloads it.
Bootstrap moving down is safe: it has always loaded in the footer, so
no markup above this point could ever have used the `bootstrap` global
at parse time. Every call site is inside an event handler or waits for
DOMContentLoaded - includes/inc_alert_feedback.php says so in its own
comment - and all of those still run well after this block. */ ?>
<script src="/js/itflow_select.js"></script>
<!-- Bootstrap 5 -->
<script src="/libs/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="/js/http.js"></script>
<!-- Custom js-->
<script src="/libs/chart.js/chart.umd.min.js"></script>
<script src="/libs/flatpickr/js/flatpickr.min.js"></script>
<script src="/libs/imask/js/imask.min.js"></script>
<script src="/libs/tinymce/tinymce.min.js" referrerpolicy="origin"></script>
<script src="/js/keepalive.js"></script>
<script src="/libs/DataTables/datatables.min.js"></script>
<script src="/libs/intl-tel-input/js/intlTelInputWithUtils.min.js"></script>
<script src="/js/phone_inputs.js"></script>
<!-- AdminLTE App -->
<script src="/libs/adminlte/js/adminlte.min.js"></script>
<script src="/libs/sweetalert2/js/sweetalert2.min.js"></script>
<script src="/js/autocomplete.js"></script>
<script src="/js/app.js"></script>
<script src="/js/credentials.js"></script>
<script src="/js/tag_picker.js"></script>
<script src="/js/quick_pick.js"></script>
<script src="/js/ajax_modal.js"></script>
<script src="/js/confirm_modal.js"></script>
<script src="/js/date_filter.js"></script>
<script src="/js/global_search.js"></script>
<script src="/js/notifications.js"></script>
</body>
</html>
<?php
// Calculate Execution time Uncomment for test
//$time_end = microtime(true);
//$execution_time = ($time_end - $time_start);
//echo '<h2>Total Execution Time: '.number_format((float) $execution_time, 10) .' seconds</h2>';