Move panel creation to sections
This commit is contained in:
parent
ae2789501c
commit
929351eb45
@ -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";
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
@ -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;
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
export let icon;
|
export let icon;
|
||||||
export let link;
|
export let link = undefined;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user