@grafosoft/excel-validator 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -85,7 +85,7 @@ function ExcelLayout({ initData, jsonValidator, isBalances = false, }) {
|
|
|
85
85
|
const [currentPage, setCurrentPage] = (0, react_1.useState)(1);
|
|
86
86
|
const [focusTarget, setFocusTarget] = (0, react_1.useState)(null);
|
|
87
87
|
const [fetchCatalogsByUrl, setFetchCatalogsByUrl] = (0, react_1.useState)({});
|
|
88
|
-
const [
|
|
88
|
+
const [stringEmptyCatalogsByUrl, setStringEmptyCatalogsByUrl] = (0, react_1.useState)({});
|
|
89
89
|
(0, react_1.useEffect)(() => {
|
|
90
90
|
let isCancelled = false;
|
|
91
91
|
const fetchRules = resolvedJsonValidator.filter((item) => typeof item === "object" &&
|
|
@@ -136,13 +136,9 @@ function ExcelLayout({ initData, jsonValidator, isBalances = false, }) {
|
|
|
136
136
|
.filter((row) => { var _a, _b; return ((_b = (_a = row[0]) === null || _a === void 0 ? void 0 : _a.toString().trim()) !== null && _b !== void 0 ? _b : "") !== ""; });
|
|
137
137
|
const queryUrls = new Set();
|
|
138
138
|
stringEmptyRules.forEach(({ item, index }) => {
|
|
139
|
-
filteredRows.
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if (cellValue !== "") {
|
|
143
|
-
queryUrls.add(`${item.url}&${encodeURIComponent(item.prop)}=${encodeURIComponent(cellValue)}`);
|
|
144
|
-
}
|
|
145
|
-
});
|
|
139
|
+
if (filteredRows.some((row) => { var _a; return String((_a = row[index]) !== null && _a !== void 0 ? _a : "").trim() !== ""; })) {
|
|
140
|
+
queryUrls.add(item.url);
|
|
141
|
+
}
|
|
146
142
|
});
|
|
147
143
|
if (queryUrls.size === 0) {
|
|
148
144
|
return;
|
|
@@ -165,7 +161,7 @@ function ExcelLayout({ initData, jsonValidator, isBalances = false, }) {
|
|
|
165
161
|
}
|
|
166
162
|
}));
|
|
167
163
|
if (!isCancelled) {
|
|
168
|
-
|
|
164
|
+
setStringEmptyCatalogsByUrl((prev) => (Object.assign(Object.assign({}, prev), Object.fromEntries(entries))));
|
|
169
165
|
}
|
|
170
166
|
};
|
|
171
167
|
void loadStringEmptyResults();
|
|
@@ -394,12 +390,14 @@ function ExcelLayout({ initData, jsonValidator, isBalances = false, }) {
|
|
|
394
390
|
return validationResult;
|
|
395
391
|
}
|
|
396
392
|
}
|
|
397
|
-
const
|
|
398
|
-
|
|
399
|
-
if (queryResult === undefined) {
|
|
393
|
+
const catalog = stringEmptyCatalogsByUrl[rule.url];
|
|
394
|
+
if (catalog === undefined) {
|
|
400
395
|
return { valid: true, message: "" };
|
|
401
396
|
}
|
|
402
|
-
const alreadyExists =
|
|
397
|
+
const alreadyExists = catalog.some((catalogItem) => {
|
|
398
|
+
const propValue = catalogItem[rule.prop];
|
|
399
|
+
return String(propValue !== null && propValue !== void 0 ? propValue : "").trim() === trimmedValue;
|
|
400
|
+
});
|
|
403
401
|
return {
|
|
404
402
|
valid: !alreadyExists,
|
|
405
403
|
message: alreadyExists
|
|
@@ -429,7 +427,7 @@ function ExcelLayout({ initData, jsonValidator, isBalances = false, }) {
|
|
|
429
427
|
matrix,
|
|
430
428
|
resolvedJsonValidator,
|
|
431
429
|
fetchCatalogsByUrl,
|
|
432
|
-
|
|
430
|
+
stringEmptyCatalogsByUrl,
|
|
433
431
|
]);
|
|
434
432
|
const hasBalanceDifference = (0, react_1.useMemo)(() => {
|
|
435
433
|
var _a;
|
|
@@ -51,7 +51,7 @@ const ExcelPreview = ({ initData, fileContent, matrix, error, validationErrors,
|
|
|
51
51
|
targetCell.focus();
|
|
52
52
|
});
|
|
53
53
|
}, [focusTarget, effectivePage]);
|
|
54
|
-
return ((0, jsx_runtime_1.jsxs)("section", { className: "h-full bg-gray-50 dark:bg-content1 border-l border-default-200 px-4 py-2", children: [!fileContent ? ((0, jsx_runtime_1.jsx)(react_1.Alert, { color: "primary", title: `Al importar ${initData.title} verás una previsualización de su contenido.`, className: "my-3", radius: "sm", hideIconWrapper: true, variant: "faded" })) : null, fileContent && matrix.length === 0 && !error ? ((0, jsx_runtime_1.jsx)(react_1.Alert, { color: "danger", title: `No se encontraron datos en el archivo seleccionado.`, className: "my-3", radius: "sm", hideIconWrapper: true, variant: "faded" })) : null, fileContent && matrix.length > 0 ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "mt-4 max-h-[
|
|
54
|
+
return ((0, jsx_runtime_1.jsxs)("section", { className: "h-full bg-gray-50 dark:bg-content1 border-l border-default-200 px-4 py-2", children: [!fileContent ? ((0, jsx_runtime_1.jsx)(react_1.Alert, { color: "primary", title: `Al importar ${initData.title} verás una previsualización de su contenido.`, className: "my-3", radius: "sm", hideIconWrapper: true, variant: "faded" })) : null, fileContent && matrix.length === 0 && !error ? ((0, jsx_runtime_1.jsx)(react_1.Alert, { color: "danger", title: `No se encontraron datos en el archivo seleccionado.`, className: "my-3", radius: "sm", hideIconWrapper: true, variant: "faded" })) : null, fileContent && matrix.length > 0 ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "mt-4 max-h-[85vh] max-w-full overflow-x-auto overflow-y-auto ", children: (0, jsx_runtime_1.jsxs)("table", { className: "min-w-max w-full text-sm", children: [(0, jsx_runtime_1.jsx)("thead", { className: "sticky top-0 bg-default-100", children: (0, jsx_runtime_1.jsx)("tr", { children: Array.from({ length: maxColumns }).map((_, columnIndex) => ((0, jsx_runtime_1.jsx)("th", { className: "border-x border-t border-default-200 p-3 font-semibold text-default-700", children: tableHeaders[columnIndex] ||
|
|
55
55
|
`Columna ${columnIndex + 1}` }, `header-${columnIndex}`))) }) }), (0, jsx_runtime_1.jsx)("tbody", { className: "bg-content1", children: dataRows.map((row, rowIndex) => ((0, jsx_runtime_1.jsx)("tr", { children: Array.from({ length: maxColumns }).map((_, columnIndex) => (() => {
|
|
56
56
|
var _a, _b;
|
|
57
57
|
const absoluteRowIndex = startIndex + rowIndex;
|
|
@@ -63,6 +63,6 @@ const ExcelPreview = ({ initData, fileContent, matrix, error, validationErrors,
|
|
|
63
63
|
cellRefs.current[key] = element;
|
|
64
64
|
}, tabIndex: -1, className: `border border-default-200 p-3 align-top whitespace-nowrap outline-none transition-all duration-200 ease-in-out text-default-700
|
|
65
65
|
${isFocusedTarget ? "ring-[1.7px] ring-danger ring-inset" : ""}`, children: hasError ? ((0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between", children: [(0, jsx_runtime_1.jsx)("p", { children: (_a = row[columnIndex]) !== null && _a !== void 0 ? _a : "" }), (0, jsx_runtime_1.jsx)(tb_1.TbAlertCircle, { color: "red", size: 20 })] })) : ((0, jsx_runtime_1.jsx)("p", { children: (_b = row[columnIndex]) !== null && _b !== void 0 ? _b : "" })) }, `cell-${rowIndex}-${columnIndex}`));
|
|
66
|
-
})()) }, `row-${rowIndex}`))) })] }) }), totalRecords > rowsPerPage ? ((0, jsx_runtime_1.jsxs)("div", { className: "mt-4 flex items-center justify-between gap-3", children: [(0, jsx_runtime_1.jsxs)("p", { className: "text-sm text-default-600", children: ["Mostrando ", startIndex + 1, "-", Math.min(endIndex, totalRecords), " de", " ", totalRecords, " registros"] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(react_1.Button, { size: "sm", className: "text-sm border border-default-300 disabled:border-default-200 disabled:bg-default-100 disabled:text-default-500", variant: "bordered", disabled: effectivePage === 1, onPress: () => onPageChange(Math.max(1, effectivePage - 1)), isIconOnly: true, children: (0, jsx_runtime_1.jsx)(pi_1.PiCaretLeftBold, { size: 16 }) }), (0, jsx_runtime_1.jsxs)("span", { className: "text-sm text-default-700 mx-1", children: ["Pagina ", effectivePage, " de ", totalPages] }), (0, jsx_runtime_1.jsx)(react_1.Button, { size: "sm", className: "text-sm border border-default-300 disabled:border-default-200 disabled:bg-default-100 disabled:text-default-500", variant: "bordered", disabled: effectivePage === totalPages, onPress: () => onPageChange(Math.min(totalPages, effectivePage + 1)), isIconOnly: true, children: (0, jsx_runtime_1.jsx)(pi_1.PiCaretRightBold, { size: 16 }) })] })] })) : null, isBalances ? ((0, jsx_runtime_1.jsx)(BalanceTotals_1.BalanceTotals, { headers: tableHeaders, rows: allDataRows })) : null] })) : null] }));
|
|
66
|
+
})()) }, `row-${rowIndex}`))) })] }) }), totalRecords > rowsPerPage ? ((0, jsx_runtime_1.jsxs)("div", { className: "mt-4 flex items-center justify-between gap-3", children: [(0, jsx_runtime_1.jsxs)("p", { className: "text-sm text-default-600", children: ["Mostrando ", startIndex + 1, "-", Math.min(endIndex, totalRecords), " de", " ", totalRecords, " registros"] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(react_1.Button, { size: "sm", className: "text-sm border border-default-300 disabled:border-default-200 disabled:bg-default-100 disabled:text-default-500 dark:border-default-400 dark:text-default-700", variant: "bordered", disabled: effectivePage === 1, onPress: () => onPageChange(Math.max(1, effectivePage - 1)), isIconOnly: true, children: (0, jsx_runtime_1.jsx)(pi_1.PiCaretLeftBold, { size: 16 }) }), (0, jsx_runtime_1.jsxs)("span", { className: "text-sm text-default-700 mx-1", children: ["Pagina ", effectivePage, " de ", totalPages] }), (0, jsx_runtime_1.jsx)(react_1.Button, { size: "sm", className: "text-sm border border-default-300 disabled:border-default-200 disabled:bg-default-100 disabled:text-default-500 dark:border-default-400 dark:text-default-700", variant: "bordered", disabled: effectivePage === totalPages, onPress: () => onPageChange(Math.min(totalPages, effectivePage + 1)), isIconOnly: true, children: (0, jsx_runtime_1.jsx)(pi_1.PiCaretRightBold, { size: 16 }) })] })] })) : null, isBalances ? ((0, jsx_runtime_1.jsx)(BalanceTotals_1.BalanceTotals, { headers: tableHeaders, rows: allDataRows })) : null] })) : null] }));
|
|
67
67
|
};
|
|
68
68
|
exports.ExcelPreview = ExcelPreview;
|
|
@@ -59,7 +59,7 @@ const ExcelValidator = ({ initData, fileContent, matrix, validationErrors, onSel
|
|
|
59
59
|
}, 3000);
|
|
60
60
|
}
|
|
61
61
|
};
|
|
62
|
-
return ((0, jsx_runtime_1.jsxs)("section", { className: "mt-10 bg-content1 max-h-[calc(100vh-11.5rem)] overflow-y-auto pr-1", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex mb-3 justify-between items-center", children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-xl font-semibold text-default-700", children: "Validaciones" }), (0, jsx_runtime_1.jsx)(react_1.Chip, { color: validationErrors.length > 0 ? "danger" : "success", variant: "solid", className: "text-white", startContent: validationErrors.length > 0 ? ((0, jsx_runtime_1.jsx)(tb_1.TbAlertCircle, { size: 20 })) : ((0, jsx_runtime_1.jsx)(tb_1.TbCheck, { size: 20 })), children: (0, jsx_runtime_1.jsxs)("p", { className: "pl-1", children: [validationErrors.length, " ", validationErrors.length === 1
|
|
62
|
+
return ((0, jsx_runtime_1.jsxs)("section", { className: "mt-10 bg-content1 max-h-[calc(100vh-11.5rem)] overflow-y-auto pr-1", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex xl:flex-row lg:flex-col mb-3 justify-between items-center", children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-xl font-semibold text-default-700", children: "Validaciones" }), (0, jsx_runtime_1.jsx)(react_1.Chip, { color: validationErrors.length > 0 ? "danger" : "success", variant: "solid", className: "text-white", startContent: validationErrors.length > 0 ? ((0, jsx_runtime_1.jsx)(tb_1.TbAlertCircle, { size: 20 })) : ((0, jsx_runtime_1.jsx)(tb_1.TbCheck, { size: 20 })), children: (0, jsx_runtime_1.jsxs)("p", { className: "pl-1", children: [validationErrors.length, " ", validationErrors.length === 1
|
|
63
63
|
? "error encontrado"
|
|
64
64
|
: "errores encontrados"] }) })] }), hasBalanceDifference ? ((0, jsx_runtime_1.jsx)(react_1.Alert, { color: "danger", title: "Hay diferencias en los saldos iniciales", variant: "faded", hideIcon: true, startContent: (0, jsx_runtime_1.jsx)(tb_1.TbAlertCircle, { size: 30 }), className: "mb-3" })) : null, validationErrors.length === 0 && !hasBalanceDifference ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_1.Alert, { color: "success", title: "Sin errores de validaci\u00F3n.", variant: "faded", hideIcon: true, startContent: (0, jsx_runtime_1.jsx)(tb_1.TbCircleCheck, { size: 30 }) }), (0, jsx_runtime_1.jsx)(react_1.Button, { color: "success", className: "mt-4 w-full", variant: "flat", endContent: (0, jsx_runtime_1.jsx)(tb_1.TbUpload, { size: 20 }), radius: "sm", isLoading: isUploadingTemplate, onPress: handleTXTFormat, children: "Enviar Plantilla" }), uploadMessage ? ((0, jsx_runtime_1.jsx)("p", { className: `mt-2 text-sm ${uploadMessage.type === "success"
|
|
65
65
|
? "text-success-600"
|