Files
lucent-laravel/front/js/svelte/members/Members.svelte
T

118 lines
3.5 KiB
Svelte
Raw Normal View History

2023-10-02 23:10:49 +03:00
<script>
import ErrorAlert from "../common/ErrorAlert.svelte";
import SuccessAlert from "../common/SuccessAlert.svelte";
import SpinnerButton from "../common/SpinnerButton.svelte";
import MemberSettingsCard from "./MemberSettingsCard.svelte";
2026-05-07 22:50:02 +03:00
import { getContext } from "svelte";
import { apiPost } from "../../helpers";
2023-10-02 23:10:49 +03:00
const channel = getContext("channel");
export let users;
let name;
let email;
let role;
let errorMessage = "";
let successAlert;
function submitInvite(e) {
e.preventDefault();
invite(name, email, role);
}
function invite(newName, newEmail, newRole) {
errorMessage = "";
2026-05-07 22:50:02 +03:00
apiPost(channel.lucentUrl + "/members/invite", {
name: newName,
email: newEmail,
roles: [newRole],
})
2023-10-02 23:10:49 +03:00
.then((response) => {
successAlert.show("User was invited");
2026-05-07 22:50:02 +03:00
users = [...users, response.user];
2023-10-02 23:10:49 +03:00
name = null;
email = null;
role = null;
})
.catch((error) => {
errorMessage = error.response?.data?.error ?? "";
});
}
function update(e) {
e.preventDefault();
errorMessage = "";
2026-05-07 22:50:02 +03:00
apiPost(channel.lucentUrl + "/members/update", {
id: e.detail.user,
roles: e.detail.roles,
})
2023-10-02 23:10:49 +03:00
.then((response) => {
successAlert.show("Users updated");
2026-05-07 22:50:02 +03:00
users = response.users;
2023-10-02 23:10:49 +03:00
})
.catch((error) => {
errorMessage = error.response?.data?.error ?? "";
});
}
</script>
2024-08-17 21:10:01 +03:00
<div class="common-wrapper">
2023-10-02 23:10:49 +03:00
<div class="lx-card mt-5">
<h3 class="header-small mb-5">Invite people</h3>
2026-05-07 22:50:02 +03:00
<ErrorAlert message={errorMessage} />
<SuccessAlert bind:this={successAlert} />
2023-10-02 23:10:49 +03:00
<form on:submit={submitInvite}>
<div class="mb-3">
2026-05-07 22:50:02 +03:00
<label for="inviteeName" class="form-label">Invitee Name</label>
2023-10-02 23:10:49 +03:00
<input
2026-05-07 22:50:02 +03:00
type="text"
bind:value={name}
class="form-control"
id="inviteeName"
placeholder="Member name"
required
2023-10-02 23:10:49 +03:00
/>
</div>
<div class="mb-3">
<label for="inviteeEmail" class="form-label"
2026-05-07 22:50:02 +03:00
>Invitee Email Address</label
2023-10-02 23:10:49 +03:00
>
<input
2026-05-07 22:50:02 +03:00
type="email"
bind:value={email}
class="form-control"
id="inviteeEmail"
placeholder="Member email"
required
2023-10-02 23:10:49 +03:00
/>
</div>
<div class="me-3">
2024-08-17 21:10:01 +03:00
<select bind:value={role}>
{#each channel.roles.filter((r) => r !== "removed") as arole}
2026-05-07 22:50:02 +03:00
<option value={arole}>{arole}</option>
2024-08-17 21:10:01 +03:00
{/each}
</select>
2023-10-02 23:10:49 +03:00
</div>
<div class="mt-5 d-block text-center">
2026-05-07 22:50:02 +03:00
<SpinnerButton label="Invite" />
2023-10-02 23:10:49 +03:00
</div>
</form>
</div>
2024-08-17 21:10:01 +03:00
<div class="member-list">
<h3 class="header-small mb-5 mt-5">Members</h3>
2023-10-02 23:10:49 +03:00
{#each users as user}
<MemberSettingsCard
2026-05-07 22:50:02 +03:00
member={user}
roles={channel.roles}
on:update={update}
on:reinvite={(e) => invite(e.detail.email, e.detail.role)}
2023-10-02 23:10:49 +03:00
/>
{/each}
</div>
</div>