@beweco/aurora-ui 0.6.60-qa.70 → 0.6.60-qa.77
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/index.cjs.js +49 -6
- package/dist/index.esm.js +49 -6
- package/dist/types/components/menu/Menu.d.ts.map +1 -1
- package/dist/types/components/menu/get-user-initials.d.ts +15 -0
- package/dist/types/components/menu/get-user-initials.d.ts.map +1 -0
- package/dist/types/components/tags-filter/TagsFilter.d.ts.map +1 -1
- package/dist/types/components/tags-filter/TagsFilter.types.d.ts +6 -0
- package/dist/types/components/tags-filter/TagsFilter.types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -3332,6 +3332,32 @@ function getSelectedKeyFromPath(pathname, items) {
|
|
|
3332
3332
|
return undefined;
|
|
3333
3333
|
}
|
|
3334
3334
|
|
|
3335
|
+
/**
|
|
3336
|
+
* Deriva las iniciales para el avatar del usuario a partir de su nombre completo.
|
|
3337
|
+
*
|
|
3338
|
+
* Muestra la inicial del nombre + la inicial del primer apellido (2 letras en
|
|
3339
|
+
* mayúsculas), p. ej. "Roser Ruiz" -> "RR". Si el usuario solo tiene un token
|
|
3340
|
+
* (nombre sin apellido) devuelve una sola inicial. Si no hay texto, devuelve "".
|
|
3341
|
+
*
|
|
3342
|
+
* TECH-1727: reemplaza el comportamiento por defecto de HeroUI (`safeText`), que
|
|
3343
|
+
* muestra las 3 primeras letras del nombre ("Roser Ruiz" -> "Ros").
|
|
3344
|
+
*
|
|
3345
|
+
* @param fullName Nombre completo del usuario (se usa el mismo valor que el label).
|
|
3346
|
+
* @returns Iniciales en mayúsculas (0, 1 o 2 letras).
|
|
3347
|
+
*/
|
|
3348
|
+
var getUserInitials = function (fullName) {
|
|
3349
|
+
var tokens = fullName.trim().split(/\s+/).filter(Boolean);
|
|
3350
|
+
if (tokens.length === 0) {
|
|
3351
|
+
return "";
|
|
3352
|
+
}
|
|
3353
|
+
var firstInitial = tokens[0].charAt(0).toUpperCase();
|
|
3354
|
+
if (tokens.length === 1) {
|
|
3355
|
+
return firstInitial;
|
|
3356
|
+
}
|
|
3357
|
+
var secondInitial = tokens[1].charAt(0).toUpperCase();
|
|
3358
|
+
return "".concat(firstInitial).concat(secondInitial);
|
|
3359
|
+
};
|
|
3360
|
+
|
|
3335
3361
|
exports.EnumMenuNavListItem = void 0;
|
|
3336
3362
|
(function (EnumMenuNavListItem) {
|
|
3337
3363
|
EnumMenuNavListItem["Nest"] = "nest";
|
|
@@ -3686,7 +3712,10 @@ var MenuComponent = React.memo(function Menu(_a) {
|
|
|
3686
3712
|
flexDirection: isCollapsed ? "column-reverse" : "row",
|
|
3687
3713
|
}, children: [jsxRuntime.jsxs("div", { className: "flex flex-row items-center justify-center ".concat(isCollapsed ? "gap-0" : "gap-2"), children: [jsxRuntime.jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-foreground text-background", children: hasValidLogo ? (jsxRuntime.jsx("img", { src: commerceInfo.logo, alt: "".concat(t.logoAlt, " ").concat(commerceName), className: "h-full w-full object-cover", onError: function () { return setLogoError(true); } })) : (jsxRuntime.jsx(IconComponent, { icon: "solar:buildings-2-outline", size: "sm", className: "shrink-0", "aria-hidden": true })) }), jsxRuntime.jsx("span", { className: "collapsible-item text-small font-bold truncate min-w-0", children: commerceName })] }), jsxRuntime.jsxs("div", { className: "flex items-center", children: [jsxRuntime.jsx(IconComponent, { icon: "material-symbols-light:close", size: "lg", className: "cursor-pointer block sm:hidden", onClick: handleSidebarClose }), jsxRuntime.jsx(IconComponent, { icon: isCollapsed
|
|
3688
3714
|
? "solar:alt-arrow-right-outline"
|
|
3689
|
-
: "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsxRuntime.jsx(react.Spacer, { y: 6 }), jsxRuntime.jsxs("div", { className: "content__menu--user ".concat(isCollapsed ? "gap-0" : "gap-3"), children: [jsxRuntime.jsx(react.Avatar, { size: "md", src: ((_b = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, color: !((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _c === void 0 ? void 0 : _c.trim()) ? "warning" : "default", name: userName,
|
|
3715
|
+
: "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsxRuntime.jsx(react.Spacer, { y: 6 }), jsxRuntime.jsxs("div", { className: "content__menu--user ".concat(isCollapsed ? "gap-0" : "gap-3"), children: [jsxRuntime.jsx(react.Avatar, { size: "md", src: ((_b = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, color: !((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _c === void 0 ? void 0 : _c.trim()) ? "warning" : "default", name: userName,
|
|
3716
|
+
// TECH-1727: inicial de nombre + inicial de primer apellido
|
|
3717
|
+
// (p. ej. "Roser Ruiz" -> "RR") en vez de las 3 primeras letras.
|
|
3718
|
+
getInitials: getUserInitials, className: "shrink-0" }), jsxRuntime.jsxs("div", { className: "collapsible-item flex min-w-0 flex-col overflow-hidden", children: [jsxRuntime.jsx("p", { className: "text-small font-medium text-default-900 truncate", children: userName }), jsxRuntime.jsx("p", { className: "text-tiny text-default-400 truncate", children: userRole })] })] }), jsxRuntime.jsxs("div", { className: "".concat(!isCollapsed ? "flex-1" : "h-full", " min-h-0 py-6 relative"), children: [!isCollapsed && showScrollArrows && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [scrollState.canScrollUp && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "menu-scroll-fade menu-scroll-fade--up", "aria-hidden": "true" }), jsxRuntime.jsx("button", { type: "button", "aria-label": t.scrollUpAriaLabel, className: "menu-scroll-chevron menu-scroll-chevron--up", onClick: handleScrollUp, children: jsxRuntime.jsx(IconComponent, { icon: "solar:alt-arrow-up-outline", size: "md", "aria-hidden": true }) })] })), scrollState.canScrollDown && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "menu-scroll-fade menu-scroll-fade--down", "aria-hidden": "true" }), jsxRuntime.jsx("button", { type: "button", "aria-label": t.scrollDownAriaLabel, className: "menu-scroll-chevron menu-scroll-chevron--down", onClick: handleScrollDown, children: jsxRuntime.jsx(IconComponent, { icon: "solar:alt-arrow-down-outline", size: "md", "aria-hidden": true }) })] }))] })), jsxRuntime.jsx("div", { ref: scrollContainerRef, className: "h-full overflow-y-auto pr-6 -mr-6 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none] select-none ".concat(isDraggingScroll ? "cursor-grabbing" : ""), onMouseDown: handleScrollAreaMouseDown, children: jsxRuntime.jsx(MenuNavList, { defaultSelectedKey: selectedKey, items: menuItems.items, isCollapsed: isCollapsed, onSelect: handleMenuSelect }, selectedKey) })] }), helpSection ? (jsxRuntime.jsx("div", { className: "mt-auto flex flex-col justify-center items-center", children: jsxRuntime.jsx(react.Button, { fullWidth: true, className: " text-default-500 data-[hover=true]:text-default-600", startContent: jsxRuntime.jsx(IconComponent, { className: "text-default-500", icon: "solar:info-circle-line-duotone", size: "md" }), variant: "light", onPress: handleHelpClick, isIconOnly: isCollapsed, children: !isCollapsed && (jsxRuntime.jsx("span", { className: "collapsible-item truncate", children: helpSection.title })) }) })) : null] }) })] }));
|
|
3690
3719
|
});
|
|
3691
3720
|
|
|
3692
3721
|
var StepIndicator = function (_a) {
|
|
@@ -8151,11 +8180,13 @@ var SegmentationBuilder = React.forwardRef(function (_a, ref) {
|
|
|
8151
8180
|
SegmentationBuilder.displayName = "SegmentationBuilder";
|
|
8152
8181
|
|
|
8153
8182
|
var SENTINEL_KEY = "__tags-filter-sentinel__";
|
|
8183
|
+
var EMPTY_KEY = "__tags-filter-empty__";
|
|
8154
8184
|
var DEFAULT_TRANSLATIONS = {
|
|
8155
8185
|
placeholder: "Nombre de la etiqueta",
|
|
8156
8186
|
labelSelect: "Selecciona etiqueta",
|
|
8157
8187
|
labelSelected: "Etiquetas actuales",
|
|
8158
8188
|
emptySelectedMessage: "No hay etiquetas seleccionadas",
|
|
8189
|
+
emptyAvailableMessage: "No hay etiquetas disponibles",
|
|
8159
8190
|
errorLoadingPrefix: "Error al cargar etiquetas",
|
|
8160
8191
|
loadingMoreLabel: "Cargando más etiquetas…",
|
|
8161
8192
|
endOfListMessage: "",
|
|
@@ -8223,8 +8254,14 @@ function TagsFilter(_a) {
|
|
|
8223
8254
|
}, [items, inputValue, compareTags, onInputChange]);
|
|
8224
8255
|
var filteredItems = getFilteredAvailable(selectedList);
|
|
8225
8256
|
var showSentinel = Boolean(onLoadMore) && (hasMore || Boolean(t.endOfListMessage));
|
|
8226
|
-
|
|
8227
|
-
|
|
8257
|
+
// Sin nada que ofrecer se inyecta un item de solo lectura con el mensaje de
|
|
8258
|
+
// vacío: así el desplegable explica por qué está vacío en vez de no abrirse
|
|
8259
|
+
// (o abrirse en blanco), y la colección nunca queda realmente vacía.
|
|
8260
|
+
var isAvailableEmpty = filteredItems.length === 0;
|
|
8261
|
+
var itemsWithSentinel = isAvailableEmpty
|
|
8262
|
+
? [{ id: EMPTY_KEY, value: "" }]
|
|
8263
|
+
: showSentinel
|
|
8264
|
+
? __spreadArray(__spreadArray([], filteredItems, true), [{ id: SENTINEL_KEY, value: "" }], false) : filteredItems;
|
|
8228
8265
|
var handleAutocompleteSelection = React.useCallback(function (key) {
|
|
8229
8266
|
if (key == null) {
|
|
8230
8267
|
return;
|
|
@@ -8243,9 +8280,12 @@ function TagsFilter(_a) {
|
|
|
8243
8280
|
setInputValue(v);
|
|
8244
8281
|
onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(v);
|
|
8245
8282
|
}, selectedKey: null, items: itemsWithSentinel, onSelectionChange: handleAutocompleteSelection,
|
|
8246
|
-
//
|
|
8247
|
-
|
|
8248
|
-
//
|
|
8283
|
+
// TECH-1640: el desplegable abre al enfocar/hacer clic, no solo al
|
|
8284
|
+
// escribir. Un selector de etiquetas debe enseñar lo que hay sin
|
|
8285
|
+
// exigir que el usuario recuerde el nombre.
|
|
8286
|
+
menuTrigger: "focus",
|
|
8287
|
+
// La colección nunca llega vacía (ver `itemsWithSentinel`): cuando no
|
|
8288
|
+
// hay nada que ofrecer se inyecta el item con el mensaje de vacío.
|
|
8249
8289
|
allowsEmptyCollection: false, shouldCloseOnBlur: true, popoverProps: {
|
|
8250
8290
|
// isNonModal: false would render a full-screen invisible backdrop that
|
|
8251
8291
|
// intercepts pointer events, blocking the parent modal's close button.
|
|
@@ -8256,6 +8296,9 @@ function TagsFilter(_a) {
|
|
|
8256
8296
|
className: "max-h-[200px] overflow-y-auto",
|
|
8257
8297
|
}, className: "w-full", children: function (item) {
|
|
8258
8298
|
var candidate = item;
|
|
8299
|
+
if (candidate.id === EMPTY_KEY) {
|
|
8300
|
+
return (jsxRuntime.jsx(react.AutocompleteItem, { textValue: t.emptyAvailableMessage, isReadOnly: true, className: "opacity-100 cursor-default data-[hover=true]:bg-transparent", children: jsxRuntime.jsx("span", { className: "text-tiny text-default-500", children: t.emptyAvailableMessage }) }, EMPTY_KEY));
|
|
8301
|
+
}
|
|
8259
8302
|
if (candidate.id === SENTINEL_KEY) {
|
|
8260
8303
|
return (jsxRuntime.jsx(react.AutocompleteItem, { textValue: "", isReadOnly: true, className: "opacity-100 cursor-default data-[hover=true]:bg-transparent", children: jsxRuntime.jsx("div", { ref: function (node) {
|
|
8261
8304
|
var _a;
|
package/dist/index.esm.js
CHANGED
|
@@ -3333,6 +3333,32 @@ function getSelectedKeyFromPath(pathname, items) {
|
|
|
3333
3333
|
return undefined;
|
|
3334
3334
|
}
|
|
3335
3335
|
|
|
3336
|
+
/**
|
|
3337
|
+
* Deriva las iniciales para el avatar del usuario a partir de su nombre completo.
|
|
3338
|
+
*
|
|
3339
|
+
* Muestra la inicial del nombre + la inicial del primer apellido (2 letras en
|
|
3340
|
+
* mayúsculas), p. ej. "Roser Ruiz" -> "RR". Si el usuario solo tiene un token
|
|
3341
|
+
* (nombre sin apellido) devuelve una sola inicial. Si no hay texto, devuelve "".
|
|
3342
|
+
*
|
|
3343
|
+
* TECH-1727: reemplaza el comportamiento por defecto de HeroUI (`safeText`), que
|
|
3344
|
+
* muestra las 3 primeras letras del nombre ("Roser Ruiz" -> "Ros").
|
|
3345
|
+
*
|
|
3346
|
+
* @param fullName Nombre completo del usuario (se usa el mismo valor que el label).
|
|
3347
|
+
* @returns Iniciales en mayúsculas (0, 1 o 2 letras).
|
|
3348
|
+
*/
|
|
3349
|
+
var getUserInitials = function (fullName) {
|
|
3350
|
+
var tokens = fullName.trim().split(/\s+/).filter(Boolean);
|
|
3351
|
+
if (tokens.length === 0) {
|
|
3352
|
+
return "";
|
|
3353
|
+
}
|
|
3354
|
+
var firstInitial = tokens[0].charAt(0).toUpperCase();
|
|
3355
|
+
if (tokens.length === 1) {
|
|
3356
|
+
return firstInitial;
|
|
3357
|
+
}
|
|
3358
|
+
var secondInitial = tokens[1].charAt(0).toUpperCase();
|
|
3359
|
+
return "".concat(firstInitial).concat(secondInitial);
|
|
3360
|
+
};
|
|
3361
|
+
|
|
3336
3362
|
var EnumMenuNavListItem;
|
|
3337
3363
|
(function (EnumMenuNavListItem) {
|
|
3338
3364
|
EnumMenuNavListItem["Nest"] = "nest";
|
|
@@ -3687,7 +3713,10 @@ var MenuComponent = React.memo(function Menu(_a) {
|
|
|
3687
3713
|
flexDirection: isCollapsed ? "column-reverse" : "row",
|
|
3688
3714
|
}, children: [jsxs("div", { className: "flex flex-row items-center justify-center ".concat(isCollapsed ? "gap-0" : "gap-2"), children: [jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-foreground text-background", children: hasValidLogo ? (jsx("img", { src: commerceInfo.logo, alt: "".concat(t.logoAlt, " ").concat(commerceName), className: "h-full w-full object-cover", onError: function () { return setLogoError(true); } })) : (jsx(IconComponent, { icon: "solar:buildings-2-outline", size: "sm", className: "shrink-0", "aria-hidden": true })) }), jsx("span", { className: "collapsible-item text-small font-bold truncate min-w-0", children: commerceName })] }), jsxs("div", { className: "flex items-center", children: [jsx(IconComponent, { icon: "material-symbols-light:close", size: "lg", className: "cursor-pointer block sm:hidden", onClick: handleSidebarClose }), jsx(IconComponent, { icon: isCollapsed
|
|
3689
3715
|
? "solar:alt-arrow-right-outline"
|
|
3690
|
-
: "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsx(Spacer, { y: 6 }), jsxs("div", { className: "content__menu--user ".concat(isCollapsed ? "gap-0" : "gap-3"), children: [jsx(Avatar, { size: "md", src: ((_b = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, color: !((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _c === void 0 ? void 0 : _c.trim()) ? "warning" : "default", name: userName,
|
|
3716
|
+
: "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsx(Spacer, { y: 6 }), jsxs("div", { className: "content__menu--user ".concat(isCollapsed ? "gap-0" : "gap-3"), children: [jsx(Avatar, { size: "md", src: ((_b = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, color: !((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _c === void 0 ? void 0 : _c.trim()) ? "warning" : "default", name: userName,
|
|
3717
|
+
// TECH-1727: inicial de nombre + inicial de primer apellido
|
|
3718
|
+
// (p. ej. "Roser Ruiz" -> "RR") en vez de las 3 primeras letras.
|
|
3719
|
+
getInitials: getUserInitials, className: "shrink-0" }), jsxs("div", { className: "collapsible-item flex min-w-0 flex-col overflow-hidden", children: [jsx("p", { className: "text-small font-medium text-default-900 truncate", children: userName }), jsx("p", { className: "text-tiny text-default-400 truncate", children: userRole })] })] }), jsxs("div", { className: "".concat(!isCollapsed ? "flex-1" : "h-full", " min-h-0 py-6 relative"), children: [!isCollapsed && showScrollArrows && (jsxs(Fragment, { children: [scrollState.canScrollUp && (jsxs(Fragment, { children: [jsx("div", { className: "menu-scroll-fade menu-scroll-fade--up", "aria-hidden": "true" }), jsx("button", { type: "button", "aria-label": t.scrollUpAriaLabel, className: "menu-scroll-chevron menu-scroll-chevron--up", onClick: handleScrollUp, children: jsx(IconComponent, { icon: "solar:alt-arrow-up-outline", size: "md", "aria-hidden": true }) })] })), scrollState.canScrollDown && (jsxs(Fragment, { children: [jsx("div", { className: "menu-scroll-fade menu-scroll-fade--down", "aria-hidden": "true" }), jsx("button", { type: "button", "aria-label": t.scrollDownAriaLabel, className: "menu-scroll-chevron menu-scroll-chevron--down", onClick: handleScrollDown, children: jsx(IconComponent, { icon: "solar:alt-arrow-down-outline", size: "md", "aria-hidden": true }) })] }))] })), jsx("div", { ref: scrollContainerRef, className: "h-full overflow-y-auto pr-6 -mr-6 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none] select-none ".concat(isDraggingScroll ? "cursor-grabbing" : ""), onMouseDown: handleScrollAreaMouseDown, children: jsx(MenuNavList, { defaultSelectedKey: selectedKey, items: menuItems.items, isCollapsed: isCollapsed, onSelect: handleMenuSelect }, selectedKey) })] }), helpSection ? (jsx("div", { className: "mt-auto flex flex-col justify-center items-center", children: jsx(Button$1, { fullWidth: true, className: " text-default-500 data-[hover=true]:text-default-600", startContent: jsx(IconComponent, { className: "text-default-500", icon: "solar:info-circle-line-duotone", size: "md" }), variant: "light", onPress: handleHelpClick, isIconOnly: isCollapsed, children: !isCollapsed && (jsx("span", { className: "collapsible-item truncate", children: helpSection.title })) }) })) : null] }) })] }));
|
|
3691
3720
|
});
|
|
3692
3721
|
|
|
3693
3722
|
var StepIndicator = function (_a) {
|
|
@@ -8152,11 +8181,13 @@ var SegmentationBuilder = forwardRef(function (_a, ref) {
|
|
|
8152
8181
|
SegmentationBuilder.displayName = "SegmentationBuilder";
|
|
8153
8182
|
|
|
8154
8183
|
var SENTINEL_KEY = "__tags-filter-sentinel__";
|
|
8184
|
+
var EMPTY_KEY = "__tags-filter-empty__";
|
|
8155
8185
|
var DEFAULT_TRANSLATIONS = {
|
|
8156
8186
|
placeholder: "Nombre de la etiqueta",
|
|
8157
8187
|
labelSelect: "Selecciona etiqueta",
|
|
8158
8188
|
labelSelected: "Etiquetas actuales",
|
|
8159
8189
|
emptySelectedMessage: "No hay etiquetas seleccionadas",
|
|
8190
|
+
emptyAvailableMessage: "No hay etiquetas disponibles",
|
|
8160
8191
|
errorLoadingPrefix: "Error al cargar etiquetas",
|
|
8161
8192
|
loadingMoreLabel: "Cargando más etiquetas…",
|
|
8162
8193
|
endOfListMessage: "",
|
|
@@ -8224,8 +8255,14 @@ function TagsFilter(_a) {
|
|
|
8224
8255
|
}, [items, inputValue, compareTags, onInputChange]);
|
|
8225
8256
|
var filteredItems = getFilteredAvailable(selectedList);
|
|
8226
8257
|
var showSentinel = Boolean(onLoadMore) && (hasMore || Boolean(t.endOfListMessage));
|
|
8227
|
-
|
|
8228
|
-
|
|
8258
|
+
// Sin nada que ofrecer se inyecta un item de solo lectura con el mensaje de
|
|
8259
|
+
// vacío: así el desplegable explica por qué está vacío en vez de no abrirse
|
|
8260
|
+
// (o abrirse en blanco), y la colección nunca queda realmente vacía.
|
|
8261
|
+
var isAvailableEmpty = filteredItems.length === 0;
|
|
8262
|
+
var itemsWithSentinel = isAvailableEmpty
|
|
8263
|
+
? [{ id: EMPTY_KEY, value: "" }]
|
|
8264
|
+
: showSentinel
|
|
8265
|
+
? __spreadArray(__spreadArray([], filteredItems, true), [{ id: SENTINEL_KEY, value: "" }], false) : filteredItems;
|
|
8229
8266
|
var handleAutocompleteSelection = useCallback(function (key) {
|
|
8230
8267
|
if (key == null) {
|
|
8231
8268
|
return;
|
|
@@ -8244,9 +8281,12 @@ function TagsFilter(_a) {
|
|
|
8244
8281
|
setInputValue(v);
|
|
8245
8282
|
onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(v);
|
|
8246
8283
|
}, selectedKey: null, items: itemsWithSentinel, onSelectionChange: handleAutocompleteSelection,
|
|
8247
|
-
//
|
|
8248
|
-
|
|
8249
|
-
//
|
|
8284
|
+
// TECH-1640: el desplegable abre al enfocar/hacer clic, no solo al
|
|
8285
|
+
// escribir. Un selector de etiquetas debe enseñar lo que hay sin
|
|
8286
|
+
// exigir que el usuario recuerde el nombre.
|
|
8287
|
+
menuTrigger: "focus",
|
|
8288
|
+
// La colección nunca llega vacía (ver `itemsWithSentinel`): cuando no
|
|
8289
|
+
// hay nada que ofrecer se inyecta el item con el mensaje de vacío.
|
|
8250
8290
|
allowsEmptyCollection: false, shouldCloseOnBlur: true, popoverProps: {
|
|
8251
8291
|
// isNonModal: false would render a full-screen invisible backdrop that
|
|
8252
8292
|
// intercepts pointer events, blocking the parent modal's close button.
|
|
@@ -8257,6 +8297,9 @@ function TagsFilter(_a) {
|
|
|
8257
8297
|
className: "max-h-[200px] overflow-y-auto",
|
|
8258
8298
|
}, className: "w-full", children: function (item) {
|
|
8259
8299
|
var candidate = item;
|
|
8300
|
+
if (candidate.id === EMPTY_KEY) {
|
|
8301
|
+
return (jsx(AutocompleteItem, { textValue: t.emptyAvailableMessage, isReadOnly: true, className: "opacity-100 cursor-default data-[hover=true]:bg-transparent", children: jsx("span", { className: "text-tiny text-default-500", children: t.emptyAvailableMessage }) }, EMPTY_KEY));
|
|
8302
|
+
}
|
|
8260
8303
|
if (candidate.id === SENTINEL_KEY) {
|
|
8261
8304
|
return (jsx(AutocompleteItem, { textValue: "", isReadOnly: true, className: "opacity-100 cursor-default data-[hover=true]:bg-transparent", children: jsx("div", { ref: function (node) {
|
|
8262
8305
|
var _a;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../../src/components/menu/Menu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../../src/components/menu/Menu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,aAAa,CAAC;AAKrB,OAAO,KAAK,EACX,kBAAkB,EAElB,MAAM,cAAc,CAAC;AAgBtB;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAiatD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deriva las iniciales para el avatar del usuario a partir de su nombre completo.
|
|
3
|
+
*
|
|
4
|
+
* Muestra la inicial del nombre + la inicial del primer apellido (2 letras en
|
|
5
|
+
* mayúsculas), p. ej. "Roser Ruiz" -> "RR". Si el usuario solo tiene un token
|
|
6
|
+
* (nombre sin apellido) devuelve una sola inicial. Si no hay texto, devuelve "".
|
|
7
|
+
*
|
|
8
|
+
* TECH-1727: reemplaza el comportamiento por defecto de HeroUI (`safeText`), que
|
|
9
|
+
* muestra las 3 primeras letras del nombre ("Roser Ruiz" -> "Ros").
|
|
10
|
+
*
|
|
11
|
+
* @param fullName Nombre completo del usuario (se usa el mismo valor que el label).
|
|
12
|
+
* @returns Iniciales en mayúsculas (0, 1 o 2 letras).
|
|
13
|
+
*/
|
|
14
|
+
export declare const getUserInitials: (fullName: string) => string;
|
|
15
|
+
//# sourceMappingURL=get-user-initials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-user-initials.d.ts","sourceRoot":"","sources":["../../../../src/components/menu/get-user-initials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,KAAG,MAWlD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagsFilter.d.ts","sourceRoot":"","sources":["../../../../src/components/tags-filter/TagsFilter.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EACX,eAAe,EAEf,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"TagsFilter.d.ts","sourceRoot":"","sources":["../../../../src/components/tags-filter/TagsFilter.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EACX,eAAe,EAEf,MAAM,oBAAoB,CAAC;AAuC5B;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EACpE,KAAK,EACL,KAAK,EACL,QAAQ,EACR,YAAiB,EACjB,KAAK,EACL,SAAiB,EACjB,SAAc,EACd,YAAY,EAAE,SAAS,EACvB,QAAgB,EAChB,WAA2D,EAC3D,SAAkD,EAClD,aAAa,EACb,OAAe,EACf,aAAqB,EACrB,UAAU,EACV,kBAA0B,GAC1B,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAkOzC;yBAnPe,UAAU"}
|
|
@@ -20,6 +20,12 @@ export type TagsFilterTranslations = {
|
|
|
20
20
|
labelSelected?: string;
|
|
21
21
|
/** Mensaje cuando no hay etiquetas seleccionadas */
|
|
22
22
|
emptySelectedMessage?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Mensaje dentro del desplegable cuando no queda ninguna etiqueta que
|
|
25
|
+
* ofrecer (el centro no tiene etiquetas, ya están todas asignadas o la
|
|
26
|
+
* búsqueda no encontró nada).
|
|
27
|
+
*/
|
|
28
|
+
emptyAvailableMessage?: string;
|
|
23
29
|
/** Prefijo del mensaje de error (ej. "Error al cargar etiquetas") */
|
|
24
30
|
errorLoadingPrefix?: string;
|
|
25
31
|
/** Texto sr-only del spinner inline mientras se cargan más páginas. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagsFilter.types.d.ts","sourceRoot":"","sources":["../../../../src/components/tags-filter/TagsFilter.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,OAAO;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACpC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IAC3D,qDAAqD;IACrD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,0CAA0C;IAC1C,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAClC,uFAAuF;IACvF,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;IACtC,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mIAAmI;IACnI,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
|
|
1
|
+
{"version":3,"file":"TagsFilter.types.d.ts","sourceRoot":"","sources":["../../../../src/components/tags-filter/TagsFilter.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,OAAO;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACpC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IAC3D,qDAAqD;IACrD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,0CAA0C;IAC1C,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAClC,uFAAuF;IACvF,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;IACtC,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mIAAmI;IACnI,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
|