Move panel creation to sections

This commit is contained in:
rxdn 2023-04-13 19:42:25 +01:00
parent ae2789501c
commit 929351eb45
9 changed files with 107 additions and 83 deletions

View File

@ -10,7 +10,7 @@
</button> </button>
<script> <script>
export let icon; export let icon = undefined;
export let fullWidth = false; export let fullWidth = false;
export let disabled = false; export let disabled = false;
export let type = "submit"; export let type = "submit";

View File

@ -3,7 +3,7 @@
export let fill = true; export let fill = true;
export let footerRight = false; export let footerRight = false;
export let dropdown = false; export let dropdown = false;
export let ref; export let ref = undefined;
let dropdownActive = false; let dropdownActive = false;
</script> </script>

View File

@ -1,6 +1,8 @@
<div style="margin-bottom: 8px"> <div style="margin-bottom: 8px">
<div style="cursor: pointer;" class="inline" on:click={toggle}> <div class="inline" class:pointer={!forceAlwaysOpen} on:click={() => toggle(false)}>
{#if expanded} {#if forceAlwaysOpen}
<i class="fas fa-chevron-right"></i>
{:else if expanded}
<i class="{retractIcon}"></i> <i class="{retractIcon}"></i>
{:else} {:else}
<i class="{expandIcon}"></i> <i class="{expandIcon}"></i>
@ -26,7 +28,7 @@
<hr/> <hr/>
</div> </div>
<div bind:this={content} class="content" class:hide-overflow={!expanded}> <div bind:this={content} class="content">
<slot name="content"></slot> <slot name="content"></slot>
</div> </div>
</div> </div>
@ -36,13 +38,15 @@
<script> <script>
import {onMount} from "svelte"; import {onMount} from "svelte";
import Tooltip from "svelte-tooltip"; import Tooltip from "svelte-tooltip";
import { createEventDispatcher } from 'svelte';
export let retractIcon = "fas fa-minus"; export let retractIcon = "fas fa-minus";
export let expandIcon = "fas fa-plus"; export let expandIcon = "fas fa-plus";
export let forceAlwaysOpen = false;
export let defaultOpen = false; export let defaultOpen = false;
export let tooltip; export let tooltip = undefined;
export let tooltipUrl; export let tooltipUrl = undefined;
let expanded = false; let expanded = false;
let showOverflow = true; let showOverflow = true;
@ -52,7 +56,13 @@
let innerWidth; let innerWidth;
$: innerWidth, updateIfExpanded(); $: innerWidth, updateIfExpanded();
export function toggle() { const dispatch = createEventDispatcher();
export function toggle(force) {
if (forceAlwaysOpen && !force) {
return;
}
if (expanded) { if (expanded) {
content.style.maxHeight = 0; content.style.maxHeight = 0;
} else { } else {
@ -62,7 +72,7 @@
expanded = !expanded; expanded = !expanded;
} }
export function updateSize() { function updateSize() {
content.style.maxHeight = `${content.scrollHeight}px`; content.style.maxHeight = `${content.scrollHeight}px`;
} }
@ -73,24 +83,27 @@
} }
onMount(() => { onMount(() => {
content.addEventListener('DOMNodeInserted', updateIfExpanded); // content.addEventListener('DOMNodeInserted', updateIfExpanded);
content.addEventListener('DOMNodeRemoved', updateIfExpanded); // content.addEventListener('DOMNodeRemoved', updateIfExpanded);
if (defaultOpen) toggle(); const observer = new MutationObserver(() => {
updateIfExpanded();
setTimeout(updateIfExpanded, 300); // TODO: Move with transition height
});
observer.observe(content, { childList: true, subtree: true });
if (defaultOpen || forceAlwaysOpen) toggle(true);
}); });
</script> </script>
<style> <style>
.hide-overflow {
overflow: hidden;
}
.content { .content {
display: flex; display: flex;
transition: max-height .3s ease-in-out, margin-top .3s ease-in-out, margin-bottom .3s ease-in-out; transition: max-height .3s ease-in-out, margin-top .3s ease-in-out, margin-bottom .3s ease-in-out;
position: relative; position: relative;
overflow: hidden;
max-height: 0; max-height: 0;
margin-top: 4px;
} }
.inline { .inline {
@ -109,4 +122,8 @@
width: 100%; width: 100%;
flex: 1; flex: 1;
} }
.pointer {
cursor: pointer;
}
</style> </style>

View File

@ -11,7 +11,7 @@
bind:value={data.description}/> bind:value={data.description}/>
</div> </div>
<Collapsible> <Collapsible forceAlwaysOpen>
<span slot="header">Author</span> <span slot="header">Author</span>
<div slot="content" class="row"> <div slot="content" class="row">
@ -23,7 +23,7 @@
</div> </div>
</Collapsible> </Collapsible>
<Collapsible> <Collapsible forceAlwaysOpen>
<span slot="header">Images</span> <span slot="header">Images</span>
<div slot="content" class="row"> <div slot="content" class="row">
<Input col2 label="Large Image URL" placeholder="https://example.com/image.png" <Input col2 label="Large Image URL" placeholder="https://example.com/image.png"
@ -33,7 +33,7 @@
</div> </div>
</Collapsible> </Collapsible>
<Collapsible> <Collapsible forceAlwaysOpen>
<span slot="header">Footer</span> <span slot="header">Footer</span>
<div slot="content" class="row"> <div slot="content" class="row">
{#if footerPremiumOnly} {#if footerPremiumOnly}
@ -49,7 +49,7 @@
</div> </div>
</Collapsible> </Collapsible>
<Collapsible> <Collapsible forceAlwaysOpen>
<span slot="header">Fields</span> <span slot="header">Fields</span>
<div slot="content" class="col-1"> <div slot="content" class="col-1">
{#each data.fields as field, i} {#each data.fields as field, i}
@ -100,19 +100,16 @@
import Button from "./Button.svelte"; import Button from "./Button.svelte";
export let data; export let data;
$: data = data ?? {
fields: [],
colour: '#2ECC71',
author: {},
footer: {},
};
export let footerPremiumOnly = true; export let footerPremiumOnly = true;
if (data === undefined || data === null) {
if (!data) {
data = {};
}
data.fields = [];
data.colour = '#2ECC71';
data.author = {};
data.footer = {};
}
function addField() { function addField() {
data.fields.push({name: '', value: '', inline: false}); data.fields.push({name: '', value: '', inline: false});
data = data; data = data;

View File

@ -18,7 +18,7 @@
<script> <script>
export let icon; export let icon;
export let link; export let link = undefined;
</script> </script>
<style> <style>

View File

@ -14,8 +14,8 @@
<script> <script>
export let value; export let value;
export let label; export let label = undefined;
export let placeholder; export let placeholder = undefined;
export let disabled = false; export let disabled = false;
export let col1 = false; export let col1 = false;

View File

@ -31,7 +31,7 @@
export let value; export let value;
export let label; export let label;
export let placeholder; export let placeholder;
export let badge; export let badge = undefined;
export let disabled = false; export let disabled = false;
export let tooltipText = undefined; export let tooltipText = undefined;

View File

@ -5,6 +5,50 @@
{/if} {/if}
<form class="settings-form" on:submit|preventDefault> <form class="settings-form" on:submit|preventDefault>
<Collapsible defaultOpen>
<span slot="header">Ticket Properties</span>
<div slot="content" class="col-1">
<div class="row">
<div class="col-2">
<label class="form-label">Mention On Open</label>
<div class="multiselect-super">
<Select items={mentionItems}
bind:selectedValue={selectedMentions}
on:select={updateMentions}
optionIdentifier="id"
getSelectionLabel={mentionNameMapper}
getOptionLabel={mentionNameMapper}
placeholderAlwaysShow={true}
isMulti={true} />
</div>
</div>
<div class="col-2">
<label class="form-label">Support Teams</label>
<div class="multiselect-super">
<Select items={teamsWithDefault}
bind:selectedValue={selectedTeams}
on:select={updateTeams}
isSearchable={false}
optionIdentifier="id"
getSelectionLabel={nameMapper}
getOptionLabel={nameMapper}
isMulti={true} />
</div>
</div>
</div>
<div class="incomplete-row">
<CategoryDropdown label="Ticket Category" col3 {channels} bind:value={data.category_id}/>
<Dropdown col4 label="Form" bind:value={data.form_id}>
<option value=null>None</option>
{#each forms as form}
<option value={form.form_id}>{form.title}</option>
{/each}
</Dropdown>
</div>
</div>
</Collapsible>
<Collapsible defaultOpen> <Collapsible defaultOpen>
<span slot="header">Panel Message</span> <span slot="header">Panel Message</span>
<div slot="content" class="col-1"> <div slot="content" class="col-1">
@ -80,54 +124,12 @@
</div> </div>
</Collapsible> </Collapsible>
<Collapsible defaultOpen>
<span slot="header">Ticket Properties</span>
<div slot="content" class="col-1">
<div class="row">
<div class="col-2">
<label class="form-label">Mention On Open</label>
<div class="multiselect-super">
<Select items={mentionItems}
bind:selectedValue={selectedMentions}
on:select={updateMentions}
optionIdentifier="id"
getSelectionLabel={mentionNameMapper}
getOptionLabel={mentionNameMapper}
placeholderAlwaysShow={true}
isMulti={true} />
</div>
</div>
<div class="col-2">
<label class="form-label">Support Teams</label>
<div class="multiselect-super">
<Select items={teamsWithDefault}
bind:selectedValue={selectedTeams}
on:select={updateTeams}
isSearchable={false}
optionIdentifier="id"
getSelectionLabel={nameMapper}
getOptionLabel={nameMapper}
isMulti={true} />
</div>
</div>
</div>
<div class="row">
<CategoryDropdown label="Ticket Category" col3 {channels} bind:value={data.category_id}/>
<Dropdown col4 label="Form" bind:value={data.form_id}>
<option value=null>None</option>
{#each forms as form}
<option value={form.form_id}>{form.title}</option>
{/each}
</Dropdown>
</div>
</div>
</Collapsible>
<Collapsible> <Collapsible>
<span slot="header">Welcome Message</span> <span slot="header">Welcome Message</span>
<div slot="content" class="col-1"> <div slot="content" class="col-1">
<EmbedForm bind:data={data.welcome_message} /> <div class="row">
<EmbedForm bind:data={data.welcome_message} />
</div>
</div> </div>
</Collapsible> </Collapsible>
</form> </form>
@ -328,6 +330,14 @@
margin-bottom: 10px; margin-bottom: 10px;
} }
.incomplete-row {
display: flex;
flex-direction: row;
gap: 10px;
width: 100%;
margin-bottom: 10px;
}
form { form {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@ -13,7 +13,7 @@
<!--<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">--> <!--<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">-->
<!-- Icons --> <!-- Icons -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.1.1/css/all.css"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.4.0/css/all.css">
<!-- GA --> <!-- GA -->
<script async src='https://www.google-analytics.com/analytics.js' <script async src='https://www.google-analytics.com/analytics.js'