Release v2.11.1
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m47s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 31s

This commit is contained in:
2026-09-04 15:43:55 +01:00
parent 2c150b5b2e
commit 98f969ca0f
104 changed files with 3559 additions and 447 deletions
+20 -3
View File
@@ -22,11 +22,28 @@
<label for="{{#if isEdit}}edit-user-name{{else}}user-name{{/if}}" class="form-label">Name</label>
<input id="{{#if isEdit}}edit-user-name{{else}}user-name{{/if}}" type="text" name="name" class="form-control" autocomplete="name" value="{{#if isEdit}}{{user.name}}{{else}}{{formValues.name}}{{/if}}" maxlength="128" data-limit-text-length required />
</div>
<div class="col-12">
<label for="{{#if isEdit}}edit-user-email{{else}}user-email{{/if}}" class="form-label">Email address</label>
<input id="{{#if isEdit}}edit-user-email{{else}}user-email{{/if}}" type="email" name="email" class="form-control" autocomplete="email" value="{{#if isEdit}}{{user.email}}{{else}}{{formValues.email}}{{/if}}" maxlength="320" />
{{#if isEdit}}<div class="form-text">{{#if user.email_verified_at}}Verified{{else}}Not verified{{/if}}. Email is used for password recovery.</div>{{/if}}
</div>
</div>
{{#if isEdit}}
<div class="mt-3">
<input id="edit-user-account-locked" name="account_locked" type="checkbox" class="btn-check" value="1" autocomplete="off" {{#if user.account_locked}}checked{{/if}}>
<label class="btn btn-outline-danger" for="edit-user-account-locked"><span class="account-lock-label-unlocked">Account unlocked</span><span class="account-lock-label-locked">Account locked</span></label>
<div class="border-top mt-3 pt-3">
<div class="row g-3">
<div class="col-12 col-md-6">
<div class="form-check form-switch">
<input id="edit-user-account-locked" name="account_locked" type="checkbox" class="form-check-input" value="1" autocomplete="off" {{#if user.account_locked}}checked{{/if}}>
<label class="form-check-label" for="edit-user-account-locked">Account locked</label>
</div>
</div>
<div class="col-12 col-md-6">
<div class="form-check form-switch">
<input id="edit-user-email-verified" name="email_verified" type="checkbox" class="form-check-input" value="1" autocomplete="off" {{#if user.email_verified_at}}checked{{/if}}>
<label class="form-check-label" for="edit-user-email-verified">Email verified</label>
</div>
</div>
</div>
</div>
{{/if}}
</div>
+67
View File
@@ -0,0 +1,67 @@
<div class="page-header">
<div>
<h2>Invite user</h2>
<p>Send a secure invitation. The account is created when the recipient accepts it.</p>
</div>
</div>
<form method="post" action="/settings/users/invite">
<div class="row g-3">
<div class="col-12 col-xl-4">
<div class="card card-outline card-primary admin-form-card">
<div class="card-header">
<h3 class="card-title">Invitation details</h3>
</div>
<div class="card-body">
{{#if message}}<div class="alert alert-{{messageVariant}}">{{message}}</div>{{/if}}
<div class="row g-3">
<div class="col-12">
<label for="invite-email" class="form-label">Email address</label>
<input id="invite-email" name="email" type="email" class="form-control" value="{{formValues.email}}" autocomplete="email" maxlength="320" required>
</div>
<div class="col-12">
<label for="invite-name" class="form-label">Display name</label>
<input id="invite-name" name="name" type="text" class="form-control" value="{{formValues.name}}" autocomplete="name" maxlength="255" required>
</div>
</div>
</div>
<div class="card-footer d-flex justify-content-end">
<div class="btn-group" role="group" aria-label="Invitation actions">
<button type="submit" class="btn btn-primary">Send invitation</button>
<a class="btn btn-secondary" href="/settings/users">Cancel</a>
</div>
</div>
</div>
</div>
<div class="col-12 col-xl-8">
<div class="card card-outline card-secondary admin-form-card">
<div class="card-header">
<h3 class="card-title">Roles</h3>
</div>
<div class="card-body">
<div class="row g-3">
{{#if roles.length}}
{{#each roles}}
<div class="col-12 col-md-6 col-xl-4">
<label class="form-check card card-outline card-secondary position-relative p-3 h-100 mb-0">
<input class="form-check-input position-absolute top-0 end-0 m-3" type="checkbox" name="role_ids[]" value="{{id}}" {{#if isSelected}}checked{{/if}}>
<span class="form-check-label pe-4">
<strong>{{name}}</strong>
<span class="d-block text-body-secondary small">{{#if description}}{{description}}{{else}}No description provided.{{/if}}</span>
</span>
</label>
</div>
{{/each}}
{{else}}
<div class="col-12">
<div class="alert alert-warning mb-0">Create a role before sending invitations.</div>
</div>
{{/if}}
</div>
<div class="form-text mt-2">The recipient will receive these roles when the invitation is accepted.</div>
</div>
</div>
</div>
</div>
</form>
+7 -5
View File
@@ -9,13 +9,15 @@
<div class="card-header">
<h3 class="card-title">Existing users</h3>
<div class="card-tools d-flex flex-nowrap align-items-center gap-2">
<div class="input-group input-group-sm flex-shrink-1" style="width: min(14rem, 100%);">
<span class="input-group-text" aria-hidden="true"><i class="bi bi-search"></i></span>
<div class="input-group input-group-sm flex-shrink-1 table-search-group" style="width: min(14rem, 100%);">
<span class="input-group-text" role="button" tabindex="0" aria-label="Search" data-table-search-toggle><i class="bi bi-search"></i></span>
<input type="search" class="form-control" placeholder="Search users" aria-label="Search users" data-table-search />
</div>
{{#if (hasPermission currentUser 'users.create')}}
<a class="btn btn-primary btn-sm" href="/settings/users/new">Add user</a>
{{/if}}
<div class="btn-group">
{{#if (hasPermission currentUser 'invitations.create')}}
<a href="/settings/users/invite" class="btn btn-info btn-sm">Invite user</a><a class="btn btn-primary btn-sm" href="/settings/users/new">Add<span class="table-action-context"> user</span></a>
{{/if}}
</div>
</div>
</div>
<div class="card-body table-responsive p-0">