PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.5
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.5
4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 All 203 releases
betterdocs / react-src / admin / dashboard / components / MultiSelect.js

MultiSelect.js in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 4.9.5, at react-src/admin/dashboard/components/MultiSelect.js

143 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import React, { useEffect, useState } from "react";
2 import { decodeEntities } from "@wordpress/html-entities";
3 import { IconSearch } from "../../../icons";
4 import { addQueryArgs } from "@wordpress/url";
5 import useFetch from "../hooks/useFetch";
6
7 const MultiSelect = (props) => {
8 const { label, placeholder, doc, endpoint, setQuickEditData, name } = props;
9
10 if (doc?.id === undefined) {
11 return null;
12 }
13
14 const [keyword, setKeyword] = useState("");
15 const [items, setItems] = useState([]);
16
17 const { data, isLoading } = useFetch({
18 path: addQueryArgs(endpoint, { post: doc.id }),
19 });
20
21 const { data: allItems, isLoading: allItemsLoading } = useFetch({
22 path: addQueryArgs(endpoint),
23 });
24
25 const { data: searchedData, isLoading: searchIsLoading } = useFetch({
26 path: addQueryArgs(endpoint, { search: keyword }),
27 });
28
29 useEffect(() => {
30 setItems([]);
31 }, [doc.id]);
32
33 useEffect(() => {
34 setItems((prev) => {
35 let items = [];
36 let itemsId = [];
37 if (data.length > 0) {
38 items = data.map((item) => {
39 itemsId.push(item.id);
40
41 return { ...item, selected: true };
42 });
43 }
44
45 if (searchedData.length > 0) {
46 let searchFilteredItems = searchedData.filter(
47 (item) => !itemsId.includes(item.id),
48 );
49
50 searchFilteredItems = searchFilteredItems.map((item) => {
51 return { ...item, selected: false };
52 });
53
54 itemsId = [
55 ...itemsId,
56 ...searchFilteredItems.map((item) => item.id),
57 ];
58
59 items = [...items, ...searchFilteredItems];
60 }
61
62 if (allItems.length > 0) {
63 let filteredItems = allItems.filter(
64 (item) => !itemsId.includes(item.id),
65 );
66
67 filteredItems = filteredItems.map((item) => {
68 return { ...item, selected: false };
69 });
70
71 items = [...items, ...filteredItems];
72 }
73
74 return items;
75 });
76 }, [data, allItems, searchedData, doc]);
77
78 useEffect(() => {
79 setQuickEditData((prev) => {
80 return {
81 ...prev,
82 [name]: items
83 .filter((item) => item.selected)
84 .map((item) => parseInt(item.id)),
85 };
86 });
87 }, [items]);
88
89 const handleSelect = (id) => {
90 return (event) => {
91 setItems((items) => {
92 return items.map((item) => {
93 if (item.id === id && event.target.checked) {
94 item.selected = true;
95 }
96 if (item.id === id && !event.target.checked) {
97 item.selected = false;
98 }
99
100 return item;
101 });
102 });
103 };
104 };
105
106 return (
107 <div className="betterdocs-quick-edit-form-group">
108 <label htmlFor="betterdocs-quick-edit-category">{label}</label>
109 <div className="betterdocs-quick-edit-multiselect">
110 <div className="betterdocs-quick-edit-search">
111 <IconSearch />
112 <input
113 type="text"
114 placeholder={placeholder}
115 value={keyword}
116 onChange={(e) => setKeyword(e.target.value)}
117 />
118 </div>
119 <div className="betterdocs-quick-edit-multiselect-items">
120 {items.map((item) => {
121 let defaultValue = ( name == 'doc_category' && doc?.doc_category?.includes(item?.id) ) ? true : (name == 'doc_tag' && doc?.doc_tag?.includes(item?.id) ? true : ( name == 'knowledge_base' && doc?.knowledge_base?.includes(item?.id) ? true : false ));
122 return <div
123 className="betterdocs-quick-edit-checkbox-group"
124 key={item.id}
125 >
126 <input
127 type="checkbox"
128 value={item.name}
129 id={item.id}
130 defaultChecked={defaultValue}
131 onChange={handleSelect(item.id)}
132 />
133 <label htmlFor={item.id}>{decodeEntities(item.name)}</label>
134 </div>
135 })}
136 </div>
137 </div>
138 </div>
139 );
140 };
141
142 export default MultiSelect;
143