|
@@ -27,6 +27,7 @@
|
|
|
|
|
|
export let siblings;
|
|
|
|
|
|
+ export let gotoMessage: Function;
|
|
|
export let showPreviousMessage: Function;
|
|
|
export let showNextMessage: Function;
|
|
|
|
|
@@ -38,6 +39,8 @@
|
|
|
|
|
|
let showDeleteConfirm = false;
|
|
|
|
|
|
+ let messageIndexEdit = false;
|
|
|
+
|
|
|
let edit = false;
|
|
|
let editedContent = '';
|
|
|
let messageEditTextAreaElement: HTMLTextAreaElement;
|
|
@@ -267,11 +270,52 @@
|
|
|
</svg>
|
|
|
</button>
|
|
|
|
|
|
- <div
|
|
|
- class="text-sm tracking-widest font-semibold self-center dark:text-gray-100"
|
|
|
- >
|
|
|
- {siblings.indexOf(message.id) + 1}/{siblings.length}
|
|
|
- </div>
|
|
|
+ {#if messageIndexEdit}
|
|
|
+ <div
|
|
|
+ class="text-sm flex justify-center font-semibold self-center dark:text-gray-100 min-w-fit"
|
|
|
+ >
|
|
|
+ <input
|
|
|
+ id="message-index-input-{message.id}"
|
|
|
+ type="number"
|
|
|
+ value={siblings.indexOf(message.id) + 1}
|
|
|
+ min="1"
|
|
|
+ max={siblings.length}
|
|
|
+ on:focus={(e) => {
|
|
|
+ e.target.select();
|
|
|
+ }}
|
|
|
+ on:blur={(e) => {
|
|
|
+ gotoMessage(message, e.target.value - 1);
|
|
|
+ messageIndexEdit = false;
|
|
|
+ }}
|
|
|
+ on:keydown={(e) => {
|
|
|
+ if (e.key === 'Enter') {
|
|
|
+ gotoMessage(message, e.target.value - 1);
|
|
|
+ messageIndexEdit = false;
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ class="bg-transparent font-semibold self-center dark:text-gray-100 min-w-fit outline-hidden"
|
|
|
+ />/{siblings.length}
|
|
|
+ </div>
|
|
|
+ {:else}
|
|
|
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
|
|
|
+ <div
|
|
|
+ class="text-sm tracking-widest font-semibold self-center dark:text-gray-100 min-w-fit"
|
|
|
+ on:dblclick={async () => {
|
|
|
+ messageIndexEdit = true;
|
|
|
+
|
|
|
+ await tick();
|
|
|
+ const input = document.getElementById(
|
|
|
+ `message-index-input-${message.id}`
|
|
|
+ );
|
|
|
+ if (input) {
|
|
|
+ input.focus();
|
|
|
+ input.select();
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {siblings.indexOf(message.id) + 1}/{siblings.length}
|
|
|
+ </div>
|
|
|
+ {/if}
|
|
|
|
|
|
<button
|
|
|
class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition"
|
|
@@ -398,11 +442,52 @@
|
|
|
</svg>
|
|
|
</button>
|
|
|
|
|
|
- <div
|
|
|
- class="text-sm tracking-widest font-semibold self-center dark:text-gray-100"
|
|
|
- >
|
|
|
- {siblings.indexOf(message.id) + 1}/{siblings.length}
|
|
|
- </div>
|
|
|
+ {#if messageIndexEdit}
|
|
|
+ <div
|
|
|
+ class="text-sm flex justify-center font-semibold self-center dark:text-gray-100 min-w-fit"
|
|
|
+ >
|
|
|
+ <input
|
|
|
+ id="message-index-input-{message.id}"
|
|
|
+ type="number"
|
|
|
+ value={siblings.indexOf(message.id) + 1}
|
|
|
+ min="1"
|
|
|
+ max={siblings.length}
|
|
|
+ on:focus={(e) => {
|
|
|
+ e.target.select();
|
|
|
+ }}
|
|
|
+ on:blur={(e) => {
|
|
|
+ gotoMessage(message, e.target.value - 1);
|
|
|
+ messageIndexEdit = false;
|
|
|
+ }}
|
|
|
+ on:keydown={(e) => {
|
|
|
+ if (e.key === 'Enter') {
|
|
|
+ gotoMessage(message, e.target.value - 1);
|
|
|
+ messageIndexEdit = false;
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ class="bg-transparent font-semibold self-center dark:text-gray-100 min-w-fit outline-hidden"
|
|
|
+ />/{siblings.length}
|
|
|
+ </div>
|
|
|
+ {:else}
|
|
|
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
|
|
|
+ <div
|
|
|
+ class="text-sm tracking-widest font-semibold self-center dark:text-gray-100 min-w-fit"
|
|
|
+ on:dblclick={async () => {
|
|
|
+ messageIndexEdit = true;
|
|
|
+
|
|
|
+ await tick();
|
|
|
+ const input = document.getElementById(
|
|
|
+ `message-index-input-${message.id}`
|
|
|
+ );
|
|
|
+ if (input) {
|
|
|
+ input.focus();
|
|
|
+ input.select();
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {siblings.indexOf(message.id) + 1}/{siblings.length}
|
|
|
+ </div>
|
|
|
+ {/if}
|
|
|
|
|
|
<button
|
|
|
class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition"
|