2021-12-30 08:25:23 +01:00
< script lang = "ts" >
2021-12-31 16:23:25 +01:00
import { Row , Col , Button , Alert , ListGroup , ListGroupItem , Spinner } from 'sveltestrap';
2021-12-30 08:25:23 +01:00
import { createEventDispatcher } from 'svelte';
import ListPagination from "../ListPagination.svelte";
import twemoji from "twemoji";
import Svelecte, { addFormatter } from 'svelecte';
import { toHTML } from 'discord-markdown';
import FaFolderOpen from 'svelte-icons/fa/FaFolderOpen.svelte'
import FaFolderPlus from 'svelte-icons/fa/FaFolderPlus.svelte'
import FaFolderMinus from 'svelte-icons/fa/FaFolderMinus.svelte'
2022-02-01 15:24:45 -05:00
import { Member , Group } from '../../api/types';
import api from '../../api';
2021-12-30 08:25:23 +01:00
export let member: Member;
export let groups: Group[] = [];
2021-12-30 10:22:08 +01:00
let loading: boolean = false;
2021-12-31 16:23:25 +01:00
let err: string;
2021-12-30 08:25:23 +01:00
export let groupMode: boolean = true;
let groupsWithMember: Group[];
let groupsWithoutMember: Group[];
let groupsWithMemberSelection: any[];
let groupsWithoutMemberSelection: any[];
let groupsToBeAdded: any[];
let groupsToBeRemoved: any[];
let currentPage = 1;
let smallPages = true;
2021-12-31 16:23:25 +01:00
$: if (groups) {
2021-12-31 19:01:18 +01:00
groupsWithMember = groups.filter(group => group.members & & group.members.includes(member.uuid));
2021-12-30 08:25:23 +01:00
groupsWithMember.sort((a, b) => a.name.localeCompare(b.name));
2021-12-31 19:01:18 +01:00
groupsWithoutMember = groups.filter(group => group.members & & !group.members.includes(member.uuid));
2021-12-30 08:25:23 +01:00
groupsWithoutMember.sort((a, b) => a.name.localeCompare(b.name));
groupsWithMemberSelection = groupsWithMember.map(function(group) { return { name : group.name , shortid : group.id , id : group.uuid , members : group.members , display_name : group.display_name }; } ).sort((a, b) => a.name.localeCompare(b.name));
groupsWithoutMemberSelection = groupsWithoutMember.map(function(group) { return { name : group.name , shortid : group.id , id : group.uuid , members : group.members , display_name : group.display_name }; } ).sort((a, b) => a.name.localeCompare(b.name));
}
$: indexOfLastItem = currentPage * 10;
$: indexOfFirstItem = indexOfLastItem - 10;
2021-12-31 17:17:40 +01:00
$: pageAmount = Math.ceil(groupsWithMember & & groupsWithMember.length / 10);
2021-12-30 08:25:23 +01:00
2021-12-31 17:17:40 +01:00
$: finalGroupsList = groupsWithMember & & groupsWithMember.slice(indexOfFirstItem, indexOfLastItem);
2021-12-30 08:25:23 +01:00
let settings = JSON.parse(localStorage.getItem('pk-settings'));
let listGroupElements: any[] = [];
$: if (settings && settings.appearance.twemoji) {
if (listGroupElements && listGroupElements.length > 0) {
listGroupElements.forEach(element => element & & twemoji.parse(element));
};
}
function groupListRenderer(item: any) {
return `${ item . name } (< code > ${ item . shortid } </ code > )`;
}
addFormatter({
'member-list': groupListRenderer
});
2021-12-31 16:23:25 +01:00
const dispatch = createEventDispatcher();
function updateGroups() {
dispatch("updateGroups", groups);
}
async function submitAdd() {
let data = groupsToBeAdded;
try {
loading = true;
2022-02-01 15:24:45 -05:00
await api().members(member.id).groups.add.post({ data } );
2021-12-31 16:23:25 +01:00
groups.forEach(group => data.includes(group.uuid) & & group.members.push(member.uuid));
updateGroups();
err = null;
groupsToBeAdded = [];
loading = false;
} catch (error) {
console.log(error);
err = error.message;
loading = false;
}
}
2021-12-30 08:25:23 +01:00
2021-12-31 16:23:25 +01:00
async function submitRemove() {
let data = groupsToBeRemoved;
try {
loading = true;
2022-02-01 15:24:45 -05:00
await api().members(member.id).groups.remove.post({ data } );
2021-12-31 16:23:25 +01:00
groups.forEach(group => { if ( data . includes ( group . uuid )) group . members = group . members . filter ( m => m !== member . uuid )} );
updateGroups();
err = null;
groupsToBeRemoved = [];
loading = false;
} catch (error) {
console.log(error);
err = error.message;
loading = false;
}
}
< / script >
{ #if err }
< Alert color = "danger" > { err } </ Alert >
{ /if }
2021-12-30 08:25:23 +01:00
< Row >
< Col xs = { 12 } lg= { 6 } class = "text-center mb-3" >
< h5 > < div class = "icon d-inline-block" >
< FaFolderOpen / >
< / div > Current Groups< / h5 >
< ListPagination bind:currentPage bind:pageAmount bind:smallPages / >
2021-12-31 17:17:40 +01:00
{ #if finalGroupsList && finalGroupsList . length > 0 }
2021-12-30 08:25:23 +01:00
< ListGroup >
{ #each finalGroupsList as group , index ( group . id )}
< ListGroupItem class = "d-flex" >< span bind:this = { listGroupElements [ index ]} class="d-flex justify-content-between flex-grow-1 " >< span >< b > { group . name } </ b > (< code > { group . id } </ code > )</ span > < span > { @html group . display_name ? `$ { toHTML ( group . display_name )} ` : "" } </ span ></ span ></ ListGroupItem >
{ /each }
< / ListGroup >
{ : else }
< p > This member is inside no groups.< / p >
< p > You can add groups in this menu!< / p >
{ /if }
< / Col >
< Col xs = { 12 } lg= { 6 } class = "text-center mb-3" >
< h5 > < div class = "icon d-inline-block" >
< FaFolderPlus / >
< / div > Add to Groups< / h5 >
2022-05-20 13:39:30 +02:00
< Svelecte renderer = "member-list" disableHighlight bind:value = { groupsToBeAdded } options= { groupsWithoutMemberSelection } multiple aria-label = "search for groups to add" />
2021-12-31 16:23:25 +01:00
{ #if ! loading && groupsToBeAdded && groupsToBeAdded . length > 0 }
2022-05-20 13:39:30 +02:00
< Button class = "w-100 mt-2" color = "primary" on:click = { submitAdd } aria-label="add groups to member " > Add</ Button > { : else }
< Button class = "w-100 mt-2" color = "primary" disabled aria-label = "add groups to member" > { #if loading } < Spinner size = "sm" /> { : else } Add{ /if } </ Button >
2021-12-31 16:23:25 +01:00
{ /if }
2021-12-30 08:25:23 +01:00
< hr / >
< h5 > < div class = "icon d-inline-block" >
< FaFolderMinus / >
< / div > Remove from Groups< / h5 >
2022-05-20 13:39:30 +02:00
< Svelecte renderer = "member-list" disableHighlight bind:value = { groupsToBeRemoved } options= { groupsWithMemberSelection } multiple aria-label = "search for groups to remove" />
2021-12-31 16:23:25 +01:00
{ #if ! loading && groupsToBeRemoved && groupsToBeRemoved . length > 0 }
2022-05-20 13:39:30 +02:00
< Button class = "w-100 mt-2" color = "primary" on:click = { submitRemove } aria-label="remove groups from member " > Remove</ Button > { : else }
< Button class = "w-100 mt-2" color = "primary" disabled aria-label = "remove groups from member" > { #if loading } < Spinner size = "sm" /> { : else } Remove{ /if } </ Button >
2021-12-31 16:23:25 +01:00
{ /if }
2021-12-30 08:25:23 +01:00
< / Col >
< / Row >
2022-05-20 13:39:30 +02:00
< Button style = "flex: 0" color = "secondary" on:click = {() => groupMode = false } aria-label="back to member card " > Back</ Button >