aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/microservice/api/newmlservice.py5
-rw-r--r--frontend/package-lock.json392
-rw-r--r--frontend/src/app/_elements/column-table/column-table.component.html390
-rw-r--r--frontend/src/app/_elements/column-table/column-table.component.ts82
-rw-r--r--frontend/src/app/_elements/folder/folder.component.ts20
-rw-r--r--frontend/src/app/_elements/form-model/form-model.component.html74
-rw-r--r--frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.css0
-rw-r--r--frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.html12
-rw-r--r--frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.spec.ts25
-rw-r--r--frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.ts21
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.html4
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.ts16
-rw-r--r--frontend/src/app/app.module.ts5
13 files changed, 778 insertions, 268 deletions
diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py
index 631837e5..3244e82f 100644
--- a/backend/microservice/api/newmlservice.py
+++ b/backend/microservice/api/newmlservice.py
@@ -155,7 +155,8 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback):
#print(data)
for col in paramsExperiment["inputColumns"]:
#print(col)
- data[col]=dataset[col]
+ if(col!=paramsExperiment["outputColumn"]):
+ data[col]=dataset[col]
output_column = paramsExperiment["outputColumn"]
data[output_column] = dataset[output_column]
#print(data)
@@ -201,7 +202,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback):
'''
### Enkodiranje
encodings=paramsExperiment["encodings"]
- datafront=dataset.copy()
+ #datafront=dataset.copy()
#svekolone=datafront.columns
#kategorijskekolone=datafront.select_dtypes(include=['object']).columns
for kolonaEncoding in encodings:
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 2ff3ec49..bf1f8dfd 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -459,6 +459,10 @@
"version": "13.2.5",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.5.tgz",
"integrity": "sha512-Xd8xj2Z0ilA4TJAM/JkTtA1CAa6SuebFsEEvabHCRO5MDvtdsIUP91ADUZIqDHy7qe6Qift/rAVN2PXxT2aaNA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"@babel/core": "^7.17.2",
"chokidar": "^3.0.0",
@@ -488,6 +492,10 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
"integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.0"
},
@@ -499,6 +507,10 @@
"version": "7.17.5",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz",
"integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.16.7",
@@ -528,6 +540,10 @@
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"bin": {
"semver": "bin/semver.js"
}
@@ -536,6 +552,10 @@
"version": "7.17.3",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz",
"integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"@babel/types": "^7.17.0",
"jsesc": "^2.5.1",
@@ -549,6 +569,10 @@
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"engines": {
"node": ">=0.10.0"
}
@@ -788,6 +812,10 @@
"version": "7.16.12",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
"integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"@babel/code-frame": "^7.16.7",
"@babel/generator": "^7.16.8",
@@ -817,6 +845,10 @@
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"bin": {
"semver": "bin/semver.js"
}
@@ -825,6 +857,10 @@
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"engines": {
"node": ">=0.10.0"
}
@@ -833,6 +869,10 @@
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
"integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"@babel/types": "^7.16.8",
"jsesc": "^2.5.1",
@@ -846,6 +886,10 @@
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"engines": {
"node": ">=0.10.0"
}
@@ -3511,6 +3555,10 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -3784,6 +3832,10 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"engines": {
"node": ">=8"
}
@@ -3880,6 +3932,10 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"fill-range": "^7.0.1"
},
@@ -4074,6 +4130,10 @@
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"funding": [
{
"type": "individual",
@@ -5110,6 +5170,10 @@
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz",
"integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"engines": {
"node": ">= 0.6.0"
}
@@ -5274,6 +5338,10 @@
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"optional": true,
"dependencies": {
"iconv-lite": "^0.6.2"
@@ -5283,6 +5351,10 @@
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"optional": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -6091,6 +6163,10 @@
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -6267,6 +6343,10 @@
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"hasInstallScript": true,
"optional": true,
"os": [
@@ -6376,6 +6456,10 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -6968,6 +7052,10 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"binary-extensions": "^2.0.0"
},
@@ -7021,6 +7109,10 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"engines": {
"node": ">=0.10.0"
}
@@ -7037,6 +7129,10 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -7063,6 +7159,10 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"engines": {
"node": ">=0.12.0"
}
@@ -7928,6 +8028,10 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"yallist": "^4.0.0"
},
@@ -7939,6 +8043,10 @@
"version": "0.25.7",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
"integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"sourcemap-codec": "^1.4.4"
}
@@ -8568,6 +8676,10 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"engines": {
"node": ">=0.10.0"
}
@@ -9263,6 +9375,10 @@
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"engines": {
"node": ">=8.6"
},
@@ -10077,6 +10193,10 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"picomatch": "^2.2.1"
},
@@ -10382,7 +10502,11 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+<<<<<<< HEAD
+ "dev": true
+=======
"devOptional": true
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"node_modules/sass": {
"version": "1.49.0",
@@ -10512,6 +10636,10 @@
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"lru-cache": "^6.0.0"
},
@@ -10896,7 +11024,12 @@
"node_modules/sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "dev": true
+=======
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"node_modules/spdy": {
"version": "4.0.2",
@@ -11308,6 +11441,10 @@
"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==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"dependencies": {
"is-number": "^7.0.0"
},
@@ -11399,6 +11536,10 @@
"version": "4.5.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -12074,7 +12215,12 @@
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+=======
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"node_modules/yaml": {
"version": "1.10.2",
@@ -12409,6 +12555,10 @@
"version": "13.2.5",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.5.tgz",
"integrity": "sha512-Xd8xj2Z0ilA4TJAM/JkTtA1CAa6SuebFsEEvabHCRO5MDvtdsIUP91ADUZIqDHy7qe6Qift/rAVN2PXxT2aaNA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"@babel/core": "^7.17.2",
"chokidar": "^3.0.0",
@@ -12426,6 +12576,10 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
"integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"@jridgewell/trace-mapping": "^0.3.0"
}
@@ -12434,6 +12588,10 @@
"version": "7.17.5",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz",
"integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.16.7",
@@ -12455,7 +12613,12 @@
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+=======
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
}
}
},
@@ -12463,6 +12626,10 @@
"version": "7.17.3",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz",
"integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"@babel/types": "^7.17.0",
"jsesc": "^2.5.1",
@@ -12472,7 +12639,12 @@
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+<<<<<<< HEAD
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+=======
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
}
}
},
@@ -12617,6 +12789,10 @@
"version": "7.16.12",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
"integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"@babel/code-frame": "^7.16.7",
"@babel/generator": "^7.16.8",
@@ -12638,12 +12814,22 @@
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+=======
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+<<<<<<< HEAD
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+=======
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
}
}
},
@@ -12651,6 +12837,10 @@
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
"integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"@babel/types": "^7.16.8",
"jsesc": "^2.5.1",
@@ -12660,7 +12850,12 @@
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+<<<<<<< HEAD
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+=======
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
}
}
},
@@ -13821,8 +14016,12 @@
"ws": {
"version": "7.5.7",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A=="
+=======
"integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==",
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
}
}
},
@@ -13838,8 +14037,12 @@
"version": "13.2.5",
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.5.tgz",
"integrity": "sha512-obiPvwPe+UJUO8cfNbBxukLKG30F+gLF5/erexwklRknJzS4KP8ciH2on6XlTuXUahpDjbO0pffugFE2I/IszQ==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"@nodelib/fs.scandir": {
"version": "2.1.5",
@@ -14565,8 +14768,12 @@
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
"integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"adjust-sourcemap-loader": {
"version": "4.0.0",
@@ -14694,6 +14901,10 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -14891,7 +15102,12 @@
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+=======
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"bl": {
"version": "4.1.0",
@@ -14962,8 +15178,12 @@
"bootstrap": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q=="
+=======
"integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"brace-expansion": {
"version": "1.1.11",
@@ -14978,6 +15198,10 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"fill-range": "^7.0.1"
}
@@ -15120,6 +15344,10 @@
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@@ -15147,8 +15375,12 @@
"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==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"clean-stack": {
"version": "2.2.0",
@@ -15635,8 +15867,12 @@
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz",
"integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"css-select": {
"version": "4.2.1",
@@ -15902,7 +16138,12 @@
"dependency-graph": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==",
+ "dev": true
+=======
"integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"destroy": {
"version": "1.0.4",
@@ -16037,6 +16278,10 @@
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"optional": true,
"requires": {
"iconv-lite": "^0.6.2"
@@ -16046,6 +16291,10 @@
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"optional": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -16574,6 +16823,10 @@
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"to-regex-range": "^5.0.1"
}
@@ -16701,6 +16954,10 @@
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"optional": true
},
"function-bind": {
@@ -16776,6 +17033,10 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"is-glob": "^4.0.1"
}
@@ -17032,8 +17293,12 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
"integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"ieee754": {
"version": "1.2.1",
@@ -17230,6 +17495,10 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"binary-extensions": "^2.0.0"
}
@@ -17261,7 +17530,12 @@
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+<<<<<<< HEAD
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+=======
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"is-fullwidth-code-point": {
"version": "3.0.0",
@@ -17272,6 +17546,10 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"is-extglob": "^2.1.1"
}
@@ -17291,7 +17569,12 @@
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+=======
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"is-path-cwd": {
"version": "2.2.0",
@@ -17715,8 +17998,12 @@
"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==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"karma-source-map-support": {
"version": "1.4.0",
@@ -17938,6 +18225,10 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"yallist": "^4.0.0"
}
@@ -17946,6 +18237,10 @@
"version": "0.25.7",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
"integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"sourcemap-codec": "^1.4.4"
}
@@ -18411,7 +18706,12 @@
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+=======
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"normalize-range": {
"version": "0.1.2",
@@ -18944,7 +19244,12 @@
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+=======
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"pify": {
"version": "2.3.0",
@@ -19060,8 +19365,12 @@
"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==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"postcss-custom-properties": {
"version": "12.1.4",
@@ -19131,15 +19440,23 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
"integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"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==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"postcss-image-set-function": {
"version": "4.0.6",
@@ -19165,8 +19482,12 @@
"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==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"postcss-lab-function": {
"version": "4.1.1",
@@ -19193,22 +19514,34 @@
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz",
"integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"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==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"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==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"postcss-modules-local-by-default": {
"version": "4.0.0",
@@ -19252,15 +19585,23 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz",
"integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"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==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"postcss-place": {
"version": "7.0.4",
@@ -19325,8 +19666,12 @@
"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==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"postcss-selector-not": {
"version": "5.0.0",
@@ -19500,6 +19845,10 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"picomatch": "^2.2.1"
}
@@ -19731,7 +20080,11 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+<<<<<<< HEAD
+ "dev": true
+=======
"devOptional": true
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"sass": {
"version": "1.49.0",
@@ -19787,8 +20140,12 @@
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"json-schema-traverse": {
"version": "0.4.1",
@@ -19817,6 +20174,10 @@
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"lru-cache": "^6.0.0"
}
@@ -20132,7 +20493,12 @@
"sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "dev": true
+=======
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"spdy": {
"version": "4.0.2",
@@ -20348,8 +20714,12 @@
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"json-schema-traverse": {
"version": "0.4.1",
@@ -20423,6 +20793,10 @@
"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==",
+<<<<<<< HEAD
+ "dev": true,
+=======
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
"requires": {
"is-number": "^7.0.0"
}
@@ -20491,7 +20865,12 @@
"typescript": {
"version": "4.5.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
+ "dev": true
+=======
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"ua-parser-js": {
"version": "0.7.31",
@@ -20700,8 +21079,12 @@
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"json-schema-traverse": {
"version": "0.4.1",
@@ -20947,8 +21330,12 @@
"version": "8.2.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
"integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+<<<<<<< HEAD
+ "dev": true
+=======
"dev": true,
"requires": {}
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"xlsx": {
"version": "0.18.5",
@@ -20972,7 +21359,12 @@
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+<<<<<<< HEAD
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+=======
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+>>>>>>> 2d10f9892404aa82020965cf91178c34b93bdfce
},
"yaml": {
"version": "1.10.2",
diff --git a/frontend/src/app/_elements/column-table/column-table.component.html b/frontend/src/app/_elements/column-table/column-table.component.html
index 53372574..543a0018 100644
--- a/frontend/src/app/_elements/column-table/column-table.component.html
+++ b/frontend/src/app/_elements/column-table/column-table.component.html
@@ -1,125 +1,126 @@
-<div id="tabs">
- <div class="folder-tab p-1 rounded-top" *ngFor="let tab of tabs; let i = index" [style]="'z-index:' + calcZIndex(i) + ' ;'" [ngClass]="{'selected-tab' : selectedTab.index == i, 'hover-tab' : hoveringOverTab?.index == i}">
- <a class="m-1 stretched-link tab-link" (click)="selectTab(i)" (mouseenter)="hoverOverTab(i)" (mouseleave)="hoverOverTab(-1)">
+<div *ngIf="loaded">
+ <div id="tabs">
+ <div class="folder-tab p-1 rounded-top" *ngFor="let tab of tabs; let i = index" [style]="'z-index:' + calcZIndex(i) + ' ;'" [ngClass]="{'selected-tab' : selectedTab.index == i, 'hover-tab' : hoveringOverTab?.index == i}">
+ <a class="m-1 stretched-link tab-link" (click)="selectTab(i)" (mouseenter)="hoverOverTab(i)" (mouseleave)="hoverOverTab(-1)">
{{tab.name}}
</a>
- </div>
- <!--
+ </div>
+ <!--
<button mat-button class="p-1 folder-tab-end rounded-top">
Kolone
<mat-icon>keyboard_double_arrow_down</mat-icon>
</button>
-->
-</div>
-<div id="folder-table" *ngIf="dataset && experiment">
- <!--<div [ngSwitch]="tabToDisplay">-->
- <div id="divTable">
+ </div>
+ <div id="folder-table" *ngIf="dataset && experiment">
+ <!--<div [ngSwitch]="tabToDisplay">-->
+ <div id="divTable">
- <div [ngClass]="{'hidden': tabToDisplay != Table.Data}">
- <table class="table text-offwhite fixed bg-blur">
- <colgroup>
- <col class="col-first">
- <col *ngFor="let column of dataset.columnInfo; let i = index" [ngClass]="{'col-disabled' : !experiment.inputColumns.includes(column.columnName)}">
- </colgroup>
- <thead>
- <tr>
- <th>#</th>
- <th class="columnNames" *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'header-disabled' : !columnsChecked[i]}">
- <div class="cell-align">
- #{{i + 1}}&nbsp;&nbsp;{{colInfo.columnName}}
- <mat-checkbox color="primary" [(ngModel)]="columnsChecked[i]" (change)="changeInputColumns($event, colInfo.columnName)"></mat-checkbox>
- </div>
- </th>
- </tr>
- </thead>
- <tbody>
- <tr *ngFor="let row of tableData; let i = index">
- <th>#{{i}}</th>
- <td *ngFor="let col of row; let j = index" [ngClass]="{'text-disabled' : !columnsChecked[j]}">
- <div class="text-overflow">
- {{col}}
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
+ <div [ngClass]="{'hidden': tabToDisplay != Table.Data}">
+ <table class="table text-offwhite fixed bg-blur">
+ <colgroup>
+ <col class="col-first">
+ <col *ngFor="let column of dataset.columnInfo; let i = index" [ngClass]="{'col-disabled' : !experiment.inputColumns.includes(column.columnName)}">
+ </colgroup>
+ <thead>
+ <tr>
+ <th>#</th>
+ <th class="columnNames" *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'header-disabled' : !columnsChecked[i]}">
+ <div class="cell-align">
+ #{{i + 1}}&nbsp;&nbsp;{{colInfo.columnName}}
+ <mat-checkbox color="primary" [(ngModel)]="columnsChecked[i]" (change)="changeInputColumns($event, colInfo.columnName)"></mat-checkbox>
+ </div>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr *ngFor="let row of tableData; let i = index">
+ <th>#{{i}}</th>
+ <td *ngFor="let col of row; let j = index" [ngClass]="{'text-disabled' : !columnsChecked[j]}">
+ <div class="text-overflow">
+ {{col}}
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
- <div [ngClass]="{'hidden': tabToDisplay != Table.CorrelationMatrix}">
- <table class="table text-offwhite fixed bg-blur">
- <colgroup>
- <col class="col-first">
- <col *ngFor="let column of dataset.columnInfo; let i = index" [ngClass]="{'col-disabled' : !experiment.inputColumns.includes(column.columnName)}">
- </colgroup>
- <thead>
- <tr>
- <th>Kolona</th>
- <th class="columnNames" *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'header-disabled' : !columnsChecked[i]}">
- <div class="cell-align">
- #{{i + 1}}&nbsp;&nbsp;{{colInfo.columnName}}
- <mat-checkbox color="primary" [(ngModel)]="columnsChecked[i]" (change)="changeInputColumns($event, colInfo.columnName)"></mat-checkbox>
- </div>
- </th>
- </tr>
- </thead>
- <tbody>
- <tr *ngFor="let colInfo of dataset.columnInfo; let i = index">
- <th [ngClass]="{'header-disabled col-disabled' : !columnsChecked[i]}">
- <div class="text-left">
- {{colInfo.columnName}}
- </div>
- </th>
- <td *ngFor="let colInfo of dataset.columnInfo; let j = index" [ngClass]="{'text-disabled col-disabled' : !columnsChecked[j] || !columnsChecked[i]}">
- <div class="text-overflow">
- 0.1
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
+ <div [ngClass]="{'hidden': tabToDisplay != Table.CorrelationMatrix}">
+ <table class="table text-offwhite fixed bg-blur">
+ <colgroup>
+ <col class="col-first">
+ <col *ngFor="let column of dataset.columnInfo; let i = index" [ngClass]="{'col-disabled' : !experiment.inputColumns.includes(column.columnName)}">
+ </colgroup>
+ <thead>
+ <tr>
+ <th>Kolona</th>
+ <th class="columnNames" *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'header-disabled' : !columnsChecked[i]}">
+ <div class="cell-align">
+ #{{i + 1}}&nbsp;&nbsp;{{colInfo.columnName}}
+ <mat-checkbox color="primary" [(ngModel)]="columnsChecked[i]" (change)="changeInputColumns($event, colInfo.columnName)"></mat-checkbox>
+ </div>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr *ngFor="let colInfo of dataset.columnInfo; let i = index">
+ <th [ngClass]="{'header-disabled col-disabled' : !columnsChecked[i]}">
+ <div class="text-left">
+ {{colInfo.columnName}}
+ </div>
+ </th>
+ <td *ngFor="let colInfo of dataset.columnInfo; let j = index" [ngClass]="{'text-disabled col-disabled' : !columnsChecked[j] || !columnsChecked[i]}">
+ <div class="text-overflow">
+ 0.1
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
- <div [ngClass]="{'hidden': tabToDisplay != Table.Columns}">
- <table class="table text-offwhite fixed bg-blur">
- <colgroup>
- <col class="col-first">
- <col *ngFor="let column of dataset.columnInfo; let i = index" [ngClass]="{'col-disabled' : !experiment.inputColumns.includes(column.columnName)}">
- </colgroup>
- <thead>
- <tr>
- <th>Naziv</th>
- <th class="columnNames" *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'header-disabled' : !columnsChecked[i]}">
- <div class="cell-align">
- #{{i + 1}}&nbsp;&nbsp;{{colInfo.columnName}}
- <mat-checkbox color="primary" [(ngModel)]="columnsChecked[i]" (change)="changeInputColumns($event, colInfo.columnName)"></mat-checkbox>
- </div>
- </th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <th>Tip</th>
- <td *ngFor="let colInfo of dataset.columnInfo; let i = index" class="pad-fix" [ngClass]="{'text-disabled' : !columnsChecked[i]}">
- <p class="verticalAlign text-left" style="font-size:13px;" *ngIf="!colInfo.isNumber">Kategorijski</p>
- <mat-form-field *ngIf="colInfo.isNumber">
- <mat-select matNativeControl [(value)]="colInfo.columnType" [disabled]="!columnsChecked[i]" (selectionChange)="columnTableChangeDetected()">
- <mat-option [value]="ColumnType.categorical">Kategorijski</mat-option>
- <mat-option [value]="ColumnType.numerical">Numerički</mat-option>
- </mat-select>
- </mat-form-field>
- </td>
- </tr>
- <tr class="graphics-row">
- <th class="no-pad">Grafik</th>
- <td class="no-pad" *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'graphic-class' : !columnsChecked[i]}">
- <app-box-plot *ngIf="colInfo.columnType == ColumnType.numerical" [width]="150" [height]="150"></app-box-plot>
- <app-pie-chart *ngIf="colInfo.columnType == ColumnType.categorical" [width]="150" [height]="150"></app-pie-chart>
- </td>
- </tr>
- <tr>
- <th class="border-bottom">Statistika</th>
- <td *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'text-disabled' : !columnsChecked[i]}" class="text-left">
- <span *ngIf="colInfo.columnType == ColumnType.numerical">
+ <div [ngClass]="{'hidden': tabToDisplay != Table.Columns}">
+ <table class="table text-offwhite fixed bg-blur">
+ <colgroup>
+ <col class="col-first">
+ <col *ngFor="let column of dataset.columnInfo; let i = index" [ngClass]="{'col-disabled' : !experiment.inputColumns.includes(column.columnName)}">
+ </colgroup>
+ <thead>
+ <tr>
+ <th>Naziv</th>
+ <th class="columnNames" *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'header-disabled' : !columnsChecked[i]}">
+ <div class="cell-align">
+ #{{i + 1}}&nbsp;&nbsp;{{colInfo.columnName}}
+ <mat-checkbox color="primary" [(ngModel)]="columnsChecked[i]" (change)="changeInputColumns($event, colInfo.columnName)"></mat-checkbox>
+ </div>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>Tip</th>
+ <td *ngFor="let colInfo of dataset.columnInfo; let i = index" class="pad-fix" [ngClass]="{'text-disabled' : !columnsChecked[i]}">
+ <p class="verticalAlign text-left" style="font-size:13px;" *ngIf="!colInfo.isNumber">Kategorijski</p>
+ <mat-form-field *ngIf="colInfo.isNumber">
+ <mat-select matNativeControl [(value)]="colInfo.columnType" [disabled]="!columnsChecked[i]" (selectionChange)="columnTypeChanged(colInfo.columnName);">
+ <mat-option [value]="ColumnType.categorical">Kategorijski</mat-option>
+ <mat-option [value]="ColumnType.numerical">Numerički</mat-option>
+ </mat-select>
+ </mat-form-field>
+ </td>
+ </tr>
+ <tr class="graphics-row">
+ <th class="no-pad">Grafik</th>
+ <td class="no-pad" *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'graphic-class' : !columnsChecked[i]}">
+ <app-box-plot *ngIf="colInfo.columnType == ColumnType.numerical" [width]="150" [height]="150"></app-box-plot>
+ <app-pie-chart *ngIf="colInfo.columnType == ColumnType.categorical" [width]="150" [height]="150"></app-pie-chart>
+ </td>
+ </tr>
+ <tr>
+ <th class="border-bottom">Statistika</th>
+ <td *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'text-disabled' : !columnsChecked[i]}" class="text-left">
+ <span *ngIf="colInfo.columnType == ColumnType.numerical">
Mean: {{colInfo.mean}}<br>
Median: {{colInfo.median}}<br>
Min: {{colInfo.min}}<br>
@@ -127,104 +128,104 @@
Q1: {{colInfo.q1}}<br>
Q3: {{colInfo.q3}}<br>
</span>
- <div class="text-overflow" *ngIf="colInfo.columnType == ColumnType.categorical && colInfo.uniqueValuesPercent">
- <span *ngFor="let uniqueValue of colInfo.uniqueValues | slice:0:6; let i = index">
- ({{colInfo.uniqueValuesPercent[i].toFixed(4)}}%) {{uniqueValue}}<br>
+ <div class="text-overflow" *ngIf="colInfo.columnType == ColumnType.categorical && colInfo.uniqueValuesPercent">
+ <span *ngFor="let uniqueValue of colInfo.uniqueValues | slice:0:6; let i = index">
+ ({{(colInfo.uniqueValuesPercent[i] * 100).toFixed(2)}}%) {{uniqueValue}}<br>
</span>
- </div>
- </td>
- </tr>
- <tr style="padding: 0">
- <th class="brighter cell-align long" (click)="openEncodingDialog()">
- <span class="verticalAlign">Enkodiranje</span>&nbsp;
- <span class="material-icons-round verticalAlign rotate">settings</span>
- </th>
- <td *ngFor="let colInfo of dataset.columnInfo; let i = index" class="pad-fix" [ngClass]="{'text-disabled' : !columnsChecked[i]}">
- <mat-form-field>
- <mat-select matNativeControl [(value)]="experiment.encodings[i].encoding" [disabled]="!columnsChecked[i]" (selectionChange)="columnTableChangeDetected()">
- <mat-option *ngFor="let option of Object.keys(Encoding); let optionName of Object.values(Encoding)" [value]="option">
- {{ optionName }}
- </mat-option>
- </mat-select>
- </mat-form-field>
- </td>
- </tr>
- <tr>
- <th class="brighter cell-align" (click)="openMissingValuesDialog()">
- <div id="missingValuesHeader">Nedostajuće<br>vrednosti<br></div>
- <span class="material-icons-round rotate">settings</span>
- </th>
- <td *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'text-disabled' : !columnsChecked[i]}">
+ </div>
+ </td>
+ </tr>
+ <tr style="padding: 0">
+ <th class="brighter cell-align long" (click)="openEncodingDialog()">
+ <span class="verticalAlign">Enkodiranje</span>&nbsp;
+ <span class="material-icons-round verticalAlign rotate">settings</span>
+ </th>
+ <td *ngFor="let colInfo of dataset.columnInfo; let i = index" class="pad-fix" [ngClass]="{'text-disabled' : !columnsChecked[i]}">
+ <mat-form-field>
+ <mat-select matNativeControl [(value)]="experiment.encodings[i].encoding" [disabled]="!columnsChecked[i]" (selectionChange)="columnTableChangeDetected()">
+ <mat-option *ngFor="let option of Object.keys(Encoding); let optionName of Object.values(Encoding)" [value]="option">
+ {{ optionName }}
+ </mat-option>
+ </mat-select>
+ </mat-form-field>
+ </td>
+ </tr>
+ <tr>
+ <th class="brighter cell-align" (click)="openMissingValuesDialog()">
+ <div id="missingValuesHeader">Nedostajuće<br>vrednosti<br></div>
+ <span class="material-icons-round rotate">settings</span>
+ </th>
+ <td *ngFor="let colInfo of dataset.columnInfo; let i = index" [ngClass]="{'text-disabled' : !columnsChecked[i]}">
- <div *ngIf="colInfo.numNulls > 0">
- <button class="w-100" mat-raised-button [ngClass]="{ 'menu-disabled' : !columnsChecked[i]}" [matMenuTriggerFor]="menu" id="main_{{colInfo.columnName}}" #nullValMenu>
+ <div *ngIf="colInfo.numNulls > 0">
+ <button class="w-100" mat-raised-button [ngClass]="{ 'menu-disabled' : !columnsChecked[i]}" [matMenuTriggerFor]="menu" id="main_{{colInfo.columnName}}" #nullValMenu>
<div class="cell-align">
{{nullValOption[i]}}
<mat-icon>arrow_drop_down</mat-icon>
</div>
</button>
- <mat-menu #menu="matMenu">
- <!--<button mat-menu-item (click)="MissValsDeleteClicked($event, NullValueOptions.DeleteColumns, i)" value={{colInfo.columnName}}>Obriši kolonu</button>-->
- <button mat-menu-item (click)="MissValsDeleteClicked($event, NullValueOptions.DeleteRows, i)" value={{colInfo.columnName}}>Obriši redove ({{colInfo.numNulls}})</button>
- <button mat-menu-item [matMenuTriggerFor]="fillWith">Popuni sa</button>
- </mat-menu>
+ <mat-menu #menu="matMenu">
+ <!--<button mat-menu-item (click)="MissValsDeleteClicked($event, NullValueOptions.DeleteColumns, i)" value={{colInfo.columnName}}>Obriši kolonu</button>-->
+ <button mat-menu-item (click)="MissValsDeleteClicked($event, NullValueOptions.DeleteRows, i)" value={{colInfo.columnName}}>Obriši redove ({{colInfo.numNulls}})</button>
+ <button mat-menu-item [matMenuTriggerFor]="fillWith">Popuni sa</button>
+ </mat-menu>
- <mat-menu #fillWith="matMenu">
- <button *ngIf="colInfo.isNumber" mat-menu-item (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{colInfo.mean}}>Mean ({{colInfo.mean}})</button>
- <button *ngIf="colInfo.isNumber" mat-menu-item (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{colInfo.median}}>Median ({{colInfo.median}})</button>
- <button *ngIf="colInfo.isNumber" mat-menu-item (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{colInfo.max}}>Max ({{colInfo.max}})</button>
- <button *ngIf="colInfo.isNumber" mat-menu-item (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{colInfo.min}}>Min ({{colInfo.min}})</button>
+ <mat-menu #fillWith="matMenu">
+ <button *ngIf="colInfo.isNumber" mat-menu-item (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{colInfo.mean}}>Mean ({{colInfo.mean}})</button>
+ <button *ngIf="colInfo.isNumber" mat-menu-item (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{colInfo.median}}>Median ({{colInfo.median}})</button>
+ <button *ngIf="colInfo.isNumber" mat-menu-item (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{colInfo.max}}>Max ({{colInfo.max}})</button>
+ <button *ngIf="colInfo.isNumber" mat-menu-item (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{colInfo.min}}>Min ({{colInfo.min}})</button>
- <button *ngIf="!colInfo.isNumber" mat-menu-item [matMenuTriggerFor]="uniques">Najčešće vrednosti</button>
+ <button *ngIf="!colInfo.isNumber" mat-menu-item [matMenuTriggerFor]="uniques">Najčešće vrednosti</button>
- <button mat-menu-item [matMenuTriggerFor]="replaceWith">Unesi vrednost...</button>
- </mat-menu>
+ <button mat-menu-item [matMenuTriggerFor]="replaceWith">Unesi vrednost...</button>
+ </mat-menu>
- <mat-menu #uniques="matMenu">
- <button mat-menu-item *ngFor="let uniqueValue of colInfo.uniqueValues" (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{uniqueValue}}>{{uniqueValue}}</button>
- </mat-menu>
+ <mat-menu #uniques="matMenu">
+ <button mat-menu-item *ngFor="let uniqueValue of colInfo.uniqueValues" (click)="MissValsReplaceClicked($event, colInfo.columnName, i)" value={{uniqueValue}}>{{uniqueValue}}</button>
+ </mat-menu>
- <mat-menu #replaceWith="matMenu">
- <input type="text" id={{colInfo.columnName}} mat-menu-item placeholder="Unesi vrednost..." [value]>
- <button [disabled]="getValue(colInfo.columnName) == ''" mat-menu-item value={{getValue(colInfo.columnName)}} (click)="MissValsReplaceClicked($event, colInfo.columnName, i)">Potvrdi unos</button>
- </mat-menu>
- </div>
- <div *ngIf="colInfo.numNulls == 0" class="text-left">
- Nema nedostajućih vrednosti.
- </div>
- </td>
- </tr>
- </tbody>
- </table>
+ <mat-menu #replaceWith="matMenu">
+ <input type="text" id={{colInfo.columnName}} mat-menu-item placeholder="Unesi vrednost..." [value]>
+ <button [disabled]="getValue(colInfo.columnName) == ''" mat-menu-item value={{getValue(colInfo.columnName)}} (click)="MissValsReplaceClicked($event, colInfo.columnName, i)">Potvrdi unos</button>
+ </mat-menu>
+ </div>
+ <div *ngIf="colInfo.numNulls == 0" class="text-left">
+ Nema nedostajućih vrednosti.
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
</div>
</div>
-</div>
-<div *ngIf="dataset && experiment" class="container-fluid text-offwhite belowColumn mt-3">
- <div class="ns-row">
- <div class="break-2"></div>
+ <div *ngIf="dataset && experiment" class="container-fluid text-offwhite belowColumn mt-3">
+ <div class="ns-row">
+ <div class="break-2"></div>
- <div class="ns-col rounded">
- <mat-form-field appearance="fill" class="align-items-center justify-content-center pt-3 w-100">
- <mat-label>Tip problema</mat-label>
- <mat-select [(value)]="experiment.type">
- <mat-option [value]="ProblemType.Regression">Regresioni</mat-option>
- <mat-option [value]="ProblemType.BinaryClassification">Binarni-klasifikacioni</mat-option>
- <mat-option [value]="ProblemType.MultiClassification">Multi-klasifikacioni</mat-option>
- </mat-select>
- </mat-form-field>
- </div>
- <div class="ns-col rounded">
- <mat-form-field appearance="fill" class="align-items-center justify-content-center pt-3 w-100">
- <mat-label>Izlazna kolona</mat-label>
- <mat-select [(value)]="experiment.outputColumn" (selectionChange)="changeOutputColumn()">
- <mat-option *ngFor="let inputColumn of experiment.inputColumns" [value]="inputColumn">{{inputColumn}}</mat-option>
- </mat-select>
- </mat-form-field>
- </div>
- <div class="break-1"></div>
- <div class="ns-col d-flex align-items-center justify-content-center">
- <button mat-button (click)="ok()" class="bottom-button text-offwhite rounded-bottom">
+ <div class="ns-col rounded">
+ <mat-form-field appearance="fill" class="align-items-center justify-content-center pt-3 w-100">
+ <mat-label>Izlazna kolona</mat-label>
+ <mat-select [(value)]="experiment.outputColumn" (selectionChange)="changeOutputColumn(this.experiment.inputColumns[0])">
+ <mat-option *ngFor="let inputColumn of experiment.inputColumns" [value]="inputColumn">{{inputColumn}}</mat-option>
+ </mat-select>
+ </mat-form-field>
+ </div>
+ <div class="ns-col rounded">
+ <mat-form-field appearance="fill" class="align-items-center justify-content-center pt-3 w-100">
+ <mat-label>Tip problema</mat-label>
+ <mat-select [(value)]="experiment.type">
+ <mat-option [value]="ProblemType.Regression">Regresioni</mat-option>
+ <mat-option [value]="ProblemType.BinaryClassification">Binarni-klasifikacioni</mat-option>
+ <mat-option [value]="ProblemType.MultiClassification">Multi-klasifikacioni</mat-option>
+ </mat-select>
+ </mat-form-field>
+ </div>
+ <div class="break-1"></div>
+ <div class="ns-col d-flex align-items-center justify-content-center">
+ <button mat-button (click)="saveExperiment()" class="bottom-button text-offwhite rounded-bottom">
<div class="f-row" style="justify-content: space-around;">
<div>Potvrdi</div>
<div class="icon-double pt-1">
@@ -233,6 +234,7 @@
</div>
</div>
</button>
+ </div>
</div>
</div>
</div> \ No newline at end of file
diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts
index 01e4e564..c3d4f206 100644
--- a/frontend/src/app/_elements/column-table/column-table.component.ts
+++ b/frontend/src/app/_elements/column-table/column-table.component.ts
@@ -8,6 +8,8 @@ import { MissingvaluesDialogComponent } from 'src/app/_modals/missingvalues-dial
import { MatCheckboxChange } from '@angular/material/checkbox';
import { CsvParseService } from 'src/app/_services/csv-parse.service';
import { ProblemType } from 'src/app/_data/Model';
+import { ExperimentsService } from 'src/app/_services/experiments.service';
+import { SaveExperimentDialogComponent } from 'src/app/_modals/save-experiment-dialog/save-experiment-dialog.component';
@Component({
selector: 'app-column-table',
@@ -17,7 +19,7 @@ import { ProblemType } from 'src/app/_data/Model';
export class ColumnTableComponent implements AfterViewInit {
@Input() dataset?: Dataset;
- @Input() experiment?: Experiment;
+ @Input() experiment!: Experiment;
@ViewChildren("nullValMenu") nullValMenus!: ElementRef[];
@Output() okPressed: EventEmitter<string> = new EventEmitter();
@Output() columnTableChanged = new EventEmitter();
@@ -31,37 +33,44 @@ export class ColumnTableComponent implements AfterViewInit {
nullValOption: string[] = [];
columnsChecked: boolean[] = []; //niz svih kolona
+ loaded: boolean = false;
- constructor(private datasetService: DatasetsService, public csvParseService: CsvParseService, public dialog: MatDialog) {
+ constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog) {
//ovo mi nece trebati jer primam dataset iz druge komponente
}
- ngAfterViewInit(): void {
- this.datasetService.getMyDatasets().subscribe((datasets) => {
- this.dataset = datasets[2];
+ loadDataset(dataset: Dataset) {
+ this.dataset = dataset;
- this.setColumnTypeInitial();
- this.experiment = new Experiment();
- this.dataset.columnInfo.forEach(column => {
- this.columnsChecked.push(true);
- });
- console.log(datasets);
- for (let i = 0; i < this.dataset?.columnInfo.length; i++) {
- this.experiment?.inputColumns.push(this.dataset.columnInfo[i].columnName);
- }
- this.experiment.outputColumn = this.experiment.inputColumns[0];
- this.resetColumnEncodings(Encoding.Label);
- this.setDeleteRowsForMissingValTreatment();
+ this.setColumnTypeInitial();
+
+ this.dataset.columnInfo.forEach(column => {
+ this.columnsChecked.push(true);
+ });
+
+ for (let i = 0; i < this.dataset?.columnInfo.length; i++) {
+ this.experiment.inputColumns.push(this.dataset.columnInfo[i].columnName);
+ }
+ this.experiment.outputColumn = this.experiment.inputColumns[0];
+ this.resetColumnEncodings(Encoding.Label);
+ this.setDeleteRowsForMissingValTreatment();
- this.nullValOption = [].constructor(this.dataset.columnInfo.length).fill('Obriši redove');
+ this.nullValOption = [];
+ this.dataset.columnInfo.forEach(colInfo => {
+ this.nullValOption.push(`Obriši redove (${colInfo.numNulls})`);
+ });
- this.datasetService.getDatasetFilePartial(this.dataset.fileId, 0, 10).subscribe((response: string | undefined) => {
- if (response && this.dataset != undefined) {
- this.tableData = this.csvParseService.csvToArray(response, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter.toString() == "") ? "," : this.dataset.delimiter);
- }
- });
+ this.datasetService.getDatasetFilePartial(this.dataset.fileId, 0, 10).subscribe((response: string | undefined) => {
+ if (response && this.dataset != undefined) {
+ this.tableData = this.csvParseService.csvToArray(response, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter.toString() == "") ? "," : this.dataset.delimiter);
+ }
});
+ this.loaded = true;
+ }
+
+ ngAfterViewInit(): void {
+
}
setColumnTypeInitial() {
@@ -90,6 +99,13 @@ export class ColumnTableComponent implements AfterViewInit {
this.columnTableChanged.emit();
}
+ columnTypeChanged(columnName: string) {
+ if (this.experiment.outputColumn == columnName)
+ this.changeOutputColumn(columnName);
+ else
+ this.columnTableChangeDetected();
+ }
+
changeInputColumns(targetMatCheckbox: MatCheckboxChange, columnName: string) {
if (this.experiment != undefined) {
@@ -111,7 +127,7 @@ export class ColumnTableComponent implements AfterViewInit {
}
}
- changeOutputColumn() {
+ changeOutputColumn(columnName: string) {
if (this.experiment != undefined && this.dataset != undefined) {
let column = this.dataset.columnInfo.filter(x => x.columnName == this.experiment!.outputColumn)[0];
if (column.columnType == ColumnType.numerical) {
@@ -187,6 +203,20 @@ export class ColumnTableComponent implements AfterViewInit {
this.resetMissingValuesTreatment(selectedMissingValuesOption);
});
}
+
+ openSaveExperimentDialog() {
+ const dialogRef = this.dialog.open(SaveExperimentDialogComponent, {
+ width: '400px'
+ });
+ dialogRef.afterClosed().subscribe(selectedName => {
+ this.experiment.name = selectedName;
+ //napravi odvojene dugmice za save i update -> za update nece da se otvara dijalog za ime
+ this.experimentService.addExperiment(this.experiment).subscribe((response) => {
+ console.log(response);
+ this.okPressed.emit();
+ });
+ });
+ }
@@ -239,8 +269,8 @@ export class ColumnTableComponent implements AfterViewInit {
return (<HTMLInputElement>document.getElementById(columnName)).value;
return '0';
}
- ok() {
- this.okPressed.emit();
+ saveExperiment() {
+ this.openSaveExperimentDialog();
}
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts
index b7a2e5d4..1e57fdf1 100644
--- a/frontend/src/app/_elements/folder/folder.component.ts
+++ b/frontend/src/app/_elements/folder/folder.component.ts
@@ -9,6 +9,7 @@ import { FormDatasetComponent } from '../form-dataset/form-dataset.component';
import Experiment from 'src/app/_data/Experiment';
import { ExperimentsService } from 'src/app/_services/experiments.service';
import { PredictorsService } from 'src/app/_services/predictors.service';
+import { SignalRService } from 'src/app/_services/signal-r.service';
import { FormModelComponent } from '../form-model/form-model.component';
@Component({
@@ -43,12 +44,21 @@ export class FolderComponent implements AfterViewInit {
searchTerm: string = '';
- constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService) {
+ constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService) {
this.tabsToShow.forEach(tab => this.folders[tab] = []);
}
ngAfterViewInit(): void {
- this.refreshFiles();
+ this.refreshFiles(null);
+
+ if (this.signalRService.hubConnection) {
+ this.signalRService.hubConnection.on("NotifyDataset", (dName: string, dId: string) => {
+ this.refreshFiles(dId);
+
+ });
+ } else {
+ console.warn("Dataset-Load: No connection!");
+ }
}
displayFile() {
@@ -79,7 +89,6 @@ export class FolderComponent implements AfterViewInit {
this.fileToDisplay = this.newFile;
this.newFileSelected = true;
this.listView = false;
- this.selectedFileChanged.emit(this.newFile);
this.displayFile();
}
@@ -107,13 +116,16 @@ export class FolderComponent implements AfterViewInit {
_initialized: boolean = false;
- refreshFiles() {
+ refreshFiles(selectedDatasetId: string | null) {
this.tabsToShow.forEach(tab => {
this.folders[tab] = [];
})
this.datasetsService.getMyDatasets().subscribe((datasets) => {
this.folders[TabType.MyDatasets] = datasets;
+ if (selectedDatasetId) {
+ this.selectFile(datasets.filter(x => x._id == selectedDatasetId)[0]);
+ }
});
this.experimentsService.getMyExperiments().subscribe((experiments) => {
diff --git a/frontend/src/app/_elements/form-model/form-model.component.html b/frontend/src/app/_elements/form-model/form-model.component.html
index 0410fa65..c0318012 100644
--- a/frontend/src/app/_elements/form-model/form-model.component.html
+++ b/frontend/src/app/_elements/form-model/form-model.component.html
@@ -78,7 +78,7 @@
<mat-form-field appearance="fill" class="mat-fix">
<mat-label>Broj uzoraka po iteraciji</mat-label>
- <mat-select matNativeControl required [(value)]="newModel.batchSize">
+ <mat-select matNativeControl [(value)]="newModel.batchSize">
<mat-option *ngFor="let option of Object.keys(BatchSize); let optionName of Object.values(BatchSize)" [value]="option">{{option}}</mat-option>
</mat-select>
</mat-form-field>
@@ -159,6 +159,8 @@
</mat-form-field>
</div>
+
+
<div class="ns-col">
<mat-form-field appearance="fill" class="mat-fix">
<mat-label>Stopa regularizacije svih slojeva</mat-label>
@@ -169,56 +171,56 @@
</mat-select>
</mat-form-field>
</div>
- </div>
- <!-- LAYERI -->
+ <!-- LAYERI -->
- <div id="layers">
- <div class="layer" *ngFor="let item of newModel.layers; let i=index">
+ <div id="layers">
+ <div class="layer" *ngFor="let item of newModel.layers; let i=index">
- <mat-form-field appearance="fill" class="mat-fix">
- <mat-label>Aktivacija</mat-label>
- <button matPrefix class="btn-clear center-center text-offwhite">
+ <mat-form-field appearance="fill" class="mat-fix">
+ <mat-label>Aktivacija</mat-label>
+ <button matPrefix class="btn-clear center-center text-offwhite">
<div>
#{{i+1}}
</div>
</button>
- <mat-select [(ngModel)]="newModel.layers[i].activationFunction">
- <mat-option *ngFor="let option of Object.keys(ActivationFunction); let optionName of Object.values(ActivationFunction)" [value]="option">
- {{ optionName }}
- </mat-option>
- </mat-select>
- </mat-form-field>
+ <mat-select [(ngModel)]="newModel.layers[i].activationFunction">
+ <mat-option *ngFor="let option of Object.keys(ActivationFunction); let optionName of Object.values(ActivationFunction)" [value]="option">
+ {{ optionName }}
+ </mat-option>
+ </mat-select>
+ </mat-form-field>
- <div class="d-flex flex-row align-items-center justify-content-center tm">
- <div class="col-6" style="font-size: 13px;">Broj čvorova</div>
- <button class="btn-clear btn-icon bubble" (click)="addNeuron(i)">
+ <div class="d-flex flex-row align-items-center justify-content-center tm">
+ <div class="col-6" style="font-size: 13px;">Broj čvorova</div>
+ <button class="btn-clear btn-icon bubble" (click)="addNeuron(i)">
<mat-icon>add</mat-icon>
</button>
- <div class="col-2 text-center">{{newModel.layers[i].neurons}}</div>
- <button class="btn-clear btn-icon bubble" (click)="removeNeuron(i)">
+ <div class="col-2 text-center">{{newModel.layers[i].neurons}}</div>
+ <button class="btn-clear btn-icon bubble" (click)="removeNeuron(i)">
<mat-icon>remove</mat-icon>
</button>
- </div>
+ </div>
- <mat-form-field appearance="fill" class="mat-fix">
- <mat-label>Regularizacija</mat-label>
- <mat-select [(ngModel)]="newModel.layers[i].regularisation">
- <mat-option *ngFor="let option of Object.keys(Regularisation); let optionName of Object.values(Regularisation)" [value]="option">
- {{ optionName }}
- </mat-option>
- </mat-select>
- </mat-form-field>
+ <mat-form-field appearance="fill" class="mat-fix">
+ <mat-label>Regularizacija</mat-label>
+ <mat-select [(ngModel)]="newModel.layers[i].regularisation">
+ <mat-option *ngFor="let option of Object.keys(Regularisation); let optionName of Object.values(Regularisation)" [value]="option">
+ {{ optionName }}
+ </mat-option>
+ </mat-select>
+ </mat-form-field>
- <mat-form-field appearance="fill" class="mat-fix">
- <mat-label>Stopa regularizacije</mat-label>
- <mat-select [(ngModel)]="newModel.layers[i].regularisationRate">
- <mat-option *ngFor="let option of Object.keys(RegularisationRate); let optionName of Object.values(RegularisationRate)" [value]="option">
- {{ optionName }}
- </mat-option>
- </mat-select>
- </mat-form-field>
+ <mat-form-field appearance="fill" class="mat-fix">
+ <mat-label>Stopa regularizacije</mat-label>
+ <mat-select [(ngModel)]="newModel.layers[i].regularisationRate">
+ <mat-option *ngFor="let option of Object.keys(RegularisationRate); let optionName of Object.values(RegularisationRate)" [value]="option">
+ {{ optionName }}
+ </mat-option>
+ </mat-select>
+ </mat-form-field>
+ </div>
</div>
</div>
</div> \ No newline at end of file
diff --git a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.css b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.css
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.css
diff --git a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.html b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.html
new file mode 100644
index 00000000..a0b5d771
--- /dev/null
+++ b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.html
@@ -0,0 +1,12 @@
+<h1 mat-dialog-title>Čuvanje eksperimenta</h1>
+<div mat-dialog-content>
+ <p>Unesite naziv eksperimenta:</p>
+ <mat-form-field>
+ <input type="text" matInput [(ngModel)]="selectedName">
+ </mat-form-field>
+ <p>Da li ste sigurni u izbor?</p>
+</div>
+<div mat-dialog-actions>
+ <button mat-button [mat-dialog-close]="selectedName" cdkFocusInitial>Da</button>
+ <button mat-button (click)="onNoClick()">Odustani</button>
+</div> \ No newline at end of file
diff --git a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.spec.ts b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.spec.ts
new file mode 100644
index 00000000..5fd6cb71
--- /dev/null
+++ b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SaveExperimentDialogComponent } from './save-experiment-dialog.component';
+
+describe('SaveExperimentDialogComponent', () => {
+ let component: SaveExperimentDialogComponent;
+ let fixture: ComponentFixture<SaveExperimentDialogComponent>;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [ SaveExperimentDialogComponent ]
+ })
+ .compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(SaveExperimentDialogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.ts b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.ts
new file mode 100644
index 00000000..ca01f57e
--- /dev/null
+++ b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.ts
@@ -0,0 +1,21 @@
+import { Component, OnInit } from '@angular/core';
+import { MatDialogRef } from '@angular/material/dialog';
+
+@Component({
+ selector: 'app-save-experiment-dialog',
+ templateUrl: './save-experiment-dialog.component.html',
+ styleUrls: ['./save-experiment-dialog.component.css']
+})
+export class SaveExperimentDialogComponent implements OnInit {
+
+ selectedName: string = '';
+
+ constructor(public dialogRef: MatDialogRef<SaveExperimentDialogComponent>) { }
+
+ ngOnInit(): void {
+ }
+
+ onNoClick() {
+ this.dialogRef.close();
+ }
+}
diff --git a/frontend/src/app/_pages/experiment/experiment.component.html b/frontend/src/app/_pages/experiment/experiment.component.html
index 74c59fdf..baae864e 100644
--- a/frontend/src/app/_pages/experiment/experiment.component.html
+++ b/frontend/src/app/_pages/experiment/experiment.component.html
@@ -27,12 +27,12 @@
<div #stepsContainer class="steps-container">
<div #steps id="step_1" class="step-content">
<div class="step-content-inside">
- <app-folder #folderDataset [type]="FolderType.Dataset" [forExperiment]="experiment" [startingTab]="TabType.NewFile" [tabsToShow]="[TabType.MyDatasets, TabType.PublicDatasets]" (okPressed)="goToPage(1)"></app-folder>
+ <app-folder #folderDataset [type]="FolderType.Dataset" [forExperiment]="experiment" [startingTab]="TabType.NewFile" [tabsToShow]="[TabType.MyDatasets, TabType.PublicDatasets]" (okPressed)="goToPage(1)" (selectedFileChanged)="setDataset($event)"></app-folder>
</div>
</div>
<div #steps id="step_2" class="step-content">
<div class="step-content-inside">
- <app-column-table (okPressed)="goToPage(2)" (columnTableChanged)="columnTableChangedEvent()" [experiment]="experiment"></app-column-table>
+ <app-column-table (okPressed)="goToPage(2)" (columnTableChanged)="columnTableChangedEvent()" [experiment]="experiment" [dataset]="dataset"></app-column-table>
</div>
</div>
<div #steps id="step_3" class="step-content">
diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts
index a767767d..28552664 100644
--- a/frontend/src/app/_pages/experiment/experiment.component.ts
+++ b/frontend/src/app/_pages/experiment/experiment.component.ts
@@ -2,12 +2,14 @@ import { AfterViewInit, Component, ElementRef, ViewChild, ViewChildren, Input }
import { StepperSelectionEvent } from '@angular/cdk/stepper';
import { MatStepper } from '@angular/material/stepper';
import Shared from 'src/app/Shared';
-import { FolderType } from 'src/app/_data/FolderFile';
+import { FolderFile, FolderType } from 'src/app/_data/FolderFile';
import { FolderComponent, TabType } from 'src/app/_elements/folder/folder.component';
import Experiment from 'src/app/_data/Experiment';
import { ExperimentsService } from 'src/app/_services/experiments.service';
import { ModelsService } from 'src/app/_services/models.service';
import Model from 'src/app/_data/Model';
+import Dataset from 'src/app/_data/Dataset';
+import { ColumnTableComponent } from 'src/app/_elements/column-table/column-table.component';
@Component({
selector: 'app-experiment',
@@ -21,9 +23,12 @@ export class ExperimentComponent implements AfterViewInit {
@ViewChildren('steps') steps!: ElementRef[];
event: number = 0;
- @Input() experiment: Experiment;
+ experiment: Experiment;
+ dataset?: Dataset;
@ViewChild("folderDataset") folderDataset!: FolderComponent;
@ViewChild("folderModel") folderModel!: FolderComponent;
+ @ViewChild(ColumnTableComponent) columnTable!: ColumnTableComponent;
+
constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService) {
this.experiment = new Experiment("exp1");
@@ -118,4 +123,11 @@ export class ExperimentComponent implements AfterViewInit {
console.log("promenio se column-table");
}
+ setDataset(dataset: FolderFile) {
+ const d = <Dataset>dataset;
+ this.experiment.datasetId = d._id;
+ this.dataset = d;
+
+ this.columnTable.loadDataset(this.dataset);
+ }
}
diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts
index 5a763152..d44bf6ad 100644
--- a/frontend/src/app/app.module.ts
+++ b/frontend/src/app/app.module.ts
@@ -21,6 +21,7 @@ import { AlertDialogComponent } from './_modals/alert-dialog/alert-dialog.compon
import { YesNoDialogComponent } from './_modals/yes-no-dialog/yes-no-dialog.component';
import { EncodingDialogComponent } from './_modals/encoding-dialog/encoding-dialog.component';
import { MissingvaluesDialogComponent } from './_modals/missingvalues-dialog/missingvalues-dialog.component';
+import { SaveExperimentDialogComponent } from './_modals/save-experiment-dialog/save-experiment-dialog.component';
// Pages
import { HomeComponent } from './_pages/home/home.component';
import { ProfileComponent } from './_pages/profile/profile.component';
@@ -89,8 +90,8 @@ export function initializeApp(appConfig: Configuration) {
DoughnutChartComponent,
HeatmapComponent,
MetricViewComponent,
- LineChartComponent
-
+ LineChartComponent,
+ SaveExperimentDialogComponent
],
imports: [
BrowserModule,