fix: editor page csv upload

This commit is contained in:
Mihajlo Medjedovic 2025-01-30 16:25:18 +01:00
parent c89a3049fa
commit 217220ffaa
6 changed files with 121 additions and 607 deletions

486
client/package-lock.json generated
View File

@ -776,17 +776,6 @@
"node": ">=12"
}
},
"node_modules/@angular-devkit/build-angular/node_modules/@types/node": {
"version": "20.14.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz",
"integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz",
@ -6377,12 +6366,6 @@
"resolved": "https://registry.npmjs.org/@types/text-encoding/-/text-encoding-0.0.35.tgz",
"integrity": "sha512-jfo/A88XIiAweUa8np+1mPbm3h2w0s425YrI8t3wk5QxhH6UI7w517MboNVnGDeMSuoFwA8Rwmklno+FicvV4g=="
},
"node_modules/@types/tough-cookie": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
"integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
"peer": true
},
"node_modules/@types/trusted-types": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
@ -6987,12 +6970,6 @@
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webcomponents/custom-elements": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.6.0.tgz",
"integrity": "sha512-CqTpxOlUCPWRNUPZDxT5v2NnHXA4oox612iUGnmTUGQFhZ1Gkj8kirtl/2wcF6MqX7+PqqicZzOCBKKfIn0dww==",
"peer": true
},
"node_modules/@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@ -7999,13 +7976,6 @@
"base64-js": "^1.1.2"
}
},
"node_modules/browser-stdout": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true,
"peer": true
},
"node_modules/browserify-aes": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
@ -9747,19 +9717,6 @@
"callsite": "^1.0.0"
}
},
"node_modules/decamelize": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
"integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
"dev": true,
"peer": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/deep-equal": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz",
@ -12202,16 +12159,6 @@
"node": ">= 0.4"
}
},
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true,
"peer": true,
"bin": {
"he": "bin/he"
}
},
"node_modules/hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@ -15153,385 +15100,6 @@
"mkdirp": "bin/cmd.js"
}
},
"node_modules/mocha": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz",
"integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==",
"dev": true,
"peer": true,
"dependencies": {
"ansi-colors": "4.1.1",
"browser-stdout": "1.3.1",
"chokidar": "3.5.3",
"debug": "4.3.4",
"diff": "5.0.0",
"escape-string-regexp": "4.0.0",
"find-up": "5.0.0",
"glob": "8.1.0",
"he": "1.2.0",
"js-yaml": "4.1.0",
"log-symbols": "4.1.0",
"minimatch": "5.0.1",
"ms": "2.1.3",
"serialize-javascript": "6.0.0",
"strip-json-comments": "3.1.1",
"supports-color": "8.1.1",
"workerpool": "6.2.1",
"yargs": "16.2.0",
"yargs-parser": "20.2.4",
"yargs-unparser": "2.0.0"
},
"bin": {
"_mocha": "bin/_mocha",
"mocha": "bin/mocha.js"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/mocha/node_modules/ansi-colors": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
"dev": true,
"peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/mocha/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"peer": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/mocha/node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true,
"peer": true
},
"node_modules/mocha/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"peer": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/mocha/node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"peer": true,
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/mocha/node_modules/cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"peer": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"node_modules/mocha/node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"peer": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/mocha/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"peer": true
},
"node_modules/mocha/node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"peer": true,
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/mocha/node_modules/debug/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true,
"peer": true
},
"node_modules/mocha/node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"peer": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"peer": true,
"dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/glob": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
"integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
"deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
"peer": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^5.0.1",
"once": "^1.3.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/mocha/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"peer": true,
"engines": {
"node": ">=8"
}
},
"node_modules/mocha/node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"peer": true,
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/mocha/node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"peer": true,
"dependencies": {
"p-locate": "^5.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/minimatch": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
"integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
"dev": true,
"peer": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/mocha/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true,
"peer": true
},
"node_modules/mocha/node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"peer": true,
"dependencies": {
"yocto-queue": "^0.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/p-locate": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"peer": true,
"dependencies": {
"p-limit": "^3.0.2"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/serialize-javascript": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
"integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
"dev": true,
"peer": true,
"dependencies": {
"randombytes": "^2.1.0"
}
},
"node_modules/mocha/node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"peer": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/mocha/node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"peer": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/mocha/node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
"peer": true,
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/mocha/node_modules/yargs-parser": {
"version": "20.2.4",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
"dev": true,
"peer": true,
"engines": {
"node": ">=10"
}
},
"node_modules/mochawesome": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/mochawesome/-/mochawesome-7.1.3.tgz",
@ -20606,14 +20174,6 @@
"node": ">=18.0"
}
},
"node_modules/undici-types": {
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
"dev": true,
"optional": true,
"peer": true
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@ -21413,13 +20973,6 @@
"integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
"dev": true
},
"node_modules/workerpool": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
"integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
"dev": true,
"peer": true
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@ -21620,45 +21173,6 @@
"node": ">=12"
}
},
"node_modules/yargs-unparser": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
"integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
"dev": true,
"peer": true,
"dependencies": {
"camelcase": "^6.0.0",
"decamelize": "^4.0.0",
"flat": "^5.0.2",
"is-plain-obj": "^2.1.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/yargs-unparser/node_modules/camelcase": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true,
"peer": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/yargs-unparser/node_modules/is-plain-obj": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
"integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
"dev": true,
"peer": true,
"engines": {
"node": ">=8"
}
},
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",

