mirror of https://github.com/halo-dev/halo
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
parent
70e73faa78
commit
dd3d53486c
|
@ -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">
|
||||||
|
|
|
@ -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">
|
||||||
|
|
Loading…
Reference in New Issue