0 vulnerability

This commit is contained in:
knuthtimo-lab 2026-01-01 16:17:14 +01:00
parent c9ebec3c2f
commit 7afc865a3f
3 changed files with 1348 additions and 261 deletions

1568
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,7 @@
"docker:backup": "docker compose exec db pg_dump -U postgres qrmaster > backup_$(date +%Y%m%d).sql" "docker:backup": "docker compose exec db pg_dump -U postgres qrmaster > backup_$(date +%Y%m%d).sql"
}, },
"dependencies": { "dependencies": {
"@auth/prisma-adapter": "^1.0.12", "@auth/prisma-adapter": "^2.11.1",
"@edge-runtime/cookies": "^6.0.0", "@edge-runtime/cookies": "^6.0.0",
"@prisma/client": "^5.7.0", "@prisma/client": "^5.7.0",
"@stripe/stripe-js": "^8.0.0", "@stripe/stripe-js": "^8.0.0",
@ -33,6 +33,7 @@
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"clsx": "^2.0.0", "clsx": "^2.0.0",
"dayjs": "^1.11.10", "dayjs": "^1.11.10",
"exceljs": "^4.4.0",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"i18next": "^23.7.6", "i18next": "^23.7.6",
"ioredis": "^5.3.2", "ioredis": "^5.3.2",
@ -55,7 +56,6 @@
"stripe": "^19.1.0", "stripe": "^19.1.0",
"tailwind-merge": "^2.2.0", "tailwind-merge": "^2.2.0",
"uuid": "^13.0.0", "uuid": "^13.0.0",
"xlsx": "^0.18.5",
"zod": "^3.25.76" "zod": "^3.25.76"
}, },
"devDependencies": { "devDependencies": {
@ -68,7 +68,7 @@
"@types/react-dom": "^18.2.18", "@types/react-dom": "^18.2.18",
"autoprefixer": "^10.4.16", "autoprefixer": "^10.4.16",
"eslint": "^8.56.0", "eslint": "^8.56.0",
"eslint-config-next": "^14.2.35", "eslint-config-next": "^16.1.1",
"next-sitemap": "^4.2.3", "next-sitemap": "^4.2.3",
"postcss": "^8.4.32", "postcss": "^8.4.32",
"prettier": "^3.1.1", "prettier": "^3.1.1",

View File

@ -3,7 +3,7 @@
import React, { useState, useCallback } from 'react'; import React, { useState, useCallback } from 'react';
import { useDropzone } from 'react-dropzone'; import { useDropzone } from 'react-dropzone';
import Papa from 'papaparse'; import Papa from 'papaparse';
import * as XLSX from 'xlsx'; import ExcelJS from 'exceljs';
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card';
import { Button } from '@/components/ui/Button'; import { Button } from '@/components/ui/Button';
import { Badge } from '@/components/ui/Badge'; import { Badge } from '@/components/ui/Badge';
@ -66,12 +66,33 @@ export default function BulkCreationPage() {
}; };
reader.readAsText(file); reader.readAsText(file);
} else if (file.name.endsWith('.xlsx') || file.name.endsWith('.xls')) { } else if (file.name.endsWith('.xlsx') || file.name.endsWith('.xls')) {
reader.onload = (e) => { reader.onload = async (e) => {
const data = new Uint8Array(e.target?.result as ArrayBuffer); const buffer = e.target?.result as ArrayBuffer;
const workbook = XLSX.read(data, { type: 'array' }); const workbook = new ExcelJS.Workbook();
const sheetName = workbook.SheetNames[0]; await workbook.xlsx.load(buffer);
const worksheet = workbook.Sheets[sheetName]; const worksheet = workbook.worksheets[0];
const jsonData = XLSX.utils.sheet_to_json(worksheet); const jsonData: any[] = [];
// Get headers from first row
const headers: string[] = [];
const firstRow = worksheet.getRow(1);
firstRow.eachCell((cell, colNumber) => {
headers[colNumber - 1] = cell.value?.toString() || '';
});
// Convert rows to objects
worksheet.eachRow((row, rowNumber) => {
if (rowNumber === 1) return; // Skip header row
const rowData: any = {};
row.eachCell((cell, colNumber) => {
const header = headers[colNumber - 1];
if (header) {
rowData[header] = cell.value;
}
});
jsonData.push(rowData);
});
processData(jsonData); processData(jsonData);
}; };
reader.readAsArrayBuffer(file); reader.readAsArrayBuffer(file);