View File

@ -81,11 +81,11 @@ export class EditorComponent implements OnInit, AfterViewInit {
@ViewChildren('fileUploadInput')
fileUploadInputCompList: QueryList<ElementRef> = new QueryList()
public static cnt: number = 0
public static nonPkCnt: number = 0
public static lastCell: number = 0
public static cnt = 0
public static nonPkCnt = 0
public static lastCell = 0
private _tableSub: Subscription | undefined
public message: string = ''
public message = ''
public $dataFormats: $DataFormats | null = null
public submit: boolean | undefined
public cols: Col[] = []
@ -107,12 +107,12 @@ export class EditorComponent implements OnInit, AfterViewInit {
*/
restrictions: EditorRestrictions = {}
datasetInfo: boolean = false
datasetInfo = false
dsmeta: DSMeta[] = []
versions: Version[] = []
dsNote = ''
viewboxes: boolean = false
viewboxes = false
Infinity = Infinity
@ -154,7 +154,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
selection: any[],
clickEvent: MouseEvent
) => {
let firstSelection = selection[0]
const firstSelection = selection[0]
if (firstSelection.start.row === firstSelection.end.row) {
this.editRecord(null, firstSelection.start.row)
@ -195,25 +195,25 @@ export class EditorComponent implements OnInit, AfterViewInit {
public hotCellsPropRow: number | null = null
public filter: boolean = false
public submitLoading: boolean = false
public uploadLoading: boolean = false
public filter = false
public submitLoading = false
public uploadLoading = false
public rowsChanged: any = {
rowsUpdated: 0,
rowsDeleted: 0,
rowsAdded: 0
}
public modifedRowsIndexes: number[] = []
public queryErr: boolean = false
public queryErr = false
public queryErrMessage: string | undefined
public successEnable: boolean = false
public successEnable = false
public libTab: string | undefined
public queryFilter: any
public _query: Subscription | undefined
public whereString: string | undefined
public clauses: any
public nullVariables: boolean = false
public nullVariables = false
public tableId: string | undefined
public pkFields: any = []
@ -221,53 +221,53 @@ export class EditorComponent implements OnInit, AfterViewInit {
public libds: string | undefined
public filter_pk: string | undefined
public table: any
public filename: string = ''
public filename = ''
public selectedColumn: any
public hotSelection: Array<number> | null | undefined
public submitLimitNotice: boolean = false
public badEdit: boolean = false
public submitLimitNotice = false
public badEdit = false
public badEditCause: string | undefined
public badEditTitle: string | undefined
public tableTrue: boolean | undefined
public saveLoading: boolean = false
public saveLoading = false
public approvers: string[] = []
public approver: any
public readOnlyFields!: number
public errValidation: boolean = false
public errValidation = false
public dataObj: any
public disableSubmit: boolean | undefined
public pkNull: boolean = false
public noPkNull: boolean = false
public pkNull = false
public noPkNull = false
public tableData: Array<any> = []
public queryText: string = ''
public queryTextSaved: string = ''
public showApprovers: boolean = false
public pkDups: boolean = false
public validationDone: number = 0
public queryText = ''
public queryTextSaved = ''
public showApprovers = false
public pkDups = false
public validationDone = 0
public duplicatePkIndexes: any = []
public columnHeader: string[] = []
public specInfo: { col: string; len: number; type: number }[] = []
public tooLong: boolean = false
public tooLong = false
public exceedCells: {
col: string
len: number
val: string
}[] = []
public uploader: FileUploader = new FileUploader()
public uploadUrl: string = ''
public excelFileReady: boolean = false
public uploadPreview: boolean = false
public excelFileParsing: boolean = false
public uploadUrl = ''
public excelFileReady = false
public uploadPreview = false
public excelFileParsing = false
public excelUploadState: string | null = null
public data: AOA = []
public headerArray: string[] = []
public hotDataSchema: any = {}
public headerShow: string[] = []
public headerVisible: boolean = false
public hasBaseDropZoneOver: boolean = false
public hasAnotherDropZoneOver: boolean = false
public headerVisible = false
public hasBaseDropZoneOver = false
public hasAnotherDropZoneOver = false
public headerPks: string[] = []
public columnLevelSecurityFlag: boolean = false
public columnLevelSecurityFlag = false
public dateTimeHeaders: string[] = []
public timeHeaders: string[] = []
public dateHeaders: string[] = []
@ -286,12 +286,12 @@ export class EditorComponent implements OnInit, AfterViewInit {
dataModified!: any[]
public filePasswordSubject: Subject<string | undefined> = new Subject()
public fileUnlockError: boolean = false
public fileUnlockError = false
public filePasswordModal: boolean = false
public showUploadModal: boolean = false
public discardSourceFile: boolean = false
public manualFileEditModal: boolean = false
public filePasswordModal = false
public showUploadModal = false
public discardSourceFile = false
public manualFileEditModal = false
public recordAction: string | null = null
@ -299,25 +299,25 @@ export class EditorComponent implements OnInit, AfterViewInit {
public currentEditRecordValidator: DcValidator | undefined
public currentEditRecordLoadings: number[] = []
public currentEditRecordErrors: number[] = []
public currentEditRecordIndex: number = -1
public currentEditRecordIndex = -1
public generateEditRecordUrlLoading: boolean = false
public generateEditRecordUrlLoading = false
public generatedRecordUrl: string | null = null
public addRecordUrl: string | null = null
public recordNewOrPkModified: boolean = false
public addRecordLoading: boolean = false
public singleRowSelected: boolean = false
public addingNewRow: boolean = false
public getdataError: boolean = false
public zeroFilterRows: boolean = false
public recordNewOrPkModified = false
public addRecordLoading = false
public singleRowSelected = false
public addingNewRow = false
public getdataError = false
public zeroFilterRows = false
public tableFileDragOver: boolean = false
public tableFileDragOver = false
/**
* Hash/values table used for dynamic cell validation
*/
public cellValidationSource: CellValidationSource[] = []
public validationTableLimit: number = 20
public validationTableLimit = 20
public extendedCellValidationFields: {
DISPLAY_INDEX: number
EXTRA_COL_NAME: number
@ -463,8 +463,8 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.hasBaseDropZoneOver = e
}
public attachFile(event: any, dropped: boolean = false) {
let file: File = dropped ? event[0] : event.target.files[0]
public attachFile(event: any, dropped = false) {
const file: File = dropped ? event[0] : event.target.files[0]
this.excelUploadState = 'Loading'
this.excelFileParsing = true
@ -494,7 +494,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.eventService.showInfoModal('Table Found', tableFoundInfo)
}
)
.then((parseResult: ParseResult | undefined) => {
.then(async (parseResult: ParseResult | undefined) => {
if (parseResult) {
this.excelFileReady = true
@ -507,7 +507,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.getPendingExcelPreview()
} else {
// otherwise it's csv file, and we send them directly
this.uploadParsedFiles()
await this.uploadParsedFiles()
}
}
})
@ -542,7 +542,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
* This method will run validations and upload all of the pending files
* that are in the uploader queue.
*/
public uploadParsedFiles() {
public async uploadParsedFiles() {
if (this.checkInvalid()) {
this.eventService.showAbortModal(null, 'Invalid values are present.')
return
@ -559,7 +559,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
}
this.uploadLoading = true
let filesToUpload: UploadFile[] = []
const filesToUpload: UploadFile[] = []
for (const file of this.uploader.queue) {
filesToUpload.push({
@ -568,7 +568,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
})
}
this.sasService
await this.sasService
.uploadFile(this.uploadUrl, filesToUpload, { table: this.libds })
.then(
(res: UploadFileResponse) => {
@ -577,7 +577,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
return
} else {
this.uploadLoading = false
let params = res.adapterResponse.sasparams[0]
const params = res.adapterResponse.sasparams[0]
this.successEnable = true
this.tableId = params.DSID
this.router.navigateByUrl('/stage/' + this.tableId)
@ -628,10 +628,10 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.toggleHotPlugin('contextMenu', false)
let previewDatasource: any[] = []
const previewDatasource: any[] = []
this.data.map((item) => {
let itemObject: any = {}
const itemObject: any = {}
this.headerShow.map((header: any, index: number) => {
itemObject[header] = item[index]
@ -710,7 +710,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.editTable(true)
}
private appendUploadState(state: string, replaceLast: boolean = false) {
private appendUploadState(state: string, replaceLast = false) {
this.cdf.detectChanges()
if (this.uploadStaterCompList.first) {
@ -743,7 +743,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
async sendClause() {
this.submitLoading = true
let nullVariableArr = []
let emptyVariablesArr = []
const emptyVariablesArr = []
// to check number of empty clauses
if (typeof this.clauses === 'undefined') {
@ -751,7 +751,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.submitLoading = false
return
} else {
let query = this.clauses.queryObj
const query = this.clauses.queryObj
if (query[0].elements.length < 1) {
// Clear cached filtering data
@ -866,9 +866,9 @@ export class EditorComponent implements OnInit, AfterViewInit {
const hot = this.hotInstance
let columnSorting = hot.getPlugin('multiColumnSorting')
let columnSortConfig = columnSorting.getSortConfig()
let sortConfigs = Array.isArray(columnSortConfig)
const columnSorting = hot.getPlugin('multiColumnSorting')
const columnSortConfig = columnSorting.getSortConfig()
const sortConfigs = Array.isArray(columnSortConfig)
? columnSortConfig
: [columnSortConfig]
@ -891,7 +891,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
hot.render()
for (let sortConfig of sortConfigs) {
for (const sortConfig of sortConfigs) {
columnSorting.sort(sortConfig)
}
@ -900,9 +900,9 @@ export class EditorComponent implements OnInit, AfterViewInit {
}
convertToCorrectTypes(dataSource: any) {
for (let row of dataSource) {
for (let colKey in row) {
let colSpecs = this.cols.find((x: any) => x.NAME === colKey)
for (const row of dataSource) {
for (const colKey in row) {
const colSpecs = this.cols.find((x: any) => x.NAME === colKey)
if (colSpecs) {
if (
@ -923,9 +923,9 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.cellValidationSource = []
const hot = this.hotInstance
let columnSorting = hot.getPlugin('multiColumnSorting')
let columnSortConfig = columnSorting.getSortConfig()
let sortConfigs = Array.isArray(columnSortConfig)
const columnSorting = hot.getPlugin('multiColumnSorting')
const columnSortConfig = columnSorting.getSortConfig()
const sortConfigs = Array.isArray(columnSortConfig)
? columnSortConfig
: [columnSortConfig]
@ -946,14 +946,14 @@ export class EditorComponent implements OnInit, AfterViewInit {
hot.validateRows(this.modifedRowsIndexes)
// this.editRecordListeners();
for (let sortConfig of sortConfigs) {
for (const sortConfig of sortConfigs) {
columnSorting.sort(sortConfig)
}
this.checkRowLimit()
}
timesClicked: number = 0
timesClicked = 0
public hotClicked() {
if (this.timesClicked === 1 && this.hotTable.readOnly) {
this.editTable()
@ -982,7 +982,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
setTimeout(() => {
const hot = this.hotInstance
let dsInsertIndex = this.dataSource.length
const dsInsertIndex = this.dataSource.length
hot.alter('insert_row_below', dsInsertIndex, 1)
hot.updateSettings({ data: this.dataSource }, false)
hot.selectCell(this.dataSource.length - 1, 0)
@ -1040,14 +1040,14 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.dataModified = []
for (let i = 0; i < this.dataSource.length; i++) {
let dataRow = this.helperService.deepClone(this.dataSource[i])
const dataRow = this.helperService.deepClone(this.dataSource[i])
if (dataRow._____DELETE__THIS__RECORD_____ === 'Yes') {
this.dataModified.push(dataRow)
rowsDeleted++
} else {
let dataRowUnchanged = this.dataSourceUnchanged.find((row: any) => {
for (let pkCol of this.headerPks) {
const dataRowUnchanged = this.dataSourceUnchanged.find((row: any) => {
for (const pkCol of this.headerPks) {
if (row[pkCol] !== dataRow[pkCol]) {
return false
}
@ -1080,7 +1080,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
public validatePrimaryKeys() {
const hot = this.hotInstance
let myTable = hot.getData()
const myTable = hot.getData()
this.pkFields = []
for (let index = 0; index < myTable.length; index++) {
let pkRow = ''
@ -1090,8 +1090,8 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.pkFields.push(pkRow)
}
let results = []
let rows = this.dataSource.length
const results = []
const rows = this.dataSource.length
for (let j = 0; j < this.pkFields.length; j++) {
for (let i = 0; i < this.pkFields.length; i++) {
@ -1136,12 +1136,12 @@ export class EditorComponent implements OnInit, AfterViewInit {
* when we don't want to re-set force values of every row in the table
*/
public reSetCellValidationValues(
setForcedValues: boolean = false,
setForcedValues = false,
specificRowForceValue?: number
) {
const hot = this.hotInstance
for (let entry of this.cellValidationSource) {
for (const entry of this.cellValidationSource) {
const colSource = entry.values.map(
(el: any) => el[this.cellValidationFields.RAW_VALUE]
)
@ -1196,7 +1196,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
public reSetExtendedCellValidationValues(
cellValidationEntry?: CellValidationSource,
row?: number,
setForcedValues: boolean = false,
setForcedValues = false,
specificRowForceValue?: number
) {
const hot = this.hotInstance
@ -1218,7 +1218,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
return
}
for (let entry of this.cellValidationSource) {
for (const entry of this.cellValidationSource) {
const extendedValuesObject = this.getExtendedValuesByCellValue(entry)
this.setExtendedValuesToCells(
@ -1235,19 +1235,19 @@ export class EditorComponent implements OnInit, AfterViewInit {
cellValidationEntry: CellValidationSource,
row: number,
extendedValues: DynamicExtendedCellValidation[],
setForcedValues: boolean = false,
setForcedValues = false,
specificRowForceValue?: number
) {
const hot = this.hotInstance
let uniqueCells: any[] = []
const uniqueCells: any[] = []
for (let element of extendedValues) {
for (const element of extendedValues) {
if (uniqueCells.indexOf(element.EXTRA_COL_NAME) < 0)
uniqueCells.push(element.EXTRA_COL_NAME)
}
for (let cell of uniqueCells) {
for (const cell of uniqueCells) {
const valuesForCol = extendedValues.filter(
(x) => x.EXTRA_COL_NAME === cell
)
@ -1385,10 +1385,10 @@ export class EditorComponent implements OnInit, AfterViewInit {
const extendedValuesObject = []
for (let extendedValue of filteredValues || []) {
let tempObj: any = {}
for (const extendedValue of filteredValues || []) {
const tempObj: any = {}
for (let key of Object.keys(prepObj)) {
for (const key of Object.keys(prepObj)) {
tempObj[key] = extendedValue[prepObj[key]]
}
@ -1442,7 +1442,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
/**
* Below code should be analized, not sure what is the purpose of exceedCells
*/
let myTableData = hot.getData()
const myTableData = hot.getData()
// If the last row is empty, remove it before validation
if (myTableData.length > 1 && hot.isEmptyRow(myTableData.length - 1)) {
@ -1462,7 +1462,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
hot.validateRows(this.modifedRowsIndexes, () => {
if (this.checkInvalid()) {
let abortMsg = 'Invalid Values are Present'
const abortMsg = 'Invalid Values are Present'
this.eventService.showInfoModal('Validation error', abortMsg)
@ -1473,7 +1473,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.validationDone = 1
setTimeout(() => {
let txt: any = document.getElementById('formFields_8')
const txt: any = document.getElementById('formFields_8')
if (txt) txt.focus()
}, 200)
})
@ -1490,11 +1490,11 @@ export class EditorComponent implements OnInit, AfterViewInit {
public async saveTable(data: any) {
const hot = this.hotInstance
let hotData = hot.getData()
const hotData = hot.getData()
data = data.filter((dataRow: any) => {
let elModified = this.dataModified.find((row) => {
for (let pkCol of this.headerPks) {
const elModified = this.dataModified.find((row) => {
for (const pkCol of this.headerPks) {
if (row[pkCol] !== dataRow[pkCol]) {
return false
}
@ -1507,7 +1507,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
})
data = data.map((row: any) => {
let deleteColValue = row['_____DELETE__THIS__RECORD_____']
const deleteColValue = row['_____DELETE__THIS__RECORD_____']
delete row['_____DELETE__THIS__RECORD_____']
row['_____DELETE__THIS__RECORD_____'] = deleteColValue
@ -1525,7 +1525,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.loggerService.log('Data submitted', data)
if (this.checkInvalid()) {
let abortMsg = 'Invalid Values are Present'
const abortMsg = 'Invalid Values are Present'
this.eventService.showInfoModal('Validation error', abortMsg)
this.cancelSubmit()
this.submit = false
@ -1543,7 +1543,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.saveLoading = true
this.disableSubmit = false
this.submit = true
let updateParams: any = {}
const updateParams: any = {}
updateParams.ACTION = 'LOAD'
this.message = this.message.replace(/\n/g, '. ')
updateParams.MESSAGE = this.message
@ -1576,7 +1576,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
let error = `Submit request failed`
if (res) {
let errorText =
const errorText =
typeof res === 'string' ? res : JSON.stringify(res)
error += `\n${errorText}`
@ -1596,7 +1596,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.disableSubmit = true
this.submit = false
let errorText =
const errorText =
typeof err.adapterRespnse === 'string'
? err.adapterRespnse
: JSON.stringify(err.adapterRespnse)
@ -1669,7 +1669,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
}
}
confirmRecordEdit(close: boolean = true) {
confirmRecordEdit(close = true) {
const closingRecordIndex = this.currentEditRecordIndex
if (close) this.currentEditRecordIndex = -1
@ -1771,7 +1771,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
)
// Update that copy with current cells meta (dynamic validation data)
for (let cellMeta of currentEditRecordCellsMeta) {
for (const cellMeta of currentEditRecordCellsMeta) {
if (cellMeta) {
const data = cellMeta.prop?.toString() //------------
delete cellMeta.prop // We convert to be able to update dcValidator rule by using CellProperties
@ -1795,7 +1795,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
const hot = this.hotInstance
hot.batch(() => {
let contextMenuPlugin = hot.getPlugin<any>(pluginName)
const contextMenuPlugin = hot.getPlugin<any>(pluginName)
if (!contextMenuPlugin) {
console.warn(
@ -2222,7 +2222,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
})
// recover lib and table parameters from url; filter pk is optional - if filter is applied
let myParams: any = {}
const myParams: any = {}
if (typeof this.route.snapshot.params['libMem'] !== 'undefined') {
this.libds = this.route.snapshot.params['libMem']
this.filter_pk = this.route.snapshot.params['filterId']
@ -2503,7 +2503,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
this.columnHeader[0] = 'Delete?'
this.readOnlyFields = response.data.sasparams[0].PKCNT
let hotInstaceEl = document.getElementById('hotInstance')
const hotInstaceEl = document.getElementById('hotInstance')
if (hotInstaceEl) {
hotInstaceEl.addEventListener('mousedown', (event) => {
@ -2512,7 +2512,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
}
setTimeout(() => {
let menuDebugItem: any =
const menuDebugItem: any =
document.querySelector('.debug-switch-item') || undefined
if (menuDebugItem) menuDebugItem.click()
}, 100)
@ -2602,7 +2602,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
hot.addHook('afterCreateRow', (source: any, change: any) => {
if (source > this.dataSource.length) {
// don't scroll if row is not added to the end (bottom)
let wtHolder = document.querySelector('.wtHolder')
const wtHolder = document.querySelector('.wtHolder')
setTimeout(() => {
if (wtHolder) wtHolder.scrollTop = wtHolder.scrollHeight

View File

@ -129,6 +129,12 @@ export class SpreadsheetUtil {
reader.readAsArrayBuffer(file)
} else if (fileType.toLowerCase() === 'csv') {
return this.parseCsvFile(parseParams, uploader, fileType)
.then((response) => {
return resolve(response)
})
.catch(err => {
return reject(err)
})
} else {
let abortMsg =
'Invalid file type "<b>' +
@ -367,7 +373,7 @@ export class SpreadsheetUtil {
parseParams: ParseParams,
uploader: FileUploader,
fileType: string
) {
): Promise<ParseResult> {
return new Promise((resolve, reject) => {
if (this.licenceState.value.submit_rows_limit !== Infinity) {
uploader.queue.pop()

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "dcfrontend",
"version": "6.10.0",
"version": "6.12.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "dcfrontend",
"version": "6.10.0",
"version": "6.12.1",
"hasInstallScript": true,
"devDependencies": {
"@saithodev/semantic-release-gitea": "^2.1.0",

6
sas/package-lock.json generated
View File

@ -229,12 +229,6 @@
"@types/node": "*"
}
},
"node_modules/@types/tough-cookie": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
"integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
"peer": true
},
"node_modules/abab": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",

View File

@ -230,7 +230,7 @@
"macroVars": {}
},
"streamConfig": {
"streamWeb": false,
"streamWeb": true,
"streamWebFolder": "web",
"webSourcePath": "../client/dist",
"streamServiceName": "DataController2",
@ -495,4 +495,4 @@
}
}
]
}
}