@myrjfa/ui 1.1.0 → 1.1.2
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/dist/chat/ChatMain.d.ts +3 -1
- package/dist/chat/ChatMain.d.ts.map +1 -1
- package/dist/chat/ChatMain.js +174 -145
- package/dist/chat/ChatSidebar.js +7 -8
- package/dist/chat/ConversationList.d.ts.map +1 -1
- package/dist/chat/ConversationList.js +20 -18
- package/dist/chat/ExpensePanel.d.ts +4 -1
- package/dist/chat/ExpensePanel.d.ts.map +1 -1
- package/dist/chat/ExpensePanel.js +215 -195
- package/dist/chat/MessageBubble.d.ts +5 -3
- package/dist/chat/MessageBubble.d.ts.map +1 -1
- package/dist/chat/MessageBubble.js +185 -103
- package/dist/chat/MessageInput.d.ts +8 -1
- package/dist/chat/MessageInput.d.ts.map +1 -1
- package/dist/chat/MessageInput.js +182 -165
- package/dist/chat/MilestonePanel.d.ts +4 -1
- package/dist/chat/MilestonePanel.d.ts.map +1 -1
- package/dist/chat/MilestonePanel.js +150 -150
- package/dist/chat/components/ParticipantSelector.d.ts +11 -0
- package/dist/chat/components/ParticipantSelector.d.ts.map +1 -0
- package/dist/chat/components/ParticipantSelector.js +17 -0
- package/dist/chat/components/SplitInputs.d.ts +11 -0
- package/dist/chat/components/SplitInputs.d.ts.map +1 -0
- package/dist/chat/components/SplitInputs.js +83 -0
- package/dist/chat/components/SplitTypeSelector.d.ts +8 -0
- package/dist/chat/components/SplitTypeSelector.d.ts.map +1 -0
- package/dist/chat/components/SplitTypeSelector.js +13 -0
- package/dist/chat/dialogs/AddMemberDialog.js +30 -90
- package/dist/chat/dialogs/CameraDialog.js +38 -86
- package/dist/chat/dialogs/CreatePollDialog.d.ts +8 -0
- package/dist/chat/dialogs/CreatePollDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/CreatePollDialog.js +38 -0
- package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts +19 -0
- package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/ExpenseAnalyticsDialog.js +52 -0
- package/dist/chat/dialogs/GroupInfoDialog.d.ts.map +1 -1
- package/dist/chat/dialogs/GroupInfoDialog.js +55 -92
- package/dist/chat/dialogs/GroupInfoViewDialog.js +5 -6
- package/dist/chat/dialogs/NewChatDialog.d.ts.map +1 -1
- package/dist/chat/dialogs/NewChatDialog.js +49 -113
- package/dist/chat/dialogs/NewGroupDialog.d.ts.map +1 -1
- package/dist/chat/dialogs/NewGroupDialog.js +49 -92
- package/dist/chat/dialogs/ParticipantsDialog.d.ts.map +1 -1
- package/dist/chat/dialogs/ParticipantsDialog.js +68 -118
- package/dist/dashboard/action-buttons.js +4 -5
- package/dist/dashboard/app-sidebar.js +47 -129
- package/dist/dashboard/card-header.js +1 -2
- package/dist/dashboard/dashboard-components.js +3 -5
- package/dist/dashboard/data-table.d.ts +2 -1
- package/dist/dashboard/data-table.d.ts.map +1 -1
- package/dist/dashboard/data-table.js +21 -33
- package/dist/dashboard/nav-main.js +4 -5
- package/dist/dashboard/nav-secondary.js +2 -25
- package/dist/dashboard/stats-card.js +1 -2
- package/dist/dashboard/table.js +8 -54
- package/dist/header/mobile-nav-item.js +1 -2
- package/dist/header/mobile-navbar.js +8 -9
- package/dist/header/nav-item.js +1 -2
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/main/footer.js +5 -9
- package/dist/main/navbar.js +55 -138
- package/dist/main/paginationBar.js +12 -14
- package/dist/main/portfolio/portfolioItem.js +1 -2
- package/dist/main/portfolio/portfolioPopup.js +16 -17
- package/dist/main/review-page.d.ts.map +1 -1
- package/dist/main/review-page.js +132 -199
- package/dist/misc/accordion.js +8 -34
- package/dist/misc/alert-dialog.js +22 -55
- package/dist/misc/alert.js +7 -32
- package/dist/misc/alertdialogclaude.js +50 -125
- package/dist/misc/avatar.js +6 -31
- package/dist/misc/badge.js +4 -27
- package/dist/misc/button.js +4 -27
- package/dist/misc/card.js +12 -40
- package/dist/misc/carousel.js +37 -61
- package/dist/misc/checkbox.js +2 -25
- package/dist/misc/command.js +18 -49
- package/dist/misc/datepicker.js +66 -76
- package/dist/misc/dialog.js +20 -52
- package/dist/misc/document-upload-button.d.ts +12 -0
- package/dist/misc/document-upload-button.d.ts.map +1 -0
- package/dist/misc/document-upload-button.js +27 -0
- package/dist/misc/dropdown-menu.js +30 -67
- package/dist/misc/empty-state.d.ts +10 -0
- package/dist/misc/empty-state.d.ts.map +1 -0
- package/dist/misc/empty-state.js +5 -0
- package/dist/misc/faq.js +2 -3
- package/dist/misc/file-preview.js +43 -97
- package/dist/misc/filter.d.ts.map +1 -1
- package/dist/misc/filter.js +18 -21
- package/dist/misc/filterBar.js +136 -160
- package/dist/misc/form.js +39 -60
- package/dist/misc/image-compressor.d.ts +29 -0
- package/dist/misc/image-compressor.d.ts.map +1 -0
- package/dist/misc/image-compressor.js +70 -0
- package/dist/misc/image-cropper.d.ts +10 -0
- package/dist/misc/image-cropper.d.ts.map +1 -0
- package/dist/misc/image-cropper.js +44 -0
- package/dist/misc/input.d.ts.map +1 -1
- package/dist/misc/input.js +2 -25
- package/dist/misc/label.js +2 -25
- package/dist/misc/line-carousel.js +3 -13
- package/dist/misc/multiImageUploader.d.ts +2 -1
- package/dist/misc/multiImageUploader.d.ts.map +1 -1
- package/dist/misc/multiImageUploader.js +26 -3
- package/dist/misc/newsLetter.js +19 -79
- package/dist/misc/notification.d.ts +1 -2
- package/dist/misc/notification.d.ts.map +1 -1
- package/dist/misc/notification.js +89 -125
- package/dist/misc/pagination.js +16 -45
- package/dist/misc/password-eye.js +2 -3
- package/dist/misc/popover.d.ts.map +1 -1
- package/dist/misc/popover.js +8 -34
- package/dist/misc/progress.js +2 -25
- package/dist/misc/pwa-install-button.d.ts +9 -0
- package/dist/misc/pwa-install-button.d.ts.map +1 -0
- package/dist/misc/pwa-install-button.js +158 -0
- package/dist/misc/scroll-area.js +5 -29
- package/dist/misc/searchBar.js +27 -31
- package/dist/misc/searchBox.js +18 -22
- package/dist/misc/select.d.ts.map +1 -1
- package/dist/misc/select.js +22 -54
- package/dist/misc/separator.js +2 -25
- package/dist/misc/share.js +48 -104
- package/dist/misc/sheet.js +21 -53
- package/dist/misc/sidebar.js +112 -153
- package/dist/misc/skeleton.d.ts +36 -1
- package/dist/misc/skeleton.d.ts.map +1 -1
- package/dist/misc/skeleton.js +41 -27
- package/dist/misc/slider.js +3 -26
- package/dist/misc/starRating.js +5 -15
- package/dist/misc/stateCard.js +7 -8
- package/dist/misc/switch.d.ts +5 -0
- package/dist/misc/switch.d.ts.map +1 -0
- package/dist/misc/switch.js +8 -0
- package/dist/misc/tabs.js +8 -34
- package/dist/misc/textarea.js +2 -25
- package/dist/misc/tile.js +32 -93
- package/dist/misc/tooltip.js +8 -34
- package/dist/misc/whatsapp-help.d.ts +9 -0
- package/dist/misc/whatsapp-help.d.ts.map +1 -0
- package/dist/misc/whatsapp-help.js +13 -0
- package/dist/profile/socialLink.d.ts +1 -1
- package/dist/profile/socialLink.d.ts.map +1 -1
- package/dist/profile/socialLink.js +53 -69
- package/dist/utils/permissions.d.ts +7 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +38 -0
- package/package.json +6 -4
- package/dist/main/portfolio/temp-page.d.ts +0 -2
- package/dist/main/portfolio/temp-page.d.ts.map +0 -1
- package/dist/main/portfolio/temp-page.js +0 -102
package/dist/misc/filterBar.js
CHANGED
|
@@ -1,24 +1,4 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
14
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
15
|
-
if (ar || !(i in from)) {
|
|
16
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
17
|
-
ar[i] = from[i];
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
21
|
-
};
|
|
22
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
23
3
|
import { retrieveCity, retrieveState } from "@myrjfa/state/dist/lib/utils";
|
|
24
4
|
import { Search, SearchIcon, SlidersHorizontal, X } from "lucide-react";
|
|
@@ -29,20 +9,19 @@ import Filter from "./filter";
|
|
|
29
9
|
import { Sheet, SheetContent, SheetTitle, SheetTrigger } from "./sheet";
|
|
30
10
|
import { Slider } from "./slider";
|
|
31
11
|
// Default filter options (backward compatible)
|
|
32
|
-
|
|
12
|
+
const defaultFilterOptions = [
|
|
33
13
|
{ label: "destination", type: "autoComplete", datatype: "string[]", displayName: "Destination", deriveFromTiles: 'location', visibility: 'bar' },
|
|
34
14
|
{ label: "skill", type: "autoComplete", datatype: "string[]", displayName: "Skills", deriveFromTiles: 'skills', visibility: 'bar' },
|
|
35
15
|
{ label: "rating", type: "select", datatype: "number", displayName: "Rating", visibility: 'expanded' },
|
|
36
16
|
];
|
|
37
|
-
function FilterBarComponent(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
var router = useRouter();
|
|
17
|
+
function FilterBarComponent({ tiles, filterConfig = defaultFilterOptions }) {
|
|
18
|
+
const searchParams = useSearchParams();
|
|
19
|
+
const pathname = usePathname();
|
|
20
|
+
const router = useRouter();
|
|
42
21
|
// Initialize filter state from config
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
filterConfig.forEach(
|
|
22
|
+
const getInitialFilterState = () => {
|
|
23
|
+
const state = {};
|
|
24
|
+
filterConfig.forEach(opt => {
|
|
46
25
|
if (opt.datatype === 'string[]') {
|
|
47
26
|
state[opt.label] = opt.defaultValue || [];
|
|
48
27
|
}
|
|
@@ -58,11 +37,11 @@ function FilterBarComponent(_a) {
|
|
|
58
37
|
});
|
|
59
38
|
return state;
|
|
60
39
|
};
|
|
61
|
-
|
|
62
|
-
useEffect(
|
|
63
|
-
|
|
64
|
-
filterConfig.forEach(
|
|
65
|
-
|
|
40
|
+
const [filterParam, setFilterParam] = useState(getInitialFilterState);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
const newState = {};
|
|
43
|
+
filterConfig.forEach(opt => {
|
|
44
|
+
const param = searchParams.get(opt.label);
|
|
66
45
|
if (opt.datatype === 'string[]') {
|
|
67
46
|
newState[opt.label] = (param === null || param === void 0 ? void 0 : param.split(',').filter(Boolean)) || opt.defaultValue || [];
|
|
68
47
|
}
|
|
@@ -70,9 +49,9 @@ function FilterBarComponent(_a) {
|
|
|
70
49
|
newState[opt.label] = parseInt(param || "0", 10) || opt.defaultValue || 0;
|
|
71
50
|
}
|
|
72
51
|
else if (opt.datatype === 'range') {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
52
|
+
const minParam = searchParams.get(`${opt.label}Min`);
|
|
53
|
+
const maxParam = searchParams.get(`${opt.label}Max`);
|
|
54
|
+
const defaultRange = opt.defaultValue || { min: 0, max: 100 };
|
|
76
55
|
newState[opt.label] = {
|
|
77
56
|
min: minParam ? parseInt(minParam, 10) : defaultRange.min,
|
|
78
57
|
max: maxParam ? parseInt(maxParam, 10) : defaultRange.max
|
|
@@ -84,22 +63,21 @@ function FilterBarComponent(_a) {
|
|
|
84
63
|
});
|
|
85
64
|
setFilterParam(newState);
|
|
86
65
|
}, [searchParams, filterConfig]);
|
|
87
|
-
|
|
88
|
-
|
|
66
|
+
const changeMultiParams = (params) => {
|
|
67
|
+
const newParams = new URLSearchParams(searchParams);
|
|
89
68
|
newParams.set('page', '1');
|
|
90
|
-
Object.entries(params).forEach(
|
|
91
|
-
var key = _a[0], value = _a[1];
|
|
69
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
92
70
|
if (typeof value === 'object' && 'min' in value && 'max' in value) {
|
|
93
71
|
// Range type - only set if different from default
|
|
94
|
-
|
|
95
|
-
|
|
72
|
+
const config = filterConfig.find(f => f.label === key);
|
|
73
|
+
const defaultRange = (config === null || config === void 0 ? void 0 : config.defaultValue) || { min: 0, max: 100 };
|
|
96
74
|
if (value.min !== defaultRange.min || value.max !== defaultRange.max) {
|
|
97
|
-
newParams.set(
|
|
98
|
-
newParams.set(
|
|
75
|
+
newParams.set(`${key}Min`, value.min.toString());
|
|
76
|
+
newParams.set(`${key}Max`, value.max.toString());
|
|
99
77
|
}
|
|
100
78
|
else {
|
|
101
|
-
newParams.delete(
|
|
102
|
-
newParams.delete(
|
|
79
|
+
newParams.delete(`${key}Min`);
|
|
80
|
+
newParams.delete(`${key}Max`);
|
|
103
81
|
}
|
|
104
82
|
}
|
|
105
83
|
else if (Array.isArray(value) && value.length > 0) {
|
|
@@ -110,132 +88,129 @@ function FilterBarComponent(_a) {
|
|
|
110
88
|
}
|
|
111
89
|
else {
|
|
112
90
|
newParams.delete(key);
|
|
113
|
-
newParams.delete(
|
|
114
|
-
newParams.delete(
|
|
91
|
+
newParams.delete(`${key}Min`);
|
|
92
|
+
newParams.delete(`${key}Max`);
|
|
115
93
|
}
|
|
116
94
|
});
|
|
117
|
-
router.replace(
|
|
95
|
+
router.replace(`${pathname}?${newParams.toString()}`);
|
|
118
96
|
};
|
|
119
97
|
// Get filter values based on config
|
|
120
|
-
|
|
98
|
+
const getFilterValues = (opt) => {
|
|
121
99
|
if (opt.deriveFromTiles === 'opportunityType' && opt.options) {
|
|
122
100
|
// For opportunityType, dynamically filter options based on what types exist in tiles
|
|
123
|
-
|
|
101
|
+
const availableTypes = new Set((tiles !== null && tiles !== void 0 ? tiles : []).map(tile => tile.opportunityType || 'volunteer'));
|
|
124
102
|
return opt.options
|
|
125
|
-
.filter(
|
|
126
|
-
.map(
|
|
103
|
+
.filter(o => availableTypes.has(o.value))
|
|
104
|
+
.map(o => o.label);
|
|
127
105
|
}
|
|
128
106
|
if (opt.options) {
|
|
129
|
-
return opt.options.map(
|
|
107
|
+
return opt.options.map(o => o.label);
|
|
130
108
|
}
|
|
131
109
|
if (opt.deriveFromTiles === 'location') {
|
|
132
|
-
return Array.from(new Set((tiles !== null && tiles !== void 0 ? tiles : []).map(
|
|
110
|
+
return Array.from(new Set((tiles !== null && tiles !== void 0 ? tiles : []).map(tile => [retrieveState((tile === null || tile === void 0 ? void 0 : tile.location) || ''), retrieveCity((tile === null || tile === void 0 ? void 0 : tile.location) || '')]).flat().filter(Boolean)));
|
|
133
111
|
}
|
|
134
112
|
if (opt.deriveFromTiles === 'skills') {
|
|
135
|
-
return Array.from(new Set((tiles !== null && tiles !== void 0 ? tiles : []).flatMap(
|
|
113
|
+
return Array.from(new Set((tiles !== null && tiles !== void 0 ? tiles : []).flatMap(tile => tile.skills || [])));
|
|
136
114
|
}
|
|
137
115
|
if (opt.label === 'rating') {
|
|
138
116
|
return ["1 star and above", "2 star and above", "3 star and above", "4 star and above", "5 star only"];
|
|
139
117
|
}
|
|
140
|
-
return tiles.map(
|
|
118
|
+
return tiles.map(tile => tile[`${opt.deriveFromTiles}`]);
|
|
141
119
|
};
|
|
142
|
-
|
|
120
|
+
const handleFilterChange = (label, value, datatype, options) => {
|
|
143
121
|
if (value === null || value === "clear") {
|
|
144
|
-
|
|
145
|
-
setFilterParam(
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
});
|
|
122
|
+
const config = filterConfig.find(f => f.label === label);
|
|
123
|
+
setFilterParam(prev => ({
|
|
124
|
+
...prev,
|
|
125
|
+
[label]: datatype.includes('[]') ? [] : (datatype === 'number' ? 0 : ((config === null || config === void 0 ? void 0 : config.defaultValue) || ''))
|
|
126
|
+
}));
|
|
149
127
|
return;
|
|
150
128
|
}
|
|
151
129
|
// For select with options, convert label to value
|
|
152
|
-
|
|
130
|
+
let actualValue = value;
|
|
153
131
|
if (options) {
|
|
154
|
-
|
|
132
|
+
const opt = options.find(o => o.label === value);
|
|
155
133
|
if (opt)
|
|
156
134
|
actualValue = opt.value;
|
|
157
135
|
}
|
|
158
|
-
setFilterParam(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
var newValue = datatype === 'number' ? Number(value[0]) : actualValue;
|
|
136
|
+
setFilterParam(prev => {
|
|
137
|
+
const currentValues = prev[label];
|
|
138
|
+
const newValue = datatype === 'number' ? Number(value[0]) : actualValue;
|
|
162
139
|
if (currentValues == newValue || (Array.isArray(currentValues) && currentValues.includes(newValue))) {
|
|
163
140
|
return prev;
|
|
164
141
|
}
|
|
165
142
|
else if (Array.isArray(currentValues)) {
|
|
166
|
-
return
|
|
143
|
+
return { ...prev, [label]: [...currentValues, newValue] };
|
|
167
144
|
}
|
|
168
145
|
else {
|
|
169
|
-
return
|
|
146
|
+
return { ...prev, [label]: newValue };
|
|
170
147
|
}
|
|
171
148
|
});
|
|
172
149
|
};
|
|
173
|
-
|
|
174
|
-
setFilterParam(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
150
|
+
const handleRangeChange = (label, field, value) => {
|
|
151
|
+
setFilterParam(prev => {
|
|
152
|
+
const current = prev[label];
|
|
153
|
+
return {
|
|
154
|
+
...prev,
|
|
155
|
+
[label]: { ...current, [field]: value }
|
|
156
|
+
};
|
|
178
157
|
});
|
|
179
158
|
};
|
|
180
|
-
|
|
181
|
-
|
|
159
|
+
const removeFilter = (label, value) => {
|
|
160
|
+
const config = filterConfig.find(f => f.label === label);
|
|
182
161
|
if ((config === null || config === void 0 ? void 0 : config.datatype) === 'range') {
|
|
183
162
|
// Reset range to default
|
|
184
|
-
|
|
185
|
-
setFilterParam(
|
|
186
|
-
var _a;
|
|
187
|
-
return (__assign(__assign({}, prev), (_a = {}, _a[label] = defaultRange_1, _a)));
|
|
188
|
-
});
|
|
163
|
+
const defaultRange = config.defaultValue || { min: 0, max: 100 };
|
|
164
|
+
setFilterParam(prev => ({ ...prev, [label]: defaultRange }));
|
|
189
165
|
}
|
|
190
166
|
else {
|
|
191
|
-
setFilterParam(
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
? prev[label].filter(
|
|
195
|
-
: prev[label] === value ? 0 : ((config === null || config === void 0 ? void 0 : config.defaultValue) || '')
|
|
196
|
-
});
|
|
167
|
+
setFilterParam(prev => ({
|
|
168
|
+
...prev,
|
|
169
|
+
[label]: Array.isArray(prev[label])
|
|
170
|
+
? prev[label].filter(v => v !== value)
|
|
171
|
+
: prev[label] === value ? 0 : ((config === null || config === void 0 ? void 0 : config.defaultValue) || '')
|
|
172
|
+
}));
|
|
197
173
|
}
|
|
198
174
|
};
|
|
199
|
-
|
|
175
|
+
const [sheetOpen, setSheetOpen] = useState(false);
|
|
200
176
|
// Get current opportunity type for conditional filters
|
|
201
|
-
|
|
177
|
+
const currentType = filterParam['type'] || 'volunteer';
|
|
202
178
|
// Filter configs based on showForTypes
|
|
203
|
-
|
|
204
|
-
return configs.filter(
|
|
179
|
+
const getVisibleConfigs = (configs) => {
|
|
180
|
+
return configs.filter(opt => {
|
|
205
181
|
if (!opt.showForTypes || opt.showForTypes.length === 0)
|
|
206
182
|
return true;
|
|
207
183
|
return opt.showForTypes.includes(currentType);
|
|
208
184
|
});
|
|
209
185
|
};
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
Object.entries(filterParam).forEach(
|
|
213
|
-
|
|
214
|
-
var opt = filterConfig.find(function (o) { return o.label === key; });
|
|
186
|
+
const getActiveFilters = () => {
|
|
187
|
+
const filters = [];
|
|
188
|
+
Object.entries(filterParam).forEach(([key, values]) => {
|
|
189
|
+
const opt = filterConfig.find(o => o.label === key);
|
|
215
190
|
if (!opt)
|
|
216
191
|
return;
|
|
217
192
|
if (typeof values === 'object' && 'min' in values && 'max' in values) {
|
|
218
193
|
// Range filter
|
|
219
|
-
|
|
194
|
+
const defaultRange = opt.defaultValue || { min: 0, max: 100 };
|
|
220
195
|
if (values.min !== defaultRange.min || values.max !== defaultRange.max) {
|
|
221
196
|
filters.push({
|
|
222
197
|
label: key,
|
|
223
|
-
value:
|
|
198
|
+
value: `${values.min}-${values.max} ${opt.rangeUnit || ''}`,
|
|
224
199
|
displayName: opt.displayName,
|
|
225
200
|
isRange: true
|
|
226
201
|
});
|
|
227
202
|
}
|
|
228
203
|
}
|
|
229
204
|
else if (Array.isArray(values) && values.length > 0) {
|
|
230
|
-
values.forEach(
|
|
231
|
-
filters.push({ label: key, value
|
|
205
|
+
values.forEach(value => {
|
|
206
|
+
filters.push({ label: key, value, displayName: opt.displayName });
|
|
232
207
|
});
|
|
233
208
|
}
|
|
234
209
|
else if (!Array.isArray(values) && values !== 0 && values !== '' && values !== opt.defaultValue) {
|
|
235
210
|
// For select with options, show label not value
|
|
236
|
-
|
|
211
|
+
let displayValue = values;
|
|
237
212
|
if (opt.options) {
|
|
238
|
-
|
|
213
|
+
const found = opt.options.find(o => o.value === values);
|
|
239
214
|
if (found)
|
|
240
215
|
displayValue = found.label;
|
|
241
216
|
}
|
|
@@ -244,110 +219,111 @@ function FilterBarComponent(_a) {
|
|
|
244
219
|
});
|
|
245
220
|
return filters;
|
|
246
221
|
};
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
222
|
+
const activeFilters = getActiveFilters();
|
|
223
|
+
const clearAllFilters = () => {
|
|
224
|
+
const clearedParams = getInitialFilterState();
|
|
250
225
|
setFilterParam(clearedParams);
|
|
251
226
|
changeMultiParams(clearedParams);
|
|
252
227
|
setSheetOpen(false);
|
|
253
228
|
};
|
|
254
|
-
|
|
229
|
+
const renderFilterInput = (opt) => {
|
|
255
230
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
256
231
|
if (opt.type === 'range') {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
232
|
+
const rangeValue = filterParam[opt.label];
|
|
233
|
+
const defaultRange = opt.defaultValue || { min: 0, max: 100 };
|
|
234
|
+
const minVal = (_a = opt.rangeMin) !== null && _a !== void 0 ? _a : defaultRange.min;
|
|
235
|
+
const maxVal = (_b = opt.rangeMax) !== null && _b !== void 0 ? _b : defaultRange.max;
|
|
236
|
+
const step = (_c = opt.rangeStep) !== null && _c !== void 0 ? _c : 1;
|
|
262
237
|
// Number inputs mode
|
|
263
238
|
if (opt.rangeInputType === 'number') {
|
|
264
239
|
// Inline style to hide number input spinners
|
|
265
|
-
|
|
240
|
+
const noSpinnerStyle = {
|
|
266
241
|
MozAppearance: 'textfield',
|
|
267
242
|
WebkitAppearance: 'none',
|
|
268
243
|
appearance: 'textfield'
|
|
269
244
|
};
|
|
270
|
-
return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "number", placeholder: "Min", value: (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) === undefined || (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) === null || Number.isNaN(rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) ? '' : rangeValue.min, min:
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
setFilterParam(
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
});
|
|
277
|
-
}, onWheel:
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
setFilterParam(
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
});
|
|
284
|
-
}, onWheel:
|
|
245
|
+
return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "number", placeholder: "Min", value: (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) === undefined || (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) === null || Number.isNaN(rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) ? '' : rangeValue.min, min: minVal, max: maxVal, onChange: (e) => {
|
|
246
|
+
const inputVal = e.target.value;
|
|
247
|
+
const val = inputVal === '' ? NaN : parseInt(inputVal);
|
|
248
|
+
setFilterParam(prev => ({
|
|
249
|
+
...prev,
|
|
250
|
+
[opt.label]: { ...prev[opt.label], min: val }
|
|
251
|
+
}));
|
|
252
|
+
}, onWheel: (e) => e.currentTarget.blur(), style: noSpinnerStyle, className: "w-20 px-2 py-1 border rounded text-sm [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" }), _jsx("span", { className: "text-gray-500", children: "to" }), _jsx("input", { type: "number", placeholder: "Max", value: (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) === undefined || (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) === null || Number.isNaN(rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) ? '' : rangeValue.max, min: minVal, max: maxVal, onChange: (e) => {
|
|
253
|
+
const inputVal = e.target.value;
|
|
254
|
+
const val = inputVal === '' ? NaN : parseInt(inputVal);
|
|
255
|
+
setFilterParam(prev => ({
|
|
256
|
+
...prev,
|
|
257
|
+
[opt.label]: { ...prev[opt.label], max: val }
|
|
258
|
+
}));
|
|
259
|
+
}, onWheel: (e) => e.currentTarget.blur(), style: noSpinnerStyle, className: "w-20 px-2 py-1 border rounded text-sm [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" }), opt.rangeUnit && _jsx("span", { className: "text-sm text-gray-500", children: opt.rangeUnit })] }));
|
|
285
260
|
}
|
|
286
261
|
// Slider mode (default)
|
|
287
|
-
return (_jsxs("div", { className: "flex flex-col gap-2 w-full", children: [_jsxs("div", { className: "flex justify-between text-sm text-gray-600", children: [_jsxs("span", { children: [(_d = rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) !== null && _d !== void 0 ? _d :
|
|
288
|
-
setFilterParam(
|
|
289
|
-
var _a;
|
|
290
|
-
|
|
291
|
-
|
|
262
|
+
return (_jsxs("div", { className: "flex flex-col gap-2 w-full", children: [_jsxs("div", { className: "flex justify-between text-sm text-gray-600", children: [_jsxs("span", { children: [(_d = rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) !== null && _d !== void 0 ? _d : minVal, " ", opt.rangeUnit] }), _jsxs("span", { children: [(_e = rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) !== null && _e !== void 0 ? _e : maxVal, " ", opt.rangeUnit] })] }), _jsx(Slider, { min: minVal, max: maxVal, step: step, value: [(_f = rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) !== null && _f !== void 0 ? _f : minVal, (_g = rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) !== null && _g !== void 0 ? _g : maxVal], onValueChange: (values) => {
|
|
263
|
+
setFilterParam(prev => {
|
|
264
|
+
var _a, _b;
|
|
265
|
+
return ({
|
|
266
|
+
...prev,
|
|
267
|
+
[opt.label]: { min: (_a = values[0]) !== null && _a !== void 0 ? _a : minVal, max: (_b = values[1]) !== null && _b !== void 0 ? _b : maxVal }
|
|
268
|
+
});
|
|
292
269
|
});
|
|
293
270
|
}, className: "w-full" })] }));
|
|
294
271
|
}
|
|
295
|
-
|
|
296
|
-
|
|
272
|
+
const selectedValue = (() => {
|
|
273
|
+
const val = filterParam[opt.label];
|
|
297
274
|
if (opt.datatype.includes('[]')) {
|
|
298
|
-
|
|
299
|
-
return arr.length > 0 ?
|
|
275
|
+
const arr = val;
|
|
276
|
+
return arr.length > 0 ? `${arr.length} selected` : '';
|
|
300
277
|
}
|
|
301
278
|
if (opt.datatype === 'number') {
|
|
302
|
-
return val ?
|
|
279
|
+
return val ? `${val} star or more` : '';
|
|
303
280
|
}
|
|
304
281
|
// For select type, show label not value
|
|
305
282
|
if (opt.options && val) {
|
|
306
|
-
|
|
283
|
+
const found = opt.options.find(o => o.value === val);
|
|
307
284
|
return (found === null || found === void 0 ? void 0 : found.label) || val.toString();
|
|
308
285
|
}
|
|
309
286
|
return (val === null || val === void 0 ? void 0 : val.toString()) || '';
|
|
310
287
|
})();
|
|
311
|
-
return (_jsx(Filter, { label: opt.label, formType: opt.type === 'select' ? 'select' : 'autoComplete', selectedValue: selectedValue, values: getFilterValues(opt), onChange:
|
|
288
|
+
return (_jsx(Filter, { label: opt.label, formType: opt.type === 'select' ? 'select' : 'autoComplete', selectedValue: selectedValue, values: getFilterValues(opt), onChange: (value) => handleFilterChange(opt.label, value, opt.datatype, opt.options) }));
|
|
312
289
|
};
|
|
313
290
|
// Separate bar filters from expanded filters
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
return (_jsxs("div", { className: "w-4/5 max-w-5xl mx-auto", children: [_jsxs("div", { className: "items-center w-full bg-background shadow-md rounded-full px-4 py-3 md:py-2 flex", children: [barFilters.slice(0, 3).map(
|
|
318
|
-
.filter(
|
|
319
|
-
.map(
|
|
291
|
+
const visibleConfigs = getVisibleConfigs(filterConfig);
|
|
292
|
+
const barFilters = visibleConfigs.filter(f => f.visibility !== 'expanded');
|
|
293
|
+
const expandedFilters = visibleConfigs.filter(f => f.visibility === 'expanded');
|
|
294
|
+
return (_jsxs("div", { className: "w-4/5 max-w-5xl mx-auto", children: [_jsxs("div", { className: "items-center w-full bg-background shadow-md rounded-full px-4 py-3 md:py-2 flex", children: [barFilters.slice(0, 3).map((opt) => (_jsxs("div", { className: "items-center flex-1 hidden md:flex", children: [_jsx("div", { className: "w-full", children: renderFilterInput(opt) }), _jsx("div", { className: "h-6 w-px bg-gray-300 mx-4 md:h-8" })] }, opt.label))), _jsxs(Sheet, { open: sheetOpen, onOpenChange: setSheetOpen, children: [_jsx(SheetTrigger, { asChild: true, children: _jsxs("button", { className: "flex items-center gap-2 text-sm text-gray-600 cursor-pointer m-auto relative", children: [_jsx(SlidersHorizontal, { size: 16, className: "hidden md:block" }), _jsx(SearchIcon, { size: 16, className: "md:hidden" }), _jsx("div", { className: "md:hidden", children: "Start search..." }), expandedFilters.length > 0 && (_jsxs("span", { className: "hidden md:block", children: ["+", expandedFilters.length, " more"] }))] }) }), _jsxs(SheetContent, { side: "top", className: "w-full p-8 z-200 md:items-center overflow-y-auto max-h-[80vh]", children: [_jsx(SheetTitle, { className: "text-lg font-semibold mb-4", children: "Filters" }), _jsx("div", { className: "space-y-6 md:w-3/5", children: visibleConfigs
|
|
295
|
+
.filter(opt => !opt.groupWith) // Only render non-grouped or group leaders
|
|
296
|
+
.map((opt) => {
|
|
320
297
|
// Check if this filter has a grouped partner
|
|
321
|
-
|
|
298
|
+
const groupedFilter = visibleConfigs.find(f => f.groupWith === opt.label);
|
|
322
299
|
if (groupedFilter) {
|
|
323
300
|
// Render grouped filters on same line
|
|
324
301
|
return (_jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "text-sm font-medium text-gray-700", children: [groupedFilter.displayName, " & ", opt.displayName] }), _jsxs("div", { className: "bg-gray-50 rounded-lg p-3 flex items-center gap-4", children: [_jsx("div", { className: "w-28", children: renderFilterInput(groupedFilter) }), _jsx("div", { className: "flex-1", children: renderFilterInput(opt) })] })] }, opt.label));
|
|
325
302
|
}
|
|
326
303
|
// Regular filter
|
|
327
304
|
return (_jsxs("div", { className: "space-y-2", children: [_jsx("label", { className: "text-sm font-medium text-gray-700", children: opt.displayName }), _jsx("div", { className: "bg-gray-50 rounded-lg p-3", children: renderFilterInput(opt) })] }, opt.label));
|
|
328
|
-
}) }), _jsxs("div", { className: "flex gap-3 mt-6 pt-4 border-t md:w-3/5", children: [_jsx(Button, { variant: "outline", onClick: clearAllFilters, className: "flex-1", children: "Clear All" }), _jsx(Button, { onClick:
|
|
305
|
+
}) }), _jsxs("div", { className: "flex gap-3 mt-6 pt-4 border-t md:w-3/5", children: [_jsx(Button, { variant: "outline", onClick: clearAllFilters, className: "flex-1", children: "Clear All" }), _jsx(Button, { onClick: () => {
|
|
329
306
|
changeMultiParams(filterParam);
|
|
330
307
|
setSheetOpen(false);
|
|
331
|
-
}, className: "flex-1", children: "Apply Filters" })] })] })] }), _jsx(Button, { variant: "default", onClick:
|
|
332
|
-
?
|
|
333
|
-
: filter.value }), _jsx("button", { onClick:
|
|
308
|
+
}, className: "flex-1", children: "Apply Filters" })] })] })] }), _jsx(Button, { variant: "default", onClick: () => changeMultiParams(filterParam), className: "ml-4 w-12 h-12 rounded-full items-center justify-center hidden md:flex cursor-pointer", children: _jsx(Search, { size: 20 }) })] }), activeFilters.length > 0 && (_jsx("div", { className: "max-w-5xl mx-auto mt-4", children: _jsxs("div", { className: "flex flex-wrap gap-2", children: [activeFilters.map((filter, index) => (_jsxs("div", { className: "inline-flex items-center gap-1 bg-blue-100 text-blue-800 px-3 py-1 rounded-full text-sm border border-blue-200", children: [_jsxs("span", { className: "font-medium", children: [filter.displayName, ":"] }), _jsx("span", { children: typeof filter.value === 'number' && !filter.isRange
|
|
309
|
+
? `${filter.value} star or more`
|
|
310
|
+
: filter.value }), _jsx("button", { onClick: () => {
|
|
334
311
|
removeFilter(filter.label, filter.value);
|
|
335
|
-
|
|
312
|
+
const newState = { ...filterParam };
|
|
336
313
|
if (filter.isRange) {
|
|
337
|
-
|
|
314
|
+
const config = filterConfig.find(f => f.label === filter.label);
|
|
338
315
|
newState[filter.label] = (config === null || config === void 0 ? void 0 : config.defaultValue) || { min: 0, max: 100 };
|
|
339
316
|
}
|
|
340
317
|
else if (Array.isArray(filterParam[filter.label])) {
|
|
341
|
-
newState[filter.label] = filterParam[filter.label].filter(
|
|
318
|
+
newState[filter.label] = filterParam[filter.label].filter(v => v !== filter.value);
|
|
342
319
|
}
|
|
343
320
|
else {
|
|
344
|
-
|
|
321
|
+
const config = filterConfig.find(f => f.label === filter.label);
|
|
345
322
|
newState[filter.label] = (config === null || config === void 0 ? void 0 : config.defaultValue) || 0;
|
|
346
323
|
}
|
|
347
324
|
changeMultiParams(newState);
|
|
348
|
-
}, className: "ml-1 hover:bg-blue-200 rounded-full p-1 transition-colors", children: _jsx(X, { size: 12 }) })] },
|
|
325
|
+
}, className: "ml-1 hover:bg-blue-200 rounded-full p-1 transition-colors", children: _jsx(X, { size: 12 }) })] }, `${filter.label}-${filter.value}-${index}`))), _jsxs("button", { onClick: clearAllFilters, className: "inline-flex items-center gap-1 bg-gray-100 text-gray-600 px-3 py-1 rounded-full text-sm border border-gray-200 hover:bg-gray-200 transition-colors", children: ["Clear All", _jsx(X, { size: 12 })] })] }) }))] }));
|
|
349
326
|
}
|
|
350
|
-
export default function FilterBar(
|
|
351
|
-
var tiles = _a.tiles, filterConfig = _a.filterConfig;
|
|
327
|
+
export default function FilterBar({ tiles, filterConfig }) {
|
|
352
328
|
return (_jsx(Suspense, { fallback: _jsx("div", { className: "w-full h-screen flex items-center justify-center", children: "Loading..." }), children: _jsx(FilterBarComponent, { tiles: tiles, filterConfig: filterConfig }) }));
|
|
353
329
|
}
|
package/dist/misc/form.js
CHANGED
|
@@ -1,81 +1,60 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
14
|
-
var t = {};
|
|
15
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
16
|
-
t[p] = s[p];
|
|
17
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
18
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
19
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
20
|
-
t[p[i]] = s[p[i]];
|
|
21
|
-
}
|
|
22
|
-
return t;
|
|
23
|
-
};
|
|
24
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
25
3
|
import { Slot } from "@radix-ui/react-slot";
|
|
26
4
|
import { cn } from "@myrjfa/state/dist/lib/utils";
|
|
27
5
|
import * as React from "react";
|
|
28
6
|
import { Controller, FormProvider, useFormContext, useFormState, } from "react-hook-form";
|
|
29
7
|
import { Label } from "./label";
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return (_jsx(FormFieldContext.Provider, { value: { name: props.name }, children: _jsx(Controller, __assign({}, props)) }));
|
|
8
|
+
const Form = FormProvider;
|
|
9
|
+
const FormFieldContext = React.createContext({});
|
|
10
|
+
const FormField = ({ ...props }) => {
|
|
11
|
+
return (_jsx(FormFieldContext.Provider, { value: { name: props.name }, children: _jsx(Controller, { ...props }) }));
|
|
35
12
|
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
13
|
+
const useFormField = () => {
|
|
14
|
+
const fieldContext = React.useContext(FormFieldContext);
|
|
15
|
+
const itemContext = React.useContext(FormItemContext);
|
|
16
|
+
const { getFieldState } = useFormContext();
|
|
17
|
+
const formState = useFormState({ name: fieldContext.name });
|
|
18
|
+
const fieldState = getFieldState(fieldContext.name, formState);
|
|
42
19
|
if (!fieldContext) {
|
|
43
20
|
throw new Error("useFormField should be used within <FormField>");
|
|
44
21
|
}
|
|
45
|
-
|
|
46
|
-
return
|
|
22
|
+
const { id } = itemContext;
|
|
23
|
+
return {
|
|
24
|
+
id,
|
|
25
|
+
name: fieldContext.name,
|
|
26
|
+
formItemId: `${id}-form-item`,
|
|
27
|
+
formDescriptionId: `${id}-form-item-description`,
|
|
28
|
+
formMessageId: `${id}-form-item-message`,
|
|
29
|
+
...fieldState,
|
|
30
|
+
};
|
|
47
31
|
};
|
|
48
|
-
|
|
49
|
-
function FormItem(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return (_jsx(FormItemContext.Provider, { value: { id: id }, children: _jsx("div", __assign({ "data-slot": "form-item", className: cn("grid gap-2", className) }, props)) }));
|
|
32
|
+
const FormItemContext = React.createContext({});
|
|
33
|
+
function FormItem({ className, ...props }) {
|
|
34
|
+
const id = React.useId();
|
|
35
|
+
return (_jsx(FormItemContext.Provider, { value: { id }, children: _jsx("div", { "data-slot": "form-item", className: cn("grid gap-2", className), ...props }) }));
|
|
53
36
|
}
|
|
54
|
-
function FormLabel(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return (_jsx(Label, __assign({ "data-slot": "form-label", "data-error": !!error, className: cn("data-[error=true]:text-destructive-foreground", className), htmlFor: formItemId }, props)));
|
|
37
|
+
function FormLabel({ className, ...props }) {
|
|
38
|
+
const { error, formItemId } = useFormField();
|
|
39
|
+
return (_jsx(Label, { "data-slot": "form-label", "data-error": !!error, className: cn("data-[error=true]:text-destructive-foreground", className), htmlFor: formItemId, ...props }));
|
|
58
40
|
}
|
|
59
|
-
function FormControl(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
: "".concat(formDescriptionId, " ").concat(formMessageId), "aria-invalid": !!error }, props)));
|
|
41
|
+
function FormControl({ ...props }) {
|
|
42
|
+
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
|
|
43
|
+
return (_jsx(Slot, { "data-slot": "form-control", id: formItemId, "aria-describedby": !error
|
|
44
|
+
? `${formDescriptionId}`
|
|
45
|
+
: `${formDescriptionId} ${formMessageId}`, "aria-invalid": !!error, ...props }));
|
|
65
46
|
}
|
|
66
|
-
function FormDescription(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return (_jsx("p", __assign({ "data-slot": "form-description", id: formDescriptionId, className: cn("text-muted-foreground text-sm", className) }, props)));
|
|
47
|
+
function FormDescription({ className, ...props }) {
|
|
48
|
+
const { formDescriptionId } = useFormField();
|
|
49
|
+
return (_jsx("p", { "data-slot": "form-description", id: formDescriptionId, className: cn("text-muted-foreground text-sm", className), ...props }));
|
|
70
50
|
}
|
|
71
|
-
function FormMessage(
|
|
72
|
-
var
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
var body = error ? String((_b = error === null || error === void 0 ? void 0 : error.message) !== null && _b !== void 0 ? _b : "") : props.children;
|
|
51
|
+
function FormMessage({ className, ...props }) {
|
|
52
|
+
var _a;
|
|
53
|
+
const { error, formMessageId } = useFormField();
|
|
54
|
+
const body = error ? String((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : "") : props.children;
|
|
76
55
|
if (!body) {
|
|
77
56
|
return null;
|
|
78
57
|
}
|
|
79
|
-
return (_jsx("p",
|
|
58
|
+
return (_jsx("p", { "data-slot": "form-message", id: formMessageId, className: cn("text-destructive-foreground text-sm", className), ...props, children: body }));
|
|
80
59
|
}
|
|
81
60
|
export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField, };
|