autocomplete cycle logic

This commit is contained in:
2023-05-09 23:32:50 +02:00
parent f38c28a3ad
commit 9f9c3e9218
3 changed files with 35 additions and 6 deletions

View File

@@ -130,7 +130,6 @@ export default class ContextedLinkEditing extends Plugin {
?.textNode as any ?.textNode as any
fireAutocompleteEvent(editor, true, autocompleteNode) fireAutocompleteEvent(editor, true, autocompleteNode)
} }
console.log(keyCode)
this.editor.model.document.fire('contextedKeypress', { keyCode }) this.editor.model.document.fire('contextedKeypress', { keyCode })
data.preventDefault(evt.stop()) data.preventDefault(evt.stop())
} }

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed } from 'vue' import { computed, ref } from 'vue'
import SearchResult from '@/components/Search/SearchResult.vue' import SearchResult from '@/components/Search/SearchResult.vue'
import { notes, findNotesByByTitle, activeNote } from '@/composables/useNotes' import { notes, findNotesByByTitle, activeNote } from '@/composables/useNotes'
@@ -7,12 +7,29 @@ const props = defineProps<{
autocompleteText: string autocompleteText: string
}>() }>()
const emit = defineEmits<{
(e: 'createLink', title: string): void
}>()
const results = computed<Note[]>(() => { const results = computed<Note[]>(() => {
return ( return (
props.autocompleteText ? findNotesByByTitle(props.autocompleteText) : notes.value props.autocompleteText ? findNotesByByTitle(props.autocompleteText) : notes.value
).filter((note) => note.id !== activeNote.value?.id) ).filter((note) => note.id !== activeNote.value?.id)
}) })
const activeResult = ref<Note>()
const changeActiveResult = (direction: number) => {
const index = results.value.findIndex((note) => note.id === activeResult.value?.id)
const newIndex =
index + direction < results.value.length
? index + direction >= -1
? index + direction
: results.value.length - 1
: -1
activeResult.value = newIndex >= 0 ? results.value[newIndex] : undefined
}
const handleKeypress = (event: { [key: string]: number }) => { const handleKeypress = (event: { [key: string]: number }) => {
const keyCode = event.keyCode const keyCode = event.keyCode
const keyCodes = { const keyCodes = {
@@ -21,9 +38,13 @@ const handleKeypress = (event: { [key: string]: number }) => {
} }
if (keyCodes.cycle.includes(keyCode)) { if (keyCodes.cycle.includes(keyCode)) {
const direction = keyCode === 38 ? -1 : 1 const direction = keyCode === 38 ? -1 : 1
// console.log(direction) console.log(direction)
changeActiveResult(direction)
} else if (keyCodes.confirm.includes(keyCode)) { } else if (keyCodes.confirm.includes(keyCode)) {
// console.log('confirm') const contextedLink = activeResult.value
? activeResult.value.title
: props.autocompleteText
emit('createLink', contextedLink)
} }
} }
defineExpose({ handleKeypress }) defineExpose({ handleKeypress })
@@ -34,11 +55,15 @@ defineExpose({ handleKeypress })
class="menu rounded-md border-[1px] bg-base-100 p-2 text-[0.875rem] text-black shadow-md" class="menu rounded-md border-[1px] bg-base-100 p-2 text-[0.875rem] text-black shadow-md"
> >
<li class="flex flex-row"> <li class="flex flex-row">
<a class="active flex-1 px-2 py-1"> <a class="flex-1 px-2 py-1" :class="!activeResult && 'active'">
<span class="flex-1">{{ props.autocompleteText }}</span> <span class="flex-1">{{ props.autocompleteText }}</span>
<i class="fas fa-plus-circle ml-auto text-white" /> <i class="fas fa-plus-circle ml-auto text-white" />
</a> </a>
</li> </li>
<SearchResult v-for="result in results" :result="result" /> <SearchResult
v-for="result in results"
:result="result"
:active-result="activeResult"
/>
</ul> </ul>
</template> </template>

View File

@@ -88,6 +88,10 @@ const handleAutocomplete = (event: AutocompleteEvent) => {
const handleContextedKeypress = (event: any) => { const handleContextedKeypress = (event: any) => {
if (autocompleteRef.value) autocompleteRef.value.handleKeypress(event) if (autocompleteRef.value) autocompleteRef.value.handleKeypress(event)
} }
const createLink = (link: string) => {
console.log(link)
}
</script> </script>
<template> <template>
<div class="relative" ref="editorElement"> <div class="relative" ref="editorElement">
@@ -105,6 +109,7 @@ const handleContextedKeypress = (event: any) => {
ref="autocompleteRef" ref="autocompleteRef"
:autocomplete-text="autocompleteText" :autocomplete-text="autocompleteText"
:style="autocompleteStyle" :style="autocompleteStyle"
@create-link="createLink"
class="absolute w-[250px]" class="absolute w-[250px]"
/> />
</div> </div>