2023-03-14 15:00:56 +01:00
|
|
|
<script lang="ts">
|
2023-04-19 17:17:44 +02:00
|
|
|
import defaultPreferences from "$lib/api/default_preferences";
|
|
|
|
import type { Pronoun, CustomPreference, CustomPreferences } from "$lib/api/entities";
|
2023-03-14 15:00:56 +01:00
|
|
|
import IconButton from "$lib/components/IconButton.svelte";
|
|
|
|
import {
|
|
|
|
ButtonDropdown,
|
2023-04-07 23:41:49 +02:00
|
|
|
Collapse,
|
2023-03-14 15:00:56 +01:00
|
|
|
DropdownItem,
|
|
|
|
DropdownMenu,
|
|
|
|
DropdownToggle,
|
|
|
|
Icon,
|
2023-04-07 23:41:49 +02:00
|
|
|
InputGroupText,
|
|
|
|
Popover,
|
2023-03-14 15:00:56 +01:00
|
|
|
Tooltip,
|
|
|
|
} from "sveltestrap";
|
|
|
|
|
|
|
|
export let pronoun: Pronoun;
|
2023-04-19 17:17:44 +02:00
|
|
|
export let preferences: CustomPreferences;
|
2023-03-14 15:00:56 +01:00
|
|
|
export let moveUp: () => void;
|
|
|
|
export let moveDown: () => void;
|
|
|
|
export let remove: () => void;
|
|
|
|
|
|
|
|
let buttonElement: HTMLElement;
|
2023-04-07 23:41:49 +02:00
|
|
|
let displayOpen = false;
|
|
|
|
const toggleDisplay = () => (displayOpen = !displayOpen);
|
2023-03-14 15:00:56 +01:00
|
|
|
|
2023-04-19 17:17:44 +02:00
|
|
|
let mergedPreferences: CustomPreferences;
|
|
|
|
$: mergedPreferences = Object.assign(defaultPreferences, preferences);
|
2023-03-14 15:00:56 +01:00
|
|
|
|
2023-04-19 17:17:44 +02:00
|
|
|
let currentPreference: CustomPreference;
|
|
|
|
$: currentPreference =
|
|
|
|
pronoun.status in mergedPreferences
|
|
|
|
? mergedPreferences[pronoun.status]
|
|
|
|
: defaultPreferences.missing;
|
|
|
|
|
|
|
|
let preferenceIds: string[];
|
|
|
|
$: preferenceIds = Object.keys(mergedPreferences).filter((s) => s !== "missing");
|
2023-03-14 15:00:56 +01:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<div class="input-group m-1">
|
|
|
|
<IconButton icon="chevron-up" color="secondary" tooltip="Move pronouns up" click={moveUp} />
|
|
|
|
<IconButton icon="chevron-down" color="secondary" tooltip="Move pronouns down" click={moveDown} />
|
|
|
|
<input
|
|
|
|
placeholder="Full set (e.g. it/it/its/its/itself)"
|
|
|
|
type="text"
|
|
|
|
class="form-control"
|
|
|
|
bind:value={pronoun.pronouns}
|
|
|
|
required
|
|
|
|
/>
|
2023-04-07 23:41:49 +02:00
|
|
|
<IconButton
|
|
|
|
icon={pronoun.display_text ? "tag-fill" : "tag"}
|
|
|
|
color="secondary"
|
|
|
|
tooltip={pronoun.display_text ? "Edit or remove display text" : "Add display text"}
|
|
|
|
click={toggleDisplay}
|
2023-03-14 15:00:56 +01:00
|
|
|
/>
|
|
|
|
<ButtonDropdown>
|
2023-04-19 17:17:44 +02:00
|
|
|
<Tooltip target={buttonElement} placement="top">{currentPreference.tooltip}</Tooltip>
|
2023-03-14 15:00:56 +01:00
|
|
|
<DropdownToggle color="secondary" caret bind:inner={buttonElement}>
|
2023-04-19 17:17:44 +02:00
|
|
|
<Icon name={currentPreference.icon} />
|
2023-03-14 15:00:56 +01:00
|
|
|
</DropdownToggle>
|
|
|
|
<DropdownMenu>
|
2023-04-19 17:17:44 +02:00
|
|
|
{#each preferenceIds as id}
|
|
|
|
<DropdownItem on:click={() => (pronoun.status = id)} active={pronoun.status === id}>
|
|
|
|
<Icon name={mergedPreferences[id].icon} aria-hidden />
|
|
|
|
{mergedPreferences[id].tooltip}
|
|
|
|
</DropdownItem>
|
|
|
|
{/each}
|
2023-03-14 15:00:56 +01:00
|
|
|
</DropdownMenu>
|
|
|
|
</ButtonDropdown>
|
|
|
|
<IconButton color="danger" icon="trash3" tooltip="Remove pronouns" click={remove} />
|
|
|
|
</div>
|
2023-04-07 23:41:49 +02:00
|
|
|
<Collapse isOpen={displayOpen}>
|
|
|
|
<div class="input-group">
|
|
|
|
<InputGroupText>Display text</InputGroupText>
|
|
|
|
<input
|
|
|
|
placeholder="Optional display text (e.g. it/its)"
|
|
|
|
type="text"
|
|
|
|
class="form-control"
|
|
|
|
bind:value={pronoun.display_text}
|
|
|
|
/>
|
|
|
|
<IconButton id="display-help" icon="question" tooltip="Help" color="secondary" />
|
|
|
|
<Popover target="display-help" placement="bottom">
|
|
|
|
This is the short text shown on your profile page. If you leave it empty, it will default to
|
|
|
|
the first two forms of the full set.
|
|
|
|
</Popover>
|
|
|
|
</div>
|
|
|
|
</Collapse>
|