@soyfri/shared-library 3.3.0 → 4.0.1
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/{Modal-C_QY7ZzY.js → Modal-BqW0Nk3l.js} +12 -2
- package/{Modal-C_QY7ZzY.js.map → Modal-BqW0Nk3l.js.map} +1 -1
- package/{Modal-D_6ZdSzw.cjs → Modal-Cfyr-RsW.cjs} +12 -2
- package/{Modal-D_6ZdSzw.cjs.map → Modal-Cfyr-RsW.cjs.map} +1 -1
- package/{Table-DaNgX7PO.cjs → Table-BpnAkCgd.cjs} +4 -3
- package/Table-BpnAkCgd.cjs.map +1 -0
- package/{Table-aNFAOuQk.js → Table-BuALBQWX.js} +4 -3
- package/Table-BuALBQWX.js.map +1 -0
- package/{Tooltip-BB77JBcg.js → Tooltip-B15a34_o.js} +4 -6
- package/Tooltip-B15a34_o.js.map +1 -0
- package/{Tooltip-DpAsWGpN.cjs → Tooltip-CEEDkwds.cjs} +4 -6
- package/Tooltip-CEEDkwds.cjs.map +1 -0
- package/components/Modal/Modal.cjs +1 -1
- package/components/Modal/Modal.js +1 -1
- package/components/Table/Table.cjs +1 -1
- package/components/Table/Table.d.ts +10 -1
- package/components/Table/Table.js +1 -1
- package/components/Tooltip/Tooltip.cjs +1 -1
- package/components/Tooltip/Tooltip.js +1 -1
- package/demos/themes.d.ts +29 -0
- package/index.cjs +3 -3
- package/index.js +3 -3
- package/package.json +1 -1
- package/Table-DaNgX7PO.cjs.map +0 -1
- package/Table-aNFAOuQk.js.map +0 -1
- package/Tooltip-BB77JBcg.js.map +0 -1
- package/Tooltip-DpAsWGpN.cjs.map +0 -1
- package/components/Autocomplete/Autocomplete.definitions.d.ts +0 -15
- package/components/Avatar/Avatar.definitions.d.ts +0 -11
- package/components/Button/Button.definition.d.ts +0 -11
- package/components/Card/Card.definition.d.ts +0 -1
- package/components/Chip/Chip.definitions.d.ts +0 -10
- package/components/DatePicker/DatePicker.definitions.d.ts +0 -8
- package/components/DateTimePicker/DateTimePicker.definitions.d.ts +0 -12
- package/components/Input/Input.definitions.d.ts +0 -15
- package/components/InputGroup/InputGroup.definitions.d.ts +0 -6
- package/components/RadioGroup/RadioGroup.definitions.d.ts +0 -6
- package/components/Stepper/Stepper.definition.d.ts +0 -2
- package/components/Switch/Switch.definitions.d.ts +0 -7
- package/components/Table/Table.definition.d.ts +0 -14
- package/components/Tabs/Tab.definition.d.ts +0 -3
- package/components/Timeline/Timeline.definition.d.ts +0 -3
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defProps = Object.defineProperties;
|
|
3
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
2
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
3
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
4
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -16,22 +14,22 @@ var __spreadValues = (a, b) => {
|
|
|
16
14
|
}
|
|
17
15
|
return a;
|
|
18
16
|
};
|
|
19
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
17
|
import { jsx } from "react/jsx-runtime";
|
|
21
18
|
import MuiTooltip from "@mui/material/Tooltip";
|
|
22
19
|
import Typography from "@mui/material/Typography";
|
|
23
20
|
import Box from "@mui/material/Box";
|
|
24
21
|
const Tooltip = ({ text, maxWidth, children, sx }) => {
|
|
25
|
-
const tooltipContentStyle =
|
|
22
|
+
const tooltipContentStyle = {
|
|
26
23
|
padding: "4px 8px",
|
|
27
24
|
textAlign: "center"
|
|
28
|
-
}
|
|
25
|
+
};
|
|
29
26
|
return /* @__PURE__ */ jsx(
|
|
30
27
|
MuiTooltip,
|
|
31
28
|
{
|
|
32
29
|
title: /* @__PURE__ */ jsx(Typography, { variant: "caption", component: "span", sx: tooltipContentStyle, children: text }),
|
|
33
30
|
placement: "top",
|
|
34
31
|
arrow: true,
|
|
32
|
+
slotProps: maxWidth ? { tooltip: { sx: { maxWidth } } } : void 0,
|
|
35
33
|
children: /* @__PURE__ */ jsx(Box, { component: "span", sx: __spreadValues({ display: "inline-block" }, sx), children })
|
|
36
34
|
}
|
|
37
35
|
);
|
|
@@ -39,4 +37,4 @@ const Tooltip = ({ text, maxWidth, children, sx }) => {
|
|
|
39
37
|
export {
|
|
40
38
|
Tooltip as T
|
|
41
39
|
};
|
|
42
|
-
//# sourceMappingURL=Tooltip-
|
|
40
|
+
//# sourceMappingURL=Tooltip-B15a34_o.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip-B15a34_o.js","sources":["../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import React from 'react';\nimport MuiTooltip from '@mui/material/Tooltip'; \nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport { SxProps, Theme } from '@mui/material';\n\n/**\n * Propiedades del componente Tooltip.\n * @param {string} text - El texto a mostrar dentro del Tooltip.\n * @param {number} [maxWidth] - El ancho máximo opcional del Tooltip en píxeles.\n * @param {React.ReactNode} children - El elemento al que se le aplicará el Tooltip.\n * @param {SxProps<Theme>} [sx] - Estilos opcionales para el Box contenedor.\n */\ninterface TooltipProps {\n text: string;\n maxWidth?: number;\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * Componente Tooltip reutilizable.\n * Muestra un texto al pasar el ratón sobre su elemento hijo, \n * permitiendo un ancho máximo configurable.\n * * @param {TooltipProps} props - Propiedades del Tooltip.\n */\nconst Tooltip: React.FC<TooltipProps> = ({ text, maxWidth, children, sx }) => {\n \n const tooltipContentStyle: SxProps<Theme> = {\n padding: '4px 8px',\n textAlign: 'center',\n };\n\n return (\n \n <MuiTooltip\n title={\n \n <Typography variant=\"caption\" component=\"span\" sx={tooltipContentStyle}>\n {text}\n </Typography>\n }\n \n placement=\"top\"\n arrow\n // `maxWidth` va en la superficie del tooltip, no en el texto: si se aplica\n // al hijo, MUI mantiene su caja en los 300px por default y sólo el texto\n // corta antes, dejando aire muerto a la derecha.\n slotProps={maxWidth ? { tooltip: { sx: { maxWidth } } } : undefined}\n >\n \n <Box component=\"span\" sx={{ display: 'inline-block', ...sx }}>\n {children}\n </Box>\n </MuiTooltip>\n );\n};\n\nexport default Tooltip;"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AA0BA,MAAM,UAAkC,CAAC,EAAE,MAAM,UAAU,UAAU,SAAS;AAE5E,QAAM,sBAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAGb,SAEE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,2BAEG,YAAA,EAAW,SAAQ,WAAU,WAAU,QAAO,IAAI,qBAChD,UAAA,KAAA,CACH;AAAA,MAGF,WAAU;AAAA,MACV,OAAK;AAAA,MAIL,WAAW,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,SAAA,EAAS,EAAE,IAAM;AAAA,MAG1D,UAAA,oBAAC,KAAA,EAAI,WAAU,QAAO,IAAI,iBAAE,SAAS,kBAAmB,KACrD,SAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
-
var __defProps = Object.defineProperties;
|
|
4
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
3
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
5
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -17,25 +15,25 @@ var __spreadValues = (a, b) => {
|
|
|
17
15
|
}
|
|
18
16
|
return a;
|
|
19
17
|
};
|
|
20
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
18
|
const jsxRuntime = require("react/jsx-runtime");
|
|
22
19
|
const MuiTooltip = require("@mui/material/Tooltip");
|
|
23
20
|
const Typography = require("@mui/material/Typography");
|
|
24
21
|
const Box = require("@mui/material/Box");
|
|
25
22
|
const Tooltip = ({ text, maxWidth, children, sx }) => {
|
|
26
|
-
const tooltipContentStyle =
|
|
23
|
+
const tooltipContentStyle = {
|
|
27
24
|
padding: "4px 8px",
|
|
28
25
|
textAlign: "center"
|
|
29
|
-
}
|
|
26
|
+
};
|
|
30
27
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
31
28
|
MuiTooltip,
|
|
32
29
|
{
|
|
33
30
|
title: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", component: "span", sx: tooltipContentStyle, children: text }),
|
|
34
31
|
placement: "top",
|
|
35
32
|
arrow: true,
|
|
33
|
+
slotProps: maxWidth ? { tooltip: { sx: { maxWidth } } } : void 0,
|
|
36
34
|
children: /* @__PURE__ */ jsxRuntime.jsx(Box, { component: "span", sx: __spreadValues({ display: "inline-block" }, sx), children })
|
|
37
35
|
}
|
|
38
36
|
);
|
|
39
37
|
};
|
|
40
38
|
exports.Tooltip = Tooltip;
|
|
41
|
-
//# sourceMappingURL=Tooltip-
|
|
39
|
+
//# sourceMappingURL=Tooltip-CEEDkwds.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip-CEEDkwds.cjs","sources":["../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import React from 'react';\nimport MuiTooltip from '@mui/material/Tooltip'; \nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport { SxProps, Theme } from '@mui/material';\n\n/**\n * Propiedades del componente Tooltip.\n * @param {string} text - El texto a mostrar dentro del Tooltip.\n * @param {number} [maxWidth] - El ancho máximo opcional del Tooltip en píxeles.\n * @param {React.ReactNode} children - El elemento al que se le aplicará el Tooltip.\n * @param {SxProps<Theme>} [sx] - Estilos opcionales para el Box contenedor.\n */\ninterface TooltipProps {\n text: string;\n maxWidth?: number;\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * Componente Tooltip reutilizable.\n * Muestra un texto al pasar el ratón sobre su elemento hijo, \n * permitiendo un ancho máximo configurable.\n * * @param {TooltipProps} props - Propiedades del Tooltip.\n */\nconst Tooltip: React.FC<TooltipProps> = ({ text, maxWidth, children, sx }) => {\n \n const tooltipContentStyle: SxProps<Theme> = {\n padding: '4px 8px',\n textAlign: 'center',\n };\n\n return (\n \n <MuiTooltip\n title={\n \n <Typography variant=\"caption\" component=\"span\" sx={tooltipContentStyle}>\n {text}\n </Typography>\n }\n \n placement=\"top\"\n arrow\n // `maxWidth` va en la superficie del tooltip, no en el texto: si se aplica\n // al hijo, MUI mantiene su caja en los 300px por default y sólo el texto\n // corta antes, dejando aire muerto a la derecha.\n slotProps={maxWidth ? { tooltip: { sx: { maxWidth } } } : undefined}\n >\n \n <Box component=\"span\" sx={{ display: 'inline-block', ...sx }}>\n {children}\n </Box>\n </MuiTooltip>\n );\n};\n\nexport default Tooltip;"],"names":["jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA0BA,MAAM,UAAkC,CAAC,EAAE,MAAM,UAAU,UAAU,SAAS;AAE5E,QAAM,sBAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAGb,SAEEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,sCAEG,YAAA,EAAW,SAAQ,WAAU,WAAU,QAAO,IAAI,qBAChD,UAAA,KAAA,CACH;AAAA,MAGF,WAAU;AAAA,MACV,OAAK;AAAA,MAIL,WAAW,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,SAAA,EAAS,EAAE,IAAM;AAAA,MAG1D,UAAAA,2BAAAA,IAAC,KAAA,EAAI,WAAU,QAAO,IAAI,iBAAE,SAAS,kBAAmB,KACrD,SAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const Modal = require("../../Modal-
|
|
3
|
+
const Modal = require("../../Modal-Cfyr-RsW.cjs");
|
|
4
4
|
exports.Modal = Modal.ModalWithStatics;
|
|
5
5
|
exports.ModalBody = Modal.ModalBody;
|
|
6
6
|
exports.ModalFooter = Modal.ModalFooter;
|
|
@@ -27,6 +27,15 @@ interface TableProps<T> {
|
|
|
27
27
|
emptyTitle?: string;
|
|
28
28
|
emptyMessage?: string;
|
|
29
29
|
emptyImageSrc?: React.ReactNode;
|
|
30
|
+
/**
|
|
31
|
+
* Ancho mínimo de la tabla. Default: `650`.
|
|
32
|
+
*
|
|
33
|
+
* Por debajo de ese ancho el contenedor scrollea en horizontal, así que en un
|
|
34
|
+
* panel angosto (una card lateral, un móvil) las últimas columnas quedan
|
|
35
|
+
* escondidas detrás del scroll. Bajarlo —o ponerlo en `0`— deja que las
|
|
36
|
+
* columnas se compriman en vez de desbordar.
|
|
37
|
+
*/
|
|
38
|
+
minWidth?: number | string;
|
|
30
39
|
}
|
|
31
|
-
export declare function Table<T>({ data, children, currentPage, pageSize, totalPages, previousPage: _previousPage, nextPage: _nextPage, pageSizeSelectorValue, onPageChange, onPageSizeChange, visiblePageNumbers, enableCSVExport, csvExportFileName, csvExportButtonText, csvExportColumns, enableExcelExport, excelExportFileName, excelExportButtonText, excelExportColumns, enableRowSelection, rowIdentifier, onSelectionChange, showPageSizeSelector, emptyTitle, emptyMessage, emptyImageSrc, }: TableProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
export declare function Table<T>({ data, children, currentPage, pageSize, totalPages, previousPage: _previousPage, nextPage: _nextPage, pageSizeSelectorValue, onPageChange, onPageSizeChange, visiblePageNumbers, enableCSVExport, csvExportFileName, csvExportButtonText, csvExportColumns, enableExcelExport, excelExportFileName, excelExportButtonText, excelExportColumns, enableRowSelection, rowIdentifier, onSelectionChange, showPageSizeSelector, emptyTitle, emptyMessage, emptyImageSrc, minWidth, }: TableProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
32
41
|
export default Table;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const Tooltip = require("../../Tooltip-
|
|
3
|
+
const Tooltip = require("../../Tooltip-CEEDkwds.cjs");
|
|
4
4
|
exports.Tooltip = Tooltip.Tooltip;
|
|
5
5
|
//# sourceMappingURL=Tooltip.cjs.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Theme } from '@mui/material/styles';
|
|
2
|
+
/**
|
|
3
|
+
* Soporte — consola interna. Denso y neutro: la pantalla es herramienta de
|
|
4
|
+
* trabajo, el color sólo marca estado. Semánticos que pasan AA contra blanco.
|
|
5
|
+
* (Espejo de `soporte-internal-admin-frontend/src/theme/tokens.ts`.)
|
|
6
|
+
*/
|
|
7
|
+
export declare const temaSoporte: Theme;
|
|
8
|
+
/**
|
|
9
|
+
* Comercios — dashboard del comerciante. Botones píldora de 44px, azul de marca
|
|
10
|
+
* oscuro para el texto de acción, verde lima para éxito.
|
|
11
|
+
* (Espejo de `comercios-web-frontend/src/_fri/themes/theme.ts`.)
|
|
12
|
+
*/
|
|
13
|
+
export declare const temaComercios: Theme;
|
|
14
|
+
/**
|
|
15
|
+
* Kiosko (inventado) — autoservicio en local: oscuro para no encandilar,
|
|
16
|
+
* controles grandes para el dedo, un solo acento cítrico. Sirve de prueba de
|
|
17
|
+
* `mode: 'dark'` sin cambiar una línea en las pantallas.
|
|
18
|
+
*/
|
|
19
|
+
export declare const temaKiosko: Theme;
|
|
20
|
+
/** Theme de MUI sin personalizar: el punto de partida de un proyecto nuevo. */
|
|
21
|
+
export declare const temaBase: Theme;
|
|
22
|
+
export interface TemaDeEjemplo {
|
|
23
|
+
id: string;
|
|
24
|
+
nombre: string;
|
|
25
|
+
descripcion: string;
|
|
26
|
+
tema: Theme;
|
|
27
|
+
}
|
|
28
|
+
export declare const TEMAS: TemaDeEjemplo[];
|
|
29
|
+
export declare const temaPorId: (id: string) => Theme;
|
package/index.cjs
CHANGED
|
@@ -19,9 +19,9 @@ const DataRow = require("./DataRow-CfCaSdaJ.cjs");
|
|
|
19
19
|
const EmptyState = require("./EmptyState-DJj9KOEy.cjs");
|
|
20
20
|
const Step = require("./Step-Nd7SJbRZ.cjs");
|
|
21
21
|
const Tab = require("./Tab-D1S7kxXI.cjs");
|
|
22
|
-
const Table = require("./Table-
|
|
22
|
+
const Table = require("./Table-BpnAkCgd.cjs");
|
|
23
23
|
const StatusMessage = require("./StatusMessage-B3nXpuRl.cjs");
|
|
24
|
-
const Modal = require("./Modal-
|
|
24
|
+
const Modal = require("./Modal-Cfyr-RsW.cjs");
|
|
25
25
|
const Input = require("./Input-Bpjw7qwq.cjs");
|
|
26
26
|
const Select = require("./Select-WpHNCHHz.cjs");
|
|
27
27
|
const Autocomplete = require("./Autocomplete-Bd3bN4Cw.cjs");
|
|
@@ -39,7 +39,7 @@ const Gallery = require("./Gallery-Cn1Bj_ao.cjs");
|
|
|
39
39
|
const Icon = require("./Icon-ChnAivGo.cjs");
|
|
40
40
|
const MenuButton = require("./MenuButton-C4s8rG05.cjs");
|
|
41
41
|
const TimelineItem = require("./TimelineItem-BbhUWJhU.cjs");
|
|
42
|
-
const Tooltip = require("./Tooltip-
|
|
42
|
+
const Tooltip = require("./Tooltip-CEEDkwds.cjs");
|
|
43
43
|
function scrollToTop({
|
|
44
44
|
behavior = "smooth",
|
|
45
45
|
target = typeof window !== "undefined" ? window : void 0,
|
package/index.js
CHANGED
|
@@ -17,9 +17,9 @@ import { D as D3 } from "./DataRow-B7fJ5taA.js";
|
|
|
17
17
|
import { E } from "./EmptyState-kEoDkg1B.js";
|
|
18
18
|
import { a, S as S3 } from "./Step-BArsou1V.js";
|
|
19
19
|
import { a as a2, T } from "./Tab-DycIMXmQ.js";
|
|
20
|
-
import { T as T2 } from "./Table-
|
|
20
|
+
import { T as T2 } from "./Table-BuALBQWX.js";
|
|
21
21
|
import { S as S4 } from "./StatusMessage-D0WgSBx7.js";
|
|
22
|
-
import { M, b, c, a as a3 } from "./Modal-
|
|
22
|
+
import { M, b, c, a as a3 } from "./Modal-BqW0Nk3l.js";
|
|
23
23
|
import { I } from "./Input-BibHlnGN.js";
|
|
24
24
|
import { O, S as S5 } from "./Select-BaY3zJhq.js";
|
|
25
25
|
import { A as A3, a as a4 } from "./Autocomplete-E5aSUGVK.js";
|
|
@@ -37,7 +37,7 @@ import { G } from "./Gallery-ClBJxCMc.js";
|
|
|
37
37
|
import { I as I3 } from "./Icon-CUwK2c8z.js";
|
|
38
38
|
import { M as M2 } from "./MenuButton-CZRN4P6x.js";
|
|
39
39
|
import { T as T3, a as a8 } from "./TimelineItem-0jRPFT11.js";
|
|
40
|
-
import { T as T4 } from "./Tooltip-
|
|
40
|
+
import { T as T4 } from "./Tooltip-B15a34_o.js";
|
|
41
41
|
import './index.css';function scrollToTop({
|
|
42
42
|
behavior = "smooth",
|
|
43
43
|
target = typeof window !== "undefined" ? window : void 0,
|
package/package.json
CHANGED
package/Table-DaNgX7PO.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Table-DaNgX7PO.cjs","sources":["../src/components/Table/exportsUtils.ts","../src/components/Table/EmptyTable.png","../src/components/Table/Table.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertProps } from '@mui/material/Alert';\nimport { ColumnProps } from '../Column/Column'; // Importa ColumnProps y FieldName desde Column.tsx\n\n// Define las propiedades comunes para las funciones de exportación\ninterface ExportOptions<T> {\n data: T[]; // Los datos a exportar\n columns: React.ReactElement<ColumnProps<T>>[]; // Las definiciones de las columnas\n fileName: string; // El nombre del archivo a descargar\n exportColumns?: string[]; // Nombres de columnas específicas para exportar\n setSnackbarOpen: React.Dispatch<React.SetStateAction<boolean>>; // Setter para abrir/cerrar el Snackbar\n setSnackbarMessage: React.Dispatch<React.SetStateAction<string>>; // Setter para el mensaje del Snackbar\n setSnackbarSeverity: React.Dispatch<React.SetStateAction<AlertProps['severity']>>; // Setter para la severidad del Snackbar\n}\n\n/**\n * Función para exportar datos a un archivo CSV.\n * @param options Opciones de exportación, incluyendo datos, columnas, nombre de archivo y setters de Snackbar.\n */\nexport const exportToCSV = <T>(options: ExportOptions<T>) => {\n const { data, columns, fileName, exportColumns, setSnackbarOpen, setSnackbarMessage, setSnackbarSeverity } = options;\n\n if (!data || data.length === 0) {\n setSnackbarMessage(\"No hay datos para exportar a CSV.\");\n setSnackbarSeverity('warning');\n setSnackbarOpen(true);\n return;\n }\n\n setSnackbarMessage(\"Exportando datos a CSV...\");\n setSnackbarSeverity('info');\n setSnackbarOpen(true);\n\n try {\n // Filtra las columnas si se especifican columnas para exportar, de lo contrario, usa todas las columnas definidas.\n const columnsToExport = exportColumns\n ? columns.filter(col => exportColumns.includes(col.props.name))\n : columns;\n\n // Obtiene los encabezados (nombres de las columnas) y los escapa para CSV.\n const headers = columnsToExport.map(col => `\"${col.props.name.replace(/\"/g, '\"\"')}\"`).join(',');\n\n // Mapea los datos a filas CSV.\n const csvRows = data.map(row => {\n const values = columnsToExport.map(col => {\n const field = col.props.field;\n let cellValue: any;\n\n // Si 'field' es un array, toma el valor del primer campo para la exportación.\n if (Array.isArray(field)) {\n cellValue = (row as any)[field[0]];\n } else {\n cellValue = (row as any)[field];\n }\n\n // Convierte a string y maneja comas, comillas dobles y saltos de línea para CSV.\n let formattedValue = String(cellValue || '');\n if (formattedValue.includes(',') || formattedValue.includes('\"') || formattedValue.includes('\\n')) {\n formattedValue = `\"${formattedValue.replace(/\"/g, '\"\"')}\"`;\n }\n return formattedValue;\n });\n return values.join(',');\n });\n\n const csvContent = [headers, ...csvRows].join('\\n'); // Une los encabezados y las filas.\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n\n if (link.download !== undefined) {\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', fileName + '.csv');\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n setSnackbarMessage(\"¡Exportación a CSV completada!\");\n setSnackbarSeverity('success');\n } else {\n setSnackbarMessage(\"Tu navegador no soporta la descarga directa para CSV. Por favor, copia el contenido manualmente.\");\n setSnackbarSeverity('error');\n }\n } catch (error) {\n console.error(\"Error al exportar los datos a CSV:\", error);\n setSnackbarMessage(\"Error al exportar los datos a CSV.\");\n setSnackbarSeverity('error');\n } finally {\n setSnackbarOpen(true);\n }\n};\n\n/**\n * Función para exportar datos a un archivo Excel (formato XLSX).\n * Genera una tabla HTML que luego se descarga como un archivo .xlsx.\n * @param options Opciones de exportación, incluyendo datos, columnas, nombre de archivo y setters de Snackbar.\n */\nexport const exportToExcel = <T>(options: ExportOptions<T>) => {\n const { data, columns, fileName, exportColumns, setSnackbarOpen, setSnackbarMessage, setSnackbarSeverity } = options;\n\n if (!data || data.length === 0) {\n setSnackbarMessage(\"No hay datos para exportar a Excel.\");\n setSnackbarSeverity('warning');\n setSnackbarOpen(true);\n return;\n }\n\n setSnackbarMessage(\"Exportando datos a Excel (XLSX)...\");\n setSnackbarSeverity('info');\n setSnackbarOpen(true);\n\n try {\n const columnsToExport = exportColumns\n ? columns.filter(col => exportColumns.includes(col.props.name))\n : columns;\n\n // Construye el contenido HTML de la tabla.\n let tableHTML = `\n <html xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\n xmlns=\"http://www.w3.org/TR/REC-html40\">\n <head>\n <meta charset=\"utf-8\" />\n <!--[if gte mso 9]><xml>\n <x:ExcelWorkbook>\n <x:ExcelWorksheets>\n <x:ExcelWorksheet>\n <x:Name>Hoja1</x:Name>\n <x:WorksheetOptions>\n <x:DisplayGridlines/>\n </x:WorksheetOptions>\n </x:ExcelWorksheet>\n </x:ExcelWorksheets>\n </x:ExcelWorkbook>\n </xml><![endif]-->\n </head>\n <body>\n <table>\n <thead>\n <tr>\n ${columnsToExport.map(col => `<th>${col.props.name}</th>`).join('')}\n </tr>\n </thead>\n <tbody>\n ${data.map(row => `\n <tr>\n ${columnsToExport.map(col => {\n const field = col.props.field;\n let cellValue: any;\n if (Array.isArray(field)) {\n cellValue = (row as any)[field[0]];\n } else {\n cellValue = (row as any)[field];\n }\n // Escapa caracteres HTML para el contenido de la celda.\n return `<td>${String(cellValue || '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')}</td>`;\n }).join('')}\n </tr>\n `).join('')}\n </tbody>\n </table>\n </body>\n </html>\n `;\n\n // Crea un Blob con el contenido HTML y el tipo MIME de XLSX.\n const blob = new Blob([tableHTML], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8;' }); \n\n const link = document.createElement('a');\n if (link.download !== undefined) {\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', fileName + '.xlsx'); // Usa la extensión .xlsx\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n setSnackbarMessage(\"¡Exportación a Excel (XLSX) completada!\");\n setSnackbarSeverity('success');\n } else {\n setSnackbarMessage(\"Tu navegador no soporta la descarga directa para Excel (XLSX). Por favor, copia el contenido manualmente.\");\n setSnackbarSeverity('error');\n }\n } catch (error) {\n console.error(\"Error al exportar los datos a Excel (XLSX):\", error);\n setSnackbarMessage(\"Error al exportar los datos a Excel (XLSX).\");\n setSnackbarSeverity('error');\n } finally {\n setSnackbarOpen(true);\n }\n};\n","export default \"data:image/png;base64,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\"","import React, { Children, isValidElement, useState, useEffect } from 'react';\nimport {\n TableContainer,\n Table as MuiTable,\n TableHead,\n TableBody,\n TableRow,\n TableCell,\n Typography,\n Select,\n MenuItem,\n Box,\n Button,\n Snackbar,\n IconButton,\n Checkbox,\n} from '@mui/material';\nimport MuiAlert, { AlertProps } from '@mui/material/Alert';\nimport { ColumnProps } from '../Column/Column'; // Asegúrate de que esta ruta sea correcta\nimport DownloadOutlinedIcon from '@mui/icons-material/DownloadOutlined';\nimport FirstPageIcon from '@mui/icons-material/FirstPage';\nimport LastPageIcon from '@mui/icons-material/LastPage';\nimport KeyboardArrowLeftIcon from '@mui/icons-material/KeyboardArrowLeft';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\n\nimport { exportToCSV, exportToExcel } from './exportsUtils';\n\n// @ts-ignore\nimport EmptyImage from './EmptyTable.png';\n\nexport type FieldName<T> = keyof T | Array<keyof T>;\n\ninterface TableProps<T> {\n data: T[];\n children: React.ReactNode;\n\n currentPage?: number;\n pageSize?: number;\n totalPages?: number;\n previousPage?: number;\n nextPage?: number;\n pageSizeSelectorValue?: number;\n onPageChange?: (newPage: number) => void;\n onPageSizeChange?: (newSize: number) => void;\n visiblePageNumbers?: number;\n\n enableCSVExport?: boolean;\n csvExportFileName?: string;\n csvExportButtonText?: string;\n csvExportColumns?: string[];\n\n enableExcelExport?: boolean;\n excelExportFileName?: string;\n excelExportButtonText?: string;\n excelExportColumns?: string[];\n\n enableRowSelection?: boolean;\n rowIdentifier?: keyof T;\n onSelectionChange?: (selectedItems: T[]) => void;\n showPageSizeSelector?: boolean;\n emptyTitle?: string;\n emptyMessage?: string;\n emptyImageSrc?: React.ReactNode;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(function Alert(\n props,\n ref,\n) {\n return <MuiAlert elevation={6} ref={ref} variant=\"filled\" {...props} />;\n});\n\nexport function Table<T>({\n data,\n children,\n currentPage,\n pageSize,\n totalPages,\n previousPage: _previousPage,\n nextPage: _nextPage,\n pageSizeSelectorValue = 10,\n onPageChange,\n onPageSizeChange,\n visiblePageNumbers = 5,\n enableCSVExport = false,\n csvExportFileName = 'data.csv',\n csvExportButtonText = 'Exportar CSV',\n csvExportColumns,\n enableExcelExport = false,\n excelExportFileName = 'data.xlsx',\n excelExportButtonText = 'Exportar Excel',\n excelExportColumns,\n enableRowSelection = false,\n rowIdentifier,\n onSelectionChange,\n showPageSizeSelector = true,\n emptyTitle = 'No hay datos disponibles',\n emptyMessage,\n emptyImageSrc = <Box mb={2}>\n <img src={EmptyImage} alt=\"No data\" style={{ maxWidth: '150px', opacity: 0.6 }} />\n </Box>,\n}: TableProps<T>) {\n const columns = Children.toArray(children).filter(\n (child): child is React.ReactElement<ColumnProps<T>> =>\n isValidElement(child) && (child.type as any).displayName === 'Column'\n );\n\n const [snackbarOpen, setSnackbarOpen] = useState(false);\n const [snackbarMessage, setSnackbarMessage] = useState(\"\");\n const [snackbarSeverity, setSnackbarSeverity] = useState<AlertProps['severity']>('info');\n\n const [selectedRows, setSelectedRows] = useState<T[]>([]);\n\n useEffect(() => {\n setSelectedRows([]);\n }, [data, currentPage, pageSize]);\n\n useEffect(() => {\n onSelectionChange?.(selectedRows);\n }, [selectedRows, onSelectionChange]);\n\n const handleSnackbarClose = (_event?: React.SyntheticEvent | Event, reason?: string) => {\n if (reason === 'clickaway') {\n return;\n }\n setSnackbarOpen(false);\n };\n\n const isControlled = typeof onPageChange === 'function' && typeof currentPage === 'number';\n const [internalPage, setInternalPage] = useState(1);\n const [internalPageSize, setInternalPageSize] = useState(pageSizeSelectorValue);\n\n const activePage = isControlled ? currentPage! : internalPage;\n const activePageSize = isControlled ? pageSize! : internalPageSize;\n\n const paginatedData = isControlled ? data : data.slice((activePage - 1) * activePageSize, activePage * activePageSize);\n\n const effectiveTotalPages = isControlled\n ? totalPages!\n : Math.ceil(data.length / activePageSize);\n\n const handlePageChange = (newPage: number) => {\n if (newPage < 1 || newPage > effectiveTotalPages) return;\n if (isControlled) onPageChange?.(newPage);\n else setInternalPage(newPage);\n };\n\n const handlePageSizeChange = (newSize: number) => {\n if (isControlled) {\n onPageSizeChange?.(newSize);\n onPageChange?.(1);\n } else {\n setInternalPageSize(newSize);\n setInternalPage(1);\n }\n };\n\n const getPageNumbers = () => {\n const pages = [];\n const maxPages = effectiveTotalPages;\n const current = activePage;\n const half = Math.floor(visiblePageNumbers / 2);\n\n let startPage = Math.max(1, current - half);\n let endPage = Math.min(maxPages, current + half);\n\n if (endPage - startPage + 1 < visiblePageNumbers) {\n if (startPage === 1) {\n endPage = Math.min(maxPages, startPage + visiblePageNumbers - 1);\n } else if (endPage === maxPages) {\n startPage = Math.max(1, maxPages - visiblePageNumbers + 1);\n }\n }\n\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n\n const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!rowIdentifier) {\n console.warn(\"`rowIdentifier` prop is required for row selection.\");\n return;\n }\n\n if (event.target.checked) {\n const newSelecteds = [...selectedRows];\n paginatedData.forEach(row => {\n const rowId = row[rowIdentifier] as any;\n if (!newSelecteds.some(selectedRow => (selectedRow as any)[rowIdentifier] === rowId)) {\n newSelecteds.push(row);\n }\n });\n setSelectedRows(newSelecteds);\n } else {\n const newSelecteds = selectedRows.filter(selectedRow =>\n !paginatedData.some(row => (row as any)[rowIdentifier] === (selectedRow as any)[rowIdentifier])\n );\n setSelectedRows(newSelecteds);\n }\n };\n\n const handleRowClick = (_event: React.MouseEvent<unknown>, row: T) => {\n if (!rowIdentifier) {\n console.warn(\"`rowIdentifier` prop is required for row selection.\");\n return;\n }\n\n const rowId = row[rowIdentifier] as any;\n const selectedIndex = selectedRows.findIndex(selectedRow => (selectedRow as any)[rowIdentifier] === rowId);\n let newSelected: T[] = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selectedRows, row);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selectedRows.slice(1));\n } else if (selectedIndex === selectedRows.length - 1) {\n newSelected = newSelected.concat(selectedRows.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selectedRows.slice(0, selectedIndex),\n selectedRows.slice(selectedIndex + 1),\n );\n }\n setSelectedRows(newSelected);\n };\n\n const isSelected = (row: T) => {\n if (!rowIdentifier) return false;\n return selectedRows.some(selectedRow => (selectedRow as any)[rowIdentifier] === (row as any)[rowIdentifier]);\n };\n\n const numSelectedOnPage = paginatedData.filter(isSelected).length;\n const isAllSelectedOnPage = paginatedData.length > 0 && numSelectedOnPage === paginatedData.length;\n const isIndeterminateOnPage = numSelectedOnPage > 0 && numSelectedOnPage < paginatedData.length;\n\n return (\n <TableContainer >\n\n <MuiTable sx={{ minWidth: 650 }} aria-label=\"custom table\" style={ paginatedData.length === 0 ? { display: 'none' } : {} }>\n {/* Table Header */}\n {/* Sin colores propios: la cabecera y las filas las pinta el theme del\n consumidor (MuiTableCell.head / MuiTableRow), que es donde vive el\n sistema visual. Hardcodear acá le ganaba al theme por ser `sx`. */}\n <TableHead>\n <TableRow>\n {enableRowSelection && (\n <TableCell padding=\"checkbox\" sx={{ width: '50px' }}> {/* Puedes ajustar este ancho fijo si lo deseas */}\n <Checkbox\n color=\"primary\"\n indeterminate={isIndeterminateOnPage}\n checked={isAllSelectedOnPage}\n onChange={handleSelectAllClick}\n inputProps={{ 'aria-label': 'select all desserts' }}\n />\n </TableCell>\n )}\n {columns.map((column, index) => (\n <TableCell\n key={index}\n sx={{\n width: column.props.width || 'auto', // APLICA EL ANCHO AQUÍ\n whiteSpace: 'nowrap', // Evita que el texto se ajuste si la columna es pequeña\n }}\n >\n <Typography variant=\"inherit\" component=\"span\">\n {column.props.name}\n </Typography>\n </TableCell>\n ))}\n </TableRow>\n </TableHead>\n {/* Table Body */}\n <TableBody sx={{ borderRadius: '10px', overflow: 'hidden' }}>\n {paginatedData.map((row, rowIndex) => {\n const isRowSelected = enableRowSelection && isSelected(row);\n return (\n <TableRow\n key={rowIndex}\n hover\n sx={{ '&:last-child td, &:last-child th': { border: 0 } }}\n selected={isRowSelected}\n >\n {enableRowSelection && (\n <TableCell padding=\"checkbox\" sx={{ width: '50px' }}> {/* Mismo ancho para la celda de la fila */}\n <Checkbox\n color=\"primary\"\n checked={isRowSelected}\n onClick={(event) => handleRowClick(event, row)}\n inputProps={{ 'aria-labelledby': `table-checkbox-${rowIndex}` }}\n />\n </TableCell>\n )}\n {columns.map((column, colIndex) => {\n const { field, children: cellRenderer } = column.props;\n\n let fieldData: Partial<T>;\n\n if (Array.isArray(field)) {\n if(field.length === 0){\n fieldData = {...row};\n }else{\n fieldData = (field as Array<keyof T>).reduce((acc, currentField) => {\n (acc as any)[currentField] = (row as any)[currentField];\n return acc;\n }, {} as Partial<T>);\n }\n\n } else {\n fieldData = { [field]: (row as any)[field] } as Partial<T>;\n }\n\n return (\n <TableCell\n key={colIndex}\n sx={{\n // Solo layout de columna. Tamaño, padding y regla de fila\n // son del theme del consumidor (MuiTableCell).\n width: column.props.width || 'auto', // APLICA EL ANCHO AQUÍ TAMBIÉN\n whiteSpace: 'nowrap', // Asegura que el contenido no se rompa prematuramente\n }}\n >\n {cellRenderer(fieldData)}\n </TableCell>\n );\n })}\n </TableRow>\n );\n })}\n {/* Empty table message */}\n \n </TableBody>\n </MuiTable>\n\n { paginatedData.length === 0 && (\n <Box display=\"flex\" flexDirection=\"column\" alignItems=\"center\" justifyContent=\"center\" p={4} > \n { emptyImageSrc }\n\n <Typography variant=\"body2\" color=\"#878E9A\" fontSize=\"18px\" fontWeight=\"600\">\n {emptyTitle || 'No hay datos disponibles para mostrar.'}\n </Typography>\n <Typography variant=\"body2\" color=\"#878E9A\" fontSize=\"14px\" mt={1}> \n {emptyMessage || 'Intente ajustar sus filtros o agregar nuevos datos.'}\n </Typography>\n\n </Box>\n )\n }\n\n {/* Pagination and Export Controls */}\n {(effectiveTotalPages > 0 || enableCSVExport || enableExcelExport || (enableRowSelection && selectedRows.length > 0)) && (\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" p={2}>\n {/* Page Size Selector (Left) */}\n {(effectiveTotalPages > 0 && showPageSizeSelector) && (\n <Select\n size=\"small\"\n value={activePageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n >\n {[1, 2, 3, 5, 10, 20, 50, 100].map((size) => (\n <MenuItem key={size} value={size}>\n Mostrar {size}\n </MenuItem>\n ))}\n </Select>\n )}\n\n {/* Pagination Controls (Center) */}\n {effectiveTotalPages > 0 && (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={0.5}\n sx={{ flexGrow: 1, justifyContent: 'center' }}\n >\n <IconButton\n onClick={() => handlePageChange(1)}\n disabled={activePage <= 1}\n size=\"small\"\n color=\"primary\"\n >\n <FirstPageIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n onClick={() => handlePageChange(activePage - 1)}\n disabled={activePage <= 1}\n size=\"small\"\n color=\"primary\"\n >\n <KeyboardArrowLeftIcon fontSize=\"small\" />\n </IconButton>\n\n {pageNumbers.map((pageNumber) => (\n <Button\n key={pageNumber}\n onClick={() => handlePageChange(pageNumber)}\n variant={activePage === pageNumber ? 'contained' : 'text'}\n size=\"small\"\n sx={{ minWidth: '32px', height: '32px' }}\n >\n {pageNumber}\n </Button>\n ))}\n\n <IconButton\n onClick={() => handlePageChange(activePage + 1)}\n disabled={activePage >= effectiveTotalPages}\n size=\"small\"\n color=\"primary\"\n >\n <KeyboardArrowRightIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n onClick={() => handlePageChange(effectiveTotalPages)}\n disabled={activePage >= effectiveTotalPages}\n size=\"small\"\n color=\"primary\"\n >\n <LastPageIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n )}\n\n {enableRowSelection && selectedRows.length > 0 && (\n <Typography variant=\"subtitle2\" sx={{ mr: 2 }}>\n {selectedRows.length} seleccionados\n </Typography>\n )}\n\n {(enableCSVExport || enableExcelExport) && (\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\n {enableCSVExport && (\n <Button\n variant=\"text\"\n color=\"primary\"\n onClick={() =>\n exportToCSV({\n data,\n columns,\n fileName: csvExportFileName,\n exportColumns: csvExportColumns,\n setSnackbarOpen,\n setSnackbarMessage,\n setSnackbarSeverity,\n })\n }\n size=\"small\"\n startIcon={<DownloadOutlinedIcon />}\n >\n {csvExportButtonText}\n </Button>\n )}\n {enableExcelExport && (\n <Button\n variant=\"text\"\n color=\"primary\"\n onClick={() =>\n exportToExcel({\n data,\n columns,\n fileName: excelExportFileName,\n exportColumns: excelExportColumns,\n setSnackbarOpen,\n setSnackbarMessage,\n setSnackbarSeverity,\n })\n }\n size=\"small\"\n startIcon={<DownloadOutlinedIcon />}\n >\n {excelExportButtonText}\n </Button>\n )}\n </Box>\n )}\n </Box>\n )}\n\n <Snackbar open={snackbarOpen} autoHideDuration={3000} onClose={handleSnackbarClose} anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}>\n <Alert onClose={handleSnackbarClose} severity={snackbarSeverity} sx={{ width: '100%' }}>\n {snackbarMessage}\n </Alert>\n </Snackbar>\n </TableContainer>\n );\n}\n\nexport default Table;"],"names":["Alert","jsx","Box","Children","isValidElement","useState","useEffect","TableContainer","jsxs","MuiTable","TableHead","TableRow","TableCell","Checkbox","Typography","TableBody","Select","MenuItem","IconButton","Button","Snackbar"],"mappings":"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"}
|
package/Table-aNFAOuQk.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Table-aNFAOuQk.js","sources":["../src/components/Table/exportsUtils.ts","../src/components/Table/EmptyTable.png","../src/components/Table/Table.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertProps } from '@mui/material/Alert';\nimport { ColumnProps } from '../Column/Column'; // Importa ColumnProps y FieldName desde Column.tsx\n\n// Define las propiedades comunes para las funciones de exportación\ninterface ExportOptions<T> {\n data: T[]; // Los datos a exportar\n columns: React.ReactElement<ColumnProps<T>>[]; // Las definiciones de las columnas\n fileName: string; // El nombre del archivo a descargar\n exportColumns?: string[]; // Nombres de columnas específicas para exportar\n setSnackbarOpen: React.Dispatch<React.SetStateAction<boolean>>; // Setter para abrir/cerrar el Snackbar\n setSnackbarMessage: React.Dispatch<React.SetStateAction<string>>; // Setter para el mensaje del Snackbar\n setSnackbarSeverity: React.Dispatch<React.SetStateAction<AlertProps['severity']>>; // Setter para la severidad del Snackbar\n}\n\n/**\n * Función para exportar datos a un archivo CSV.\n * @param options Opciones de exportación, incluyendo datos, columnas, nombre de archivo y setters de Snackbar.\n */\nexport const exportToCSV = <T>(options: ExportOptions<T>) => {\n const { data, columns, fileName, exportColumns, setSnackbarOpen, setSnackbarMessage, setSnackbarSeverity } = options;\n\n if (!data || data.length === 0) {\n setSnackbarMessage(\"No hay datos para exportar a CSV.\");\n setSnackbarSeverity('warning');\n setSnackbarOpen(true);\n return;\n }\n\n setSnackbarMessage(\"Exportando datos a CSV...\");\n setSnackbarSeverity('info');\n setSnackbarOpen(true);\n\n try {\n // Filtra las columnas si se especifican columnas para exportar, de lo contrario, usa todas las columnas definidas.\n const columnsToExport = exportColumns\n ? columns.filter(col => exportColumns.includes(col.props.name))\n : columns;\n\n // Obtiene los encabezados (nombres de las columnas) y los escapa para CSV.\n const headers = columnsToExport.map(col => `\"${col.props.name.replace(/\"/g, '\"\"')}\"`).join(',');\n\n // Mapea los datos a filas CSV.\n const csvRows = data.map(row => {\n const values = columnsToExport.map(col => {\n const field = col.props.field;\n let cellValue: any;\n\n // Si 'field' es un array, toma el valor del primer campo para la exportación.\n if (Array.isArray(field)) {\n cellValue = (row as any)[field[0]];\n } else {\n cellValue = (row as any)[field];\n }\n\n // Convierte a string y maneja comas, comillas dobles y saltos de línea para CSV.\n let formattedValue = String(cellValue || '');\n if (formattedValue.includes(',') || formattedValue.includes('\"') || formattedValue.includes('\\n')) {\n formattedValue = `\"${formattedValue.replace(/\"/g, '\"\"')}\"`;\n }\n return formattedValue;\n });\n return values.join(',');\n });\n\n const csvContent = [headers, ...csvRows].join('\\n'); // Une los encabezados y las filas.\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n\n if (link.download !== undefined) {\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', fileName + '.csv');\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n setSnackbarMessage(\"¡Exportación a CSV completada!\");\n setSnackbarSeverity('success');\n } else {\n setSnackbarMessage(\"Tu navegador no soporta la descarga directa para CSV. Por favor, copia el contenido manualmente.\");\n setSnackbarSeverity('error');\n }\n } catch (error) {\n console.error(\"Error al exportar los datos a CSV:\", error);\n setSnackbarMessage(\"Error al exportar los datos a CSV.\");\n setSnackbarSeverity('error');\n } finally {\n setSnackbarOpen(true);\n }\n};\n\n/**\n * Función para exportar datos a un archivo Excel (formato XLSX).\n * Genera una tabla HTML que luego se descarga como un archivo .xlsx.\n * @param options Opciones de exportación, incluyendo datos, columnas, nombre de archivo y setters de Snackbar.\n */\nexport const exportToExcel = <T>(options: ExportOptions<T>) => {\n const { data, columns, fileName, exportColumns, setSnackbarOpen, setSnackbarMessage, setSnackbarSeverity } = options;\n\n if (!data || data.length === 0) {\n setSnackbarMessage(\"No hay datos para exportar a Excel.\");\n setSnackbarSeverity('warning');\n setSnackbarOpen(true);\n return;\n }\n\n setSnackbarMessage(\"Exportando datos a Excel (XLSX)...\");\n setSnackbarSeverity('info');\n setSnackbarOpen(true);\n\n try {\n const columnsToExport = exportColumns\n ? columns.filter(col => exportColumns.includes(col.props.name))\n : columns;\n\n // Construye el contenido HTML de la tabla.\n let tableHTML = `\n <html xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\n xmlns=\"http://www.w3.org/TR/REC-html40\">\n <head>\n <meta charset=\"utf-8\" />\n <!--[if gte mso 9]><xml>\n <x:ExcelWorkbook>\n <x:ExcelWorksheets>\n <x:ExcelWorksheet>\n <x:Name>Hoja1</x:Name>\n <x:WorksheetOptions>\n <x:DisplayGridlines/>\n </x:WorksheetOptions>\n </x:ExcelWorksheet>\n </x:ExcelWorksheets>\n </x:ExcelWorkbook>\n </xml><![endif]-->\n </head>\n <body>\n <table>\n <thead>\n <tr>\n ${columnsToExport.map(col => `<th>${col.props.name}</th>`).join('')}\n </tr>\n </thead>\n <tbody>\n ${data.map(row => `\n <tr>\n ${columnsToExport.map(col => {\n const field = col.props.field;\n let cellValue: any;\n if (Array.isArray(field)) {\n cellValue = (row as any)[field[0]];\n } else {\n cellValue = (row as any)[field];\n }\n // Escapa caracteres HTML para el contenido de la celda.\n return `<td>${String(cellValue || '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')}</td>`;\n }).join('')}\n </tr>\n `).join('')}\n </tbody>\n </table>\n </body>\n </html>\n `;\n\n // Crea un Blob con el contenido HTML y el tipo MIME de XLSX.\n const blob = new Blob([tableHTML], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8;' }); \n\n const link = document.createElement('a');\n if (link.download !== undefined) {\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', fileName + '.xlsx'); // Usa la extensión .xlsx\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n setSnackbarMessage(\"¡Exportación a Excel (XLSX) completada!\");\n setSnackbarSeverity('success');\n } else {\n setSnackbarMessage(\"Tu navegador no soporta la descarga directa para Excel (XLSX). Por favor, copia el contenido manualmente.\");\n setSnackbarSeverity('error');\n }\n } catch (error) {\n console.error(\"Error al exportar los datos a Excel (XLSX):\", error);\n setSnackbarMessage(\"Error al exportar los datos a Excel (XLSX).\");\n setSnackbarSeverity('error');\n } finally {\n setSnackbarOpen(true);\n }\n};\n","export default \"data:image/png;base64,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\"","import React, { Children, isValidElement, useState, useEffect } from 'react';\nimport {\n TableContainer,\n Table as MuiTable,\n TableHead,\n TableBody,\n TableRow,\n TableCell,\n Typography,\n Select,\n MenuItem,\n Box,\n Button,\n Snackbar,\n IconButton,\n Checkbox,\n} from '@mui/material';\nimport MuiAlert, { AlertProps } from '@mui/material/Alert';\nimport { ColumnProps } from '../Column/Column'; // Asegúrate de que esta ruta sea correcta\nimport DownloadOutlinedIcon from '@mui/icons-material/DownloadOutlined';\nimport FirstPageIcon from '@mui/icons-material/FirstPage';\nimport LastPageIcon from '@mui/icons-material/LastPage';\nimport KeyboardArrowLeftIcon from '@mui/icons-material/KeyboardArrowLeft';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\n\nimport { exportToCSV, exportToExcel } from './exportsUtils';\n\n// @ts-ignore\nimport EmptyImage from './EmptyTable.png';\n\nexport type FieldName<T> = keyof T | Array<keyof T>;\n\ninterface TableProps<T> {\n data: T[];\n children: React.ReactNode;\n\n currentPage?: number;\n pageSize?: number;\n totalPages?: number;\n previousPage?: number;\n nextPage?: number;\n pageSizeSelectorValue?: number;\n onPageChange?: (newPage: number) => void;\n onPageSizeChange?: (newSize: number) => void;\n visiblePageNumbers?: number;\n\n enableCSVExport?: boolean;\n csvExportFileName?: string;\n csvExportButtonText?: string;\n csvExportColumns?: string[];\n\n enableExcelExport?: boolean;\n excelExportFileName?: string;\n excelExportButtonText?: string;\n excelExportColumns?: string[];\n\n enableRowSelection?: boolean;\n rowIdentifier?: keyof T;\n onSelectionChange?: (selectedItems: T[]) => void;\n showPageSizeSelector?: boolean;\n emptyTitle?: string;\n emptyMessage?: string;\n emptyImageSrc?: React.ReactNode;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(function Alert(\n props,\n ref,\n) {\n return <MuiAlert elevation={6} ref={ref} variant=\"filled\" {...props} />;\n});\n\nexport function Table<T>({\n data,\n children,\n currentPage,\n pageSize,\n totalPages,\n previousPage: _previousPage,\n nextPage: _nextPage,\n pageSizeSelectorValue = 10,\n onPageChange,\n onPageSizeChange,\n visiblePageNumbers = 5,\n enableCSVExport = false,\n csvExportFileName = 'data.csv',\n csvExportButtonText = 'Exportar CSV',\n csvExportColumns,\n enableExcelExport = false,\n excelExportFileName = 'data.xlsx',\n excelExportButtonText = 'Exportar Excel',\n excelExportColumns,\n enableRowSelection = false,\n rowIdentifier,\n onSelectionChange,\n showPageSizeSelector = true,\n emptyTitle = 'No hay datos disponibles',\n emptyMessage,\n emptyImageSrc = <Box mb={2}>\n <img src={EmptyImage} alt=\"No data\" style={{ maxWidth: '150px', opacity: 0.6 }} />\n </Box>,\n}: TableProps<T>) {\n const columns = Children.toArray(children).filter(\n (child): child is React.ReactElement<ColumnProps<T>> =>\n isValidElement(child) && (child.type as any).displayName === 'Column'\n );\n\n const [snackbarOpen, setSnackbarOpen] = useState(false);\n const [snackbarMessage, setSnackbarMessage] = useState(\"\");\n const [snackbarSeverity, setSnackbarSeverity] = useState<AlertProps['severity']>('info');\n\n const [selectedRows, setSelectedRows] = useState<T[]>([]);\n\n useEffect(() => {\n setSelectedRows([]);\n }, [data, currentPage, pageSize]);\n\n useEffect(() => {\n onSelectionChange?.(selectedRows);\n }, [selectedRows, onSelectionChange]);\n\n const handleSnackbarClose = (_event?: React.SyntheticEvent | Event, reason?: string) => {\n if (reason === 'clickaway') {\n return;\n }\n setSnackbarOpen(false);\n };\n\n const isControlled = typeof onPageChange === 'function' && typeof currentPage === 'number';\n const [internalPage, setInternalPage] = useState(1);\n const [internalPageSize, setInternalPageSize] = useState(pageSizeSelectorValue);\n\n const activePage = isControlled ? currentPage! : internalPage;\n const activePageSize = isControlled ? pageSize! : internalPageSize;\n\n const paginatedData = isControlled ? data : data.slice((activePage - 1) * activePageSize, activePage * activePageSize);\n\n const effectiveTotalPages = isControlled\n ? totalPages!\n : Math.ceil(data.length / activePageSize);\n\n const handlePageChange = (newPage: number) => {\n if (newPage < 1 || newPage > effectiveTotalPages) return;\n if (isControlled) onPageChange?.(newPage);\n else setInternalPage(newPage);\n };\n\n const handlePageSizeChange = (newSize: number) => {\n if (isControlled) {\n onPageSizeChange?.(newSize);\n onPageChange?.(1);\n } else {\n setInternalPageSize(newSize);\n setInternalPage(1);\n }\n };\n\n const getPageNumbers = () => {\n const pages = [];\n const maxPages = effectiveTotalPages;\n const current = activePage;\n const half = Math.floor(visiblePageNumbers / 2);\n\n let startPage = Math.max(1, current - half);\n let endPage = Math.min(maxPages, current + half);\n\n if (endPage - startPage + 1 < visiblePageNumbers) {\n if (startPage === 1) {\n endPage = Math.min(maxPages, startPage + visiblePageNumbers - 1);\n } else if (endPage === maxPages) {\n startPage = Math.max(1, maxPages - visiblePageNumbers + 1);\n }\n }\n\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n\n const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!rowIdentifier) {\n console.warn(\"`rowIdentifier` prop is required for row selection.\");\n return;\n }\n\n if (event.target.checked) {\n const newSelecteds = [...selectedRows];\n paginatedData.forEach(row => {\n const rowId = row[rowIdentifier] as any;\n if (!newSelecteds.some(selectedRow => (selectedRow as any)[rowIdentifier] === rowId)) {\n newSelecteds.push(row);\n }\n });\n setSelectedRows(newSelecteds);\n } else {\n const newSelecteds = selectedRows.filter(selectedRow =>\n !paginatedData.some(row => (row as any)[rowIdentifier] === (selectedRow as any)[rowIdentifier])\n );\n setSelectedRows(newSelecteds);\n }\n };\n\n const handleRowClick = (_event: React.MouseEvent<unknown>, row: T) => {\n if (!rowIdentifier) {\n console.warn(\"`rowIdentifier` prop is required for row selection.\");\n return;\n }\n\n const rowId = row[rowIdentifier] as any;\n const selectedIndex = selectedRows.findIndex(selectedRow => (selectedRow as any)[rowIdentifier] === rowId);\n let newSelected: T[] = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selectedRows, row);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selectedRows.slice(1));\n } else if (selectedIndex === selectedRows.length - 1) {\n newSelected = newSelected.concat(selectedRows.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selectedRows.slice(0, selectedIndex),\n selectedRows.slice(selectedIndex + 1),\n );\n }\n setSelectedRows(newSelected);\n };\n\n const isSelected = (row: T) => {\n if (!rowIdentifier) return false;\n return selectedRows.some(selectedRow => (selectedRow as any)[rowIdentifier] === (row as any)[rowIdentifier]);\n };\n\n const numSelectedOnPage = paginatedData.filter(isSelected).length;\n const isAllSelectedOnPage = paginatedData.length > 0 && numSelectedOnPage === paginatedData.length;\n const isIndeterminateOnPage = numSelectedOnPage > 0 && numSelectedOnPage < paginatedData.length;\n\n return (\n <TableContainer >\n\n <MuiTable sx={{ minWidth: 650 }} aria-label=\"custom table\" style={ paginatedData.length === 0 ? { display: 'none' } : {} }>\n {/* Table Header */}\n {/* Sin colores propios: la cabecera y las filas las pinta el theme del\n consumidor (MuiTableCell.head / MuiTableRow), que es donde vive el\n sistema visual. Hardcodear acá le ganaba al theme por ser `sx`. */}\n <TableHead>\n <TableRow>\n {enableRowSelection && (\n <TableCell padding=\"checkbox\" sx={{ width: '50px' }}> {/* Puedes ajustar este ancho fijo si lo deseas */}\n <Checkbox\n color=\"primary\"\n indeterminate={isIndeterminateOnPage}\n checked={isAllSelectedOnPage}\n onChange={handleSelectAllClick}\n inputProps={{ 'aria-label': 'select all desserts' }}\n />\n </TableCell>\n )}\n {columns.map((column, index) => (\n <TableCell\n key={index}\n sx={{\n width: column.props.width || 'auto', // APLICA EL ANCHO AQUÍ\n whiteSpace: 'nowrap', // Evita que el texto se ajuste si la columna es pequeña\n }}\n >\n <Typography variant=\"inherit\" component=\"span\">\n {column.props.name}\n </Typography>\n </TableCell>\n ))}\n </TableRow>\n </TableHead>\n {/* Table Body */}\n <TableBody sx={{ borderRadius: '10px', overflow: 'hidden' }}>\n {paginatedData.map((row, rowIndex) => {\n const isRowSelected = enableRowSelection && isSelected(row);\n return (\n <TableRow\n key={rowIndex}\n hover\n sx={{ '&:last-child td, &:last-child th': { border: 0 } }}\n selected={isRowSelected}\n >\n {enableRowSelection && (\n <TableCell padding=\"checkbox\" sx={{ width: '50px' }}> {/* Mismo ancho para la celda de la fila */}\n <Checkbox\n color=\"primary\"\n checked={isRowSelected}\n onClick={(event) => handleRowClick(event, row)}\n inputProps={{ 'aria-labelledby': `table-checkbox-${rowIndex}` }}\n />\n </TableCell>\n )}\n {columns.map((column, colIndex) => {\n const { field, children: cellRenderer } = column.props;\n\n let fieldData: Partial<T>;\n\n if (Array.isArray(field)) {\n if(field.length === 0){\n fieldData = {...row};\n }else{\n fieldData = (field as Array<keyof T>).reduce((acc, currentField) => {\n (acc as any)[currentField] = (row as any)[currentField];\n return acc;\n }, {} as Partial<T>);\n }\n\n } else {\n fieldData = { [field]: (row as any)[field] } as Partial<T>;\n }\n\n return (\n <TableCell\n key={colIndex}\n sx={{\n // Solo layout de columna. Tamaño, padding y regla de fila\n // son del theme del consumidor (MuiTableCell).\n width: column.props.width || 'auto', // APLICA EL ANCHO AQUÍ TAMBIÉN\n whiteSpace: 'nowrap', // Asegura que el contenido no se rompa prematuramente\n }}\n >\n {cellRenderer(fieldData)}\n </TableCell>\n );\n })}\n </TableRow>\n );\n })}\n {/* Empty table message */}\n \n </TableBody>\n </MuiTable>\n\n { paginatedData.length === 0 && (\n <Box display=\"flex\" flexDirection=\"column\" alignItems=\"center\" justifyContent=\"center\" p={4} > \n { emptyImageSrc }\n\n <Typography variant=\"body2\" color=\"#878E9A\" fontSize=\"18px\" fontWeight=\"600\">\n {emptyTitle || 'No hay datos disponibles para mostrar.'}\n </Typography>\n <Typography variant=\"body2\" color=\"#878E9A\" fontSize=\"14px\" mt={1}> \n {emptyMessage || 'Intente ajustar sus filtros o agregar nuevos datos.'}\n </Typography>\n\n </Box>\n )\n }\n\n {/* Pagination and Export Controls */}\n {(effectiveTotalPages > 0 || enableCSVExport || enableExcelExport || (enableRowSelection && selectedRows.length > 0)) && (\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" p={2}>\n {/* Page Size Selector (Left) */}\n {(effectiveTotalPages > 0 && showPageSizeSelector) && (\n <Select\n size=\"small\"\n value={activePageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n >\n {[1, 2, 3, 5, 10, 20, 50, 100].map((size) => (\n <MenuItem key={size} value={size}>\n Mostrar {size}\n </MenuItem>\n ))}\n </Select>\n )}\n\n {/* Pagination Controls (Center) */}\n {effectiveTotalPages > 0 && (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={0.5}\n sx={{ flexGrow: 1, justifyContent: 'center' }}\n >\n <IconButton\n onClick={() => handlePageChange(1)}\n disabled={activePage <= 1}\n size=\"small\"\n color=\"primary\"\n >\n <FirstPageIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n onClick={() => handlePageChange(activePage - 1)}\n disabled={activePage <= 1}\n size=\"small\"\n color=\"primary\"\n >\n <KeyboardArrowLeftIcon fontSize=\"small\" />\n </IconButton>\n\n {pageNumbers.map((pageNumber) => (\n <Button\n key={pageNumber}\n onClick={() => handlePageChange(pageNumber)}\n variant={activePage === pageNumber ? 'contained' : 'text'}\n size=\"small\"\n sx={{ minWidth: '32px', height: '32px' }}\n >\n {pageNumber}\n </Button>\n ))}\n\n <IconButton\n onClick={() => handlePageChange(activePage + 1)}\n disabled={activePage >= effectiveTotalPages}\n size=\"small\"\n color=\"primary\"\n >\n <KeyboardArrowRightIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n onClick={() => handlePageChange(effectiveTotalPages)}\n disabled={activePage >= effectiveTotalPages}\n size=\"small\"\n color=\"primary\"\n >\n <LastPageIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n )}\n\n {enableRowSelection && selectedRows.length > 0 && (\n <Typography variant=\"subtitle2\" sx={{ mr: 2 }}>\n {selectedRows.length} seleccionados\n </Typography>\n )}\n\n {(enableCSVExport || enableExcelExport) && (\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\n {enableCSVExport && (\n <Button\n variant=\"text\"\n color=\"primary\"\n onClick={() =>\n exportToCSV({\n data,\n columns,\n fileName: csvExportFileName,\n exportColumns: csvExportColumns,\n setSnackbarOpen,\n setSnackbarMessage,\n setSnackbarSeverity,\n })\n }\n size=\"small\"\n startIcon={<DownloadOutlinedIcon />}\n >\n {csvExportButtonText}\n </Button>\n )}\n {enableExcelExport && (\n <Button\n variant=\"text\"\n color=\"primary\"\n onClick={() =>\n exportToExcel({\n data,\n columns,\n fileName: excelExportFileName,\n exportColumns: excelExportColumns,\n setSnackbarOpen,\n setSnackbarMessage,\n setSnackbarSeverity,\n })\n }\n size=\"small\"\n startIcon={<DownloadOutlinedIcon />}\n >\n {excelExportButtonText}\n </Button>\n )}\n </Box>\n )}\n </Box>\n )}\n\n <Snackbar open={snackbarOpen} autoHideDuration={3000} onClose={handleSnackbarClose} anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}>\n <Alert onClose={handleSnackbarClose} severity={snackbarSeverity} sx={{ width: '100%' }}>\n {snackbarMessage}\n </Alert>\n </Snackbar>\n </TableContainer>\n );\n}\n\nexport default Table;"],"names":["React","Alert","MuiTable"],"mappings":"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"}
|
package/Tooltip-BB77JBcg.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip-BB77JBcg.js","sources":["../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import React from 'react';\nimport MuiTooltip from '@mui/material/Tooltip'; \nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport { SxProps, Theme } from '@mui/material';\n\n/**\n * Propiedades del componente Tooltip.\n * @param {string} text - El texto a mostrar dentro del Tooltip.\n * @param {number} [maxWidth] - El ancho máximo opcional del Tooltip en píxeles.\n * @param {React.ReactNode} children - El elemento al que se le aplicará el Tooltip.\n * @param {SxProps<Theme>} [sx] - Estilos opcionales para el Box contenedor.\n */\ninterface TooltipProps {\n text: string;\n maxWidth?: number;\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * Componente Tooltip reutilizable.\n * Muestra un texto al pasar el ratón sobre su elemento hijo, \n * permitiendo un ancho máximo configurable.\n * * @param {TooltipProps} props - Propiedades del Tooltip.\n */\nconst Tooltip: React.FC<TooltipProps> = ({ text, maxWidth, children, sx }) => {\n \n const tooltipContentStyle: SxProps<Theme> = {\n \n ...(maxWidth && { maxWidth: maxWidth }), \n padding: '4px 8px', \n textAlign: 'center',\n \n };\n\n return (\n \n <MuiTooltip\n title={\n \n <Typography variant=\"caption\" component=\"span\" sx={tooltipContentStyle}>\n {text}\n </Typography>\n }\n \n placement=\"top\" \n arrow \n >\n \n <Box component=\"span\" sx={{ display: 'inline-block', ...sx }}>\n {children}\n </Box>\n </MuiTooltip>\n );\n};\n\nexport default Tooltip;"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAM,UAAkC,CAAC,EAAE,MAAM,UAAU,UAAU,SAAS;AAE5E,QAAM,sBAAsC,iCAEtC,YAAY,EAAE,SAAA,IAFwB;AAAA,IAG1C,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAIb,SAEE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,2BAEG,YAAA,EAAW,SAAQ,WAAU,WAAU,QAAO,IAAI,qBAChD,UAAA,KAAA,CACH;AAAA,MAGF,WAAU;AAAA,MACV,OAAK;AAAA,MAGL,UAAA,oBAAC,KAAA,EAAI,WAAU,QAAO,IAAI,iBAAE,SAAS,kBAAmB,KACrD,SAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
package/Tooltip-DpAsWGpN.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip-DpAsWGpN.cjs","sources":["../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import React from 'react';\nimport MuiTooltip from '@mui/material/Tooltip'; \nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport { SxProps, Theme } from '@mui/material';\n\n/**\n * Propiedades del componente Tooltip.\n * @param {string} text - El texto a mostrar dentro del Tooltip.\n * @param {number} [maxWidth] - El ancho máximo opcional del Tooltip en píxeles.\n * @param {React.ReactNode} children - El elemento al que se le aplicará el Tooltip.\n * @param {SxProps<Theme>} [sx] - Estilos opcionales para el Box contenedor.\n */\ninterface TooltipProps {\n text: string;\n maxWidth?: number;\n children: React.ReactNode;\n sx?: SxProps<Theme>;\n}\n\n/**\n * Componente Tooltip reutilizable.\n * Muestra un texto al pasar el ratón sobre su elemento hijo, \n * permitiendo un ancho máximo configurable.\n * * @param {TooltipProps} props - Propiedades del Tooltip.\n */\nconst Tooltip: React.FC<TooltipProps> = ({ text, maxWidth, children, sx }) => {\n \n const tooltipContentStyle: SxProps<Theme> = {\n \n ...(maxWidth && { maxWidth: maxWidth }), \n padding: '4px 8px', \n textAlign: 'center',\n \n };\n\n return (\n \n <MuiTooltip\n title={\n \n <Typography variant=\"caption\" component=\"span\" sx={tooltipContentStyle}>\n {text}\n </Typography>\n }\n \n placement=\"top\" \n arrow \n >\n \n <Box component=\"span\" sx={{ display: 'inline-block', ...sx }}>\n {children}\n </Box>\n </MuiTooltip>\n );\n};\n\nexport default Tooltip;"],"names":["jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAM,UAAkC,CAAC,EAAE,MAAM,UAAU,UAAU,SAAS;AAE5E,QAAM,sBAAsC,iCAEtC,YAAY,EAAE,SAAA,IAFwB;AAAA,IAG1C,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAIb,SAEEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,sCAEG,YAAA,EAAW,SAAQ,WAAU,WAAU,QAAO,IAAI,qBAChD,UAAA,KAAA,CACH;AAAA,MAGF,WAAU;AAAA,MACV,OAAK;AAAA,MAGL,UAAAA,2BAAAA,IAAC,KAAA,EAAI,WAAU,QAAO,IAAI,iBAAE,SAAS,kBAAmB,KACrD,SAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;;"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export declare const SimpleAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\nimport { Box, Typography } from '@mui/material';\n\nconst options = [\n { value: '10', label: '10' },\n { value: '25', label: '25' },\n];\n\nexport const SimpleExample = () => {\n const [value, setValue] = useState(options[1]);\n\n return (\n <Box sx={{ width: 250 }}>\n <Autocomplete\n label=\"Registros por p\u00E1gina\"\n options={options}\n value={value}\n onChange={(val) => {\n setValue(val as string);\n }}\n />\n <Typography sx={{ mt: 2 }}>\n Valor: {value}\n </Typography>\n </Box>\n );\n};\n";
|
|
2
|
-
export declare const WithPlaceholderAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\nimport { Box, Typography } from '@mui/material';\n\nexport const WithPlaceholderExample = () => {\n const [value, setValue] = useState(null);\n\n return (\n <Box sx={{ width: 300 }}>\n <Autocomplete\n label=\"Seleccione una opci\u00F3n\"\n options={[]}\n value={value}\n onChange={(val) => {\n setValue(val as string);\n }}\n placeholder=\"Ninguna opci\u00F3n seleccionada\"\n />\n <Typography sx={{ mt: 2 }}>\n {value || 'Ninguno'}\n </Typography>\n </Box>\n );\n};\n";
|
|
3
|
-
export declare const MultipleAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\nimport { Box } from '@mui/material';\n\nconst options = [\n { value: 'pending', label: 'Pendiente' },\n { value: 'approved', label: 'Aprobado' },\n];\n\nexport const MultipleExample = () => {\n const [value, setValue] = useState([]);\n\n return (\n <Box sx={{ width: 400 }}>\n <Autocomplete\n multiple\n options={options}\n value={value}\n onChange={(val) => {\n setValue(val as string[]);\n }}\n />\n </Box>\n );\n};\n";
|
|
4
|
-
export declare const MultipleWithLimitAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\n\nexport const MultipleWithLimitExample = () => {\n const [value, setValue] = useState([]);\n\n return (\n <Autocomplete\n multiple\n maxChipsToShow={2}\n options={[]}\n value={value}\n onChange={(val) => {\n setValue(val as string[]);\n }}\n />\n );\n};\n";
|
|
5
|
-
export declare const CustomRenderOptionAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\nimport { Avatar, Box } from '@mui/material';\n\nconst users = [\n { value: 'admin', label: 'Administrador', img: '...' },\n];\n\nexport const CustomRenderExample = () => {\n const [value, setValue] = useState([]);\n\n return (\n <Autocomplete\n multiple\n options={users}\n value={value}\n onChange={(val) => {\n setValue(val as string[]);\n }}\n renderOptionItem={(item) => (\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Avatar src={item.img} />\n {item.label}\n </Box>\n )}\n />\n );\n};\n";
|
|
6
|
-
export declare const CustomChipRenderAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\nimport { Typography } from '@mui/material';\n\nexport const CustomChipExample = () => {\n const [value, setValue] = useState([]);\n\n return (\n <Autocomplete\n multiple\n options={[]}\n value={value}\n onChange={(val) => {\n setValue(val as string[]);\n }}\n renderChipLabel={(item) => (\n <Typography variant=\"caption\">\n {item.label.charAt(0)}\n </Typography>\n )}\n />\n );\n};\n";
|
|
7
|
-
export declare const LoadingAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\n\nexport const LoadingExample = () => {\n const [value, setValue] = useState(null);\n\n return (\n <Autocomplete\n loading\n options={[]}\n value={value}\n onChange={(val) => {\n\t\t\t\tsetValue(val as string);\n\t\t\t}}\n />\n );\n};\n";
|
|
8
|
-
export declare const EmptyOptionsAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\n\nexport const EmptyExample = () => {\n const [value, setValue] = useState(null);\n\n return (\n <Autocomplete\n options={[]}\n value={value}\n onChange={(val) => {\n\t\t\t\tsetValue(val as string);\n\t\t\t}}\n placeholder=\"No hay opciones\"\n />\n );\n};\n";
|
|
9
|
-
export declare const ManyOptionsAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\n\nconst options = Array.from({ length: 50 }, (_, i) => ({\n value: i,\n label: 'Opci\u00F3n ' + i,\n}));\n\nexport const ManyOptionsExample = () => {\n const [value, setValue] = useState(null);\n\n return (\n <Autocomplete\n options={options}\n value={value}\n onChange={(val) => {\n\t\t\t\tsetValue(val as string);\n\t\t\t}}\n />\n );\n};\n";
|
|
10
|
-
export declare const WithErrorAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\nimport { Box } from '@mui/material';\n\nconst options = [\n { value: '10', label: '10' },\n { value: '25', label: '25' },\n];\n\nexport const WithErrorExample = () => {\n const [value, setValue] = useState<string | null>(null);\n return (\n <Box sx={{ width: 300 }}>\n <Autocomplete\n label=\"Cantidad\"\n options={options}\n value={value}\n onChange={(val) => setValue(val as string | null)}\n error={!value}\n helperText={!value ? 'Debes seleccionar una cantidad' : ' '}\n />\n </Box>\n );\n};\n";
|
|
11
|
-
export declare const LabelPositionAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\nimport { Box, Stack } from '@mui/material';\n\nconst options = [\n { value: 'a', label: 'Opci\u00F3n A' },\n { value: 'b', label: 'Opci\u00F3n B' },\n];\n\nexport const LabelPositionExample = () => {\n const [a, setA] = useState<string | null>(null);\n const [b, setB] = useState<string | null>(null);\n return (\n <Stack spacing={3} sx={{ width: 320 }}>\n <Autocomplete\n label=\"Outside (default)\"\n labelPosition=\"outside\"\n options={options}\n value={a}\n onChange={(val) => setA(val as string | null)}\n />\n <Autocomplete\n label=\"Floating\"\n labelPosition=\"floating\"\n options={options}\n value={b}\n onChange={(val) => setB(val as string | null)}\n />\n </Stack>\n );\n};\n";
|
|
12
|
-
export declare const CustomBorderRadiusAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\nimport { Box, Stack } from '@mui/material';\n\nconst options = [\n { value: '10', label: '10' },\n { value: '25', label: '25' },\n];\n\nexport const CustomBorderRadiusExample = () => {\n const [a, setA] = useState<string | null>(null);\n const [b, setB] = useState<string | null>(null);\n const [c, setC] = useState<string | null>(null);\n return (\n <Stack spacing={2} sx={{ width: 300 }}>\n <Autocomplete label=\"0\" borderRadius={0} options={options} value={a} onChange={(v) => setA(v as string | null)} />\n <Autocomplete label=\"10 (default)\" borderRadius={10} options={options} value={b} onChange={(v) => setB(v as string | null)} />\n <Autocomplete label=\"24 (pill)\" borderRadius={24} options={options} value={c} onChange={(v) => setC(v as string | null)} />\n </Stack>\n );\n};\n";
|
|
13
|
-
export declare const EmptyWithPlaceholderAutocompleteDefinition = "\nimport React, { useState } from 'react';\nimport Autocomplete from './Autocomplete';\nimport { Box } from '@mui/material';\n\nconst options = [\n { value: 'mx', label: 'M\u00E9xico' },\n { value: 'co', label: 'Colombia' },\n { value: 'ar', label: 'Argentina' },\n];\n\nexport const EmptyWithPlaceholderExample = () => {\n const [value, setValue] = useState<string | null>(null);\n return (\n <Box sx={{ width: 300 }}>\n <Autocomplete\n label=\"Pa\u00EDs\"\n placeholder=\"Buscar pa\u00EDs...\"\n options={options}\n value={value}\n onChange={(val) => setValue(val as string | null)}\n />\n </Box>\n );\n};\n";
|
|
14
|
-
export declare const RHFAutocompleteDefinition = "\nimport React from 'react';\nimport { useForm } from 'react-hook-form';\nimport Autocomplete from './Autocomplete';\nimport { Box, Button, Stack } from '@mui/material';\n\nconst options = [\n { value: 'mx', label: 'M\u00E9xico' },\n { value: 'co', label: 'Colombia' },\n { value: 'ar', label: 'Argentina' },\n];\n\ntype FormValues = { country: string | null };\n\nexport const RHFExample = () => {\n const { control, handleSubmit, watch } = useForm<FormValues>({\n defaultValues: { country: null },\n });\n\n return (\n <Box component=\"form\" onSubmit={handleSubmit((data) => console.log(data))}>\n <Stack spacing={2} sx={{ width: 320 }}>\n <Autocomplete\n name=\"country\"\n control={control}\n validation={{ required: 'Campo requerido' }}\n label=\"Pa\u00EDs\"\n placeholder=\"Seleccione...\"\n options={options}\n />\n <Button type=\"submit\" variant=\"contained\">Guardar</Button>\n <Box>Valor actual: {JSON.stringify(watch('country'))}</Box>\n </Stack>\n </Box>\n );\n};\n";
|
|
15
|
-
export declare const AsyncServiceAutocompleteDefinition: string;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare const DefaultAvatarDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const DefaultAvatarExample = () => (\n <Avatar\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=1' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=2' },\n ]}\n />\n);\n";
|
|
2
|
-
export declare const WithTypeAndTextDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const WithTypeAndTextExample = () => (\n <Avatar\n type=\"Owner\"\n items={[{ text: 'Maria', imageUrl: 'https://i.pravatar.cc/150?img=5' }]}\n showText\n />\n);\n";
|
|
3
|
-
export declare const WithBadgesAndTooltipDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const WithBadgesAndTooltipExample = () => (\n <Avatar\n showTooltip\n items={[\n { text: 'John D.', badge: 'JD', backgroundColor: '#EF5350', color: '#fff' },\n { text: 'Alice B.', badge: 'AB', backgroundColor: '#AB47BC', color: '#fff' },\n ]}\n />\n);\n";
|
|
4
|
-
export declare const SizeSmallDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const SizeSmallExample = () => (\n <Avatar\n size=\"sm\"\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=11' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=12' },\n { text: 'User Three', imageUrl: 'https://i.pravatar.cc/150?img=13' },\n ]}\n />\n);\n";
|
|
5
|
-
export declare const SizeMediumDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const SizeMediumExample = () => (\n <Avatar\n size=\"md\"\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=21' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=22' },\n { text: 'User Three', imageUrl: 'https://i.pravatar.cc/150?img=23' },\n ]}\n />\n);\n";
|
|
6
|
-
export declare const SizeLargeDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const SizeLargeExample = () => (\n <Avatar\n size=\"lg\"\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=31' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=32' },\n ]}\n />\n);\n";
|
|
7
|
-
export declare const SizeExtraLargeDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const SizeExtraLargeExample = () => (\n <Avatar\n size=\"xl\"\n items={[{ text: 'Maria', imageUrl: 'https://i.pravatar.cc/150?img=5' }]}\n showText={false}\n />\n);\n";
|
|
8
|
-
export declare const NumericSizeDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const NumericSizeExample = () => (\n <Avatar\n size={72}\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=41' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=42' },\n ]}\n showText={false}\n />\n);\n";
|
|
9
|
-
export declare const FallbackIconDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const FallbackIconExample = () => (\n <Avatar\n items={[\n { text: 'Without image' },\n { text: 'Broken image', imageUrl: 'https://example.invalid/broken.png' },\n ]}\n showTooltip\n />\n);\n";
|
|
10
|
-
export declare const DisplayedAvatarsLimitDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const DisplayedAvatarsLimitExample = () => (\n <Avatar\n displayedAvatars={3}\n items={[\n { text: 'User 1', imageUrl: 'https://i.pravatar.cc/150?img=51' },\n { text: 'User 2', imageUrl: 'https://i.pravatar.cc/150?img=52' },\n { text: 'User 3', imageUrl: 'https://i.pravatar.cc/150?img=53' },\n { text: 'User 4', imageUrl: 'https://i.pravatar.cc/150?img=54' },\n { text: 'User 5', imageUrl: 'https://i.pravatar.cc/150?img=55' },\n ]}\n />\n);\n";
|
|
11
|
-
export declare const CustomStylingDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const CustomStylingExample = () => (\n <Avatar\n size=\"md\"\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=61' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=62' },\n ]}\n sx={{\n p: 1,\n borderRadius: 2,\n bgcolor: 'action.hover',\n }}\n avatarSx={{\n border: (theme) => '3px solid ' + theme.palette.primary.main,\n }}\n />\n);\n";
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare const DefaultButtonDefinition = "\n<Button variant=\"text\">\n Button\n</Button>\n";
|
|
2
|
-
export declare const OutlinedButtonDefinition = "\n<Button variant=\"outlined\">\n Button\n</Button>\n";
|
|
3
|
-
export declare const ContainedButtonDefinition = "\n<Button variant=\"contained\">\n Button\n</Button>\n";
|
|
4
|
-
export declare const WithStartIconButtonDefinition = "\n<Button\n data-testid=\"button\"\n startIcon={<NotificationsIcon/>}\n variant=\"contained\"\n>\n Button\n</Button>\n";
|
|
5
|
-
export declare const WithEndIconButtonDefinition = "\n<Button\n data-testid=\"button\"\n endIcon={<NotificationsIcon/>}\n variant=\"contained\"\n>\n Button\n</Button>\n";
|
|
6
|
-
export declare const WithSmallSizeButtonDefinition = "\n<Button\n data-testid=\"button\"\n size=\"small\"\n variant=\"contained\"\n>\n Button\n</Button>\n";
|
|
7
|
-
export declare const WithLargeSizeButtonDefinition = "\n<Button\n data-testid=\"button\"\n size=\"large\"\n variant=\"contained\"\n>\n Button\n</Button>\n";
|
|
8
|
-
export declare const DisabledStateButtonDefinition = "\n<Button\n data-testid=\"button\"\n disabled\n variant=\"contained\"\n>\n Button\n</Button>";
|
|
9
|
-
export declare const LoadingButtonDefinition = "\n<Button\n data-testid=\"button\"\n loading\n variant=\"contained\"\n>\n Button\n</Button>\n";
|
|
10
|
-
export declare const LoadingIndicatorStartButtonDefinition = "\n<Button\n data-testid=\"button\"\n loading\n loadingPosition=\"start\"\n variant=\"contained\"\n>\n Button\n</Button>\n";
|
|
11
|
-
export declare const LoadingIndicatorEndButtonDefinition = "\n<Button\n data-testid=\"button\"\n loading\n loadingPosition=\"end\"\n variant=\"contained\"\n>\n Button\n</Button>";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const DefaultCardDefinition = "\n<Card>\n Card\n</Card>\n";
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export declare const BasicChipDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Box, Typography } from '@mui/material';\n\nexport const BasicChipExample = () => {\n return (\n <Chip label=\"Etiqueta B\u00E1sica\" />\n );\n};\n";
|
|
2
|
-
export declare const ClickableChipDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Box, Typography } from '@mui/material';\n\nexport const ClickableChipExample = () => {\n const handleClick = () => {\n alert('Chip clickeado!');\n };\n return (\n <Chip label=\"Clickeable\" onClick={handleClick} />\n );\n};\n";
|
|
3
|
-
export declare const DeletableChipDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Box, Typography } from '@mui/material';\nimport DeleteIcon from '@mui/icons-material/Delete';\n\nexport const DeletableChipExample = () => {\n const handleDelete = () => {\n alert('Chip borrado!');\n };\n return (\n <Chip label=\"Borrable\" onDelete={handleDelete} deleteIcon={<DeleteIcon />} />\n );\n};\n";
|
|
4
|
-
export declare const ChipWithAvatarDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Avatar, Box, Typography } from '@mui/material';\n\nexport const ChipWithAvatarExample = () => {\n return (\n <Chip\n label=\"Con Avatar\"\n avatar={<Avatar alt=\"Avatar\" src=\"https://placehold.co/40x40/FF7F50/FFFFFF?text=A\" />}\n />\n );\n};\n";
|
|
5
|
-
export declare const ChipWithIconDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Box, Typography } from '@mui/material';\nimport FaceIcon from '@mui/icons-material/Face';\n\nexport const ChipWithIconExample = () => {\n return (\n <Chip label=\"Con Icono\" icon={<FaceIcon />} />\n );\n};\n";
|
|
6
|
-
export declare const DisabledChipDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Box, Typography } from '@mui/material';\n\nexport const DisabledChipExample = () => {\n return (\n <Box sx={{ display: 'flex', gap: 2 }}>\n <Chip label=\"Deshabilitado\" disabled />\n <Chip label=\"Deshabilitado Borrable\" onDelete={() => {}} disabled />\n </Box>\n );\n};\n";
|
|
7
|
-
export declare const ChipVariantsDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Box, Typography } from '@mui/material';\n\nexport const ChipVariantsExample = () => {\n return (\n <Box sx={{ display: 'flex', gap: 2 }}>\n <Chip label=\"Filled (Default)\" />\n <Chip label=\"Outlined\" variant=\"outlined\" />\n </Box>\n );\n};\n";
|
|
8
|
-
export declare const ChipColorsDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Box, Typography } from '@mui/material';\n\nexport const ChipColorsExample = () => {\n return (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 2 }}>\n <Chip label=\"Default\" />\n <Chip label=\"Primary\" color=\"primary\" />\n <Chip label=\"Secondary\" color=\"secondary\" />\n <Chip label=\"Error\" color=\"error\" />\n <Chip label=\"Info\" color=\"info\" />\n <Chip label=\"Success\" color=\"success\" />\n <Chip label=\"Warning\" color=\"warning\" />\n <Chip label=\"Primary Outlined\" color=\"primary\" variant=\"outlined\" />\n <Chip label=\"Success Outlined\" color=\"success\" variant=\"outlined\" />\n </Box>\n );\n};\n";
|
|
9
|
-
export declare const ChipSizesDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Box, Typography } from '@mui/material';\n\nexport const ChipSizesExample = () => {\n return (\n <Box sx={{ display: 'flex', gap: 2, alignItems: 'center' }}>\n <Chip label=\"Peque\u00F1o\" size=\"small\" />\n <Chip label=\"Mediano (Default)\" size=\"medium\" />\n </Box>\n );\n};\n";
|
|
10
|
-
export declare const CustomContentChipDefinition = "\nimport React from 'react';\nimport { Chip } from './Chip'; // Ajusta la ruta si es necesario\nimport { Box, Typography, Avatar } from '@mui/material';\nimport CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline';\n\nexport const CustomContentChipExample = () => {\n const handleClick = () => alert('Perfil visto!');\n const handleDelete = () => alert('Perfil eliminado!');\n\n return (\n <Chip\n avatar={<Avatar src=\"https://placehold.co/40x40/87CEEB/FFFFFF?text=PR\" />}\n label={\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CheckCircleOutlineIcon sx={{ fontSize: 16 }} />\n <Typography variant=\"body2\" sx={{ fontWeight: 'bold' }}>Perfil Completo</Typography>\n </Box>\n }\n onDelete={handleDelete}\n onClick={handleClick}\n color=\"info\"\n variant=\"outlined\"\n />\n );\n};\n";
|