@thebuoyant-tsdev/mui-ts-library 3.33.0 → 3.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +17 -1
- package/README.md +17 -1
- package/dist/components/kanban-board/KanbanBoard.d.ts +1 -1
- package/dist/components/kanban-board/KanbanBoard.js +124 -94
- package/dist/components/kanban-board/KanbanBoard.types.d.ts +13 -0
- package/dist/components/kanban-board/KanbanBoard.types.js +2 -1
- package/dist/components/kanban-board/kanbanBoardClasses.d.ts +4 -0
- package/dist/components/kanban-board/kanbanBoardClasses.js +3 -1
- package/dist/components/rich-text-editor/RichTextEditorEmojiPicker.js +15 -15
- package/dist/index.cjs +2 -2
- package/package.json +1 -1
package/README.de.md
CHANGED
|
@@ -104,7 +104,7 @@ const tasks: GanttTask[] = [
|
|
|
104
104
|
|
|
105
105
|
### KanbanBoard
|
|
106
106
|
|
|
107
|
-
Ein Drag-and-Drop-Kanban-Board mit eingebauten Hinzufügen-/Bearbeiten-/Löschen-Dialogen, WIP-Limits und vollständiger i18n. Ideal für Task-Management-Dashboards, Sprint-Boards oder jeden Workflow, bei dem Nutzer Aufgaben zwischen Statusspalten verschieben sollen — mit Kartenfarben, Zuständige-Person-Chips, Fälligkeitsdatum-Chips und
|
|
107
|
+
Ein Drag-and-Drop-Kanban-Board mit eingebauten Hinzufügen-/Bearbeiten-/Löschen-Dialogen, WIP-Limits und vollständiger i18n. Ideal für Task-Management-Dashboards, Sprint-Boards oder jeden Workflow, bei dem Nutzer Aufgaben zwischen Statusspalten verschieben sollen — mit Kartenfarben, Prioritäts-Punkten, Zuständige-Person-Chips, Fälligkeitsdatum-Chips mit Überfälligkeits-Warnung und `filterText`-Prop für Live-Suche.
|
|
108
108
|
|
|
109
109
|
```tsx
|
|
110
110
|
import { KanbanBoard } from '@thebuoyant-tsdev/mui-ts-library';
|
|
@@ -555,6 +555,22 @@ Dieses Projekt folgt [Semantic Versioning](https://semver.org/):
|
|
|
555
555
|
|
|
556
556
|
## Changelog
|
|
557
557
|
|
|
558
|
+
### [3.34.0] — 2026-07-18
|
|
559
|
+
|
|
560
|
+
**Hinzugefügt**
|
|
561
|
+
- **KanbanBoard — `showSearchField`**: Neues Boolean-Prop, das ein eingebautes `size="small"`-Suchfeld mit Lupen-Icon über dem Board rendert. Das Board verwaltet den Filterzustand intern — kein zusätzliches Wiring nötig. Placeholder-Text über `translation.searchFieldPlaceholder` anpassbar. Das bestehende `filterText`-Prop funktioniert weiterhin für Consumer, die ein eigenes Suchfeld bauen.
|
|
562
|
+
- **KanbanBoard — `translation.searchFieldPlaceholder`**: Neuer Translation-Key (Standard `"Search by title or assignee…"`).
|
|
563
|
+
- **KanbanBoard — CSS-Klassen**: `MuiTsKanbanBoard-searchFieldWrapper` und `MuiTsKanbanBoard-searchField`. Siehe [Vollständiger Changelog](https://github.com/thebuoyant/mui-ts-library/blob/main/CHANGELOG.de.md) für Details.
|
|
564
|
+
|
|
565
|
+
---
|
|
566
|
+
|
|
567
|
+
### [3.33.1] — 2026-07-18
|
|
568
|
+
|
|
569
|
+
**Geändert**
|
|
570
|
+
- **KanbanBoard — Docs**: Überblick-Abschnitt und README-Beschreibung aktualisiert — Prioritäts-Punkte, Überfälligkeits-Warnung und `filterText` jetzt in der Einleitung genannt. Siehe [Vollständiger Changelog](https://github.com/thebuoyant/mui-ts-library/blob/main/CHANGELOG.de.md) für Details.
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
558
574
|
### [3.33.0] — 2026-07-18
|
|
559
575
|
|
|
560
576
|
**Hinzugefügt**
|
package/README.md
CHANGED
|
@@ -104,7 +104,7 @@ const tasks: GanttTask[] = [
|
|
|
104
104
|
|
|
105
105
|
### KanbanBoard
|
|
106
106
|
|
|
107
|
-
A drag-and-drop Kanban board with built-in Add / Edit / Delete dialogs, WIP limits, and full i18n. Use it for task management dashboards, sprint boards, or any workflow where users move work items between status columns — with card colors, assignee chips, due-date chips, and a
|
|
107
|
+
A drag-and-drop Kanban board with built-in Add / Edit / Delete dialogs, WIP limits, and full i18n. Use it for task management dashboards, sprint boards, or any workflow where users move work items between status columns — with card colors, priority dots, assignee chips, due-date chips with overdue highlighting, and a `filterText` prop for live card search.
|
|
108
108
|
|
|
109
109
|
```tsx
|
|
110
110
|
import { KanbanBoard } from '@thebuoyant-tsdev/mui-ts-library';
|
|
@@ -555,6 +555,22 @@ This project follows [Semantic Versioning](https://semver.org/):
|
|
|
555
555
|
|
|
556
556
|
## Changelog
|
|
557
557
|
|
|
558
|
+
### [3.34.0] — 2026-07-18
|
|
559
|
+
|
|
560
|
+
**Added**
|
|
561
|
+
- **KanbanBoard — `showSearchField`**: New boolean prop that renders a built-in `size="small"` search field with a magnifier icon above the board. The board manages the filter state internally — no extra wiring needed. Placeholder text customizable via `translation.searchFieldPlaceholder`. The existing `filterText` prop still works for consumers who build their own search UI.
|
|
562
|
+
- **KanbanBoard — `translation.searchFieldPlaceholder`**: New translation key (default `"Search by title or assignee…"`).
|
|
563
|
+
- **KanbanBoard — CSS classes**: `MuiTsKanbanBoard-searchFieldWrapper` and `MuiTsKanbanBoard-searchField`. See [Full Changelog](https://github.com/thebuoyant/mui-ts-library/blob/main/CHANGELOG.md) for details.
|
|
564
|
+
|
|
565
|
+
---
|
|
566
|
+
|
|
567
|
+
### [3.33.1] — 2026-07-18
|
|
568
|
+
|
|
569
|
+
**Changed**
|
|
570
|
+
- **KanbanBoard — docs**: Updated component overview and README description to mention priority dots, overdue warning, and `filterText`. See [Full Changelog](https://github.com/thebuoyant/mui-ts-library/blob/main/CHANGELOG.md) for details.
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
558
574
|
### [3.33.0] — 2026-07-18
|
|
559
575
|
|
|
560
576
|
**Added**
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { type KanbanBoardProps } from "./KanbanBoard.types";
|
|
2
|
-
export declare function KanbanBoard({ tasks, columns, onTasksChange, onCardClick, enableBuiltinDialogs, onTaskCreated, onTaskUpdated, onTaskDeleted, onTaskMoved, showPriority, showAssignee, showDueDate, showDueDateWarning, chipVariant, filterText, width, height, translation, }: KanbanBoardProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function KanbanBoard({ tasks, columns, onTasksChange, onCardClick, enableBuiltinDialogs, onTaskCreated, onTaskUpdated, onTaskDeleted, onTaskMoved, showPriority, showAssignee, showDueDate, showDueDateWarning, chipVariant, showSearchField, filterText, width, height, translation, }: KanbanBoardProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -5,138 +5,168 @@ import { KanbanBoardCardDialog as r } from "./KanbanBoardCardDialog.js";
|
|
|
5
5
|
import { KanbanBoardColumn as i } from "./KanbanBoardColumn.js";
|
|
6
6
|
import { DndContext as a, DragOverlay as o, KeyboardSensor as s, PointerSensor as c, closestCorners as l, useSensor as u, useSensors as d } from "@dnd-kit/core";
|
|
7
7
|
import { arrayMove as f, sortableKeyboardCoordinates as p } from "@dnd-kit/sortable";
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
8
|
+
import m from "@mui/icons-material/Search";
|
|
9
|
+
import { Box as h, InputAdornment as g, TextField as ee } from "@mui/material";
|
|
10
|
+
import { useEffect as _, useState as v } from "react";
|
|
11
|
+
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
11
12
|
//#region src/components/kanban-board/KanbanBoard.tsx
|
|
12
|
-
function
|
|
13
|
-
let
|
|
13
|
+
function x({ tasks: x, columns: S, onTasksChange: C, onCardClick: w, enableBuiltinDialogs: T = !0, onTaskCreated: E, onTaskUpdated: D, onTaskDeleted: O, onTaskMoved: k, showPriority: A = !0, showAssignee: j = !0, showDueDate: M = !0, showDueDateWarning: N = !0, chipVariant: P = "outlined", showSearchField: F = !1, filterText: I = "", width: L = "100%", height: R = "100%", translation: z }) {
|
|
14
|
+
let B = {
|
|
14
15
|
...t,
|
|
15
|
-
...
|
|
16
|
-
}, [
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}, [
|
|
20
|
-
let [
|
|
21
|
-
function
|
|
22
|
-
V
|
|
16
|
+
...z
|
|
17
|
+
}, [V, H] = v(x);
|
|
18
|
+
_(() => {
|
|
19
|
+
H(x);
|
|
20
|
+
}, [x]);
|
|
21
|
+
let [U, W] = v(null), [G, K] = v(null), [q, J] = v(""), Y = d(u(c, { activationConstraint: { distance: 8 } }), u(s, { coordinateGetter: p }));
|
|
22
|
+
function X({ active: e }) {
|
|
23
|
+
W(V.find((t) => t.id === e.id) ?? null);
|
|
23
24
|
}
|
|
24
|
-
function
|
|
25
|
+
function Z({ active: e, over: t }) {
|
|
25
26
|
if (!t) return;
|
|
26
|
-
let n = e.id, r = t.id, i =
|
|
27
|
+
let n = e.id, r = t.id, i = V.find((e) => e.id === n);
|
|
27
28
|
if (!i) return;
|
|
28
|
-
let a =
|
|
29
|
-
!s || i.status === s ||
|
|
29
|
+
let a = S.find((e) => e.id === r), o = V.find((e) => e.id === r), s = a?.id ?? o?.status;
|
|
30
|
+
!s || i.status === s || H((e) => e.map((e) => e.id === n ? {
|
|
30
31
|
...e,
|
|
31
32
|
status: s
|
|
32
33
|
} : e));
|
|
33
34
|
}
|
|
34
|
-
function
|
|
35
|
-
let n =
|
|
36
|
-
if (
|
|
37
|
-
|
|
35
|
+
function Q({ active: e, over: t }) {
|
|
36
|
+
let n = U?.status;
|
|
37
|
+
if (W(null), !t) {
|
|
38
|
+
H(x);
|
|
38
39
|
return;
|
|
39
40
|
}
|
|
40
|
-
let r = e.id, i = t.id, a =
|
|
41
|
-
if (s = a !== -1 && o !== -1 && a !== o ? f(
|
|
41
|
+
let r = e.id, i = t.id, a = V.findIndex((e) => e.id === r), o = V.findIndex((e) => e.id === i), s;
|
|
42
|
+
if (s = a !== -1 && o !== -1 && a !== o ? f(V, a, o) : [...V], H(s), C?.(s), n) {
|
|
42
43
|
let e = s.find((e) => e.id === r);
|
|
43
|
-
e && e.status !== n &&
|
|
44
|
+
e && e.status !== n && k?.(e, n, e.status);
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
|
-
function
|
|
47
|
-
|
|
47
|
+
function te(e) {
|
|
48
|
+
T ? K({
|
|
48
49
|
mode: "edit",
|
|
49
50
|
task: e
|
|
50
|
-
}) :
|
|
51
|
+
}) : w?.(e);
|
|
51
52
|
}
|
|
52
|
-
function
|
|
53
|
-
|
|
53
|
+
function ne(e) {
|
|
54
|
+
K({
|
|
54
55
|
mode: "add",
|
|
55
56
|
columnId: e
|
|
56
57
|
});
|
|
57
58
|
}
|
|
58
|
-
function
|
|
59
|
-
let t = !
|
|
60
|
-
|
|
59
|
+
function re(e) {
|
|
60
|
+
let t = !V.find((t) => t.id === e.id), n = t ? [...V, e] : V.map((t) => t.id === e.id ? e : t);
|
|
61
|
+
H(n), C?.(n), t ? E?.(e) : D?.(e), K(null);
|
|
61
62
|
}
|
|
62
|
-
function
|
|
63
|
-
let t =
|
|
64
|
-
|
|
63
|
+
function ie(e) {
|
|
64
|
+
let t = V.filter((t) => t.id !== e);
|
|
65
|
+
H(t), C?.(t), O?.(e), K(null);
|
|
65
66
|
}
|
|
66
|
-
function
|
|
67
|
-
|
|
67
|
+
function ae(e) {
|
|
68
|
+
K({
|
|
68
69
|
mode: "delete",
|
|
69
70
|
task: e
|
|
70
71
|
});
|
|
71
72
|
}
|
|
72
|
-
let $ =
|
|
73
|
-
function
|
|
73
|
+
let $ = (I || q).trim().toLowerCase();
|
|
74
|
+
function oe(e) {
|
|
74
75
|
return $ ? e.title.toLowerCase().includes($) || (e.assignee?.toLowerCase().includes($) ?? !1) : !0;
|
|
75
76
|
}
|
|
76
|
-
return /* @__PURE__ */
|
|
77
|
+
return /* @__PURE__ */ b(h, {
|
|
77
78
|
className: e.root,
|
|
78
79
|
sx: {
|
|
79
|
-
width:
|
|
80
|
-
height:
|
|
80
|
+
width: L,
|
|
81
|
+
height: R,
|
|
81
82
|
display: "flex",
|
|
82
83
|
flexDirection: "column",
|
|
83
84
|
overflow: "hidden"
|
|
84
85
|
},
|
|
85
|
-
children: [
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
onDragStart: G,
|
|
89
|
-
onDragOver: K,
|
|
90
|
-
onDragEnd: q,
|
|
91
|
-
children: [/* @__PURE__ */ _(m, {
|
|
92
|
-
className: e.columns,
|
|
86
|
+
children: [
|
|
87
|
+
F && /* @__PURE__ */ y(h, {
|
|
88
|
+
className: e.searchFieldWrapper,
|
|
93
89
|
sx: {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
p: 2,
|
|
98
|
-
overflowX: "auto",
|
|
99
|
-
overflowY: "hidden",
|
|
100
|
-
alignItems: "stretch"
|
|
90
|
+
px: 2,
|
|
91
|
+
pt: 1.5,
|
|
92
|
+
pb: .5
|
|
101
93
|
},
|
|
102
|
-
children:
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
},
|
|
94
|
+
children: /* @__PURE__ */ y(ee, {
|
|
95
|
+
className: e.searchField,
|
|
96
|
+
size: "small",
|
|
97
|
+
placeholder: B.searchFieldPlaceholder,
|
|
98
|
+
value: q,
|
|
99
|
+
onChange: (e) => J(e.target.value),
|
|
100
|
+
slotProps: {
|
|
101
|
+
input: { startAdornment: /* @__PURE__ */ y(g, {
|
|
102
|
+
position: "start",
|
|
103
|
+
children: /* @__PURE__ */ y(m, {
|
|
104
|
+
fontSize: "small",
|
|
105
|
+
sx: { color: "text.disabled" }
|
|
106
|
+
})
|
|
107
|
+
}) },
|
|
108
|
+
htmlInput: { "aria-label": B.searchFieldPlaceholder }
|
|
109
|
+
},
|
|
110
|
+
sx: { width: 280 }
|
|
118
111
|
})
|
|
119
|
-
}),
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ b(a, {
|
|
114
|
+
sensors: Y,
|
|
115
|
+
collisionDetection: l,
|
|
116
|
+
onDragStart: X,
|
|
117
|
+
onDragOver: Z,
|
|
118
|
+
onDragEnd: Q,
|
|
119
|
+
children: [/* @__PURE__ */ y(h, {
|
|
120
|
+
className: e.columns,
|
|
121
|
+
sx: {
|
|
122
|
+
flex: 1,
|
|
123
|
+
display: "flex",
|
|
124
|
+
gap: 2,
|
|
125
|
+
p: 2,
|
|
126
|
+
overflowX: "auto",
|
|
127
|
+
overflowY: "hidden",
|
|
128
|
+
alignItems: "stretch"
|
|
129
|
+
},
|
|
130
|
+
children: S.map((e) => {
|
|
131
|
+
let t = V.filter((t) => t.status === e.id);
|
|
132
|
+
return /* @__PURE__ */ y(i, {
|
|
133
|
+
column: e,
|
|
134
|
+
tasks: t.filter(oe),
|
|
135
|
+
totalCount: t.length,
|
|
136
|
+
showPriority: A,
|
|
137
|
+
showAssignee: j,
|
|
138
|
+
showDueDate: M,
|
|
139
|
+
showDueDateWarning: N,
|
|
140
|
+
chipVariant: P,
|
|
141
|
+
t: B,
|
|
142
|
+
enableBuiltinDialogs: T,
|
|
143
|
+
onCardClick: te,
|
|
144
|
+
onAddClick: ne
|
|
145
|
+
}, e.id);
|
|
146
|
+
})
|
|
147
|
+
}), /* @__PURE__ */ y(o, { children: U && /* @__PURE__ */ y(n, {
|
|
148
|
+
task: U,
|
|
149
|
+
showPriority: A,
|
|
150
|
+
showAssignee: j,
|
|
151
|
+
showDueDate: M,
|
|
152
|
+
showDueDateWarning: N,
|
|
153
|
+
chipVariant: P,
|
|
154
|
+
t: B,
|
|
155
|
+
onCardClick: () => {},
|
|
156
|
+
isOverlay: !0
|
|
157
|
+
}) })]
|
|
158
|
+
}),
|
|
159
|
+
T && /* @__PURE__ */ y(r, {
|
|
160
|
+
state: G,
|
|
161
|
+
columns: S,
|
|
162
|
+
t: B,
|
|
163
|
+
onSave: re,
|
|
164
|
+
onDelete: ie,
|
|
165
|
+
onRequestDelete: ae,
|
|
166
|
+
onClose: () => K(null)
|
|
167
|
+
}, G ? `${G.mode}-${G.mode === "add" ? G.columnId : G.task.id}` : "closed")
|
|
168
|
+
]
|
|
139
169
|
});
|
|
140
170
|
}
|
|
141
171
|
//#endregion
|
|
142
|
-
export {
|
|
172
|
+
export { x as KanbanBoard };
|
|
@@ -37,6 +37,8 @@ export type KanbanBoardTranslation = {
|
|
|
37
37
|
dialogFieldDueDate: string;
|
|
38
38
|
dialogFieldStatus: string;
|
|
39
39
|
noCardsLabel: string;
|
|
40
|
+
/** Placeholder text for the built-in search field (`showSearchField={true}`). */
|
|
41
|
+
searchFieldPlaceholder: string;
|
|
40
42
|
};
|
|
41
43
|
export declare const DEFAULT_KANBAN_BOARD_TRANSLATION: Required<KanbanBoardTranslation>;
|
|
42
44
|
export type KanbanBoardProps = {
|
|
@@ -92,12 +94,23 @@ export type KanbanBoardProps = {
|
|
|
92
94
|
* `"filled"` — solid background, more prominent.
|
|
93
95
|
*/
|
|
94
96
|
chipVariant?: "outlined" | "filled";
|
|
97
|
+
/**
|
|
98
|
+
* When `true`, renders a built-in `size="small"` search field above the board columns.
|
|
99
|
+
* The board manages the search state internally — no extra wiring needed.
|
|
100
|
+
* Customize the placeholder via `translation.searchFieldPlaceholder`.
|
|
101
|
+
*
|
|
102
|
+
* For full control over placement, styling, or debouncing, leave this `false` (default)
|
|
103
|
+
* and pass `filterText` instead.
|
|
104
|
+
*/
|
|
105
|
+
showSearchField?: boolean;
|
|
95
106
|
/**
|
|
96
107
|
* Filters visible cards by title and assignee (case-insensitive substring match).
|
|
97
108
|
* The consumer is responsible for rendering the search input and passing the string.
|
|
98
109
|
* An empty string or `undefined` shows all cards.
|
|
99
110
|
* Column counters reflect the filtered count; WIP-limit checks always use the
|
|
100
111
|
* unfiltered column total so the over-limit warning is never hidden by a filter.
|
|
112
|
+
*
|
|
113
|
+
* Alternative: set `showSearchField={true}` to let the board render a built-in field.
|
|
101
114
|
*/
|
|
102
115
|
filterText?: string;
|
|
103
116
|
/** Width of the board. Default: "100%". */
|
|
@@ -13,7 +13,8 @@ var e = {
|
|
|
13
13
|
dialogFieldAssignee: "Assignee",
|
|
14
14
|
dialogFieldDueDate: "Due date",
|
|
15
15
|
dialogFieldStatus: "Status",
|
|
16
|
-
noCardsLabel: "No cards"
|
|
16
|
+
noCardsLabel: "No cards",
|
|
17
|
+
searchFieldPlaceholder: "Search by title or assignee…"
|
|
17
18
|
};
|
|
18
19
|
//#endregion
|
|
19
20
|
export { e as DEFAULT_KANBAN_BOARD_TRANSLATION };
|
|
@@ -46,4 +46,8 @@ export declare const kanbanBoardClasses: {
|
|
|
46
46
|
readonly cardPriorityDot: "MuiTsKanbanBoard-cardPriorityDot";
|
|
47
47
|
/** The "+ Add card" button at the bottom of each column. */
|
|
48
48
|
readonly addButton: "MuiTsKanbanBoard-addButton";
|
|
49
|
+
/** The wrapper Box around the built-in search field (`showSearchField={true}`). */
|
|
50
|
+
readonly searchFieldWrapper: "MuiTsKanbanBoard-searchFieldWrapper";
|
|
51
|
+
/** The built-in search TextField (`showSearchField={true}`). */
|
|
52
|
+
readonly searchField: "MuiTsKanbanBoard-searchField";
|
|
49
53
|
};
|
|
@@ -13,7 +13,9 @@ var e = {
|
|
|
13
13
|
cardAssignee: "MuiTsKanbanBoard-cardAssignee",
|
|
14
14
|
cardDueDate: "MuiTsKanbanBoard-cardDueDate",
|
|
15
15
|
cardPriorityDot: "MuiTsKanbanBoard-cardPriorityDot",
|
|
16
|
-
addButton: "MuiTsKanbanBoard-addButton"
|
|
16
|
+
addButton: "MuiTsKanbanBoard-addButton",
|
|
17
|
+
searchFieldWrapper: "MuiTsKanbanBoard-searchFieldWrapper",
|
|
18
|
+
searchField: "MuiTsKanbanBoard-searchField"
|
|
17
19
|
};
|
|
18
20
|
//#endregion
|
|
19
21
|
export { e as kanbanBoardClasses };
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { EMOJI_CATEGORIES as e } from "./util/emojis.js";
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import u from "
|
|
2
|
+
import t from "@mui/icons-material/Search";
|
|
3
|
+
import { Box as n, InputAdornment as r, Popover as i, TextField as a, Typography as o } from "@mui/material";
|
|
4
|
+
import { useMemo as s, useState as c } from "react";
|
|
5
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
6
6
|
//#region src/components/rich-text-editor/RichTextEditorEmojiPicker.tsx
|
|
7
7
|
function d({ anchorEl: d, open: f, onClose: p, onSelect: m, translation: h }) {
|
|
8
|
-
let [g, _] =
|
|
8
|
+
let [g, _] = c(""), v = s(() => {
|
|
9
9
|
let t = g.trim().toLowerCase();
|
|
10
10
|
return t ? e.map((e) => ({
|
|
11
11
|
...e,
|
|
@@ -18,7 +18,7 @@ function d({ anchorEl: d, open: f, onClose: p, onSelect: m, translation: h }) {
|
|
|
18
18
|
function b() {
|
|
19
19
|
p(), _("");
|
|
20
20
|
}
|
|
21
|
-
return /* @__PURE__ */
|
|
21
|
+
return /* @__PURE__ */ u(i, {
|
|
22
22
|
open: f,
|
|
23
23
|
anchorEl: d,
|
|
24
24
|
onClose: b,
|
|
@@ -36,32 +36,32 @@ function d({ anchorEl: d, open: f, onClose: p, onSelect: m, translation: h }) {
|
|
|
36
36
|
display: "flex",
|
|
37
37
|
flexDirection: "column"
|
|
38
38
|
} } },
|
|
39
|
-
children: [/* @__PURE__ */
|
|
39
|
+
children: [/* @__PURE__ */ l(n, {
|
|
40
40
|
sx: {
|
|
41
41
|
p: 1,
|
|
42
42
|
borderBottom: 1,
|
|
43
43
|
borderColor: "divider"
|
|
44
44
|
},
|
|
45
|
-
children: /* @__PURE__ */
|
|
45
|
+
children: /* @__PURE__ */ l(a, {
|
|
46
46
|
autoFocus: !0,
|
|
47
47
|
fullWidth: !0,
|
|
48
48
|
size: "small",
|
|
49
49
|
placeholder: h.emojiSearchPlaceholder,
|
|
50
50
|
value: g,
|
|
51
51
|
onChange: (e) => _(e.target.value),
|
|
52
|
-
slotProps: { input: { startAdornment: /* @__PURE__ */
|
|
52
|
+
slotProps: { input: { startAdornment: /* @__PURE__ */ l(r, {
|
|
53
53
|
position: "start",
|
|
54
|
-
children: /* @__PURE__ */
|
|
54
|
+
children: /* @__PURE__ */ l(t, { fontSize: "small" })
|
|
55
55
|
}) } }
|
|
56
56
|
})
|
|
57
|
-
}), /* @__PURE__ */
|
|
57
|
+
}), /* @__PURE__ */ u(n, {
|
|
58
58
|
sx: {
|
|
59
59
|
overflowY: "auto",
|
|
60
60
|
flex: 1,
|
|
61
61
|
px: 1,
|
|
62
62
|
pb: 1
|
|
63
63
|
},
|
|
64
|
-
children: [v.map((e) => /* @__PURE__ */
|
|
64
|
+
children: [v.map((e) => /* @__PURE__ */ u(n, { children: [/* @__PURE__ */ l(o, {
|
|
65
65
|
variant: "caption",
|
|
66
66
|
sx: {
|
|
67
67
|
display: "block",
|
|
@@ -71,13 +71,13 @@ function d({ anchorEl: d, open: f, onClose: p, onSelect: m, translation: h }) {
|
|
|
71
71
|
px: .5
|
|
72
72
|
},
|
|
73
73
|
children: e.label
|
|
74
|
-
}), /* @__PURE__ */
|
|
74
|
+
}), /* @__PURE__ */ l(n, {
|
|
75
75
|
sx: {
|
|
76
76
|
display: "flex",
|
|
77
77
|
flexWrap: "wrap",
|
|
78
78
|
gap: .25
|
|
79
79
|
},
|
|
80
|
-
children: e.emojis.map((e) => /* @__PURE__ */
|
|
80
|
+
children: e.emojis.map((e) => /* @__PURE__ */ l(n, {
|
|
81
81
|
component: "button",
|
|
82
82
|
title: e.name,
|
|
83
83
|
"aria-label": e.name,
|
|
@@ -94,7 +94,7 @@ function d({ anchorEl: d, open: f, onClose: p, onSelect: m, translation: h }) {
|
|
|
94
94
|
},
|
|
95
95
|
children: e.emoji
|
|
96
96
|
}, e.emoji))
|
|
97
|
-
})] }, e.label)), v.length === 0 && /* @__PURE__ */
|
|
97
|
+
})] }, e.label)), v.length === 0 && /* @__PURE__ */ l(o, {
|
|
98
98
|
variant: "body2",
|
|
99
99
|
color: "text.secondary",
|
|
100
100
|
sx: {
|