pref: create while searching for tags or categories (#5526)

#### What type of PR is this?

/kind improvement
/area ui
/milestone 2.14.x

#### What this PR does / why we need it:

在 `TagSelect` 与 `CategorySelect` 组件中,当搜索的同时允许进行创建新的分类或标签。

#### How to test it?

测试在搜索标签或者分类时,能否创建新的标签或者分类

#### Which issue(s) this PR fixes:

Fixes #4660

#### Does this PR introduce a user-facing change?
```release-note
在搜索标签或分类的同时允许进行创建新的分类或标签
```
pull/5533/head
Takagi 2024-03-20 17:04:07 +08:00 committed by GitHub
parent 70e73faa78
commit dd3d53486c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 19 deletions

View File

@ -171,19 +171,23 @@ const handleKeydown = (e: KeyboardEvent) => {
: convertTreeToCategories(categoriesTree.value); : convertTreeToCategories(categoriesTree.value);
const index = categoryIndices.findIndex( const index = categoryIndices.findIndex(
(tag) => tag.metadata.name === selectedCategory.value?.metadata.name (category) =>
category.metadata.name === selectedCategory.value?.metadata.name
); );
if (index > 0) { if (index > 0) {
selectedCategory.value = categoryIndices[index - 1]; selectedCategory.value = categoryIndices[index - 1];
} else {
selectedCategory.value = undefined;
} }
scrollToSelected(); scrollToSelected();
} }
if (e.key === "Enter") { if (e.key === "Enter") {
if (searchResults.value.length === 0 && text.value) { if (!selectedCategory.value && text.value) {
handleCreateCategory(); handleCreateCategory();
return; return;
} }
if (selectedCategory.value) { if (selectedCategory.value) {
handleSelect(selectedCategory.value); handleSelect(selectedCategory.value);
text.value = ""; text.value = "";
@ -193,12 +197,10 @@ const handleKeydown = (e: KeyboardEvent) => {
}; };
const scrollToSelected = () => { const scrollToSelected = () => {
if (!selectedCategory.value) { const selectedNodeName = selectedCategory.value
return; ? selectedCategory.value?.metadata.name
} : "create";
const selectedNode = document.getElementById( const selectedNode = document.getElementById(`category-${selectedNodeName}`);
`category-${selectedCategory.value?.metadata.name}`
);
if (selectedNode) { if (selectedNode) {
selectedNode.scrollIntoView({ selectedNode.scrollIntoView({
behavior: "smooth", behavior: "smooth",
@ -291,11 +293,15 @@ const handleDelete = () => {
<div v-if="dropdownVisible" :class="context.classes['dropdown-wrapper']"> <div v-if="dropdownVisible" :class="context.classes['dropdown-wrapper']">
<ul class="p-1"> <ul class="p-1">
<HasPermission <HasPermission
v-if="text.trim() && !searchResults?.length" v-if="text.trim()"
:permissions="['system:posts:manage']" :permissions="['system:posts:manage']"
> >
<li <li
class="group flex cursor-pointer items-center justify-between rounded bg-gray-100 p-2" id="category-create"
class="group flex cursor-pointer items-center justify-between rounded p-2"
:class="{
'bg-gray-100': selectedCategory === undefined,
}"
@click="handleCreateCategory" @click="handleCreateCategory"
> >
<span class="text-xs text-gray-700 group-hover:text-gray-900"> <span class="text-xs text-gray-700 group-hover:text-gray-900">

View File

@ -153,13 +153,15 @@ const handleKeydown = (e: KeyboardEvent) => {
); );
if (index > 0) { if (index > 0) {
selectedTag.value = searchResults.value[index - 1]; selectedTag.value = searchResults.value[index - 1];
} else {
selectedTag.value = undefined;
} }
scrollToSelected(); scrollToSelected();
} }
if (e.key === "Enter") { if (e.key === "Enter") {
if (searchResults.value.length === 0 && text.value) { if (!selectedTag.value && text.value) {
handleCreateTag(); handleCreateTag();
return; return;
} }
@ -174,13 +176,11 @@ const handleKeydown = (e: KeyboardEvent) => {
}; };
const scrollToSelected = () => { const scrollToSelected = () => {
if (!selectedTag.value) { const selectedNodeName = selectedTag.value
return; ? selectedTag.value?.metadata.name
} : "tag-create";
const selectedNode = document.getElementById( const selectedNode = document.getElementById(selectedNodeName);
selectedTag.value?.metadata.name
);
if (selectedNode) { if (selectedNode) {
selectedNode.scrollIntoView({ selectedNode.scrollIntoView({
@ -281,11 +281,15 @@ const handleDelete = () => {
<div v-if="dropdownVisible" :class="context.classes['dropdown-wrapper']"> <div v-if="dropdownVisible" :class="context.classes['dropdown-wrapper']">
<ul class="p-1"> <ul class="p-1">
<HasPermission <HasPermission
v-if="text.trim() && !searchResults?.length" v-if="text.trim()"
:permissions="['system:posts:manage']" :permissions="['system:posts:manage']"
> >
<li <li
class="group flex cursor-pointer items-center justify-between rounded bg-gray-100 p-2" id="tag-create"
class="group flex cursor-pointer items-center justify-between rounded p-2"
:class="{
'bg-gray-100': selectedTag === undefined,
}"
@click="handleCreateTag" @click="handleCreateTag"
> >
<span class="text-xs text-gray-700 group-hover:text-gray-900"> <span class="text-xs text-gray-700 group-hover:text-gray-900">