diff --git a/package-lock.json b/package-lock.json index 5b4c35d61..da38dc6f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ "npx": "^10.2.2", "rxjs": "^7.8.1", "tslib": "^2.0.0", + "webpack-bundle-analyzer": "^4.10.2", "yaml": "^2.4.1", "zone.js": "~0.13.3" }, @@ -3313,7 +3314,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, "engines": { "node": ">=10.0.0" } @@ -5917,6 +5917,11 @@ "node": ">=14" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==" + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -7176,7 +7181,6 @@ "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -9783,8 +9787,7 @@ "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "node_modules/debug": { "version": "4.3.6", @@ -10158,6 +10161,11 @@ "node": ">=4" } }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -11839,6 +11847,20 @@ "typescript": ">=3.7.5" } }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -12064,8 +12086,7 @@ "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "node_modules/html-tags": { "version": "3.3.1", @@ -20270,6 +20291,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, "node_modules/optimism": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", @@ -22678,6 +22707,27 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv/node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "engines": { + "node": ">=10" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -23834,6 +23884,14 @@ "node": ">=0.6" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -24719,6 +24777,81 @@ } } }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/webpack-dev-middleware": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", @@ -27467,8 +27600,7 @@ "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, "@esbuild/linux-x64": { "version": "0.18.17", @@ -29677,6 +29809,11 @@ "dev": true, "optional": true }, + "@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==" + }, "@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -30724,8 +30861,7 @@ "acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==" }, "acorn-globals": { "version": "6.0.0", @@ -32698,8 +32834,7 @@ "debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "debug": { "version": "4.3.6", @@ -32974,6 +33109,11 @@ "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", "dev": true }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -34253,6 +34393,14 @@ "@wessberg/ts-evaluator": "0.0.27" } }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "requires": { + "duplexer": "^0.1.2" + } + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -34436,8 +34584,7 @@ "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "html-tags": { "version": "3.3.1", @@ -40621,6 +40768,11 @@ "is-wsl": "^2.2.0" } }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + }, "optimism": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", @@ -42366,6 +42518,23 @@ } } }, + "sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "requires": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "dependencies": { + "mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==" + } + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -43245,6 +43414,11 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==" + }, "tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -43971,6 +44145,51 @@ } } }, + "webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "requires": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "requires": { + "acorn": "^8.11.0" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "requires": {} + } + } + }, "webpack-dev-middleware": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", diff --git a/package.json b/package.json index 084f3b2e4..cf931fb72 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,10 @@ "ng": "ng", "start": "ng serve --watch", "build": "ng build", + "build:stats": "ng build --stats-json", "build-prod": "ng build --configuration production", + "build-prod:stats": "ng build --configuration production --stats-json", + "analyze": "webpack-bundle-analyzer dist/kamu-platform/stats.json", "test": "ng test --no-progress --no-watch --browsers ChromeHeadless --code-coverage", "test-firefox": "ng test --no-progress --browsers Firefox --code-coverage", "lint": "eslint . --ext .ts", @@ -68,6 +71,7 @@ "npx": "^10.2.2", "rxjs": "^7.8.1", "tslib": "^2.0.0", + "webpack-bundle-analyzer": "^4.10.2", "yaml": "^2.4.1", "zone.js": "~0.13.3" }, diff --git a/src/app/account/account.module.ts b/src/app/account/account.module.ts new file mode 100644 index 000000000..78fbcdb76 --- /dev/null +++ b/src/app/account/account.module.ts @@ -0,0 +1,38 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { AccountComponent } from "./account.component"; +import { DatasetFlowModule } from "src/app/dataset-flow/dataset-flow/dataset-flow.module"; +import { AccountFlowsTabComponent } from "./additional-components/account-flows-tab/account-flows-tab.component"; +import { MatIconModule } from "@angular/material/icon"; +import { PaginationModule } from "src/app/components/pagination-component/pagination.module"; +import { SharedModule } from "src/app/shared/shared/shared.module"; +import { MatDividerModule } from "@angular/material/divider"; +import { DatasetsTabComponent } from "./additional-components/datasets-tab/datasets-tab.component"; +import { DatasetListModule } from "src/app/components/dataset-list-component/dataset-list.module"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { MatTableModule } from "@angular/material/table"; +import { RouterModule } from "@angular/router"; +import { AngularSvgIconModule } from "angular-svg-icon"; +import { MatButtonToggleModule } from "@angular/material/button-toggle"; +import { NgbModule } from "@ng-bootstrap/ng-bootstrap"; + +@NgModule({ + declarations: [AccountComponent, AccountFlowsTabComponent, DatasetsTabComponent], + imports: [ + CommonModule, + DatasetFlowModule, + MatIconModule, + MatDividerModule, + DatasetListModule, + PaginationModule, + SharedModule, + MatTableModule, + RouterModule, + AngularSvgIconModule, + MatButtonToggleModule, + FormsModule, + ReactiveFormsModule, + NgbModule, + ], +}) +export class AccountModule {} diff --git a/src/app/api/mock/dataset.mock.ts b/src/app/api/mock/dataset.mock.ts index 7181e87b7..fb9ba718e 100644 --- a/src/app/api/mock/dataset.mock.ts +++ b/src/app/api/mock/dataset.mock.ts @@ -20,7 +20,7 @@ import { LineageGraphNodeData, LineageGraphNodeKind, LineageNodeAccess, -} from "src/app/dataset-view/additional-components/lineage-component/lineage-model"; +} from "src/app/dataset-view/additional-components/lineage-tab/lineage-graph.model"; import { Node } from "@swimlane/ngx-graph/lib/models/node.model"; export const TEST_DATASET_ID = "did:odf:z4k88e8kmp7wTEePmNDSprhY2TqwDxSiFwHiau8fnUk4V4Cpgu7"; diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 3c4f6c7e2..4f71720bb 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -86,19 +86,24 @@ export const routes: Routes = [ { path: `:${ProjectLinks.URL_PARAM_CATEGORY}`, component: AccountSettingsComponent, + loadChildren: () => + import("./auth/settings/account-settings.module").then((m) => m.AccountSettingsModule), }, ], }, { path: `:${ProjectLinks.URL_PARAM_ACCOUNT_NAME}`, children: [ - { - path: "", - component: AccountComponent, - }, { path: `:${ProjectLinks.URL_PARAM_DATASET_NAME}`, component: DatasetComponent, + + loadChildren: () => import("./dataset-view/dataset.module").then((m) => m.DatasetModule), + }, + { + path: "", + component: AccountComponent, + loadChildren: () => import("./account/account.module").then((m) => m.AccountModule), }, ], }, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 2af380646..e7abfe8db 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -27,7 +27,6 @@ import { MatSidenavModule } from "@angular/material/sidenav"; import { MatMenuModule } from "@angular/material/menu"; import { MatButtonModule } from "@angular/material/button"; import { SearchModule } from "./search/search.module"; -import { DatasetModule } from "./dataset-view/dataset.module"; import { DatasetService } from "./dataset-view/dataset.service"; import { DatasetCreateModule } from "./dataset-create/dataset-create.module"; import { AppHeaderComponent } from "./components/app-header/app-header.component"; @@ -48,7 +47,6 @@ import { DatasetSubscriptionsService } from "./dataset-view/dataset.subscription import { SpinnerModule } from "./components/spinner/spinner.module"; import { DatasetApi } from "./api/dataset.api"; import { ErrorHandlerService } from "./services/error-handler.service"; -import { AccountSettingsComponent } from "./auth/settings/account-settings.component"; import { MatButtonToggleModule } from "@angular/material/button-toggle"; import { DatasetListModule } from "./components/dataset-list-component/dataset-list.module"; import { PaginationModule } from "./components/pagination-component/pagination.module"; @@ -67,10 +65,6 @@ import { apolloCache } from "./apollo-cache.helper"; import { AdminDashboardComponent } from "./admin-view/admin-dashboard/admin-dashboard.component"; import { DatasetFlowDetailsModule } from "./dataset-flow/dataset-flow-details/dataset-flow-details.module"; import { MatSortModule } from "@angular/material/sort"; -import { AccountFlowsTabComponent } from "./account/additional-components/account-flows-tab/account-flows-tab.component"; -import { AccountComponent } from "./account/account.component"; -import { DatasetsTabComponent } from "./account/additional-components/datasets-tab/datasets-tab.component"; -import { AccessTokensTabComponent } from "./auth/settings/tabs/access-tokens-tab/access-tokens-tab.component"; import { MatSlideToggleModule } from "@angular/material/slide-toggle"; import { DynamicTableModule } from "./components/dynamic-table/dynamic-table.module"; import { AutofocusModule } from "./common/directives/autofocus.module"; @@ -203,17 +197,11 @@ const MatModules = [ AppHeaderComponent, LoginComponent, GithubCallbackComponent, - AccountComponent, NotificationIndicatorComponent, - AccountSettingsComponent, - DatasetsTabComponent, AdminDashboardComponent, - AccessTokensTabComponent, - AccountFlowsTabComponent, ], imports: [ - AppRoutingModule, - DatasetModule, + // DatasetModule, DatasetCreateModule, MetadataBlockModule, ModalModule.forRoot(), @@ -252,6 +240,7 @@ const MatModules = [ DatasetFlowDetailsModule, DynamicTableModule, AutofocusModule, + AppRoutingModule, ], providers: [...Services], bootstrap: [AppComponent], diff --git a/src/app/auth/settings/account-settings.module.ts b/src/app/auth/settings/account-settings.module.ts new file mode 100644 index 000000000..799ceeae1 --- /dev/null +++ b/src/app/auth/settings/account-settings.module.ts @@ -0,0 +1,29 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { AccessTokensTabComponent } from "./tabs/access-tokens-tab/access-tokens-tab.component"; +import { AccountSettingsComponent } from "./account-settings.component"; +import { RouterModule } from "@angular/router"; +import { AngularSvgIconModule } from "angular-svg-icon"; +import { MatDividerModule } from "@angular/material/divider"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { MatIconModule } from "@angular/material/icon"; +import { PaginationModule } from "src/app/components/pagination-component/pagination.module"; +import { MatTableModule } from "@angular/material/table"; +import { MatSlideToggleModule } from "@angular/material/slide-toggle"; + +@NgModule({ + declarations: [AccessTokensTabComponent, AccountSettingsComponent], + imports: [ + CommonModule, + RouterModule, + AngularSvgIconModule, + MatDividerModule, + ReactiveFormsModule, + FormsModule, + MatIconModule, + PaginationModule, + MatTableModule, + MatSlideToggleModule, + ], +}) +export class AccountSettingsModule {} diff --git a/src/app/components/timeline-component/timeline.component.scss b/src/app/components/timeline-component/timeline.component.scss index ed88f089f..98961079d 100644 --- a/src/app/components/timeline-component/timeline.component.scss +++ b/src/app/components/timeline-component/timeline.component.scss @@ -1,5 +1,4 @@ @import "var"; -@import "node_modules/bootstrap/dist/css/bootstrap.min"; .timeline-block { position: relative; diff --git a/src/app/dataset-block/metadata-block/components/block-navigation/block-navigation.component.scss b/src/app/dataset-block/metadata-block/components/block-navigation/block-navigation.component.scss index ce7497faf..9cb46ab11 100644 --- a/src/app/dataset-block/metadata-block/components/block-navigation/block-navigation.component.scss +++ b/src/app/dataset-block/metadata-block/components/block-navigation/block-navigation.component.scss @@ -7,6 +7,10 @@ color: #6c757d; } } + + .cuppa-dropdown { + width: 100%; + } } } diff --git a/src/app/dataset-block/metadata-block/metadata-block.component.spec.ts b/src/app/dataset-block/metadata-block/metadata-block.component.spec.ts index 2dece159b..73d750a3f 100644 --- a/src/app/dataset-block/metadata-block/metadata-block.component.spec.ts +++ b/src/app/dataset-block/metadata-block/metadata-block.component.spec.ts @@ -12,7 +12,6 @@ import { NgMultiSelectDropDownModule } from "ng-multiselect-dropdown"; import { FormsModule } from "@angular/forms"; import { EventDetailsComponent } from "./components/event-details/event-details.component"; import { BlockHeaderComponent } from "./components/block-header/block-header.component"; -import { DatasetViewMenuComponent } from "src/app/dataset-view/dataset-view-menu/dataset-view-menu.component"; import { MatButtonToggleModule } from "@angular/material/button-toggle"; import { MatMenuModule } from "@angular/material/menu"; import { DatasetViewHeaderComponent } from "src/app/dataset-view/dataset-view-header/dataset-view-header.component"; @@ -25,6 +24,7 @@ import { YamlViewSectionComponent } from "./components/yaml-view-section/yaml-vi import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import { DataAccessPanelModule } from "src/app/components/data-access-panel/data-access-panel.module"; import { SharedModule } from "src/app/shared/shared/shared.module"; +import { DatasetViewMenuModule } from "src/app/dataset-view/dataset-view-menu/dataset-view-menu/dataset-view-menu.module"; describe("MetadataBlockComponent", () => { let component: MetadataBlockComponent; @@ -37,7 +37,6 @@ describe("MetadataBlockComponent", () => { BlockNavigationComponent, EventDetailsComponent, BlockHeaderComponent, - DatasetViewMenuComponent, DatasetViewHeaderComponent, SearchAdditionalButtonsComponent, SearchAdditionalButtonsNavComponent, @@ -59,6 +58,7 @@ describe("MetadataBlockComponent", () => { DataAccessPanelModule, RouterModule, SharedModule, + DatasetViewMenuModule, ], providers: [ DatasetApi, diff --git a/src/app/dataset-block/metadata-block/metadata-block.module.ts b/src/app/dataset-block/metadata-block/metadata-block.module.ts index 2bf326d9b..437eb9f21 100644 --- a/src/app/dataset-block/metadata-block/metadata-block.module.ts +++ b/src/app/dataset-block/metadata-block/metadata-block.module.ts @@ -8,7 +8,6 @@ import { EventDetailsComponent } from "./components/event-details/event-details. import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; import { MetadataBlockComponent } from "./metadata-block.component"; -import { DatasetModule } from "src/app/dataset-view/dataset.module"; import { BlockHeaderComponent } from "./components/block-header/block-header.component"; import { BlockNavigationComponent } from "./components/block-navigation/block-navigation.component"; import { MatMenuModule } from "@angular/material/menu"; @@ -48,6 +47,9 @@ import { SetDataSchemaEventComponent } from "./components/event-details/componen import { UnsupportedEventComponent } from "./components/event-details/components/unsupported-event/unsupported-event.component"; import { TopicsPropertyComponent } from "./components/event-details/components/common/topics-property/topics-property.component"; import { TimePropertyComponent } from "./components/event-details/components/common/time-property/time-property.component"; +import { AngularMultiSelectModule } from "angular2-multiselect-dropdown"; +import { DatasetViewMenuModule } from "src/app/dataset-view/dataset-view-menu/dataset-view-menu/dataset-view-menu.module"; +import { DatasetViewHeaderModule } from "src/app/dataset-view/dataset-view-header/dataset-view-header/dataset-view-header.module"; @NgModule({ declarations: [ @@ -91,7 +93,6 @@ import { TimePropertyComponent } from "./components/event-details/components/com ], imports: [ CommonModule, - DatasetModule, MatMenuModule, MatDividerModule, FormsModule, @@ -102,6 +103,9 @@ import { TimePropertyComponent } from "./components/event-details/components/com DisplayTimeModule, DisplayHashModule, SharedModule, + AngularMultiSelectModule, + DatasetViewMenuModule, + DatasetViewHeaderModule, ], exports: [MetadataBlockComponent], }) diff --git a/src/app/dataset-flow/dataset-flow-details/dataset-flow-details.module.ts b/src/app/dataset-flow/dataset-flow-details/dataset-flow-details.module.ts index 44e77e951..5827e2b27 100644 --- a/src/app/dataset-flow/dataset-flow-details/dataset-flow-details.module.ts +++ b/src/app/dataset-flow/dataset-flow-details/dataset-flow-details.module.ts @@ -1,3 +1,4 @@ +import { DatasetViewHeaderModule } from "./../../dataset-view/dataset-view-header/dataset-view-header/dataset-view-header.module"; import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; import { MatIconModule } from "@angular/material/icon"; @@ -5,11 +6,12 @@ import { MatDividerModule } from "@angular/material/divider"; import { MatMenuModule } from "@angular/material/menu"; import { RouterModule } from "@angular/router"; import { AngularSvgIconModule } from "angular-svg-icon"; -import { DatasetModule } from "src/app/dataset-view/dataset.module"; import { DatasetFlowDetailsComponent } from "./dataset-flow-details.component"; import { FlowDetailsHistoryTabComponent } from "./tabs/flow-details-history-tab/flow-details-history-tab.component"; import { FlowDetailsSummaryTabComponent } from "./tabs/flow-details-summary-tab/flow-details-summary-tab.component"; import { FlowDetailsLogsTabComponent } from "./tabs/flow-details-logs-tab/flow-details-logs-tab.component"; +import { DatasetViewMenuModule } from "src/app/dataset-view/dataset-view-menu/dataset-view-menu/dataset-view-menu.module"; +import { SharedModule } from "src/app/shared/shared/shared.module"; @NgModule({ declarations: [ @@ -22,10 +24,12 @@ import { FlowDetailsLogsTabComponent } from "./tabs/flow-details-logs-tab/flow-d CommonModule, MatIconModule, MatDividerModule, - DatasetModule, RouterModule, AngularSvgIconModule, MatMenuModule, + DatasetViewHeaderModule, + DatasetViewMenuModule, + SharedModule, ], }) export class DatasetFlowDetailsModule {} diff --git a/src/app/dataset-flow/dataset-flow/dataset-flow.module.ts b/src/app/dataset-flow/dataset-flow/dataset-flow.module.ts new file mode 100644 index 000000000..f610787d1 --- /dev/null +++ b/src/app/dataset-flow/dataset-flow/dataset-flow.module.ts @@ -0,0 +1,35 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { TileBaseWidgetComponent } from "src/app/common/components/tile-base-widget/tile-base-widget.component"; +import { FlowsTableComponent } from "src/app/common/components/flows-table/flows-table.component"; +import { MatDividerModule } from "@angular/material/divider"; +import { MatMenuModule } from "@angular/material/menu"; +import { NgbPopoverModule } from "@ng-bootstrap/ng-bootstrap"; +import { RouterModule } from "@angular/router"; +import { AngularSvgIconModule } from "angular-svg-icon"; +import { MatIconModule } from "@angular/material/icon"; +import { SharedModule } from "src/app/shared/shared/shared.module"; +import { MatTableModule } from "@angular/material/table"; +import { FormsModule } from "@angular/forms"; +import { AngularMultiSelectModule } from "angular2-multiselect-dropdown"; +import { MatButtonModule } from "@angular/material/button"; + +@NgModule({ + declarations: [TileBaseWidgetComponent, FlowsTableComponent], + imports: [ + CommonModule, + MatDividerModule, + MatMenuModule, + NgbPopoverModule, + RouterModule, + AngularSvgIconModule, + MatIconModule, + SharedModule, + MatTableModule, + FormsModule, + AngularMultiSelectModule, + MatButtonModule, + ], + exports: [TileBaseWidgetComponent, FlowsTableComponent], +}) +export class DatasetFlowModule {} diff --git a/src/app/dataset-view/additional-components/data-component/data.component.html b/src/app/dataset-view/additional-components/data-tab/data-component/data.component.html similarity index 94% rename from src/app/dataset-view/additional-components/data-component/data.component.html rename to src/app/dataset-view/additional-components/data-tab/data-component/data.component.html index c2d6ea8a7..875bc82a1 100644 --- a/src/app/dataset-view/additional-components/data-component/data.component.html +++ b/src/app/dataset-view/additional-components/data-tab/data-component/data.component.html @@ -1,4 +1,4 @@ -
+
{ @@ -73,17 +73,17 @@ describe("DataComponent", () => { expect(component).toBeTruthy(); }); - it("should check run sql button", fakeAsync(() => { - const runSQLRequestEmitSpy = spyOn(component.runSQLRequestEmit, "emit"); - tick(); - fixture.detectChanges(); - runSQLRequestEmitSpy.calls.reset(); + // it("should check run sql button", fakeAsync(() => { + // const runSQLRequestEmitSpy = spyOn(component.runSQLRequestEmit, "emit"); + // tick(); + // fixture.detectChanges(); + // runSQLRequestEmitSpy.calls.reset(); - emitClickOnElementByDataTestId(fixture, "runSqlQueryButton"); + // emitClickOnElementByDataTestId(fixture, "runSqlQueryButton"); - expect(runSQLRequestEmitSpy).toHaveBeenCalledTimes(1); - flush(); - })); + // expect(runSQLRequestEmitSpy).toHaveBeenCalledTimes(1); + // flush(); + // })); it("should check add data", () => { const ngbModalServiceSpy = spyOn(ngbModalService, "open").and.callThrough(); diff --git a/src/app/dataset-view/additional-components/data-component/data.component.ts b/src/app/dataset-view/additional-components/data-tab/data-component/data.component.ts similarity index 74% rename from src/app/dataset-view/additional-components/data-component/data.component.ts rename to src/app/dataset-view/additional-components/data-tab/data-component/data.component.ts index c8f219260..2a4311807 100644 --- a/src/app/dataset-view/additional-components/data-component/data.component.ts +++ b/src/app/dataset-view/additional-components/data-tab/data-component/data.component.ts @@ -1,23 +1,24 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, OnInit, Output } from "@angular/core"; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, OnInit } from "@angular/core"; import { Location } from "@angular/common"; -import { map, Observable } from "rxjs"; +import { finalize, map, Observable } from "rxjs"; import AppValues from "src/app/common/app.values"; -import { DatasetFlowType, DatasetKind, OffsetInterval } from "../../../api/kamu.graphql.interface"; +import { DatasetFlowType, DatasetKind, OffsetInterval } from "../../../../api/kamu.graphql.interface"; import { DataSqlErrorUpdate, OverviewUpdate } from "src/app/dataset-view/dataset.subscriptions.interface"; -import { DatasetRequestBySql } from "../../../interface/dataset.interface"; -import { DatasetSubscriptionsService } from "../../dataset.subscriptions.service"; +import { DatasetRequestBySql } from "../../../../interface/dataset.interface"; +import { DatasetSubscriptionsService } from "../../../dataset.subscriptions.service"; import { BaseComponent } from "src/app/common/base.component"; import { DatasetBasicsFragment } from "src/app/api/kamu.graphql.interface"; import { MaybeNull } from "src/app/common/app.types"; import ProjectLinks from "src/app/project-links"; import { NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap"; -import { AddDataModalComponent } from "../overview-component/components/add-data-modal/add-data-modal.component"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { DatasetViewTypeEnum } from "../../dataset-view.interface"; -import { DatasetFlowsService } from "../flows-component/services/dataset-flows.service"; +import { DatasetViewTypeEnum } from "../../../dataset-view.interface"; +import { DatasetFlowsService } from "../../flows-component/services/dataset-flows.service"; import { NavigationService } from "src/app/services/navigation.service"; import { SqlQueryResponseState } from "src/app/query/global-query/global-query.model"; import { SqlQueryService } from "src/app/services/sql-query.service"; +import { DatasetService } from "../../../dataset.service"; +import { AddDataModalComponent } from "../../overview-tab/components/add-data-modal/add-data-modal.component"; @Component({ selector: "app-data", @@ -25,11 +26,8 @@ import { SqlQueryService } from "src/app/services/sql-query.service"; changeDetection: ChangeDetectionStrategy.OnPush, }) export class DataComponent extends BaseComponent implements OnInit { - @Input({ required: true }) public datasetBasics: DatasetBasicsFragment; - @Input({ required: true }) public sqlLoading: boolean; - @Input() public resultTime: number; - @Output() public runSQLRequestEmit = new EventEmitter(); - + public datasetBasics: DatasetBasicsFragment; + public sqlLoading: boolean = false; public sqlRequestCode = `select\n *\nfrom `; private offsetColumnName = AppValues.DEFAULT_OFFSET_COLUMN_NAME; @@ -44,8 +42,13 @@ export class DataComponent extends BaseComponent implements OnInit { private datasetFlowsService = inject(DatasetFlowsService); private navigationService = inject(NavigationService); private sqlQueryService = inject(SqlQueryService); + protected datasetService = inject(DatasetService); + protected cdr = inject(ChangeDetectorRef); public ngOnInit(): void { + this.datasetService.datasetChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((datasetBasics) => { + this.datasetBasics = datasetBasics; + }); this.overviewUpdate$ = this.datasetSubsService.overviewChanges; this.sqlErrorMarker$ = this.sqlQueryService.sqlErrorOccurrences.pipe( map((data: DataSqlErrorUpdate) => data.error), @@ -56,7 +59,22 @@ export class DataComponent extends BaseComponent implements OnInit { } public runSQLRequest(params: DatasetRequestBySql): void { - this.runSQLRequestEmit.emit(params); + this.onRunSQLRequest(params); + } + + public onRunSQLRequest(params: DatasetRequestBySql): void { + this.sqlLoading = true; + this.sqlQueryService + // TODO: Propagate limit from UI and display when it was reached + .requestDataSqlRun(params) + .pipe( + finalize(() => { + this.sqlLoading = false; + }), + takeUntilDestroyed(this.destroyRef), + ) + .subscribe(); + this.cdr.detectChanges(); } private buildSqlRequestCode(): void { diff --git a/src/app/dataset-view/additional-components/data-tab/data-tab-routing.module.ts b/src/app/dataset-view/additional-components/data-tab/data-tab-routing.module.ts new file mode 100644 index 000000000..f8ae09ef2 --- /dev/null +++ b/src/app/dataset-view/additional-components/data-tab/data-tab-routing.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' + +import { DataComponent } from './data-component/data.component' + +const routes: Routes = [{ path: '', component: DataComponent }] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class DataTabRoutingModule {} diff --git a/src/app/dataset-view/additional-components/data-tab/data-tab.module.ts b/src/app/dataset-view/additional-components/data-tab/data-tab.module.ts new file mode 100644 index 000000000..b377e7466 --- /dev/null +++ b/src/app/dataset-view/additional-components/data-tab/data-tab.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; + +import { DataComponent } from "./data-component/data.component"; +import { QuerySharedModule } from "src/app/query/shared/query-shared/query-shared.module"; +import { DataTabRoutingModule } from "./data-tab-routing.module"; + +@NgModule({ + declarations: [DataComponent], + imports: [CommonModule, QuerySharedModule, DataTabRoutingModule], +}) +export class DataTabModule {} diff --git a/src/app/dataset-view/additional-components/dataset-tabs-routing.module.ts b/src/app/dataset-view/additional-components/dataset-tabs-routing.module.ts new file mode 100644 index 000000000..9364808c9 --- /dev/null +++ b/src/app/dataset-view/additional-components/dataset-tabs-routing.module.ts @@ -0,0 +1,47 @@ +import { NgModule } from "@angular/core"; +import { RouterModule, Routes } from "@angular/router"; +import { DatasetViewTypeEnum } from "../dataset-view.interface"; +import { MetadataComponent } from "./metadata-component/metadata.component"; +import { FlowsComponent } from "./flows-component/flows.component"; + +const routes: Routes = [ + { + path: '', redirectTo: 'overview', pathMatch: 'full' + }, + { + path: "overview", + loadChildren: () => import("./overview-tab/overview-tab.module").then((m) => m.OverviewTabModule), + data: { tab: DatasetViewTypeEnum.Overview }, + }, + { + path: "data", + loadChildren: () => import("./data-tab/data-tab.module").then((m) => m.DataTabModule), + data: { tab: DatasetViewTypeEnum.Data }, + }, + { + path: "metadata", + component: MetadataComponent, + data: { tab: DatasetViewTypeEnum.Metadata }, + }, + { + path: "history", + loadChildren: () => import("./history-tab/history-tab.module").then((m) => m.HistoryTabModule), + data: { tab: DatasetViewTypeEnum.History }, + }, + { + path: "lineage", + loadChildren: () => import("./lineage-tab/lineage-tab.module").then((m) => m.LineageTabModule), + data: { tab: DatasetViewTypeEnum.Lineage }, + }, + { + path: "flows", + component: FlowsComponent, + data: { tab: DatasetViewTypeEnum.Flows }, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class DatasetTabsRoutingModule {} diff --git a/src/app/dataset-view/additional-components/flows-component/flows.component.ts b/src/app/dataset-view/additional-components/flows-component/flows.component.ts index 112abc726..8b59cbcac 100644 --- a/src/app/dataset-view/additional-components/flows-component/flows.component.ts +++ b/src/app/dataset-view/additional-components/flows-component/flows.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, inject, Input, OnInit } from "@angular/core"; +import { ChangeDetectionStrategy, Component, inject, OnInit } from "@angular/core"; import { DatasetBasicsFragment, DatasetFlowType, @@ -18,6 +18,7 @@ import { OverviewUpdate } from "../../dataset.subscriptions.interface"; import { FlowsTableFiltersOptions } from "src/app/common/components/flows-table/flows-table.types"; import ProjectLinks from "src/app/project-links"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { DatasetService } from "../../dataset.service"; @Component({ selector: "app-flows", @@ -26,7 +27,7 @@ import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; changeDetection: ChangeDetectionStrategy.OnPush, }) export class FlowsComponent extends FlowsTableProcessingBaseComponent implements OnInit { - @Input({ required: true }) public datasetBasics: DatasetBasicsFragment; + public datasetBasics: DatasetBasicsFragment; public searchFilter = ""; public overview: DatasetOverviewFragment; public readonly DISPLAY_COLUMNS: string[] = ["description", "information", "creator", "options"]; //1 @@ -36,10 +37,15 @@ export class FlowsComponent extends FlowsTableProcessingBaseComponent implements public readonly URL_PARAM_ADD_POLLING_SOURCE = ProjectLinks.URL_PARAM_ADD_POLLING_SOURCE; private datasetSubsService = inject(DatasetSubscriptionsService); + private datasetService = inject(DatasetService); ngOnInit(): void { + this.datasetService.datasetChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((datasetChanges) => { + this.datasetBasics = datasetChanges; + }); this.getPageFromUrl(); this.fetchTableData(this.currentPage); + this.datasetSubsService.overviewChanges .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((overviewUpdate: OverviewUpdate) => { diff --git a/src/app/dataset-view/additional-components/history-component/history.component.ts b/src/app/dataset-view/additional-components/history-component/history.component.ts deleted file mode 100644 index e2880fd34..000000000 --- a/src/app/dataset-view/additional-components/history-component/history.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Observable } from "rxjs"; -import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output } from "@angular/core"; -import { BaseComponent } from "src/app/common/base.component"; -import { DatasetHistoryUpdate } from "../../dataset.subscriptions.interface"; -import { DatasetSubscriptionsService } from "../../dataset.subscriptions.service"; -import { MaybeNull } from "src/app/common/app.types"; - -@Component({ - selector: "app-history", - templateUrl: "./history.component.html", - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HistoryComponent extends BaseComponent { - private datasetSubsService = inject(DatasetSubscriptionsService); - - @Input({ required: true }) public datasetName: string; - @Output() onPageChangeEmit = new EventEmitter(); - public historyUpdate$: Observable> = this.datasetSubsService.historyChanges; - - public onPageChange(currentPage: number): void { - this.onPageChangeEmit.emit(currentPage); - } -} diff --git a/src/app/dataset-view/additional-components/history-component/history.component.html b/src/app/dataset-view/additional-components/history-tab/history-component/history.component.html similarity index 79% rename from src/app/dataset-view/additional-components/history-component/history.component.html rename to src/app/dataset-view/additional-components/history-tab/history-component/history.component.html index ee5bc77bb..cd71be7b9 100644 --- a/src/app/dataset-view/additional-components/history-component/history.component.html +++ b/src/app/dataset-view/additional-components/history-tab/history-component/history.component.html @@ -6,14 +6,14 @@
diff --git a/src/app/dataset-view/additional-components/history-component/history.component.scss b/src/app/dataset-view/additional-components/history-tab/history-component/history.component.scss similarity index 100% rename from src/app/dataset-view/additional-components/history-component/history.component.scss rename to src/app/dataset-view/additional-components/history-tab/history-component/history.component.scss diff --git a/src/app/dataset-view/additional-components/history-component/history.component.spec.ts b/src/app/dataset-view/additional-components/history-tab/history-component/history.component.spec.ts similarity index 94% rename from src/app/dataset-view/additional-components/history-component/history.component.spec.ts rename to src/app/dataset-view/additional-components/history-tab/history-component/history.component.spec.ts index 56c03a0d7..07ae4a3dd 100644 --- a/src/app/dataset-view/additional-components/history-component/history.component.spec.ts +++ b/src/app/dataset-view/additional-components/history-tab/history-component/history.component.spec.ts @@ -1,7 +1,5 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { first } from "rxjs/operators"; -import { DatasetSubscriptionsService } from "../../dataset.subscriptions.service"; -import { mockHistoryUpdate } from "../data-tabs.mock"; import { HistoryComponent } from "./history.component"; import { SharedTestModule } from "src/app/common/shared-test.module"; import { PaginationComponent } from "src/app/components/pagination-component/pagination.component"; @@ -14,6 +12,8 @@ import { HttpClientTestingModule } from "@angular/common/http/testing"; import { ToastrModule } from "ngx-toastr"; import { MatIconModule } from "@angular/material/icon"; import { RouterTestingModule } from "@angular/router/testing"; +import { DatasetSubscriptionsService } from "src/app/dataset-view/dataset.subscriptions.service"; +import { mockHistoryUpdate } from "../../data-tabs.mock"; describe("HistoryComponent", () => { let component: HistoryComponent; diff --git a/src/app/dataset-view/additional-components/history-tab/history-component/history.component.ts b/src/app/dataset-view/additional-components/history-tab/history-component/history.component.ts new file mode 100644 index 000000000..208ceea15 --- /dev/null +++ b/src/app/dataset-view/additional-components/history-tab/history-component/history.component.ts @@ -0,0 +1,37 @@ +import { Observable } from "rxjs"; +import { ChangeDetectionStrategy, Component, EventEmitter, inject, Output } from "@angular/core"; +import { BaseComponent } from "src/app/common/base.component"; +import { MaybeNull } from "src/app/common/app.types"; +import { NavigationService } from "src/app/services/navigation.service"; +import { DatasetInfo } from "src/app/interface/navigation.interface"; +import { DatasetSubscriptionsService } from "src/app/dataset-view/dataset.subscriptions.service"; +import { DatasetViewTypeEnum } from "src/app/dataset-view/dataset-view.interface"; +import { DatasetHistoryUpdate } from "src/app/dataset-view/dataset.subscriptions.interface"; + +@Component({ + selector: "app-history", + templateUrl: "./history.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class HistoryComponent extends BaseComponent { + private datasetSubsService = inject(DatasetSubscriptionsService); + private navigationService = inject(NavigationService); + @Output() onPageChangeEmit = new EventEmitter(); + public historyUpdate$: Observable> = this.datasetSubsService.historyChanges; + + public onPageChange(currentPage: number, datasetInfo: DatasetInfo): void { + this.navigationService.navigateToDatasetView({ + accountName: datasetInfo.accountName, + datasetName: datasetInfo.datasetName, + tab: DatasetViewTypeEnum.History, + page: currentPage, + }); + // this.initDatasetViewByType( + // { + // accountName: this.datasetBasics.owner.accountName, + // datasetName: this.datasetBasics.name, + // }, + // currentPage, + // ); + } +} diff --git a/src/app/dataset-view/additional-components/history-tab/history-tab-routing.module.ts b/src/app/dataset-view/additional-components/history-tab/history-tab-routing.module.ts new file mode 100644 index 000000000..37b596f33 --- /dev/null +++ b/src/app/dataset-view/additional-components/history-tab/history-tab-routing.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' + +import { HistoryComponent } from './history-component/history.component' + +const routes: Routes = [{ path: '', component: HistoryComponent }] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class HistoryTabRoutingModule {} diff --git a/src/app/dataset-view/additional-components/history-tab/history-tab.module.ts b/src/app/dataset-view/additional-components/history-tab/history-tab.module.ts new file mode 100644 index 000000000..e0fbec74c --- /dev/null +++ b/src/app/dataset-view/additional-components/history-tab/history-tab.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; + +import { HistoryComponent } from "./history-component/history.component"; +import { HistoryTabRoutingModule } from "./history-tab-routing.module"; +import { TimelineModule } from "src/app/components/timeline-component/timeline.module"; +import { PaginationModule } from "src/app/components/pagination-component/pagination.module"; + +@NgModule({ + declarations: [HistoryComponent], + imports: [CommonModule, PaginationModule, TimelineModule, HistoryTabRoutingModule], +}) +export class HistoryTabModule {} diff --git a/src/app/dataset-view/additional-components/lineage-component/lineage.component.ts b/src/app/dataset-view/additional-components/lineage-component/lineage.component.ts deleted file mode 100644 index 91c1bc76d..000000000 --- a/src/app/dataset-view/additional-components/lineage-component/lineage.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Observable } from "rxjs"; -import { ChangeDetectionStrategy, Component, EventEmitter, OnInit, Output, inject } from "@angular/core"; -import { Node } from "@swimlane/ngx-graph"; -import { BaseComponent } from "src/app/common/base.component"; -import { LineageGraphBuilderService } from "./services/lineage-graph-builder.service"; -import { LineageGraphUpdate } from "./lineage-model"; -import { MaybeNull } from "src/app/common/app.types"; -@Component({ - selector: "app-lineage", - templateUrl: "./lineage.component.html", - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LineageComponent extends BaseComponent implements OnInit { - @Output() onClickNodeEmit = new EventEmitter(); - public lineageGraphUpdate$: Observable>; - - private lineageGraphBuilderService = inject(LineageGraphBuilderService); - - public onClickNode(node: Node): void { - this.onClickNodeEmit.emit(node); - } - - public ngOnInit(): void { - this.lineageGraphUpdate$ = this.lineageGraphBuilderService.buildGraph(); - } -} diff --git a/src/app/dataset-view/additional-components/lineage-component/lineage.component.html b/src/app/dataset-view/additional-components/lineage-tab/lineage-component/lineage.component.html similarity index 100% rename from src/app/dataset-view/additional-components/lineage-component/lineage.component.html rename to src/app/dataset-view/additional-components/lineage-tab/lineage-component/lineage.component.html diff --git a/src/app/dataset-view/additional-components/lineage-component/lineage.component.spec.ts b/src/app/dataset-view/additional-components/lineage-tab/lineage-component/lineage.component.spec.ts similarity index 96% rename from src/app/dataset-view/additional-components/lineage-component/lineage.component.spec.ts rename to src/app/dataset-view/additional-components/lineage-tab/lineage-component/lineage.component.spec.ts index 782b3a82d..ebe831cc9 100644 --- a/src/app/dataset-view/additional-components/lineage-component/lineage.component.spec.ts +++ b/src/app/dataset-view/additional-components/lineage-tab/lineage-component/lineage.component.spec.ts @@ -1,4 +1,4 @@ -import { mockNode } from "../../../search/mock.data"; + import { ComponentFixture, TestBed } from "@angular/core/testing"; import { LineageComponent } from "./lineage.component"; @@ -9,6 +9,7 @@ import { ApolloModule } from "apollo-angular"; import { AccountService } from "src/app/services/account.service"; import { of } from "rxjs"; import { ToastrModule } from "ngx-toastr"; +import { mockNode } from "src/app/search/mock.data"; describe("LineageComponent", () => { let component: LineageComponent; diff --git a/src/app/dataset-view/additional-components/lineage-tab/lineage-component/lineage.component.ts b/src/app/dataset-view/additional-components/lineage-tab/lineage-component/lineage.component.ts new file mode 100644 index 000000000..a09753f81 --- /dev/null +++ b/src/app/dataset-view/additional-components/lineage-tab/lineage-component/lineage.component.ts @@ -0,0 +1,43 @@ +import { Observable } from "rxjs"; +import { ChangeDetectionStrategy, Component, OnInit, inject } from "@angular/core"; +import { Node } from "@swimlane/ngx-graph"; +import { BaseComponent } from "src/app/common/base.component"; +import { LineageGraphBuilderService } from "../services/lineage-graph-builder.service"; +import { LineageGraphNodeData, LineageGraphNodeKind, LineageGraphUpdate } from "../lineage-graph.model"; +import { MaybeNull } from "src/app/common/app.types"; +import { NavigationService } from "src/app/services/navigation.service"; +import { DatasetViewTypeEnum } from "src/app/dataset-view/dataset-view.interface"; + +@Component({ + selector: "app-lineage", + templateUrl: "./lineage.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class LineageComponent extends BaseComponent implements OnInit { + public lineageGraphUpdate$: Observable>; + + private lineageGraphBuilderService = inject(LineageGraphBuilderService); + private navigationService = inject(NavigationService); + + public onClickNode(node: Node): void { + const nodeData: LineageGraphNodeData = node.data as LineageGraphNodeData; + /* istanbul ignore else */ + if (nodeData.kind === LineageGraphNodeKind.Dataset) { + this.onSelectDataset(nodeData.dataObject.accountName, nodeData.dataObject.name); + } else { + throw new Error("Clicked lineage node of unexpected type"); + } + } + + public onSelectDataset(accountName?: string, datasetName?: string): void { + this.navigationService.navigateToDatasetView({ + accountName: accountName ? accountName : this.getDatasetInfoFromUrl().accountName, + datasetName: datasetName ? datasetName : this.getDatasetInfoFromUrl().datasetName, + tab: DatasetViewTypeEnum.Lineage, + }); + } + + public ngOnInit(): void { + this.lineageGraphUpdate$ = this.lineageGraphBuilderService.buildGraph(); + } +} diff --git a/src/app/dataset-view/additional-components/lineage-component/lineage-model.ts b/src/app/dataset-view/additional-components/lineage-tab/lineage-graph.model.ts similarity index 100% rename from src/app/dataset-view/additional-components/lineage-component/lineage-model.ts rename to src/app/dataset-view/additional-components/lineage-tab/lineage-graph.model.ts diff --git a/src/app/components/lineage-graph/ligeage-graph.settings.ts b/src/app/dataset-view/additional-components/lineage-tab/lineage-graph/ligeage-graph.settings.ts similarity index 100% rename from src/app/components/lineage-graph/ligeage-graph.settings.ts rename to src/app/dataset-view/additional-components/lineage-tab/lineage-graph/ligeage-graph.settings.ts diff --git a/src/app/components/lineage-graph/lineage-graph.component.html b/src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.component.html similarity index 100% rename from src/app/components/lineage-graph/lineage-graph.component.html rename to src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.component.html diff --git a/src/app/components/lineage-graph/lineage-graph.component.scss b/src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.component.scss similarity index 100% rename from src/app/components/lineage-graph/lineage-graph.component.scss rename to src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.component.scss diff --git a/src/app/components/lineage-graph/lineage-graph.component.spec.ts b/src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.component.spec.ts similarity index 100% rename from src/app/components/lineage-graph/lineage-graph.component.spec.ts rename to src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.component.spec.ts diff --git a/src/app/components/lineage-graph/lineage-graph.component.ts b/src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.component.ts similarity index 95% rename from src/app/components/lineage-graph/lineage-graph.component.ts rename to src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.component.ts index 773152674..3e242fd10 100644 --- a/src/app/components/lineage-graph/lineage-graph.component.ts +++ b/src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.component.ts @@ -1,4 +1,3 @@ -import { WidgetHeightService } from "../../services/widget-height.service"; import { ChangeDetectionStrategy, Component, @@ -18,10 +17,11 @@ import AppValues from "src/app/common/app.values"; import { LineageGraph, LineageGraphNodeKind, -} from "src/app/dataset-view/additional-components/lineage-component/lineage-model"; +} from "src/app/dataset-view/additional-components/lineage-tab/lineage-graph.model"; import { LineageGraphConfig, LINEAGE_CONFIG } from "./ligeage-graph.settings"; import { SessionStorageService } from "src/app/services/session-storage.service"; import { MaybeUndefined } from "src/app/common/app.types"; +import { WidgetHeightService } from "src/app/services/widget-height.service"; @Component({ selector: "app-lineage-graph", diff --git a/src/app/components/lineage-graph/lineage-graph.module.ts b/src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.module.ts similarity index 89% rename from src/app/components/lineage-graph/lineage-graph.module.ts rename to src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.module.ts index 624e259fc..11ca44b41 100644 --- a/src/app/components/lineage-graph/lineage-graph.module.ts +++ b/src/app/dataset-view/additional-components/lineage-tab/lineage-graph/lineage-graph.module.ts @@ -5,7 +5,7 @@ import { LineageGraphComponent } from "./lineage-graph.component"; import { NgxGraphModule } from "@swimlane/ngx-graph"; import { MatIconModule } from "@angular/material/icon"; import { DisplaySizeModule } from "src/app/common/pipes/display-size.module"; -import { DisplayTimeModule } from "../display-time/display-time.module"; +import { DisplayTimeModule } from "src/app/components/display-time/display-time.module"; @NgModule({ imports: [CommonModule, FormsModule, NgxGraphModule, MatIconModule, DisplaySizeModule, DisplayTimeModule], diff --git a/src/app/dataset-view/additional-components/lineage-tab/lineage-tab-routing.module.ts b/src/app/dataset-view/additional-components/lineage-tab/lineage-tab-routing.module.ts new file mode 100644 index 000000000..d161dfcb3 --- /dev/null +++ b/src/app/dataset-view/additional-components/lineage-tab/lineage-tab-routing.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' + +import { LineageComponent } from './lineage-component/lineage.component' + +const routes: Routes = [{ path: '', component: LineageComponent }] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class LineageTabRoutingModule {} diff --git a/src/app/dataset-view/additional-components/lineage-tab/lineage-tab.module.ts b/src/app/dataset-view/additional-components/lineage-tab/lineage-tab.module.ts new file mode 100644 index 000000000..45078ac84 --- /dev/null +++ b/src/app/dataset-view/additional-components/lineage-tab/lineage-tab.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; + +import { LineageComponent } from "./lineage-component/lineage.component"; +import { LineageTabRoutingModule } from "./lineage-tab-routing.module"; +import { LineageGraphModule } from "./lineage-graph/lineage-graph.module"; + +@NgModule({ + declarations: [LineageComponent], + imports: [CommonModule, LineageTabRoutingModule, LineageGraphModule], +}) +export class LineageTabModule {} diff --git a/src/app/dataset-view/additional-components/lineage-component/services/lineage-graph-builder.service.spec.ts b/src/app/dataset-view/additional-components/lineage-tab/services/lineage-graph-builder.service.spec.ts similarity index 98% rename from src/app/dataset-view/additional-components/lineage-component/services/lineage-graph-builder.service.spec.ts rename to src/app/dataset-view/additional-components/lineage-tab/services/lineage-graph-builder.service.spec.ts index 94ed4c417..0aade48af 100644 --- a/src/app/dataset-view/additional-components/lineage-component/services/lineage-graph-builder.service.spec.ts +++ b/src/app/dataset-view/additional-components/lineage-tab/services/lineage-graph-builder.service.spec.ts @@ -6,7 +6,7 @@ import { mockLineageGraphUpdate, mockLineageGraphUpdateWithMqttSource, } from "../../data-tabs.mock"; -import { LineageGraphNodeData, LineageGraphNodeKind, LineageGraphUpdate } from "../lineage-model"; +import { LineageGraphNodeData, LineageGraphNodeKind, LineageGraphUpdate } from "../lineage-graph.model"; import { MaybeNull } from "src/app/common/app.types"; describe("LineageGraphBuilderService", () => { diff --git a/src/app/dataset-view/additional-components/lineage-component/services/lineage-graph-builder.service.ts b/src/app/dataset-view/additional-components/lineage-tab/services/lineage-graph-builder.service.ts similarity index 99% rename from src/app/dataset-view/additional-components/lineage-component/services/lineage-graph-builder.service.ts rename to src/app/dataset-view/additional-components/lineage-tab/services/lineage-graph-builder.service.ts index 72ad903b6..e1a05b131 100644 --- a/src/app/dataset-view/additional-components/lineage-component/services/lineage-graph-builder.service.ts +++ b/src/app/dataset-view/additional-components/lineage-tab/services/lineage-graph-builder.service.ts @@ -9,7 +9,7 @@ import { LineageNodeAccess, LineageGraph, LineageGraphUpdate, -} from "../lineage-model"; +} from "../lineage-graph.model"; import { Node, Edge } from "@swimlane/ngx-graph"; import _ from "lodash"; import { MaybeNull } from "src/app/common/app.types"; diff --git a/src/app/dataset-view/additional-components/metadata-component/components/final-yaml-modal/final-yaml-modal.component.spec.ts b/src/app/dataset-view/additional-components/metadata-component/components/final-yaml-modal/final-yaml-modal.component.spec.ts index 32e601505..1cdf6add7 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/final-yaml-modal/final-yaml-modal.component.spec.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/final-yaml-modal/final-yaml-modal.component.spec.ts @@ -7,11 +7,11 @@ import { DatasetInfo } from "src/app/interface/navigation.interface"; import { of } from "rxjs"; import { FormsModule } from "@angular/forms"; import { SharedTestModule } from "src/app/common/shared-test.module"; -import { DatasetCommitService } from "../../../overview-component/services/dataset-commit.service"; import { HttpClientTestingModule } from "@angular/common/http/testing"; import { EditorModule } from "src/app/shared/editor/editor.module"; import { LoggedUserService } from "src/app/auth/logged-user.service"; import { mockAccountDetails } from "src/app/api/mock/auth.mock"; +import { DatasetCommitService } from "../../../overview-tab/services/dataset-commit.service"; const testDatasetInfo: DatasetInfo = { accountName: "testAccountName", diff --git a/src/app/dataset-view/additional-components/metadata-component/components/final-yaml-modal/final-yaml-modal.component.ts b/src/app/dataset-view/additional-components/metadata-component/components/final-yaml-modal/final-yaml-modal.component.ts index 21e10d0e1..0bfc71d4c 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/final-yaml-modal/final-yaml-modal.component.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/final-yaml-modal/final-yaml-modal.component.ts @@ -2,9 +2,9 @@ import { BaseComponent } from "src/app/common/base.component"; import { ChangeDetectionStrategy, Component, inject, Input } from "@angular/core"; import { NgbActiveModal } from "@ng-bootstrap/ng-bootstrap"; import { DatasetInfo } from "src/app/interface/navigation.interface"; -import { DatasetCommitService } from "../../../overview-component/services/dataset-commit.service"; import { LoggedUserService } from "src/app/auth/logged-user.service"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { DatasetCommitService } from "../../../overview-tab/services/dataset-commit.service"; @Component({ selector: "app-final-yaml-modal", diff --git a/src/app/dataset-view/additional-components/metadata-component/components/set-transform/set-transform.component.spec.ts b/src/app/dataset-view/additional-components/metadata-component/components/set-transform/set-transform.component.spec.ts index ba14d0ec9..811b2abbf 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/set-transform/set-transform.component.spec.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/set-transform/set-transform.component.spec.ts @@ -9,7 +9,6 @@ import { mockGetDatasetSchemaQuery, mockParseSetTransformYamlType, mockSetTransf import { DatasetService } from "src/app/dataset-view/dataset.service"; import { MatTreeModule, MatTreeNestedDataSource } from "@angular/material/tree"; import { DatasetNode } from "./set-transform.types"; -import { DatasetCommitService } from "../../../overview-component/services/dataset-commit.service"; import { QueriesSectionComponent } from "./components/queries-section/queries-section.component"; import { EngineSectionComponent } from "./components/engine-section/engine-section.component"; import { SearchSectionComponent } from "./components/search-section/search-section.component"; @@ -29,6 +28,7 @@ import { HttpClientTestingModule } from "@angular/common/http/testing"; import { EditorModule } from "../../../../../shared/editor/editor.module"; import { LoggedUserService } from "src/app/auth/logged-user.service"; import { mockAccountDetails } from "src/app/api/mock/auth.mock"; +import { DatasetCommitService } from "../../../overview-tab/services/dataset-commit.service"; describe("SetTransformComponent", () => { let component: SetTransformComponent; diff --git a/src/app/dataset-view/additional-components/metadata-component/components/source-events/add-polling-source/add-polling-source.component.spec.ts b/src/app/dataset-view/additional-components/metadata-component/components/source-events/add-polling-source/add-polling-source.component.spec.ts index 3c3f5bb2c..ba11157aa 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/source-events/add-polling-source/add-polling-source.component.spec.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/source-events/add-polling-source/add-polling-source.component.spec.ts @@ -20,7 +20,6 @@ import { import { DatasetPageInfoFragment, MetadataBlockFragment } from "src/app/api/kamu.graphql.interface"; import { EditPollingSourceService } from "./edit-polling-source.service"; import { SharedTestModule } from "src/app/common/shared-test.module"; -import { DatasetCommitService } from "../../../../overview-component/services/dataset-commit.service"; import { PrepareStepComponent } from "../steps/prepare-step/prepare-step.component"; import { MatStepperModule } from "@angular/material/stepper"; import { PreprocessStepComponent } from "../steps/preprocess-step/preprocess-step.component"; @@ -35,6 +34,7 @@ import { EventTimeSourceKind, FetchKind, MergeKind, ReadKind } from "./add-polli import { OdfDefaultValues } from "src/app/common/app-odf-default.values"; import { LoggedUserService } from "src/app/auth/logged-user.service"; import { mockAccountDetails } from "src/app/api/mock/auth.mock"; +import { DatasetCommitService } from "src/app/dataset-view/additional-components/overview-tab/services/dataset-commit.service"; describe("AddPollingSourceComponent", () => { let component: AddPollingSourceComponent; diff --git a/src/app/dataset-view/additional-components/metadata-component/components/source-events/add-push-source/add-push-source.component.spec.ts b/src/app/dataset-view/additional-components/metadata-component/components/source-events/add-push-source/add-push-source.component.spec.ts index 87d0686ce..12e12ba5c 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/source-events/add-push-source/add-push-source.component.spec.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/source-events/add-push-source/add-push-source.component.spec.ts @@ -4,7 +4,6 @@ import { FormArray, FormControl, FormGroup, FormsModule, ReactiveFormsModule } f import { ApolloModule } from "apollo-angular"; import { ApolloTestingModule } from "apollo-angular/testing"; import { HttpClientTestingModule } from "@angular/common/http/testing"; -import { DatasetCommitService } from "../../../../overview-component/services/dataset-commit.service"; import { from, of } from "rxjs"; import { AddPushSourceSection } from "src/app/shared/shared.types"; import { NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap"; @@ -26,6 +25,7 @@ import { NavigationService } from "src/app/services/navigation.service"; import { MergeKind, ReadKind } from "../add-polling-source/add-polling-source-form.types"; import { LoggedUserService } from "src/app/auth/logged-user.service"; import { mockAccountDetails } from "src/app/api/mock/auth.mock"; +import { DatasetCommitService } from "src/app/dataset-view/additional-components/overview-tab/services/dataset-commit.service"; const providersSection = (name: string) => { return [ diff --git a/src/app/dataset-view/additional-components/metadata-component/components/source-events/base-main-event.component.ts b/src/app/dataset-view/additional-components/metadata-component/components/source-events/base-main-event.component.ts index 44dc8cf6e..e9202ff0d 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/source-events/base-main-event.component.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/source-events/base-main-event.component.ts @@ -5,7 +5,6 @@ import { MaybeNull } from "src/app/common/app.types"; import { BaseComponent } from "src/app/common/base.component"; import { DatasetHistoryUpdate } from "src/app/dataset-view/dataset.subscriptions.interface"; import { TemplatesYamlEventsService } from "src/app/services/templates-yaml-events.service"; -import { DatasetCommitService } from "../../../overview-component/services/dataset-commit.service"; import { DatasetInfo } from "src/app/interface/navigation.interface"; import { NavigationService } from "src/app/services/navigation.service"; import { DatasetService } from "src/app/dataset-view/dataset.service"; @@ -13,6 +12,7 @@ import { DatasetSubscriptionsService } from "src/app/dataset-view/dataset.subscr import { combineLatest } from "rxjs"; import { LoggedUserService } from "src/app/auth/logged-user.service"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { DatasetCommitService } from "../../../overview-tab/services/dataset-commit.service"; export abstract class BaseMainEventComponent extends BaseComponent { protected modalService = inject(NgbModal); diff --git a/src/app/dataset-view/additional-components/metadata-component/components/stepper-navigation/stepper-navigation.component.scss b/src/app/dataset-view/additional-components/metadata-component/components/stepper-navigation/stepper-navigation.component.scss index 9d6a5085d..c4de67ee5 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/stepper-navigation/stepper-navigation.component.scss +++ b/src/app/dataset-view/additional-components/metadata-component/components/stepper-navigation/stepper-navigation.component.scss @@ -1,5 +1,3 @@ -@import "bootstrap/scss/bootstrap"; - .button-save { background: #2c974b; border-color: rgb(27 31 36 / 15%); diff --git a/src/app/dataset-view/additional-components/metadata-component/metadata.component.html b/src/app/dataset-view/additional-components/metadata-component/metadata.component.html index bcc6c73ac..381031708 100644 --- a/src/app/dataset-view/additional-components/metadata-component/metadata.component.html +++ b/src/app/dataset-view/additional-components/metadata-component/metadata.component.html @@ -10,7 +10,6 @@ (pageChange)="onPageChange($event)" />
-
- +

There is no metadata.

- +

There is no metadata. Need to add (); public readonly ReadSectionMapping: Record = { @@ -57,6 +58,7 @@ export class MetadataComponent extends BaseComponent implements OnInit { private datasetSubsService = inject(DatasetSubscriptionsService); private navigationService = inject(NavigationService); private modalService = inject(ModalService); + private datasetService = inject(DatasetService); public ngOnInit() { this.datasetSubsService.metadataSchemaChanges @@ -68,6 +70,15 @@ export class MetadataComponent extends BaseComponent implements OnInit { pageInfo: schemaUpdate.pageInfo, }; }); + + this.datasetService.datasetChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((datasetChanges) => { + this.datasetBasics = datasetChanges; + }); + this.datasetSubsService.permissionsChanges + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((permissionsChanges) => { + this.datasetPermissions = permissionsChanges; + }); } public onPageChange(currentPage: number): void { diff --git a/src/app/dataset-view/additional-components/overview-component/overview.component.ts b/src/app/dataset-view/additional-components/overview-component/overview.component.ts deleted file mode 100644 index 087d121fc..000000000 --- a/src/app/dataset-view/additional-components/overview-component/overview.component.ts +++ /dev/null @@ -1,331 +0,0 @@ -import { EditLicenseModalComponent } from "./components/edit-license-modal/edit-license-modal.component"; -import { OverviewUpdate } from "src/app/dataset-view/dataset.subscriptions.interface"; -import { - DatasetCurrentInfoFragment, - DatasetFlowType, - DatasetKind, - DatasetPermissionsFragment, -} from "../../../api/kamu.graphql.interface"; -import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, OnInit, Output } from "@angular/core"; -import { BaseComponent } from "src/app/common/base.component"; -import { NavigationService } from "src/app/services/navigation.service"; -import { - DatasetBasicsFragment, - DatasetDataSizeFragment, - DatasetOverviewFragment, - MetadataBlockFragment, -} from "../../../api/kamu.graphql.interface"; -import { DatasetSubscriptionsService } from "../../dataset.subscriptions.service"; -import { DataRow, DatasetSchema } from "src/app/interface/dataset.interface"; -import { MaybeNull, MaybeUndefined } from "src/app/common/app.types"; -import { NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap"; -import { EditDetailsModalComponent } from "./components/edit-details-modal/edit-details-modal.component"; -import { EditWatermarkModalComponent } from "./components/edit-watermark-modal/edit-watermark-modal.component"; -import _ from "lodash"; -import { DatasetFlowsService } from "../flows-component/services/dataset-flows.service"; -import { DatasetViewTypeEnum } from "../../dataset-view.interface"; -import { AddDataModalComponent } from "./components/add-data-modal/add-data-modal.component"; - -import { Observable } from "rxjs"; -import { AppConfigService } from "src/app/app-config.service"; -import { promiseWithCatch } from "src/app/common/app.helpers"; -import { ModalService } from "src/app/components/modal/modal.service"; -import AppValues from "src/app/common/app.values"; -import { FileUploadService } from "src/app/services/file-upload.service"; -import { LoggedUserService } from "src/app/auth/logged-user.service"; -import ProjectLinks from "src/app/project-links"; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; - -@Component({ - selector: "app-overview", - templateUrl: "overview.component.html", - styleUrls: ["./overview.component.scss"], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class OverviewComponent extends BaseComponent implements OnInit { - @Input({ required: true }) public datasetBasics: DatasetBasicsFragment; - @Input({ required: true }) public datasetPermissions: DatasetPermissionsFragment; - @Output() toggleReadmeViewEmit = new EventEmitter(); - @Output() selectTopicEmit = new EventEmitter(); - public editingReadme = false; - public droppedFile: File; - public uploadFileLoading$: Observable; - public readonly UPLOAD_FILE_IMAGE = AppValues.UPLOAD_FILE_IMAGE; - public readonly URL_PARAM_ADD_POLLING_SOURCE = ProjectLinks.URL_PARAM_ADD_POLLING_SOURCE; - public readonly URL_PARAM_SET_TRANSFORM = ProjectLinks.URL_PARAM_SET_TRANSFORM; - public readonly URL_PARAM_ADD_PUSH_SOURCE = ProjectLinks.URL_PARAM_ADD_PUSH_SOURCE; - - public currentState?: { - schema: MaybeNull; - data: DataRow[]; - overview: DatasetOverviewFragment; - size: DatasetDataSizeFragment; - }; - - private datasetSubsService = inject(DatasetSubscriptionsService); - private navigationService = inject(NavigationService); - private ngbModalService = inject(NgbModal); - private datasetFlowsService = inject(DatasetFlowsService); - private fileUploadService = inject(FileUploadService); - private configService = inject(AppConfigService); - private modalService = inject(ModalService); - private loggedUserService = inject(LoggedUserService); - - public ngOnInit(): void { - this.uploadFileLoading$ = this.fileUploadService.isUploadFile; - this.datasetSubsService.overviewChanges - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((overviewUpdate: OverviewUpdate) => { - this.currentState = { - schema: overviewUpdate.schema, - data: overviewUpdate.content, - size: overviewUpdate.size, - overview: overviewUpdate.overview, - }; - }); - } - - public showWebsite(url: string): void { - this.navigationService.navigateToWebsite(url); - } - - public selectTopic(topicName: string): void { - this.selectTopicEmit.emit(topicName); - } - - public get metadataFragmentBlock(): MaybeUndefined { - return this.currentState ? this.currentState.overview.metadata.chain.blocks.nodes[0] : undefined; - } - - public get canEditDatasetInfo(): boolean { - if (this.hasDatasetInfo) { - return this.datasetPermissions.permissions.canCommit; - } else { - return false; - } - } - - public get enableScheduling(): boolean { - return this.configService.featureFlags.enableScheduling; - } - - public get canAddDatasetInfo(): boolean { - if (!this.hasDatasetInfo) { - return this.datasetPermissions.permissions.canCommit && !_.isNil(this.currentState); - } else { - return false; - } - } - - public get hasDatasetInfo(): boolean { - if (this.currentState) { - const currentInfo: DatasetCurrentInfoFragment = this.currentState.overview.metadata.currentInfo; - return ( - !_.isNil(currentInfo.description) || (!_.isNil(currentInfo.keywords) && currentInfo.keywords.length > 0) - ); - } else { - return false; - } - } - - public get canAddSetPollingSource(): boolean { - if (this.currentState && this.datasetPermissions.permissions.canCommit) { - return ( - !this.currentState.overview.metadata.currentPollingSource && - this.datasetBasics.kind === DatasetKind.Root && - !this.currentState.overview.metadata.currentPushSources.length - ); - } else { - return false; - } - } - - public get canAddPushSource(): boolean { - if (this.currentState && this.datasetPermissions.permissions.canCommit) { - return ( - !this.currentState.overview.metadata.chain.blocks.nodes.filter( - (item) => item.event.__typename === "AddPushSource", - ).length && this.datasetBasics.kind === DatasetKind.Root - ); - } else { - return false; - } - } - - public get canAddSetTransform(): boolean { - if (this.currentState && this.datasetPermissions.permissions.canCommit) { - return ( - !this.currentState.overview.metadata.currentTransform && - this.datasetBasics.kind === DatasetKind.Derivative - ); - } else { - return false; - } - } - - public get canAddReadme(): boolean { - if (this.currentState && this.datasetPermissions.permissions.canCommit) { - return !this.currentState.overview.metadata.currentReadme && !this.editingReadme; - } else { - return false; - } - } - - public get canEditReadme(): boolean { - if (this.currentState && this.datasetPermissions.permissions.canCommit) { - return !_.isNil(this.currentState.overview.metadata.currentReadme); - } else { - return false; - } - } - - public get canAddLicense(): boolean { - if (this.currentState && this.datasetPermissions.permissions.canCommit) { - return _.isNil(this.currentState.overview.metadata.currentLicense); - } else { - return false; - } - } - - public get canEditLicense(): boolean { - if (this.currentState && this.datasetPermissions.permissions.canCommit) { - return !_.isNil(this.currentState.overview.metadata.currentLicense); - } else { - return false; - } - } - - public get canAddWatermark(): boolean { - if (this.currentState && this.datasetPermissions.permissions.canCommit) { - return !this.hasWatermark && this.datasetBasics.kind === DatasetKind.Root; - } else { - return false; - } - } - - public get canEditWatermark(): boolean { - if (this.currentState && this.datasetPermissions.permissions.canCommit) { - return this.hasWatermark && this.datasetBasics.kind === DatasetKind.Root; - } else { - return false; - } - } - - public get canSchedule(): boolean { - return this.datasetPermissions.permissions.canSchedule; - } - - public get canRefresh(): boolean { - return this.hasSetPollingSource || this.hasCurrentTransform; - } - - public get isUserLogged(): boolean { - return this.loggedUserService.isAuthenticated; - } - - public get visibleUpdateButton(): boolean { - return this.isUserLogged && this.enableScheduling; - } - - public get hasSetPollingSource(): boolean { - return !_.isNil(this.currentState?.overview.metadata.currentPollingSource); - } - - public get showDragAndDropBlock(): boolean { - return !this.hasSetPollingSource && this.datasetBasics.kind === DatasetKind.Root; - } - - public get hasCurrentTransform(): boolean { - return !_.isNil(this.currentState?.overview.metadata.currentTransform); - } - - private get hasWatermark(): boolean { - return !_.isNil(this.currentState?.overview.metadata.currentWatermark); - } - - public get showAddDataButton(): boolean { - if (Boolean(this.currentState?.data.length) && this.isUserLogged) { - return ( - (!this.currentState?.overview.metadata.currentPollingSource && - this.datasetBasics.kind === DatasetKind.Root) || - (!this.currentState?.overview.metadata.currentTransform && - this.datasetBasics.kind === DatasetKind.Derivative) - ); - } else { - return false; - } - } - - public openInformationModal() { - const modalRef: NgbModalRef = this.ngbModalService.open(EditDetailsModalComponent); - const modalRefInstance = modalRef.componentInstance as EditDetailsModalComponent; - modalRefInstance.currentState = this.currentState; - modalRefInstance.datasetBasics = this.datasetBasics; - } - - public openLicenseModal(): void { - const modalRef: NgbModalRef = this.ngbModalService.open(EditLicenseModalComponent); - const modalRefInstance = modalRef.componentInstance as EditLicenseModalComponent; - modalRefInstance.currentState = this.currentState; - modalRefInstance.datasetBasics = this.datasetBasics; - } - - public openWatermarkModal(): void { - const modalRef: NgbModalRef = this.ngbModalService.open(EditWatermarkModalComponent); - const modalRefInstance = modalRef.componentInstance as EditWatermarkModalComponent; - modalRefInstance.currentWatermark = this.currentState?.overview.metadata.currentWatermark; - modalRefInstance.datasetBasics = this.datasetBasics; - } - - public onAddReadme(): void { - this.editingReadme = true; - } - - public refreshNow(): void { - this.datasetFlowsService - .datasetTriggerFlow({ - datasetId: this.datasetBasics.id, - datasetFlowType: - this.datasetBasics.kind === DatasetKind.Root - ? DatasetFlowType.Ingest - : DatasetFlowType.ExecuteTransform, - }) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((success: boolean) => { - if (success) { - setTimeout(() => { - this.navigationService.navigateToDatasetView({ - accountName: this.datasetBasics.owner.accountName, - datasetName: this.datasetBasics.name, - tab: DatasetViewTypeEnum.Flows, - }); - }, AppValues.SIMULATION_START_CONDITION_DELAY_MS); - } - }); - } - - public addData(): void { - const modalRef: NgbModalRef = this.ngbModalService.open(AddDataModalComponent); - const modalRefInstance = modalRef.componentInstance as AddDataModalComponent; - modalRefInstance.datasetBasics = this.datasetBasics; - } - - public onFileDropped(files: FileList): void { - this.droppedFile = files[0]; - const fileSizeMb = this.droppedFile.size * Math.pow(10, -6); - if (fileSizeMb <= this.configService.ingestUploadFileLimitMb) { - this.fileUploadService - .uploadFile(this.droppedFile, this.datasetBasics) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(); - } else { - promiseWithCatch( - this.modalService.warning({ - title: "Warning", - message: `Maximum file size ${this.configService.ingestUploadFileLimitMb} MB`, - yesButtonText: "Ok", - }), - ); - } - } -} diff --git a/src/app/dataset-view/additional-components/overview-component/components/add-data-modal/add-data-modal.component.html b/src/app/dataset-view/additional-components/overview-tab/components/add-data-modal/add-data-modal.component.html similarity index 97% rename from src/app/dataset-view/additional-components/overview-component/components/add-data-modal/add-data-modal.component.html rename to src/app/dataset-view/additional-components/overview-tab/components/add-data-modal/add-data-modal.component.html index 9a3abc349..d34a0eed5 100644 --- a/src/app/dataset-view/additional-components/overview-component/components/add-data-modal/add-data-modal.component.html +++ b/src/app/dataset-view/additional-components/overview-tab/components/add-data-modal/add-data-modal.component.html @@ -17,7 +17,7 @@ Polling sources let you link your dataset to a data source on the web and periodically capture new data from it. Which one would suit you best?

-

@@ -60,8 +60,8 @@

Keywords

class="text-decoration-none" [routerLink]="[ '/', - datasetBasics.owner.accountName, - datasetBasics.name, + data.datasetBasics.owner.accountName, + data.datasetBasics.name, URL_PARAM_ADD_POLLING_SOURCE ]" > @@ -70,15 +70,15 @@

Keywords

-
+ -
+
- +
key_vertical @@ -223,7 +223,7 @@

Id:

@@ -236,7 +236,7 @@

Kind:

-

{{ datasetBasics.kind | titlecase }}

+

{{ data.datasetBasics.kind | titlecase }}

@@ -250,7 +250,7 @@

Visibility:

@@ -261,24 +261,26 @@

License:

-
+
@@ -293,8 +295,8 @@

Estimated Size:

{{ - currentState.size.estimatedSize - ? (currentState.size.estimatedSize | displaySize) + data.overviewUpdate.size.estimatedSize + ? (data.overviewUpdate.size.estimatedSize | displaySize) : "-" }}

@@ -307,11 +309,11 @@

Records:

- {{ currentState.size.numRecordsTotal || 0 | number: "1.0-0" }} + {{ data.overviewUpdate.size.numRecordsTotal || 0 | number: "1.0-0" }}

-
+
more_time

Created At:

@@ -319,12 +321,12 @@

Created At:

-
+
update

Last Updated At:

@@ -332,8 +334,8 @@

Last Updated At:

@@ -344,20 +346,23 @@

Watermark:

-
+
@@ -366,7 +371,7 @@

Watermark:

-
@@ -377,7 +382,7 @@

Watermark:

data-test-id="edit-dataset-watermark" title="Add watermark" type="button" - (click)="openWatermarkModal()" + (click)="openWatermarkModal(data)" > Add watermark diff --git a/src/app/dataset-view/additional-components/overview-component/overview.component.scss b/src/app/dataset-view/additional-components/overview-tab/components/overview-component/overview.component.scss similarity index 100% rename from src/app/dataset-view/additional-components/overview-component/overview.component.scss rename to src/app/dataset-view/additional-components/overview-tab/components/overview-component/overview.component.scss diff --git a/src/app/dataset-view/additional-components/overview-component/overview.component.spec.ts b/src/app/dataset-view/additional-components/overview-tab/components/overview-component/overview.component.spec.ts similarity index 97% rename from src/app/dataset-view/additional-components/overview-component/overview.component.spec.ts rename to src/app/dataset-view/additional-components/overview-tab/components/overview-component/overview.component.spec.ts index d85eb4ee5..f9dc8f4b9 100644 --- a/src/app/dataset-view/additional-components/overview-component/overview.component.spec.ts +++ b/src/app/dataset-view/additional-components/overview-tab/components/overview-component/overview.component.spec.ts @@ -1,12 +1,8 @@ import { ReactiveFormsModule } from "@angular/forms"; import { ApolloModule } from "apollo-angular"; import { Apollo } from "apollo-angular"; -import { mockDatasetBasicsDerivedFragment, mockFullPowerDatasetPermissionsFragment } from "../../../search/mock.data"; -import { mockMetadataDerivedUpdate, mockOverviewDataUpdate } from "../data-tabs.mock"; import { ComponentFixture, fakeAsync, flush, TestBed, tick } from "@angular/core/testing"; -import { DatasetSubscriptionsService } from "../../dataset.subscriptions.service"; import { OverviewComponent } from "./overview.component"; -import { OverviewUpdate } from "../../dataset.subscriptions.interface"; import { DatasetCurrentInfoFragment, DatasetKind, DatasetOverviewFragment } from "src/app/api/kamu.graphql.interface"; import { NavigationService } from "src/app/services/navigation.service"; import { first } from "rxjs/operators"; @@ -14,7 +10,6 @@ import { NgbModal, NgbTooltipModule } from "@ng-bootstrap/ng-bootstrap"; import { MatChipsModule } from "@angular/material/chips"; import { SharedTestModule } from "src/app/common/shared-test.module"; import { OverviewHistorySummaryHeaderComponent } from "src/app/components/overview-history-summary-header/overview-history-summary-header.component"; -import { ReadmeSectionComponent } from "./components/readme-section/readme-section.component"; import { DisplaySizeModule } from "src/app/common/pipes/display-size.module"; import { DisplayTimeComponent } from "src/app/components/display-time/display-time.component"; import { DisplayHashComponent } from "src/app/components/display-hash/display-hash.component"; @@ -32,13 +27,18 @@ import { ChangeDetectionStrategy, SecurityContext } from "@angular/core"; import { MarkdownModule } from "ngx-markdown"; import { HttpClient } from "@angular/common/http"; import { MatIconModule } from "@angular/material/icon"; -import { DatasetFlowsService } from "../flows-component/services/dataset-flows.service"; import { of } from "rxjs"; import { emitClickOnElementByDataTestId, findElementByDataTestId } from "src/app/common/base-test.helpers.spec"; -import { DatasetViewTypeEnum } from "../../dataset-view.interface"; import { LoggedUserService } from "src/app/auth/logged-user.service"; import AppValues from "src/app/common/app.values"; import { RouterModule } from "@angular/router"; +import { DatasetViewTypeEnum } from "src/app/dataset-view/dataset-view.interface"; +import { OverviewUpdate } from "src/app/dataset-view/dataset.subscriptions.interface"; +import { DatasetSubscriptionsService } from "src/app/dataset-view/dataset.subscriptions.service"; +import { mockFullPowerDatasetPermissionsFragment, mockDatasetBasicsDerivedFragment } from "src/app/search/mock.data"; +import { mockMetadataDerivedUpdate, mockOverviewDataUpdate } from "../../../data-tabs.mock"; +import { DatasetFlowsService } from "../../../flows-component/services/dataset-flows.service"; +import { ReadmeSectionComponent } from "../readme-section/readme-section.component"; describe("OverviewComponent", () => { let component: OverviewComponent; diff --git a/src/app/dataset-view/additional-components/overview-tab/components/overview-component/overview.component.ts b/src/app/dataset-view/additional-components/overview-tab/components/overview-component/overview.component.ts new file mode 100644 index 000000000..4806709e1 --- /dev/null +++ b/src/app/dataset-view/additional-components/overview-tab/components/overview-component/overview.component.ts @@ -0,0 +1,321 @@ +import { OverviewUpdate } from "src/app/dataset-view/dataset.subscriptions.interface"; +import { ChangeDetectionStrategy, Component, EventEmitter, inject, OnInit, Output } from "@angular/core"; + +import { MaybeNull, MaybeUndefined } from "src/app/common/app.types"; +import { NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap"; +import _ from "lodash"; + +import { combineLatest, map, Observable } from "rxjs"; +import { AppConfigService } from "src/app/app-config.service"; +import { promiseWithCatch } from "src/app/common/app.helpers"; +import AppValues from "src/app/common/app.values"; +import { FileUploadService } from "src/app/services/file-upload.service"; +import { LoggedUserService } from "src/app/auth/logged-user.service"; +import ProjectLinks from "src/app/project-links"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { BaseDatasetDataComponent } from "src/app/common/base-dataset-data.component"; +import { DatasetCurrentInfoFragment, DatasetKind, DatasetPermissionsFragment, DatasetFlowType, DatasetBasicsFragment, MetadataBlockFragment } from "src/app/api/kamu.graphql.interface"; +import { DatasetFlowsService } from "../../../flows-component/services/dataset-flows.service"; +import { AddDataModalComponent } from "../add-data-modal/add-data-modal.component"; +import { EditDetailsModalComponent } from "../edit-details-modal/edit-details-modal.component"; +import { EditLicenseModalComponent } from "../edit-license-modal/edit-license-modal.component"; +import { EditWatermarkModalComponent } from "../edit-watermark-modal/edit-watermark-modal.component"; +import { DatasetOverviewTabData, DatasetViewTypeEnum } from "src/app/dataset-view/dataset-view.interface"; + +@Component({ + selector: "app-overview", + templateUrl: "overview.component.html", + styleUrls: ["./overview.component.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class OverviewComponent extends BaseDatasetDataComponent implements OnInit { + @Output() toggleReadmeViewEmit = new EventEmitter(); + @Output() selectTopicEmit = new EventEmitter(); + public editingReadme = false; + public droppedFile: File; + public uploadFileLoading$: Observable; + public readonly UPLOAD_FILE_IMAGE = AppValues.UPLOAD_FILE_IMAGE; + public readonly URL_PARAM_ADD_POLLING_SOURCE = ProjectLinks.URL_PARAM_ADD_POLLING_SOURCE; + public readonly URL_PARAM_SET_TRANSFORM = ProjectLinks.URL_PARAM_SET_TRANSFORM; + public readonly URL_PARAM_ADD_PUSH_SOURCE = ProjectLinks.URL_PARAM_ADD_PUSH_SOURCE; + + private ngbModalService = inject(NgbModal); + private datasetFlowsService = inject(DatasetFlowsService); + private fileUploadService = inject(FileUploadService); + private configService = inject(AppConfigService); + private loggedUserService = inject(LoggedUserService); + public datasetOverviewTabData$: Observable; + + public ngOnInit(): void { + this.datasetOverviewTabData$ = combineLatest([ + this.datasetService.datasetChanges, + this.datasetSubsService.permissionsChanges, + this.datasetSubsService.overviewChanges, + ]).pipe( + map(([datasetBasics, datasetPermissions, overviewUpdate]) => { + return { + datasetBasics, + datasetPermissions, + overviewUpdate, + }; + }), + takeUntilDestroyed(this.destroyRef), + ); + + this.uploadFileLoading$ = this.fileUploadService.isUploadFile; + } + + public showWebsite(url: string): void { + this.navigationService.navigateToWebsite(url); + } + + public selectTopic(topicName: string): void { + this.selectTopicEmit.emit(topicName); + } + + public metadataFragmentBlock(overviewUpdate: OverviewUpdate): MaybeUndefined { + return overviewUpdate.overview.metadata.chain.blocks.nodes[0] ?? undefined; + } + + public canEditDatasetInfo(data: DatasetOverviewTabData): boolean { + if (this.hasDatasetInfo(data.overviewUpdate)) { + return data.datasetPermissions.permissions.canCommit; + } else { + return false; + } + } + + public get enableScheduling(): boolean { + return this.configService.featureFlags.enableScheduling; + } + + public canAddDatasetInfo(data: DatasetOverviewTabData): boolean { + if (!this.hasDatasetInfo(data.overviewUpdate)) { + return data.datasetPermissions.permissions.canCommit && !_.isNil(data.overviewUpdate); + } else { + return false; + } + } + + public hasDatasetInfo(overviewUpdate: MaybeNull): boolean { + if (overviewUpdate) { + const currentInfo: DatasetCurrentInfoFragment = overviewUpdate.overview.metadata.currentInfo; + return ( + !_.isNil(currentInfo.description) || (!_.isNil(currentInfo.keywords) && currentInfo.keywords.length > 0) + ); + } else { + return false; + } + } + + public canAddSetPollingSource(data: DatasetOverviewTabData): boolean { + if (data.overviewUpdate && data.datasetPermissions.permissions.canCommit) { + return ( + !data.overviewUpdate.overview.metadata.currentPollingSource && + data.datasetBasics.kind === DatasetKind.Root && + !data.overviewUpdate.overview.metadata.currentPushSources.length + ); + } else { + return false; + } + } + + public canAddPushSource(data: DatasetOverviewTabData): boolean { + if (data.overviewUpdate && data.datasetPermissions.permissions.canCommit) { + return ( + !data.overviewUpdate.overview.metadata.chain.blocks.nodes.filter( + (item) => item.event.__typename === "AddPushSource", + ).length && data.datasetBasics.kind === DatasetKind.Root + ); + } else { + return false; + } + } + + public canAddSetTransform(data: DatasetOverviewTabData): boolean { + if (data.overviewUpdate && data.datasetPermissions.permissions.canCommit) { + return ( + !data.overviewUpdate.overview.metadata.currentTransform && + data.datasetBasics.kind === DatasetKind.Derivative + ); + } else { + return false; + } + } + + public canAddReadme(data: DatasetOverviewTabData): boolean { + if (data.overviewUpdate && data.datasetPermissions.permissions.canCommit) { + return !data.overviewUpdate.overview.metadata.currentReadme && !this.editingReadme; + } else { + return false; + } + } + + public canEditReadme(data: DatasetOverviewTabData): boolean { + if (data.overviewUpdate && data.datasetPermissions.permissions.canCommit) { + return !_.isNil(data.overviewUpdate.overview.metadata.currentReadme); + } else { + return false; + } + } + + public canAddLicense(data: DatasetOverviewTabData): boolean { + if (data.overviewUpdate && data.datasetPermissions.permissions.canCommit) { + return _.isNil(data.overviewUpdate.overview.metadata.currentLicense); + } else { + return false; + } + } + + public canEditLicense(data: DatasetOverviewTabData): boolean { + if (data.overviewUpdate && data.datasetPermissions.permissions.canCommit) { + return !_.isNil(data.overviewUpdate.overview.metadata.currentLicense); + } else { + return false; + } + } + + public canAddWatermark(data: DatasetOverviewTabData): boolean { + if (data.overviewUpdate && data.datasetPermissions.permissions.canCommit) { + return !this.hasWatermark && data.datasetBasics.kind === DatasetKind.Root; + } else { + return false; + } + } + + public canEditWatermark(data: DatasetOverviewTabData): boolean { + if (data.overviewUpdate && data.datasetPermissions.permissions.canCommit) { + return this.hasWatermark(data) && data.datasetBasics.kind === DatasetKind.Root; + } else { + return false; + } + } + + public canSchedule(data: DatasetPermissionsFragment): boolean { + return data.permissions.canSchedule; + } + + public canRefresh(data: DatasetOverviewTabData): boolean { + return this.hasSetPollingSource(data) || this.hasCurrentTransform(data); + } + + public get isUserLogged(): boolean { + return this.loggedUserService.isAuthenticated; + } + + public get visibleUpdateButton(): boolean { + return this.isUserLogged && this.enableScheduling; + } + + public hasSetPollingSource(data: DatasetOverviewTabData): boolean { + return !_.isNil(data.overviewUpdate?.overview.metadata.currentPollingSource); + } + + public showDragAndDropBlock(data: DatasetOverviewTabData): boolean { + return !this.hasSetPollingSource(data) && data.datasetBasics.kind === DatasetKind.Root; + } + + public hasCurrentTransform(data: DatasetOverviewTabData): boolean { + return !_.isNil(data.overviewUpdate.overview.metadata.currentTransform); + } + + private hasWatermark(data: DatasetOverviewTabData): boolean { + return !_.isNil(data.overviewUpdate.overview.metadata.currentWatermark); + } + + public showAddDataButton(data: DatasetOverviewTabData): boolean { + if (Boolean(data.overviewUpdate.content.length) && this.isUserLogged) { + return ( + (!data.overviewUpdate?.overview.metadata.currentPollingSource && + data.datasetBasics.kind === DatasetKind.Root) || + (!data.overviewUpdate?.overview.metadata.currentTransform && + data.datasetBasics.kind === DatasetKind.Derivative) + ); + } else { + return false; + } + } + + public openInformationModal(data: DatasetOverviewTabData) { + const modalRef: NgbModalRef = this.ngbModalService.open(EditDetailsModalComponent); + const modalRefInstance = modalRef.componentInstance as EditDetailsModalComponent; + modalRefInstance.currentState = { + schema: data.overviewUpdate.schema, + data: data.overviewUpdate.content, + overview: data.overviewUpdate.overview, + size: data.overviewUpdate.size, + }; + modalRefInstance.datasetBasics = data.datasetBasics; + } + + public openLicenseModal(data: DatasetOverviewTabData): void { + const modalRef: NgbModalRef = this.ngbModalService.open(EditLicenseModalComponent); + const modalRefInstance = modalRef.componentInstance as EditLicenseModalComponent; + modalRefInstance.currentState = { + schema: data.overviewUpdate.schema, + data: data.overviewUpdate.content, + overview: data.overviewUpdate.overview, + size: data.overviewUpdate.size, + }; + modalRefInstance.datasetBasics = data.datasetBasics; + } + + public openWatermarkModal(data: DatasetOverviewTabData): void { + const modalRef: NgbModalRef = this.ngbModalService.open(EditWatermarkModalComponent); + const modalRefInstance = modalRef.componentInstance as EditWatermarkModalComponent; + modalRefInstance.currentWatermark = data.overviewUpdate?.overview.metadata.currentWatermark; + modalRefInstance.datasetBasics = data.datasetBasics; + } + + public onAddReadme(): void { + this.editingReadme = true; + } + + public refreshNow(data: DatasetOverviewTabData): void { + this.datasetFlowsService + .datasetTriggerFlow({ + datasetId: data.datasetBasics.id, + datasetFlowType: + data.datasetBasics.kind === DatasetKind.Root + ? DatasetFlowType.Ingest + : DatasetFlowType.ExecuteTransform, + }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((success: boolean) => { + if (success) { + setTimeout(() => { + this.navigationService.navigateToDatasetView({ + accountName: data.datasetBasics.owner.accountName, + datasetName: data.datasetBasics.name, + tab: DatasetViewTypeEnum.Flows, + }); + }, AppValues.SIMULATION_START_CONDITION_DELAY_MS); + } + }); + } + + public addData(data: DatasetOverviewTabData): void { + const modalRef: NgbModalRef = this.ngbModalService.open(AddDataModalComponent); + const modalRefInstance = modalRef.componentInstance as AddDataModalComponent; + modalRefInstance.datasetBasics = data.datasetBasics; + } + + public onFileDropped(files: FileList, datasetBasics: DatasetBasicsFragment): void { + this.droppedFile = files[0]; + const fileSizeMb = this.droppedFile.size * Math.pow(10, -6); + if (fileSizeMb <= this.configService.ingestUploadFileLimitMb) { + this.fileUploadService + .uploadFile(this.droppedFile, datasetBasics) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(); + } else { + promiseWithCatch( + this.modalService.warning({ + title: "Warning", + message: `Maximum file size ${this.configService.ingestUploadFileLimitMb} MB`, + yesButtonText: "Ok", + }), + ); + } + } +} diff --git a/src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.component.html b/src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.component.html similarity index 100% rename from src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.component.html rename to src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.component.html diff --git a/src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.component.scss b/src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.component.scss similarity index 100% rename from src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.component.scss rename to src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.component.scss diff --git a/src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.component.spec.ts b/src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.component.spec.ts similarity index 100% rename from src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.component.spec.ts rename to src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.component.spec.ts diff --git a/src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.component.ts b/src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.component.ts similarity index 100% rename from src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.component.ts rename to src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.component.ts diff --git a/src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.types.ts b/src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.types.ts similarity index 100% rename from src/app/dataset-view/additional-components/overview-component/components/readme-section/readme-section.types.ts rename to src/app/dataset-view/additional-components/overview-tab/components/readme-section/readme-section.types.ts diff --git a/src/app/dataset-view/additional-components/overview-tab/overview-tab-routing.module.ts b/src/app/dataset-view/additional-components/overview-tab/overview-tab-routing.module.ts new file mode 100644 index 000000000..0ca616e6f --- /dev/null +++ b/src/app/dataset-view/additional-components/overview-tab/overview-tab-routing.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' + +import { OverviewComponent } from './components/overview-component/overview.component' + +const routes: Routes = [{ path: '', component: OverviewComponent }] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class OverviewTabRoutingModule {} diff --git a/src/app/dataset-view/additional-components/overview-tab/overview-tab.module.ts b/src/app/dataset-view/additional-components/overview-tab/overview-tab.module.ts new file mode 100644 index 000000000..6f44d56a1 --- /dev/null +++ b/src/app/dataset-view/additional-components/overview-tab/overview-tab.module.ts @@ -0,0 +1,58 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { MatChipsModule } from "@angular/material/chips"; +import { MatIconModule } from "@angular/material/icon"; +import { MatDividerModule } from "@angular/material/divider"; + +import { AngularSvgIconModule } from "angular-svg-icon"; +import { NgbTooltipModule } from "@ng-bootstrap/ng-bootstrap"; +import { MarkdownModule } from "ngx-markdown"; +import { OwlDateTimeModule } from "@danielmoncada/angular-datetime-picker"; + +import { OverviewComponent } from "./components/overview-component/overview.component"; +import { OverviewTabRoutingModule } from "./overview-tab-routing.module"; +import { AddDataModalComponent } from "./components/add-data-modal/add-data-modal.component"; +import { EditDetailsModalComponent } from "./components/edit-details-modal/edit-details-modal.component"; +import { EditLicenseModalComponent } from "./components/edit-license-modal/edit-license-modal.component"; +import { EditWatermarkModalComponent } from "./components/edit-watermark-modal/edit-watermark-modal.component"; +import { FileFromUrlModalComponent } from "./components/file-from-url-modal/file-from-url-modal.component"; +import { ReadmeSectionComponent } from "./components/readme-section/readme-section.component"; +import { DisplayTimeModule } from "src/app/components/display-time/display-time.module"; +import { DisplayHashModule } from "src/app/components/display-hash/display-hash.module"; +import { DynamicTableModule } from "src/app/components/dynamic-table/dynamic-table.module"; +import { OverviewHistorySummaryHeaderComponent } from "src/app/components/overview-history-summary-header/overview-history-summary-header.component"; +import { DisplaySizeModule } from "src/app/common/pipes/display-size.module"; +import { SharedModule } from "src/app/shared/shared/shared.module"; + +@NgModule({ + declarations: [ + OverviewComponent, + OverviewHistorySummaryHeaderComponent, + EditDetailsModalComponent, + EditLicenseModalComponent, + EditWatermarkModalComponent, + ReadmeSectionComponent, + AddDataModalComponent, + FileFromUrlModalComponent, + ], + imports: [ + CommonModule, + AngularSvgIconModule, + FormsModule, + ReactiveFormsModule, + NgbTooltipModule, + MatChipsModule, + MatDividerModule, + MatIconModule, + MarkdownModule, + OwlDateTimeModule, + DisplayHashModule, + DisplayTimeModule, + DisplaySizeModule, + DynamicTableModule, + SharedModule, + OverviewTabRoutingModule, + ], +}) +export class OverviewTabModule {} diff --git a/src/app/dataset-view/additional-components/overview-component/services/dataset-commit.service.spec.ts b/src/app/dataset-view/additional-components/overview-tab/services/dataset-commit.service.spec.ts similarity index 100% rename from src/app/dataset-view/additional-components/overview-component/services/dataset-commit.service.spec.ts rename to src/app/dataset-view/additional-components/overview-tab/services/dataset-commit.service.spec.ts diff --git a/src/app/dataset-view/additional-components/overview-component/services/dataset-commit.service.ts b/src/app/dataset-view/additional-components/overview-tab/services/dataset-commit.service.ts similarity index 100% rename from src/app/dataset-view/additional-components/overview-component/services/dataset-commit.service.ts rename to src/app/dataset-view/additional-components/overview-tab/services/dataset-commit.service.ts diff --git a/src/app/dataset-view/dataset-view-header/dataset-view-header/dataset-view-header.module.ts b/src/app/dataset-view/dataset-view-header/dataset-view-header/dataset-view-header.module.ts new file mode 100644 index 000000000..9bd9af0f3 --- /dev/null +++ b/src/app/dataset-view/dataset-view-header/dataset-view-header/dataset-view-header.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { DatasetViewHeaderComponent } from "../dataset-view-header.component"; +import { SearchAdditionalButtonsModule } from "src/app/components/search-additional-buttons/search-additional-buttons.module"; +import { RouterModule } from "@angular/router"; +import { AngularSvgIconModule } from "angular-svg-icon"; + +@NgModule({ + declarations: [DatasetViewHeaderComponent], + imports: [CommonModule, SearchAdditionalButtonsModule, RouterModule, AngularSvgIconModule], + exports: [DatasetViewHeaderComponent], +}) +export class DatasetViewHeaderModule {} diff --git a/src/app/dataset-view/dataset-view-menu/dataset-view-menu.component.html b/src/app/dataset-view/dataset-view-menu/dataset-view-menu.component.html index 8c9af1812..3a365b027 100644 --- a/src/app/dataset-view/dataset-view-menu/dataset-view-menu.component.html +++ b/src/app/dataset-view/dataset-view-menu/dataset-view-menu.component.html @@ -25,7 +25,7 @@ [class.active-link]="isDatasetViewTypeData" value="data" > - +
dataset Data @@ -38,7 +38,7 @@ [class.active-link]="isDatasetViewTypeMetadata" value="metadata" > - +
dataset_linked Metadata @@ -51,7 +51,7 @@ [class.active-link]="isDatasetViewTypeHistory" value="history" > - +
manage_history History @@ -64,7 +64,7 @@ [class.active-link]="isDatasetViewTypeLineage" value="lineage" > - +
account_tree Lineage @@ -89,7 +89,7 @@ [class.active-link]="isDatasetViewTypeFlows" *ngIf="shouldAllowFlowsTab" > - +
add_task Flows diff --git a/src/app/dataset-view/dataset-view-menu/dataset-view-menu/dataset-view-menu.module.ts b/src/app/dataset-view/dataset-view-menu/dataset-view-menu/dataset-view-menu.module.ts new file mode 100644 index 000000000..efbdad6d8 --- /dev/null +++ b/src/app/dataset-view/dataset-view-menu/dataset-view-menu/dataset-view-menu.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { DatasetViewMenuComponent } from "../dataset-view-menu.component"; +import { DataAccessPanelModule } from "src/app/components/data-access-panel/data-access-panel.module"; +import { MatButtonToggleModule } from "@angular/material/button-toggle"; +import { RouterModule } from "@angular/router"; +import { MatIconModule } from "@angular/material/icon"; +import { AngularSvgIconModule } from "angular-svg-icon"; +import { SharedModule } from "src/app/shared/shared/shared.module"; + +@NgModule({ + declarations: [DatasetViewMenuComponent], + imports: [ + CommonModule, + DataAccessPanelModule, + AngularSvgIconModule, + MatButtonToggleModule, + RouterModule, + MatIconModule, + SharedModule, + ], + exports: [DatasetViewMenuComponent], +}) +export class DatasetViewMenuModule {} diff --git a/src/app/dataset-view/dataset-view.interface.ts b/src/app/dataset-view/dataset-view.interface.ts index ea1699cb2..3ff64b28c 100644 --- a/src/app/dataset-view/dataset-view.interface.ts +++ b/src/app/dataset-view/dataset-view.interface.ts @@ -1,3 +1,6 @@ +import { DatasetBasicsFragment, DatasetPermissionsFragment } from "../api/kamu.graphql.interface"; +import { OverviewUpdate } from "./dataset.subscriptions.interface"; + export enum DatasetViewTypeEnum { Overview = "overview", Data = "data", @@ -8,3 +11,9 @@ export enum DatasetViewTypeEnum { Settings = "settings", Flows = "flows", } + +export interface DatasetOverviewTabData { + datasetBasics: DatasetBasicsFragment; + datasetPermissions: DatasetPermissionsFragment; + overviewUpdate: OverviewUpdate; +} diff --git a/src/app/dataset-view/dataset.component.html b/src/app/dataset-view/dataset.component.html index 679ea4fed..647e65843 100644 --- a/src/app/dataset-view/dataset.component.html +++ b/src/app/dataset-view/dataset.component.html @@ -14,8 +14,9 @@ [datasetPermissions]="datasetPermissions" [datasetViewType]="datasetViewType" /> + - + /> -->
diff --git a/src/app/dataset-view/dataset.component.spec.ts b/src/app/dataset-view/dataset.component.spec.ts index 9a4d011c3..55e5c4ae2 100644 --- a/src/app/dataset-view/dataset.component.spec.ts +++ b/src/app/dataset-view/dataset.component.spec.ts @@ -28,16 +28,16 @@ import { AngularSvgIconModule, SvgIconRegistryService } from "angular-svg-icon"; import { HttpClientTestingModule } from "@angular/common/http/testing"; import { MatIconModule } from "@angular/material/icon"; import AppValues from "../common/app.values"; -import { LineageGraphNodeData } from "./additional-components/lineage-component/lineage-model"; +import { LineageGraphNodeData } from "./additional-components/lineage-tab/lineage-graph.model"; import { ChangeDetectionStrategy } from "@angular/core"; import { DatasetSubscriptionsService } from "./dataset.subscriptions.service"; import { Node } from "@swimlane/ngx-graph/lib/models/node.model"; import { DatasetSettingsComponent } from "./additional-components/dataset-settings-component/dataset-settings.component"; import { MatDividerModule } from "@angular/material/divider"; -import { DataComponent } from "./additional-components/data-component/data.component"; +import { DataComponent } from "./additional-components/data-tab/data-component/data.component"; import { MetadataComponent } from "./additional-components/metadata-component/metadata.component"; -import { HistoryComponent } from "./additional-components/history-component/history.component"; -import { LineageComponent } from "./additional-components/lineage-component/lineage.component"; +import { HistoryComponent } from "./additional-components/history-tab/history-component/history.component"; +import { LineageComponent } from "./additional-components/lineage-tab/lineage-component/lineage.component"; import { DatasetSettingsGeneralTabComponent } from "./additional-components/dataset-settings-component/tabs/general/dataset-settings-general-tab.component"; import { DatasetSettingsSchedulingTabComponent } from "./additional-components/dataset-settings-component/tabs/scheduling/dataset-settings-scheduling-tab.component"; import { ToastrModule } from "ngx-toastr"; diff --git a/src/app/dataset-view/dataset.component.ts b/src/app/dataset-view/dataset.component.ts index 980a1dc81..a0ad52c06 100644 --- a/src/app/dataset-view/dataset.component.ts +++ b/src/app/dataset-view/dataset.component.ts @@ -1,21 +1,17 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, OnInit } from "@angular/core"; import { DatasetViewTypeEnum } from "./dataset-view.interface"; import { NavigationEnd, Router } from "@angular/router"; -import { Node } from "@swimlane/ngx-graph/lib/models/node.model"; -import { filter, finalize, first, switchMap, tap } from "rxjs/operators"; +import { filter, first, switchMap, tap } from "rxjs/operators"; import { DatasetBasicsFragment, DatasetPermissionsFragment } from "../api/kamu.graphql.interface"; import ProjectLinks from "../project-links"; import { DatasetInfo } from "../interface/navigation.interface"; import { promiseWithCatch } from "../common/app.helpers"; -import { DatasetRequestBySql } from "../interface/dataset.interface"; import { MaybeNull, MaybeUndefined } from "../common/app.types"; import { DatasetPermissionsService } from "./dataset.permissions.service"; import { ReplaySubject, Subject, of } from "rxjs"; -import { LineageGraphNodeData, LineageGraphNodeKind } from "./additional-components/lineage-component/lineage-model"; import _ from "lodash"; import { BaseDatasetDataComponent } from "../common/base-dataset-data.component"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { SqlQueryService } from "../services/sql-query.service"; import { AppConfigService } from "../app-config.service"; @Component({ @@ -28,7 +24,6 @@ export class DatasetComponent extends BaseDatasetDataComponent implements OnInit public datasetInfo: DatasetInfo; public datasetViewType: DatasetViewTypeEnum = DatasetViewTypeEnum.Overview; public readonly DatasetViewTypeEnum = DatasetViewTypeEnum; - public sqlLoading: boolean = false; public currentHeadBlockHash: string = ""; private mainDatasetQueryComplete$: Subject = new ReplaySubject(1 /* bufferSize */); @@ -36,7 +31,6 @@ export class DatasetComponent extends BaseDatasetDataComponent implements OnInit private datasetPermissionsServices = inject(DatasetPermissionsService); private router = inject(Router); private cdr = inject(ChangeDetectorRef); - private sqlQueryService = inject(SqlQueryService); private configService = inject(AppConfigService); public ngOnInit(): void { @@ -250,15 +244,15 @@ export class DatasetComponent extends BaseDatasetDataComponent implements OnInit ); } - public onClickLineageNode(node: Node): void { - const nodeData: LineageGraphNodeData = node.data as LineageGraphNodeData; - /* istanbul ignore else */ - if (nodeData.kind === LineageGraphNodeKind.Dataset) { - this.onSelectDataset(nodeData.dataObject.accountName, nodeData.dataObject.name); - } else { - throw new Error("Clicked lineage node of unexpected type"); - } - } + // public onClickLineageNode(node: Node): void { + // const nodeData: LineageGraphNodeData = node.data as LineageGraphNodeData; + // /* istanbul ignore else */ + // if (nodeData.kind === LineageGraphNodeKind.Dataset) { + // this.onSelectDataset(nodeData.dataObject.accountName, nodeData.dataObject.name); + // } else { + // throw new Error("Clicked lineage node of unexpected type"); + // } + // } private initDatasetViewByType(datasetInfo: DatasetInfo, currentPage: number): void { const mapperTabs: { [key in DatasetViewTypeEnum]: () => void } = { @@ -284,9 +278,8 @@ export class DatasetComponent extends BaseDatasetDataComponent implements OnInit } private getDatasetViewTypeFromUrl(): DatasetViewTypeEnum { - const tabValue: MaybeNull = this.activatedRoute.snapshot.queryParamMap.get( - ProjectLinks.URL_QUERY_PARAM_TAB, - ); + const tabValue: MaybeNull = this.activatedRoute.snapshot.firstChild?.data.tab as string; + if (tabValue) { const tab = tabValue as DatasetViewTypeEnum; if (Object.values(DatasetViewTypeEnum).includes(tab)) { @@ -306,19 +299,4 @@ export class DatasetComponent extends BaseDatasetDataComponent implements OnInit }); } } - - public onRunSQLRequest(params: DatasetRequestBySql): void { - this.sqlLoading = true; - this.sqlQueryService - // TODO: Propagate limit from UI and display when it was reached - .requestDataSqlRun(params) - .pipe( - finalize(() => { - this.sqlLoading = false; - }), - takeUntilDestroyed(this.destroyRef), - ) - .subscribe(); - this.cdr.detectChanges(); - } } diff --git a/src/app/dataset-view/dataset.module.ts b/src/app/dataset-view/dataset.module.ts index 6c9a16ab5..fe03f1637 100644 --- a/src/app/dataset-view/dataset.module.ts +++ b/src/app/dataset-view/dataset.module.ts @@ -6,44 +6,31 @@ import { DisplayTimeModule } from "../components/display-time/display-time.modul import { ModuleWithProviders, NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; import { DatasetComponent } from "./dataset.component"; -import { SearchAdditionalButtonsModule } from "../components/search-additional-buttons/search-additional-buttons.module"; import { NgbModule, NgbNavModule } from "@ng-bootstrap/ng-bootstrap"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { DynamicTableModule } from "../components/dynamic-table/dynamic-table.module"; import { SearchSidenavModule } from "../components/search-sidenav/search-sidenav.module"; import { MatButtonToggleModule } from "@angular/material/button-toggle"; import { NgxGraphModule } from "@swimlane/ngx-graph"; -import { LineageGraphModule } from "../components/lineage-graph/lineage-graph.module"; import { PaginationModule } from "../components/pagination-component/pagination.module"; import { MatMenuModule } from "@angular/material/menu"; import { MatButtonModule } from "@angular/material/button"; import { MarkdownModule } from "ngx-markdown"; import { MetadataComponent } from "./additional-components/metadata-component/metadata.component"; import { ClipboardModule } from "@angular/cdk/clipboard"; -import { DataComponent } from "./additional-components/data-component/data.component"; -import { OverviewComponent } from "./additional-components/overview-component/overview.component"; -import { LineageComponent as LineageComponent } from "./additional-components/lineage-component/lineage.component"; import { CdkAccordionModule } from "@angular/cdk/accordion"; -import { HistoryComponent } from "./additional-components/history-component/history.component"; -import { TimelineModule } from "../components/timeline-component/timeline.module"; import { CustomPaginationModule } from "../components/custom-pagination-component/custom-pagination.module"; -import { DatasetViewHeaderComponent } from "./dataset-view-header/dataset-view-header.component"; -import { DatasetViewMenuComponent } from "./dataset-view-menu/dataset-view-menu.component"; import { SideNavModule } from "../sidenav/side-nav.module"; import { RouterModule } from "@angular/router"; -import { OverviewHistorySummaryHeaderComponent } from "../components/overview-history-summary-header/overview-history-summary-header.component"; import { AngularSvgIconModule } from "angular-svg-icon"; import { DisplaySizeModule } from "../common/pipes/display-size.module"; import { SharedModule } from "../shared/shared/shared.module"; -import { EditDetailsModalComponent } from "./additional-components/overview-component/components/edit-details-modal/edit-details-modal.component"; -import { EditLicenseModalComponent } from "./additional-components/overview-component/components/edit-license-modal/edit-license-modal.component"; import { FinalYamlModalComponent } from "./additional-components/metadata-component/components/final-yaml-modal/final-yaml-modal.component"; import { BaseStepComponent } from "./additional-components/metadata-component/components/source-events/steps/base-step/base-step.component"; import { StepperNavigationComponent } from "./additional-components/metadata-component/components/stepper-navigation/stepper-navigation.component"; import { PrepareStepComponent } from "./additional-components/metadata-component/components/source-events/steps/prepare-step/prepare-step.component"; import { PreprocessStepComponent } from "./additional-components/metadata-component/components/source-events/steps/preprocess-step/preprocess-step.component"; import { PollingSourceFormComponentsModule } from "./additional-components/metadata-component/components/form-components/polling-source-form-components.module"; -import { EditWatermarkModalComponent } from "./additional-components/overview-component/components/edit-watermark-modal/edit-watermark-modal.component"; import { OwlDateTimeModule, OwlNativeDateTimeModule } from "@danielmoncada/angular-datetime-picker"; import { OwlMomentDateTimeModule } from "@danielmoncada/angular-datetime-picker-moment-adapter"; import { SetTransformComponent } from "./additional-components/metadata-component/components/set-transform/set-transform.component"; @@ -55,7 +42,6 @@ import { PageNotFoundComponent } from "../components/page-not-found/page-not-fou import { AddPollingSourceComponent } from "./additional-components/metadata-component/components/source-events/add-polling-source/add-polling-source.component"; import { MatStepperModule } from "@angular/material/stepper"; import { EngineSelectComponent } from "./additional-components/metadata-component/components/set-transform/components/engine-section/components/engine-select/engine-select.component"; -import { ReadmeSectionComponent } from "./additional-components/overview-component/components/readme-section/readme-section.component"; import { DatasetSettingsComponent } from "./additional-components/dataset-settings-component/dataset-settings.component"; import { MatInputModule } from "@angular/material/input"; import { ReturnToCliComponent } from "../components/return-to-cli/return-to-cli.component"; @@ -76,15 +62,15 @@ import { DatasetSettingsSecretsManagerTabComponent } from "./additional-componen import { MatSortModule } from "@angular/material/sort"; import { EditKeyValueModalComponent } from "./additional-components/dataset-settings-component/tabs/variables-and-secrets/components/edit-key-value-modal/edit-key-value-modal.component"; import { DatasetSettingsCompactingTabComponent } from "./additional-components/dataset-settings-component/tabs/compacting/dataset-settings-compacting-tab.component"; -import { AddDataModalComponent } from "./additional-components/overview-component/components/add-data-modal/add-data-modal.component"; -import { FileFromUrlModalComponent } from "./additional-components/overview-component/components/file-from-url-modal/file-from-url-modal.component"; -import { FlowsTableComponent } from "../common/components/flows-table/flows-table.component"; -import { TileBaseWidgetComponent } from "../common/components/tile-base-widget/tile-base-widget.component"; import { FlowsComponent } from "./additional-components/flows-component/flows.component"; import { AngularMultiSelectModule } from "angular2-multiselect-dropdown"; import { MatTabsModule } from "@angular/material/tabs"; import { MatChipsModule } from "@angular/material/chips"; import { QuerySharedModule } from "../query/shared/query-shared/query-shared.module"; +import { DatasetFlowModule } from "../dataset-flow/dataset-flow/dataset-flow.module"; +import { DatasetViewMenuModule } from "./dataset-view-menu/dataset-view-menu/dataset-view-menu.module"; +import { DatasetViewHeaderModule } from "./dataset-view-header/dataset-view-header/dataset-view-header.module"; +import { DatasetTabsRoutingModule } from "./additional-components/dataset-tabs-routing.module"; @NgModule({ imports: [ @@ -97,10 +83,7 @@ import { QuerySharedModule } from "../query/shared/query-shared/query-shared.mod MatButtonToggleModule, DynamicTableModule, SearchSidenavModule, - SearchAdditionalButtonsModule, - TimelineModule, NgxGraphModule, - LineageGraphModule, PaginationModule, MatMenuModule, MatButtonModule, @@ -141,49 +124,34 @@ import { QuerySharedModule } from "../query/shared/query-shared/query-shared.mod MatSortModule, AngularMultiSelectModule, QuerySharedModule, + DatasetFlowModule, + DatasetViewMenuModule, + DatasetViewHeaderModule, + DatasetTabsRoutingModule, ], exports: [ - DatasetViewHeaderComponent, - OverviewHistorySummaryHeaderComponent, DatasetComponent, - DatasetViewMenuComponent, MetadataComponent, - DataComponent, BaseStepComponent, PrepareStepComponent, PreprocessStepComponent, StepperNavigationComponent, - OverviewComponent, - LineageComponent, - HistoryComponent, DisplayHashModule, MatTreeModule, MatTooltipModule, DataAccessPanelModule, SharedModule, - TileBaseWidgetComponent, - FlowsTableComponent, AngularMultiSelectModule, MatChipsModule, ], declarations: [ - DatasetViewHeaderComponent, - OverviewHistorySummaryHeaderComponent, DatasetComponent, - DatasetViewMenuComponent, MetadataComponent, - DataComponent, - OverviewComponent, - LineageComponent, - HistoryComponent, - EditDetailsModalComponent, - EditLicenseModalComponent, FinalYamlModalComponent, BaseStepComponent, PrepareStepComponent, PreprocessStepComponent, StepperNavigationComponent, - EditWatermarkModalComponent, SetTransformComponent, SearchSectionComponent, EngineSectionComponent, @@ -192,21 +160,15 @@ import { QuerySharedModule } from "../query/shared/query-shared/query-shared.mod ReturnToCliComponent, AddPollingSourceComponent, EngineSelectComponent, - ReadmeSectionComponent, DatasetSettingsComponent, FlowsComponent, - TileBaseWidgetComponent, - FlowsTableComponent, AddPushSourceComponent, SourceNameStepComponent, DatasetSettingsGeneralTabComponent, DatasetSettingsSchedulingTabComponent, DatasetSettingsSecretsManagerTabComponent, EditKeyValueModalComponent, - DatasetSettingsCompactingTabComponent, - AddDataModalComponent, - FileFromUrlModalComponent, - ], + DatasetSettingsCompactingTabComponent ], }) export class DatasetModule { public static forRoot(): ModuleWithProviders { diff --git a/src/app/dataset-view/dataset.service.ts b/src/app/dataset-view/dataset.service.ts index 9c9b07f5e..a555cbe7c 100644 --- a/src/app/dataset-view/dataset.service.ts +++ b/src/app/dataset-view/dataset.service.ts @@ -17,7 +17,7 @@ import { } from "../api/kamu.graphql.interface"; import { DatasetInfo } from "../interface/navigation.interface"; import { inject, Injectable, Injector } from "@angular/core"; -import { combineLatest, Observable, of, Subject } from "rxjs"; +import { combineLatest, Observable, of, ReplaySubject, Subject } from "rxjs"; import { DataRow, DatasetLineageNode, DatasetSchema } from "../interface/dataset.interface"; import { DatasetBasicsFragment, @@ -45,7 +45,7 @@ export class DatasetService { private datasetSubsService = inject(DatasetSubscriptionsService); private injector = inject(Injector); private currentHeadBlockHash: string; - private dataset$: Subject = new Subject(); + private dataset$: Subject = new ReplaySubject(1); public get datasetChanges(): Observable { return this.dataset$.asObservable(); @@ -141,6 +141,10 @@ export class DatasetService { const historyUpdate: DatasetHistoryUpdate = { history: data.datasets.byOwnerAndName.metadata.chain.blocks.nodes as MetadataBlockFragment[], pageInfo, + datasetInfo: { + accountName: data.datasets.byOwnerAndName.owner.accountName, + datasetName: data.datasets.byOwnerAndName.name, + }, }; this.datasetSubsService.emitHistoryChanged(historyUpdate); } else { @@ -168,6 +172,10 @@ export class DatasetService { const historyUpdate: DatasetHistoryUpdate = { history: data.datasets.byOwnerAndName.metadata.chain.blocks.nodes as MetadataBlockFragment[], pageInfo, + datasetInfo: { + accountName: data.datasets.byOwnerAndName.owner.accountName, + datasetName: data.datasets.byOwnerAndName.name, + }, }; return historyUpdate; } else { diff --git a/src/app/dataset-view/dataset.subscriptions.interface.ts b/src/app/dataset-view/dataset.subscriptions.interface.ts index 01cadb95d..b3bf2a495 100644 --- a/src/app/dataset-view/dataset.subscriptions.interface.ts +++ b/src/app/dataset-view/dataset.subscriptions.interface.ts @@ -7,6 +7,7 @@ import { } from "../api/kamu.graphql.interface"; import { DataRow, DatasetSchema } from "../interface/dataset.interface"; import { MaybeNull } from "../common/app.types"; +import { DatasetInfo } from "../interface/navigation.interface"; export interface OverviewUpdate { schema: MaybeNull; @@ -34,6 +35,7 @@ export interface MetadataSchemaUpdate { export interface DatasetHistoryUpdate { history: MetadataBlockFragment[]; pageInfo: DatasetPageInfoFragment; + datasetInfo: DatasetInfo; } export interface LineageUpdate { diff --git a/src/app/dataset-view/additional-components/data-component/mock.data.ts b/src/app/query/shared/saved-queries-section/mock.data.ts similarity index 97% rename from src/app/dataset-view/additional-components/data-component/mock.data.ts rename to src/app/query/shared/saved-queries-section/mock.data.ts index 77567f668..dae56ef52 100644 --- a/src/app/dataset-view/additional-components/data-component/mock.data.ts +++ b/src/app/query/shared/saved-queries-section/mock.data.ts @@ -1,7 +1,7 @@ import { Injectable } from "@angular/core"; @Injectable() -export default class DataTabValues { +export default class SavedQueriesValues { public static savedQueries = [ { time: "10:02 AM", diff --git a/src/app/query/shared/saved-queries-section/saved-queries-section.component.ts b/src/app/query/shared/saved-queries-section/saved-queries-section.component.ts index 5345e12c2..822dfdc3a 100644 --- a/src/app/query/shared/saved-queries-section/saved-queries-section.component.ts +++ b/src/app/query/shared/saved-queries-section/saved-queries-section.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component } from "@angular/core"; -import DataTabValues from "../../../dataset-view/additional-components/data-component/mock.data"; +import SavedQueriesValues from "./mock.data"; @Component({ selector: "app-saved-queries-section", @@ -8,5 +8,5 @@ import DataTabValues from "../../../dataset-view/additional-components/data-comp changeDetection: ChangeDetectionStrategy.OnPush, }) export class SavedQueriesSectionComponent { - public savedQueries = DataTabValues.savedQueries; + public savedQueries = SavedQueriesValues.savedQueries; } diff --git a/src/app/search/mock.data.ts b/src/app/search/mock.data.ts index 24fcfdde6..c668ee66c 100644 --- a/src/app/search/mock.data.ts +++ b/src/app/search/mock.data.ts @@ -42,7 +42,7 @@ import { LineageGraphDatasetNodeObject, LineageGraphNodeKind, LineageNodeAccess, -} from "../dataset-view/additional-components/lineage-component/lineage-model"; +} from "../dataset-view/additional-components/lineage-tab/lineage-graph.model"; import { GraphQLError } from "graphql"; import { TEST_AVATAR_URL } from "../api/mock/auth.mock"; import { AddPushSourceEditFormType } from "../dataset-view/additional-components/metadata-component/components/source-events/add-push-source/add-push-source-form.types"; diff --git a/src/app/services/navigation.service.ts b/src/app/services/navigation.service.ts index 2747aad28..7a5023a66 100644 --- a/src/app/services/navigation.service.ts +++ b/src/app/services/navigation.service.ts @@ -86,11 +86,9 @@ export class NavigationService { public navigateToDatasetView(params: DatasetNavigationParams): void { promiseWithCatch( - this.router.navigate([params.accountName, params.datasetName], { + this.router.navigate([params.accountName, params.datasetName, params.tab], { queryParams: - params.page === 1 - ? { tab: params.tab } - : { tab: params.tab, section: params.section, page: params.page, sqlQuery: params.sqlQuery }, + params.page === 1 ? {} : { section: params.section, page: params.page, sqlQuery: params.sqlQuery }, state: params.state, }), );