Introduce TagEditMode as a wrapper around TagWithTooltip

This commit is contained in:
Henrik Giesel 2021-09-09 21:47:07 +02:00
parent 0fdd2d9c52
commit 95058ba23f
3 changed files with 92 additions and 46 deletions

View file

@ -0,0 +1,52 @@
<!--
Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
<script lang="typescript">
import TagWithTooltip from "./TagWithTooltip.svelte";
import TagDeleteBadge from "./TagDeleteBadge.svelte";
import { createEventDispatcher } from "svelte";
export let name: string;
let className: string = "";
export { className as class };
export let tooltip: string;
export let selected: boolean;
export let active: boolean;
export let shorten: boolean;
export let flash: () => void;
const dispatch = createEventDispatcher();
function deleteTag(): void {
dispatch("tagdelete");
}
</script>
<TagWithTooltip
{name}
class={className}
{tooltip}
{selected}
{active}
{shorten}
{flash}
on:tagrange
on:tagselect
on:tagclick={() => dispatch("tagedit")}
let:selectMode
let:hoverClass
>
<TagDeleteBadge
class={hoverClass}
on:click={() => {
if (!selectMode) {
deleteTag();
}
}}
/>
</TagWithTooltip>

View file

@ -9,7 +9,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import Spacer from "components/Spacer.svelte"; import Spacer from "components/Spacer.svelte";
import StickyBottom from "components/StickyBottom.svelte"; import StickyBottom from "components/StickyBottom.svelte";
import TagOptionsBadge from "./TagOptionsBadge.svelte"; import TagOptionsBadge from "./TagOptionsBadge.svelte";
import TagWithTooltip from "./TagWithTooltip.svelte"; import TagEditMode from "./TagEditMode.svelte";
import TagInput from "./TagInput.svelte"; import TagInput from "./TagInput.svelte";
import Tag from "./Tag.svelte"; import Tag from "./Tag.svelte";
import WithAutocomplete from "./WithAutocomplete.svelte"; import WithAutocomplete from "./WithAutocomplete.svelte";
@ -416,7 +416,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
class="position-relative tag-margins" class="position-relative tag-margins"
class:hide-tag={index === active} class:hide-tag={index === active}
> >
<TagWithTooltip <TagEditMode
class="ms-0 tag-margins-inner" class="ms-0 tag-margins-inner"
name={index === active ? activeName : tag.name} name={index === active ? activeName : tag.name}
tooltip={tag.name} tooltip={tag.name}

View file

@ -3,9 +3,8 @@ Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
--> -->
<script lang="typescript"> <script lang="typescript">
import WithTooltip from "components/WithTooltip.svelte";
import Tag from "./Tag.svelte"; import Tag from "./Tag.svelte";
import TagDeleteBadge from "./TagDeleteBadge.svelte"; import WithTooltip from "components/WithTooltip.svelte";
import { createEventDispatcher, getContext } from "svelte"; import { createEventDispatcher, getContext } from "svelte";
import { nightModeKey } from "components/context-keys"; import { nightModeKey } from "components/context-keys";
@ -26,16 +25,12 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
function deleteTag(): void {
dispatch("tagdelete");
}
let control = false; let control = false;
let shift = false; let shift = false;
$: selectMode = control || shift; $: selectMode = control || shift;
function setDeleteIcon(event: KeyboardEvent | MouseEvent): void { function setControlShift(event: KeyboardEvent | MouseEvent): void {
control = controlPressed(event); control = controlPressed(event);
shift = shiftPressed(event); shift = shiftPressed(event);
} }
@ -46,7 +41,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} else if (control) { } else if (control) {
dispatch("tagselect"); dispatch("tagselect");
} else { } else {
dispatch("tagedit"); dispatch("tagclick");
} }
} }
@ -64,22 +59,18 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
return name.split(delimChar).length > 1; return name.split(delimChar).length > 1;
} }
function onClickDelete() {
if (!selectMode) {
deleteTag();
}
}
const nightMode = getContext<boolean>(nightModeKey); const nightMode = getContext<boolean>(nightModeKey);
const hoverClass = "tag-icon-hover";
</script> </script>
<svelte:body on:keydown={setDeleteIcon} on:keyup={setDeleteIcon} /> <svelte:body on:keydown={setControlShift} on:keyup={setControlShift} />
<div class:select-mode={selectMode} class:night-mode={nightMode}>
{#if active} {#if active}
<Tag class={className} on:mousemove={setDeleteIcon} on:click={onClick}> <Tag class={className} on:mousemove={setControlShift} on:click={onClick}>
{name} {name}
<TagDeleteBadge class="delete-icon" on:click={onClickDelete} /> <div class:select-mode={selectMode} class:night-mode={nightMode}>
<slot {selectMode} {hoverClass} />
</div>
</Tag> </Tag>
{:else if shorten && hasMultipleParts(name)} {:else if shorten && hasMultipleParts(name)}
<WithTooltip {tooltip} trigger="hover" placement="auto" let:createTooltip> <WithTooltip {tooltip} trigger="hover" placement="auto" let:createTooltip>
@ -87,12 +78,14 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
class={className} class={className}
bind:flash bind:flash
bind:selected bind:selected
on:mousemove={setDeleteIcon} on:mousemove={setControlShift}
on:click={onClick} on:click={onClick}
on:mount={(event) => createTooltip(event.detail.button)} on:mount={(event) => createTooltip(event.detail.button)}
> >
<span>{processTagName(name)}</span> <span>{processTagName(name)}</span>
<TagDeleteBadge class="delete-icon" on:click={onClickDelete} /> <div class:select-mode={selectMode} class:night-mode={nightMode}>
<slot {selectMode} {hoverClass} />
</div>
</Tag> </Tag>
</WithTooltip> </WithTooltip>
{:else} {:else}
@ -100,26 +93,27 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
class={className} class={className}
bind:flash bind:flash
bind:selected bind:selected
on:mousemove={setDeleteIcon} on:mousemove={setControlShift}
on:click={onClick} on:click={onClick}
> >
<span>{name}</span> <span>{name}</span>
<TagDeleteBadge class="delete-icon" on:click={onClickDelete} /> <div class:select-mode={selectMode} class:night-mode={nightMode}>
<slot {selectMode} {hoverClass} />
</div>
</Tag> </Tag>
{/if} {/if}
</div>
<style lang="scss"> <style lang="scss">
.select-mode :global(button:hover) { :global(button:hover) .select-mode {
display: contents; display: contents;
cursor: crosshair; cursor: crosshair;
:global(.delete-icon) { :global(.tag-icon-hover) {
opacity: 0; opacity: 0;
} }
} }
:global(.delete-icon):hover { :global(.tag-icon-hover):hover {
$white-translucent: rgba(255 255 255 / 0.5); $white-translucent: rgba(255 255 255 / 0.5);
$dark-translucent: rgba(0 0 0 / 0.2); $dark-translucent: rgba(0 0 0 / 0.2);