From bc1033611e273479e0af8738614df3020c867907 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Wed, 26 Jun 2024 19:25:10 +0800 Subject: [PATCH] Refine UI for categories hiden --- .../app/core/extension/content/Category.java | 10 ++++++++++ .../halo/app/core/extension/content/Post.java | 5 +++++ .../app/extension/index/query/NotEqual.java | 2 +- .../components/CategoryEditingModal.vue | 18 ++++++++++++++++++ .../categories/components/CategoryListItem.vue | 13 +++++++++++++ .../api-client/src/models/category-spec.ts | 6 ++++++ .../api-client/src/models/post-status.ts | 6 ++++++ .../src/models/single-page-status.ts | 6 ++++++ ui/src/locales/en.yaml | 8 ++++++++ ui/src/locales/zh-CN.yaml | 4 ++++ ui/src/locales/zh-TW.yaml | 4 ++++ 11 files changed, 81 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/run/halo/app/core/extension/content/Category.java b/api/src/main/java/run/halo/app/core/extension/content/Category.java index a2ddb04b1..245f681b4 100644 --- a/api/src/main/java/run/halo/app/core/extension/content/Category.java +++ b/api/src/main/java/run/halo/app/core/extension/content/Category.java @@ -27,6 +27,7 @@ import run.halo.app.extension.GroupVersionKind; public class Category extends AbstractExtension { public static final String KIND = "Category"; + public static final String LAST_HIDDEN_STATE_ANNO = "content.halo.run/last-hidden-state"; public static final GroupVersionKind GVK = GroupVersionKind.fromExtension(Category.class); @@ -79,6 +80,15 @@ public class Category extends AbstractExtension { * and B will be queried, but C and D will not be queried.

*/ private boolean preventParentPostCascadeQuery; + + /** + *

Whether to hide the category from the category list.

+ *

When set to true, the category including its subcategories and related posts will + * not be displayed in the category list, but it can still be accessed by permalink.

+ *

Limitation: It only takes effect on the theme-side categorized list and it only + * allows to be set to true on the first level(root node) of categories.

+ */ + private boolean hideFromList; } @JsonIgnore diff --git a/api/src/main/java/run/halo/app/core/extension/content/Post.java b/api/src/main/java/run/halo/app/core/extension/content/Post.java index b9209688b..4ea16e74a 100644 --- a/api/src/main/java/run/halo/app/core/extension/content/Post.java +++ b/api/src/main/java/run/halo/app/core/extension/content/Post.java @@ -168,6 +168,11 @@ public class Post extends AbstractExtension { private List contributors; + /** + * see {@link Category.CategorySpec#isHideFromList()}. + */ + private Boolean hideFromList; + private Instant lastModifyTime; private Long observedVersion; diff --git a/api/src/main/java/run/halo/app/extension/index/query/NotEqual.java b/api/src/main/java/run/halo/app/extension/index/query/NotEqual.java index 3ffa33ff0..af8f694dd 100644 --- a/api/src/main/java/run/halo/app/extension/index/query/NotEqual.java +++ b/api/src/main/java/run/halo/app/extension/index/query/NotEqual.java @@ -21,7 +21,7 @@ public class NotEqual extends SimpleQuery { indexView.acquireReadLock(); try { NavigableSet equalNames = equalQuery.matches(indexView); - NavigableSet allNames = indexView.getIdsForField(fieldName); + NavigableSet allNames = indexView.getAllIds(); allNames.removeAll(equalNames); return allNames; } finally { diff --git a/ui/console-src/modules/contents/posts/categories/components/CategoryEditingModal.vue b/ui/console-src/modules/contents/posts/categories/components/CategoryEditingModal.vue index b90c8c448..84394a1fd 100644 --- a/ui/console-src/modules/contents/posts/categories/components/CategoryEditingModal.vue +++ b/ui/console-src/modules/contents/posts/categories/components/CategoryEditingModal.vue @@ -26,10 +26,12 @@ const props = withDefaults( defineProps<{ category?: Category; parentCategory?: Category; + isChildLevelCategory: boolean; }>(), { category: undefined, parentCategory: undefined, + isChildLevelCategory: false, } ); @@ -266,6 +268,22 @@ const { handleGenerateSlug } = useSlugify( :accepts="['image/*']" validation="length:0,1024" > + (), {}); + const categories = defineModel({ type: Array as PropType, default: [], @@ -95,6 +98,7 @@ const handleDelete = async (category: CategoryTree) => { > { /> + + +