From 217220ffaaf688133321cc68d770aaf1e50590a9 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Thu, 30 Jan 2025 16:25:18 +0100 Subject: [PATCH] fix: editor page csv upload --- client/package-lock.json | 486 ------------------ client/src/app/editor/editor.component.ts | 220 ++++---- .../spreadsheet-util/spreadsheet-util.ts | 8 +- package-lock.json | 4 +- sas/package-lock.json | 6 - sas/sasjs/sasjsconfig.json | 4 +- 6 files changed, 121 insertions(+), 607 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index acb8b16..aa619f1 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -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", diff --git a/client/src/app/editor/editor.component.ts b/client/src/app/editor/editor.component.ts index 9d4a7ea..558dc68 100644 --- a/client/src/app/editor/editor.component.ts +++ b/client/src/app/editor/editor.component.ts @@ -81,11 +81,11 @@ export class EditorComponent implements OnInit, AfterViewInit { @ViewChildren('fileUploadInput') fileUploadInputCompList: QueryList = 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 | 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 = [] - 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 = 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(pluginName) + const contextMenuPlugin = hot.getPlugin(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 diff --git a/client/src/app/shared/spreadsheet-util/spreadsheet-util.ts b/client/src/app/shared/spreadsheet-util/spreadsheet-util.ts index d008eb3..65e8601 100644 --- a/client/src/app/shared/spreadsheet-util/spreadsheet-util.ts +++ b/client/src/app/shared/spreadsheet-util/spreadsheet-util.ts @@ -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 "' + @@ -367,7 +373,7 @@ export class SpreadsheetUtil { parseParams: ParseParams, uploader: FileUploader, fileType: string - ) { + ): Promise { return new Promise((resolve, reject) => { if (this.licenceState.value.submit_rows_limit !== Infinity) { uploader.queue.pop() diff --git a/package-lock.json b/package-lock.json index d0cb4c9..a66f312 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/sas/package-lock.json b/sas/package-lock.json index 9502a49..ddac940 100644 --- a/sas/package-lock.json +++ b/sas/package-lock.json @@ -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", diff --git a/sas/sasjs/sasjsconfig.json b/sas/sasjs/sasjsconfig.json index 107d98d..033721a 100644 --- a/sas/sasjs/sasjsconfig.json +++ b/sas/sasjs/sasjsconfig.json @@ -230,7 +230,7 @@ "macroVars": {} }, "streamConfig": { - "streamWeb": false, + "streamWeb": true, "streamWebFolder": "web", "webSourcePath": "../client/dist", "streamServiceName": "DataController2", @@ -495,4 +495,4 @@ } } ] -} \ No newline at end of file +}