Restrict workspace settings to administrators, add demo countries, Helm chart and instance event log

Employees keep schedule editing but can no longer change workspace preferences or existing
scheduling-directory entries (enforced by the server, hidden in the UI). Demo accounts live in
Cyprus, the United Kingdom and Armenia with matching bank holidays. A Helm chart deploys the
service with a pre-upgrade migrate hook. Refused SSO sign-ins are stored with their support
reference as instance events and searchable on the instance administration page.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Aleksandr BogomiakovandClaude committed 2026-10-07 15:06:12 +01:00
1 parent 7afdc4be97
commit 548494f12e
11 files changed
+413 -18

No files matched your search

+23
View File
@@ -161,6 +161,29 @@
</div>
</template>
</div>
<div class="section-line"><h2><span x-text="t('access_events_title')"></span></h2></div>
<article class="panel rule-card spaced" id="instance-events">
<p class="muted"><span x-text="t('access_events_note')"></span></p>
<form class="event-search" @submit.prevent="run(()=>loadEvents())">
<input type="search" x-model="eventSearch" maxlength="200" :aria-label="t('access_events_search_label')" :placeholder="t('access_events_search_placeholder')">
<button class="primary" :disabled="busy"><span x-text="t('access_events_search')"></span></button>
<button type="button" :disabled="busy" @click="run(()=>loadEvents())"><span x-text="t('access_events_refresh')"></span></button>
</form>
<p class="muted padded" data-events-empty x-show="!events.length && !eventsLoading"><span x-text="t('access_events_empty')"></span></p>
<div class="event-list">
<template x-for="e in events" :key="e.id">
<div class="event-row" :class="{failed:isFailedLogin(e)}" :data-event-action="e.action">
<div class="event-head"><code class="event-action" :class="{failed:isFailedLogin(e)}" x-text="e.action"></code><span class="event-actor" x-text="e.actor || t('access_event_system')"></span><small class="event-time" x-text="formatTime(e.created_at)"></small></div>
<dl class="event-details">
<template x-for="d in eventDetails(e)" :key="d.key">
<div><dt x-text="eventLabel(d.key)"></dt><dd><template x-if="d.chips"><span class="chips"><template x-for="chip in d.chips" :key="chip"><code class="chip" x-text="chip"></code></template><small class="muted" x-show="d.empty" x-text="t('access_user_no_groups')"></small></span></template><template x-if="!d.chips"><span x-text="d.value"></span></template></dd></div>
</template>
</dl>
</div>
</template>
</div>
<p class="info-note" data-events-more x-show="eventsMore"><span x-text="t('access_events_more')"></span></p>
</article>
<div class="section-line"><h2><span x-text="t('access_users_title')"></span></h2>
<button class="primary" @click="open('admin-user')"><span x-text="t('access_add_user')"></span></button>
</div>