here and there
This commit is contained in:
@@ -21,7 +21,7 @@
|
|||||||
setContext("channel", channel);
|
setContext("channel", channel);
|
||||||
setContext("user", user);
|
setContext("user", user);
|
||||||
</script>
|
</script>
|
||||||
<div class="text-center">
|
<div style="text-align: center;background: var(--p20);padding: 20px;color: var(--p90)">
|
||||||
<h1><a class="text-decoration-none" href="{channel.lucentUrl}">{channel.name}</a></h1>
|
<h1><a class="text-decoration-none" href="{channel.lucentUrl}">{channel.name}</a></h1>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -55,28 +55,28 @@
|
|||||||
<Avatar name={user.name}/>
|
<Avatar name={user.name}/>
|
||||||
</h3>
|
</h3>
|
||||||
<form on:submit={saveName}>
|
<form on:submit={saveName}>
|
||||||
<div class="input-group mb-3">
|
<div class="input-group mb-5">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
bind:value={name}
|
bind:value={name}
|
||||||
class="form-control"
|
class="form-control mb-3"
|
||||||
placeholder="Name"
|
placeholder="Name"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<SpinnerButton label="Update"/>
|
<SpinnerButton label="Update Name"/>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<form on:submit={saveEmail}>
|
<form on:submit={saveEmail}>
|
||||||
<div class="input-group mb-3">
|
<div class="input-group mb-5">
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
bind:value={email}
|
bind:value={email}
|
||||||
class="form-control"
|
class="form-control mb-3"
|
||||||
placeholder="Email"
|
placeholder="Email"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<SpinnerButton label="Update"/>
|
<SpinnerButton label="Update Email"/>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|||||||
@@ -41,12 +41,12 @@
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="wrapper-tiny transparent mb-5">
|
<div class="common-wrapper">
|
||||||
<div class="lx-card mt-5">
|
<div class="lx-card mt-5">
|
||||||
|
|
||||||
<h3 class="header-small mb-5">{title}</h3>
|
<h3 class="header-small mb-5">{title}</h3>
|
||||||
|
|
||||||
<button on:click={buildWebsite} class="btn btn-outline-primary btn-sm mb-3" disabled={inProgress}>Start Build
|
<button on:click={buildWebsite} class="button primary mb-3" disabled={inProgress}>Start Build
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
export let disabled = false;
|
export let disabled = false;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<button type="submit" class="button btn-primary btn-spinner" {disabled}>
|
<button type="submit" class="button secondary btn-spinner" {disabled}>
|
||||||
<span
|
<span
|
||||||
class="spinner-border spinner-border-sm"
|
class="spinner-border spinner-border-sm"
|
||||||
role="status"
|
role="status"
|
||||||
|
|||||||
@@ -12,21 +12,10 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if isVisible}
|
{#if isVisible}
|
||||||
<div
|
<div class="notice notice-success" transition:fly={{ duration: 500 }} role="alert">
|
||||||
transition:fly={{ duration: 500 }}
|
<div class="title">Success</div>
|
||||||
class="lx-alert text-white bg-success border-1 border rounded px-3 py-0 text-center"
|
<div class="content"> {message}</div>
|
||||||
role="alert"
|
</div>
|
||||||
>
|
|
||||||
{message}
|
|
||||||
</div>
|
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<style>
|
|
||||||
.lx-alert {
|
|
||||||
position: fixed;
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
top: 45px;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -25,6 +25,9 @@
|
|||||||
extractLabel(schema, key),
|
extractLabel(schema, key),
|
||||||
].reduce((mem, fn) => fn(mem), filter);
|
].reduce((mem, fn) => fn(mem), filter);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function extractOperator(key) {
|
function extractOperator(key) {
|
||||||
return (filter) => {
|
return (filter) => {
|
||||||
if (filter.isReference) {
|
if (filter.isReference) {
|
||||||
@@ -81,6 +84,7 @@
|
|||||||
{:else}
|
{:else}
|
||||||
{filter.label} {operators.find((o) => o.name === filter.operator)?.symbol ?? ""} {value}
|
{filter.label} {operators.find((o) => o.name === filter.operator)?.symbol ?? ""} {value}
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
on:click|preventDefault={() => removeFilter(key)}
|
on:click|preventDefault={() => removeFilter(key)}
|
||||||
type="button"
|
type="button"
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<script>
|
||||||
|
import {createEventDispatcher, getContext} from "svelte";
|
||||||
|
import Icon from "../../common/Icon.svelte";
|
||||||
|
|
||||||
|
const channel = getContext("channel");
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
|
export let inModal;
|
||||||
|
export let modalUrl;
|
||||||
|
const url = new URL(modalUrl ?? window.location.href);
|
||||||
|
function removeFilter(k) {
|
||||||
|
|
||||||
|
const url = new URL(modalUrl ?? window.location.href);
|
||||||
|
url.searchParams.set("skip", "0");
|
||||||
|
url.searchParams.delete("notlinked");
|
||||||
|
if (inModal) {
|
||||||
|
dispatch("refresh", url);
|
||||||
|
} else {
|
||||||
|
window.location.replace(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{#if url.searchParams.get("notlinked")}
|
||||||
|
<span class="applied-filter">
|
||||||
|
|
||||||
|
Not linked
|
||||||
|
|
||||||
|
<button
|
||||||
|
on:click|preventDefault={() => removeFilter()}
|
||||||
|
type="button"
|
||||||
|
class="button-text"
|
||||||
|
aria-label="Close"
|
||||||
|
><Icon width={12} height={12} icon="close"></Icon></button>
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
import AppliedFilter from "./AppliedFilter.svelte";
|
import AppliedFilter from "./AppliedFilter.svelte";
|
||||||
import {createEventDispatcher, getContext} from "svelte";
|
import {createEventDispatcher, getContext} from "svelte";
|
||||||
import Dropdown from "../../common/Dropdown.svelte";
|
import Dropdown from "../../common/Dropdown.svelte";
|
||||||
|
import AppliedFilterNotLinked from "./AppliedFilterNotLinked.svelte";
|
||||||
|
|
||||||
const channel = getContext("channel");
|
const channel = getContext("channel");
|
||||||
|
|
||||||
@@ -136,6 +137,11 @@
|
|||||||
|
|
||||||
{#if Object.entries(filter).length > 0}
|
{#if Object.entries(filter).length > 0}
|
||||||
<div class="applied-filters">
|
<div class="applied-filters">
|
||||||
|
<AppliedFilterNotLinked
|
||||||
|
{inModal}
|
||||||
|
{modalUrl}
|
||||||
|
on:refresh
|
||||||
|
/>
|
||||||
{#each Object.entries(filter) as [k, v]}
|
{#each Object.entries(filter) as [k, v]}
|
||||||
<AppliedFilter
|
<AppliedFilter
|
||||||
{schema}
|
{schema}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
export let name;
|
export let name;
|
||||||
export let group;
|
export let group;
|
||||||
export let value;
|
export let value;
|
||||||
export let help;
|
export let help = "";
|
||||||
let id = uniqueId();
|
let id = uniqueId();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import Avatar from "../account/Avatar.svelte";
|
import Avatar from "../account/Avatar.svelte";
|
||||||
import {fly} from "svelte/transition";
|
import {fly} from "svelte/transition";
|
||||||
import {createEventDispatcher} from "svelte";
|
import {createEventDispatcher} from "svelte";
|
||||||
|
import Dropdown from "../common/Dropdown.svelte";
|
||||||
|
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
export let member;
|
export let member;
|
||||||
@@ -35,61 +36,50 @@
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
transition:fly={{ duration: 200 }}
|
transition:fly={{ duration: 200 }}
|
||||||
class="d-flex justify-content-between align-items-center mb-3 "
|
class="member-item"
|
||||||
>
|
>
|
||||||
<div class="d-flex align-items-center status-{member.roles.includes('removed') ? 'removed' : 'active'}">
|
<div class="member-name status-{member.roles.includes('removed') ? 'removed' : 'active'}">
|
||||||
<Avatar name={member.name ?? "" } side={32}/>
|
<Avatar name={member.name ?? "" } side={32}/>
|
||||||
<div class="ms-3 ">
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<span class="fs-5">
|
{member.name}
|
||||||
{member.name}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
{member.email}
|
<div>
|
||||||
</div>
|
{member.email}
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div class="dropdown dropdown-center">
|
|
||||||
<button
|
|
||||||
class=" dropdown-toggle btn btn-light"
|
|
||||||
type="button"
|
|
||||||
data-bs-toggle="dropdown"
|
|
||||||
aria-expanded="false"
|
|
||||||
>
|
|
||||||
Roles
|
|
||||||
</button>
|
|
||||||
<div class="dropdown-menu">
|
|
||||||
<h6 class="dropdown-header">Remove role</h6>
|
|
||||||
{#each roles as role}
|
|
||||||
{#if member.roles.includes(role)}
|
|
||||||
<button
|
|
||||||
class="dropdown-item text-capitalize"
|
|
||||||
on:click={(e) => removeFrom(e,role)}
|
|
||||||
>
|
|
||||||
{role}
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
{/each}
|
|
||||||
<div>
|
|
||||||
<hr class="dropdown-divider">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h6 class="dropdown-header">Add role</h6>
|
|
||||||
{#each roles as role}
|
|
||||||
{#if !member.roles.includes(role)}
|
|
||||||
<button
|
|
||||||
class="dropdown-item text-capitalize"
|
|
||||||
on:click={(e) => addTo(e,role)}
|
|
||||||
>
|
|
||||||
{role}
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
{/each}
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
<Dropdown orientation="right">
|
||||||
|
<div slot="button">
|
||||||
|
Roles
|
||||||
|
</div>
|
||||||
|
<h6 class="dropdown-header">Remove role</h6>
|
||||||
|
{#each roles as role}
|
||||||
|
{#if member.roles.includes(role)}
|
||||||
|
<button
|
||||||
|
class="dropdown-item button"
|
||||||
|
on:click={(e) => removeFrom(e,role)}
|
||||||
|
>
|
||||||
|
{role}
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
|
||||||
|
|
||||||
|
<h6 class="dropdown-header">Add role</h6>
|
||||||
|
{#each roles as role}
|
||||||
|
{#if !member.roles.includes(role)}
|
||||||
|
<button
|
||||||
|
class="dropdown-item button"
|
||||||
|
on:click={(e) => addTo(e,role)}
|
||||||
|
>
|
||||||
|
{role}
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
|
||||||
|
</Dropdown>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<style>
|
<style>
|
||||||
.status-removed {
|
.status-removed {
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
import ErrorAlert from "../common/ErrorAlert.svelte";
|
import ErrorAlert from "../common/ErrorAlert.svelte";
|
||||||
import SuccessAlert from "../common/SuccessAlert.svelte";
|
import SuccessAlert from "../common/SuccessAlert.svelte";
|
||||||
import SpinnerButton from "../common/SpinnerButton.svelte";
|
import SpinnerButton from "../common/SpinnerButton.svelte";
|
||||||
import Radio from "../forms/Radio.svelte";
|
|
||||||
import MemberSettingsCard from "./MemberSettingsCard.svelte";
|
import MemberSettingsCard from "./MemberSettingsCard.svelte";
|
||||||
import {getContext} from "svelte";
|
import {getContext} from "svelte";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
|
||||||
const channel = getContext("channel");
|
const channel = getContext("channel");
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="wrapper-tiny transparent mb-5">
|
<div class="common-wrapper">
|
||||||
<div class="lx-card mt-5">
|
<div class="lx-card mt-5">
|
||||||
<h3 class="header-small mb-5">Invite people</h3>
|
<h3 class="header-small mb-5">Invite people</h3>
|
||||||
<ErrorAlert message={errorMessage}/>
|
<ErrorAlert message={errorMessage}/>
|
||||||
@@ -72,12 +72,12 @@
|
|||||||
>Invitee Name</label
|
>Invitee Name</label
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
bind:value={name}
|
bind:value={name}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
id="inviteeName"
|
id="inviteeName"
|
||||||
placeholder="Member name"
|
placeholder="Member name"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
@@ -85,24 +85,24 @@
|
|||||||
>Invitee Email Address</label
|
>Invitee Email Address</label
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
bind:value={email}
|
bind:value={email}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
id="inviteeEmail"
|
id="inviteeEmail"
|
||||||
placeholder="Member email"
|
placeholder="Member email"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="me-3">
|
<div class="me-3">
|
||||||
{#each channel.roles.filter((r) => r !== "removed") as arole}
|
<select bind:value={role}>
|
||||||
<Radio
|
{#each channel.roles.filter((r) => r !== "removed") as arole}
|
||||||
bind:group={role}
|
<option
|
||||||
value={arole}
|
value={arole}
|
||||||
name="role"
|
|
||||||
label={arole}
|
>{arole}</option>
|
||||||
/>
|
{/each}
|
||||||
{/each}
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mt-5 d-block text-center">
|
<div class="mt-5 d-block text-center">
|
||||||
@@ -111,17 +111,15 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="lx-card mt-3">
|
<div class="member-list">
|
||||||
<h3 class="header-small mb-5">Members</h3>
|
<h3 class="header-small mb-5 mt-5">Members</h3>
|
||||||
{#each users as user}
|
{#each users as user}
|
||||||
<MemberSettingsCard
|
<MemberSettingsCard
|
||||||
member={user}
|
member={user}
|
||||||
roles={channel.roles}
|
roles={channel.roles}
|
||||||
on:update={update}
|
on:update={update}
|
||||||
on:reinvite={(e) => invite(e.detail.email, e.detail.role)}
|
on:reinvite={(e) => invite(e.detail.email, e.detail.role)}
|
||||||
/>
|
/>
|
||||||
{/each}
|
{/each}
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&.secondary{
|
&.secondary{
|
||||||
background: red;
|
background: var(--p30);
|
||||||
|
&:hover {
|
||||||
|
background: var(--p40);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
&.primary{
|
&.primary{
|
||||||
background: var(--p70);
|
background: var(--p70);
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
.dropdown {
|
.dropdown {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 20;
|
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown-button > div {
|
.dropdown-button > div {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ label {
|
|||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text],input[type=number],input[type=search],textarea{
|
input[type=text],input[type=number],input[type=search],input[type=email],textarea{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: var(--p20);
|
background: var(--p20);
|
||||||
border: 1px solid var(--p50);
|
border: 1px solid var(--p50);
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
.member-list{
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
.member-item{
|
||||||
|
background: var(--p30);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 12px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.member-name{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,11 +17,8 @@
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notice.success{
|
.notice.notice-success{
|
||||||
border-color: green;
|
background: var(--suc20);
|
||||||
& .title{
|
|
||||||
border-color: green;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.notice.notice-error{
|
.notice.notice-error{
|
||||||
|
|||||||
@@ -1,33 +1,19 @@
|
|||||||
.wrapper-tiny {
|
.wrapper-tiny {
|
||||||
background-color: #fff;
|
background-color: var(--p20);
|
||||||
border-radius: 32px;
|
border-radius: 12px;
|
||||||
margin: 44px auto;
|
margin: 44px auto;
|
||||||
width: 600px;
|
width: 600px;
|
||||||
padding: 44px;
|
padding: 44px;
|
||||||
|
|
||||||
&.transparent {
|
|
||||||
|
|
||||||
margin: 0px auto;
|
|
||||||
padding: 0px;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.wrapper-small {
|
.common-wrapper {
|
||||||
background-color: #fff;
|
background-color: var(--p20);
|
||||||
border-radius: 32px;
|
margin: 20px 0;
|
||||||
margin: 44px auto;
|
padding: 20px;
|
||||||
width: 800px;
|
border-radius: 12px;
|
||||||
padding: 44px;
|
|
||||||
|
|
||||||
&.transparent {
|
|
||||||
|
|
||||||
margin: 0px auto;
|
|
||||||
padding: 0px;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,15 @@
|
|||||||
--p100: #000C23;
|
--p100: #000C23;
|
||||||
|
|
||||||
|
|
||||||
|
--suc10: #d1ffb8;
|
||||||
|
--suc20: #d1ffb8;
|
||||||
|
--suc30: #b5ff8d;
|
||||||
|
--suc40: #a2ff70;
|
||||||
|
--suc50: #82cc5a;
|
||||||
|
--suc80: #71b34e;
|
||||||
|
--suc90: #314c22;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--err10: #ffb9d0;
|
--err10: #ffb9d0;
|
||||||
--err20: #ff9bb3;
|
--err20: #ff9bb3;
|
||||||
@@ -58,6 +67,7 @@
|
|||||||
@import "./dialog";
|
@import "./dialog";
|
||||||
@import "./autocomplete";
|
@import "./autocomplete";
|
||||||
@import "./reference-tags";
|
@import "./reference-tags";
|
||||||
|
@import "./members";
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: var(--p10);
|
background-color: var(--p10);
|
||||||
|
|||||||
Reference in New Issue
Block a user