From d4cd06196f6bb846fb4a434e55237bdeee64d24b Mon Sep 17 00:00:00 2001 From: MrKBear Date: Tue, 29 Mar 2022 14:32:28 +0800 Subject: [PATCH] Add behavior can filter by name --- source/Behavior/Behavior.ts | 47 +++++++++++++- .../Component/BehaviorPopup/BehaviorPopup.tsx | 61 ++++++++++++++----- source/Model/Behavior.ts | 5 ++ 3 files changed, 96 insertions(+), 17 deletions(-) diff --git a/source/Behavior/Behavior.ts b/source/Behavior/Behavior.ts index 6c0346a..123f8b3 100644 --- a/source/Behavior/Behavior.ts +++ b/source/Behavior/Behavior.ts @@ -4,7 +4,52 @@ import { Template } from "./Template"; const AllBehaviors: IAnyBehaviorRecorder[] = new Array(4).fill(0).map((_, i) => { let behavior = new BehaviorRecorder(Template); behavior.behaviorId = behavior.behaviorId + i; + behavior.behaviorName = behavior.behaviorName + Math.random().toString(36).slice(-6); + behavior.category = "Category" + Math.floor(Math.random() * 3).toString(); return behavior; }); -export { AllBehaviors }; \ No newline at end of file +/** + * 分类词条 + */ +type ICategory = {key: string, category: Record, item: IAnyBehaviorRecorder[]}; + +const AllBehaviorsWithCategory: ICategory[] = categoryBehaviors(AllBehaviors); + +/** + * 将词条进行分类 + */ +function categoryBehaviors(behaviors: IAnyBehaviorRecorder[]): ICategory[] { + let res: ICategory[] = []; + for (let i = 0; i < behaviors.length; i++) { + + let category: ICategory | undefined = undefined; + for (let j = 0; j < res.length; j++) { + if (res[j].key === behaviors[i].category) { + category = res[j]; + } + } + + if (!category) { + category = { + key: behaviors[i].category, + category: {}, + item: [] + } + res.push(category); + } + + if (behaviors[i].category[0] === "$") { + let terms = behaviors[i].terms[behaviors[i].category]; + if (terms) { + category.category = {...category.category, ...terms} + } + } + + category.item.push(behaviors[i]); + } + + return res; +} + +export { AllBehaviors, AllBehaviorsWithCategory, ICategory as ICategoryBehavior }; \ No newline at end of file diff --git a/source/Component/BehaviorPopup/BehaviorPopup.tsx b/source/Component/BehaviorPopup/BehaviorPopup.tsx index 5c813e1..d1aa39d 100644 --- a/source/Component/BehaviorPopup/BehaviorPopup.tsx +++ b/source/Component/BehaviorPopup/BehaviorPopup.tsx @@ -1,10 +1,10 @@ -import { Component, ReactNode } from "react"; +import { Component, ReactNode, Fragment } from "react"; import { Popup } from "@Context/Popups"; -import { Localization, I18N } from "@Component/Localization/Localization"; +import { Localization } from "@Component/Localization/Localization"; import { SearchBox } from "@Component/SearchBox/SearchBox"; import { ConfirmContent } from "@Component/ConfirmPopup/ConfirmPopup"; import { BehaviorList } from "@Component/BehaviorList/BehaviorList"; -import { AllBehaviors } from "@Behavior/Behavior"; +import { AllBehaviorsWithCategory, ICategoryBehavior } from "@Behavior/Behavior"; import { Message } from "@Component/Message/Message"; import { IRenderBehavior } from "@Model/Behavior"; import { useStatus, IMixinStatusProps } from "@Context/Status"; @@ -90,21 +90,28 @@ class BehaviorPopupComponent extends Component< /> } - public render(): ReactNode { - return - + private renderBehaviors = (behaviors: ICategoryBehavior, first: boolean) => { + + let language = this.props.setting?.language ?? "EN_US"; + let filterItem = behaviors.item.filter((item) => { + let name = item.getTerms(item.behaviorName, this.props.setting?.language); + if (this.state.searchValue) { + return name.includes(this.state.searchValue); + } else { + return true; + } + }) + + if (filterItem.length <= 0) return undefined; + + return + { if (this.state.focusBehavior.has(behavior)) { @@ -115,6 +122,28 @@ class BehaviorPopupComponent extends Component< this.forceUpdate(); }} /> + + } + + public render(): ReactNode { + let first: boolean = true; + return + {AllBehaviorsWithCategory.map((behavior) => { + let renderItem = this.renderBehaviors(behavior, first); + if (renderItem) { + first = false; + } + return renderItem; + }).filter((x) => !!x)} } } diff --git a/source/Model/Behavior.ts b/source/Model/Behavior.ts index 3d664fd..dbc7d58 100644 --- a/source/Model/Behavior.ts +++ b/source/Model/Behavior.ts @@ -159,6 +159,11 @@ class BehaviorInfo = {}> extends Emitter { */ public describe: string = ""; + /** + * 类别 + */ + public category: string = ""; + /** * 提条列表 */