From 04b1d70fb48093608cc8084fff82cb319fa0becd Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Tue, 8 Mar 2022 23:38:40 +0100 Subject: Komponenta za ucitavanje i prikaz csv fajla - v1 (probna) --- frontend/package-lock.json | 223 +++++++++++++++------ frontend/package.json | 6 +- .../dataset-load/dataset-load.component.css | 0 .../dataset-load/dataset-load.component.html | 16 ++ .../dataset-load/dataset-load.component.spec.ts | 25 +++ .../dataset-load/dataset-load.component.ts | 82 ++++++++ frontend/src/app/app-routing.module.ts | 4 +- frontend/src/app/app.module.ts | 5 +- 8 files changed, 297 insertions(+), 64 deletions(-) create mode 100644 frontend/src/app/_elements/dataset-load/dataset-load.component.css create mode 100644 frontend/src/app/_elements/dataset-load/dataset-load.component.html create mode 100644 frontend/src/app/_elements/dataset-load/dataset-load.component.spec.ts create mode 100644 frontend/src/app/_elements/dataset-load/dataset-load.component.ts (limited to 'frontend') diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2bc6994f..25f2ca82 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -21,7 +21,9 @@ "@ng-bootstrap/ng-bootstrap": "^12.0.0", "@popperjs/core": "^2.10.2", "bootstrap": "^5.1.3", + "csv-parser": "^3.0.0", "ngx-cookie-service": "^13.1.2", + "ngx-csv-parser": "^0.0.7", "rxjs": "~7.5.0", "tslib": "^2.3.0", "zone.js": "~0.11.4" @@ -413,6 +415,7 @@ "version": "13.2.5", "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.5.tgz", "integrity": "sha512-Xd8xj2Z0ilA4TJAM/JkTtA1CAa6SuebFsEEvabHCRO5MDvtdsIUP91ADUZIqDHy7qe6Qift/rAVN2PXxT2aaNA==", + "dev": true, "dependencies": { "@babel/core": "^7.17.2", "chokidar": "^3.0.0", @@ -442,6 +445,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.0" }, @@ -453,6 +457,7 @@ "version": "7.17.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -482,6 +487,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -490,6 +496,7 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "dev": true, "dependencies": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -503,6 +510,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -725,6 +733,7 @@ "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -754,6 +763,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -762,6 +772,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -770,6 +781,7 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, "dependencies": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -783,6 +795,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3209,6 +3222,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3482,6 +3496,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, "engines": { "node": ">=8" } @@ -3578,6 +3593,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3750,6 +3766,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, "funding": [ { "type": "individual", @@ -4483,6 +4500,20 @@ "node": ">=4" } }, + "node_modules/csv-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.0.0.tgz", + "integrity": "sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -4661,6 +4692,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, "engines": { "node": ">= 0.6.0" } @@ -5609,6 +5641,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5777,6 +5810,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -5886,6 +5920,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -6478,6 +6513,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6531,6 +6567,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6547,6 +6584,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6573,6 +6611,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -7428,6 +7467,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7439,6 +7479,7 @@ "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, "dependencies": { "sourcemap-codec": "^1.4.4" } @@ -7869,6 +7910,23 @@ "@angular/core": "^13.0.0" } }, + "node_modules/ngx-csv-parser": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ngx-csv-parser/-/ngx-csv-parser-0.0.7.tgz", + "integrity": "sha512-KCos2rxjkPqw/gQfd+0TYnf4bWHY4zyC8G5JB09DEnHrHz2RReKgSccJO+4SzApG7O6asDtUV4qfa94/uZ10ZQ==", + "dependencies": { + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@angular/common": "^8.1.3", + "@angular/core": "^8.1.3" + } + }, + "node_modules/ngx-csv-parser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", @@ -7975,6 +8033,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8662,6 +8721,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -9457,6 +9517,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -9467,7 +9528,8 @@ "node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true }, "node_modules/regenerate": { "version": "1.4.2", @@ -9888,6 +9950,7 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -10272,7 +10335,8 @@ "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true }, "node_modules/spdy": { "version": "4.0.2", @@ -10673,6 +10737,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -10738,6 +10803,7 @@ "version": "4.5.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11343,7 +11409,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yaml": { "version": "1.10.2", @@ -11661,6 +11728,7 @@ "version": "13.2.5", "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.5.tgz", "integrity": "sha512-Xd8xj2Z0ilA4TJAM/JkTtA1CAa6SuebFsEEvabHCRO5MDvtdsIUP91ADUZIqDHy7qe6Qift/rAVN2PXxT2aaNA==", + "dev": true, "requires": { "@babel/core": "^7.17.2", "chokidar": "^3.0.0", @@ -11678,6 +11746,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.0" } @@ -11686,6 +11755,7 @@ "version": "7.17.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -11707,7 +11777,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -11715,6 +11786,7 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "dev": true, "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -11724,7 +11796,8 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -11861,6 +11934,7 @@ "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -11882,12 +11956,14 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -11895,6 +11971,7 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -11904,7 +11981,8 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -13062,8 +13140,7 @@ "version": "13.2.5", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.5.tgz", "integrity": "sha512-obiPvwPe+UJUO8cfNbBxukLKG30F+gLF5/erexwklRknJzS4KP8ciH2on6XlTuXUahpDjbO0pffugFE2I/IszQ==", - "dev": true, - "requires": {} + "dev": true }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -13598,8 +13675,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} + "dev": true }, "adjust-sourcemap-loader": { "version": "4.0.0", @@ -13722,6 +13798,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -13919,7 +13996,8 @@ "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true }, "bl": { "version": "4.1.0", @@ -13990,8 +14068,7 @@ "bootstrap": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", - "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", - "requires": {} + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==" }, "brace-expansion": { "version": "1.1.11", @@ -14006,6 +14083,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -14129,6 +14207,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -14156,8 +14235,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", - "dev": true, - "requires": {} + "dev": true }, "clean-stack": { "version": "2.2.0", @@ -14635,8 +14713,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "requires": {} + "dev": true }, "css-select": { "version": "4.2.1", @@ -14669,6 +14746,14 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "csv-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.0.0.tgz", + "integrity": "sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ==", + "requires": { + "minimist": "^1.2.0" + } + }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -14801,7 +14886,8 @@ "dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==" + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true }, "destroy": { "version": "1.0.4", @@ -15449,6 +15535,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -15571,6 +15658,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "optional": true }, "function-bind": { @@ -15646,6 +15734,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -15902,8 +15991,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "ieee754": { "version": "1.2.1", @@ -16100,6 +16188,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -16131,7 +16220,8 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -16142,6 +16232,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -16161,7 +16252,8 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-path-cwd": { "version": "2.2.0", @@ -16580,8 +16672,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", - "dev": true, - "requires": {} + "dev": true }, "karma-source-map-support": { "version": "1.4.0", @@ -16798,6 +16889,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -16806,6 +16898,7 @@ "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } @@ -17129,6 +17222,21 @@ "tslib": "^2.0.0" } }, + "ngx-csv-parser": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ngx-csv-parser/-/ngx-csv-parser-0.0.7.tgz", + "integrity": "sha512-KCos2rxjkPqw/gQfd+0TYnf4bWHY4zyC8G5JB09DEnHrHz2RReKgSccJO+4SzApG7O6asDtUV4qfa94/uZ10ZQ==", + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, "nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", @@ -17206,7 +17314,8 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true }, "normalize-range": { "version": "0.1.2", @@ -17731,7 +17840,8 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, "pify": { "version": "2.3.0", @@ -17842,8 +17952,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "dev": true, - "requires": {} + "dev": true }, "postcss-custom-properties": { "version": "12.1.4", @@ -17913,15 +18022,13 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "requires": {} + "dev": true }, "postcss-gap-properties": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-image-set-function": { "version": "4.0.6", @@ -17947,8 +18054,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-lab-function": { "version": "4.1.1", @@ -17975,22 +18081,19 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "requires": {} + "dev": true }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -18034,15 +18137,13 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", - "dev": true, - "requires": {} + "dev": true }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-place": { "version": "7.0.4", @@ -18107,8 +18208,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-selector-not": { "version": "5.0.0", @@ -18273,6 +18373,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -18280,7 +18381,8 @@ "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true }, "regenerate": { "version": "1.4.2", @@ -18556,8 +18658,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -18586,6 +18687,7 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -18901,7 +19003,8 @@ "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true }, "spdy": { "version": "4.0.2", @@ -19109,8 +19212,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -19184,6 +19286,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "requires": { "is-number": "^7.0.0" } @@ -19230,7 +19333,8 @@ "typescript": { "version": "4.5.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==" + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true }, "ua-parser-js": { "version": "0.7.31", @@ -19420,8 +19524,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -19643,8 +19746,7 @@ "version": "8.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "requires": {} + "dev": true }, "y18n": { "version": "5.0.8", @@ -19654,7 +19756,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yaml": { "version": "1.10.2", diff --git a/frontend/package.json b/frontend/package.json index 5d3ab5e3..e8180256 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,10 +20,12 @@ "@angular/platform-browser-dynamic": "~13.2.0", "@angular/router": "~13.2.0", "@auth0/angular-jwt": "^5.0.2", - "ngx-cookie-service": "^13.1.2", "@ng-bootstrap/ng-bootstrap": "^12.0.0", "@popperjs/core": "^2.10.2", "bootstrap": "^5.1.3", + "csv-parser": "^3.0.0", + "ngx-cookie-service": "^13.1.2", + "ngx-csv-parser": "^0.0.7", "rxjs": "~7.5.0", "tslib": "^2.3.0", "zone.js": "~0.11.4" @@ -42,4 +44,4 @@ "karma-jasmine-html-reporter": "~1.7.0", "typescript": "~4.5.2" } -} \ No newline at end of file +} diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.css b/frontend/src/app/_elements/dataset-load/dataset-load.component.css new file mode 100644 index 00000000..e69de29b diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.html b/frontend/src/app/_elements/dataset-load/dataset-load.component.html new file mode 100644 index 00000000..934aa5eb --- /dev/null +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.html @@ -0,0 +1,16 @@ +
+ + + + + + + + + + + + + +
{{item}}
{{item[j]}}
+
\ No newline at end of file diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.spec.ts b/frontend/src/app/_elements/dataset-load/dataset-load.component.spec.ts new file mode 100644 index 00000000..5601b57b --- /dev/null +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DatasetLoadComponent } from './dataset-load.component'; + +describe('DatasetLoadComponent', () => { + let component: DatasetLoadComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ DatasetLoadComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(DatasetLoadComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts new file mode 100644 index 00000000..d97e7cbe --- /dev/null +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts @@ -0,0 +1,82 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; + +@Component({ + selector: 'app-dataset-load', + templateUrl: './dataset-load.component.html', + styleUrls: ['./dataset-load.component.css'] +}) +export class DatasetLoadComponent { + + //array varibales to store csv data + lines : any[] = []; //for headings + linesR : any[] = []; // for rows + +/* + const csv = require('csv-parser') + const fs = require('fs') + const res : string[] = []; + + fs.createReadStream('https://raw.githubusercontent.com/sharmaroshan/Churn-Modelling-Dataset/master/Churn_Modelling.csv') + .pipe(csv()) + .on('data', (data : string) => res.push(data)) + .on('end', () => { + console.log(res); + +*/ + + changeListener(files: FileList) { + + console.log(files); + + if(files && files.length > 0) { + + let file: File | null = files.item(0); + if (file == null) + return; + + if (file) { + console.log(file.name); + console.log(file.size); + console.log(file.type); + //File reader method + let reader: FileReader = new FileReader(); + reader.readAsText(file); + reader.onload = (e) => { + let csv: any = reader.result; + let allTextLines = []; + allTextLines = csv.split(/\r|\n|\r/); + + //Table Headings + let headers = allTextLines[0].split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/); + let data = headers; + let tarr = []; + for (let j = 0; j < headers.length; j++) { + tarr.push(data[j]); + } + //Pusd headings to array variable + this.lines.push(tarr); + //console.log(this.lines); + + + // Table Rows + let tarrR : string[] = []; + + let arrl = allTextLines.length; + let rows = []; + for(let i = 1; i < arrl; i++){ + rows.push(allTextLines[i].split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/)); + + } + + for (let j = 0; j < arrl; j++) { + tarrR.push(rows[j]); + } + //Push rows to array variable + this.linesR.push(tarrR); + console.log(this.linesR); + } + } + } + } + +} diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 1868e56c..af8bc237 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -5,11 +5,13 @@ import { LoginPageComponent } from './_pages/login-page/login-page.component'; import { OnlyAuthorizedComponent } from './_pages/only-authorized/only-authorized.component'; import { RegisterPageComponent } from './_pages/register-page/register-page.component'; import { AuthGuardService } from './_services/auth-guard.service'; +import { DatasetLoadComponent } from './_elements/dataset-load/dataset-load.component'; const routes: Routes = [ { path: 'login', component: LoginPageComponent }, { path: 'register', component: RegisterPageComponent }, - { path: 'only-authorized', component: OnlyAuthorizedComponent, canActivate: [AuthGuardService] } + { path: 'only-authorized', component: OnlyAuthorizedComponent, canActivate: [AuthGuardService] }, + { path: 'proba', component: DatasetLoadComponent} ]; @NgModule({ diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index 9ccd7ddb..bada926e 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -9,13 +9,16 @@ import { LoginPageComponent } from './_pages/login-page/login-page.component'; import { RegisterPageComponent } from './_pages/register-page/register-page.component'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { OnlyAuthorizedComponent } from './_pages/only-authorized/only-authorized.component'; +import { DatasetLoadComponent } from './_elements/dataset-load/dataset-load.component'; +import { CsvParser } from 'csv-parser'; @NgModule({ declarations: [ AppComponent, LoginPageComponent, RegisterPageComponent, - OnlyAuthorizedComponent + OnlyAuthorizedComponent, + DatasetLoadComponent ], imports: [ BrowserModule, -- cgit v1.2.3 From a6f994c8bcd6949c186fe4209ad5a5f5f9f58eb5 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Wed, 9 Mar 2022 22:27:02 +0100 Subject: Komponenta za ucitavanje i prikaz csv fajla v2 --- backend/api/api/Controllers/AuthController.cs | 14 +- backend/api/api/Controllers/UserController.cs | 91 +++ backend/api/api/Data/MongoDbSettings.cs | 17 - backend/api/api/Data/UserStoreDatabaseSettings.cs | 13 + .../api/Interfaces/IUserStoreDatabaseSettings.cs | 9 + backend/api/api/Models/User.cs | 24 +- backend/api/api/Program.cs | 40 ++ backend/api/api/Services/AuthService.cs | 41 +- backend/api/api/Services/IAuthService.cs | 10 + backend/api/api/Services/IUserService.cs | 13 + backend/api/api/Services/MongoDbService.cs | 11 - backend/api/api/Services/UserService.cs | 54 ++ backend/api/api/api.csproj | 1 + backend/api/api/appsettings.json | 9 +- backend/microservice/classificationCNN.ipynb | 683 +++++++++++++++++++++ .../dataset-load/dataset-load.component.html | 40 +- .../dataset-load/dataset-load.component.ts | 93 +-- frontend/src/app/app.module.ts | 2 +- 18 files changed, 1039 insertions(+), 126 deletions(-) create mode 100644 backend/api/api/Controllers/UserController.cs delete mode 100644 backend/api/api/Data/MongoDbSettings.cs create mode 100644 backend/api/api/Data/UserStoreDatabaseSettings.cs create mode 100644 backend/api/api/Interfaces/IUserStoreDatabaseSettings.cs create mode 100644 backend/api/api/Services/IAuthService.cs create mode 100644 backend/api/api/Services/IUserService.cs delete mode 100644 backend/api/api/Services/MongoDbService.cs create mode 100644 backend/api/api/Services/UserService.cs create mode 100644 backend/microservice/classificationCNN.ipynb (limited to 'frontend') diff --git a/backend/api/api/Controllers/AuthController.cs b/backend/api/api/Controllers/AuthController.cs index 1f47067f..c74c579d 100644 --- a/backend/api/api/Controllers/AuthController.cs +++ b/backend/api/api/Controllers/AuthController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using api.Services; +using Microsoft.AspNetCore.Authorization; namespace api.Controllers { @@ -9,10 +10,10 @@ namespace api.Controllers [ApiController] public class AuthController : ControllerBase { - private AuthService _auth; - public AuthController(IConfiguration configuration) + private IAuthService _auth; + public AuthController(IAuthService auth) { - _auth=new AuthService(configuration); + _auth = auth; } [HttpPost("register")] @@ -29,6 +30,13 @@ namespace api.Controllers return Ok(_auth.Login(user)); } + [HttpGet("Auth")] + [Authorize(Roles ="User")] + public async Task> TestAuth() + { + return Ok("works"); + } + } } diff --git a/backend/api/api/Controllers/UserController.cs b/backend/api/api/Controllers/UserController.cs new file mode 100644 index 00000000..b1544477 --- /dev/null +++ b/backend/api/api/Controllers/UserController.cs @@ -0,0 +1,91 @@ +using api.Models; +using api.Services; +using Microsoft.AspNetCore.Mvc; +using System.Diagnostics; + +// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 +//dovrsi kontroler +namespace api.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class UserController : ControllerBase + { + private readonly IUserService userService; + + public UserController(IUserService userService) + { + this.userService = userService; + } + + // GET: api/ + [HttpGet] + public ActionResult> Get() + { + return userService.Get(); + } + + // GET api//5 + //potrebno za profile page + [HttpGet("{id}")] + public ActionResult Get(string id) + { + var user = userService.Get(id); + + if (user == null) + return NotFound($"User with Id = {id} not found"); + + return user; + } + + // POST api/ + [HttpPost] + public ActionResult Post([FromBody] User user) + { + userService.Create(user); + + //Debug.WriteLine("\nTest.\n"); + + return CreatedAtAction(nameof(Get), new { id = user._id }, user); + + } + + // PUT api//5 + [HttpPut("{id}")] + public ActionResult Put(string id, [FromBody] User user) + { + var existingUser = userService.Get(id); + + if(existingUser == null) + return NotFound($"User with Id = {id} not found"); + + userService.Update(id, existingUser); + return NoContent(); + } + + // DELETE api//5 + [HttpDelete("{id}")] + public ActionResult Delete(string id) + { + var user = userService.Get(id); + + if (user == null) + return NotFound($"User with Id = {id} not found"); + + userService.Delete(user._id); + return Ok($"Student with Id = {id} deleted"); + } + } +} +/* +{ + "userId": { + "$oid": "62276146c4a20eabc664abc3" + }, + "username" : "ivan996sk", + "email" : "ivan996sk@gmail.com", + "password" : "proba", + "firstName" : "Ivan", + "lastName" : "Ljubisavljevic" +} +*/ \ No newline at end of file diff --git a/backend/api/api/Data/MongoDbSettings.cs b/backend/api/api/Data/MongoDbSettings.cs deleted file mode 100644 index 8b42a02c..00000000 --- a/backend/api/api/Data/MongoDbSettings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using MongoDB.Driver; - -namespace api.Data -{ - public class MongoDbSettings - { - public string? ConnectionURI { get; set; } = null; - public string? DatabaseName { get; set; } = null; - public string? CollectionName { get; set; } = null; - - - - - - } -} diff --git a/backend/api/api/Data/UserStoreDatabaseSettings.cs b/backend/api/api/Data/UserStoreDatabaseSettings.cs new file mode 100644 index 00000000..0efd2895 --- /dev/null +++ b/backend/api/api/Data/UserStoreDatabaseSettings.cs @@ -0,0 +1,13 @@ +using Microsoft.EntityFrameworkCore; +using MongoDB.Driver; +using api.Interfaces; + +namespace api.Data +{ + public class UserStoreDatabaseSettings : IUserStoreDatabaseSettings + { + public string ConnectionString { get; set; } = String.Empty; + public string DatabaseName { get; set; } = String.Empty; + public string CollectionName { get; set; } = String.Empty; + } +} diff --git a/backend/api/api/Interfaces/IUserStoreDatabaseSettings.cs b/backend/api/api/Interfaces/IUserStoreDatabaseSettings.cs new file mode 100644 index 00000000..43fe9b3a --- /dev/null +++ b/backend/api/api/Interfaces/IUserStoreDatabaseSettings.cs @@ -0,0 +1,9 @@ +namespace api.Interfaces +{ + public interface IUserStoreDatabaseSettings + { + string ConnectionString { get; set; } + string DatabaseName { get; set; } + string CollectionName { get; set; } + } +} diff --git a/backend/api/api/Models/User.cs b/backend/api/api/Models/User.cs index d0f2bc0f..46db50ab 100644 --- a/backend/api/api/Models/User.cs +++ b/backend/api/api/Models/User.cs @@ -1,18 +1,28 @@ using System.ComponentModel.DataAnnotations; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + namespace api.Models { + [BsonIgnoreExtraElements]//ignorise visak elemenata iz baze --moze da se obrise jer nemamo viska public class User { - [Key] - public Guid userId { get; set; } - public string username { get; set; } - public string email { get; set; } - public string password { get; set; } + [BsonId] + [BsonRepresentation(BsonType.ObjectId)]//mongo data type to .net + public string _id { get; set; } + [BsonElement("username")] + public string Username { get; set; } + [BsonElement("email")] + public string Email { get; set; } + [BsonElement("password")] + public string Password { get; set; } - public string firstName { get; set; } - public int lastName { get; set; } + [BsonElement("firstName")] + public string FirstName { get; set; } + [BsonElement("lastName")] + public string LastName { get; set; } } } diff --git a/backend/api/api/Program.cs b/backend/api/api/Program.cs index 84514972..550f6ce1 100644 --- a/backend/api/api/Program.cs +++ b/backend/api/api/Program.cs @@ -1,9 +1,46 @@ +using System.Text; +using api.Data; +using api.Interfaces; +using api.Services; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Tokens; +using MongoDB.Driver; + var builder = WebApplication.CreateBuilder(args); //Add Cors builder.Services.AddCors(); // Add services to the container +//dodajemo dep inj + +builder.Services.Configure( + builder.Configuration.GetSection(nameof(UserStoreDatabaseSettings))); + +builder.Services.AddSingleton(sp => + sp.GetRequiredService>().Value); + +builder.Services.AddSingleton(s => + new MongoClient(builder.Configuration.GetValue("UserStoreDatabaseSettings:ConnectionString"))); + +//Inject Dependencies +builder.Services.AddScoped(); +builder.Services.AddScoped(); + +//Add Authentication +builder.Services.AddAuthentication( + JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => { + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuerSigningKey = true, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(builder.Configuration.GetSection("AppSettings:JwtToken").Value)), + ValidateIssuer=false, + ValidateAudience=false + }; + + }); + builder.Services.AddControllers(); @@ -19,6 +56,9 @@ app.UseCors( // Configure the HTTP request pipeline. +//Add Authentication +app.UseAuthentication(); + app.UseAuthorization(); app.MapControllers(); diff --git a/backend/api/api/Services/AuthService.cs b/backend/api/api/Services/AuthService.cs index 1a901cb8..015fdac7 100644 --- a/backend/api/api/Services/AuthService.cs +++ b/backend/api/api/Services/AuthService.cs @@ -1,34 +1,47 @@ -using api.Models; +using api.Interfaces; +using api.Models; using api.Models.Users; +using MongoDB.Driver; namespace api.Services { - public class AuthService + public class AuthService : IAuthService { private JwtToken _jwt; private readonly IConfiguration _configuration; - public AuthService(IConfiguration configuration) + private readonly IMongoCollection _users; + public AuthService(IConfiguration configuration, IUserStoreDatabaseSettings settings, IMongoClient mongoClient) { _configuration = configuration; _jwt = new JwtToken(_configuration); + var database = mongoClient.GetDatabase(settings.DatabaseName); + _users = database.GetCollection(settings.CollectionName); } public string Login(AuthRequest user) { - //Check username in DB - - //Verify password - - //gen token - + User u = _users.Find(x => x.Username == user.UserName).FirstOrDefault(); + if (u == null) + return "Username doesn't exist"; + if (!PasswordCrypt.checkPassword(user.Password, u.Password)) + return "Wrong password"; return _jwt.GenToken(user); } - public RegisterRequest Register(RegisterRequest user) + public string Register(RegisterRequest user) { - //check for existing email and username - user.password = PasswordCrypt.hashPassword(user.password); - //Add to DB. TO DO - return user; + User u = new User(); + u.Username = user.username; + u.Email = user.email; + u.Password = PasswordCrypt.hashPassword(user.password); + u.FirstName = user.firstName; + u.LastName = user.lastName; + if (_users.Find(user => user.Username == u.Username).FirstOrDefault() != null) + return "Username Already Exists"; + if (_users.Find(user => user.Email == u.Email).FirstOrDefault() != null) + return "Email Already Exists"; + + _users.InsertOne(u); + return "User added"; } diff --git a/backend/api/api/Services/IAuthService.cs b/backend/api/api/Services/IAuthService.cs new file mode 100644 index 00000000..79085f8c --- /dev/null +++ b/backend/api/api/Services/IAuthService.cs @@ -0,0 +1,10 @@ +using api.Models.Users; + +namespace api.Services +{ + public interface IAuthService + { + string Login(AuthRequest user); + string Register(RegisterRequest user); + } +} \ No newline at end of file diff --git a/backend/api/api/Services/IUserService.cs b/backend/api/api/Services/IUserService.cs new file mode 100644 index 00000000..e9f14c8b --- /dev/null +++ b/backend/api/api/Services/IUserService.cs @@ -0,0 +1,13 @@ +using api.Models; + +namespace api.Services +{ + public interface IUserService + { + List Get();// daje sve korisnike + User Get(string id); //daje korisnika po id-u + User Create(User user); // kreira korisnika + void Update(string id, User user); //apdejruje korisnika po idu + void Delete(string id);//brise korisnika + } +} diff --git a/backend/api/api/Services/MongoDbService.cs b/backend/api/api/Services/MongoDbService.cs deleted file mode 100644 index f8b37536..00000000 --- a/backend/api/api/Services/MongoDbService.cs +++ /dev/null @@ -1,11 +0,0 @@ - - - -namespace api.Services -{ - public class MongoDbService - { - - - } -} diff --git a/backend/api/api/Services/UserService.cs b/backend/api/api/Services/UserService.cs new file mode 100644 index 00000000..e5d1bb32 --- /dev/null +++ b/backend/api/api/Services/UserService.cs @@ -0,0 +1,54 @@ +using api.Interfaces; +using api.Models; +using MongoDB.Driver; + +namespace api.Services +{ + public class UserService : IUserService + { + private readonly IMongoCollection _users; + + public UserService(IUserStoreDatabaseSettings settings, IMongoClient mongoClient) + { + var database = mongoClient.GetDatabase(settings.DatabaseName); + _users = database.GetCollection(settings.CollectionName); + } + public User Create(User user) + { + _users.InsertOne(user); + return user; + } + + + + public List Get() + { + return _users.Find(user => true).ToList(); + } + + public User Get(string id) + { + return _users.Find(user => user._id == id).FirstOrDefault(); + } + + public void Delete(string id) + { + _users.DeleteOne(user => user._id == id); + + } + public void Update(string id, User user) + { + _users.ReplaceOne(user => user._id == id, user); + } + } +} +/* + { + "_id": "", + "username" : "ivan996sk", + "email" : "ivan996sk@gmail.com", + "password" : "proba", + "firstName" : "Ivan", + "lastName" : "Ljubisavljevic" +} + */ \ No newline at end of file diff --git a/backend/api/api/api.csproj b/backend/api/api/api.csproj index 1451fa77..6081cd21 100644 --- a/backend/api/api/api.csproj +++ b/backend/api/api/api.csproj @@ -8,6 +8,7 @@ + diff --git a/backend/api/api/appsettings.json b/backend/api/api/appsettings.json index b9144d93..d2c95254 100644 --- a/backend/api/api/appsettings.json +++ b/backend/api/api/appsettings.json @@ -9,10 +9,9 @@ } }, "AllowedHosts": "*", - "MongoDb": { - "ConnectionURI": "mongodb+srv://LINKIKKKKKKK", - "DatabaseName": "", - "CollectionName": "" - + "UserStoreDatabaseSettings": { + "ConnectionString": "mongodb://127.0.0.1:27017/", + "DatabaseName": "si_project", + "CollectionName": "User" } } diff --git a/backend/microservice/classificationCNN.ipynb b/backend/microservice/classificationCNN.ipynb new file mode 100644 index 00000000..b79577e1 --- /dev/null +++ b/backend/microservice/classificationCNN.ipynb @@ -0,0 +1,683 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "classificationCNN.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "0g9hqhtBez9M" + }, + "outputs": [], + "source": [ + "from keras.datasets import mnist" + ] + }, + { + "cell_type": "code", + "source": [ + "(X_train, y_train), (X_test, y_test) = mnist.load_data()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mnHLMwq5fFYN", + "outputId": "6d82dea4-9ae0-4ef7-bc88-fbd3a933965a" + }, + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n", + "11493376/11490434 [==============================] - 0s 0us/step\n", + "11501568/11490434 [==============================] - 0s 0us/step\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "X_train.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "88HYktIFfFTd", + "outputId": "65562967-3667-4adb-a239-1b4dde68cb61" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(60000, 28, 28)" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "code", + "source": [ + "import keras.backend as K" + ], + "metadata": { + "id": "iAkFNG3wfFPD" + }, + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# (60000, 1, 28, 28)\n", + "# (60000, 28, 28, 1)\n", + "img_size = X_train.shape[1]\n", + "if K.image_data_format() == 'channels_first':\n", + " X_train = X_train.reshape(X_train.shape[0], 1, img_size, img_size)\n", + " X_test = X_test.reshape(X_test.shape[0], 1, img_size, img_size)\n", + "else:\n", + " X_train = X_train.reshape(X_train.shape[0], img_size, img_size, 1)\n", + " X_test = X_test.reshape(X_test.shape[0], img_size, img_size, 1)" + ], + "metadata": { + "id": "QBL_5PO7fFMa" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "X_train.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "oirq1wVlfFJ5", + "outputId": "60d7801c-98ed-48c0-ee57-67afbf800fe3" + }, + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(60000, 28, 28, 1)" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "code", + "source": [ + "X_train = X_train / 255" + ], + "metadata": { + "id": "FO4wGXXDfFHm" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "X_test = X_test / 255" + ], + "metadata": { + "id": "9w3bEQ4gfFFS" + }, + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "y_train.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OjdLctDtfFCO", + "outputId": "17b5ad38-f66e-41a5-8935-d0de7481652c" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(60000,)" + ] + }, + "metadata": {}, + "execution_count": 9 + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_train[0]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EhodYEHRfFAN", + "outputId": "f45d6cee-c132-4674-d179-d661872b7e2a" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "5" + ] + }, + "metadata": {}, + "execution_count": 10 + } + ] + }, + { + "cell_type": "code", + "source": [ + "from tensorflow.keras.utils import to_categorical" + ], + "metadata": { + "id": "j8ssc39YfE97" + }, + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "num_classes = 10\n", + "y_train = to_categorical(y_train, num_classes)\n", + "y_test = to_categorical(y_test, num_classes)" + ], + "metadata": { + "id": "F0KAsy7SfE7k" + }, + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "y_train.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "jz5cSWzvfE4z", + "outputId": "2dddc1bb-759c-47d9-fc2e-7175105fd7ad" + }, + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(60000, 10)" + ] + }, + "metadata": {}, + "execution_count": 13 + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_train[0]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fhKVJUBQfE2a", + "outputId": "9178a8a4-fff6-498a-80f7-fa87f21e70a3" + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0., 0., 0., 0., 0., 1., 0., 0., 0., 0.], dtype=float32)" + ] + }, + "metadata": {}, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "source": [ + "from keras.models import Sequential\n", + "from keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout" + ], + "metadata": { + "id": "rvdolRvLfEzg" + }, + "execution_count": 15, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "input_shape = X_train.shape[1:]\n", + "input_shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Q4e_AIYxfEw_", + "outputId": "6d92e152-2a60-4b5e-c1e7-de84a9ffdca1" + }, + "execution_count": 16, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(28, 28, 1)" + ] + }, + "metadata": {}, + "execution_count": 16 + } + ] + }, + { + "cell_type": "code", + "source": [ + "model = Sequential()\n", + "model.add(Conv2D(32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu', input_shape=input_shape))\n", + "model.add(MaxPooling2D(pool_size=(2,2)))\n", + "model.add(Conv2D(64, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'))\n", + "model.add(MaxPooling2D(pool_size=(2,2)))\n", + "#\n", + "model.add(Dropout(0.2))\n", + "model.add(Flatten())\n", + "model.add(Dense(units=64, activation='relu'))\n", + "#\n", + "model.add(Dropout(0.5))\n", + "model.add(Dense(units=num_classes, activation='softmax'))\n", + "model.summary()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-mYbag3yfhsZ", + "outputId": "8641dd4a-424e-48eb-c21e-1c7f3906dc4b" + }, + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " conv2d (Conv2D) (None, 28, 28, 32) 320 \n", + " \n", + " max_pooling2d (MaxPooling2D (None, 14, 14, 32) 0 \n", + " ) \n", + " \n", + " conv2d_1 (Conv2D) (None, 14, 14, 64) 18496 \n", + " \n", + " max_pooling2d_1 (MaxPooling (None, 7, 7, 64) 0 \n", + " 2D) \n", + " \n", + " dropout (Dropout) (None, 7, 7, 64) 0 \n", + " \n", + " flatten (Flatten) (None, 3136) 0 \n", + " \n", + " dense (Dense) (None, 64) 200768 \n", + " \n", + " dropout_1 (Dropout) (None, 64) 0 \n", + " \n", + " dense_1 (Dense) (None, 10) 650 \n", + " \n", + "=================================================================\n", + "Total params: 220,234\n", + "Trainable params: 220,234\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])" + ], + "metadata": { + "id": "9hbTVxflfhoG" + }, + "execution_count": 18, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "history = model.fit(X_train, y_train, batch_size=128, epochs=10, validation_split=0.2)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "g8ZGgOkYfhkA", + "outputId": "97821855-ca96-4f67-fe78-b6cf8220361e" + }, + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/10\n", + "375/375 [==============================] - 15s 12ms/step - loss: 0.4360 - accuracy: 0.8645 - val_loss: 0.0841 - val_accuracy: 0.9750\n", + "Epoch 2/10\n", + "375/375 [==============================] - 4s 10ms/step - loss: 0.1489 - accuracy: 0.9557 - val_loss: 0.0564 - val_accuracy: 0.9842\n", + "Epoch 3/10\n", + "375/375 [==============================] - 4s 10ms/step - loss: 0.1126 - accuracy: 0.9669 - val_loss: 0.0462 - val_accuracy: 0.9863\n", + "Epoch 4/10\n", + "375/375 [==============================] - 4s 10ms/step - loss: 0.0923 - accuracy: 0.9732 - val_loss: 0.0424 - val_accuracy: 0.9877\n", + "Epoch 5/10\n", + "375/375 [==============================] - 4s 10ms/step - loss: 0.0776 - accuracy: 0.9761 - val_loss: 0.0384 - val_accuracy: 0.9891\n", + "Epoch 6/10\n", + "375/375 [==============================] - 4s 10ms/step - loss: 0.0724 - accuracy: 0.9785 - val_loss: 0.0417 - val_accuracy: 0.9883\n", + "Epoch 7/10\n", + "375/375 [==============================] - 4s 10ms/step - loss: 0.0640 - accuracy: 0.9803 - val_loss: 0.0365 - val_accuracy: 0.9895\n", + "Epoch 8/10\n", + "375/375 [==============================] - 4s 10ms/step - loss: 0.0593 - accuracy: 0.9827 - val_loss: 0.0380 - val_accuracy: 0.9898\n", + "Epoch 9/10\n", + "375/375 [==============================] - 4s 10ms/step - loss: 0.0523 - accuracy: 0.9837 - val_loss: 0.0353 - val_accuracy: 0.9899\n", + "Epoch 10/10\n", + "375/375 [==============================] - 4s 10ms/step - loss: 0.0502 - accuracy: 0.9850 - val_loss: 0.0425 - val_accuracy: 0.9889\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from matplotlib import pyplot as plt" + ], + "metadata": { + "id": "WlhMk7cWfhhD" + }, + "execution_count": 20, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "plt.plot(history.epoch, history.history['loss'])\n", + "plt.plot(history.epoch, history.history['val_loss'])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 284 + }, + "id": "E3ZNW5o8fpXH", + "outputId": "8d517369-aa8b-4963-9310-ad4555996786" + }, + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": {}, + "execution_count": 21 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "source": [ + "plt.plot(history.epoch, history.history['accuracy'])\n", + "plt.plot(history.epoch, history.history['val_accuracy'])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 283 + }, + "id": "25zeWoN6fpTt", + "outputId": "028d6a2f-eb96-4fd7-e3fb-5e08813c14b9" + }, + "execution_count": 22, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": {}, + "execution_count": 22 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "source": [ + "model.evaluate(X_test, y_test)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "NSNK9zcwfpQc", + "outputId": "47ccee65-0885-4c7e-86bc-05cf390f69bd" + }, + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "313/313 [==============================] - 1s 4ms/step - loss: 0.0326 - accuracy: 0.9894\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[0.032551269978284836, 0.9894000291824341]" + ] + }, + "metadata": {}, + "execution_count": 23 + } + ] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.metrics import confusion_matrix, classification_report\n", + "import numpy as np" + ], + "metadata": { + "id": "DRxul_2efpL3" + }, + "execution_count": 24, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "y_test.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RnzBynjHfvNj", + "outputId": "820fc2b7-28d5-4e3f-906e-bf5b3502f06d" + }, + "execution_count": 25, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(10000, 10)" + ] + }, + "metadata": {}, + "execution_count": 25 + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_true = np.argmax(y_test, axis=1)\n", + "y_pred = np.argmax(model.predict(X_test), axis=1)\n", + "\n", + "confusion_matrix(y_true, y_pred)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fqD4k5PPfvHT", + "outputId": "d67d6653-cc41-4fbc-98f7-19bec5c78a93" + }, + "execution_count": 26, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 977, 1, 0, 0, 0, 0, 0, 1, 1, 0],\n", + " [ 0, 1134, 1, 0, 0, 0, 0, 0, 0, 0],\n", + " [ 3, 1, 1023, 0, 0, 0, 0, 5, 0, 0],\n", + " [ 0, 0, 1, 1001, 0, 4, 0, 2, 2, 0],\n", + " [ 0, 0, 0, 0, 981, 0, 0, 0, 0, 1],\n", + " [ 2, 1, 0, 3, 0, 883, 1, 1, 0, 1],\n", + " [ 7, 3, 0, 0, 1, 5, 941, 0, 1, 0],\n", + " [ 0, 2, 2, 0, 0, 0, 0, 1020, 1, 3],\n", + " [ 8, 1, 4, 1, 3, 1, 1, 4, 946, 5],\n", + " [ 0, 2, 0, 0, 8, 3, 0, 8, 0, 988]])" + ] + }, + "metadata": {}, + "execution_count": 26 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(classification_report(y_true, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "k_ywfr01fvAv", + "outputId": "386065f9-6fac-4fea-c76f-f6dfc49718b6" + }, + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.98 1.00 0.99 980\n", + " 1 0.99 1.00 0.99 1135\n", + " 2 0.99 0.99 0.99 1032\n", + " 3 1.00 0.99 0.99 1010\n", + " 4 0.99 1.00 0.99 982\n", + " 5 0.99 0.99 0.99 892\n", + " 6 1.00 0.98 0.99 958\n", + " 7 0.98 0.99 0.99 1028\n", + " 8 0.99 0.97 0.98 974\n", + " 9 0.99 0.98 0.98 1009\n", + "\n", + " accuracy 0.99 10000\n", + " macro avg 0.99 0.99 0.99 10000\n", + "weighted avg 0.99 0.99 0.99 10000\n", + "\n" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.html b/frontend/src/app/_elements/dataset-load/dataset-load.component.html index 934aa5eb..48883ba0 100644 --- a/frontend/src/app/_elements/dataset-load/dataset-load.component.html +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.html @@ -1,16 +1,46 @@
- - + + + + + +     + + + + + +

+ + + - + - - + + + + +
{{item}}{{item}}
{{item[j]}}
{{col}}
+
+ . . .
+ {{rowsNumber}} x {{colsNumber}} +
+
\ No newline at end of file diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts index d97e7cbe..7cdfe384 100644 --- a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts @@ -1,4 +1,5 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, ViewChild } from '@angular/core'; +import { NgxCsvParser, NgxCSVParserError } from 'ngx-csv-parser'; @Component({ selector: 'app-dataset-load', @@ -7,76 +8,42 @@ import { Component, OnInit, ViewChild } from '@angular/core'; }) export class DatasetLoadComponent { - //array varibales to store csv data - lines : any[] = []; //for headings - linesR : any[] = []; // for rows + delimiter: string = ""; + delimiterOptions: Array = [",", ";", "\t", "razmak", "|"]; //podrazumevano "," -/* - const csv = require('csv-parser') - const fs = require('fs') - const res : string[] = []; + header: string = ""; + headerOptions: Array = ["Da", "Ne"]; //podrazumevano je "Da" ======> false - fs.createReadStream('https://raw.githubusercontent.com/sharmaroshan/Churn-Modelling-Dataset/master/Churn_Modelling.csv') - .pipe(csv()) - .on('data', (data : string) => res.push(data)) - .on('end', () => { - console.log(res); + slice: string = ""; -*/ + csvRecords: any[] = []; + rowsNumber: number = 0; + colsNumber: number = 0; - changeListener(files: FileList) { + constructor(private ngxCsvParser: NgxCsvParser) { + } + + @ViewChild('fileImportInput', { static: false }) fileImportInput: any; + + changeListener($event: any): void { - console.log(files); + const files = $event.srcElement.files; - if(files && files.length > 0) { - - let file: File | null = files.item(0); - if (file == null) - return; + this.ngxCsvParser.parse(files[0], { header: (this.header == "") ? false : (this.header == "Da") ? false : true, delimiter: (this.delimiter == "razmak") ? " " : (this.delimiter == "") ? "," : this.delimiter}) + .pipe().subscribe((result) => { - if (file) { - console.log(file.name); - console.log(file.size); - console.log(file.type); - //File reader method - let reader: FileReader = new FileReader(); - reader.readAsText(file); - reader.onload = (e) => { - let csv: any = reader.result; - let allTextLines = []; - allTextLines = csv.split(/\r|\n|\r/); - - //Table Headings - let headers = allTextLines[0].split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/); - let data = headers; - let tarr = []; - for (let j = 0; j < headers.length; j++) { - tarr.push(data[j]); - } - //Pusd headings to array variable - this.lines.push(tarr); - //console.log(this.lines); - - - // Table Rows - let tarrR : string[] = []; - - let arrl = allTextLines.length; - let rows = []; - for(let i = 1; i < arrl; i++){ - rows.push(allTextLines[i].split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/)); - - } - - for (let j = 0; j < arrl; j++) { - tarrR.push(rows[j]); - } - //Push rows to array variable - this.linesR.push(tarrR); - console.log(this.linesR); + console.log('Result', result); + if (result.constructor === Array) { + this.csvRecords = result; + this.rowsNumber = this.csvRecords.length; + this.colsNumber = this.csvRecords[0].length; } - } - } + + }, (error: NgxCSVParserError) => { + console.log('Error', error); + }); + } + } diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index bada926e..4f26046e 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -10,7 +10,7 @@ import { RegisterPageComponent } from './_pages/register-page/register-page.comp import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { OnlyAuthorizedComponent } from './_pages/only-authorized/only-authorized.component'; import { DatasetLoadComponent } from './_elements/dataset-load/dataset-load.component'; -import { CsvParser } from 'csv-parser'; +import { NgxCsvParser } from 'ngx-csv-parser'; @NgModule({ declarations: [ -- cgit v1.2.3