Client Portal - two-step sign-in for the portal, and the * announcements shown on its home page (to every client, or one) between * their start and end. */ require_once "includes/inc_all_admin.php"; $show_archived = isset($_GET['archived']); $sql = mysqli_query($mysqli, "SELECT announcement_id, announcement_title, announcement_body, announcement_tone, announcement_client_id, announcement_starts_at, announcement_ends_at, announcement_created_at, announcement_archived_at, client_name, user_name FROM portal_announcements LEFT JOIN clients ON client_id = announcement_client_id LEFT JOIN users ON user_id = announcement_created_by WHERE announcement_archived_at IS " . ($show_archived ? 'NOT NULL' : 'NULL') . " ORDER BY COALESCE(announcement_starts_at, announcement_created_at) DESC, announcement_id DESC"); $archived_count = intval(mysqli_fetch_row(mysqli_query($mysqli, "SELECT COUNT(*) FROM portal_announcements WHERE announcement_archived_at IS NOT NULL"))[0]); $state_badges = ['showing' => 'text-bg-success', 'scheduled' => 'text-bg-info', 'ended' => 'text-bg-secondary', 'archived' => 'text-bg-secondary']; ?>

Client Portal

The client portal is off - turn it on under Modules.
>
Contacts who sign in with a password are asked for a code from an authenticator app too. Anyone without it set up is taken to set it up before anything else. Microsoft 365 sign-ins are left to Microsoft.

Announcements

Shown at the top of the portal's home page - to every client, or one - between their start and end.
Announcement For When Action
Every client' ?>
Posted by
$show_archived ? 'No archived announcements' : 'No announcements', 'text' => $show_archived ? '' : 'Planned maintenance, an outage, a new service - a note at the top of every client\'s portal, or one client\'s.', 'icon' => 'fa-bullhorn', 'filtered' => false, 'actions' => $show_archived ? [] : [['label' => 'New Announcement', 'modal' => 'modals/portal_announcement/portal_announcement_add.php', 'size' => 'lg']], ]) ?>