2023-03-14 15:00:56 +01:00
|
|
|
<script lang="ts">
|
2023-04-07 23:41:49 +02:00
|
|
|
import { WordStatus, type Pronoun, pronounDisplay } from "$lib/api/entities";
|
2023-03-14 15:00:56 +01:00
|
|
|
import IconButton from "$lib/components/IconButton.svelte";
|
|
|
|
import {
|
2023-04-07 23:41:49 +02:00
|
|
|
Button,
|
2023-03-14 15:00:56 +01:00
|
|
|
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;
|
|
|
|
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
|
|
|
|
|
|
|
const iconFor = (wordStatus: WordStatus) => {
|
|
|
|
switch (wordStatus) {
|
|
|
|
case WordStatus.Favourite:
|
|
|
|
return "heart-fill";
|
|
|
|
case WordStatus.Okay:
|
|
|
|
return "hand-thumbs-up";
|
|
|
|
case WordStatus.Jokingly:
|
|
|
|
return "emoji-laughing";
|
|
|
|
case WordStatus.FriendsOnly:
|
|
|
|
return "people";
|
|
|
|
case WordStatus.Avoid:
|
|
|
|
return "hand-thumbs-down";
|
|
|
|
default:
|
|
|
|
return "hand-thumbs-up";
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const textFor = (wordStatus: WordStatus) => {
|
|
|
|
switch (wordStatus) {
|
|
|
|
case WordStatus.Favourite:
|
|
|
|
return "Favourite";
|
|
|
|
case WordStatus.Okay:
|
|
|
|
return "Okay";
|
|
|
|
case WordStatus.Jokingly:
|
|
|
|
return "Jokingly";
|
|
|
|
case WordStatus.FriendsOnly:
|
|
|
|
return "Friends only";
|
|
|
|
case WordStatus.Avoid:
|
|
|
|
return "Avoid";
|
|
|
|
default:
|
|
|
|
return "Okay";
|
|
|
|
}
|
|
|
|
};
|
|
|
|
</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>
|
|
|
|
<Tooltip target={buttonElement} placement="top">{textFor(pronoun.status)}</Tooltip>
|
|
|
|
<DropdownToggle color="secondary" caret bind:inner={buttonElement}>
|
|
|
|
<Icon name={iconFor(pronoun.status)} />
|
|
|
|
</DropdownToggle>
|
|
|
|
<DropdownMenu>
|
|
|
|
<DropdownItem
|
|
|
|
on:click={() => (pronoun.status = WordStatus.Favourite)}
|
|
|
|
active={pronoun.status === WordStatus.Favourite}>Favourite</DropdownItem
|
|
|
|
>
|
|
|
|
<DropdownItem
|
|
|
|
on:click={() => (pronoun.status = WordStatus.Okay)}
|
|
|
|
active={pronoun.status === WordStatus.Okay}>Okay</DropdownItem
|
|
|
|
>
|
|
|
|
<DropdownItem
|
|
|
|
on:click={() => (pronoun.status = WordStatus.Jokingly)}
|
|
|
|
active={pronoun.status === WordStatus.Jokingly}>Jokingly</DropdownItem
|
|
|
|
>
|
|
|
|
<DropdownItem
|
|
|
|
on:click={() => (pronoun.status = WordStatus.FriendsOnly)}
|
|
|
|
active={pronoun.status === WordStatus.FriendsOnly}>Friends only</DropdownItem
|
|
|
|
>
|
|
|
|
<DropdownItem
|
|
|
|
on:click={() => (pronoun.status = WordStatus.Avoid)}
|
|
|
|
active={pronoun.status === WordStatus.Avoid}>Avoid</DropdownItem
|
|
|
|
>
|
|
|
|
</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>
|