diff --git a/backend/src/admin/settings/settings.controller.ts b/backend/src/admin/settings/settings.controller.ts index 60b8885e..7f59da41 100644 --- a/backend/src/admin/settings/settings.controller.ts +++ b/backend/src/admin/settings/settings.controller.ts @@ -84,6 +84,10 @@ export class SettingsController { if (!(await this.jsonFilesService.GetDashboard(dashboard_name))) return new NotFoundException(); + data.filters.map((filter) => { + filter.componentConfigs.defaultWithinFiltersOperator = + data.defaultWithinFiltersOperator; + }); for (const dashboard of dashboards) { if (dashboard.name == dashboard_name) dashboard['explorer'] = data; } diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js index ae88a2ff..2377671c 100644 --- a/frontend/.eslintrc.js +++ b/frontend/.eslintrc.js @@ -1,20 +1,24 @@ /* eslint-env node */ module.exports = { - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier', + ], parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint', 'unused-imports'], root: true, - 'rules': { + rules: { 'no-unused-vars': 'off', 'unused-imports/no-unused-imports': 'error', 'unused-imports/no-unused-vars': [ 'warn', { - 'vars': 'all', - 'varsIgnorePattern': '^_', - 'args': 'after-used', - 'argsIgnorePattern': '^_' - } - ] - } + vars: 'all', + varsIgnorePattern: '^_', + args: 'after-used', + argsIgnorePattern: '^_', + }, + ], + }, }; diff --git a/frontend/.prettierrc b/frontend/.prettierrc index dcb72794..a20502b7 100644 --- a/frontend/.prettierrc +++ b/frontend/.prettierrc @@ -1,4 +1,4 @@ { "singleQuote": true, "trailingComma": "all" -} \ No newline at end of file +} diff --git a/frontend/angular.json b/frontend/angular.json index bc4406ea..4a4bf9e8 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -22,8 +22,14 @@ "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "src/tsconfig.app.json", - "assets": ["src/favicon.ico", "src/assets", - { "glob": "**/*", "input": "node_modules/tinymce", "output": "/tinymce/" } + "assets": [ + "src/favicon.ico", + "src/assets", + { + "glob": "**/*", + "input": "node_modules/tinymce", + "output": "/tinymce/" + } ], "styles": [ "src/styles.scss", @@ -64,8 +70,7 @@ }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", - "options": { - }, + "options": {}, "configurations": { "production": { "browserTarget": "RES:build:production" diff --git a/frontend/e2e/protractor.conf.js b/frontend/e2e/protractor.conf.js index 86776a39..98bba709 100644 --- a/frontend/e2e/protractor.conf.js +++ b/frontend/e2e/protractor.conf.js @@ -5,11 +5,9 @@ const { SpecReporter } = require('jasmine-spec-reporter'); exports.config = { allScriptsTimeout: 11000, - specs: [ - './src/**/*.e2e-spec.ts' - ], + specs: ['./src/**/*.e2e-spec.ts'], capabilities: { - 'browserName': 'chrome' + browserName: 'chrome', }, directConnect: true, baseUrl: 'http://localhost:4200/', @@ -17,12 +15,14 @@ exports.config = { jasmineNodeOpts: { showColors: true, defaultTimeoutInterval: 30000, - print: function() {} + print: function () {}, }, onPrepare() { require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.e2e.json') + project: require('path').join(__dirname, './tsconfig.e2e.json'), }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; \ No newline at end of file + jasmine + .getEnv() + .addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + }, +}; diff --git a/frontend/e2e/tsconfig.e2e.json b/frontend/e2e/tsconfig.e2e.json index d696d43d..a90b3575 100644 --- a/frontend/e2e/tsconfig.e2e.json +++ b/frontend/e2e/tsconfig.e2e.json @@ -4,10 +4,6 @@ "outDir": "../out-tsc/app", "module": "commonjs", "target": "es2018", - "types": [ - "jasmine", - "jasminewd2", - "node" - ] + "types": ["jasmine", "jasminewd2", "node"] } } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 13f46482..2a88aadf 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -42,6 +42,8 @@ "dayjs": "^1.11.10", "highcharts": "^10.3.3", "highcharts-angular": "^3.1.2", + "html2canvas": "^1.4.1", + "jspdf": "^2.5.2", "jwt-decode": "^3.1.2", "material-design-icons-iconfont": "^6.7.0", "ng2-nouislider": "^2.0.0", @@ -2538,7 +2540,7 @@ "version": "7.20.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, + "devOptional": true, "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -4805,6 +4807,12 @@ "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", "dev": true }, + "node_modules/@types/raf": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", + "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", + "optional": true + }, "node_modules/@types/ramda": { "version": "0.27.34", "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.34.tgz", @@ -5731,6 +5739,17 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, "node_modules/autoprefixer": { "version": "10.4.13", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", @@ -5887,6 +5906,14 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -6156,6 +6183,17 @@ "node": ">= 4.5.0" } }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -6301,6 +6339,25 @@ } ] }, + "node_modules/canvg": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", + "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", + "optional": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -6823,6 +6880,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "hasInstallScript": true, + "optional": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-js-compat": { "version": "3.33.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz", @@ -7007,6 +7075,14 @@ "node": ">= 8" } }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/css-loader": { "version": "6.7.3", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", @@ -7464,6 +7540,12 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.7.tgz", + "integrity": "sha512-2q4bEI+coQM8f5ez7kt2xclg1XsecaV9ASJk/54vwlfRRNQfDqJz2pzQ8t0Ix/ToBpXlVjrRIx7pFC/o8itG2Q==", + "optional": true + }, "node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", @@ -8783,6 +8865,11 @@ "node": ">=0.8.0" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -9634,6 +9721,18 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -10977,6 +11076,39 @@ "node >= 0.2.0" ] }, + "node_modules/jspdf": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.2.tgz", + "integrity": "sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "atob": "^2.1.2", + "btoa": "^1.2.1", + "fflate": "^0.8.1" + }, + "optionalDependencies": { + "canvg": "^3.0.6", + "core-js": "^3.6.0", + "dompurify": "^2.5.4", + "html2canvas": "^1.0.0-rc.5" + } + }, + "node_modules/jspdf/node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/jspdf/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -13179,7 +13311,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true + "devOptional": true }, "node_modules/picocolors": { "version": "1.0.0", @@ -13836,6 +13968,15 @@ } ] }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "optional": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, "node_modules/ramda": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", @@ -14029,7 +14170,7 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "devOptional": true }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -14275,6 +14416,15 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, + "node_modules/rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", + "optional": true, + "engines": { + "node": ">= 0.8.15" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -15254,6 +15404,15 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/stackblur-canvas": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", + "optional": true, + "engines": { + "node": ">=0.1.14" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -15439,6 +15598,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "optional": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -15678,6 +15846,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -16276,6 +16452,14 @@ "node": ">= 0.4.0" } }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 1b6797f6..266dbc97 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -47,6 +47,8 @@ "dayjs": "^1.11.10", "highcharts": "^10.3.3", "highcharts-angular": "^3.1.2", + "html2canvas": "^1.4.1", + "jspdf": "^2.5.2", "jwt-decode": "^3.1.2", "material-design-icons-iconfont": "^6.7.0", "ng2-nouislider": "^2.0.0", diff --git a/frontend/src/alt.js b/frontend/src/alt.js index 8796d282..af87dbfd 100644 --- a/frontend/src/alt.js +++ b/frontend/src/alt.js @@ -1,4 +1,4 @@ -!(function(e, t, n) { +!(function (e, t, n) { var d = 'createElement', m = 'getElementsByTagName', c = 'setAttribute', @@ -15,5 +15,5 @@ ); })( 'altmetric-embed-js', - 'https://d1bxh8uas1mnw7.cloudfront.net/assets/embed.js' + 'https://d1bxh8uas1mnw7.cloudfront.net/assets/embed.js', ); diff --git a/frontend/src/app/admin/appearance/appearance.component.html b/frontend/src/app/admin/appearance/appearance.component.html index e868e7f3..605549f2 100644 --- a/frontend/src/app/admin/appearance/appearance.component.html +++ b/frontend/src/app/admin/appearance/appearance.component.html @@ -2,18 +2,45 @@
- Appearance - {{dashboard_name}} - + Appearance - {{ dashboard_name }} + Export - cloud_download + cloud_download - - - @@ -38,13 +65,22 @@ />
+
+ + Items label + + +
Primary color Secondary color
-

Show toolbar

-

Show side Nav

-

Show top Nav

+

+ Show toolbar +

+

+ Show side Nav +

+

+ Show top Nav +

@@ -155,10 +201,7 @@

Chart colors:

-
+
{{ color.value }} diff --git a/frontend/src/app/admin/appearance/appearance.component.scss b/frontend/src/app/admin/appearance/appearance.component.scss index f603eab8..0518e846 100644 --- a/frontend/src/app/admin/appearance/appearance.component.scss +++ b/frontend/src/app/admin/appearance/appearance.component.scss @@ -1,7 +1,7 @@ .save { float: right; } -.colors{ +.colors { display: inline-block; padding: 10px; } diff --git a/frontend/src/app/admin/appearance/appearance.component.ts b/frontend/src/app/admin/appearance/appearance.component.ts index 39c8e27f..18de06e7 100644 --- a/frontend/src/app/admin/appearance/appearance.component.ts +++ b/frontend/src/app/admin/appearance/appearance.component.ts @@ -28,6 +28,7 @@ export class AppearanceComponent implements OnInit { primary_color: new UntypedFormControl(this.primary_color), secondary_color: new UntypedFormControl(this.secondary_color), website_name: new UntypedFormControl(''), + items_label: new UntypedFormControl(''), logo: new UntypedFormControl(''), favIcon: new UntypedFormControl(''), tracking_code: new UntypedFormControl(''), @@ -150,6 +151,7 @@ export class AppearanceComponent implements OnInit { primary_color: importedItem?.primary_color, secondary_color: importedItem?.secondary_color, website_name: importedItem?.website_name, + items_label: importedItem?.items_label, logo: importedItem?.logo, favIcon: importedItem?.favIcon, tracking_code: importedItem?.tracking_code, diff --git a/frontend/src/app/admin/components/confirmation/confirmation.component.html b/frontend/src/app/admin/components/confirmation/confirmation.component.html index 7dde011d..934f0fa4 100644 --- a/frontend/src/app/admin/components/confirmation/confirmation.component.html +++ b/frontend/src/app/admin/components/confirmation/confirmation.component.html @@ -1,8 +1,12 @@ -

{{data.title}}

+

{{ data.title }}

-

+

-
- - +
+ +
diff --git a/frontend/src/app/admin/components/mapping-values/form/values-form.component.html b/frontend/src/app/admin/components/mapping-values/form/values-form.component.html index 6f12b46f..b5d86f9a 100644 --- a/frontend/src/app/admin/components/mapping-values/form/values-form.component.html +++ b/frontend/src/app/admin/components/mapping-values/form/values-form.component.html @@ -1,28 +1,63 @@ -

{{ data? 'Edit' :'New' }} Value Mappings

-
-
-

- - - -

-

- - - -

-

- - -

- -
-
- - -
+

{{ data ? 'Edit' : 'New' }} Value Mappings

+ +
+

+ + + +

+

+ + + +

+

+ + +

+
+
+ + +
diff --git a/frontend/src/app/admin/components/mapping-values/form/values-form.component.scss b/frontend/src/app/admin/components/mapping-values/form/values-form.component.scss index a26f0981..c7acb4bf 100644 --- a/frontend/src/app/admin/components/mapping-values/form/values-form.component.scss +++ b/frontend/src/app/admin/components/mapping-values/form/values-form.component.scss @@ -1,3 +1,3 @@ -mat-form-field{ - width: 100%; +mat-form-field { + width: 100%; } diff --git a/frontend/src/app/admin/components/mapping-values/mapping-values.component.html b/frontend/src/app/admin/components/mapping-values/mapping-values.component.html index 3f98fce3..865199e7 100644 --- a/frontend/src/app/admin/components/mapping-values/mapping-values.component.html +++ b/frontend/src/app/admin/components/mapping-values/mapping-values.component.html @@ -2,20 +2,47 @@
- Value Mappings - {{index_name}} - + Value Mappings - {{ index_name }} + Export - cloud_download + cloud_download - - - + add +
@@ -25,41 +52,49 @@
Search - - + - - - + + - - + + - - + + - - + + - + - +
Find {{element.find}} Find{{ element.find }} Replace {{element.replace}} Replace{{ element.replace }} Metadata field {{element.metadataField}} Metadata field{{ element.metadataField }} Created At {{element.created_at}} Created At{{ element.created_at }} Actions Actions -
- +
diff --git a/frontend/src/app/admin/components/setup/setup.component.html b/frontend/src/app/admin/components/setup/setup.component.html index 5b192ac6..209566a4 100644 --- a/frontend/src/app/admin/components/setup/setup.component.html +++ b/frontend/src/app/admin/components/setup/setup.component.html @@ -3,21 +3,53 @@ Repository Setup - - Export - cloud_download + + Export + cloud_download - - - - @@ -34,16 +66,21 @@ [formGroup]="repoform" > - - + + expand_less - + expand_more Repository ({{ repoindex + 1 }}) @@ -53,10 +90,17 @@ color="warn" mat-icon-button > - delete + delete -
+
Repository name @@ -71,8 +115,14 @@
Repository type - - + + {{ plugin.name }} @@ -81,14 +131,17 @@
- Start from page number ({{activePlugin[repoindex]?.start_page?.placeholder}}, unless you know what you - are doing) + Start from page number ({{ + activePlugin[repoindex]?.start_page?.placeholder + }}, unless you know what you are doing) @@ -102,7 +155,9 @@ @@ -117,7 +172,10 @@ />
-
+
{{ activePlugin[repoindex]?.name }} DSpace XML sitemap @@ -125,8 +183,12 @@
@@ -163,14 +225,14 @@ color="info" mat-button [disabled]=" - repoform.get('type').value == null || - repoform.get('itemsEndPoint').value == null || - repoform.get('itemsEndPoint').value == '' - " + repoform.get('type').value == null || + repoform.get('itemsEndPoint').value == null || + repoform.get('itemsEndPoint').value == '' + " > Auto import metadata structure cloud_download + >cloud_download @@ -225,7 +287,7 @@

Schema

mat-icon-button > delete + >delete
@@ -235,12 +297,14 @@

Schema

@@ -293,13 +357,15 @@

Metadata fields

> None LanguageLanguage
Country Date - Datetime + Datetime LowercaseLowercase
@@ -317,7 +383,7 @@

Metadata fields

" > Extract years as years_{{ - form.controls.disply_name.value + form.controls.disply_name.value }} @@ -333,7 +399,7 @@

Metadata fields

mat-icon-button > delete + >delete
@@ -343,12 +409,14 @@

Metadata fields

diff --git a/frontend/src/app/admin/components/setup/setup.component.scss b/frontend/src/app/admin/components/setup/setup.component.scss index 44a07005..11a7e9e8 100644 --- a/frontend/src/app/admin/components/setup/setup.component.scss +++ b/frontend/src/app/admin/components/setup/setup.component.scss @@ -1,29 +1,29 @@ -.float-right{ - float: right; +.float-right { + float: right; } .file { - padding-top: 20px; - * { - float: left; + padding-top: 20px; + * { + float: left; + } + .logo { + position: relative; + max-width: 167px; + display: inline-block; + img { + width: 100%; + background-color: #ededed; } - .logo { - position: relative; - max-width: 167px; - display: inline-block; - img { - width: 100%; - background-color: #ededed; - } - button { - position: absolute; - right: 0; - width: 24px; - height: 24px; - top: 0; - } + button { + position: absolute; + right: 0; + width: 24px; + height: 24px; + top: 0; } } +} .list-fields { max-height: 390px; diff --git a/frontend/src/app/admin/components/shared/shared.component.html b/frontend/src/app/admin/components/shared/shared.component.html index 1d89060a..4d134c62 100644 --- a/frontend/src/app/admin/components/shared/shared.component.html +++ b/frontend/src/app/admin/components/shared/shared.component.html @@ -1,9 +1,7 @@
- - Shared Links - + Shared Links
@@ -13,31 +11,31 @@ - - + + - - + + - - + + - - + + - + - +
ID. {{element.id}} ID.{{ element.id }} Hashed Item {{element.hashedItem}} Hashed Item{{ element.hashedItem }} attr {{element.attr | json}} attr{{ element.attr | json }} Created At {{element.created_at}} Created At{{ element.created_at }} Actions Actions - open_in_new + open_in_new
- +
diff --git a/frontend/src/app/admin/components/shared/shared.component.scss b/frontend/src/app/admin/components/shared/shared.component.scss index 00e4cb9f..1922e7ff 100644 --- a/frontend/src/app/admin/components/shared/shared.component.scss +++ b/frontend/src/app/admin/components/shared/shared.component.scss @@ -1,3 +1,3 @@ table { - width: 100%; - } \ No newline at end of file + width: 100%; +} diff --git a/frontend/src/app/admin/components/users/form/form.component.html b/frontend/src/app/admin/components/users/form/form.component.html index fa6f01d3..f4001da2 100644 --- a/frontend/src/app/admin/components/users/form/form.component.html +++ b/frontend/src/app/admin/components/users/form/form.component.html @@ -1,53 +1,72 @@ -

{{ data? 'Edit' :'New' }} User

+

{{ data ? 'Edit' : 'New' }} User

-
-

- - - -

-

- - +

+

+ + + +

+

+ + + +

- +

+ + Role + + Admin + Editor + + +

-

+

+ + + +

-

- - - Role - - - Admin - - - Editor - - - - -

- -

- - - -

- -
-

- Email alrady exist. -

-
- - -
-
- - +
+

Email alrady exist.

- \ No newline at end of file +
+
+ + +
+ diff --git a/frontend/src/app/admin/components/users/form/form.component.scss b/frontend/src/app/admin/components/users/form/form.component.scss index a26f0981..c7acb4bf 100644 --- a/frontend/src/app/admin/components/users/form/form.component.scss +++ b/frontend/src/app/admin/components/users/form/form.component.scss @@ -1,3 +1,3 @@ -mat-form-field{ - width: 100%; +mat-form-field { + width: 100%; } diff --git a/frontend/src/app/admin/components/users/users.component.html b/frontend/src/app/admin/components/users/users.component.html index 55ca4ea8..ef25debe 100644 --- a/frontend/src/app/admin/components/users/users.component.html +++ b/frontend/src/app/admin/components/users/users.component.html @@ -3,7 +3,12 @@ Users - @@ -17,39 +22,43 @@ - - + + - - + + - - + + - - + + - - + + - + - +
ID. {{element.id}} ID.{{ element.id }} Name {{element.name}} Name{{ element.name }} Email {{element.email}} Email{{ element.email }} Role {{element.role}} Role{{ element.role }} Created At {{element.created_at}} Created At{{ element.created_at }} Actions Actions -
- +
diff --git a/frontend/src/app/admin/dashboard/dashboard.component.html b/frontend/src/app/admin/dashboard/dashboard.component.html index c83270b5..0f100e6b 100644 --- a/frontend/src/app/admin/dashboard/dashboard.component.html +++ b/frontend/src/app/admin/dashboard/dashboard.component.html @@ -3,15 +3,31 @@ Harvest Dashboard - - - @@ -23,11 +39,16 @@
-

{{availableSection.display_name}}

+

{{ availableSection.display_name }}

- @@ -37,11 +58,20 @@

{{availableSection.display_name}}

- - @@ -49,17 +79,27 @@

{{availableSection.display_name}}

- + {{ tablesData?.[availableSection.name].active_count }} - Active ({{ tablesData?.[availableSection.name].stuck_count }}) + Active ({{ + tablesData?.[availableSection.name].stuck_count + }}) - + {{ tablesData?.[availableSection.name].waiting_count }} @@ -67,8 +107,11 @@

{{availableSection.display_name}}

Waiting
- + {{ tablesData?.[availableSection.name].completed_count }} @@ -76,8 +119,11 @@

{{availableSection.display_name}}

Completed
- + {{ tablesData?.[availableSection.name].failed_count }} @@ -88,17 +134,31 @@

{{availableSection.display_name}}

+ *ngIf=" + progress?.[availableSection.name].estimation && + progress?.[availableSection.name].estimation !== '00:00:00' + " + class="col-12 estimated-time" + color="primary" + >
- Estimated time {{progress?.[availableSection.name].estimation}} + Estimated time + {{ progress?.[availableSection.name].estimation }}
- +

- -

{{progress?.[availableSection.name].percentage.toFixed(2)}}%

+ +

+ {{ progress?.[availableSection.name].percentage.toFixed(2) }}% +

@@ -111,14 +171,20 @@

{{progress?.[availableSection.name].per [pageIndex]="tablesData?.[availableSection.name].table.pageIndex" [pageSize]="tablesData?.[availableSection.name].table.pageSize" [totalPages]="tablesData?.[availableSection.name].table.totalPages" - [totalRecords]="tablesData?.[availableSection.name].table.totalRecords" + [totalRecords]=" + tablesData?.[availableSection.name].table.totalRecords + " [availableSection]="true" - (paginationEvent)="PaginationChanged($event, activeTables?.[availableSection.name]?.status, availableSection.name)" + (paginationEvent)=" + PaginationChanged( + $event, + activeTables?.[availableSection.name]?.status, + availableSection.name + ) + " > -

-
diff --git a/frontend/src/app/admin/dashboard/dashboard.component.scss b/frontend/src/app/admin/dashboard/dashboard.component.scss index d5a169d2..4d58171e 100644 --- a/frontend/src/app/admin/dashboard/dashboard.component.scss +++ b/frontend/src/app/admin/dashboard/dashboard.component.scss @@ -11,7 +11,10 @@ app-info-table { .jobs-progress-bar { height: 20px; - box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); + box-shadow: + 0 2px 1px -1px rgba(0, 0, 0, 0.2), + 0px 1px 1px 0px rgba(0, 0, 0, 0.14), + 0px 1px 3px 0px rgba(0, 0, 0, 0.12); border-radius: 4px; } @@ -45,4 +48,3 @@ app-info-table { .harvest-table-tools { text-align: right; } - diff --git a/frontend/src/app/admin/dashboard/info-table/info-table.component.html b/frontend/src/app/admin/dashboard/info-table/info-table.component.html index 116aece9..4a7ac6f2 100644 --- a/frontend/src/app/admin/dashboard/info-table/info-table.component.html +++ b/frontend/src/app/admin/dashboard/info-table/info-table.component.html @@ -1,58 +1,68 @@
- - - - - - +
ID. - {{element.id}} - error - -
+ + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - -
ID. + {{ element.id }} + error + + Repository {{element.repository_name }} Repository{{ element.repository_name }} Plugin Name {{element.plugin_name }} Plugin Name{{ element.plugin_name }} Page {{element.page }} Page{{ element.page }} Created {{element.timestamp}} Created{{ element.timestamp }} Processed {{element.processedOn}} Processed{{ element.processedOn }} Finished {{element.finishedOn}} Finished{{ element.finishedOn }} Attempts Made - {{element.attemptsMade}} - error - -
+ + Attempts Made + + {{ element.attemptsMade }} + error + + + + + +
+ showFirstLastButtons +> diff --git a/frontend/src/app/admin/dashboard/info-table/info-table.component.scss b/frontend/src/app/admin/dashboard/info-table/info-table.component.scss index bf35eef1..31f48410 100644 --- a/frontend/src/app/admin/dashboard/info-table/info-table.component.scss +++ b/frontend/src/app/admin/dashboard/info-table/info-table.component.scss @@ -2,7 +2,9 @@ min-height: 296px; } -th.mat-mdc-header-cell, td.mat-mdc-cell, td.mat-mdc-footer-cell { +th.mat-mdc-header-cell, +td.mat-mdc-cell, +td.mat-mdc-footer-cell { padding-left: 5px; } diff --git a/frontend/src/app/admin/design/components/counter/counter.component.html b/frontend/src/app/admin/design/components/counter/counter.component.html index c81378c4..b091336d 100644 --- a/frontend/src/app/admin/design/components/counter/counter.component.html +++ b/frontend/src/app/admin/design/components/counter/counter.component.html @@ -1,14 +1,18 @@
- - - + + + - {{configs.componentConfigs.title}} - - + {{ configs.componentConfigs.title }} + diff --git a/frontend/src/app/admin/design/components/counter/counter.component.scss b/frontend/src/app/admin/design/components/counter/counter.component.scss index 86421013..22a25075 100644 --- a/frontend/src/app/admin/design/components/counter/counter.component.scss +++ b/frontend/src/app/admin/design/components/counter/counter.component.scss @@ -1,4 +1,3 @@ - mat-card-title { font-size: 12px; text-align: center; diff --git a/frontend/src/app/admin/design/components/filter/filter.component.html b/frontend/src/app/admin/design/components/filter/filter.component.html index 3eed95f7..8ac727ba 100644 --- a/frontend/src/app/admin/design/components/filter/filter.component.html +++ b/frontend/src/app/admin/design/components/filter/filter.component.html @@ -1,15 +1,21 @@ - - - {{icon}}{{iconText}} - - - - - {{configs.componentConfigs.placeholder || configs.componentConfigs.text }} + + {{ icon }}{{ iconText }} + + + + {{ + configs.componentConfigs.placeholder || configs.componentConfigs.text + }} diff --git a/frontend/src/app/admin/design/components/filter/filter.component.scss b/frontend/src/app/admin/design/components/filter/filter.component.scss index bcbb7547..1def758a 100644 --- a/frontend/src/app/admin/design/components/filter/filter.component.scss +++ b/frontend/src/app/admin/design/components/filter/filter.component.scss @@ -1,4 +1,3 @@ - mat-card-title { font-size: small; text-align: left; diff --git a/frontend/src/app/admin/design/components/form-dialog/form-dialog.component.html b/frontend/src/app/admin/design/components/form-dialog/form-dialog.component.html index 60e1cedd..936dae66 100644 --- a/frontend/src/app/admin/design/components/form-dialog/form-dialog.component.html +++ b/frontend/src/app/admin/design/components/form-dialog/form-dialog.component.html @@ -1,83 +1,159 @@

Settings

-
- - -

- - {{control.label}} - - -

-

- - -

-

- - {{control.label}} - - -

-

- - - {{item.name}} {{item.name}} - - - {{item.name}} {{item.name}} - - -

-

+ + + +

+ + {{ control.label }} + + +

+

+ + +

+

+ + {{ control.label }} + + +

+

+ + + {{ + item.name + }} + {{ item.name }} + + + {{ + item.name + }} + {{ item.name }} + + +

+

+ + +

+

+ + {{ control.label }} + + +

+

+ {{ control.label }} +

- - -

-

- - {{control.label}} - - -

-

- {{control.label}} -

+
+
+ +
+
-
-
- -
-
- -

- {{control.label}} - - Advanced search allows inserting special query parameters to be used in the search input. - -

- -
-
-
+

+ {{ control.label }} + + Advanced search allows inserting special query parameters to be used + in the search input. + +

+ + +
- - + +
diff --git a/frontend/src/app/admin/design/components/form-dialog/form-dialog.component.scss b/frontend/src/app/admin/design/components/form-dialog/form-dialog.component.scss index b9f01ff0..2dc4ce98 100644 --- a/frontend/src/app/admin/design/components/form-dialog/form-dialog.component.scss +++ b/frontend/src/app/admin/design/components/form-dialog/form-dialog.component.scss @@ -1,7 +1,7 @@ -mat-form-field{ - width: 100%; +mat-form-field { + width: 100%; } -.formd{ - min-height: 325px; -} \ No newline at end of file +.formd { + min-height: 325px; +} diff --git a/frontend/src/app/admin/design/components/grid/grid.component.html b/frontend/src/app/admin/design/components/grid/grid.component.html index e3da4a3f..086fc459 100644 --- a/frontend/src/app/admin/design/components/grid/grid.component.html +++ b/frontend/src/app/admin/design/components/grid/grid.component.html @@ -1,90 +1,117 @@

Please chose Grid Type

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- -
\ No newline at end of file + +
diff --git a/frontend/src/app/admin/design/components/main-list/main-list.component.scss b/frontend/src/app/admin/design/components/main-list/main-list.component.scss index 42379429..df41e9e4 100644 --- a/frontend/src/app/admin/design/components/main-list/main-list.component.scss +++ b/frontend/src/app/admin/design/components/main-list/main-list.component.scss @@ -1,5 +1,5 @@ - mat-form-field.base{ - float: left; - width: 100%; - display: block; +mat-form-field.base { + float: left; + width: 100%; + display: block; } diff --git a/frontend/src/app/admin/design/components/sort/sort.component.html b/frontend/src/app/admin/design/components/sort/sort.component.html index c59d3170..8700e1f6 100644 --- a/frontend/src/app/admin/design/components/sort/sort.component.html +++ b/frontend/src/app/admin/design/components/sort/sort.component.html @@ -1,17 +1,33 @@ -

Sort sort -

+

Sort sort

-
-
- - {{item.componentConfigs.title}} - -
+
+
+ + {{ item.componentConfigs.title }} +
+
- - + +
diff --git a/frontend/src/app/admin/design/components/structure/structure.component.html b/frontend/src/app/admin/design/components/structure/structure.component.html index 5555ecd7..e05070ba 100644 --- a/frontend/src/app/admin/design/components/structure/structure.component.html +++ b/frontend/src/app/admin/design/components/structure/structure.component.html @@ -1,57 +1,85 @@
-
-
-
-
- - - -
-
-
-
-
- - - - - - - - - {{ this.grid[i].componentConfigs.title}} - - {{ word(item.component)}} - - - - - - - - -
- {{ icon(item.component) }} -
-
- -
+
+
+
+
+ + +
+
+
+
+
+ + + + + + + {{ this.grid[i].componentConfigs.title }} - + {{ word(item.component) }} + + + + -
+ +
+ {{ icon(item.component) }}
- -
+ + +
+
+
diff --git a/frontend/src/app/admin/design/components/structure/structure.component.scss b/frontend/src/app/admin/design/components/structure/structure.component.scss index afca4b63..16725126 100644 --- a/frontend/src/app/admin/design/components/structure/structure.component.scss +++ b/frontend/src/app/admin/design/components/structure/structure.component.scss @@ -1,16 +1,16 @@ -mat-card-content > div{ - text-align: center; +mat-card-content > div { + text-align: center; } -mat-card-title{ - width: 100%; - text-align: left; +mat-card-title { + width: 100%; + text-align: left; } -mat-card-content{ - mat-icon{ - font-size: 80px; - height: 80px; - width: 80px; - } +mat-card-content { + mat-icon { + font-size: 80px; + height: 80px; + width: 80px; + } } diff --git a/frontend/src/app/admin/design/components/structure/structure.component.ts b/frontend/src/app/admin/design/components/structure/structure.component.ts index 5ed0a8a4..041917b3 100644 --- a/frontend/src/app/admin/design/components/structure/structure.component.ts +++ b/frontend/src/app/admin/design/components/structure/structure.component.ts @@ -129,15 +129,6 @@ export class StructureComponent implements OnInit { }, ], ]; - - if (value === 'PieComponent') { - this.form_data.push({ - name: 'inner_size', - label: 'Inner size', - type: 'number', - required: true, - }); - } break; case 'MainListComponent': @@ -219,6 +210,66 @@ export class StructureComponent implements OnInit { ]; break; } + + if (value === 'PieComponent') { + this.form_data.push({ + name: 'inner_size', + label: 'Inner size', + type: 'number', + required: true, + }); + this.form_data.push({ + name: 'data_labels', + label: 'Show data labels', + type: 'checkbox', + required: false, + }); + this.form_data.push({ + name: 'data_labels_count', + label: 'Show data labels count', + type: 'checkbox', + required: false, + }); + this.form_data.push({ + name: 'data_labels_percentage', + label: 'Show data labels percentage', + type: 'checkbox', + required: false, + }); + } else if (value === 'MapComponent') { + this.form_data.push({ + name: 'data_labels', + label: 'Show data labels', + type: 'checkbox', + required: false, + }); + this.form_data.push({ + name: 'data_labels_count', + label: 'Show data labels count', + type: 'checkbox', + required: false, + }); + } else if (value === 'BarComponent') { + this.form_data.push({ + name: 'data_labels_count', + label: 'Show data labels count', + type: 'checkbox', + required: false, + }); + } else if (value === 'ListComponent') { + this.form_data.push({ + name: 'hide_total', + label: 'Hide total', + type: 'checkbox', + required: false, + }); + this.form_data.push({ + name: 'hide_percentage', + label: 'Hide percentage', + type: 'checkbox', + required: false, + }); + } } constructor( public dialog: MatDialog, diff --git a/frontend/src/app/admin/design/design.component.html b/frontend/src/app/admin/design/design.component.html index 6b043e56..c69d7d71 100644 --- a/frontend/src/app/admin/design/design.component.html +++ b/frontend/src/app/admin/design/design.component.html @@ -1,110 +1,186 @@
-
- - - Explorer Layout - {{dashboard_name}} - - Export - cloud_download - - - - - - -
+
+ + + Explorer Layout - {{ dashboard_name }} + + Export + cloud_download + + + + + + +
-
+
+
+ +
+
+
+
Default operator within filters
+ + Default operator within filters + + Follow the selected operator + Always use OR + + +
+
+ +
+ +
+
+
- -
-
-
- -
- +
+
+
+
+
-
-
-
-
-
-
-
- -
- -
- -
-
-
-
-
-
- -
- -
- -
-
- -
-
- +
-
+
+
-
Predefined filters
- - Predefined filters - - +
+
+ +
+ +
+
+ +
+
+
Predefined filters
+ + Predefined filters + + +
+
+
diff --git a/frontend/src/app/admin/design/design.component.ts b/frontend/src/app/admin/design/design.component.ts index 4e2b5e8f..1eebb586 100644 --- a/frontend/src/app/admin/design/design.component.ts +++ b/frontend/src/app/admin/design/design.component.ts @@ -36,6 +36,7 @@ export class DesignComponent implements OnInit { dashboard: Array = []; dashboard_name: string; exportLink: string; + defaultWithinFiltersOperator: any = null; predefinedFilters: any = null; predefinedFiltersExample = JSON.stringify([ { terms: { FIELD_NAME: ['VALUE'] } }, @@ -82,8 +83,15 @@ export class DesignComponent implements OnInit { await this.spinner.show(); const dashboard_name = (this.dashboard_name = this.activeRoute.snapshot.paramMap.get('dashboard_name')); - const { counters, filters, dashboard, footer, predefinedFilters, welcome } = - await this.settingsService.readExplorerSettings(dashboard_name); + const { + counters, + filters, + dashboard, + footer, + predefinedFilters, + defaultWithinFiltersOperator, + welcome, + } = await this.settingsService.readExplorerSettings(dashboard_name); if (welcome.componentConfigs && welcome.componentConfigs.text) this.welcome_text = welcome.componentConfigs.text; if (!this.welcome) @@ -101,7 +109,10 @@ export class DesignComponent implements OnInit { this.filters = filters; this.dashboard = dashboard; this.footer = footer; - this.predefinedFilters = JSON.stringify(predefinedFilters); + this.defaultWithinFiltersOperator = defaultWithinFiltersOperator; + this.predefinedFilters = predefinedFilters + ? JSON.stringify(predefinedFilters) + : ''; this.welcome = welcome; this.exportLink = 'data:text/json;charset=UTF-8,' + @@ -112,6 +123,7 @@ export class DesignComponent implements OnInit { filters: this.filters, dashboard: this.dashboard, footer: this.footer, + defaultWithinFiltersOperator: defaultWithinFiltersOperator, predefinedFilters: predefinedFilters, }), ); @@ -119,8 +131,15 @@ export class DesignComponent implements OnInit { } populateForm(settings) { - const { counters, filters, dashboard, footer, predefinedFilters, welcome } = - settings; + const { + counters, + filters, + dashboard, + footer, + predefinedFilters, + defaultWithinFiltersOperator, + welcome, + } = settings; if (welcome.componentConfigs && welcome.componentConfigs.text) this.welcome_text = welcome.componentConfigs.text; if (!this.welcome) @@ -138,7 +157,10 @@ export class DesignComponent implements OnInit { this.filters = filters; this.dashboard = dashboard; this.footer = footer; - this.predefinedFilters = JSON.stringify(predefinedFilters); + this.defaultWithinFiltersOperator = defaultWithinFiltersOperator; + this.predefinedFilters = predefinedFilters + ? JSON.stringify(predefinedFilters) + : ''; this.welcome = welcome; this.exportLink = 'data:text/json;charset=UTF-8,' + @@ -149,6 +171,7 @@ export class DesignComponent implements OnInit { filters: this.filters, dashboard: this.dashboard, footer: this.footer, + defaultWithinFiltersOperator: defaultWithinFiltersOperator, predefinedFilters: predefinedFilters, }), ); @@ -280,6 +303,7 @@ export class DesignComponent implements OnInit { filters: this.filters, dashboard: this.dashboard, footer: this.footer, + defaultWithinFiltersOperator: this.defaultWithinFiltersOperator, predefinedFilters: predefinedFilters, }; await this.settingsService.saveExplorerSettings(dashboard_name, data); @@ -311,6 +335,18 @@ export class DesignComponent implements OnInit { if (obj.inner_size) temp['inner_size'] = obj.inner_size; + if (obj.data_labels) temp['data_labels'] = obj.data_labels; + + if (obj.data_labels_count) + temp['data_labels_count'] = obj.data_labels_count; + + if (obj.data_labels_percentage) + temp['data_labels_percentage'] = obj.data_labels_percentage; + + if (obj.hide_total) temp['hide_total'] = obj.hide_total; + + if (obj.hide_percentage) temp['hide_percentage'] = obj.hide_percentage; + if (obj.source_x && obj.source_y) { temp['source'] = [obj.source_x, obj.source_y + '.keyword']; temp['source_y'] = obj.source_y; @@ -427,6 +463,7 @@ export class DesignComponent implements OnInit { filters: importedItem?.filters, dashboard: importedItem?.dashboard, footer: importedItem?.footer, + defaultWithinFiltersOperator: importedItem?.defaultWithinFiltersOperator, predefinedFilters: importedItem?.predefinedFilters, welcome: importedItem?.welcome, }; diff --git a/frontend/src/app/admin/indexes-dashboard/form/form.component.html b/frontend/src/app/admin/indexes-dashboard/form/form.component.html index aad99d2c..6c0f64ea 100644 --- a/frontend/src/app/admin/indexes-dashboard/form/form.component.html +++ b/frontend/src/app/admin/indexes-dashboard/form/form.component.html @@ -1,37 +1,74 @@

{{ data.event }} Dashboard

-
- -
-

- - - Name is required - Name can not contain space. - Name can not contain lowercase. - -

-

- - Select Index - - - {{index.name}} - - - -

-

- - - -

-
-
- - -
+ + +
+

+ + + Name is required + Name can not contain space. + Name can not contain lowercase. + +

+

+ + Select Index + + + {{ index.name }} + + + +

+

+ + + +

+
+
+ + +
diff --git a/frontend/src/app/admin/indexes-dashboard/form/form.component.scss b/frontend/src/app/admin/indexes-dashboard/form/form.component.scss index 16f8d011..b4b4e04e 100644 --- a/frontend/src/app/admin/indexes-dashboard/form/form.component.scss +++ b/frontend/src/app/admin/indexes-dashboard/form/form.component.scss @@ -1,7 +1,7 @@ .w-100 { - width: 100% !important; + width: 100% !important; } ::ng-deep .mat-mdc-form-field-appearance-fill .mat-mdc-form-field-flex { - background-color: unset; - padding: 0; + background-color: unset; + padding: 0; } diff --git a/frontend/src/app/admin/indexes-dashboard/indexes-dashboard.component.html b/frontend/src/app/admin/indexes-dashboard/indexes-dashboard.component.html index 7905e778..bb4e898f 100644 --- a/frontend/src/app/admin/indexes-dashboard/indexes-dashboard.component.html +++ b/frontend/src/app/admin/indexes-dashboard/indexes-dashboard.component.html @@ -3,17 +3,43 @@ Dashboards - + Export - cloud_download + cloud_download - - - @@ -65,10 +91,18 @@ Is Default - done_outline + done_outline @@ -82,9 +116,7 @@ color="primary" mat-icon-button > - delete + delete
diff --git a/frontend/src/app/admin/indexes-dashboard/indexes-dashboard.component.scss b/frontend/src/app/admin/indexes-dashboard/indexes-dashboard.component.scss index 983420b3..c3a4c456 100644 --- a/frontend/src/app/admin/indexes-dashboard/indexes-dashboard.component.scss +++ b/frontend/src/app/admin/indexes-dashboard/indexes-dashboard.component.scss @@ -8,7 +8,7 @@ } .dashboard-default-icon.is_default { - color: #51A351; + color: #51a351; } .dashboard-default-icon:hover { color: #5090d0; diff --git a/frontend/src/app/admin/indexes/form/form.component.html b/frontend/src/app/admin/indexes/form/form.component.html index 37c584a9..4b325d64 100644 --- a/frontend/src/app/admin/indexes/form/form.component.html +++ b/frontend/src/app/admin/indexes/form/form.component.html @@ -2,80 +2,131 @@

{{ data.event }} Index

- -
-

- - - Name is required - Name can not contain space. - Name can not contain lowercase. - -

-

- Enable Indexing -

-

- Auto harvest -

-

- - Auto harvest will only trigger the harvester and will not trigger plugins. - -

-

- - Interval - - Daily - Weekly - Monthly - Yearly - - -

-

- - Month - - {{month.value}} - - - - Day - - {{monthDay}} - - - - Day - - {{weekDay.value}} - - - - Hour - - {{hour}} - - - - Minute - - {{minute}} - - -

-

- - - -

-
-
- - -
+ +
+

+ + + Name is required + Name can not contain space. + Name can not contain lowercase. + +

+

+ Enable Indexing +

+

+ Auto harvest +

+

+ + Auto harvest will only trigger the harvester and will not trigger + plugins. + +

+

+ + Interval + + Daily + Weekly + Monthly + Yearly + + +

+

+ + Month + + {{ + month.value + }} + + + + Day + + {{ + monthDay + }} + + + + Day + + {{ + weekDay.value + }} + + + + Hour + + {{ + hour + }} + + + + Minute + + {{ + minute + }} + + +

+

+ + + +

+
+
+ + +
diff --git a/frontend/src/app/admin/indexes/form/form.component.scss b/frontend/src/app/admin/indexes/form/form.component.scss index a1dc0642..b6b7b999 100644 --- a/frontend/src/app/admin/indexes/form/form.component.scss +++ b/frontend/src/app/admin/indexes/form/form.component.scss @@ -1,8 +1,8 @@ .w-100 { - width: 100% !important; + width: 100% !important; } .border { - border: 1px solid #f00; + border: 1px solid #f00; } .interval-settings { @@ -11,5 +11,5 @@ } .interval-settings mat-form-field:not(:first-child) { - padding-left: .5rem; + padding-left: 0.5rem; } diff --git a/frontend/src/app/admin/indexes/indexes.component.html b/frontend/src/app/admin/indexes/indexes.component.html index b2d4a4ec..205a9111 100644 --- a/frontend/src/app/admin/indexes/indexes.component.html +++ b/frontend/src/app/admin/indexes/indexes.component.html @@ -3,17 +3,43 @@ Indexes - - Export - cloud_download + + Export + cloud_download - - - @@ -25,73 +51,109 @@
- - +
- - + + - - + + - - + + - - + + - - + + - + - +
ID. {{element.id.substr(0,2)}} ID. + {{ element.id.substr(0, 2) }} + Name {{element.name}} Name{{ element.name }} Description {{element.description}} Description{{ element.description }} Created At {{element.created_at}} Created At{{ element.created_at }} Last Updated At {{element.last_update}} Last Updated At{{ element.last_update }} Actions Actions - - - - dashboard + + dashboard - - all_inbox + + all_inbox - - account_tree + + account_tree - - find_replace + + find_replace
- +
diff --git a/frontend/src/app/admin/login/login.component.html b/frontend/src/app/admin/login/login.component.html index 0495924f..788ce009 100644 --- a/frontend/src/app/admin/login/login.component.html +++ b/frontend/src/app/admin/login/login.component.html @@ -1,29 +1,40 @@ - Login - -
-

- - Email - - -

+ Login + + +

+ + Email + + +

-

- - Password - - -

+

+ + Password + + +

-

- {{ error }} -

+

+ {{ error }} +

-
- -
- - -
+
+ +
+ +
diff --git a/frontend/src/app/admin/login/login.component.scss b/frontend/src/app/admin/login/login.component.scss index fd8c4afa..4e378270 100644 --- a/frontend/src/app/admin/login/login.component.scss +++ b/frontend/src/app/admin/login/login.component.scss @@ -1,28 +1,28 @@ :host { - display: flex; - justify-content: center; - margin: 100px 0px; - } + display: flex; + justify-content: center; + margin: 100px 0px; +} - .mat-mdc-form-field { - width: 100%; - min-width: 300px; - } +.mat-mdc-form-field { + width: 100%; + min-width: 300px; +} - mat-card-title, - mat-card-content { - display: flex; - justify-content: center; - } +mat-card-title, +mat-card-content { + display: flex; + justify-content: center; +} - .error { - padding: 16px; - width: 300px; - color: white; - background-color: red; - } +.error { + padding: 16px; + width: 300px; + color: white; + background-color: red; +} - .button { - display: flex; - justify-content: flex-end; - } \ No newline at end of file +.button { + display: flex; + justify-content: flex-end; +} diff --git a/frontend/src/app/admin/plugins/plugin/plugin.component.html b/frontend/src/app/admin/plugins/plugin/plugin.component.html index c50eae1e..78f326b4 100644 --- a/frontend/src/app/admin/plugins/plugin/plugin.component.html +++ b/frontend/src/app/admin/plugins/plugin/plugin.component.html @@ -1,91 +1,148 @@ - - {{plugin.display_name}} - Active - - - {{plugin.description}} - - -
-
-
Settings
- -
-
- -
-
- -
-
-
- - -

- - {{control.label}} - - -

-

- - {{control.label}} - - -

-

- - - {{item.name}} - {{item.name}} - - - {{item.name}} - {{item.name}} - - -

-

- - - -

-

- {{control.label}} - -

-
-
- -
-
-
-
-
-
- -
+ + {{ plugin.display_name }} + Active + + + {{ plugin.description }} + + +
+
+
Settings
+
+
+ +
+
+ +
+
+ + +

+ + {{ control.label }} + + +

+

+ + {{ control.label }} + + +

+

+ + + {{ + item.name + }} + {{ item.name }} + + + {{ + item.name + }} + {{ item.name }} + + +

+

+ + +

+

+ {{ control.label }} + +

+
+
+
- - +
+
+
+
+
+
-
- +
+ +
+
+ diff --git a/frontend/src/app/admin/plugins/plugin/plugin.component.scss b/frontend/src/app/admin/plugins/plugin/plugin.component.scss index 05622044..c7acb4bf 100644 --- a/frontend/src/app/admin/plugins/plugin/plugin.component.scss +++ b/frontend/src/app/admin/plugins/plugin/plugin.component.scss @@ -1,3 +1,3 @@ -mat-form-field{ - width: 100%; -} \ No newline at end of file +mat-form-field { + width: 100%; +} diff --git a/frontend/src/app/admin/plugins/plugins.component.html b/frontend/src/app/admin/plugins/plugins.component.html index 1aaad9cc..e2b87ca0 100644 --- a/frontend/src/app/admin/plugins/plugins.component.html +++ b/frontend/src/app/admin/plugins/plugins.component.html @@ -1,31 +1,58 @@
-
- - - Plugins - - Export - cloud_download - - - - - - - - - -
+
+ + + Plugins + + Export + cloud_download + + + + + + + +
-
- -
+
+ +
diff --git a/frontend/src/app/admin/plugins/plugins.component.scss b/frontend/src/app/admin/plugins/plugins.component.scss index 122081cf..29eccd19 100644 --- a/frontend/src/app/admin/plugins/plugins.component.scss +++ b/frontend/src/app/admin/plugins/plugins.component.scss @@ -1,4 +1,3 @@ - - .save { - float: right; - } \ No newline at end of file +.save { + float: right; +} diff --git a/frontend/src/app/admin/reporting/dialog/dialog.component.html b/frontend/src/app/admin/reporting/dialog/dialog.component.html index 1b8f9245..ec3d8d5d 100644 --- a/frontend/src/app/admin/reporting/dialog/dialog.component.html +++ b/frontend/src/app/admin/reporting/dialog/dialog.component.html @@ -2,10 +2,15 @@

Confirmation

- Are you sure you want to delete"{{data.reportData.title}}" Report + Are you sure you want to delete"{{ data.reportData.title }}" + Report

-

All information associated with this report will be permanently deleted.

+

+ All information associated with this report will be permanently deleted. +

diff --git a/frontend/src/app/admin/reporting/doc/doc.component.html b/frontend/src/app/admin/reporting/doc/doc.component.html index df717d06..1b4959a6 100644 --- a/frontend/src/app/admin/reporting/doc/doc.component.html +++ b/frontend/src/app/admin/reporting/doc/doc.component.html @@ -1,54 +1,71 @@

here are some samples of how to use metadata

-
    -
  • -
    -

    {{'{'}}items{{'}'}}

    -

    {{'{'}}citation{{'}'}}

    -

    https://hdl.handle.net/ {{'{'}}handle{{'}'}}

    -

    {{'{'}}DOI{{'}'}}

    -

    {{ '{' }}/items{{'}'}}

    +
      +
    • +
      +

      {{ '{' }}items{{ '}' }}

      +

      {{ '{' }}citation{{ '}' }}

      +

      https://hdl.handle.net/ {{ '{' }}handle{{ '}' }}

      +

      {{ '{' }}DOI{{ '}' }}

      +

      {{ '{' }}/items{{ '}' }}

      +
      +
    • +
    • +

      + Vipham, J.L., Amenu, K., Alonso, S., Ndahetuye, J.-B., Zereyesus, Y., + Nishimwe, K., Bowers, E., Maier, D., Sah, K., Havelaar, A. and Grace, D. + 2020. No food security without food safety: Lessons from livestock + related research. Global Food Security 26: 100382. +

      +

      https://hdl.handle.net/10568/108690

      +

      https://doi.org/10.1016/j.gfs.2020.100382

      +
      +

      + Colverson, K.E., Coble-Harris, L., Galiè, A., Moore, E.V., Munoz, O., + McKune, S.L., Singh, N. and Mo, R. 2020. Evolution of a gender tool: + WEAI, WELI and livestock research. Global Food Security 26: 100375 +

      +

      https://hdl.handle.net/10568/108249

      +

      https://doi.org/10.1016/j.gfs.2020.100375

      +
    • +
    +

    + here you can see that if you included this inside your Docx file you'll get + that result: +

    +

    - {{ '{' }}#items{{ '}' }}{{ '{' }}/items{{ '}' }} looped inside items

    +

    + - the ID is: {{ '{' }}id{{ '}' }} showed the value of id for each + publication..same for the title +

    +

    - with the same formatting style you used in the original Docx file

    +
    -
    -
  • -
  • -

    Vipham, J.L., Amenu, K., Alonso, S., Ndahetuye, J.-B., Zereyesus, Y., Nishimwe, K., Bowers, E., Maier, - D., Sah, K., Havelaar, A. and Grace, D. 2020. No food security without food safety: Lessons from - livestock related research. Global Food Security 26: 100382.

    -

    https://hdl.handle.net/10568/108690

    -

    https://doi.org/10.1016/j.gfs.2020.100382

    -
    -

    Colverson, K.E., Coble-Harris, L., Galiè, A., Moore, E.V., Munoz, O., McKune, S.L., Singh, N. and Mo, R. - 2020. Evolution of a gender tool: WEAI, WELI and livestock research. Global Food Security 26: 100375

    -

    https://hdl.handle.net/10568/108249

    -

    https://doi.org/10.1016/j.gfs.2020.100375

    -
  • -
-

here you can see that if you included this inside your Docx file you'll get that result:

-

- {{'{'}}#items{{'}'}}{{ '{' }}/items{{'}'}} looped inside items

-

- the ID is: {{ '{' }}id{{'}'}} showed the value of id for each publication..same for the title

-

- with the same formatting style you used in the original Docx file

-
+
    +
  • +
    +

    {{ '{' }}items{{ '}' }}

    +

    + {{ '{' }}status{{ '}' }} || {{ '{' }}type{{ '}' }} || {{ '{' }}date{{ + '}' + }} + || {{ '{' }}handle{{ '}' }} +

    +

    {{ '{' }}/items{{ '}' }}

    +
    +
  • -
      -
    • -
      -

      {{'{'}}items{{'}'}}

      -

      {{'{'}}status{{'}'}} || {{'{'}}type{{'}'}} || {{'{'}}date{{'}'}} || {{ '{' }}handle{{'}'}}

      -

      {{ '{'}}/items{{'}'}}

      -
      -
    • -

      Open access || item || 1998-04-28 || 20.500.11766/8792

      +
    • +

      Open access || item || 1998-04-28 || 20.500.11766/8792

      -

      Open access || item || 2010-11-28 || 20.500.11766/8782

      +

      Open access || item || 2010-11-28 || 20.500.11766/8782

      -

      Limited access || item || 2016-12-31 || 20.500.11766/6229

      +

      Limited access || item || 2016-12-31 || 20.500.11766/6229

      -

      Limited access || item || 2006-04-24 || 20.500.11766/7793

      +

      Limited access || item || 2006-04-24 || 20.500.11766/7793

      -

      Open access || item || 2018-06-08 || 20.500.11766/8617

      -
    • - -
    -
    -
\ No newline at end of file +

Open access || item || 2018-06-08 || 20.500.11766/8617

+ + +
+
diff --git a/frontend/src/app/admin/reporting/doc/doc.component.scss b/frontend/src/app/admin/reporting/doc/doc.component.scss index 8d6051dc..3cce75ed 100644 --- a/frontend/src/app/admin/reporting/doc/doc.component.scss +++ b/frontend/src/app/admin/reporting/doc/doc.component.scss @@ -1,34 +1,34 @@ span { - content: "\27F6"; - } - ul { - display: flex; - list-style: none; - } - li { - padding: 10px 25px; - border: 1px solid black; - margin: 0 25px; - position: relative; - } - li:not(:last-child):after { - content: ''; - height: 1px; - background: black; - width: 50px; - position: absolute; - right: -50px; - top: 50%; - } - li:not(:last-child):before { - content: ''; - position: absolute; - width: 0; - height: 0; - top: 50%; - border-style: solid; - border-width: 7px 0 7px 20px; - border-color: transparent transparent transparent black; - right: -50px; - transform: translateY(-50%); - } \ No newline at end of file + content: '\27F6'; +} +ul { + display: flex; + list-style: none; +} +li { + padding: 10px 25px; + border: 1px solid black; + margin: 0 25px; + position: relative; +} +li:not(:last-child):after { + content: ''; + height: 1px; + background: black; + width: 50px; + position: absolute; + right: -50px; + top: 50%; +} +li:not(:last-child):before { + content: ''; + position: absolute; + width: 0; + height: 0; + top: 50%; + border-style: solid; + border-width: 7px 0 7px 20px; + border-color: transparent transparent transparent black; + right: -50px; + transform: translateY(-50%); +} diff --git a/frontend/src/app/admin/reporting/reporting.component.html b/frontend/src/app/admin/reporting/reporting.component.html index 9ee77730..4e04adef 100644 --- a/frontend/src/app/admin/reporting/reporting.component.html +++ b/frontend/src/app/admin/reporting/reporting.component.html @@ -2,31 +2,75 @@
- Reports - {{dashboard_name}} - + Reports - {{ dashboard_name }} + Export - cloud_download + cloud_download - - - - - - + + - @@ -54,14 +98,28 @@ Actions - - - - + @@ -73,7 +131,10 @@ - +
diff --git a/frontend/src/app/admin/reporting/reproting-form/reproting-form.component.html b/frontend/src/app/admin/reporting/reproting-form/reproting-form.component.html index 874a7db5..74e952be 100644 --- a/frontend/src/app/admin/reporting/reproting-form/reproting-form.component.html +++ b/frontend/src/app/admin/reporting/reproting-form/reproting-form.component.html @@ -1,64 +1,115 @@

Report

-
- - Title - - + + + Title + + -
- - File Type - - {{type.label}} - - - -
- - File - - -
- - -
-
-
-
-
-
- - -
- - Data Source Label - - - - - - -
- -
-
- Add Data source +
+ + File Type + + {{ type.label }} + + +
+ File + + +
+ + +
+
+ +
+
+
+ + +
+ + Data Source Label + + + + + + +
+ +
+ + Add Data source +
- - - + +
diff --git a/frontend/src/app/admin/reporting/reproting-form/reproting-form.component.scss b/frontend/src/app/admin/reporting/reproting-form/reproting-form.component.scss index 7ba5a4cc..c92cfcb8 100644 --- a/frontend/src/app/admin/reporting/reproting-form/reproting-form.component.scss +++ b/frontend/src/app/admin/reporting/reproting-form/reproting-form.component.scss @@ -1,3 +1,3 @@ -.content{ - max-height: 400px; -} \ No newline at end of file +.content { + max-height: 400px; +} diff --git a/frontend/src/app/admin/root/root.component.html b/frontend/src/app/admin/root/root.component.html index 5a53eb9c..dde9bd95 100644 --- a/frontend/src/app/admin/root/root.component.html +++ b/frontend/src/app/admin/root/root.component.html @@ -2,56 +2,101 @@

OpenRXV

-
+
-
+ Indexes - + Harvest dashboard - + Repositories - + Plugins - + Value Mappings - + Dashboards - + Appearance - + Design dashboard layout - + Reporting - + Shared links View Dashboard - + Users diff --git a/frontend/src/app/admin/root/root.component.scss b/frontend/src/app/admin/root/root.component.scss index f55337ef..231ccf2d 100644 --- a/frontend/src/app/admin/root/root.component.scss +++ b/frontend/src/app/admin/root/root.component.scss @@ -1,4 +1,4 @@ -@import "../../explorer/configs/customTheme.scss"; +@import '../../explorer/configs/customTheme.scss'; .container-admin { width: 100%; } @@ -28,11 +28,11 @@ mat-drawer { text-shadow: 0 0 5px #fff; } -img{ +img { max-height: 49px !important; } -mat-toolbar{ +mat-toolbar { margin-top: 2px !important; } diff --git a/frontend/src/app/components/notfound/notfound.component.html b/frontend/src/app/components/notfound/notfound.component.html index af18d13b..9902778f 100644 --- a/frontend/src/app/components/notfound/notfound.component.html +++ b/frontend/src/app/components/notfound/notfound.component.html @@ -1,11 +1,11 @@
-
-
-
- 404 -
The page you are looking for was not found.
- Back to Home -
-
+
+
+
+ 404 +
The page you are looking for was not found.
+ Back to Home +
-
\ No newline at end of file +
+
diff --git a/frontend/src/app/components/notfound/notfound.component.scss b/frontend/src/app/components/notfound/notfound.component.scss index ab8472d9..b60a5292 100644 --- a/frontend/src/app/components/notfound/notfound.component.scss +++ b/frontend/src/app/components/notfound/notfound.component.scss @@ -1,10 +1,10 @@ body { - background: #dedede; + background: #dedede; } .page-wrap { - min-height: 100vh; + min-height: 100vh; } -.display-1{ - font-size: 200px; -} \ No newline at end of file +.display-1 { + font-size: 200px; +} diff --git a/frontend/src/app/explorer/configs/colorsMap.scss b/frontend/src/app/explorer/configs/colorsMap.scss index 291c8065..8c76145d 100644 --- a/frontend/src/app/explorer/configs/colorsMap.scss +++ b/frontend/src/app/explorer/configs/colorsMap.scss @@ -1,20 +1,20 @@ // when you type `` it will apply 500 // for material theme $customTheme: ( - 50 : var(--theme-primary-50), - 100 : var(--theme-primary-100), - 200 : var(--theme-primary-200), - 300 : var(--theme-primary-300), - 400 : var(--theme-primary-400), - 500 : var(--theme-primary-500), - 600 : var(--theme-primary-600), - 700 : var(--theme-primary-700), - 800 : var(--theme-primary-800), - 900 : var(--theme-primary-900), - A100 : var(--theme-primary-A100), - A200 : var(--theme-primary-A200), - A400 : var(--theme-primary-A400), - A700 : var(--theme-primary-A700), + 50: var(--theme-primary-50), + 100: var(--theme-primary-100), + 200: var(--theme-primary-200), + 300: var(--theme-primary-300), + 400: var(--theme-primary-400), + 500: var(--theme-primary-500), + 600: var(--theme-primary-600), + 700: var(--theme-primary-700), + 800: var(--theme-primary-800), + 900: var(--theme-primary-900), + A100: var(--theme-primary-A100), + A200: var(--theme-primary-A200), + A400: var(--theme-primary-A400), + A700: var(--theme-primary-A700), contrast: ( 50: var(--theme-primary-contrast-50), 100: var(--theme-primary-contrast-100), @@ -30,7 +30,7 @@ $customTheme: ( A200: var(--theme-primary-contrast-A200), A400: var(--theme-primary-contrast-A400), A700: var(--theme-primary-contrast-A700), - ) + ), ); // $customTheme: ( diff --git a/frontend/src/app/explorer/configs/customTheme.scss b/frontend/src/app/explorer/configs/customTheme.scss index 1742caf7..40872a5b 100644 --- a/frontend/src/app/explorer/configs/customTheme.scss +++ b/frontend/src/app/explorer/configs/customTheme.scss @@ -32,8 +32,8 @@ height: 100%; position: absolute; background-color: var(--theme-primary-500); - opacity: .2; - transition: background-color .25s ease-in; + opacity: 0.2; + transition: background-color 0.25s ease-in; } .border-top-light { @@ -96,7 +96,11 @@ $plant-primary: mat.define-palette($customTheme, 500); $plant-accent: mat.define-palette(mat.$pink-palette, A200, A100, A400); $plant-warn: mat.define-palette(mat.$red-palette); -$plant-theme: mat.define-light-theme($plant-primary, $plant-accent, $plant-warn); +$plant-theme: mat.define-light-theme( + $plant-primary, + $plant-accent, + $plant-warn +); @include mat.all-component-themes($plant-theme); diff --git a/frontend/src/app/explorer/configs/generalConfig.interface.ts b/frontend/src/app/explorer/configs/generalConfig.interface.ts index 2e95b6b4..8160dc62 100644 --- a/frontend/src/app/explorer/configs/generalConfig.interface.ts +++ b/frontend/src/app/explorer/configs/generalConfig.interface.ts @@ -57,6 +57,11 @@ export interface ComponentFilterConfigs { source: string; placeholder: string; expandPosition?: 'top' | 'bottom'; + data_labels?: boolean; + data_labels_count?: boolean; + data_labels_percentage?: boolean; + hide_total?: boolean; + hide_percentage?: boolean; } export interface SortOption { diff --git a/frontend/src/app/explorer/configs/tooltips.ts b/frontend/src/app/explorer/configs/tooltips.ts index 52093928..97a670e1 100644 --- a/frontend/src/app/explorer/configs/tooltips.ts +++ b/frontend/src/app/explorer/configs/tooltips.ts @@ -1,8 +1,8 @@ export const orAndToolTip = ` The operator "AND" will only show results that contain all of the details specified in the filters, without duplication. -It is recommended for very focused lists of Information Products. The +It is recommended for very focused lists of ##ITEMS_LABEL_PLACEHOLDER##. The operator "OR" will show all the results that contain at least one of the details specified in the filters, without duplication. -It is recommended for very inclusive lists of Information Products. +It is recommended for very inclusive lists of ##ITEMS_LABEL_PLACEHOLDER##. `; diff --git a/frontend/src/app/explorer/dashboard/components/bar/bar.component.html b/frontend/src/app/explorer/dashboard/components/bar/bar.component.html index 153bd830..29b378d1 100644 --- a/frontend/src/app/explorer/dashboard/components/bar/bar.component.html +++ b/frontend/src/app/explorer/dashboard/components/bar/bar.component.html @@ -1,13 +1,13 @@
- - -
\ No newline at end of file + + +
diff --git a/frontend/src/app/explorer/dashboard/components/bar/bar.component.ts b/frontend/src/app/explorer/dashboard/components/bar/bar.component.ts index 240488e2..5be3cf44 100644 --- a/frontend/src/app/explorer/dashboard/components/bar/bar.component.ts +++ b/frontend/src/app/explorer/dashboard/components/bar/bar.component.ts @@ -37,12 +37,14 @@ export class BarComponent extends ParentChart implements OnInit { super(cms, selectService, store, activatedRoute); } colors: string[]; + items_label = 'Information Products'; async ngOnInit() { const dashboard_name = this.activeRoute.snapshot.paramMap.get('dashboard_name'); const appearance = await this.settingsService.readAppearanceSettings(dashboard_name); this.colors = appearance.chartColors; + this.items_label = appearance.items_label; this.init('column'); this.buildOptions.subscribe((buckets: Array) => { if (buckets) { @@ -75,6 +77,12 @@ export class BarComponent extends ParentChart implements OnInit { }; }) .flat(1); + + const dataLabelsSettings = this.cms.getDataLabelAttributes( + this.componentConfigs, + 'bar', + ); + this.chartOptions = { chart: { type: 'column' }, xAxis: { categories, crosshair: true }, @@ -82,20 +90,32 @@ export class BarComponent extends ParentChart implements OnInit { enabled: true, useGPUTranslations: true, }, - yAxis: { min: 0, title: { text: 'Information Products' } }, + yAxis: { + min: 0, + title: { + text: this?.items_label ? this.items_label : 'Information Products', + }, + }, colors: this.colors, plotOptions: { column: { pointPadding: 0.2, borderWidth: 0, borderRadius: 2.5, + dataLabels: dataLabelsSettings, }, }, tooltip: { - headerFormat: '{point.key}', - pointFormat: - '', - footerFormat: '
{series.name}: {point.y}
', + formatter: function () { + let total = 0; + const points = this.points.map((point) => { + total += Number(point.y); + return `${point.series.name}: ${point.y}`; + }); + return `${this.x}: ${total}${points.join( + '', + )}
`; + }, shared: true, useHTML: true, }, diff --git a/frontend/src/app/explorer/dashboard/components/bar/rotated-lables/rotated-lables.component.html b/frontend/src/app/explorer/dashboard/components/bar/rotated-lables/rotated-lables.component.html index 284230df..d0d968e1 100644 --- a/frontend/src/app/explorer/dashboard/components/bar/rotated-lables/rotated-lables.component.html +++ b/frontend/src/app/explorer/dashboard/components/bar/rotated-lables/rotated-lables.component.html @@ -8,4 +8,4 @@ [chartOptions]="chartOptions" (expanded)="cms.disPatchSetInView($event)" > - \ No newline at end of file + diff --git a/frontend/src/app/explorer/dashboard/components/chart/chart.component.html b/frontend/src/app/explorer/dashboard/components/chart/chart.component.html index 610c4b1b..0da21ac2 100644 --- a/frontend/src/app/explorer/dashboard/components/chart/chart.component.html +++ b/frontend/src/app/explorer/dashboard/components/chart/chart.component.html @@ -1,12 +1,19 @@ - + {{ title }} - + error @@ -17,18 +24,39 @@
- + - + -
+
Click to enable
- + autorenew
@@ -37,4 +65,4 @@ - \ No newline at end of file + diff --git a/frontend/src/app/explorer/dashboard/components/counter/counter.component.html b/frontend/src/app/explorer/dashboard/components/counter/counter.component.html index f74dea3c..af2abc1e 100644 --- a/frontend/src/app/explorer/dashboard/components/counter/counter.component.html +++ b/frontend/src/app/explorer/dashboard/components/counter/counter.component.html @@ -8,16 +8,18 @@ > - {{ componentConfigs.icon }} + {{ + componentConfigs.icon + }} {{ componentConfigs.title }} {{ count | number }} - - / {{ percentage | number: '1.1-2' }} % - - + + / {{ percentage | number: '1.1-2' }} % + + diff --git a/frontend/src/app/explorer/dashboard/components/counter/counter.component.scss b/frontend/src/app/explorer/dashboard/components/counter/counter.component.scss index 7b551ced..81c90d89 100644 --- a/frontend/src/app/explorer/dashboard/components/counter/counter.component.scss +++ b/frontend/src/app/explorer/dashboard/components/counter/counter.component.scss @@ -1,4 +1,3 @@ - mat-card { cursor: pointer !important; height: 110px; diff --git a/frontend/src/app/explorer/dashboard/components/googlemaps/googlemaps.component.html b/frontend/src/app/explorer/dashboard/components/googlemaps/googlemaps.component.html index 2f7f9332..aa4f663c 100644 --- a/frontend/src/app/explorer/dashboard/components/googlemaps/googlemaps.component.html +++ b/frontend/src/app/explorer/dashboard/components/googlemaps/googlemaps.component.html @@ -64,7 +64,7 @@
- - -
\ No newline at end of file + + +
diff --git a/frontend/src/app/explorer/dashboard/components/list/export/export.component.html b/frontend/src/app/explorer/dashboard/components/list/export/export.component.html index 41faa457..38bc3e3c 100644 --- a/frontend/src/app/explorer/dashboard/components/list/export/export.component.html +++ b/frontend/src/app/explorer/dashboard/components/list/export/export.component.html @@ -11,37 +11,56 @@

- Please, note that very lengthy lists of information products will be exported in - more than one part to allow a quicker download. Would you like to continue? + Please, note that very lengthy lists of {{ items_label }} will be exported + in more than one part to allow a quicker download. Would you like to + continue? - - - - + + + - + }" + > Preparing {{ delegation.name }} - +
-
-
-
diff --git a/frontend/src/app/explorer/dashboard/components/list/export/export.component.ts b/frontend/src/app/explorer/dashboard/components/list/export/export.component.ts index 19e9a75a..efd4583f 100644 --- a/frontend/src/app/explorer/dashboard/components/list/export/export.component.ts +++ b/frontend/src/app/explorer/dashboard/components/list/export/export.component.ts @@ -5,7 +5,7 @@ import { ExportFilesModal, } from '../paginated-list/filter-paginated-list/types.interface'; import { ExportService } from '../services/export/export.service'; -import { switchMap, first, last } from 'rxjs/operators'; +import { switchMap, first } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { ElasticsearchQuery } from 'src/app/explorer/filters/services/interfaces'; import { environment } from 'src/environments/environment'; @@ -13,7 +13,6 @@ import { MatDialog } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; import { HttpErrorResponse } from '@angular/common/http'; import { SettingsService } from 'src/app/admin/services/settings.service'; -import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-export', templateUrl: './export.component.html', @@ -33,6 +32,7 @@ export class ExportComponent implements OnInit { exportPoint: string; part: number; webSiteName; + items_label = 'Information Products'; get finishedExporting(): boolean { if (!this.delegationArr) { return false; @@ -61,6 +61,7 @@ export class ExportComponent implements OnInit { this.dashboard, ); this.webSiteName = this.webSiteName.website_name; + this.items_label = this.webSiteName.items_label; } prevent(e, efm: ExportFilesModal): void { diff --git a/frontend/src/app/explorer/dashboard/components/list/list.component.html b/frontend/src/app/explorer/dashboard/components/list/list.component.html index 31a4cf22..548241e8 100644 --- a/frontend/src/app/explorer/dashboard/components/list/list.component.html +++ b/frontend/src/app/explorer/dashboard/components/list/list.component.html @@ -1,33 +1,65 @@ - -
+ +
Click to enable
- + autorenew
- + {{ componentConfigs.title }} - + error - + - + - + - +
diff --git a/frontend/src/app/explorer/dashboard/components/list/paginated-list/filter-paginated-list/filter-paginated-list.component.html b/frontend/src/app/explorer/dashboard/components/list/paginated-list/filter-paginated-list/filter-paginated-list.component.html index 1d49b233..2bc064b3 100644 --- a/frontend/src/app/explorer/dashboard/components/list/paginated-list/filter-paginated-list/filter-paginated-list.component.html +++ b/frontend/src/app/explorer/dashboard/components/list/paginated-list/filter-paginated-list/filter-paginated-list.component.html @@ -1,25 +1,45 @@
- +
- +
- -
-
-
\ No newline at end of file + diff --git a/frontend/src/app/explorer/dashboard/components/list/paginated-list/filter-paginated-list/filter-paginated-list.component.scss b/frontend/src/app/explorer/dashboard/components/list/paginated-list/filter-paginated-list/filter-paginated-list.component.scss index 27392c16..301b204c 100644 --- a/frontend/src/app/explorer/dashboard/components/list/paginated-list/filter-paginated-list/filter-paginated-list.component.scss +++ b/frontend/src/app/explorer/dashboard/components/list/paginated-list/filter-paginated-list/filter-paginated-list.component.scss @@ -12,6 +12,6 @@ img { top: 50%; transform: translateY(-50%); } -.files{ +.files { list-style: none; -} \ No newline at end of file +} diff --git a/frontend/src/app/explorer/dashboard/components/list/paginated-list/link-text/tags/tags.component.html b/frontend/src/app/explorer/dashboard/components/list/paginated-list/link-text/tags/tags.component.html index dfc90f46..299bb54f 100644 --- a/frontend/src/app/explorer/dashboard/components/list/paginated-list/link-text/tags/tags.component.html +++ b/frontend/src/app/explorer/dashboard/components/list/paginated-list/link-text/tags/tags.component.html @@ -1,4 +1,3 @@ - {{ label }}: {{ labelData }} diff --git a/frontend/src/app/explorer/dashboard/components/list/paginated-list/paginated-list.component.html b/frontend/src/app/explorer/dashboard/components/list/paginated-list/paginated-list.component.html index 22e459a3..9dce0090 100644 --- a/frontend/src/app/explorer/dashboard/components/list/paginated-list/paginated-list.component.html +++ b/frontend/src/app/explorer/dashboard/components/list/paginated-list/paginated-list.component.html @@ -4,12 +4,13 @@ [filterOptions]="content.filterOptions" > -
- +
- -
- + +
+ -
- - {{ item.key }} - - - ( {{ ((item.doc_count / totalItems) * 100).toFixed(2) }}% ) - - - - {{ item.doc_count | number }} - -
-
+
+ + {{ item.key === '' ? 'NA' : item.key }} + + + ( {{ ((item.doc_count / totalItems) * 100).toFixed(2) }}% ) + + + + {{ item.doc_count | number }} + +
+
+
-
- - - {{ ((item.doc_count / totalItems) * 100).toFixed(2) }}% - - + + + {{ ((item.doc_count / totalItems) * 100).toFixed(2) + }}% + +
diff --git a/frontend/src/app/explorer/dashboard/components/list/virtual-list/virtual-list.component.scss b/frontend/src/app/explorer/dashboard/components/list/virtual-list/virtual-list.component.scss index 03ffb709..6248d857 100644 --- a/frontend/src/app/explorer/dashboard/components/list/virtual-list/virtual-list.component.scss +++ b/frontend/src/app/explorer/dashboard/components/list/virtual-list/virtual-list.component.scss @@ -6,7 +6,7 @@ } } } -.listHover:hover{ +.listHover:hover { cursor: pointer; background-color: #e2eaf3; } @@ -16,8 +16,10 @@ .viewport { height: 404px; overflow-x: hidden !important; // firefox + .item { height: 50px; + .progress { height: 7px; display: flex; @@ -93,6 +95,19 @@ text-wrap: initial; } } + + .item.no-percentage { + border-bottom: solid 1px #e6e6e6; + + .item-list-row { + .doc-count { + color: var(--theme-primary-500); + right: 10px; + font-size: 100%; + font-weight: bold; + } + } + } } //.lists_counts-parent { diff --git a/frontend/src/app/explorer/dashboard/components/map/map.component.ts b/frontend/src/app/explorer/dashboard/components/map/map.component.ts index 8a4f785e..839beeb2 100644 --- a/frontend/src/app/explorer/dashboard/components/map/map.component.ts +++ b/frontend/src/app/explorer/dashboard/components/map/map.component.ts @@ -18,6 +18,7 @@ import { ComponentFilterConfigs } from 'src/app/explorer/configs/generalConfig.i import { ActivatedRoute } from '@angular/router'; import CountryISO from '@mohammad231/iso_3166-1'; import { Country } from '@mohammad231/iso_3166-1/iso_3166-1'; +import { SettingsService } from 'src/app/admin/services/settings.service'; @ComponentLookup('MapComponent') @Component({ selector: 'app-map', @@ -34,11 +35,19 @@ export class MapComponent extends ParentChart implements OnInit { public readonly store: Store, private readonly bodyBuilderService: BodyBuilderService, activatedRoute: ActivatedRoute, + private settingsService: SettingsService, ) { super(cms, selectService, store, activatedRoute); } filterd = false; - ngOnInit(): void { + items_label = 'Information Products'; + async ngOnInit() { + const dashboard_name = + this.activeRoute.snapshot.paramMap.get('dashboard_name'); + const appearance = + await this.settingsService.readAppearanceSettings(dashboard_name); + this.items_label = appearance.items_label; + this.init('map'); const { source } = this.componentConfigs as ComponentFilterConfigs; this.buildOptions.subscribe((buckets: Array) => { @@ -59,6 +68,11 @@ export class MapComponent extends ParentChart implements OnInit { this.resetQ(); } private setOptions(buckets: Array): Highcharts.Options { + const dataLabelsSettings = this.cms.getDataLabelAttributes( + this.componentConfigs, + 'map', + ); + return { chart: { map: mapWorld, @@ -107,9 +121,12 @@ export class MapComponent extends ParentChart implements OnInit { allowPointSelect: true, tooltip: { pointFormat: - '{point.name}: {point.value} Information Products
', + '{point.name}: {point.value} ' + + (this?.items_label ? this.items_label : 'Information Products') + + '
', headerFormat: undefined, }, + dataLabels: dataLabelsSettings, animation: { duration: 0, }, diff --git a/frontend/src/app/explorer/dashboard/components/pie/pie.component.ts b/frontend/src/app/explorer/dashboard/components/pie/pie.component.ts index e507820a..e8780f86 100644 --- a/frontend/src/app/explorer/dashboard/components/pie/pie.component.ts +++ b/frontend/src/app/explorer/dashboard/components/pie/pie.component.ts @@ -73,6 +73,12 @@ export class PieComponent extends ParentChart implements OnInit { ); }; commonProperties.legend.useHTML = true; + + const dataLabelsSettings = this.cms.getDataLabelAttributes( + this.componentConfigs, + 'pie', + ); + return { chart: { type: 'pie', @@ -91,9 +97,8 @@ export class PieComponent extends ParentChart implements OnInit { pointFormat: '{point.y}', headerFormat: '{point.key}:', }, - dataLabels: { - enabled: false, - }, + dataLabels: dataLabelsSettings, + size: dataLabelsSettings.enabled ? '75%' : '100%', }, series: { point: { diff --git a/frontend/src/app/explorer/dashboard/components/scroll-to/scroll-to.component.scss b/frontend/src/app/explorer/dashboard/components/scroll-to/scroll-to.component.scss index 209ef85c..268c84e7 100644 --- a/frontend/src/app/explorer/dashboard/components/scroll-to/scroll-to.component.scss +++ b/frontend/src/app/explorer/dashboard/components/scroll-to/scroll-to.component.scss @@ -1,5 +1,7 @@ button { - transition: box-shadow 0.35s ease-in, color 0.45s ease-in, + transition: + box-shadow 0.35s ease-in, + color 0.45s ease-in, background-color 0.35s ease-in; cursor: pointer; outline: none; @@ -27,7 +29,9 @@ button.active { ::ng-deep .in-tool-bar { button { - transition: box-shadow 0.35s ease-in, color 0.45s ease-in, + transition: + box-shadow 0.35s ease-in, + color 0.45s ease-in, background-color 0.35s ease-in; cursor: pointer; outline: none; diff --git a/frontend/src/app/explorer/dashboard/components/services/chart/chart-helper.class.ts b/frontend/src/app/explorer/dashboard/components/services/chart/chart-helper.class.ts index d6cbd20b..0f65aed8 100644 --- a/frontend/src/app/explorer/dashboard/components/services/chart/chart-helper.class.ts +++ b/frontend/src/app/explorer/dashboard/components/services/chart/chart-helper.class.ts @@ -1,4 +1,5 @@ import * as Highcharts from 'highcharts'; +import { ComponentFilterConfigs } from 'src/app/explorer/configs/generalConfig.interface'; export class ChartHelper { protected chartType: any; commonProperties(): Highcharts.Options { @@ -60,4 +61,102 @@ export class ChartHelper { } as Highcharts.ResponsiveRulesOptions, ]; } + + public getDataLabelAttributes( + componentConfigs: ComponentFilterConfigs, + chartType: string, + ): Highcharts.DataLabelsOptions { + if (chartType === 'pie') { + const dataLabelsSettings = { + enabled: false, + formatter: function () { + return this.key; + }, + padding: 0, + connectorPadding: 0, + distance: 15, + style: { + textOverflow: 'clip', + }, + }; + + const dataLabelsEnabled = componentConfigs?.data_labels; + const dataLabelsCountEnabled = componentConfigs?.data_labels_count; + const dataLabelsPercentageEnabled = + componentConfigs?.data_labels_percentage; + if ( + dataLabelsEnabled || + dataLabelsCountEnabled || + dataLabelsPercentageEnabled + ) { + dataLabelsSettings.enabled = true; + dataLabelsSettings.formatter = function () { + const label = []; + if (dataLabelsEnabled) { + label.push(this?.key ? this.key : 'NA'); + } + + let numbers = ''; + if (dataLabelsCountEnabled) { + numbers += + '' + + (this as any).y + + ''; + } + if (dataLabelsPercentageEnabled) { + numbers += ''; + numbers += dataLabelsCountEnabled ? ' (' : ''; + numbers += (this as any).percentage.toFixed(2) + '%'; + numbers += dataLabelsCountEnabled ? ')' : ''; + numbers += ''; + } + if (numbers !== '') { + label.push(numbers); + } + return label.join('
'); + }; + } + return dataLabelsSettings; + } else if (chartType === 'map') { + const dataLabelsSettings = { + enabled: false, + formatter: function () { + if (Number(this.point.value) > 0) return this.point.name; + else return ''; + }, + }; + + const dataLabelsEnabled = componentConfigs?.data_labels; + const dataLabelsCountEnabled = componentConfigs?.data_labels_count; + if (dataLabelsEnabled || dataLabelsCountEnabled) { + dataLabelsSettings.enabled = true; + dataLabelsSettings.formatter = function () { + const label = []; + if (Number(this.point.value) > 0) { + if (dataLabelsEnabled) { + label.push(this.point.name); + } + if (dataLabelsCountEnabled) { + label.push(this.point.value); + } + } + return label.join(': '); + }; + } + return dataLabelsSettings; + } else if (chartType === 'bar') { + return { + enabled: componentConfigs?.data_labels_count, + formatter: function () { + return (this as any).y; + }, + }; + } + + return { + enabled: false, + }; + } } diff --git a/frontend/src/app/explorer/dashboard/components/simi-circle/simi-circle.component.html b/frontend/src/app/explorer/dashboard/components/simi-circle/simi-circle.component.html index 284230df..d0d968e1 100644 --- a/frontend/src/app/explorer/dashboard/components/simi-circle/simi-circle.component.html +++ b/frontend/src/app/explorer/dashboard/components/simi-circle/simi-circle.component.html @@ -8,4 +8,4 @@ [chartOptions]="chartOptions" (expanded)="cms.disPatchSetInView($event)" > - \ No newline at end of file + diff --git a/frontend/src/app/explorer/dashboard/dashboard.component.html b/frontend/src/app/explorer/dashboard/dashboard.component.html index 8bdaaaa2..8fd87807 100644 --- a/frontend/src/app/explorer/dashboard/dashboard.component.html +++ b/frontend/src/app/explorer/dashboard/dashboard.component.html @@ -1,5 +1,4 @@ - @@ -7,7 +6,11 @@
-
+
-
+
diff --git a/frontend/src/app/explorer/explorer.component.html b/frontend/src/app/explorer/explorer.component.html index 13d0df02..dc62690c 100644 --- a/frontend/src/app/explorer/explorer.component.html +++ b/frontend/src/app/explorer/explorer.component.html @@ -58,14 +58,22 @@ + - + + + - @@ -128,7 +147,9 @@ }" class="flex-explorer" > - + Operator @@ -188,16 +211,11 @@ AND - - error - + error - +
{{ primaryColor }} +
diff --git a/frontend/src/app/explorer/explorer.component.scss b/frontend/src/app/explorer/explorer.component.scss index b43f3cd6..d1787579 100644 --- a/frontend/src/app/explorer/explorer.component.scss +++ b/frontend/src/app/explorer/explorer.component.scss @@ -81,3 +81,8 @@ button { .show_tool_bar.flex-explorer { padding-top: 75px !important; } + +.andOrOperatorButton { + padding-left: 5px; + padding-right: 5px; +} diff --git a/frontend/src/app/explorer/explorer.component.ts b/frontend/src/app/explorer/explorer.component.ts index f4fbeadb..3151aea8 100644 --- a/frontend/src/app/explorer/explorer.component.ts +++ b/frontend/src/app/explorer/explorer.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { MatDrawer } from '@angular/material/sidenav'; import * as fromStore from './store'; import { Store } from '@ngrx/store'; @@ -21,6 +21,10 @@ import { InViewState } from './store/reducers/items.reducer'; import { SetQuery } from './store'; import { FooterComponent } from './dashboard/components/footer/footer.component'; import { ActivatedRoute } from '@angular/router'; +import html2canvas from 'html2canvas'; +import jsPDF from 'jspdf'; +import { NgxSpinnerService } from 'ngx-spinner'; +import * as dayjs from 'dayjs'; @Component({ selector: 'explorer-root', @@ -29,6 +33,7 @@ import { ActivatedRoute } from '@angular/router'; }) export class ExplorerComponent implements OnInit { @ViewChild('drawer') sidenav: MatDrawer; + @ViewChild('sidenavContent', { read: ElementRef }) sidenavContent: ElementRef; loading$: Observable; render: boolean; shareID: string; @@ -40,7 +45,7 @@ export class ExplorerComponent implements OnInit { countersConfig = []; dashboardConfig = []; tourConfig = []; - readonly orAndToolTip: string; + orAndToolTip: string; private prevenetMouseOnNav: boolean; options: any = { bottom: 0, @@ -73,6 +78,7 @@ export class ExplorerComponent implements OnInit { private readonly itemsService: ItemsService, public dialog: MatDialog, private activeRoute: ActivatedRoute, + private spinner: NgxSpinnerService, ) { this.orOperator = false; this.orAndToolTip = orAndToolTip; @@ -134,6 +140,13 @@ export class ExplorerComponent implements OnInit { this.countersConfig = counters; this.dashboardConfig = dashboard.flat(1); this.tourConfig = [welcome]; + + const itemsLabel = appearance.items_label; + this.orAndToolTip = this.orAndToolTip.replaceAll( + '##ITEMS_LABEL_PLACEHOLDER##', + itemsLabel ? itemsLabel : 'Information Products', + ); + this.loading$ = this.store.select(fromStore.getLoadingStatus); } hexToHSL(H, term) { @@ -266,4 +279,78 @@ export class ExplorerComponent implements OnInit { this.render = true; } } + + async exportDashboard() { + this.spinner.show(); + const container = this.sidenavContent.nativeElement as HTMLElement; + const charts = document.querySelectorAll( + 'mat-sidenav-content > app-dashboard > mat-drawer-container > mat-drawer-content > section > section:last-child > div', + ); + + container.style.setProperty('scroll-behavior', 'smooth'); + if (charts.length > 0) { + await this.scrollAll(charts, 0, 'down'); + await this.promiseScroll(container, 'bottom'); + await this.scrollAll(charts, charts.length - 1, 'up'); + await this.promiseScroll(container, 'top'); + } + container.style.setProperty('height', container.scrollHeight + 'px'); + + html2canvas(container) + .then((canvas) => { + const imageData = canvas.toDataURL('image/png'); + const fileName = + this.website_name.replaceAll(/[^a-z0-9]/gi, '_') + + '_' + + dayjs().format('YYYY-MM-DD_HH:mm:ss') + + '.pdf'; + const imgWidth = 208; + const imgHeight = (canvas.height * imgWidth) / canvas.width; + const doc = new jsPDF('p', 'mm', [imgWidth, imgHeight], true); + doc.addImage(imageData, 'PNG', 0, 0, imgWidth, imgHeight, '', 'FAST'); + doc.save(fileName + '.pdf'); + container.style.removeProperty('height'); + container.style.removeProperty('scroll-behavior'); + this.spinner.hide(); + }) + .catch((e) => { + container.style.removeProperty('height'); + container.style.removeProperty('scroll-behavior'); + this.spinner.hide(); + }); + } + + async scrollAll( + elements: NodeListOf, + index: number, + direction: string, + ) { + await this.promiseScroll(elements[index] as HTMLElement, 'view'); + if (direction === 'up') { + index = index - 1; + if (index > 0) { + await this.scrollAll(elements, index, direction); + } + } else { + index = index + 1; + if (elements.length > index) { + await this.scrollAll(elements, index, direction); + } + } + } + + promiseScroll(element: HTMLElement, scrollType: string) { + return new Promise((resolve) => { + if (scrollType === 'view') { + element.scrollIntoView(); + } else if (scrollType === 'top') { + element.scrollTop = 0; + } else if (scrollType === 'bottom') { + element.scrollTop = element.scrollHeight; + } + setTimeout(() => { + resolve(true); + }, 500); + }); + } } diff --git a/frontend/src/app/explorer/explorer.module.ts b/frontend/src/app/explorer/explorer.module.ts index c1c2cc1a..a90dea7e 100644 --- a/frontend/src/app/explorer/explorer.module.ts +++ b/frontend/src/app/explorer/explorer.module.ts @@ -89,6 +89,7 @@ import { agmConfigFactory } from './services/agm'; import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client'; // for Router import: import { LoadingBarRouterModule } from '@ngx-loading-bar/router'; +import { NgxSpinnerModule } from 'ngx-spinner'; @NgModule({ declarations: [ ExplorerComponent, @@ -184,6 +185,7 @@ import { LoadingBarRouterModule } from '@ngx-loading-bar/router'; apiKey: '', }), AgmSnazzyInfoWindowModule, + NgxSpinnerModule, ], providers: [ { diff --git a/frontend/src/app/explorer/filters/date-range/date-range.component.html b/frontend/src/app/explorer/filters/date-range/date-range.component.html index cd817627..9b6d63b0 100644 --- a/frontend/src/app/explorer/filters/date-range/date-range.component.html +++ b/frontend/src/app/explorer/filters/date-range/date-range.component.html @@ -1,20 +1,32 @@
- From {{componentConfigs.placeholder }} - + From {{ componentConfigs.placeholder }} +
- To {{componentConfigs.placeholder }} - + To {{ componentConfigs.placeholder }} +
-
\ No newline at end of file +
diff --git a/frontend/src/app/explorer/filters/label/label.component.html b/frontend/src/app/explorer/filters/label/label.component.html index 68642e53..4f0fc75e 100644 --- a/frontend/src/app/explorer/filters/label/label.component.html +++ b/frontend/src/app/explorer/filters/label/label.component.html @@ -1,14 +1,31 @@ -
-

- +

+

+ - + error - +

-
\ No newline at end of file +
diff --git a/frontend/src/app/explorer/filters/range/range.component.html b/frontend/src/app/explorer/filters/range/range.component.html index 8b7e432f..c55e65cb 100644 --- a/frontend/src/app/explorer/filters/range/range.component.html +++ b/frontend/src/app/explorer/filters/range/range.component.html @@ -3,10 +3,20 @@ {{ componentConfigs.placeholder }} - + - \ No newline at end of file + diff --git a/frontend/src/app/explorer/filters/search/search.component.html b/frontend/src/app/explorer/filters/search/search.component.html index 65a978e1..c6b8f7a7 100644 --- a/frontend/src/app/explorer/filters/search/search.component.html +++ b/frontend/src/app/explorer/filters/search/search.component.html @@ -1,7 +1,13 @@ - {{componentConfigs.placeholder}} - + {{ componentConfigs.placeholder }} + - - + + Link + + +
- -
\ No newline at end of file + +
diff --git a/frontend/src/app/root/root.component.html b/frontend/src/app/root/root.component.html index 40fb2569..c046b4d1 100644 --- a/frontend/src/app/root/root.component.html +++ b/frontend/src/app/root/root.component.html @@ -1,6 +1,10 @@ - - - + + diff --git a/frontend/src/index.html b/frontend/src/index.html index a79bf842..768cc54d 100644 --- a/frontend/src/index.html +++ b/frontend/src/index.html @@ -1,12 +1,13 @@ - + - -