Solve conflics
testing/ogGui-multibranch/pipeline/head This commit is unstable
Details
testing/ogGui-multibranch/pipeline/head This commit is unstable
Details
commit
9304f95dfa
|
@ -0,0 +1,31 @@
|
|||
# Changelog
|
||||
|
||||
## [0.5.0] - 2024-11-19
|
||||
|
||||
### Added
|
||||
- Added functionality to execute actions from the menu in the general groups screen.
|
||||
- Displayed the selected center on the general screen for better context.
|
||||
- Implemented the option to collapse the sidebar for improved usability.
|
||||
- Introduced a dropdown menu to select boot files (BootfileNames).
|
||||
- Simplified the process of adding multiple clients in the subnets section.
|
||||
- Enabled ogBoot to manage storage units more intuitively.
|
||||
- Added preloading of template models in ogBoot for faster setup.
|
||||
- Created a contextual help tour to guide users through various components and features.
|
||||
|
||||
### Improved
|
||||
- Renamed the field "Reserved Room" to "Available RemotePC" for better clarity.
|
||||
- Added view sizes for visual cards (`mat-card`).
|
||||
- Refactored the task stepper to improve efficiency and readability.
|
||||
- Replaced red "X" icons with more consistent and user-friendly visuals.
|
||||
- Allowed logical names for IP addresses in the subnets section.
|
||||
- Enabled reordering of commands when creating a command group.
|
||||
- Made predefined commands read-only to prevent accidental modifications.
|
||||
- Simplified the task creation modal to enhance user experience.
|
||||
- Adjusted the translation system to cover new elements and improve consistency (work in progress).
|
||||
|
||||
### Fixed
|
||||
- Resolved an issue that prevented editing software profiles correctly.
|
||||
- Fixed a bug where newly created commands failed to execute in the commands section.
|
||||
|
||||
---
|
||||
|
|
@ -22,7 +22,7 @@ pipeline {
|
|||
IMAGE_ID = "${DOCKER_REPO}/${DOCKER_IMAGE_NAME}:${BRANCH_NAME}-${DOCKER_TAG}"
|
||||
IMAGE_ID_TESTING = "${DOCKER_REPO}/${DOCKER_IMAGE_NAME}:${BRANCH_NAME}-${DOCKER_TAG}-testing"
|
||||
if (BRANCH_NAME == 'main') {
|
||||
LATEST_ID = 'latest'
|
||||
LATEST_ID = "${DOCKER_REPO}/${DOCKER_IMAGE_NAME}:latest"
|
||||
} else {
|
||||
LATEST_ID = "${DOCKER_REPO}/${DOCKER_IMAGE_NAME}:${BRANCH_NAME}-latest"
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"i18n": {
|
||||
"sourceLocale": "es",
|
||||
"locales": {
|
||||
"en-US": "src/locale/messages.en.json"
|
||||
"en-US": "src/locale/en.json"
|
||||
}
|
||||
},
|
||||
"projectType": "application",
|
||||
|
@ -41,9 +41,14 @@
|
|||
],
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"assets": [
|
||||
"src/favicon.ico",
|
||||
"src/assets"
|
||||
],
|
||||
"src/favicon.ico",
|
||||
"src/assets",
|
||||
{
|
||||
"glob": "**/*",
|
||||
"input": "src/locale",
|
||||
"output": "/locale"
|
||||
}
|
||||
],
|
||||
"styles": [
|
||||
"src/custom-theme.scss",
|
||||
"src/styles.css",
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
"@angular/platform-browser": "^18.0.0",
|
||||
"@angular/platform-browser-dynamic": "^18.0.0",
|
||||
"@angular/router": "^18.0.0",
|
||||
"@ngx-translate/core": "^16.0.3",
|
||||
"@ngx-translate/http-loader": "^16.0.0",
|
||||
"@swimlane/ngx-charts": "^20.5.0",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"ngx-joyride": "^2.5.0",
|
||||
|
@ -4976,6 +4978,30 @@
|
|||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/@ngx-translate/core": {
|
||||
"version": "16.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-16.0.3.tgz",
|
||||
"integrity": "sha512-UPse66z9tRUmIpeorYodXBQY6O4foUmj9jy9cCuuja7lqdOwRBWPzCWqc+qYIXv5L2QoqZdxgHtqoUz+Q9weSA==",
|
||||
"dependencies": {
|
||||
"tslib": "^2.3.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@angular/common": ">=16",
|
||||
"@angular/core": ">=16"
|
||||
}
|
||||
},
|
||||
"node_modules/@ngx-translate/http-loader": {
|
||||
"version": "16.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-16.0.0.tgz",
|
||||
"integrity": "sha512-l3okOHGVxZ1Bm55OpakSfXvI2yYmVmhYqgwGU4aIQIRUqpkBCrSDZnmrHTcZfsGJzXKB5E2D2rko9i28gBijmA==",
|
||||
"dependencies": {
|
||||
"tslib": "^2.3.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@angular/common": ">=16",
|
||||
"@angular/core": ">=16"
|
||||
}
|
||||
},
|
||||
"node_modules/@nodelib/fs.scandir": {
|
||||
"version": "2.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
|
||||
|
@ -6534,9 +6560,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/body-parser": {
|
||||
"version": "1.20.2",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
|
||||
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
|
||||
"version": "1.20.3",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
|
||||
"integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"bytes": "3.1.2",
|
||||
|
@ -6547,7 +6573,7 @@
|
|||
"http-errors": "2.0.0",
|
||||
"iconv-lite": "0.4.24",
|
||||
"on-finished": "2.4.1",
|
||||
"qs": "6.11.0",
|
||||
"qs": "6.13.0",
|
||||
"raw-body": "2.5.2",
|
||||
"type-is": "~1.6.18",
|
||||
"unpipe": "1.0.0"
|
||||
|
@ -7222,9 +7248,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/cookie": {
|
||||
"version": "0.4.2",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
|
||||
"integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
|
||||
"version": "0.7.2",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
|
||||
"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
|
@ -8082,9 +8108,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/engine.io": {
|
||||
"version": "6.5.5",
|
||||
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz",
|
||||
"integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==",
|
||||
"version": "6.6.2",
|
||||
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz",
|
||||
"integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/cookie": "^0.4.1",
|
||||
|
@ -8092,7 +8118,7 @@
|
|||
"@types/node": ">=10.0.0",
|
||||
"accepts": "~1.3.4",
|
||||
"base64id": "2.0.0",
|
||||
"cookie": "~0.4.1",
|
||||
"cookie": "~0.7.2",
|
||||
"cors": "~2.8.5",
|
||||
"debug": "~4.3.1",
|
||||
"engine.io-parser": "~5.2.1",
|
||||
|
@ -8398,37 +8424,37 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/express": {
|
||||
"version": "4.19.2",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
|
||||
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
|
||||
"version": "4.21.1",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
|
||||
"integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"accepts": "~1.3.8",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.20.2",
|
||||
"body-parser": "1.20.3",
|
||||
"content-disposition": "0.5.4",
|
||||
"content-type": "~1.0.4",
|
||||
"cookie": "0.6.0",
|
||||
"cookie": "0.7.1",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"encodeurl": "~1.0.2",
|
||||
"encodeurl": "~2.0.0",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"finalhandler": "1.2.0",
|
||||
"finalhandler": "1.3.1",
|
||||
"fresh": "0.5.2",
|
||||
"http-errors": "2.0.0",
|
||||
"merge-descriptors": "1.0.1",
|
||||
"merge-descriptors": "1.0.3",
|
||||
"methods": "~1.1.2",
|
||||
"on-finished": "2.4.1",
|
||||
"parseurl": "~1.3.3",
|
||||
"path-to-regexp": "0.1.7",
|
||||
"path-to-regexp": "0.1.10",
|
||||
"proxy-addr": "~2.0.7",
|
||||
"qs": "6.11.0",
|
||||
"qs": "6.13.0",
|
||||
"range-parser": "~1.2.1",
|
||||
"safe-buffer": "5.2.1",
|
||||
"send": "0.18.0",
|
||||
"serve-static": "1.15.0",
|
||||
"send": "0.19.0",
|
||||
"serve-static": "1.16.2",
|
||||
"setprototypeof": "1.2.0",
|
||||
"statuses": "2.0.1",
|
||||
"type-is": "~1.6.18",
|
||||
|
@ -8440,9 +8466,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/express/node_modules/cookie": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
|
||||
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
|
||||
"version": "0.7.1",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
|
||||
"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
|
@ -8457,14 +8483,23 @@
|
|||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/express/node_modules/encodeurl": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
|
||||
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/express/node_modules/finalhandler": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
|
||||
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
|
||||
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"debug": "2.6.9",
|
||||
"encodeurl": "~1.0.2",
|
||||
"encodeurl": "~2.0.0",
|
||||
"escape-html": "~1.0.3",
|
||||
"on-finished": "2.4.1",
|
||||
"parseurl": "~1.3.3",
|
||||
|
@ -10784,10 +10819,13 @@
|
|||
}
|
||||
},
|
||||
"node_modules/merge-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
|
||||
"dev": true
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
|
||||
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
|
||||
"dev": true,
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/merge-stream": {
|
||||
"version": "2.0.0",
|
||||
|
@ -10814,9 +10852,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/micromatch": {
|
||||
"version": "4.0.7",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
|
||||
"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"braces": "^3.0.3",
|
||||
|
@ -11590,9 +11628,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/object-inspect": {
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
|
||||
"integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
|
||||
"version": "1.13.3",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
|
||||
"integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
|
@ -12065,9 +12103,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
|
||||
"version": "0.1.10",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
|
||||
"integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/path-type": {
|
||||
|
@ -12356,12 +12394,12 @@
|
|||
}
|
||||
},
|
||||
"node_modules/qs": {
|
||||
"version": "6.11.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
|
||||
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
|
||||
"version": "6.13.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
|
||||
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"side-channel": "^1.0.4"
|
||||
"side-channel": "^1.0.6"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.6"
|
||||
|
@ -12936,9 +12974,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/send": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
|
||||
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
|
||||
"version": "0.19.0",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
|
||||
"integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"debug": "2.6.9",
|
||||
|
@ -13080,20 +13118,29 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/serve-static": {
|
||||
"version": "1.15.0",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
|
||||
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
|
||||
"version": "1.16.2",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
|
||||
"integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"encodeurl": "~1.0.2",
|
||||
"encodeurl": "~2.0.0",
|
||||
"escape-html": "~1.0.3",
|
||||
"parseurl": "~1.3.3",
|
||||
"send": "0.18.0"
|
||||
"send": "0.19.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/serve-static/node_modules/encodeurl": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
|
||||
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/set-function-length": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
|
||||
|
@ -13257,16 +13304,16 @@
|
|||
}
|
||||
},
|
||||
"node_modules/socket.io": {
|
||||
"version": "4.7.5",
|
||||
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz",
|
||||
"integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==",
|
||||
"version": "4.8.1",
|
||||
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
|
||||
"integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"accepts": "~1.3.4",
|
||||
"base64id": "~2.0.0",
|
||||
"cors": "~2.8.5",
|
||||
"debug": "~4.3.2",
|
||||
"engine.io": "~6.5.2",
|
||||
"engine.io": "~6.6.0",
|
||||
"socket.io-adapter": "~2.5.2",
|
||||
"socket.io-parser": "~4.2.4"
|
||||
},
|
||||
|
@ -14482,9 +14529,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/webpack-dev-server/node_modules/http-proxy-middleware": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
|
||||
"integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
|
||||
"integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/http-proxy": "^1.17.8",
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
"@angular/platform-browser": "^18.0.0",
|
||||
"@angular/platform-browser-dynamic": "^18.0.0",
|
||||
"@angular/router": "^18.0.0",
|
||||
"@ngx-translate/core": "^16.0.3",
|
||||
"@ngx-translate/http-loader": "^16.0.0",
|
||||
"@swimlane/ngx-charts": "^20.5.0",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"ngx-joyride": "^2.5.0",
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
import { TestBed } from '@angular/core/testing';
|
||||
import { RouterTestingModule } from '@angular/router/testing'; // Asegúrate de que está importado
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { AppComponent } from './app.component';
|
||||
|
||||
describe('AppComponent', () => {
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [
|
||||
RouterTestingModule
|
||||
RouterTestingModule,
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
declarations: [
|
||||
AppComponent
|
||||
|
@ -19,5 +21,4 @@ describe('AppComponent', () => {
|
|||
const app = fixture.componentInstance;
|
||||
expect(app).toBeTruthy();
|
||||
});
|
||||
|
||||
});
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-root',
|
||||
|
@ -7,4 +8,11 @@ import { Component } from '@angular/core';
|
|||
})
|
||||
export class AppComponent {
|
||||
title = 'ogWebconsole';
|
||||
constructor(private translateService: TranslateService) {
|
||||
const savedLanguage = localStorage.getItem('language') || 'es';
|
||||
this.translateService.use(savedLanguage);
|
||||
}
|
||||
ngOnInit() {
|
||||
sessionStorage.setItem('language', 'es');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ import { HeaderComponent } from './layout/header/header.component';
|
|||
import { SidebarComponent } from './layout/sidebar/sidebar.component';
|
||||
import { LoginComponent } from './components/login/login.component';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
||||
import { HTTP_INTERCEPTORS, HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
||||
import { CustomInterceptor } from './core/services/custom.interceptor';
|
||||
import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
|
||||
import { MatToolbarModule } from '@angular/material/toolbar';
|
||||
|
@ -122,7 +122,14 @@ import { DeployImageComponent } from './components/groups/components/client-main
|
|||
import { MainRepositoryViewComponent } from './components/repositories/main-repository-view/main-repository-view.component';
|
||||
import { ExecuteCommandOuComponent } from './components/groups/shared/execute-command-ou/execute-command-ou.component';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
|
||||
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
||||
import { EnvVarsComponent } from './components/admin/env-vars/env-vars.component';
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient) {
|
||||
return new TranslateHttpLoader(http, './locale/', '.json');
|
||||
}
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
AppComponent,
|
||||
|
@ -198,6 +205,7 @@ import { EnvVarsComponent } from './components/admin/env-vars/env-vars.component
|
|||
RepositoriesComponent,
|
||||
CreateRepositoryComponent,
|
||||
ExecuteCommandComponent,
|
||||
ExecuteCommandOuComponent,
|
||||
DeployImageComponent,
|
||||
MainRepositoryViewComponent,
|
||||
ExecuteCommandOuComponent,
|
||||
|
@ -230,6 +238,13 @@ import { EnvVarsComponent } from './components/admin/env-vars/env-vars.component
|
|||
MatDatepickerModule,
|
||||
MatNativeDateModule,
|
||||
MatSliderModule,
|
||||
TranslateModule.forRoot({
|
||||
loader: {
|
||||
provide: TranslateLoader,
|
||||
useFactory: HttpLoaderFactory,
|
||||
deps: [HttpClient]
|
||||
}
|
||||
}),
|
||||
JoyrideModule.forRoot(),
|
||||
ToastrModule.forRoot(
|
||||
{
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<div class="container">
|
||||
<button mat-fab color="primary" class="fab-button" routerLink="/users">
|
||||
<mat-icon>group</mat-icon>
|
||||
<span i18n="@@labelUsers">Usuarios</span>
|
||||
<span>{{ 'labelUsers' | translate }}</span>
|
||||
</button>
|
||||
<button mat-fab color="primary" class="fab-button" routerLink="/user-groups">
|
||||
<mat-icon>admin_panel_settings</mat-icon>
|
||||
<span i18n="@@labelRoles">Roles</span>
|
||||
<span>{{ 'labelRoles' | translate }}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
|
|
@ -3,7 +3,7 @@ import { RouterTestingModule } from '@angular/router/testing';
|
|||
import { AdminComponent } from './admin.component';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
describe('AdminComponent', () => {
|
||||
let component: AdminComponent;
|
||||
|
@ -13,9 +13,10 @@ describe('AdminComponent', () => {
|
|||
await TestBed.configureTestingModule({
|
||||
declarations: [AdminComponent],
|
||||
imports: [
|
||||
RouterTestingModule, // Importa RouterTestingModule para manejar routerLink
|
||||
MatButtonModule, // Importa MatButtonModule para botones
|
||||
MatIconModule // Importa MatIconModule para iconos
|
||||
RouterTestingModule,
|
||||
MatButtonModule,
|
||||
MatIconModule,
|
||||
TranslateModule.forRoot()
|
||||
]
|
||||
}).compileComponents();
|
||||
});
|
||||
|
@ -23,35 +24,10 @@ describe('AdminComponent', () => {
|
|||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AdminComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges(); // Detecta cambios para renderizar el componente
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('debería crear el componente', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
|
||||
it('debería contener dos botones', () => {
|
||||
const buttons = fixture.debugElement.queryAll(By.css('button'));
|
||||
expect(buttons.length).toBe(2); // Verifica que hay dos botones
|
||||
});
|
||||
|
||||
it('el primer botón debería tener el texto "Usuarios"', () => {
|
||||
const firstButton = fixture.debugElement.query(By.css('.fab-button:first-child'));
|
||||
expect(firstButton.nativeElement.textContent).toContain('Usuarios'); // Verifica que el texto sea "Usuarios"
|
||||
});
|
||||
|
||||
it('el segundo botón debería tener el texto "Roles"', () => {
|
||||
const secondButton = fixture.debugElement.query(By.css('.fab-button:last-child'));
|
||||
expect(secondButton.nativeElement.textContent).toContain('Roles'); // Verifica que el texto sea "Roles"
|
||||
});
|
||||
|
||||
it('el primer botón debería tener el routerLink correcto', () => {
|
||||
const firstButton = fixture.debugElement.query(By.css('.fab-button:first-child'));
|
||||
expect(firstButton.nativeElement.getAttribute('ng-reflect-router-link')).toBe('/users'); // Verifica el routerLink
|
||||
});
|
||||
|
||||
it('el segundo botón debería tener el routerLink correcto', () => {
|
||||
const secondButton = fixture.debugElement.query(By.css('.fab-button:last-child'));
|
||||
expect(secondButton.nativeElement.getAttribute('ng-reflect-router-link')).toBe('/user-groups'); // Verifica el routerLink
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,6 +1,18 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { EnvVarsComponent } from './env-vars.component';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { ReactiveFormsModule, FormsModule, FormBuilder } from '@angular/forms';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ToastrModule, ToastrService } from 'ngx-toastr';
|
||||
import { DataService } from '../users/users/data.service';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
|
||||
describe('EnvVarsComponent', () => {
|
||||
let component: EnvVarsComponent;
|
||||
|
@ -8,9 +20,36 @@ describe('EnvVarsComponent', () => {
|
|||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [EnvVarsComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
declarations: [EnvVarsComponent],
|
||||
imports: [
|
||||
ReactiveFormsModule,
|
||||
FormsModule,
|
||||
MatDialogModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
MatCheckboxModule,
|
||||
MatButtonModule,
|
||||
BrowserAnimationsModule,
|
||||
MatTableModule,
|
||||
ToastrModule.forRoot(),
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
FormBuilder,
|
||||
ToastrService,
|
||||
DataService,
|
||||
provideHttpClient(),
|
||||
provideHttpClientTesting(),
|
||||
{
|
||||
provide: MatDialogRef,
|
||||
useValue: {}
|
||||
},
|
||||
{
|
||||
provide: MAT_DIALOG_DATA,
|
||||
useValue: {}
|
||||
}
|
||||
]
|
||||
}).compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(EnvVarsComponent);
|
||||
component = fixture.componentInstance;
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
<h1 mat-dialog-title i18n="@@dialogTitleAddRole">Añadir Rol</h1>
|
||||
<h1 mat-dialog-title>{{ 'dialogTitleAddRole' | translate }}</h1>
|
||||
<mat-dialog-content class="form-container">
|
||||
<form [formGroup]="roleForm" class="role-form">
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label i18n="@@labelRoleName">Nombre</mat-label>
|
||||
<mat-label>{{ 'labelRoleName' | translate }}</mat-label>
|
||||
<input matInput formControlName="name" required>
|
||||
</mat-form-field>
|
||||
|
||||
<section class="example-section">
|
||||
<h4 i18n="@@sectionTitlePermissions">Permisos:</h4>
|
||||
<p><mat-checkbox formControlName="superAdmin" i18n="@@checkboxSuperAdmin">Super Admin</mat-checkbox></p>
|
||||
<p><mat-checkbox formControlName="orgAdmin" i18n="@@checkboxOrgAdmin">Admin de Unidad Organizativa</mat-checkbox></p>
|
||||
<p><mat-checkbox formControlName="orgOperator" i18n="@@checkboxOrgOperator">Operador de Unidad Organizativa</mat-checkbox></p>
|
||||
<p><mat-checkbox formControlName="orgMinimal" i18n="@@checkboxOrgMinimal">Unidad Organizativa Mínima</mat-checkbox></p>
|
||||
<p><mat-checkbox formControlName="userRole" i18n="@@checkboxUserRole">Usuario</mat-checkbox></p>
|
||||
<h4>{{ 'sectionTitlePermissions' | translate }}</h4>
|
||||
<p><mat-checkbox formControlName="superAdmin">{{ 'checkboxSuperAdmin' | translate }}</mat-checkbox></p>
|
||||
<p><mat-checkbox formControlName="orgAdmin">{{ 'checkboxOrgAdmin' | translate }}</mat-checkbox></p>
|
||||
<p><mat-checkbox formControlName="orgOperator">{{ 'checkboxOrgOperator' | translate }}</mat-checkbox></p>
|
||||
<p><mat-checkbox formControlName="orgMinimal">{{ 'checkboxOrgMinimal' | translate }}</mat-checkbox></p>
|
||||
<p><mat-checkbox formControlName="userRole">{{ 'checkboxUserRole' | translate }}</mat-checkbox></p>
|
||||
</section>
|
||||
</form>
|
||||
</mat-dialog-content>
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="onNoClick()" i18n="@@buttonCancel">Cancelar</button>
|
||||
<button mat-button (click)="onSubmit()" i18n="@@buttonAdd">Añadir</button>
|
||||
<button mat-button (click)="onNoClick()">{{ 'buttonCancel' | translate }}</button>
|
||||
<button mat-button (click)="onSubmit()">{{ 'buttonAdd' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -1,16 +1,18 @@
|
|||
<div class="header-container">
|
||||
<h2 class="title" i18n="@@adminImagesTitle">Administrar Roles</h2>
|
||||
<h2 class="title">{{ 'adminRolesTitle' | translate }}</h2>
|
||||
<div class="images-button-row">
|
||||
<button mat-flat-button color="primary" (click)="addUser()">Añadir rol</button>
|
||||
<button mat-flat-button color="primary" (click)="addUser()">
|
||||
{{ 'addRole' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
<div class="search-container">
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label i18n="@@searchLabel">Buscar nombre de rol</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-label>{{ 'searchRoleLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="{{ 'searchPlaceholder' | translate }}" [(ngModel)]="filters['name']" (keyup.enter)="search()">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint>{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
|
@ -26,12 +28,12 @@
|
|||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">Acciones</th>
|
||||
<th mat-header-cell *matHeaderCellDef style="text-align: center;">{{ 'columnActions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let role" style="text-align: center;">
|
||||
<button mat-icon-button color="primary" (click)="editRole(role)" i18n="@@editImage">
|
||||
<button mat-icon-button color="primary" (click)="editRole(role)">
|
||||
<mat-icon>edit</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="warn" (click)="deleteRole(role)" i18n="@@buttonDelete" [disabled]="role.permissions.includes('ROLE_SUPER_ADMIN')">
|
||||
<button mat-icon-button color="warn" (click)="deleteRole(role)" [disabled]="role.permissions.includes('ROLE_SUPER_ADMIN')">
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</td>
|
||||
|
|
|
@ -11,6 +11,7 @@ import { MatLabel } from '@angular/material/form-field';
|
|||
import { MatIcon } from '@angular/material/icon';
|
||||
import { MatHint } from '@angular/material/form-field';
|
||||
import { MatPaginator } from '@angular/material/paginator';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
describe('RolesComponent', () => {
|
||||
let component: RolesComponent;
|
||||
let fixture: ComponentFixture<RolesComponent>;
|
||||
|
@ -27,7 +28,8 @@ describe('RolesComponent', () => {
|
|||
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [RolesComponent],
|
||||
imports: [MatDivider, MatFormField, MatLabel, MatIcon, MatHint, MatPaginator],
|
||||
imports: [MatDivider, MatFormField, MatLabel, MatIcon, MatHint, MatPaginator,
|
||||
TranslateModule.forRoot()],
|
||||
providers: [
|
||||
{ provide: MatDialog, useValue: matDialogSpy },
|
||||
{ provide: HttpClient, useValue: httpClientSpy },
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
<h1 mat-dialog-title i18n="@@dialogTitleAddRole">Añadir Usuario</h1>
|
||||
<h1 mat-dialog-title>{{ 'dialogTitleAddUser' | translate }}</h1>
|
||||
<mat-dialog-content class="form-container">
|
||||
<form [formGroup]="userForm" class="user-form">
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label i18n="@@addUserlabelUsername">Nombre de usuario</mat-label>
|
||||
<mat-label>{{ 'addUserlabelUsername' | translate }}</mat-label>
|
||||
<input matInput formControlName="username" required>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label i18n="@@addUserlabelPassword">Contraseña</mat-label>
|
||||
<mat-label>{{ 'addUserlabelPassword' | translate }}</mat-label>
|
||||
<input matInput formControlName="password" type="password" required>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label i18n="@@labelRole">Rol</mat-label>
|
||||
<mat-label>{{ 'labelRole' | translate }}</mat-label>
|
||||
<mat-select formControlName="role" required>
|
||||
<mat-option *ngFor="let group of userGroups" [value]="group['@id']">
|
||||
{{ group.name }}
|
||||
|
@ -20,16 +20,16 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label i18n="@@labelOrganizationalUnit">Unidad organiativa</mat-label>
|
||||
<mat-label>{{ 'labelOrganizationalUnit' | translate }}</mat-label>
|
||||
<mat-select multiple formControlName="organizationalUnits">
|
||||
<mat-option *ngFor="let unit of organizationalUnits" [value]="unit['@id']">
|
||||
{{unit.name}}
|
||||
{{ unit.name }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
</mat-dialog-content>
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="onNoClick()" i18n="@@buttonCancel">Cancelar</button>
|
||||
<button mat-button (click)="onSubmit()" i18n="@@buttonAdd">Añadir</button>
|
||||
<button mat-button (click)="onNoClick()">{{ 'buttonCancel' | translate }}</button>
|
||||
<button mat-button (click)="onSubmit()">{{ 'buttonAdd' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
<h1 mat-dialog-title i18n="@@dialogTitleEditUser">Editar Usuario</h1>
|
||||
<h1 mat-dialog-title>{{ 'dialogTitleEditUser' | translate }}</h1>
|
||||
<mat-dialog-content class="form-container">
|
||||
<form [formGroup]="userForm" class="user-form">
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@labelCurrentPassword">Contraseña actual</mat-label>
|
||||
<mat-label>{{ 'labelCurrentPassword' | translate }}</mat-label>
|
||||
<input matInput formControlName="currentPassword" type="password">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@labelNewPassword">Nueva contraseña</mat-label>
|
||||
<mat-label>{{ 'labelNewPassword' | translate }}</mat-label>
|
||||
<input matInput formControlName="newPassword" type="password">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@labelRepeatPassword">Repite la contraseña</mat-label>
|
||||
<mat-label>{{ 'labelRepeatPassword' | translate }}</mat-label>
|
||||
<input matInput formControlName="repeatNewPassword" type="password">
|
||||
</mat-form-field>
|
||||
|
||||
<div class="error-message" *ngIf="passwordMismatch" i18n="@@errorPasswordMismatch">
|
||||
Las contraseñas no coinciden
|
||||
<div class="error-message" *ngIf="passwordMismatch">
|
||||
{{ 'errorPasswordMismatch' | translate }}
|
||||
</div>
|
||||
|
||||
<div class="error-message" *ngIf="updateError" i18n="@@errorUpdate">
|
||||
<div class="error-message" *ngIf="updateError">
|
||||
{{ resetPasswordError }}
|
||||
</div>
|
||||
</form>
|
||||
</mat-dialog-content>
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="onNoClick()" i18n="@@buttonCancel">Cancelar</button>
|
||||
<button mat-button (click)="onSubmit()" [disabled]="loading" i18n="@@buttonEdit">Editar</button>
|
||||
<button mat-button (click)="onNoClick()">{{ 'buttonCancel' | translate }}</button>
|
||||
<button mat-button (click)="onSubmit()" [disabled]="loading">{{ 'buttonEdit' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -1,16 +1,18 @@
|
|||
<div class="header-container">
|
||||
<h2 class="title" i18n="@@adminImagesTitle">Administrar usuarios</h2>
|
||||
<h2 class="title">{{ 'adminImagesTitle' | translate }}</h2>
|
||||
<div class="images-button-row">
|
||||
<button mat-flat-button color="primary" (click)="addUser()">Añadir usuarios</button>
|
||||
<button mat-flat-button color="primary" (click)="addUser()">
|
||||
{{ 'addUser' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
<div class="search-container">
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label i18n="@@searchLabel">Buscar nombre de usuario</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-label>{{ 'searchLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="{{ 'searchPlaceholder' | translate }}" [(ngModel)]="filters['name']" (keyup.enter)="search()">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint>{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
|
@ -26,10 +28,14 @@
|
|||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">Acciones</th>
|
||||
<th mat-header-cell *matHeaderCellDef style="text-align: center;">{{ 'columnActions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let user" style="text-align: center;">
|
||||
<button mat-icon-button color="primary" (click)="editUser(user)" i18n="@@editImage"> <mat-icon>edit</mat-icon></button>
|
||||
<button mat-icon-button color="warn" (click)="deleteUser(user)" i18n="@@buttonDelete"><mat-icon>delete</mat-icon></button>
|
||||
<button mat-icon-button color="primary" (click)="editUser(user)">
|
||||
<mat-icon>edit</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="warn" (click)="deleteUser(user)">
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</td>
|
||||
</ng-container>
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||
|
|
|
@ -6,6 +6,7 @@ import { HttpClientTestingModule } from '@angular/common/http/testing';
|
|||
import { ToastrService } from 'ngx-toastr';
|
||||
import { of } from 'rxjs';
|
||||
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
class MockUserService {
|
||||
getUsers() {
|
||||
|
@ -29,6 +30,7 @@ describe('UsersComponent', () => {
|
|||
MatTableModule,
|
||||
MatDialogModule,
|
||||
HttpClientTestingModule,
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
{ useClass: MockUserService },
|
||||
|
|
|
@ -2,20 +2,21 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 joyrideStep="titleStep" text="En esta pantalla, puedes gestionar los calendarios de los equipos remotos conectados con el servicio UDS" class="title" i18n="@@adminImagesTitle">Administrar calendarios</h2>
|
||||
<h2 joyrideStep="titleStep" text="{{ 'titleStepText' | translate }}" class="title">{{ 'adminCalendarsTitle' | translate }}</h2>
|
||||
<div class="calendar-button-row">
|
||||
|
||||
<button joyrideStep="addButtonStep" text="Haz clic aquí para añadir un nuevo calendario." mat-flat-button color="primary" (click)="addImage()">Añadir calendario</button>
|
||||
<button joyrideStep="addButtonStep" text="{{ 'addButtonStepText' | translate }}" mat-flat-button color="primary" (click)="addImage()">
|
||||
{{ 'addCalendar' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="search-container">
|
||||
<mat-form-field joyrideStep="searchStep" text="Utiliza esta barra de búsqueda para filtrar los calendarios existentes." appearance="fill" class="search-string">
|
||||
<mat-label i18n="@@searchLabel">Buscar nombre de calendario</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-form-field joyrideStep="searchStep" text="{{ 'searchStepText' | translate }}" appearance="fill" class="search-string">
|
||||
<mat-label>{{ 'searchCalendarLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="{{ 'searchPlaceholder' | translate }}" [(ngModel)]="filters['name']" (keyup.enter)="search()">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint>{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
|
@ -24,29 +25,36 @@
|
|||
</div>
|
||||
|
||||
<div *ngIf="!loading">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="Aquí se muestran los calendarios existentes con sus características y configuraciones.">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="{{ 'tableStepText' | translate }}">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
<td mat-cell *matCellDef="let image" >
|
||||
<td mat-cell *matCellDef="let image">
|
||||
<ng-container *ngIf="column.columnDef === 'isDefault' || column.columnDef === 'installed'">
|
||||
<mat-icon [color]="image[column.columnDef] ? 'primary' : 'warn'">
|
||||
{{ image[column.columnDef] ? 'check_circle' : 'cancel' }}
|
||||
</mat-icon>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="column.columnDef !== 'isDefault' && column.columnDef !== 'installed' && column.columnDef !== 'downloadUrl'">
|
||||
{{ column.cell(image) }}
|
||||
</ng-container>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions" joyrideStep="actionsStep" text="Accede a las acciones disponibles para cada calendario aquí.">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">Acciones</th>
|
||||
<ng-container matColumnDef="actions" joyrideStep="actionsStep" text="{{ 'actionsStepText' | translate }}">
|
||||
<th mat-header-cell *matHeaderCellDef style="text-align: center;">{{ 'columnActions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let calendar" style="text-align: center;">
|
||||
<button mat-icon-button color="primary" (click)="editCalendar(calendar)" i18n="@@editImage"> <mat-icon>edit</mat-icon></button>
|
||||
<button *ngIf="!syncUds" mat-icon-button color="primary" (click)="sync(calendar)"><mat-icon>sync</mat-icon></button>
|
||||
<button *ngIf="syncUds" mat-icon-button color="primary"><mat-spinner diameter="24"></mat-spinner></button>
|
||||
<button mat-icon-button color="warn" (click)="deleteCalendar(calendar)" i18n="@@buttonDelete"><mat-icon>delete</mat-icon></button>
|
||||
<button mat-icon-button color="primary" (click)="editCalendar(calendar)">
|
||||
<mat-icon>edit</mat-icon>
|
||||
</button>
|
||||
<button *ngIf="!syncUds" mat-icon-button color="primary" (click)="sync(calendar)">
|
||||
<mat-icon>sync</mat-icon>
|
||||
</button>
|
||||
<button *ngIf="syncUds" mat-icon-button color="primary">
|
||||
<mat-spinner diameter="24"></mat-spinner>
|
||||
</button>
|
||||
<button mat-icon-button color="warn" (click)="deleteCalendar(calendar)">
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
|
|
|
@ -13,6 +13,8 @@ import { MatTooltipModule } from '@angular/material/tooltip';
|
|||
import { FormsModule } from '@angular/forms';
|
||||
import { CalendarComponent } from './calendar.component';
|
||||
import { MatProgressSpinner } from '@angular/material/progress-spinner';
|
||||
import { JoyrideModule, JoyrideService } from 'ngx-joyride';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
describe('CalendarComponent', () => {
|
||||
let component: CalendarComponent;
|
||||
|
@ -34,8 +36,10 @@ describe('CalendarComponent', () => {
|
|||
MatPaginatorModule,
|
||||
MatTooltipModule,
|
||||
FormsModule,
|
||||
MatProgressSpinner
|
||||
]
|
||||
MatProgressSpinner,
|
||||
JoyrideModule.forRoot(),
|
||||
TranslateModule.forRoot(),
|
||||
],
|
||||
})
|
||||
.compileComponents();
|
||||
|
||||
|
|
|
@ -1,17 +1,19 @@
|
|||
<h2 mat-dialog-title>{{ isEditMode ? 'Editar' : 'Añadir' }} calendario</h2>
|
||||
<h2 mat-dialog-title>{{ isEditMode ? ('editCalendar' | translate) : ('addCalendar' | translate) }}</h2>
|
||||
<mat-dialog-content class="form-container">
|
||||
<mat-slide-toggle [(ngModel)]="isRemoteAvailable" class="example-margin">¿Remote PC?</mat-slide-toggle>
|
||||
<mat-slide-toggle [(ngModel)]="isRemoteAvailable" class="example-margin">
|
||||
{{ 'remoteAvailability' | translate }}
|
||||
</mat-slide-toggle>
|
||||
|
||||
<div *ngIf="!isRemoteAvailable" class="form-group">
|
||||
<mat-label>Selecciona los días de la semana</mat-label>
|
||||
<mat-label>{{ 'selectWeekDays' | translate }}</mat-label>
|
||||
<div class="row">
|
||||
<div class="col-md-6 checkbox-group">
|
||||
<mat-checkbox *ngFor="let day of weekDays.slice(0, (weekDays.length / 2) + 1)" [(ngModel)]="busyWeekDays[day]">
|
||||
{{ day }}
|
||||
</mat-checkbox>
|
||||
</div>
|
||||
<div class="col-md-6 checkbox-group ">
|
||||
<mat-checkbox *ngFor="let day of weekDays.slice(weekDays.length / 2 + 1 )" [(ngModel)]="busyWeekDays[day]">
|
||||
<div class="col-md-6 checkbox-group">
|
||||
<mat-checkbox *ngFor="let day of weekDays.slice(weekDays.length / 2 + 1)" [(ngModel)]="busyWeekDays[day]">
|
||||
{{ day }}
|
||||
</mat-checkbox>
|
||||
</div>
|
||||
|
@ -19,32 +21,32 @@
|
|||
|
||||
<div class="time-fields">
|
||||
<mat-form-field appearance="fill" class="time-field">
|
||||
<mat-label>Hora de inicio</mat-label>
|
||||
<input matInput [(ngModel)]="busyFromHour" type="time" placeholder="Selecciona la hora de inicio" [required]="!isRemoteAvailable">
|
||||
<mat-label>{{ 'startTime' | translate }}</mat-label>
|
||||
<input matInput [(ngModel)]="busyFromHour" type="time" placeholder="{{ 'startTimePlaceholder' | translate }}" [required]="!isRemoteAvailable">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="time-field">
|
||||
<mat-label>Hora de fin</mat-label>
|
||||
<input matInput [(ngModel)]="busyToHour" type="time" placeholder="Selecciona la hora de fin" [required]="!isRemoteAvailable">
|
||||
<mat-label>{{ 'endTime' | translate }}</mat-label>
|
||||
<input matInput [(ngModel)]="busyToHour" type="time" placeholder="{{ 'endTimePlaceholder' | translate }}" [required]="!isRemoteAvailable">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div *ngIf="isRemoteAvailable" class="form-group">
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Razón</mat-label>
|
||||
<input matInput [(ngModel)]="availableReason" placeholder="Razon para la excepción" [required]="isRemoteAvailable">
|
||||
<mat-label>{{ 'reasonLabel' | translate }}</mat-label>
|
||||
<input matInput [(ngModel)]="availableReason" placeholder="{{ 'reasonPlaceholder' | translate }}" [required]="isRemoteAvailable">
|
||||
</mat-form-field>
|
||||
<div class="time-fields">
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Fecha de inicio</mat-label>
|
||||
<mat-label>{{ 'startDate' | translate }}</mat-label>
|
||||
<input matInput [matDatepicker]="picker1" [(ngModel)]="availableFromDate" [required]="isRemoteAvailable">
|
||||
<mat-hint>MM/DD/YYYY</mat-hint>
|
||||
<mat-datepicker-toggle matIconSuffix [for]="picker1"></mat-datepicker-toggle>
|
||||
<mat-datepicker #picker1></mat-datepicker>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Fecha de fin</mat-label>
|
||||
<mat-label>{{ 'endDate' | translate }}</mat-label>
|
||||
<input matInput [matDatepicker]="picker2" [(ngModel)]="availableToDate" [required]="isRemoteAvailable">
|
||||
<mat-hint>MM/DD/YYYY</mat-hint>
|
||||
<mat-datepicker-toggle matIconSuffix [for]="picker2"></mat-datepicker-toggle>
|
||||
|
@ -55,12 +57,12 @@
|
|||
</mat-dialog-content>
|
||||
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="onNoClick()">Cancelar</button>
|
||||
<button mat-button (click)="onNoClick()">{{ 'buttonCancel' | translate }}</button>
|
||||
<button
|
||||
mat-button
|
||||
(click)="submitRule()"
|
||||
cdkFocusInitial
|
||||
[disabled]="(!isRemoteAvailable && (!busyFromHour || !busyToHour)) || (isRemoteAvailable && (!availableReason || !availableFromDate || !availableToDate))">
|
||||
{{ isEditMode ? 'Guardar' : 'Añadir' }}
|
||||
{{ isEditMode ? ('buttonSave' | translate) : ('buttonAdd' | translate) }}
|
||||
</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -1,15 +1,16 @@
|
|||
<h2 mat-dialog-title>{{ isEditMode ? 'Editar' : 'Añadir' }} calendario</h2>
|
||||
<h2 mat-dialog-title>{{ isEditMode ? ('editCalendar' | translate) : ('addCalendar' | translate) }}</h2>
|
||||
<mat-dialog-content class="form-container">
|
||||
<!-- Campo para el nombre -->
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Nombre</mat-label>
|
||||
<mat-label>{{ 'labelName' | translate }}</mat-label>
|
||||
<input matInput [(ngModel)]="name" required>
|
||||
<mat-icon *ngIf="isEditMode" matSuffix (click)="submitForm()">mode_edit</mat-icon>
|
||||
</mat-form-field>
|
||||
|
||||
<div style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<div *ngIf="isEditMode" mat-subheader>Reglas</div>
|
||||
<div *ngIf="isEditMode" mat-subheader>{{ 'rulesHeader' | translate }}</div>
|
||||
<button mat-flat-button color="primary" *ngIf="isEditMode" (click)="createRule()" style="padding: 10px;">
|
||||
Añadir regla
|
||||
{{ 'addRule' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
@ -21,16 +22,16 @@
|
|||
<div class="list-item-content">
|
||||
<mat-icon matListItemIcon>event_available</mat-icon>
|
||||
<div class="text-content">
|
||||
<div matListItemTitle>{{ rule.isRemoteAvailable ? 'Disponible' : 'No disponible ( periodo presencial )' }}</div>
|
||||
<div matListItemTitle>{{ rule.isRemoteAvailable ? ('statusAvailable' | translate) : ('statusUnavailable' | translate) }}</div>
|
||||
<div matListItemLine *ngIf="!rule.isRemoteAvailable">{{ rule.busyFromHour }} - {{ rule.busyToHour }}</div>
|
||||
<div matListItemLine *ngIf="!rule.isRemoteAvailable">{{ rule.busyWeekDaysMap }}</div>
|
||||
<div matListItemLine *ngIf="rule.isRemoteAvailable">{{ rule.availableReason }} | {{ rule.availableFromDate | date }} - {{ rule.availableToDate | date }}</div>
|
||||
</div>
|
||||
<div class="icon-container">
|
||||
<button mat-icon-button color="primary" class="right-icon" (click)="createRule(rule)" i18n="@@editImage">
|
||||
<button mat-icon-button color="primary" class="right-icon" (click)="createRule(rule)">
|
||||
<mat-icon>edit</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="warn" class="right-icon" (click)="deleteCalendarRule(rule)" >
|
||||
<button mat-icon-button color="warn" class="right-icon" (click)="deleteCalendarRule(rule)">
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
|
@ -41,6 +42,8 @@
|
|||
</mat-dialog-content>
|
||||
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="onNoClick()">Cancelar</button>
|
||||
<button mat-button (click)="submitForm()" [disabled]="!name || name === ''" cdkFocusInitial> Guardar </button>
|
||||
<button mat-button (click)="onNoClick()">{{ 'buttonCancel' | translate }}</button>
|
||||
<button mat-button (click)="submitForm()" [disabled]="!name || name === ''" cdkFocusInitial>
|
||||
{{ 'buttonSave' | translate }}
|
||||
</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -2,29 +2,31 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" i18n="@@adminCommandGroupsTitle" joyrideStep="titleStep" text="Desde aquí puedes gestionar los grupos de comandos.">Administrar Grupos de Comandos</h2>
|
||||
<h2 class="title" joyrideStep="titleStep" text="{{ 'titleStepText' | translate }}">{{ 'adminCommandGroupsTitle' | translate }}</h2>
|
||||
<div class="command-groups-button-row">
|
||||
<button mat-flat-button color="primary" (click)="openCreateCommandGroupModal()" joyrideStep="addCommandGroupStep" text="Haz clic para añadir un nuevo grupo de comandos.">Añadir Grupo de Comandos</button>
|
||||
<button mat-flat-button color="primary" (click)="openCreateCommandGroupModal()" joyrideStep="addCommandGroupStep" text="{{ 'addCommandGroupStepText' | translate }}">
|
||||
{{ 'addCommandGroup' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="search-container" joyrideStep="searchStep" text="Busca un grupo de comandos específico ingresando su nombre y pulsando 'Enter'.">
|
||||
<div class="search-container" joyrideStep="searchStep" text="{{ 'searchStepText' | translate }}">
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label i18n="@@searchLabel">Buscar nombre de grupo</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-label>{{ 'searchGroupNameLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="{{ 'searchPlaceholder' | translate }}" [(ngModel)]="filters['name']" (keyup.enter)="search()">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint>{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<div *ngIf="loading" class="loading-container" joyrideStep="loadingStep" text="Espera mientras se cargan los grupos de comandos.">
|
||||
<div *ngIf="loading" class="loading-container" joyrideStep="loadingStep" text="{{ 'loadingStepText' | translate }}">
|
||||
<mat-spinner></mat-spinner>
|
||||
</div>
|
||||
|
||||
<div *ngIf="!loading">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="Aquí se muestra la lista de grupos de comandos disponibles.">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="{{ 'tableStepText' | translate }}">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
<td mat-cell *matCellDef="let commandGroup">
|
||||
|
@ -32,8 +34,8 @@
|
|||
{{ column.cell(commandGroup) }}
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="column.columnDef === 'commands'" joyrideStep="viewCommandsStep" text="Haz clic para ver los comandos en este grupo.">
|
||||
<button mat-button [matMenuTriggerFor]="menu">Ver comandos</button>
|
||||
<ng-container *ngIf="column.columnDef === 'commands'" joyrideStep="viewCommandsStep" text="{{ 'viewCommandsStepText' | translate }}">
|
||||
<button mat-button [matMenuTriggerFor]="menu">{{ 'viewCommands' | translate }}</button>
|
||||
<mat-menu #menu="matMenu">
|
||||
<button mat-menu-item *ngFor="let command of commandGroup.commands">
|
||||
{{ command.name }}
|
||||
|
@ -44,12 +46,16 @@
|
|||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">Acciones</th>
|
||||
<td mat-cell *matCellDef="let client" style="text-align: center;" joyrideStep="actionsStep" text="Usa estas opciones para ver, editar o eliminar un grupo de comandos.">
|
||||
<button mat-icon-button color="info" (click)="viewGroupDetails(client)"><mat-icon i18n="@@deleteElementTooltip">visibility</mat-icon></button>
|
||||
<button mat-icon-button color="primary" (click)="editCommandGroup(client)" i18n="@@editImage"><mat-icon>edit</mat-icon></button>
|
||||
<th mat-header-cell *matHeaderCellDef style="text-align: center;">{{ 'columnActions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let client" style="text-align: center;" joyrideStep="actionsStep" text="{{ 'actionsStepText' | translate }}">
|
||||
<button mat-icon-button color="info" (click)="viewGroupDetails(client)">
|
||||
<mat-icon>visibility</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="primary" (click)="editCommandGroup(client)">
|
||||
<mat-icon>edit</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="warn" (click)="deleteCommandGroup(client)">
|
||||
<mat-icon i18n="@@deleteElementTooltip">delete</mat-icon>
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
@ -59,7 +65,7 @@
|
|||
</table>
|
||||
</div>
|
||||
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="Navega entre las páginas de grupos de comandos usando el paginador.">
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="{{ 'paginationStepText' | translate }}">
|
||||
<mat-paginator [length]="length"
|
||||
[pageSize]="itemsPerPage"
|
||||
[pageIndex]="page"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<h2 mat-dialog-title>{{ editing ? 'Editar' : 'Crear' }} grupo de comando</h2>
|
||||
<h2 mat-dialog-title>{{ editing ? ('editCommandGroup' | translate) : ('createCommandGroup' | translate) }}</h2>
|
||||
<mat-dialog-content class="form-container">
|
||||
<div *ngIf="loading" class="loading-container">
|
||||
<mat-spinner></mat-spinner>
|
||||
|
@ -6,24 +6,24 @@
|
|||
|
||||
<form *ngIf="!loading" class="command-group-form" (ngSubmit)="onSubmit()">
|
||||
<mat-form-field>
|
||||
<mat-label>Nombre del Grupo</mat-label>
|
||||
<mat-label>{{ 'groupNameLabel' | translate }}</mat-label>
|
||||
<input matInput [(ngModel)]="groupName" name="groupName" required />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-slide-toggle [(ngModel)]="enabled" name="enabled">Habilitado</mat-slide-toggle>
|
||||
<mat-slide-toggle [(ngModel)]="enabled" name="enabled">{{ 'enabledToggle' | translate }}</mat-slide-toggle>
|
||||
|
||||
<div class="command-selection">
|
||||
<div class="available-commands">
|
||||
<h3>Comandos Disponibles</h3>
|
||||
<h3>{{ 'availableCommandsTitle' | translate }}</h3>
|
||||
<div class="table-wrapper">
|
||||
<table mat-table [dataSource]="availableCommands" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="name">
|
||||
<th mat-header-cell *matHeaderCellDef> Nombre </th>
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'nameColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let command"> {{ command.name }} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef> Acciones </th>
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'actionsColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let command">
|
||||
<button mat-icon-button type="button" (click)="addCommand(command)">
|
||||
<mat-icon>add</mat-icon>
|
||||
|
@ -38,7 +38,7 @@
|
|||
</div>
|
||||
|
||||
<div class="selected-commands">
|
||||
<h3>Comandos Seleccionados</h3>
|
||||
<h3>{{ 'selectedCommandsTitle' | translate }}</h3>
|
||||
<div class="selected-commands-list" cdkDropList (cdkDropListDropped)="drop($event)">
|
||||
<div class="commands-container">
|
||||
<div *ngFor="let command of selectedCommands" cdkDrag>
|
||||
|
@ -56,6 +56,6 @@
|
|||
</mat-dialog-content>
|
||||
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="close()">Cancelar</button>
|
||||
<button mat-button (click)="onSubmit()" cdkFocusInitial> Guardar </button>
|
||||
<button mat-button (click)="close()">{{ 'buttonCancel' | translate }}</button>
|
||||
<button mat-button (click)="onSubmit()" cdkFocusInitial>{{ 'buttonSave' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<div class="detail-command-group-container">
|
||||
<h2>Detalles del Grupo de Comandos</h2>
|
||||
<h2>{{ 'commandGroupDetailsTitle' | translate }}</h2>
|
||||
|
||||
<!-- Indicador de carga -->
|
||||
<div *ngIf="loading" class="loading-container">
|
||||
|
@ -9,17 +9,17 @@
|
|||
<mat-card *ngIf="!loading">
|
||||
<mat-card-header>
|
||||
<mat-card-title>{{ data.name }}</mat-card-title>
|
||||
<mat-card-subtitle>Creado por: {{ data.createdBy }}</mat-card-subtitle>
|
||||
<mat-card-subtitle>{{ 'createdBy' | translate }}: {{ data.createdBy }}</mat-card-subtitle>
|
||||
</mat-card-header>
|
||||
|
||||
<mat-card-content>
|
||||
<p><strong>ID del Grupo:</strong> {{ data.uuid }}</p>
|
||||
<p><strong>Fecha de Creación:</strong> {{ data.createdAt | date:'short' }}</p>
|
||||
<p><strong>{{ 'groupId' | translate }}:</strong> {{ data.uuid }}</p>
|
||||
<p><strong>{{ 'creationDate' | translate }}:</strong> {{ data.createdAt | date:'short' }}</p>
|
||||
|
||||
<h3>Comandos Incluidos:</h3>
|
||||
<h3>{{ 'includedCommands' | translate }}</h3>
|
||||
<table mat-table [dataSource]="data.commands" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="name">
|
||||
<th mat-header-cell *matHeaderCellDef> Nombre </th>
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'nameColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let command"> {{ command.name }} </td>
|
||||
</ng-container>
|
||||
|
||||
|
@ -37,16 +37,16 @@
|
|||
<!-- Sección para seleccionar clientes -->
|
||||
<div class="additional-section" *ngIf="showClientSelect && !loading">
|
||||
<form [formGroup]="form">
|
||||
<h4>Selecciona los clientes:</h4>
|
||||
<h4>{{ 'selectClients' | translate }}</h4>
|
||||
<mat-form-field appearance="fill">
|
||||
<mat-label>Clientes</mat-label>
|
||||
<mat-label>{{ 'clientsLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="selectedClients" multiple (selectionChange)="onClientSelectionChange($event)">
|
||||
<mat-option *ngFor="let client of clients" [value]="client.uuid">
|
||||
{{ client.name }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error *ngIf="form.get('selectedClients')?.invalid && form.get('selectedClients')?.touched">
|
||||
Debes seleccionar al menos un cliente.
|
||||
{{ 'selectAtLeastOneClient' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
|
@ -54,8 +54,8 @@
|
|||
|
||||
<div class="command-group-actions" *ngIf="!loading">
|
||||
<button mat-flat-button color="primary" (click)="toggleClientSelect()">
|
||||
{{ showClientSelect ? 'Ejecutar' : 'Programar Ejecución' }}
|
||||
{{ showClientSelect ? ('execute' | translate) : ('scheduleExecution' | translate) }}
|
||||
</button>
|
||||
<button mat-flat-button color="warn" (click)="close()">Cancelar</button>
|
||||
<button mat-flat-button color="warn" (click)="close()">{{ 'buttonCancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -2,57 +2,63 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" joyrideStep="titleStep" text="Desde aquí puedes gestionar las tareas de manera centralizada.">Administrar Tareas</h2>
|
||||
<h2 class="title" joyrideStep="titleStep" text="{{ 'titleStepText' | translate }}">{{ 'manageTasksTitle' | translate }}</h2>
|
||||
<div class="task-button-row">
|
||||
<button mat-flat-button color="primary" (click)="openCreateTaskModal()" joyrideStep="addTaskStep" text="Haz clic para añadir una nueva tarea.">Añadir Tarea</button>
|
||||
<button mat-flat-button color="primary" (click)="openCreateTaskModal()" joyrideStep="addTaskStep" text="{{ 'addTaskStepText' | translate }}">
|
||||
{{ 'addTask' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="search-container" joyrideStep="searchStep" text="Busca una tarea específica ingresando su nombre y pulsando 'Enter'.">
|
||||
<div class="search-container" joyrideStep="searchStep" text="{{ 'searchStepText' | translate }}">
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label>Buscar tarea</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" />
|
||||
<mat-label>{{ 'searchTaskLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="{{ 'searchPlaceholder' | translate }}" [(ngModel)]="filters['name']" (keyup.enter)="search()" />
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint>Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint>{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<div *ngIf="!loading">
|
||||
<table mat-table [dataSource]="tasks" class="mat-elevation-z8" joyrideStep="tableStep" text="Aquí se muestra la lista de tareas disponibles.">
|
||||
<table mat-table [dataSource]="tasks" class="mat-elevation-z8" joyrideStep="tableStep" text="{{ 'tableStepText' | translate }}">
|
||||
<ng-container matColumnDef="taskid">
|
||||
<th mat-header-cell *matHeaderCellDef> Id</th>
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'idColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let task"> {{ task.id }} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="notes">
|
||||
<th mat-header-cell *matHeaderCellDef> Info</th>
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'infoColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let task"> {{ task.notes }} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="name">
|
||||
<th mat-header-cell *matHeaderCellDef> Creado por </th>
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'createdByColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let task"> {{ task.createdBy }} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="scheduledDate">
|
||||
<th mat-header-cell *matHeaderCellDef> Fecha de Ejecución </th>
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'executionDateColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let task"> {{ task.dateTime | date:'short' }} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="enabled">
|
||||
<th mat-header-cell *matHeaderCellDef> Estado </th>
|
||||
<td mat-cell *matCellDef="let task"> {{ task.enabled ? 'Habilitado' : 'Deshabilitado' }} </td>
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'statusColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let task"> {{ task.enabled ? ('enabled' | translate) : ('disabled' | translate) }} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">Acciones</th>
|
||||
<td mat-cell *matCellDef="let task" style="text-align: center;" joyrideStep="actionsStep" text="Usa estas opciones para ver, editar o eliminar una tarea.">
|
||||
<button mat-icon-button color="info" (click)="viewTaskDetails(task)"><mat-icon i18n="@@deleteElementTooltip">visibility</mat-icon></button>
|
||||
<button mat-icon-button color="primary" (click)="editTask(task)" i18n="@@editImage"><mat-icon>edit</mat-icon></button>
|
||||
<th mat-header-cell *matHeaderCellDef style="text-align: center;">{{ 'columnActions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let task" style="text-align: center;" joyrideStep="actionsStep" text="{{ 'actionsStepText' | translate }}">
|
||||
<button mat-icon-button color="info" (click)="viewTaskDetails(task)">
|
||||
<mat-icon>visibility</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="primary" (click)="editTask(task)">
|
||||
<mat-icon>edit</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="warn" (click)="deleteTask(task)">
|
||||
<mat-icon i18n="@@deleteElementTooltip">delete</mat-icon>
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
@ -62,7 +68,7 @@
|
|||
</table>
|
||||
</div>
|
||||
|
||||
<mat-paginator joyrideStep="paginationStep" text="Navega entre las páginas de tareas usando el paginador."
|
||||
<mat-paginator joyrideStep="paginationStep" text="{{ 'paginationStepText' | translate }}"
|
||||
[length]="length"
|
||||
[pageSize]="itemsPerPage"
|
||||
[pageSizeOptions]="pageSizeOptions"
|
||||
|
|
|
@ -10,6 +10,8 @@ import { FormsModule } from '@angular/forms';
|
|||
import { MatInputModule } from '@angular/material/input';
|
||||
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule, JoyrideService, JoyrideStepService } from 'ngx-joyride';
|
||||
describe('CommandsTaskComponent', () => {
|
||||
let component: CommandsTaskComponent;
|
||||
let fixture: ComponentFixture<CommandsTaskComponent>;
|
||||
|
@ -25,7 +27,9 @@ describe('CommandsTaskComponent', () => {
|
|||
MatPaginatorModule,
|
||||
FormsModule,
|
||||
MatInputModule,
|
||||
BrowserAnimationsModule
|
||||
BrowserAnimationsModule,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
],
|
||||
declarations: [CommandsTaskComponent],
|
||||
schemas: [NO_ERRORS_SCHEMA]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<h2 mat-dialog-title class="dialog-title">{{ editing ? 'Editar Tarea' : 'Crear Tarea' }}</h2>
|
||||
<h2 mat-dialog-title class="dialog-title">{{ editing ? ('editTask' | translate) : ('createTask' | translate) }}</h2>
|
||||
|
||||
<form [formGroup]="taskForm" class="task-form">
|
||||
<mat-dialog-content>
|
||||
|
@ -10,20 +10,27 @@
|
|||
<textarea matInput formControlName="notes" placeholder="Ingresa tus notas aquí"></textarea>
|
||||
</mat-form-field>
|
||||
|
||||
<h3 class="section-title">Seleccón de comandos</h3>
|
||||
<h3 class="section-title">{{ 'informationSectionTitle' | translate }}</h3>
|
||||
<mat-divider></mat-divider>
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Selecciona Comandos</mat-label>
|
||||
<mat-label>{{ 'informationLabel' | translate }}</mat-label>
|
||||
<textarea matInput formControlName="notes" placeholder="{{ 'notesPlaceholder' | translate }}"></textarea>
|
||||
</mat-form-field>
|
||||
|
||||
<h3 class="section-title">{{ 'commandSelectionSectionTitle' | translate }}</h3>
|
||||
<mat-divider></mat-divider>
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>{{ 'selectCommandsLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="commandGroup" (selectionChange)="onCommandGroupChange()">
|
||||
<mat-option *ngFor="let group of availableCommandGroups" [value]="group.uuid">
|
||||
{{ group.name }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error *ngIf="taskForm.get('commandGroup')?.invalid">Este campo es obligatorio</mat-error>
|
||||
<mat-error *ngIf="taskForm.get('commandGroup')?.invalid">{{ 'requiredFieldError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Selecciona Comandos Individuales (Opcional)</mat-label>
|
||||
<mat-label>{{ 'selectIndividualCommandsLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="extraCommands" multiple>
|
||||
<mat-option *ngFor="let command of availableIndividualCommands" [value]="command.uuid">
|
||||
{{ command.name }}
|
||||
|
@ -31,36 +38,36 @@
|
|||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<h3 class="section-title">Fecha y hora de ejecución</h3>
|
||||
<h3 class="section-title">{{ 'executionDateTimeSectionTitle' | translate }}</h3>
|
||||
<mat-divider></mat-divider>
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Fecha de Ejecución</mat-label>
|
||||
<input matInput [matDatepicker]="picker" formControlName="date" placeholder="Selecciona una fecha">
|
||||
<mat-label>{{ 'executionDateLabel' | translate }}</mat-label>
|
||||
<input matInput [matDatepicker]="picker" formControlName="date" placeholder="{{ 'selectDatePlaceholder' | translate }}">
|
||||
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
|
||||
<mat-datepicker #picker></mat-datepicker>
|
||||
<mat-error *ngIf="taskForm.get('date')?.invalid">Este campo es obligatorio</mat-error>
|
||||
<mat-error *ngIf="taskForm.get('date')?.invalid">{{ 'requiredFieldError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Hora de Ejecución</mat-label>
|
||||
<input matInput type="time" formControlName="time" placeholder="Selecciona una hora">
|
||||
<mat-error *ngIf="taskForm.get('time')?.invalid">Este campo es obligatorio</mat-error>
|
||||
<mat-label>{{ 'executionTimeLabel' | translate }}</mat-label>
|
||||
<input matInput type="time" formControlName="time" placeholder="{{ 'selectTimePlaceholder' | translate }}">
|
||||
<mat-error *ngIf="taskForm.get('time')?.invalid">{{ 'requiredFieldError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<h3 class="section-title">Selecciona destino</h3>
|
||||
<h3 class="section-title">{{ 'destinationSelectionSectionTitle' | translate }}</h3>
|
||||
<mat-divider></mat-divider>
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Selecciona Unidad Organizacional</mat-label>
|
||||
<mat-label>{{ 'selectOrganizationalUnitLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="organizationalUnit" (selectionChange)="onOrganizationalUnitChange()">
|
||||
<mat-option *ngFor="let unit of availableOrganizationalUnits" [value]="unit['@id']">
|
||||
{{ unit.name }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error *ngIf="taskForm.get('organizationalUnit')?.invalid">Este campo es obligatorio</mat-error>
|
||||
<mat-error *ngIf="taskForm.get('organizationalUnit')?.invalid">{{ 'requiredFieldError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Selecciona Aula</mat-label>
|
||||
<mat-label>{{ 'selectClassroomLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="selectedChild" (selectionChange)="onChildChange()">
|
||||
<mat-option *ngFor="let child of selectedUnitChildren" [value]="child['@id']">
|
||||
{{ child.name }}
|
||||
|
@ -68,6 +75,22 @@
|
|||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>{{ 'selectClientsLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="selectedClients" multiple>
|
||||
<mat-option (click)="toggleSelectAll()" [selected]="areAllSelected()">
|
||||
{{ 'selectAllClients' | translate }}
|
||||
</mat-option>
|
||||
<mat-option *ngFor="let client of selectedClients" [value]="client.uuid">
|
||||
{{ client.name }} ({{ client.ip }})
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<div class="button-container">
|
||||
<button mat-raised-button color="primary" (click)="saveTask()">{{ 'buttonSave' | translate }}</button>
|
||||
</div>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Selecciona Clientes</mat-label>
|
||||
<mat-select formControlName="selectedClients" multiple>
|
||||
|
|
|
@ -1,56 +1,55 @@
|
|||
<div class="detail-task-container">
|
||||
<h2>Detalles de la Tarea</h2>
|
||||
<h2>{{ 'taskDetailsTitle' | translate }}</h2>
|
||||
|
||||
<mat-card>
|
||||
<mat-card-header>
|
||||
<mat-card-subtitle>Creado por: {{ task.createdBy }}</mat-card-subtitle>
|
||||
</mat-card-header>
|
||||
<mat-card>
|
||||
<mat-card-header>
|
||||
<mat-card-subtitle>{{ 'createdBy' | translate }}: {{ task.createdBy }}</mat-card-subtitle>
|
||||
</mat-card-header>
|
||||
|
||||
<mat-card-content>
|
||||
<p><strong>ID de la Tarea:</strong> {{ task.uuid }}</p>
|
||||
<p><strong>Estado:</strong> {{ task.status }}</p>
|
||||
<p><strong>Fecha de Creación:</strong> {{ task.createdAt | date: 'short' }}</p>
|
||||
<p><strong>Notas:</strong> {{ task.notes }}</p>
|
||||
<mat-card-content>
|
||||
<p><strong>{{ 'taskId' | translate }}:</strong> {{ task.uuid }}</p>
|
||||
<p><strong>{{ 'status' | translate }}:</strong> {{ task.status }}</p>
|
||||
<p><strong>{{ 'creationDate' | translate }}:</strong> {{ task.createdAt | date: 'short' }}</p>
|
||||
<p><strong>{{ 'notes' | translate }}:</strong> {{ task.notes }}</p>
|
||||
|
||||
<h3>Grupos de Comandos Incluidos:</h3>
|
||||
<table mat-table [dataSource]="task.commandGroups" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="name">
|
||||
<th mat-header-cell *matHeaderCellDef> Grupo de Comandos </th>
|
||||
<td mat-cell *matCellDef="let group"> {{ group.name }} </td>
|
||||
<h3>{{ 'includedCommandGroups' | translate }}</h3>
|
||||
<table mat-table [dataSource]="task.commandGroups" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="name">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'commandGroupColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let group"> {{ group.name }} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="uuid">
|
||||
<th mat-header-cell *matHeaderCellDef> UUID </th>
|
||||
<td mat-cell *matCellDef="let group"> {{ group.uuid }} </td>
|
||||
</ng-container>
|
||||
|
||||
<tr mat-header-row *matHeaderRowDef="['name', 'uuid']"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: ['name', 'uuid'];"></tr>
|
||||
</table>
|
||||
|
||||
<h3>{{ 'commandsToExecute' | translate }}</h3>
|
||||
<div *ngFor="let group of task.commandGroups">
|
||||
<p><strong>{{ 'group' | translate }}: </strong>{{ group.name }}</p>
|
||||
<table mat-table [dataSource]="group.commands" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="commandName">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'commandColumn' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let command"> {{ command.name }} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="uuid">
|
||||
<ng-container matColumnDef="commandUuid">
|
||||
<th mat-header-cell *matHeaderCellDef> UUID </th>
|
||||
<td mat-cell *matCellDef="let group"> {{ group.uuid }} </td>
|
||||
<td mat-cell *matCellDef="let command"> {{ command.uuid }} </td>
|
||||
</ng-container>
|
||||
|
||||
<tr mat-header-row *matHeaderRowDef="['name', 'uuid']"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: ['name', 'uuid'];"></tr>
|
||||
<tr mat-header-row *matHeaderRowDef="['commandName', 'commandUuid']"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: ['commandName', 'commandUuid'];"></tr>
|
||||
</table>
|
||||
</div>
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
|
||||
<h3>Comandos a ejecutar:</h3>
|
||||
<div *ngFor="let group of task.commandGroups">
|
||||
<p><strong>Grupo: </strong>{{ group.name }}</p>
|
||||
<table mat-table [dataSource]="group.commands" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="commandName">
|
||||
<th mat-header-cell *matHeaderCellDef> Comando </th>
|
||||
<td mat-cell *matCellDef="let command"> {{ command.name }} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="commandUuid">
|
||||
<th mat-header-cell *matHeaderCellDef> UUID </th>
|
||||
<td mat-cell *matCellDef="let command"> {{ command.uuid }} </td>
|
||||
</ng-container>
|
||||
|
||||
<tr mat-header-row *matHeaderRowDef="['commandName', 'commandUuid']"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: ['commandName', 'commandUuid'];"></tr>
|
||||
</table>
|
||||
</div>
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
|
||||
<div class="task-actions">
|
||||
<button mat-flat-button class="cancel-button" (click)="closeDialog()">Cerrar</button>
|
||||
</div>
|
||||
<div class="task-actions">
|
||||
<button mat-flat-button class="cancel-button" (click)="closeDialog()">{{ 'buttonClose' | translate }}</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -2,17 +2,19 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" i18n="@@adminCommandsTitle" joyrideStep="titleStep" text="Desde aquí puedes ver las trazas y logs de las ejecuciones de comandos y procedimientos.">Trazas de comandos y procedimientos</h2>
|
||||
<h2 class="title" joyrideStep="titleStep" text="{{ 'titleStepText' | translate }}">{{ 'adminCommandsTitle' | translate }}</h2>
|
||||
<div class="images-button-row">
|
||||
<button mat-flat-button color="primary" (click)="resetFilters()" joyrideStep="resetFiltersStep" text="Haz clic para reiniciar los filtros aplicados y ver todas las trazas.">Reiniciar filtros</button>
|
||||
<button mat-flat-button color="primary" (click)="resetFilters()" joyrideStep="resetFiltersStep" text="{{ 'resetFiltersStepText' | translate }}">
|
||||
{{ 'resetFilters' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="search-container">
|
||||
<mat-form-field appearance="fill" class="search-select" joyrideStep="clientSelectStep" text="Selecciona un cliente para ver las trazas asociadas.">
|
||||
<input type="text" matInput [formControl]="clientControl" [matAutocomplete]="clientAuto" placeholder="Seleccione un cliente">
|
||||
<mat-form-field appearance="fill" class="search-select" joyrideStep="clientSelectStep" text="{{ 'clientSelectStepText' | translate }}">
|
||||
<input type="text" matInput [formControl]="clientControl" [matAutocomplete]="clientAuto" placeholder="{{ 'selectClientPlaceholder' | translate }}">
|
||||
<mat-autocomplete #clientAuto="matAutocomplete" [displayWith]="displayFnClient" (optionSelected)="onOptionClientSelected($event.option.value)">
|
||||
<mat-option *ngFor="let client of filteredClients | async" [value]="client">
|
||||
{{ client.name }}
|
||||
|
@ -20,8 +22,8 @@
|
|||
</mat-autocomplete>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="search-select" joyrideStep="commandSelectStep" text="Selecciona un comando para ver las trazas específicas de ese comando.">
|
||||
<input type="text" matInput [formControl]="commandControl" [matAutocomplete]="commandAuto" placeholder="Seleccione un comando">
|
||||
<mat-form-field appearance="fill" class="search-select" joyrideStep="commandSelectStep" text="{{ 'commandSelectStepText' | translate }}">
|
||||
<input type="text" matInput [formControl]="commandControl" [matAutocomplete]="commandAuto" placeholder="{{ 'selectCommandPlaceholder' | translate }}">
|
||||
<mat-autocomplete #commandAuto="matAutocomplete" [displayWith]="displayFnCommand" (optionSelected)="onOptionCommandSelected($event.option.value)">
|
||||
<mat-option *ngFor="let command of filteredCommands | async" [value]="command">
|
||||
{{ command.name }}
|
||||
|
@ -45,7 +47,7 @@
|
|||
</div>
|
||||
|
||||
<div *ngIf="!loading">
|
||||
<table mat-table [dataSource]="traces" class="mat-elevation-z8" joyrideStep="tableStep" text="Aquí se muestra la lista de trazas de comandos y procedimientos, según los filtros aplicados.">
|
||||
<table mat-table [dataSource]="traces" class="mat-elevation-z8" joyrideStep="tableStep" text="{{ 'tableStepText' | translate }}">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
<td mat-cell *matCellDef="let trace">
|
||||
|
@ -79,7 +81,7 @@
|
|||
</table>
|
||||
</div>
|
||||
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="Navega entre las páginas de trazas usando el paginador.">
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="{{ 'paginationStepText' | translate }}">
|
||||
<mat-paginator [length]="length"
|
||||
[pageSize]="itemsPerPage"
|
||||
[pageIndex]="page"
|
||||
|
|
|
@ -2,29 +2,29 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" i18n="@@adminCommandsTitle" joyrideStep="titleStep" text="Desde aquí puedes gestionar los comandos disponibles.">Administrar Comandos</h2>
|
||||
<div class="command-button-row" joyrideStep="addCommandStep" text="Haz clic para añadir un nuevo comando.">
|
||||
<button mat-flat-button color="primary" (click)="openCreateCommandModal()" >Añadir Comando</button>
|
||||
<h2 class="title" joyrideStep="titleStep" text="{{ 'titleStepText' | translate }}">{{ 'CommandsTitle' | translate }}</h2>
|
||||
<div class="command-button-row" joyrideStep="addCommandStep" text="{{ 'addCommandStepText' | translate }}">
|
||||
<button mat-flat-button color="primary" (click)="openCreateCommandModal()">{{ 'addCommand' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="search-container" joyrideStep="searchStep" text="Busca un comando específico ingresando su nombre y pulsando 'Enter'.">
|
||||
<div class="search-container" joyrideStep="searchStep" text="{{ 'searchStepText' | translate }}">
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label i18n="@@searchLabel">Buscar nombre de comando</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-label>{{ 'searchCommandLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="{{ 'searchPlaceholder' | translate }}" [(ngModel)]="filters['name']" (keyup.enter)="search()" />
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint>{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<div *ngIf="loading" class="loading-container" joyrideStep="loadingStep" text="Espera mientras se cargan los comandos.">
|
||||
<div *ngIf="loading" class="loading-container" joyrideStep="loadingStep" text="{{ 'loadingStepText' | translate }}">
|
||||
<mat-spinner></mat-spinner>
|
||||
</div>
|
||||
|
||||
<div *ngIf="!loading">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="Aquí se muestra la lista de comandos disponibles.">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="{{ 'tableStepText' | translate }}">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
<td mat-cell *matCellDef="let command">
|
||||
|
@ -39,12 +39,12 @@
|
|||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">Acciones</th>
|
||||
<td mat-cell *matCellDef="let command" style="text-align: center;" joyrideStep="actionsStep" text="Usa estos botones para ejecutar, ver, editar o eliminar un comando.">
|
||||
<th mat-header-cell *matHeaderCellDef style="text-align: center;">{{ 'columnActions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let command" style="text-align: center;" joyrideStep="actionsStep" text="{{ 'actionsStepText' | translate }}">
|
||||
<button mat-icon-button color="info" (click)="executeCommand($event, command)"><mat-icon>play_arrow</mat-icon></button>
|
||||
<button mat-icon-button color="info" (click)="viewDetails($event, command)"><mat-icon i18n="@@deleteElementTooltip">visibility</mat-icon></button>
|
||||
<button mat-icon-button color="primary" [disabled]="command.readOnly" (click)="editCommand($event, command)" i18n="@@editImage"><mat-icon>edit</mat-icon></button>
|
||||
<button mat-icon-button color="warn" [disabled]="command.readOnly" (click)="deleteCommand($event, command)"><mat-icon i18n="@@deleteElementTooltip">delete</mat-icon></button>
|
||||
<button mat-icon-button color="info" (click)="viewDetails($event, command)"><mat-icon>visibility</mat-icon></button>
|
||||
<button mat-icon-button color="primary" [disabled]="command.readOnly" (click)="editCommand($event, command)"><mat-icon>edit</mat-icon></button>
|
||||
<button mat-icon-button color="warn" [disabled]="command.readOnly" (click)="deleteCommand($event, command)"><mat-icon>delete</mat-icon></button>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
|
@ -53,7 +53,7 @@
|
|||
</table>
|
||||
</div>
|
||||
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="Navega entre las páginas de comandos usando el paginador.">
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="{{ 'paginationStepText' | translate }}">
|
||||
<mat-paginator [length]="length"
|
||||
[pageSize]="itemsPerPage"
|
||||
[pageIndex]="page"
|
||||
|
|
|
@ -17,6 +17,8 @@ import { MatSelectModule } from '@angular/material/select';
|
|||
import { MatTooltipModule } from '@angular/material/tooltip';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { NgxChartsModule } from '@swimlane/ngx-charts';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
|
||||
describe('CommandsComponent', () => {
|
||||
let component: CommandsComponent;
|
||||
|
@ -44,7 +46,9 @@ describe('CommandsComponent', () => {
|
|||
ReactiveFormsModule,
|
||||
MatSelectModule,
|
||||
NgxChartsModule,
|
||||
DatePipe
|
||||
DatePipe,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
],
|
||||
providers: [
|
||||
{ provide: MatDialogRef, useValue: {} },
|
||||
|
|
|
@ -1,30 +1,29 @@
|
|||
<h2 mat-dialog-title>{{ commandId ? 'Editar' : 'Crear' }} Comando</h2>
|
||||
<h2 mat-dialog-title>{{ commandId ? ('editCommandTitle' | translate) : ('createCommandTitle' | translate) }}</h2>
|
||||
<mat-dialog-content class="form-container">
|
||||
<form [formGroup]="createCommandForm" (ngSubmit)="onSubmit()" class="command-form">
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Nombre</mat-label>
|
||||
<input matInput formControlName="name" placeholder="Nombre del comando" required>
|
||||
<mat-label>{{ 'nameLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="name" placeholder="{{ 'commandNamePlaceholder' | translate }}" required>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Script</mat-label>
|
||||
<textarea matInput formControlName="script" placeholder="Script del comando"></textarea>
|
||||
<mat-label>{{ 'scriptLabel' | translate }}</mat-label>
|
||||
<textarea matInput formControlName="script" placeholder="{{ 'commandScriptPlaceholder' | translate }}"></textarea>
|
||||
</mat-form-field>
|
||||
|
||||
<div class="checkbox-group">
|
||||
<mat-checkbox formControlName="readOnly">Solo lectura</mat-checkbox>
|
||||
<mat-checkbox formControlName="enabled">Habilitado</mat-checkbox>
|
||||
<mat-checkbox formControlName="readOnly">{{ 'readOnlyLabel' | translate }}</mat-checkbox>
|
||||
<mat-checkbox formControlName="enabled">{{ 'enabledLabel' | translate }}</mat-checkbox>
|
||||
</div>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Comentarios</mat-label>
|
||||
<textarea matInput formControlName="comments" placeholder="Comentarios"></textarea>
|
||||
<mat-label>{{ 'commentsLabel' | translate }}</mat-label>
|
||||
<textarea matInput formControlName="comments" placeholder="{{ 'commentsPlaceholder' | translate }}"></textarea>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
</mat-dialog-content>
|
||||
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="onCancel($event)">Cancelar</button>
|
||||
<button mat-button (click)="onSubmit()" cdkFocusInitial> Guardar </button>
|
||||
<button mat-button (click)="onCancel($event)">{{ 'buttonCancel' | translate }}</button>
|
||||
<button mat-button (click)="onSubmit()" cdkFocusInitial>{{ 'buttonSave' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
||||
|
|
|
@ -7,11 +7,13 @@ import { ToastrService, ToastrModule } from 'ngx-toastr';
|
|||
import { DataService } from '../data.service';
|
||||
import { CreateCommandComponent } from './create-command.component';
|
||||
import { MatDialogModule } from '@angular/material/dialog';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field'; // Import for mat-form-field
|
||||
import { MatInputModule } from '@angular/material/input'; // Import for matInput
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox'; // Import for mat-checkbox
|
||||
import { MatButtonModule } from '@angular/material/button'; // Import for mat-button
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
describe('CreateCommandComponent', () => {
|
||||
let component: CreateCommandComponent;
|
||||
let fixture: ComponentFixture<CreateCommandComponent>;
|
||||
|
@ -28,6 +30,7 @@ describe('CreateCommandComponent', () => {
|
|||
MatButtonModule,
|
||||
BrowserAnimationsModule,
|
||||
ToastrModule.forRoot(),
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
FormBuilder,
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
<div class="modal-container">
|
||||
<h3 class="modal-title">Detalles del Comando</h3>
|
||||
<h3 class="modal-title">{{ 'commandDetailsTitle' | translate }}</h3>
|
||||
<div class="modal-content">
|
||||
<p><strong>Nombre:</strong> {{ data.name }}</p>
|
||||
<p><strong>Comentarios:</strong> {{ data.comments }}</p>
|
||||
<p><strong>Creado por:</strong> {{ data.createdBy }}</p>
|
||||
<p><strong>Fecha de Creación:</strong> {{ data.createdAt | date:'medium' }}</p>
|
||||
<p><strong>{{ 'nameLabel' | translate }}:</strong> {{ data.name }}</p>
|
||||
<p><strong>{{ 'commentsLabel' | translate }}:</strong> {{ data.comments }}</p>
|
||||
<p><strong>{{ 'createdByLabel' | translate }}:</strong> {{ data.createdBy }}</p>
|
||||
<p><strong>{{ 'creationDateLabel' | translate }}:</strong> {{ data.createdAt | date:'medium' }}</p>
|
||||
|
||||
<div class="script-display">
|
||||
<h4>Script:</h4>
|
||||
<h4>{{ 'scriptLabel' | translate }}:</h4>
|
||||
<pre>{{ data.script }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="additional-section" *ngIf="showClientSelect">
|
||||
<form [formGroup]="form">
|
||||
<h4>Selecciona los clientes:</h4>
|
||||
<h4>{{ 'selectClientsTitle' | translate }}</h4>
|
||||
<mat-form-field appearance="fill">
|
||||
<mat-label>Clientes</mat-label>
|
||||
<mat-label>{{ 'clientsLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="selectedClients" multiple (selectionChange)="onClientSelectionChange($event)">
|
||||
<mat-option *ngFor="let client of clients" [value]="client.uuid">
|
||||
{{ client.name }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error *ngIf="form.get('selectedClients')?.invalid && form.get('selectedClients')?.touched">
|
||||
Debes seleccionar al menos un cliente.
|
||||
{{ 'selectAtLeastOneClientError' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
|
|
|
@ -1,24 +1,24 @@
|
|||
<h2 mat-dialog-title>Ejecutar Comando</h2>
|
||||
<h2 mat-dialog-title>{{ 'executeCommandTitle' | translate }}</h2>
|
||||
|
||||
<mat-dialog-content class="form-container">
|
||||
<form [formGroup]="form" class="command-form">
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Unidad Organizativa</mat-label>
|
||||
<mat-label>{{ 'organizationalUnitLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="unit">
|
||||
<mat-option *ngFor="let unit of units" [value]="unit.uuid">{{ unit.name }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Subunidad Organizativa</mat-label>
|
||||
<mat-label>{{ 'subOrganizationalUnitLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="childUnit">
|
||||
<mat-option *ngFor="let child of childUnits" [value]="child.uuid">{{ child.name }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<div class="checkbox-group">
|
||||
<label>Clientes (PC)</label>
|
||||
<label>{{ 'clientsLabel' | translate }}</label>
|
||||
<div *ngIf="clients.length > 0">
|
||||
<mat-checkbox *ngFor="let client of clients"
|
||||
(change)="toggleClientSelection(client.uuid)"
|
||||
|
@ -27,7 +27,7 @@
|
|||
</mat-checkbox>
|
||||
</div>
|
||||
<div *ngIf="clients.length === 0">
|
||||
<p>No hay clientes disponibles</p>
|
||||
<p>{{ 'noClientsAvailable' | translate }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -35,6 +35,6 @@
|
|||
</mat-dialog-content>
|
||||
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="closeModal()">Cancelar</button>
|
||||
<button mat-button (click)="executeCommand()" [disabled]="!form.get('clientSelection')?.value.length">Ejecutar</button>
|
||||
<button mat-button (click)="closeModal()">{{ 'buttonCancel' | translate }}</button>
|
||||
<button mat-button (click)="executeCommand()" [disabled]="!form.get('clientSelection')?.value.length">{{ 'buttonExecute' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -1,6 +1,20 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { ExecuteCommandComponent } from './execute-command.component';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { ReactiveFormsModule, FormsModule, FormBuilder } from '@angular/forms';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ToastrModule, ToastrService } from 'ngx-toastr';
|
||||
import { DataService } from '../data.service';
|
||||
|
||||
describe('ExecuteCommandComponent', () => {
|
||||
let component: ExecuteCommandComponent;
|
||||
|
@ -8,7 +22,36 @@ describe('ExecuteCommandComponent', () => {
|
|||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ExecuteCommandComponent]
|
||||
declarations: [ExecuteCommandComponent],
|
||||
imports: [
|
||||
ReactiveFormsModule,
|
||||
FormsModule,
|
||||
MatDialogModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
MatCheckboxModule,
|
||||
MatButtonModule,
|
||||
BrowserAnimationsModule,
|
||||
MatTableModule,
|
||||
MatSelectModule,
|
||||
ToastrModule.forRoot(),
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
FormBuilder,
|
||||
ToastrService,
|
||||
DataService,
|
||||
provideHttpClient(),
|
||||
provideHttpClientTesting(),
|
||||
{
|
||||
provide: MatDialogRef,
|
||||
useValue: {}
|
||||
},
|
||||
{
|
||||
provide: MAT_DIALOG_DATA,
|
||||
useValue: {}
|
||||
}
|
||||
]
|
||||
})
|
||||
.compileComponents();
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
.groupLists-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
height: auto;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
|
@ -11,10 +10,6 @@
|
|||
margin: 10px;
|
||||
}
|
||||
|
||||
.search-container mat-form-field {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.card {
|
||||
flex-grow: 1;
|
||||
margin: 10px;
|
||||
|
@ -28,114 +23,10 @@
|
|||
padding: 10px;
|
||||
}
|
||||
|
||||
.unidad-card, .elements-card {
|
||||
flex: 1 1 45%;
|
||||
background-color: #fafafa;
|
||||
height: 600px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.element-content {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.title {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.details-card, .classroom-view {
|
||||
flex: 1 1 25%;
|
||||
}
|
||||
|
||||
mat-card-title {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.title-with-breadcrumb {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
mat-card-subtitle {
|
||||
font-size: 0.875rem;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
}
|
||||
|
||||
mat-card-subtitle a {
|
||||
cursor: pointer;
|
||||
text-decoration: underline;
|
||||
color: #929292;
|
||||
}
|
||||
|
||||
mat-card-subtitle a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.groups-button-row {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.button-group {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.button-group button {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.item-content {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.clickable-item:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.selected-item {
|
||||
background-color: #e0e0e0;
|
||||
}
|
||||
|
||||
.actions {
|
||||
display: flex;
|
||||
margin-left: auto;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.actions mat-icon {
|
||||
cursor: pointer;
|
||||
margin-left: 16px;
|
||||
color: #757575;
|
||||
}
|
||||
|
||||
.actions mat-icon:hover {
|
||||
color: #212121;
|
||||
}
|
||||
|
||||
.empty-list {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
mat-spinner {
|
||||
margin: 0 auto;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.classroomBtn-container {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
@ -163,14 +54,6 @@ mat-spinner {
|
|||
width: 300px;
|
||||
}
|
||||
|
||||
.saved-filter {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 300px;
|
||||
margin-bottom: 10px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.results {
|
||||
width: 100%;
|
||||
}
|
||||
|
@ -194,9 +77,21 @@ mat-spinner {
|
|||
margin: 10px 10px 10px 10px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.result-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
padding: 16px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
background-color: #fff;
|
||||
max-width: 300px;
|
||||
margin: 8px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.result-card {
|
||||
|
@ -226,53 +121,77 @@ mat-spinner {
|
|||
}
|
||||
}
|
||||
|
||||
.result-container:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.result-title {
|
||||
font-size: 1rem;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
margin-bottom: 5px;
|
||||
font-size: 1.25rem;
|
||||
font-weight: bold;
|
||||
margin: 8px 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.result-content {
|
||||
padding-top: 5px;
|
||||
color: #555;
|
||||
font-size: 0.85rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.result-type, .result-ip, .result-mac, .result-status, .result-internal-units, .result-clients {
|
||||
font-size: 0.8rem;
|
||||
margin: 2px 0;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
.result-type,
|
||||
.result-ip,
|
||||
.result-mac,
|
||||
.result-status,
|
||||
.result-internal-units,
|
||||
.result-clients {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.result-checkbox {
|
||||
align-self: flex-start;
|
||||
margin: 0 0 5px 0;
|
||||
margin-bottom: 8px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.result-card:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15);
|
||||
.card-og-live {
|
||||
background-color: #4caf50;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.paginator-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-bottom: 30px;
|
||||
.card-busy {
|
||||
background-color: #f44336;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.card-windows {
|
||||
background-color: #2196f3;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.card-linux {
|
||||
background-color: #9c27b0;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.card-macos {
|
||||
background-color: #ff9800;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.card-off {
|
||||
background-color: #9e9e9e;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.divider {
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
mat-card {
|
||||
margin-bottom: 20px;
|
||||
margin-right: 20px;
|
||||
background-color: #fff;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
||||
button {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.red-card {
|
||||
|
@ -342,6 +261,12 @@ mat-card {
|
|||
height: auto;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.result-container {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Estilo general para la tarjeta */
|
||||
.result-card {
|
||||
border-radius: 8px;
|
||||
|
|
|
@ -1,12 +1,6 @@
|
|||
|
||||
<div class="header-container">
|
||||
<h2 class="title" i18n="@@searchTitle" joyrideStep="title2Step" text="Aquí puedes realizar una búsqueda avanzada.">Búsqueda avanzada</h2>
|
||||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
<h2 class="title" i18n="@@searchTitle">Búsqueda avanzada</h2>
|
||||
<div class="container">
|
||||
<div class="header" joyrideStep="filterSelectionStep" text="Selecciona entre los filtros guardados para ajustar los resultados de la búsqueda.">
|
||||
<div class="header">
|
||||
<mat-form-field>
|
||||
<mat-label i18n="@@selectFilterLabel">Seleccione filtro</mat-label>
|
||||
<mat-select (selectionChange)="loadSelectedFilter($event.value)">
|
||||
|
@ -16,7 +10,6 @@
|
|||
</mat-select>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="view-mode-buttons" joyrideStep="viewModeStep" text="Elige cómo quieres ver los resultados: en cuadrícula o en lista.">
|
||||
|
@ -32,7 +25,7 @@
|
|||
</div>
|
||||
|
||||
<div class="main-content">
|
||||
<div class="filters" joyrideStep="filtersStep" text="Aplica filtros específicos para encontrar los resultados exactos que necesitas.">
|
||||
<div class="filters">
|
||||
<mat-form-field>
|
||||
<mat-label i18n="@@selectOptionLabel">Selecciona una opción</mat-label>
|
||||
<mat-select [(value)]="selectedFilter1" (selectionChange)="applyFilter()">
|
||||
|
@ -40,28 +33,88 @@
|
|||
<mat-option value="client" i18n="@@clientsOption">Clientes</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="example-full-width">
|
||||
<mat-label i18n="@@nameLabel">Nombre</mat-label>
|
||||
<input matInput placeholder="Unidad organizativa" (input)="applyFilter()" [(ngModel)]="filterName" i18n-placeholder="@@namePlaceholder">
|
||||
<input matInput placeholder="Unidad organizativa" (input)="applyFilter()" [(ngModel)]="filterName"
|
||||
i18n-placeholder="@@namePlaceholder">
|
||||
</mat-form-field>
|
||||
|
||||
<div class="button-group">
|
||||
<button mat-raised-button color="primary" (click)="saveFilters()" i18n="@@saveFiltersButton" joyrideStep="saveFiltersStep" text="Guarda tus filtros seleccionados para usarlos en el futuro.">Guardar Filtros</button>
|
||||
<button mat-raised-button color="accent" (click)="sendActions()" i18n="@@sendFiltersButton" [disabled]="selectedElements.length === 0" joyrideStep="sendActionStep" text="Envía una acción a los elementos seleccionados.">Enviar Acción</button>
|
||||
<button mat-flat-button color="primary" [disabled]="selectedElements.length === 0" (click)="onPxeBootFile()" joyrideStep="addPxeStep" text="Añade un archivo PXE a los elementos seleccionados.">Añadir fichero PXE</button>
|
||||
<button mat-raised-button color="primary" [matMenuTriggerFor]="menu" [disabled]="selectedFilter1 === 'ou'">
|
||||
Asistentes
|
||||
</button>
|
||||
<mat-menu #menu="matMenu">
|
||||
<button mat-menu-item [disabled]="selectedElements.length > 1 || !selectedElements.length" (click)="onCommandSelect('partition')">Asistente de particionado</button>
|
||||
<button mat-menu-item [disabled]="selectedElements.length > 1 || !selectedElements.length" (click)="onCommandSelect('create-image')">Crear una imagen</button>
|
||||
<button mat-menu-item [disabled]="selectedElements.length > 1 || !selectedElements.length" (click)="onCommandSelect('deploy-image')">Desplegar una imagen</button>
|
||||
</mat-menu>
|
||||
</div>
|
||||
</div>
|
||||
<ng-container *ngIf="selectedFilter1 === 'ou'">
|
||||
|
||||
<div class="results" joyrideStep="resultsStep" text="Aquí verás los resultados de tu búsqueda filtrada.">
|
||||
<mat-form-field [disabled]="selectedFilter1 === 'ou'">
|
||||
<mat-label i18n="@@unitTypeLabel">Tipo de unidad</mat-label>
|
||||
<mat-select [(value)]="selectedFilter2" (selectionChange)="applyFilter()">
|
||||
<mat-option value="organizational-unit" i18n="@@organizationalUnitOption">Unidad organizativa</mat-option>
|
||||
<mat-option value="classroom-group" i18n="@@classroomsGroupOption">Grupos de aulas</mat-option>
|
||||
<mat-option value="classroom" i18n="@@classroomOption">Aulas</mat-option>
|
||||
<mat-option value="client-group" i18n="@@clientGroupOption">Grupos de clientes</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field>
|
||||
<mat-label i18n="@@floorLabel" class="temp_filter">Planta</mat-label>
|
||||
<mat-select [(value)]="selectedFilter1">
|
||||
<mat-option value="none" i18n="@@noneOption">Ninguno</mat-option>
|
||||
<mat-option value="option1" i18n="@@option1">Planta 1</mat-option>
|
||||
<mat-option value="option2" i18n="@@option2">Planta 2</mat-option>
|
||||
<mat-option value="option3" i18n="@@option3">Planta 3</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
</ng-container>
|
||||
|
||||
<!-- FILTROS CLIENTES -->
|
||||
|
||||
<ng-container *ngIf="selectedFilter1 === 'client'">
|
||||
|
||||
<mat-form-field>
|
||||
<mat-label i18n="@@selectAnotherOptionLabel" class="temp_filter">Sistema Operativo</mat-label>
|
||||
<mat-select multiple [(value)]="selectedFilterOS">
|
||||
<mat-option value="none" i18n="@@noneOption">Ninguno</mat-option>
|
||||
<mat-option value="Windows 10 Education 1803 64 bits">Windows 10 Education 1803 64 bits</mat-option>
|
||||
<mat-option value="Ubuntu 18.04.1 LTS 64 bits">Ubuntu 18.04.1 LTS 64 bits</mat-option>
|
||||
<mat-option value="Ubuntu 16.04.4 LTS 64 bits">Ubuntu 16.04.4 LTS 64 bits</mat-option>
|
||||
<mat-option value="DATA">RESTO DE OPCIONES TBI</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
|
||||
<mat-form-field>
|
||||
<mat-label i18n="@@selectStateLabel" class="temp_filter">Estado</mat-label>
|
||||
<mat-select multiple [(value)]="selectedFilterStatus">
|
||||
<mat-option value="off" i18n="@@offOption">off</mat-option>
|
||||
<mat-option value="initializing" i18n="@@initializingOption">initializing</mat-option>
|
||||
<mat-option value="oglive" i18n="@@ogliveOption">oglive</mat-option>
|
||||
<mat-option value="busy" i18n="@@busyOption">busy</mat-option>
|
||||
<mat-option value="linux" i18n="@@linuxOption">linux</mat-option>
|
||||
<mat-option value="linux_session" i18n="@@linuxSessionOption">linux_session</mat-option>
|
||||
<mat-option value="macos" i18n="@@macosOption">macos</mat-option>
|
||||
<mat-option value="windows" i18n="@@windowsOption">windows</mat-option>
|
||||
<mat-option value="windows_session" i18n="@@windowsSessionOption">windows_session</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="example-full-width">
|
||||
<mat-label class="temp_filter">IP</mat-label>
|
||||
<input matInput placeholder="Dírección IP" (input)="applyFilter()" i18n [(ngModel)]="filterIP">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="example-full-width">
|
||||
<mat-label class="temp_filter">MAC</mat-label>
|
||||
<input matInput placeholder="Dírección IP" (input)="applyFilter()" i18n [(ngModel)]="filterMAC">
|
||||
</mat-form-field>
|
||||
|
||||
</ng-container>
|
||||
|
||||
<button mat-raised-button color="primary" (click)="toggleSelectAll()">Seleccionar/Deseleccionar Todos</button>
|
||||
<button mat-raised-button color="primary" (click)="saveFilters()" i18n="@@saveFiltersButton">Guardar
|
||||
Filtros</button>
|
||||
<button mat-raised-button color="accent" (click)="sendActions()" i18n="@@sendFiltersButton"
|
||||
[disabled]="selectedElements.length === 0">Enviar Acción</button>
|
||||
<button mat-flat-button color="primary" [disabled]="selectedElements.length === 0"
|
||||
(click)="onPxeBootFile()">Añadir fichero PXE</button>
|
||||
</div>
|
||||
<div class="results">
|
||||
<ng-container *ngIf="filteredResults && filteredResults.length > 0; else noResults">
|
||||
<ng-container *ngIf="viewMode === 'grid'">
|
||||
<mat-grid-list cols="7" rowHeight="1:1">
|
||||
|
@ -106,17 +159,22 @@
|
|||
<p class="result-ip" *ngIf="result.type === 'client'">{{ result.ip }}</p>
|
||||
<p class="result-mac" *ngIf="result.type === 'client'">{{ result.mac }}</p>
|
||||
<p class="result-status" *ngIf="result.type === 'client'">{{ result.status }}</p>
|
||||
<p *ngIf="result.type !== 'client'" i18n="@@internalUnits" class="result-internal-units">
|
||||
Unidades internas: {{ result.children.length }}
|
||||
</p>
|
||||
<p *ngIf="result.type !== 'client'" i18n="@@clients" class="result-clients">
|
||||
Clientes: {{ result.clients.length }}
|
||||
</p>
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="Usa el paginador para navegar entre los resultados.">
|
||||
<mat-paginator [length]="length" [pageSize]="itemsPerPage" [pageIndex]="page" [pageSizeOptions]="pageSizeOptions" (page)="onPageChange($event)">
|
||||
<div class="paginator-container">
|
||||
<mat-paginator [length]="length" [pageSize]="itemsPerPage" [pageIndex]="page"
|
||||
[pageSizeOptions]="pageSizeOptions" (page)="onPageChange($event)">
|
||||
</mat-paginator>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
<ng-template #noResults>
|
||||
<div class="no-results">
|
||||
<p i18n="@@noResultsMessage">No hay resultados para mostrar.</p>
|
||||
|
|
|
@ -485,8 +485,7 @@ export class AdvancedSearchComponent {
|
|||
'saveFiltersStep',
|
||||
'sendActionStep',
|
||||
'addPxeStep',
|
||||
'resultsStep',
|
||||
'paginationStep'
|
||||
'resultsStep'
|
||||
],
|
||||
showPrevButton: true,
|
||||
themeColor: '#3f51b5'
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
<div class="header-container">
|
||||
<h2 class="title" i18n="@@adminImagesTitle">Datos de cliente</h2>
|
||||
|
||||
<h2 class="title">{{ 'clientDetailsTitle' | translate }}</h2>
|
||||
<div class="client-button-row">
|
||||
<button mat-flat-button color="primary" (click)="onEditClick($event, clientData.uuid)" i18n="@@editImage">Editar</button>
|
||||
<button mat-flat-button color="primary" [matMenuTriggerFor]="commandMenu">Comandos</button>
|
||||
<button mat-flat-button color="primary" [matMenuTriggerFor]="commandMenu">{{ 'commandsButton' | translate }}</button>
|
||||
</div>
|
||||
<mat-menu #commandMenu="matMenu">
|
||||
<button mat-menu-item *ngFor="let command of arrayCommands" (click)="onCommandSelect(command.slug)">
|
||||
|
|
|
@ -1,6 +1,22 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { CreateImageComponent } from './create-image.component';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { ReactiveFormsModule, FormBuilder } from '@angular/forms';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatPaginatorModule } from '@angular/material/paginator';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { MatTabsModule } from '@angular/material/tabs';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ToastrModule, ToastrService } from 'ngx-toastr';
|
||||
import { of } from 'rxjs';
|
||||
import { DataService } from '../../client-tab-view/data.service';
|
||||
|
||||
describe('CreateImageComponent', () => {
|
||||
let component: CreateImageComponent;
|
||||
|
@ -8,7 +24,47 @@ describe('CreateImageComponent', () => {
|
|||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [CreateImageComponent]
|
||||
imports: [
|
||||
CreateImageComponent,
|
||||
ReactiveFormsModule,
|
||||
MatDialogModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
MatCheckboxModule,
|
||||
MatButtonModule,
|
||||
MatTabsModule,
|
||||
MatTableModule,
|
||||
MatPaginatorModule,
|
||||
BrowserAnimationsModule,
|
||||
ToastrModule.forRoot(),
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
FormBuilder,
|
||||
ToastrService,
|
||||
DataService,
|
||||
provideHttpClient(),
|
||||
provideHttpClientTesting(),
|
||||
{
|
||||
provide: MatDialogRef,
|
||||
useValue: {}
|
||||
},
|
||||
{
|
||||
provide: MAT_DIALOG_DATA,
|
||||
useValue: {}
|
||||
},
|
||||
{
|
||||
provide: ActivatedRoute,
|
||||
useValue: {
|
||||
snapshot: {
|
||||
paramMap: {
|
||||
get: (key: string) => 'valorSimulado'
|
||||
}
|
||||
},
|
||||
params: of({ id: 'valorSimulado' })
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
.compileComponents();
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
<div class="select-container">
|
||||
<div class="option-container">
|
||||
<mat-radio-group [(ngModel)]="selectedOption" aria-label="Selecciona una opcion">
|
||||
<mat-radio-group [(ngModel)]="selectedOption" name="selectedOption" aria-label="Selecciona una opcion">
|
||||
<mat-radio-button value="update-cache">Actualizar cache</mat-radio-button>
|
||||
<mat-radio-button value="deploy-image">Deploy imagen</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
@ -17,14 +17,14 @@
|
|||
<div class="deploy-container">
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Seleccione imagen</mat-label>
|
||||
<mat-select [(ngModel)]="selectedImage">
|
||||
<mat-select [(ngModel)]="selectedImage" name="selectedImage">
|
||||
<mat-option *ngFor="let image of images" [value]="image['@id']">{{ image.name }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Seleccione método de deploy</mat-label>
|
||||
<mat-select [(ngModel)]="selectedMethod">
|
||||
<mat-select [(ngModel)]="selectedMethod" name="selectedMethod">
|
||||
<mat-option *ngFor="let method of deployMethods" [value]="method">{{ method }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
@ -35,7 +35,7 @@
|
|||
<ng-container matColumnDef="select">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: start">Seleccionar partición</th>
|
||||
<td mat-cell *matCellDef="let row">
|
||||
<mat-radio-group [(ngModel)]="selectedPartition">
|
||||
<mat-radio-group [(ngModel)]="selectedPartition" name="selectedPartition">
|
||||
<mat-radio-button [value]="row">
|
||||
</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
@ -59,17 +59,17 @@
|
|||
<div *ngIf="isMethod('multicast')" class="input-group">
|
||||
<mat-form-field appearance="fill" class="input-field">
|
||||
<mat-label>Puerto</mat-label>
|
||||
<input matInput [(ngModel)]="mcastPort">
|
||||
<input matInput [(ngModel)]="mcastPort" name="mcastPort">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="input-field">
|
||||
<mat-label>Dirección</mat-label>
|
||||
<input matInput [(ngModel)]="mcastIp">
|
||||
<input matInput [(ngModel)]="mcastIp" name="mcastIp">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="input-field">
|
||||
<mat-label i18n="@@mcastModeLabel">Modo Multicast</mat-label>
|
||||
<mat-select [(ngModel)]="mcastMode">
|
||||
<mat-select [(ngModel)]="mcastMode" name="mcastMode">
|
||||
<mat-option *ngFor="let option of multicastModeOptions" [value]="option.value">
|
||||
{{ option.name }}
|
||||
</mat-option>
|
||||
|
@ -78,24 +78,24 @@
|
|||
|
||||
<mat-form-field appearance="fill" class="input-field">
|
||||
<mat-label>Velocidad</mat-label>
|
||||
<input matInput [(ngModel)]="mcastSpeed">
|
||||
<input matInput [(ngModel)]="mcastSpeed" name="mcastSpeed">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="input-field">
|
||||
<mat-label>Máximo Clientes</mat-label>
|
||||
<input matInput [(ngModel)]="mcastMaxClients">
|
||||
<input matInput [(ngModel)]="mcastMaxClients" name="mcastMaxClients">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="input-field">
|
||||
<mat-label>Tiempo Máximo de Espera</mat-label>
|
||||
<input matInput [(ngModel)]="mcastMaxTime">
|
||||
<input matInput [(ngModel)]="mcastMaxTime" name="mcastMaxTime">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<div *ngIf="isMethod('torrent')" class="input-group">
|
||||
<mat-form-field appearance="fill" class="input-field">
|
||||
<mat-label i18n="@@p2pModeLabel">Modo P2P</mat-label>
|
||||
<mat-select [(ngModel)]="p2pMode">
|
||||
<mat-select [(ngModel)]="p2pMode" name="p2pMode">
|
||||
<mat-option *ngFor="let option of p2pModeOptions" [value]="option.value">
|
||||
{{ option.name }}
|
||||
</mat-option>
|
||||
|
@ -104,6 +104,6 @@
|
|||
|
||||
<mat-form-field appearance="fill" class="input-field">
|
||||
<mat-label>Semilla</mat-label>
|
||||
<input matInput [(ngModel)]="p2pTime">
|
||||
<input matInput [(ngModel)]="p2pTime" name="p2pTime">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,23 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { DeployImageComponent } from './deploy-image.component';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { ReactiveFormsModule, FormsModule, FormBuilder } from '@angular/forms';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatRadioModule } from '@angular/material/radio'; // Importar MatRadioModule
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ToastrModule, ToastrService } from 'ngx-toastr';
|
||||
import { DataService } from '../../client-tab-view/data.service';
|
||||
import { provideRouter } from '@angular/router';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
|
||||
describe('DeployImageComponent', () => {
|
||||
let component: DeployImageComponent;
|
||||
|
@ -8,7 +25,39 @@ describe('DeployImageComponent', () => {
|
|||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [DeployImageComponent]
|
||||
declarations: [DeployImageComponent],
|
||||
imports: [
|
||||
ReactiveFormsModule,
|
||||
FormsModule,
|
||||
MatDialogModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
MatCheckboxModule,
|
||||
MatButtonModule,
|
||||
MatTableModule,
|
||||
MatDividerModule,
|
||||
MatRadioModule,
|
||||
MatSelectModule,
|
||||
BrowserAnimationsModule,
|
||||
ToastrModule.forRoot(),
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
FormBuilder,
|
||||
ToastrService,
|
||||
DataService,
|
||||
provideHttpClient(),
|
||||
provideHttpClientTesting(),
|
||||
provideRouter([]),
|
||||
{
|
||||
provide: MatDialogRef,
|
||||
useValue: {}
|
||||
},
|
||||
{
|
||||
provide: MAT_DIALOG_DATA,
|
||||
useValue: {}
|
||||
}
|
||||
]
|
||||
})
|
||||
.compileComponents();
|
||||
|
||||
|
|
|
@ -1,16 +1,11 @@
|
|||
<div class="header-container">
|
||||
<h2 class="title" i18n="@@subnetsTitle">Asistente de particionado</h2>
|
||||
<div class="subnets-button-row">
|
||||
<button mat-flat-button color="primary" (click)="save()">Guardar</button>
|
||||
</div>
|
||||
</div>
|
||||
<mat-divider></mat-divider>
|
||||
<h2 mat-dialog-title>Asistente de particionado</h2>
|
||||
|
||||
<div class="partition-assistant" *ngFor="let disk of disks; let i = index">
|
||||
<div>
|
||||
<label for="disk-number-{{i}}">Disco {{ disk.diskNumber }}:</label>
|
||||
<span class="disk-size"> Tamaño: {{ (disk.totalDiskSize / 1024).toFixed(2) }} GB</span>
|
||||
</div>
|
||||
<mat-dialog-content>
|
||||
<div class="partition-assistant" *ngFor="let disk of disks; let i = index">
|
||||
<div class="header">
|
||||
<label for="disk-number-{{i}}">Disco {{ disk.diskNumber }}:</label>
|
||||
<span class="disk-size">Tamaño: {{ (disk.totalDiskSize / 1024).toFixed(2) }} GB</span>
|
||||
</div>
|
||||
|
||||
<div class="partition-bar">
|
||||
<div
|
||||
|
@ -30,42 +25,41 @@
|
|||
<th>Partición</th>
|
||||
<th>Tipo partición</th>
|
||||
<th>Tamaño (MB)</th>
|
||||
<th>Tamaño (%)</th>
|
||||
<th>Uso (%)</th>
|
||||
<th>Formatear</th>
|
||||
<th>Eliminar</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let partition of disk.partitions; let j = index">
|
||||
<td>{{ partition.partitionNumber }}</td>
|
||||
<td>
|
||||
<select [(ngModel)]="partition.type">
|
||||
<option value="NTFS">NTFS</option>
|
||||
<option value="LINUX">LINUX</option>
|
||||
<option value="CACHE">CACHE</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input
|
||||
type="number"
|
||||
[(ngModel)]="partition.size"
|
||||
(input)="updatePartitionSize(disk.diskNumber, j, partition.size)"
|
||||
/>
|
||||
</td>
|
||||
<td>
|
||||
<input
|
||||
type="number"
|
||||
[(ngModel)]="partition.percentage"
|
||||
(input)="updatePartitionPercentage(disk.diskNumber, j, partition.percentage)"
|
||||
/>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" [(ngModel)]="partition.format" />
|
||||
</td>
|
||||
<td>
|
||||
<button (click)="removePartition(disk.diskNumber, partition)" class="remove-btn">X</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr *ngFor="let partition of disk.partitions; let j = index">
|
||||
<td>{{ partition.partitionNumber }}</td>
|
||||
<td>
|
||||
<select [(ngModel)]="partition.type">
|
||||
<option value="NTFS">NTFS</option>
|
||||
<option value="LINUX">LINUX</option>
|
||||
<option value="CACHE">CACHE</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input
|
||||
type="number"
|
||||
[(ngModel)]="partition.size"
|
||||
(input)="updatePartitionSize(disk.diskNumber, j, partition.size)"
|
||||
/>
|
||||
</td>
|
||||
<td>
|
||||
<input
|
||||
type="number"
|
||||
[(ngModel)]="partition.memoryUsage"
|
||||
/>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" [(ngModel)]="partition.format" />
|
||||
</td>
|
||||
<td>
|
||||
<button (click)="removePartition(disk.diskNumber, partition)" class="remove-btn">X</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
<h2>{{ 'diskImageAssistantTitle' | translate }}</h2>
|
||||
<div *ngFor="let disk of disks" class="partition-assistant">
|
||||
<div class="header">
|
||||
<label>{{ 'diskLabel' | translate }} {{ disk.diskNumber }}</label>
|
||||
</div>
|
||||
|
||||
<table class="partition-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ 'partitionColumn' | translate }}</th>
|
||||
<th>{{ 'isoImageColumn' | translate }}</th>
|
||||
<th>{{ 'ogliveColumn' | translate }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let partition of disk.partitions">
|
||||
<td>{{ partition.partitionNumber }}</td>
|
||||
<td>
|
||||
<select [(ngModel)]="partition.associatedImageId" (change)="onImageSelected(partition, $event)" name="associatedImage-{{partition.partitionNumber}}">
|
||||
<option value="">{{ 'selectImageOption' | translate }}</option>
|
||||
<option *ngFor="let image of availableImages" [value]="image['@id']">
|
||||
{{ image.name }}
|
||||
</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<select (change)="onOgLiveSelected(partition, $event)">
|
||||
<option value="">{{ 'selectOgLiveOption' | translate }}</option>
|
||||
<option *ngFor="let ogLive of availableOgLives" [value]="ogLive">{{ ogLive }}</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button mat-flat-button color="primary" (click)="saveAssociations()">{{ 'saveAssociationsButton' | translate }}</button>
|
||||
</div>
|
|
@ -2,39 +2,39 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" i18n="@@adminImagesTitle" joyrideStep="title3Step" text="En esta pantalla se podran administrar todos los clientes del sistema sin jerarquias.">Administrar clientes</h2>
|
||||
<h2 class="title" i18n="@@adminImagesTitle" joyrideStep="clientTabtitleStep" text="En esta pantalla se podran administrar todos los clientes del sistema sin jerarquias.">{{ 'adminImagesTitle' | translate }}</h2>
|
||||
<div class="images-button-row">
|
||||
<button mat-flat-button color="primary" (click)="resetFilters()" joyrideStep="resetFiltersStep" text="Reinicia los filtros aplicados para mostrar todos los clientes.">Reiniciar filtros</button>
|
||||
<button mat-flat-button color="primary" (click)="addClient($event)" joyrideStep="addClientStep" text="Añade un nuevo cliente a la lista.">Añadir cliente</button>
|
||||
<button mat-flat-button color="primary" (click)="resetFilters()" joyrideStep="clientTabResetFiltersStep" text="Reinicia los filtros aplicados para mostrar todos los clientes.">{{ 'resetFiltersButton' | translate }}</button>
|
||||
<button mat-flat-button color="primary" (click)="addClient($event)" joyrideStep="clientTabaddClientStep" text="Añade un nuevo cliente a la lista.">{{ 'addClientButton' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="search-container" joyrideStep="searchContainerStep" text="Filtra los clientes por nombre, IP, MAC o unidad organizativa.">
|
||||
<div class="search-container" joyrideStep="clientTabsearchContainerStep" text="Filtra los clientes por nombre, IP, MAC o unidad organizativa.">
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label i18n="@@searchLabel">Buscar nombre de cliente</mat-label>
|
||||
<mat-label i18n="@@searchLabel">{{ 'searchClientNameLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint i18n="@@searchHint">{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label i18n="@@searchLabel">Buscar IP</mat-label>
|
||||
<mat-label i18n="@@searchLabel">{{ 'searchIPLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['ip']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint i18n="@@searchHint">{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label i18n="@@searchLabel">Buscar MAC</mat-label>
|
||||
<mat-label i18n="@@searchLabel">{{ 'searchMACLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['mac']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint i18n="@@searchHint">{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="search-select" >
|
||||
<mat-label i18n="@@organizational-unit-label">U. Organizativa</mat-label>
|
||||
<mat-label i18n="@@organizational-unit-label">{{ 'organizationalUnitLabel' | translate }}</mat-label>
|
||||
<mat-select [(ngModel)]="filters['organizationalUnit.id']" (selectionChange)="search()">
|
||||
<mat-option *ngFor="let unit of organizationalUnits" [value]="unit.id" >
|
||||
{{ unit.name }}
|
||||
|
@ -48,7 +48,7 @@
|
|||
</div>
|
||||
|
||||
<div *ngIf="loading">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="Lista de clientes filtrados por tus criterios de búsqueda.">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="clientTabtableStep" text="Lista de clientes filtrados por tus criterios de búsqueda.">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
<td mat-cell *matCellDef="let client" >
|
||||
|
@ -78,8 +78,8 @@
|
|||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">Acciones</th>
|
||||
<td mat-cell *matCellDef="let client" style="text-align: center;" joyrideStep="actionsStep" text="Acciones disponibles para cada cliente, como ver, editar o eliminar.">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">{{ 'columnActions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let client" style="text-align: center;" joyrideStep="clientTabactionsStep" text="Acciones disponibles para cada cliente, como ver, editar o eliminar.">
|
||||
<button *ngIf="!syncStatus" mat-icon-button color="primary" (click)="getStatus(client)"><mat-icon>sync</mat-icon></button>
|
||||
<button *ngIf="syncStatus" mat-icon-button color="primary"><mat-spinner diameter="24"></mat-spinner></button>
|
||||
<button mat-icon-button color="info" (click)="handleClientClick($event, client)"><mat-icon i18n="@@deleteElementTooltip">visibility</mat-icon></button>
|
||||
|
@ -94,7 +94,7 @@
|
|||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="Navega entre las páginas de resultados utilizando el paginador.">
|
||||
<div class="paginator-container" joyrideStep="clientTabpaginationStep" text="Navega entre las páginas de resultados utilizando el paginador.">
|
||||
<mat-paginator [length]="length"
|
||||
[pageSize]="itemsPerPage"
|
||||
[pageIndex]="page"
|
||||
|
|
|
@ -196,13 +196,13 @@ export class ClientTabViewComponent {
|
|||
iniciarTour(): void {
|
||||
this.joyrideService.startTour({
|
||||
steps: [
|
||||
'title3Step',
|
||||
'resetFiltersStep',
|
||||
'addClientStep',
|
||||
'searchContainerStep',
|
||||
'tableStep',
|
||||
'actionsStep',
|
||||
'paginationStep'
|
||||
'clientTabtitleStep',
|
||||
'clientTabResetFiltersStep',
|
||||
'clientTabaddClientStep',
|
||||
'clientTabsearchContainerStep',
|
||||
'clientTabtableStep',
|
||||
'clientTabactionsStep',
|
||||
'clientTabpaginationStep'
|
||||
],
|
||||
showPrevButton: true,
|
||||
themeColor: '#3f51b5'
|
||||
|
|
|
@ -2,10 +2,10 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" i18n="@@adminImagesTitle" joyrideStep="titleS4tep" text="Gestiona las unidades organizativas desde esta pantalla.">Administrar unidades organizativas</h2>
|
||||
<h2 class="title" i18n="@@adminImagesTitle" joyrideStep="titleS4tep" text="Gestiona las unidades organizativas desde esta pantalla.">{{ 'resetFiltersButton' | translate }}</h2>
|
||||
<div class="button-row">
|
||||
<button mat-flat-button color="primary" (click)="resetFilters()" joyrideStep="resetFiltersStep" text="Reinicia los filtros aplicados para mostrar todas las unidades organizativas.">Reiniciar filtros</button>
|
||||
<button mat-flat-button color="primary" (click)="addOrganizationalUnit($event)" joyrideStep="addOUStep" text="Añade una nueva unidad organizativa.">Añadir OU</button>
|
||||
<button mat-flat-button color="primary" (click)="addOrganizationalUnit($event)" joyrideStep="addOUStep" text="Añade una nueva unidad organizativa.">{{ 'addOUButton' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -13,20 +13,20 @@
|
|||
|
||||
<div class="search-container" joyrideStep="searchContainerStep" text="Filtra las unidades organizativas por nombre o tipo.">
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label i18n="@@searchLabel">Buscar nombre de OU</mat-label>
|
||||
<mat-label i18n="@@searchLabel">{{ 'searchLabelOu' | translate }}</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint i18n="@@searchHint">{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="search-boolean">
|
||||
<mat-label i18n="@@searchLabel">Tipo</mat-label>
|
||||
<mat-label i18n="@@searchLabel">{{ 'typeLabel' | translate }}</mat-label>
|
||||
<mat-select [(ngModel)]="filters['type']" (selectionChange)="search()" placeholder="Seleccionar opción">
|
||||
<mat-option [value]="''">Todos</mat-option>
|
||||
<mat-option [value]="'organizational-unit'">Centro</mat-option>
|
||||
<mat-option [value]="'classrooms-group'">Grupos de aulas</mat-option>
|
||||
<mat-option [value]="'classroom'">Aula</mat-option>
|
||||
<mat-option [value]="'clients-group'">Grupos de PCs</mat-option>
|
||||
<mat-option [value]="''">{{ 'allOption' | translate }}</mat-option>
|
||||
<mat-option [value]="'organizational-unit'">{{ 'centerOption' | translate }}</mat-option>
|
||||
<mat-option [value]="'classrooms-group'">{{ 'classroomsGroupOption' | translate }}</mat-option>
|
||||
<mat-option [value]="'classroom'">{{ 'classroomOption' | translate }}</mat-option>
|
||||
<mat-option [value]="'clients-group'">{{ 'clientsGroupOption' | translate }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
@ -49,7 +49,7 @@
|
|||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">Acciones</th>
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">{{ 'columnActions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let ou" style="text-align: center;" joyrideStep="actionsStep" text="Usa estas opciones para ver, editar o eliminar una unidad organizativa.">
|
||||
<button mat-icon-button color="info" (click)="onShowClick($event, ou)"><mat-icon i18n="@@deleteElementTooltip">visibility</mat-icon></button>
|
||||
<button mat-icon-button color="primary" (click)="onEditClick($event, ou.uuid)" i18n="@@editImage"><mat-icon>edit</mat-icon></button>
|
||||
|
@ -59,10 +59,10 @@
|
|||
</button>
|
||||
<mat-menu #menu="matMenu">
|
||||
<button mat-menu-item [disabled]="ou.type !== 'classroom'" (click)="roomMap(ou)">
|
||||
<span i18n="@@viewTreeMenu">Plano de aula</span>
|
||||
<span i18n="@@viewTreeMenu"> {{ 'roomMapOption' | translate }}</span>
|
||||
</button>
|
||||
<button mat-menu-item [disabled]="ou.type !== 'organizational-unit'" (click)="onTreeClick(ou)">
|
||||
<span i18n="@@viewTreeMenu">Ver organigrama</span>
|
||||
<span i18n="@@viewTreeMenu">{{ 'viewTreeMenu' | translate }}</span>
|
||||
</button>
|
||||
</mat-menu>
|
||||
</td>
|
||||
|
|
|
@ -196,11 +196,11 @@ mat-spinner {
|
|||
max-width: 250px;
|
||||
height: 250px;
|
||||
}
|
||||
|
||||
.paginator-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-bottom: 30px;
|
||||
|
||||
}
|
||||
|
||||
.divider {
|
||||
|
|
|
@ -1,39 +1,24 @@
|
|||
<mat-tab-group (selectedTabChange)="onTabChange($event)">
|
||||
<mat-tab label="General">
|
||||
<div class="header-container" joyrideStep="tabsStep" text="Utiliza las pestañás para acceder a las diferentes opciones de visualización y busqueda de unidades organizativas y clientes.">
|
||||
<mat-tab label="{{ 'generalTabLabel' | translate }}">
|
||||
<div class="header-container" joyrideStep="tabsStep" text="{{ 'tabsStepText' | translate }}">
|
||||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" i18n="@@adminGroupsTitle" joyrideStep="titleStep" text="En esta pantalla, puedes gestionar las unidades organizativas y sus clientes.">Administrar grupos</h2>
|
||||
<div class="groups-button-row" joyrideStep="addStep" text="Utiliza estos botones para crear nuevas unidades organizativas o clientes.">
|
||||
<button mat-flat-button color="primary" (click)="addOU($event)"
|
||||
i18n="@@newOrganizationalUnitButton"
|
||||
matTooltip="Abrir modal para crear unidades organizativas de cualquier tipo (Centro, Aula, Grupo de aulas o Grupo de clientes)"
|
||||
matTooltipShowDelay="1000">Nueva Unidad Organizativa</button>
|
||||
|
||||
<button mat-flat-button color="primary" (click)="addClient($event)"
|
||||
i18n="@@newClientButton"
|
||||
matTooltipShowDelay="1000">Nuevo Cliente</button>
|
||||
|
||||
<button mat-raised-button (click)="openBottomSheet()"
|
||||
i18n="@@legendButton"
|
||||
joyrideStep="keyStep" text="La leyenda te mostrará los tipos de unidades organizativas y sus iconos correspondientes"
|
||||
matTooltipShowDelay="1000">Leyenda</button>
|
||||
<h2 class="title" joyrideStep="groupsTitleStepText" text="{{ 'groupsTitleStepText' | translate }}">{{ 'adminGroupsTitle' | translate }}</h2>
|
||||
<div class="groups-button-row" joyrideStep="addStep" text="{{ 'groupsAddStepText' | translate }}">
|
||||
<button mat-flat-button color="primary" (click)="addOU($event)" matTooltip="{{ 'newOrganizationalUnitTooltip' | translate }}" matTooltipShowDelay="1000">{{ 'newOrganizationalUnitButton' | translate }}</button>
|
||||
<button mat-flat-button color="primary" (click)="addClient($event)" matTooltipShowDelay="1000">{{ 'newClientButton' | translate }}</button>
|
||||
<button mat-raised-button (click)="openBottomSheet()" joyrideStep="keyStep" text="{{ 'keyStepText' | translate }}" matTooltipShowDelay="1000">{{ 'legendButton' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="groupLists-container">
|
||||
<mat-card class="card unidad-card"
|
||||
joyrideStep="unitStep" text="Esta es la sección donde se mostrarán las unidades organizativas de tipo 'Centro'"
|
||||
matTooltipShowDelay="1000"
|
||||
matTooltipPosition="above">
|
||||
<mat-card-title i18n="@@organizationalUnitTitle">Centros</mat-card-title>
|
||||
<mat-card class="card unidad-card" joyrideStep="unitStep" text="{{ 'unitStepText' | translate }}" matTooltipShowDelay="1000" matTooltipPosition="above">
|
||||
<mat-card-title>{{ 'organizationalUnitTitle' | translate }}</mat-card-title>
|
||||
<mat-card-content>
|
||||
<mat-spinner *ngIf="loading"></mat-spinner>
|
||||
<mat-list *ngIf="!loading">
|
||||
<mat-list-item *ngFor="let unidad of organizationalUnits"
|
||||
[ngClass]="{'selected-item': unidad === selectedUnidad, 'clickable-item': true}"
|
||||
(click)="onSelectUnidad(unidad)">
|
||||
<mat-list-item *ngFor="let unidad of organizationalUnits" [ngClass]="{'selected-item': unidad === selectedUnidad, 'clickable-item': true}" (click)="onSelectUnidad(unidad)">
|
||||
<div class="item-content">
|
||||
<mat-icon>apartment</mat-icon>
|
||||
{{ unidad.name }}
|
||||
|
@ -41,38 +26,28 @@
|
|||
<mat-icon mat-button [matMenuTriggerFor]="menu" (click)="$event.stopPropagation()">more_vert</mat-icon>
|
||||
<mat-menu #menu="matMenu">
|
||||
<button mat-menu-item (click)="onTreeClick($event, unidad)">
|
||||
<mat-icon matTooltip="Visualizar unidad en forma de árbol"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@viewTreeTooltip">account_tree</mat-icon>
|
||||
<span i18n="@@viewTreeMenu">Ver organigrama</span>
|
||||
<mat-icon matTooltip="{{ 'viewTreeTooltip' | translate }}" matTooltipHideDelay="0">account_tree</mat-icon>
|
||||
<span>{{ 'viewTreeMenu' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<button mat-menu-item (click)="onEditClick($event, unidad.type, unidad.uuid)">
|
||||
<mat-icon matTooltip="Editar esta unidad organizativa"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@editUnitTooltip">edit</mat-icon>
|
||||
<span i18n="@@editUnitMenu">Editar</span>
|
||||
<mat-icon matTooltip="{{ 'editUnitTooltip' | translate }}" matTooltipHideDelay="0">edit</mat-icon>
|
||||
<span>{{ 'editUnitMenu' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<button mat-menu-item (click)="onShowClick($event, unidad)">
|
||||
<mat-icon matTooltip="Ver detalles de la unidad organizativa"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@viewUnitTooltip">visibility</mat-icon>
|
||||
<span i18n="@@viewUnitMenu">Ver datos</span>
|
||||
<mat-icon matTooltip="{{ 'viewUnitTooltip' | translate }}" matTooltipHideDelay="0">visibility</mat-icon>
|
||||
<span>{{ 'viewUnitMenu' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<button mat-menu-item (click)="addOU($event, unidad)">
|
||||
<mat-icon matTooltip="Crear una nueva unidad organizativa interna"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@addInternalUnitTooltip">add_home_work</mat-icon>
|
||||
<span i18n="@@addInternalUnitMenu">Añadir unidad organizativa</span>
|
||||
<mat-icon matTooltip="{{ 'addInternalUnitTooltip' | translate }}" matTooltipHideDelay="0">add_home_work</mat-icon>
|
||||
<span>{{ 'addInternalUnitMenu' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<button mat-menu-item (click)="addClient($event, unidad)">
|
||||
<mat-icon matTooltip="Registrar un cliente en esta unidad organizativa"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@addClientTooltip">devices</mat-icon>
|
||||
<span i18n="@@addClientMenu">Crear cliente</span>
|
||||
<mat-icon matTooltip="{{ 'addClientTooltip' | translate }}" matTooltipHideDelay="0">devices</mat-icon>
|
||||
<span>{{ 'addClientMenu' | translate }}</span>
|
||||
</button>
|
||||
</mat-menu>
|
||||
</span>
|
||||
|
@ -82,13 +57,10 @@
|
|||
</mat-card-content>
|
||||
</mat-card>
|
||||
|
||||
<mat-card class="card elements-card"
|
||||
joyrideStep="elementsStep" text="Esta es la sección para visualizar unidades internas del centro seleccionado y navegar por ellas."
|
||||
matTooltipShowDelay="1000"
|
||||
matTooltipPosition="above">
|
||||
<mat-card class="card elements-card" joyrideStep="elementsStep" text="{{ 'elementsStepText' | translate }}" matTooltipShowDelay="1000" matTooltipPosition="above">
|
||||
<mat-card-title>
|
||||
<div class="title-with-breadcrumb">
|
||||
<span i18n="@@internalElementsTitle"></span>
|
||||
<span>{{ 'internalElementsTitle' | translate }}</span>
|
||||
<mat-card-subtitle>
|
||||
<ng-container *ngFor="let crumb of breadcrumb; let i = index">
|
||||
<a (click)="navigateToBreadcrumb(i)">{{ crumb }}</a>
|
||||
|
@ -102,7 +74,7 @@
|
|||
<mat-list *ngIf="!loadingChildren">
|
||||
<div *ngIf="children.length === 0" class="empty-list">
|
||||
<mat-icon>info</mat-icon>
|
||||
<span i18n="@@noInternalElementsMessage">No hay elementos internos</span>
|
||||
<span>{{ 'noInternalElementsMessage' | translate }}</span>
|
||||
</div>
|
||||
<mat-list-item *ngFor="let child of children"
|
||||
[ngClass]="{'selected-item': child === selectedUnidad, 'clickable-item': true}"
|
||||
|
@ -121,44 +93,33 @@
|
|||
<mat-icon mat-button [matMenuTriggerFor]="menu" (click)="$event.stopPropagation()">more_vert</mat-icon>
|
||||
<mat-menu #menu="matMenu">
|
||||
<button mat-menu-item (click)="onEditClick($event, child.type, child.uuid)">
|
||||
<mat-icon matTooltip="Editar elemento"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@editElementTooltip">edit</mat-icon>
|
||||
<span i18n="@@editElementMenu">Editar</span>
|
||||
<mat-icon matTooltip="{{ 'editElementTooltip' | translate }}" matTooltipHideDelay="0">edit</mat-icon>
|
||||
<span>{{ 'editElementMenu' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<button *ngIf="child.type !== 'client'" mat-menu-item (click)="onShowClick($event, child)">
|
||||
<mat-icon matTooltip="Ver detalles de la unidad organizativa"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@viewUnitTooltip">visibility</mat-icon>
|
||||
<span i18n="@@viewUnitMenu">Ver datos</span>
|
||||
<mat-icon matTooltip="{{ 'viewUnitTooltip' | translate }}" matTooltipHideDelay="0">visibility</mat-icon>
|
||||
<span>{{ 'viewUnitMenu' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<button *ngIf="child.type !== 'client'" mat-menu-item (click)="addOU($event, child)">
|
||||
<mat-icon matTooltip="Crear una nueva unidad organizativa interna"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@addInternalUnitTooltip">add_home_work</mat-icon>
|
||||
<span i18n="@@addInternalUnitMenu">Añadir unidad organizativa</span>
|
||||
<mat-icon matTooltip="{{ 'addInternalUnitTooltip' | translate }}" matTooltipHideDelay="0">add_home_work</mat-icon>
|
||||
<span>{{ 'addInternalUnitMenu' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<button *ngIf="child.type !== 'client'" mat-menu-item (click)="addClient($event, child)">
|
||||
<mat-icon matTooltip="Registrar un cliente en esta unidad organizativa"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@addClientTooltip">devices</mat-icon>
|
||||
<span i18n="@@addClientMenu">Crear cliente</span>
|
||||
<mat-icon matTooltip="{{ 'addClientTooltip' | translate }}" matTooltipHideDelay="0">devices</mat-icon>
|
||||
<span>{{ 'addClientMenu' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<button mat-menu-item (click)="onDeleteClick($event, child.uuid, child.name, child.type)">
|
||||
<mat-icon matTooltip="Eliminar este elemento"
|
||||
matTooltipHideDelay="0"
|
||||
i18n="@@deleteElementTooltip">delete</mat-icon>
|
||||
<span i18n="@@deleteElementMenu">Eliminar elemento</span>
|
||||
<mat-icon matTooltip="{{ 'deleteElementTooltip' | translate }}" matTooltipHideDelay="0">delete</mat-icon>
|
||||
<span>{{ 'deleteElementMenu' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<button mat-menu-item (click)="onExecuteCommand($event, child.uuid, child.name, child.type)">
|
||||
<mat-icon matTooltip="Ejecutar comando en este elemento"
|
||||
matTooltipHideDelay="0">play_arrow</mat-icon>
|
||||
<span>Ejecutar comando</span>
|
||||
<mat-icon matTooltip="{{ 'executeCommandTooltip' | translate }}" matTooltipHideDelay="0">play_arrow</mat-icon>
|
||||
<span>{{ 'executeCommandMenu' | translate }}</span>
|
||||
</button>
|
||||
</mat-menu>
|
||||
</div>
|
||||
|
@ -170,15 +131,15 @@
|
|||
</div>
|
||||
</mat-tab>
|
||||
|
||||
<mat-tab i18n-label label="Búsqueda avanzada">
|
||||
<mat-tab label="{{ 'advancedSearchTabLabel' | translate }}">
|
||||
<app-advanced-search></app-advanced-search>
|
||||
</mat-tab>
|
||||
|
||||
<mat-tab i18n-label label="Clientes">
|
||||
<mat-tab label="{{ 'clientsTabLabel' | translate }}">
|
||||
<app-client-tab-view #clientTab></app-client-tab-view>
|
||||
</mat-tab>
|
||||
|
||||
<mat-tab i18n-label label="Unidades organizativas">
|
||||
<mat-tab label="{{ 'organizationalUnitsTabLabel' | translate }}">
|
||||
<app-organizational-unit-tab-view #organizationalUnitTab></app-organizational-unit-tab-view>
|
||||
</mat-tab>
|
||||
</mat-tab-group>
|
||||
|
|
|
@ -453,7 +453,7 @@ export class GroupsComponent implements OnInit {
|
|||
|
||||
iniciarTour(): void {
|
||||
this.joyrideService.startTour({
|
||||
steps: ['titleStep', 'addStep', 'keyStep', 'unitStep', 'elementsStep', 'tabsStep'],
|
||||
steps: ['groupsTitleStepText', 'addStep', 'keyStep', 'unitStep', 'elementsStep', 'tabsStep'],
|
||||
showPrevButton: true,
|
||||
themeColor: '#3f51b5'
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<h1 mat-dialog-title i18n="@@actions-modal-title">Acciones</h1>
|
||||
<h1 mat-dialog-title>{{ 'actionsModalTitle' | translate }}</h1>
|
||||
|
||||
<mat-dialog-content>
|
||||
<div class="button-container">
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
<mat-dialog-content class="classroom">
|
||||
<div *ngFor="let group of groupedClients" class="classroom-group">
|
||||
<div class="misc-clients">
|
||||
<div class="classroom-board" cdkDrag cdkDragBoundary=".classroom">Pizarra digital</div>
|
||||
<img mat-card-image src="assets/images/proyector.png" alt="Proyector" class="proyector-image" cdkDrag cdkDragBoundary=".classroom"/>
|
||||
<div class="classroom-board" cdkDrag cdkDragBoundary=".classroom">{{ 'digitalBoard' | translate }}</div>
|
||||
<img mat-card-image src="assets/images/proyector.png" alt="{{ 'projectorAlt' | translate }}" class="proyector-image" cdkDrag cdkDragBoundary=".classroom"/>
|
||||
</div>
|
||||
<div *ngFor="let row of group.clientRows" class="client-row">
|
||||
<div class="client-container" *ngFor="let client of row" cdkDrag [cdkDragFreeDragPosition]="client.dragPosition" (cdkDragMoved)="onDragMoved($event, client)" cdkDragBoundary=".classroom">
|
||||
<div class="client-box" (dblclick)="handleClientClick(client)">
|
||||
<mat-card appearance="outlined">
|
||||
<div class="client-image-container">
|
||||
<img mat-card-image src="assets/images/client.png" alt="Client" class="client-image"/>
|
||||
<img mat-card-image src="assets/images/client.png" alt="{{ 'clientAlt' | translate }}" class="client-image"/>
|
||||
<div class="client-info">
|
||||
<div class="client-name">{{ client.name }}</div>
|
||||
<div class="client-details">
|
||||
|
@ -24,5 +24,5 @@
|
|||
</div>
|
||||
</mat-dialog-content>
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-raised-button color="primary" class="saveDisposition-btn" (click)="saveDisposition()">Guardar disposición</button>
|
||||
<button mat-raised-button color="primary" class="saveDisposition-btn" (click)="saveDisposition()">{{ 'saveDispositionButton' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -1,63 +1,56 @@
|
|||
<h1 mat-dialog-title i18n="@@client-properties-title">Propiedades cliente</h1>
|
||||
<h1 mat-dialog-title>{{ 'clientPropertiesTitle' | translate }}</h1>
|
||||
<mat-dialog-content>
|
||||
<mat-tab-group dynamicHeight>
|
||||
|
||||
<mat-tab label="Datos generales">
|
||||
<mat-tab label="{{ 'generalDataTab' | translate }}">
|
||||
<table mat-table [dataSource]="generalData" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="property">
|
||||
<th mat-header-cell *matHeaderCellDef class="fixed-column" i18n="@@property-header">Propiedad</th>
|
||||
<td mat-cell *matCellDef="let element" class="fixed-column"> {{element.property}} </td>
|
||||
<th mat-header-cell *matHeaderCellDef class="fixed-column">{{ 'propertyHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element" class="fixed-column"> {{ element.property }} </td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="value">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@value-header">Valor</th>
|
||||
<td mat-cell *matCellDef="let element"> {{element.value}} </td>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'valueHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element"> {{ element.value }} </td>
|
||||
</ng-container>
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
</mat-tab>
|
||||
<mat-tab label="Propiedades de red">
|
||||
|
||||
<mat-tab label="{{ 'networkPropertiesTab' | translate }}">
|
||||
<table mat-table [dataSource]="networkData" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="property">
|
||||
<th mat-header-cell *matHeaderCellDef class="fixed-column" i18n="@@property-header">Propiedad</th>
|
||||
<td mat-cell *matCellDef="let element" class="fixed-column"> {{element.property}} </td>
|
||||
<th mat-header-cell *matHeaderCellDef class="fixed-column">{{ 'propertyHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element" class="fixed-column"> {{ element.property }} </td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="value">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@value-header">Valor</th>
|
||||
<td mat-cell *matCellDef="let element"> {{element.value}} </td>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'valueHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element"> {{ element.value }} </td>
|
||||
</ng-container>
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
</mat-tab>
|
||||
<mat-tab label="Propiedades del aula">
|
||||
|
||||
<mat-tab label="{{ 'classroomPropertiesTab' | translate }}">
|
||||
<table mat-table [dataSource]="classroomData" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="property">
|
||||
<th mat-header-cell *matHeaderCellDef class="fixed-column" i18n="@@property-header">Propiedad</th>
|
||||
<td mat-cell *matCellDef="let element" class="fixed-column"> {{element.property}} </td>
|
||||
<th mat-header-cell *matHeaderCellDef class="fixed-column">{{ 'propertyHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element" class="fixed-column"> {{ element.property }} </td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="value">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@value-header">Valor</th>
|
||||
<td mat-cell *matCellDef="let element"> {{element.value}} </td>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'valueHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element"> {{ element.value }} </td>
|
||||
</ng-container>
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
</mat-tab>
|
||||
<!-- <mat-tab label="Acciones">
|
||||
<div class="button-column">
|
||||
<button mat-flat-button color="primary" class="button-action button-encender" i18n="@@power-on-button">Encender</button>
|
||||
<button mat-flat-button color="accent" class="button-action button-apagar" i18n="@@power-off-button">Apagar</button>
|
||||
<button mat-flat-button color="warn" class="button-action button-resetear" i18n="@@reset-button">Resetear</button>
|
||||
<button mat-flat-button class="button-action button-otros-1" i18n="@@other-actions-1">Otras acciones 1</button>
|
||||
<button mat-flat-button class="button-action button-otros-2" i18n="@@other-actions-2">Otras acciones 2</button>
|
||||
<button mat-flat-button class="button-action button-otros-3" i18n="@@other-actions-3">Otras acciones 3</button>
|
||||
</div>
|
||||
</mat-tab> -->
|
||||
<mat-tab label="Particiones">
|
||||
|
||||
<mat-tab label="{{ 'partitionsTab' | translate }}">
|
||||
</mat-tab>
|
||||
</mat-tab-group>
|
||||
</mat-dialog-content>
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button mat-dialog-close (click)="onNoClick()" i18n="@@close-button">Cerrar</button>
|
||||
<button mat-button mat-dialog-close (click)="onNoClick()">{{ 'closeButton' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<div class="create-client-container">
|
||||
<h1 mat-dialog-title i18n="@@add-client-dialog-title">Añadir Cliente</h1>
|
||||
<h1 mat-dialog-title>{{ 'addClientDialogTitle' | translate }}</h1>
|
||||
<div class="mat-dialog-content" [ngClass]="{'loading': loading}">
|
||||
<mat-spinner class="loading-spinner" *ngIf="loading"></mat-spinner>
|
||||
<form [formGroup]="clientForm" class="client-form grid-form" *ngIf="!loading">
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@organizational-unit-label">Padre</mat-label>
|
||||
<mat-label>{{ 'organizationalUnitLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="organizationalUnit">
|
||||
<mat-option *ngFor="let unit of parentUnits" [value]="unit['@id']">
|
||||
<div class="unit-name">{{ unit.name }}</div>
|
||||
|
@ -14,12 +14,12 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@name-label">Nombre</mat-label>
|
||||
<mat-label>{{ 'nameLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="name">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@oglive-label">OgLive</mat-label>
|
||||
<mat-label>{{ 'ogLiveLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="ogLive">
|
||||
<mat-option *ngFor="let oglive of ogLives" [value]="oglive['@id']">
|
||||
{{ oglive.name }}
|
||||
|
@ -28,12 +28,12 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@serial-number-label">Número de Serie</mat-label>
|
||||
<mat-label>{{ 'serialNumberLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="serialNumber">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@netiface-label">Interfaz de red</mat-label>
|
||||
<mat-label>{{ 'netifaceLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="netiface">
|
||||
<mat-option *ngFor="let type of netifaceTypes" [value]="type.value">
|
||||
{{ type.name }}
|
||||
|
@ -42,7 +42,7 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@net-driver-label">Controlador de red</mat-label>
|
||||
<mat-label>{{ 'netDriverLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="netDriver">
|
||||
<mat-option *ngFor="let type of netDriverTypes" [value]="type.value">
|
||||
{{ type.name }}
|
||||
|
@ -51,21 +51,21 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mac-label">MAC</mat-label>
|
||||
<mat-hint i18n="@@mac-hint">Ejemplo: 00:11:22:33:44:55</mat-hint>
|
||||
<mat-label>{{ 'macLabel' | translate }}</mat-label>
|
||||
<mat-hint>{{ 'macHint' | translate }}</mat-hint>
|
||||
<input matInput formControlName="mac">
|
||||
<mat-error i18n="@@mac-error">Formato de MAC inválido. Ejemplo válido: 00:11:22:33:44:55</mat-error>
|
||||
<mat-error>{{ 'macError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@ip-label">Dirección IP</mat-label>
|
||||
<mat-hint i18n="@@ip-hint">Ejemplo: 127.0.0.1</mat-hint>
|
||||
<mat-label>{{ 'ipLabel' | translate }}</mat-label>
|
||||
<mat-hint>{{ 'ipHint' | translate }}</mat-hint>
|
||||
<input matInput formControlName="ip">
|
||||
<mat-error i18n="@@ip-error">Formato de dirección IP inválido. Ejemplo válido: 127.0.0.1</mat-error>
|
||||
<mat-error>{{ 'ipError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@oglive-label">Plantilla PXE</mat-label>
|
||||
<mat-label>{{ 'templateLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="template">
|
||||
<mat-option *ngFor="let template of templates" [value]="template['@id']">
|
||||
{{ template.name }}
|
||||
|
@ -74,19 +74,19 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@hardware-profile-label">Perfil de Hardware</mat-label>
|
||||
<mat-label>{{ 'hardwareProfileLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="hardwareProfile">
|
||||
<mat-option *ngFor="let unit of hardwareProfiles" [value]="unit['@id']">
|
||||
{{ unit.description }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error i18n="@@hardware-profile-error">Formato de URL inválido.</mat-error>
|
||||
<mat-error>{{ 'hardwareProfileError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div mat-dialog-actions align="end">
|
||||
<button mat-button (click)="onNoClick()" i18n="@@cancel-button">Cancelar</button>
|
||||
<button mat-button [disabled]="!clientForm.valid" (click)="onSubmit()" i18n="@@add-button">Añadir</button>
|
||||
<button mat-button (click)="onNoClick()">{{ 'cancelButton' | translate }}</button>
|
||||
<button mat-button [disabled]="!clientForm.valid" (click)="onSubmit()">{{ 'addButton' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<h1 mat-dialog-title i18n="@@edit-client-dialog-title">Editar Cliente</h1>
|
||||
<h1 mat-dialog-title>{{ 'editClientDialogTitle' | translate }}</h1>
|
||||
<div class="mat-dialog-content" [ngClass]="{'loading': loading}">
|
||||
<mat-spinner class="loading-spinner" *ngIf="loading"></mat-spinner>
|
||||
<form [formGroup]="clientForm" class="client-form grid-form" *ngIf="!loading">
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@organizational-unit-label">Padre</mat-label>
|
||||
<mat-label>{{ 'organizationalUnitLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="organizationalUnit">
|
||||
<mat-option *ngFor="let unit of parentUnits" [value]="unit['@id']">
|
||||
{{ unit.name }}
|
||||
|
@ -13,12 +13,12 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@name-label">Nombre</mat-label>
|
||||
<mat-label>{{ 'nameLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="name">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@oglive-label">OgLive</mat-label>
|
||||
<mat-label>{{ 'ogLiveLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="ogLive">
|
||||
<mat-option *ngFor="let ogLive of ogLives" [value]="ogLive['@id']">
|
||||
{{ ogLive.name }}
|
||||
|
@ -27,12 +27,12 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@serial-number-label">Número de Serie</mat-label>
|
||||
<mat-label>{{ 'serialNumberLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="serialNumber">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@netiface-label">Interfaz de red</mat-label>
|
||||
<mat-label>{{ 'netifaceLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="netiface">
|
||||
<mat-option *ngFor="let type of netifaceTypes" [value]="type.value">
|
||||
{{ type.name }}
|
||||
|
@ -41,7 +41,7 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@net-driver-label">Controlador de red</mat-label>
|
||||
<mat-label>{{ 'netDriverLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="netDriver">
|
||||
<mat-option *ngFor="let type of netDriverTypes" [value]="type.value">
|
||||
{{ type.name }}
|
||||
|
@ -50,19 +50,19 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mac-label">MAC</mat-label>
|
||||
<mat-label>{{ 'macLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="mac">
|
||||
<mat-error i18n="@@mac-error">Formato de MAC inválido. Ejemplo válido: 00:11:22:33:44:55</mat-error>
|
||||
<mat-error>{{ 'macError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@ip-label">Dirección IP</mat-label>
|
||||
<mat-label>{{ 'ipLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="ip">
|
||||
<mat-error i18n="@@ip-error">Formato de dirección IP inválido. Ejemplo válido: 127.0.0.1</mat-error>
|
||||
<mat-error>{{ 'ipError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@oglive-label">Plantilla PXE</mat-label>
|
||||
<mat-label>{{ 'templateLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="template">
|
||||
<mat-option *ngFor="let template of templates" [value]="template['@id']">
|
||||
{{ template.name }}
|
||||
|
@ -71,7 +71,7 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@hardware-profile-label">Perfil de Hardware</mat-label>
|
||||
<mat-label>{{ 'hardwareProfileLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="hardwareProfile">
|
||||
<mat-option *ngFor="let unit of hardwareProfiles" [value]="unit['@id']">
|
||||
{{ unit.description }}
|
||||
|
@ -92,8 +92,8 @@
|
|||
</div>
|
||||
|
||||
<div mat-dialog-actions align="end">
|
||||
<button mat-button (click)="onNoClick()" i18n="@@cancel-button">Cancelar</button>
|
||||
<button mat-button (click)="onNoClick()">{{ 'cancelButton' | translate }}</button>
|
||||
<button mat-button [disabled]="!clientForm.valid" (click)="onSubmit()">
|
||||
{{ !isEditMode ? 'Añadir' : 'Guardar' }}
|
||||
{{ !isEditMode ? ('addButton' | translate) : ('saveButton' | translate) }}
|
||||
</button>
|
||||
</div>
|
||||
|
|
|
@ -1,33 +1,33 @@
|
|||
<h2 mat-dialog-title>Ejecutar Comando o Grupo de Comandos</h2>
|
||||
<h2 mat-dialog-title>{{ 'executeCommandOrGroupTitle' | translate }}</h2>
|
||||
|
||||
<mat-dialog-content class="form-container">
|
||||
<form [formGroup]="form" class="command-form">
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Seleccione Comando</mat-label>
|
||||
<mat-label>{{ 'selectCommandLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="selectedCommand" (selectionChange)="form.get('selectedCommandGroup')?.reset()">
|
||||
<mat-option *ngFor="let command of commands" [value]="command.uuid">{{ command.name }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="full-width">
|
||||
<mat-label>Seleccione Grupo de Comandos</mat-label>
|
||||
<mat-label>{{ 'selectCommandGroupLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="selectedCommandGroup" (selectionChange)="form.get('selectedCommand')?.reset()">
|
||||
<mat-option *ngFor="let group of commandGroups" [value]="group.uuid">{{ group.name }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<div class="checkbox-group">
|
||||
<label>Clientes</label>
|
||||
<label>{{ 'clientsLabel' | translate }}</label>
|
||||
<div *ngIf="clients.length > 0">
|
||||
<mat-checkbox *ngFor="let client of clients"
|
||||
(change)="toggleClientSelection(client.uuid)"
|
||||
[checked]="form.get('clientSelection')?.value.includes(client.uuid)">
|
||||
(change)="toggleClientSelection(client.uuid)"
|
||||
[checked]="form.get('clientSelection')?.value.includes(client.uuid)">
|
||||
{{ client.name }}
|
||||
</mat-checkbox>
|
||||
</div>
|
||||
<div *ngIf="clients.length === 0">
|
||||
<p>No hay clientes disponibles</p>
|
||||
<p>{{ 'noClientsMessage' | translate }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -35,11 +35,11 @@
|
|||
</mat-dialog-content>
|
||||
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="closeModal()">Cancelar</button>
|
||||
<button mat-button (click)="closeModal()">{{ 'cancelButton' | translate }}</button>
|
||||
<button mat-button
|
||||
(click)="executeCommand()"
|
||||
[disabled]="!form.get('clientSelection')?.value.length ||
|
||||
(!form.get('selectedCommand')?.value && !form.get('selectedCommandGroup')?.value)">
|
||||
Ejecutar
|
||||
(click)="executeCommand()"
|
||||
[disabled]="!form.get('clientSelection')?.value.length ||
|
||||
(!form.get('selectedCommand')?.value && !form.get('selectedCommandGroup')?.value)">
|
||||
{{ 'executeButton' | translate }}
|
||||
</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
<mat-list>
|
||||
<mat-list-item>
|
||||
<mat-icon matListItemIcon>apartment</mat-icon>
|
||||
<div matListItemTitle i18n="@@orgUnitTitle">Unidad organizativa</div>
|
||||
<div matListItemTitle>{{ 'orgUnitTitle' | translate }}</div>
|
||||
</mat-list-item>
|
||||
<mat-list-item>
|
||||
<mat-icon matListItemIcon>meeting_room</mat-icon>
|
||||
<div matListItemTitle i18n="@@classroomGroupsTitle">Grupos de aula</div>
|
||||
<div matListItemTitle>{{ 'classroomGroupsTitle' | translate }}</div>
|
||||
</mat-list-item>
|
||||
<mat-list-item>
|
||||
<mat-icon matListItemIcon>school</mat-icon>
|
||||
<div matListItemTitle i18n="@@classroomTitle">Aula</div>
|
||||
<div matListItemTitle>{{ 'classroomTitle' | translate }}</div>
|
||||
</mat-list-item>
|
||||
<mat-list-item>
|
||||
<mat-icon matListItemIcon>lan</mat-icon>
|
||||
<div matListItemTitle i18n="@@clientGroupsTitle">Grupos de clientes</div>
|
||||
<div matListItemTitle>{{ 'clientGroupsTitle' | translate }}</div>
|
||||
</mat-list-item>
|
||||
<mat-list-item>
|
||||
<mat-icon matListItemIcon>computer</mat-icon>
|
||||
<div matListItemTitle i18n="@@clientTitle">Cliente</div>
|
||||
<div matListItemTitle>{{ 'clientTitle' | translate }}</div>
|
||||
</mat-list-item>
|
||||
</mat-list>
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
<h1 mat-dialog-title i18n="@@addOrgUnitTitle">Añadir Unidad Organizativa</h1>
|
||||
<h1 mat-dialog-title>{{ 'addOrgUnitTitle' | translate }}</h1>
|
||||
|
||||
<div mat-dialog-content>
|
||||
<mat-stepper orientation="vertical" [linear]="isLinear">
|
||||
<!-- Step 1: General -->
|
||||
<!-- Paso 1: General -->
|
||||
<mat-step [stepControl]="generalFormGroup">
|
||||
<form [formGroup]="generalFormGroup">
|
||||
<ng-template matStepLabel i18n="@@generalStepLabel">General</ng-template>
|
||||
<ng-template matStepLabel>{{ 'generalStepLabel' | translate }}</ng-template>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@typeLabel">Tipo</mat-label>
|
||||
<mat-label>{{ 'typeLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="type" required>
|
||||
<mat-option *ngFor="let type of types" [value]="type">
|
||||
{{ typeTranslations[type] }}
|
||||
|
@ -15,42 +15,42 @@
|
|||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@nameLabel">Nombre</mat-label>
|
||||
<mat-label>{{ 'nameLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="name" required>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@createOrgUnitparentLabel">Unidad organizativa padre</mat-label>
|
||||
<mat-label>{{ 'createOrgUnitparentLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="parent">
|
||||
<mat-option i18n="@@noParentOption">--</mat-option>
|
||||
<mat-option>{{ 'noParentOption' | translate }}</mat-option>
|
||||
<mat-option *ngFor="let unit of parentUnits" [value]="unit['@id']">{{ unit.name }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@descriptionLabel">Descripción</mat-label>
|
||||
<mat-label>{{ 'descriptionLabel' | translate }}</mat-label>
|
||||
<textarea matInput formControlName="description"></textarea>
|
||||
</mat-form-field>
|
||||
<div>
|
||||
<button mat-button matStepperNext i18n="@@nextButton">Siguiente</button>
|
||||
<button mat-button matStepperNext>{{ 'nextButton' | translate }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</mat-step>
|
||||
|
||||
<!-- Step 2: Classroom Info -->
|
||||
<!-- Paso 2: Información del Aula -->
|
||||
<mat-step *ngIf="generalFormGroup.value.type === 'classroom'" [stepControl]="classroomInfoFormGroup">
|
||||
<form [formGroup]="classroomInfoFormGroup">
|
||||
<ng-template matStepLabel i18n="@@classroomInfoStepLabel">Información del Aula</ng-template>
|
||||
<ng-template matStepLabel>{{ 'classroomInfoStepLabel' | translate }}</ng-template>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@locationLabel">Ubicación</mat-label>
|
||||
<mat-label>{{ 'locationLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="location">
|
||||
</mat-form-field>
|
||||
<mat-slide-toggle formControlName="projector" i18n="@@projectorToggle">Proyector</mat-slide-toggle>
|
||||
<mat-slide-toggle formControlName="board" i18n="@@boardToggle">Pizarra</mat-slide-toggle>
|
||||
<mat-slide-toggle formControlName="projector">{{ 'projectorToggle' | translate }}</mat-slide-toggle>
|
||||
<mat-slide-toggle formControlName="board">{{ 'boardToggle' | translate }}</mat-slide-toggle>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@capacityLabel">Aforo</mat-label>
|
||||
<mat-label>{{ 'capacityLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="capacity" type="number">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field" appearance="fill">
|
||||
<mat-label>Calendario Asociado</mat-label>
|
||||
<mat-label>{{ 'associatedCalendarLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="remoteCalendar" (selectionChange)="onCalendarChange($event)">
|
||||
<mat-option *ngFor="let calendar of calendars" [value]="calendar['@id']">
|
||||
{{ calendar.name }}
|
||||
|
@ -59,62 +59,62 @@
|
|||
</mat-form-field>
|
||||
|
||||
<div>
|
||||
<button mat-button matStepperPrevious i18n="@@backButton">Atrás</button>
|
||||
<button mat-button matStepperNext i18n="@@nextButton">Siguiente</button>
|
||||
<button mat-button matStepperPrevious>{{ 'backButton' | translate }}</button>
|
||||
<button mat-button matStepperNext>{{ 'nextButton' | translate }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</mat-step>
|
||||
|
||||
<!-- Step 3: Información Adicional -->
|
||||
<!-- Paso 3: Información Adicional -->
|
||||
<mat-step [stepControl]="additionalInfoFormGroup">
|
||||
<form [formGroup]="additionalInfoFormGroup">
|
||||
<ng-template matStepLabel i18n="@@additionalInfoStepLabel">Información Adicional</ng-template>
|
||||
<ng-template matStepLabel>{{ 'additionalInfoStepLabel' | translate }}</ng-template>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@commentsLabel">Comentarios</mat-label>
|
||||
<mat-label>{{ 'commentsLabel' | translate }}</mat-label>
|
||||
<textarea matInput formControlName="comments"></textarea>
|
||||
</mat-form-field>
|
||||
<div>
|
||||
<button mat-button matStepperPrevious i18n="@@backButton">Atrás</button>
|
||||
<button mat-button matStepperNext i18n="@@nextButton">Siguiente</button>
|
||||
<button mat-button matStepperPrevious>{{ 'backButton' | translate }}</button>
|
||||
<button mat-button matStepperNext>{{ 'nextButton' | translate }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</mat-step>
|
||||
|
||||
<!-- Step 4: Configuración de Red -->
|
||||
<!-- Paso 4: Configuración de Red -->
|
||||
<mat-step *ngIf="generalFormGroup.value.type === 'classroom'" [stepControl]="networkSettingsFormGroup">
|
||||
<form [formGroup]="networkSettingsFormGroup">
|
||||
<ng-template matStepLabel i18n="@@networkSettingsStepLabel">Configuración de Red</ng-template>
|
||||
<ng-template matStepLabel>{{ 'networkSettingsStepLabel' | translate }}</ng-template>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@nextServerLabel">NextServer</mat-label>
|
||||
<mat-label>{{ 'nextServerLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="nextServer">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@bootFileNameLabel">bootFileName</mat-label>
|
||||
<mat-label>{{ 'bootFileNameLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="bootFileName">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@proxyUrlLabel">Url servidor Proxy</mat-label>
|
||||
<mat-label>{{ 'proxyUrlLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="proxy">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@dnsIpLabel">IP servidor DNS</mat-label>
|
||||
<mat-label>{{ 'dnsIpLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="dns">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@netmaskLabel">Máscara de Red</mat-label>
|
||||
<mat-label>{{ 'netmaskLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="netmask">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@routerLabel">Router</mat-label>
|
||||
<mat-label>{{ 'routerLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="router">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@ntpIpLabel">IP servidor NTP</mat-label>
|
||||
<mat-label>{{ 'ntpIpLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="ntp">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@p2pModeLabel">Modo P2P</mat-label>
|
||||
<mat-label>{{ 'p2pModeLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="p2pMode">
|
||||
<mat-option *ngFor="let option of p2pModeOptions" [value]="option.value">
|
||||
{{ option.name }}
|
||||
|
@ -122,23 +122,23 @@
|
|||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@p2pTimeLabel">Tiempo P2P</mat-label>
|
||||
<mat-label>{{ 'p2pTimeLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="p2pTime" type="number">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mcastIpLabel">IP Multicast</mat-label>
|
||||
<mat-label>{{ 'mcastIpLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="mcastIp">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mcastSpeedLabel">Velocidad Multicast</mat-label>
|
||||
<mat-label>{{ 'mcastSpeedLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="mcastSpeed" type="number">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mcastPortLabel">Puerto Multicast</mat-label>
|
||||
<mat-label>{{ 'mcastPortLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="mcastPort" type="number">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mcastModeLabel">Modo Multicast</mat-label>
|
||||
<mat-label>{{ 'mcastModeLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="mcastMode">
|
||||
<mat-option *ngFor="let option of multicastModeOptions" [value]="option.value">
|
||||
{{ option.name }}
|
||||
|
@ -146,21 +146,21 @@
|
|||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@menuUrlLabel">Menú URL</mat-label>
|
||||
<mat-label>{{ 'menuUrlLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="menu" type="url">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@hardwareProfileLabel">Perfil de Hardware</mat-label>
|
||||
<mat-label>{{ 'hardwareProfileLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="hardwareProfile">
|
||||
<mat-option *ngFor="let unit of hardwareProfiles" [value]="unit['@id']">{{ unit.description }}</mat-option>
|
||||
</mat-select>
|
||||
<mat-error i18n="@@urlFormatError">Formato de URL inválido.</mat-error>
|
||||
<mat-error>{{ 'urlFormatError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
</mat-step>
|
||||
</mat-stepper>
|
||||
</div>
|
||||
<div mat-dialog-actions align="end">
|
||||
<button mat-button (click)="onNoClick()" i18n="@@cancelButton">Cancelar</button>
|
||||
<button mat-button (click)="onSubmit()" [disabled]="!networkSettingsFormGroup.valid" i18n="@@submitButton">Añadir</button>
|
||||
<button mat-button (click)="onNoClick()">{{ 'cancelButton' | translate }}</button>
|
||||
<button mat-button (click)="onSubmit()" [disabled]="!networkSettingsFormGroup.valid">{{ 'submitButton' | translate }}</button>
|
||||
</div>
|
||||
|
|
|
@ -1,163 +1,154 @@
|
|||
<h1 mat-dialog-title i18n="@@editOrgUnitTitle">Editar Unidad Organizativa</h1>
|
||||
<h1 mat-dialog-title>{{ 'editOrgUnitTitle' | translate }}</h1>
|
||||
<div mat-dialog-content>
|
||||
<mat-stepper orientation="vertical" [linear]="isLinear">
|
||||
<!-- Step 1: General -->
|
||||
<!-- Paso 1: General -->
|
||||
<mat-step [stepControl]="generalFormGroup">
|
||||
<form [formGroup]="generalFormGroup">
|
||||
<ng-template matStepLabel i18n="@@generalStepLabel">General</ng-template>
|
||||
<ng-template matStepLabel>{{ 'generalStepLabel' | translate }}</ng-template>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@typeLabel">Tipo</mat-label>
|
||||
<mat-label>{{ 'typeLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="type" required>
|
||||
<mat-option *ngFor="let type of types" [value]="type">{{ type }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@nameLabel">Nombre</mat-label>
|
||||
<mat-label>{{ 'nameLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="name" required>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@editOrgUnitParentLabel">Padre</mat-label>
|
||||
<mat-label>{{ 'editOrgUnitParentLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="parent">
|
||||
<mat-option *ngFor="let unit of parentUnits" [value]="unit['@id']">{{ unit.name }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@descriptionLabel">Descripción</mat-label>
|
||||
<mat-label>{{ 'descriptionLabel' | translate }}</mat-label>
|
||||
<textarea matInput formControlName="description"></textarea>
|
||||
</mat-form-field>
|
||||
<div>
|
||||
<button mat-button matStepperNext i18n="@@nextButton">Siguiente</button>
|
||||
<button mat-button matStepperNext>{{ 'nextButton' | translate }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</mat-step>
|
||||
|
||||
<!-- Step 2: Classroom Info -->
|
||||
<!-- Paso 2: Información del Aula -->
|
||||
<mat-step *ngIf="generalFormGroup.value.type === 'classroom'" [stepControl]="classroomInfoFormGroup">
|
||||
<form [formGroup]="classroomInfoFormGroup">
|
||||
<ng-template matStepLabel i18n="@@classroomInfoStepLabel">Información del Aula</ng-template>
|
||||
<ng-template matStepLabel>{{ 'classroomInfoStepLabel' | translate }}</ng-template>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@locationLabel">Ubicación</mat-label>
|
||||
<mat-label>{{ 'locationLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="location">
|
||||
</mat-form-field>
|
||||
<mat-slide-toggle formControlName="projector" i18n="@@projectorToggle">Proyector</mat-slide-toggle>
|
||||
<mat-slide-toggle formControlName="board" i18n="@@boardToggle">Pizarra</mat-slide-toggle>
|
||||
<mat-slide-toggle formControlName="projector">{{ 'projectorToggle' | translate }}</mat-slide-toggle>
|
||||
<mat-slide-toggle formControlName="board">{{ 'boardToggle' | translate }}</mat-slide-toggle>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@capacityLabel">Aforo</mat-label>
|
||||
<mat-label>{{ 'capacityLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="capacity" type="number">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="form-field" appearance="fill">
|
||||
<mat-label>Calendario Asociado</mat-label>
|
||||
<mat-label>{{ 'associatedCalendarLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="remoteCalendar" (selectionChange)="onCalendarChange($event)">
|
||||
<mat-option *ngFor="let calendar of calendars" [value]="calendar['@id']">
|
||||
<mat-option *ngFor="let calendar of calendars" [value]="calendar['@id']">
|
||||
{{ calendar.name }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<div>
|
||||
<button mat-button matStepperPrevious i18n="@@backButton">Atrás</button>
|
||||
<button mat-button matStepperNext i18n="@@nextButton">Siguiente</button>
|
||||
<button mat-button matStepperPrevious>{{ 'backButton' | translate }}</button>
|
||||
<button mat-button matStepperNext>{{ 'nextButton' | translate }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</mat-step>
|
||||
|
||||
|
||||
<!-- Step 3: Información Adicional -->
|
||||
<!-- Paso 3: Información Adicional -->
|
||||
<mat-step [stepControl]="additionalInfoFormGroup">
|
||||
<form [formGroup]="additionalInfoFormGroup">
|
||||
<ng-template matStepLabel i18n="@@additionalInfoStepLabel">Información Adicional</ng-template>
|
||||
<ng-template matStepLabel>{{ 'additionalInfoStepLabel' | translate }}</ng-template>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@commentsLabel">Comentarios</mat-label>
|
||||
<mat-label>{{ 'commentsLabel' | translate }}</mat-label>
|
||||
<textarea matInput formControlName="comments"></textarea>
|
||||
</mat-form-field>
|
||||
<div>
|
||||
<button mat-button matStepperPrevious i18n="@@backButton">Atrás</button>
|
||||
<button mat-button matStepperNext i18n="@@nextButton">Siguiente</button>
|
||||
<button mat-button matStepperPrevious>{{ 'backButton' | translate }}</button>
|
||||
<button mat-button matStepperNext>{{ 'nextButton' | translate }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</mat-step>
|
||||
|
||||
<!-- Step 4: Configuración de Red -->
|
||||
<!-- Paso 4: Configuración de Red -->
|
||||
<mat-step [stepControl]="networkSettingsFormGroup">
|
||||
<form [formGroup]="networkSettingsFormGroup">
|
||||
<ng-template matStepLabel i18n="@@networkSettingsStepLabel">Configuración de Red</ng-template>
|
||||
<ng-template matStepLabel>{{ 'networkSettingsStepLabel' | translate }}</ng-template>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@proxyUrlLabel">Url servidor Proxy</mat-label>
|
||||
<mat-label>{{ 'proxyUrlLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="proxy">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@dnsIpLabel">IP servidor DNS</mat-label>
|
||||
<mat-label>{{ 'dnsIpLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="dns">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@netmaskLabel">Máscara de Red</mat-label>
|
||||
<mat-label>{{ 'netmaskLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="netmask">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@routerLabel">Router</mat-label>
|
||||
<mat-label>{{ 'routerLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="router">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@ntpIpLabel">IP servidor NTP</mat-label>
|
||||
<mat-label>{{ 'ntpIpLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="ntp">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@p2pModeLabel">Modo P2P</mat-label>
|
||||
<mat-label>{{ 'p2pModeLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="p2pMode">
|
||||
<mat-option
|
||||
*ngFor="let option of p2pModeOptions"
|
||||
[value]="option.value">
|
||||
{{ option.name }}
|
||||
</mat-option>
|
||||
<mat-option *ngFor="let option of p2pModeOptions" [value]="option.value">{{ option.name }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@p2pTimeLabel">Tiempo P2P</mat-label>
|
||||
<mat-label>{{ 'p2pTimeLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="p2pTime" type="number">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mcastIpLabel">IP Multicast</mat-label>
|
||||
<mat-label>{{ 'mcastIpLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="mcastIp">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mcastSpeedLabel">Velocidad Multicast</mat-label>
|
||||
<mat-label>{{ 'mcastSpeedLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="mcastSpeed" type="number">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mcastPortLabel">Puerto Multicast</mat-label>
|
||||
<mat-label>{{ 'mcastPortLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="mcastPort" type="number">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@mcastModeLabel">Modo Multicast</mat-label>
|
||||
<mat-label>{{ 'mcastModeLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="mcastMode">
|
||||
<mat-option
|
||||
*ngFor="let option of multicastModeOptions"
|
||||
[value]="option.value">
|
||||
{{ option.name }}
|
||||
</mat-option>
|
||||
<mat-option *ngFor="let option of multicastModeOptions" [value]="option.value">{{ option.name }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@menuUrlLabel">Menú URL</mat-label>
|
||||
<mat-label>{{ 'menuUrlLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="menu" type="url">
|
||||
</mat-form-field>
|
||||
<mat-form-field class="form-field">
|
||||
<mat-label i18n="@@hardwareProfileLabel">Perfil de Hardware</mat-label>
|
||||
<mat-label>{{ 'hardwareProfileLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="hardwareProfile">
|
||||
<mat-option *ngFor="let unit of hardwareProfiles" [value]="unit['@id']">{{ unit.description }} </mat-option>
|
||||
<mat-option *ngFor="let unit of hardwareProfiles" [value]="unit['@id']">{{ unit.description }}</mat-option>
|
||||
</mat-select>
|
||||
<mat-error i18n="@@urlFormatError">Formato de URL inválido.</mat-error>
|
||||
<mat-error>{{ 'urlFormatError' | translate }}</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-slide-toggle formControlName="validation" i18n="@@validationToggle">Validación</mat-slide-toggle>
|
||||
<mat-slide-toggle formControlName="validation">{{ 'validationToggle' | translate }}</mat-slide-toggle>
|
||||
<div>
|
||||
<button mat-button matStepperPrevious i18n="@@backButton">Atrás</button>
|
||||
<button mat-button (click)="onSubmit()" [disabled]="!networkSettingsFormGroup.valid" i18n="@@submitButton">Añadir</button>
|
||||
<button mat-button matStepperPrevious>{{ 'backButton' | translate }}</button>
|
||||
<button mat-button (click)="onSubmit()" [disabled]="!networkSettingsFormGroup.valid">{{ 'submitButton' | translate }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</mat-step>
|
||||
</mat-stepper>
|
||||
</div>
|
||||
<div mat-dialog-actions>
|
||||
<button mat-button (click)="onNoClick()" i18n="@@cancelButton">Cancelar</button>
|
||||
<button mat-button (click)="onNoClick()">{{ 'cancelButton' | translate }}</button>
|
||||
</div>
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
<h1 mat-dialog-title i18n="@@orgUnitPropertiesTitle">Propiedades unidad organizativa</h1>
|
||||
<h1 mat-dialog-title>{{ 'orgUnitPropertiesTitle' | translate }}</h1>
|
||||
<div mat-dialog-content>
|
||||
<mat-tab-group dynamicHeight>
|
||||
<mat-tab label="Datos generales" i18n-label="@@generalDataTab">
|
||||
<mat-tab label="{{ 'generalDataTab' | translate }}">
|
||||
<table mat-table [dataSource]="generalData" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="property">
|
||||
<th mat-header-cell *matHeaderCellDef i18n-header="@@propertyHeader"> Propiedad </th>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'propertyHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element"> {{ element.property }} </td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="value">
|
||||
<th mat-header-cell *matHeaderCellDef i18n-header="@@valueHeader"> Valor </th>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'valueHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element"> {{ element.value }} </td>
|
||||
</ng-container>
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
</mat-tab>
|
||||
<mat-tab [disabled]="data.data.type !== 'classroom'" label="Propiedades aula y de red" i18n-label="@@classroomNetworkPropertiesTab">
|
||||
<mat-tab [disabled]="data.data.type !== 'classroom'" label="{{ 'classroomNetworkPropertiesTab' | translate }}">
|
||||
<table mat-table [dataSource]="networkData" class="mat-elevation-z8">
|
||||
<ng-container matColumnDef="property">
|
||||
<th mat-header-cell *matHeaderCellDef i18n-header="@@propertyHeader"> Propiedad </th>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'propertyHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element"> {{ element.property }} </td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="value">
|
||||
<th mat-header-cell *matHeaderCellDef i18n-header="@@valueHeader"> Valor </th>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'valueHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let element"> {{ element.value }} </td>
|
||||
</ng-container>
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<h1 mat-dialog-title i18n="@@viewTreeTitle">Visualizar árbol unidad Organizativa</h1>
|
||||
<h1 mat-dialog-title>{{ 'viewTreeTitle' | translate }}</h1>
|
||||
|
||||
<mat-dialog-content>
|
||||
<mat-tree [dataSource]="dataSource" [treeControl]="treeControl" class="tree">
|
||||
|
@ -11,16 +11,15 @@
|
|||
<ng-container *ngSwitchCase="'clients-group'">lan</ng-container>
|
||||
<ng-container *ngSwitchDefault>help_outline</ng-container>
|
||||
</mat-icon>
|
||||
{{node.name}}
|
||||
{{ node.name }}
|
||||
</mat-tree-node>
|
||||
<!-- This is the tree node template for expandable nodes -->
|
||||
|
||||
<!-- Nodo expandible -->
|
||||
<mat-nested-tree-node *matTreeNodeDef="let node; when: hasChild">
|
||||
<div class="mat-tree-node">
|
||||
<button mat-icon-button matTreeNodeToggle
|
||||
[attr.aria-label]="'Toggle ' + node.name"
|
||||
i18n-aria-label="@@toggleNodeAriaLabel">
|
||||
<button mat-icon-button matTreeNodeToggle [attr.aria-label]="'Toggle ' + node.name | translate">
|
||||
<mat-icon class="mat-icon-rtl-mirror">
|
||||
{{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
|
||||
{{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}
|
||||
</mat-icon>
|
||||
</button>
|
||||
<div class="item-content">
|
||||
|
@ -32,13 +31,11 @@
|
|||
<ng-container *ngSwitchCase="'clients-group'">lan</ng-container>
|
||||
<ng-container *ngSwitchDefault>help_outline</ng-container>
|
||||
</mat-icon>
|
||||
{{node.name}}
|
||||
{{ node.name }}
|
||||
</div>
|
||||
</div>
|
||||
<!-- There is inline padding applied to this div using styles.
|
||||
This padding value depends on the mat-icon-button width. -->
|
||||
<div [class.tree-invisible]="!treeControl.isExpanded(node)"
|
||||
role="group">
|
||||
|
||||
<div [class.tree-invisible]="!treeControl.isExpanded(node)" role="group">
|
||||
<ng-container matTreeNodeOutlet></ng-container>
|
||||
<mat-list *ngIf="node.clients">
|
||||
<mat-list-item *ngFor="let client of node.clients">
|
||||
|
@ -51,6 +48,7 @@
|
|||
</mat-nested-tree-node>
|
||||
</mat-tree>
|
||||
</mat-dialog-content>
|
||||
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button (click)="close()" i18n="@@closeButton">Cerrar</button>
|
||||
<button mat-button (click)="close()">{{ 'closeButton' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -3,12 +3,12 @@
|
|||
<mat-dialog-content class="dialog-content">
|
||||
<form [formGroup]="imageForm" (ngSubmit)="saveImage()" class="image-form">
|
||||
<mat-form-field appearance="fill" class="form-field">
|
||||
<mat-label>Nombre de la imagen</mat-label>
|
||||
<mat-label>{{ 'imageNameLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="name" required>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="form-field">
|
||||
<mat-label>Repositorio</mat-label>
|
||||
<mat-label>{{ 'repositoryLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="imageRepository" required>
|
||||
<mat-option *ngFor="let imageRepository of repositories" [value]="imageRepository['@id']">
|
||||
{{ imageRepository.name }}
|
||||
|
@ -17,12 +17,12 @@
|
|||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="form-field">
|
||||
<mat-label>Descripción</mat-label>
|
||||
<mat-label>{{ 'descriptionLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="description" name="description">
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="form-field">
|
||||
<mat-label>Comentarios</mat-label>
|
||||
<mat-label>{{ 'commentsLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="comments" name="comments">
|
||||
</mat-form-field>
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
|||
formControlName="remotePc"
|
||||
class="example-margin"
|
||||
>
|
||||
Remote Pc
|
||||
{{ 'remotePcLabel' | translate }}
|
||||
</mat-checkbox>
|
||||
|
||||
<mat-divider *ngIf="imageId && partitionInfo"></mat-divider>
|
||||
|
@ -57,6 +57,6 @@
|
|||
</mat-dialog-content>
|
||||
|
||||
<mat-dialog-actions align="end" class="dialog-actions">
|
||||
<button mat-button (click)="close()">Cancelar</button>
|
||||
<button mat-button color="primary" (click)="saveImage()">Guardar</button>
|
||||
<button mat-button (click)="close()">{{ 'cancelButton' | translate }}</button>
|
||||
<button mat-button color="primary" (click)="saveImage()">{{ 'saveButton' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -3,19 +3,17 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" joyrideStep="imagesTitleStep" text="En esta pantalla, puedes gestionar las imágenes disponibles.">
|
||||
Administrar imágenes
|
||||
</h2>
|
||||
<h2 class="title">{{ 'imagesTitle' | translate }}</h2>
|
||||
<div class="images-button-row">
|
||||
<button mat-flat-button color="primary" (click)="addImage()" joyrideStep="addImageButton" text="Añade una nueva imagen a la lista.">
|
||||
Añadir imagen
|
||||
<button mat-flat-button color="primary" (click)="addImage()">
|
||||
{{ 'addImageButton' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
<div class="search-container">
|
||||
<mat-form-field appearance="fill" class="search-string" joyrideStep="searchImageField" text="Busca una imagen por nombre. Pulsa 'enter' para iniciar la búsqueda.">
|
||||
<mat-form-field appearance="fill" class="search-string" joyrideStep="searchImagesField" text="Busca una imagen por nombre. Pulsa 'enter' para iniciar la búsqueda.">
|
||||
<mat-label>Buscar nombre de imagen</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
|
@ -23,6 +21,20 @@
|
|||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
<td mat-cell *matCellDef="let image" >
|
||||
<ng-container *ngIf="column.columnDef === 'remotePc'">
|
||||
<mat-icon [color]="image[column.columnDef] ? 'primary' : 'warn'">
|
||||
{{ image[column.columnDef] ? 'check_circle' : 'cancel' }}
|
||||
</mat-icon>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="column.columnDef !== 'remotePc'">
|
||||
{{ column.cell(image) }}
|
||||
</ng-container>
|
||||
</td>
|
||||
</ng-container>
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="imagesTable" text="Esta tabla muestra las imágenes disponibles.">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
|
@ -66,7 +78,54 @@
|
|||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
|
||||
<div class="paginator-container" joyrideStep="imagesPagination" text="Navega entre las páginas de imágenes.">
|
||||
<div class="paginator-container">
|
||||
<mat-paginator [length]="length"
|
||||
[pageSize]="itemsPerPage"
|
||||
[pageIndex]="page"
|
||||
[pageSizeOptions]="[5, 10, 20, 40, 100]"
|
||||
(page)="onPageChange($event)">
|
||||
</mat-paginator>
|
||||
</div>
|
||||
<div class="search-container">
|
||||
<mat-form-field appearance="fill" class="search-string">
|
||||
<mat-label>{{ 'searchLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="{{ 'searchPlaceholder' | translate }}" [(ngModel)]="filters['name']" (keyup.enter)="search()">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint>{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
<td mat-cell *matCellDef="let image">
|
||||
<ng-container *ngIf="column.columnDef === 'remotePc'">
|
||||
<mat-icon [color]="image[column.columnDef] ? 'primary' : 'warn'">
|
||||
{{ image[column.columnDef] ? 'check_circle' : 'cancel' }}
|
||||
</mat-icon>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="column.columnDef !== 'remotePc'">
|
||||
{{ column.cell(image) }}
|
||||
</ng-container>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef class="actions-header">{{ 'columnActions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let client">
|
||||
<button mat-icon-button color="primary" (click)="editImage($event, client)">
|
||||
<mat-icon>{{ 'editButtonIcon' | translate }}</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="warn" (click)="deleteImage($event, client)">
|
||||
<mat-icon>{{ 'deleteButtonIcon' | translate }}</mat-icon>
|
||||
</button>
|
||||
</td>
|
||||
</ng-container>
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
|
||||
<div class="paginator-container">
|
||||
<mat-paginator [length]="length"
|
||||
[pageSize]="itemsPerPage"
|
||||
[pageIndex]="page"
|
||||
|
|
|
@ -226,7 +226,7 @@ export class ImagesComponent implements OnInit {
|
|||
steps: [
|
||||
'imagesTitleStep',
|
||||
'addImageButton',
|
||||
'searchImageField',
|
||||
'searchImagesField',
|
||||
'imagesTable',
|
||||
'actionsHeader',
|
||||
'editImageButton',
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
<div>
|
||||
<form class="login" (ngSubmit)="onLogin()" #loginForm="ngForm" (keydown.enter)="onLogin()">
|
||||
<img src="assets/images/logo.png" alt="Opengnsys" class="login-logo" [class.rotating]="isLoading">
|
||||
<h2 i18n="@@headerOpengnsys">Opengnsys</h2>
|
||||
<h2>Opengnsys</h2>
|
||||
<mat-form-field>
|
||||
<mat-label i18n="@@loginlabelUsername">Introduce tu usuario</mat-label>
|
||||
<mat-label>{{ 'loginlabelUsername' | translate }}</mat-label>
|
||||
<input matInput [(ngModel)]="loginObj.username" name="username" required #usernameInput="ngModel"
|
||||
[ngClass]="{'invalid': !usernameInput.valid && usernameInput.touched}" />
|
||||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label i18n="@@loginlabelPassword">Introduce tu contraseña</mat-label>
|
||||
<mat-label>{{ 'loginlabelPassword' | translate }}</mat-label>
|
||||
<input matInput (keydown.enter)="$event.preventDefault()" [type]="hide() ? 'password' : 'text'" required
|
||||
[(ngModel)]="loginObj.password" name="password" />
|
||||
<button mat-icon-button matSuffix type="button" (click)="clickEvent($event)" [attr.aria-label]="'Ocultar contraseña'">
|
||||
|
@ -16,14 +16,12 @@
|
|||
</button>
|
||||
</mat-form-field>
|
||||
<div class="button-row">
|
||||
<button mat-flat-button color="primary" type="submit" [disabled]="!loginObj.username || !loginObj.password"
|
||||
i18n="@@buttonLogin">Iniciar sesión</button>
|
||||
<button mat-flat-button color="primary" type="submit" [disabled]="!loginObj.username || !loginObj.password">
|
||||
{{ 'buttonLogin' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- BORRAR DESPUES DE LA DEMO -->
|
||||
<button mat-flat-button (click)="redirectToUrl1()">Español</button>
|
||||
|
||||
<!-- Botón para redirigir a http://localhost:4200/auth/login -->
|
||||
<button mat-flat-button (click)="redirectToUrl2()">Inglés</button>
|
||||
<button mat-flat-button (click)="changeLanguage('es')">Español</button>
|
||||
<button mat-flat-button (click)="changeLanguage('en')">Inglés</button>
|
||||
|
|
|
@ -2,11 +2,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|||
import { LoginComponent } from './login.component';
|
||||
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { ToastrModule } from 'ngx-toastr'; // Importa el módulo de Toastr
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; // Importa el módulo de animaciones
|
||||
import { MatFormFieldModule } from '@angular/material/form-field'; // Importa MatFormFieldModule
|
||||
import { MatInputModule } from '@angular/material/input'; // Importa MatInputModule
|
||||
import { MatIconModule } from '@angular/material/icon'; // Importa MatIconModule
|
||||
import { ToastrModule } from 'ngx-toastr';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
describe('LoginComponent', () => {
|
||||
let component: LoginComponent;
|
||||
|
@ -21,7 +22,8 @@ describe('LoginComponent', () => {
|
|||
BrowserAnimationsModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
MatIconModule
|
||||
MatIconModule,
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [provideHttpClient(withInterceptorsFromDi())]
|
||||
})
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { HttpClient } from '@angular/common/http';
|
||||
import {Component, signal} from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import {ToastrService} from "ngx-toastr";
|
||||
|
||||
@Component({
|
||||
|
@ -22,7 +23,11 @@ export class LoginComponent {
|
|||
private http: HttpClient,
|
||||
private router: Router,
|
||||
private toastService: ToastrService,
|
||||
) { }
|
||||
private translateService: TranslateService
|
||||
) {
|
||||
const savedLanguage = localStorage.getItem('language') || 'es';
|
||||
this.translateService.use(savedLanguage);
|
||||
}
|
||||
|
||||
onLogin() {
|
||||
this.errorMessage = '';
|
||||
|
@ -77,12 +82,8 @@ export class LoginComponent {
|
|||
}
|
||||
}
|
||||
|
||||
// SOLO PARA LA DEMO BORRAR EN PRODUCCIÓN
|
||||
redirectToUrl1() {
|
||||
window.location.href = 'http://localhost:4200/auth/login';
|
||||
}
|
||||
|
||||
redirectToUrl2() {
|
||||
window.location.href = 'http://localhost:4201/auth/login';
|
||||
changeLanguage(language: string) {
|
||||
localStorage.setItem('language', language);
|
||||
this.translateService.use(language);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,17 @@
|
|||
<div class="dashboard">
|
||||
<div class="header-container" >
|
||||
<h2 joyrideStep="titleStep" text="Esta sección muestra el estado general del servidor OgBoot.">OgBoot server Status</h2>
|
||||
<div class="header-container">
|
||||
<h2 joyrideStep="titleStep" text="Esta sección muestra el estado general del servidor OgBoot.">
|
||||
{{ 'ogBootServerStatus' | translate }}
|
||||
</h2>
|
||||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="disk-usage-container">
|
||||
<div class="disk-usage" joyrideStep="diskUsageStep" text="Visualiza el uso del disco del servidor.">
|
||||
<h3>Uso de disco</h3>
|
||||
<!-- Disk Usage Section -->
|
||||
<div class="disk-usage" joyrideStep="diskUsageStep" text="{{ 'diskUsageDescription' | translate }}">
|
||||
<h3>{{ 'diskUsageTitle' | translate }}</h3>
|
||||
<ngx-charts-pie-chart
|
||||
[view]="view"
|
||||
[scheme]="colorScheme"
|
||||
|
@ -19,36 +22,38 @@
|
|||
[legend]="showLegend">
|
||||
</ngx-charts-pie-chart>
|
||||
<div class="disk-usage-info">
|
||||
<p>Total: {{ formatBytes(diskUsage.total) }}</p>
|
||||
<p>Ocupado: {{ formatBytes(diskUsage.used) }}</p>
|
||||
<p>Disponible: {{ formatBytes(diskUsage.available) }}</p>
|
||||
<p>Libre: {{ diskUsage.percentage }}%</p>
|
||||
<p>{{ 'totalLabel' | translate }}: {{ formatBytes(diskUsage.total) }}</p>
|
||||
<p>{{ 'usedLabel' | translate }}: {{ formatBytes(diskUsage.used) }}</p>
|
||||
<p>{{ 'availableLabel' | translate }}: {{ formatBytes(diskUsage.available) }}</p>
|
||||
<p>{{ 'freeLabel' | translate }}: {{ diskUsage.percentage }}%</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="services-status" joyrideStep="servicesStatusStep" text="Aquí puedes ver el estado de los servicios importantes del servidor.">
|
||||
<h3>Servicios</h3>
|
||||
<!-- Services Status Section -->
|
||||
<div class="services-status" joyrideStep="servicesStatusStep" text="{{ 'servicesStatusDescription' | translate }}">
|
||||
<h3>{{ 'servicesTitle' | translate }}</h3>
|
||||
<ul>
|
||||
<li *ngFor="let service of getServices()">
|
||||
<span
|
||||
class="status-led"
|
||||
[ngClass]="{ 'active': service.status === 'active', 'inactive': service.status !== 'active' }"
|
||||
></span>
|
||||
{{ service.name }}: {{ service.status }}
|
||||
{{ service.name }}: {{ service.status | translate }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="installed-oglives" joyrideStep="oglivesStep" text="Consulta la información de los OGLives instalados en el servidor.">
|
||||
<h3>OGLives instalados</h3>
|
||||
<!-- Installed OgLives Section -->
|
||||
<div class="installed-oglives" joyrideStep="oglivesStep" text="{{ 'oglivesDescription' | translate }}">
|
||||
<h3>{{ 'installedOglivesTitle' | translate }}</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Kernel</th>
|
||||
<th>Architecture</th>
|
||||
<th>Revision</th>
|
||||
<th>{{ 'idLabel' | translate }}</th>
|
||||
<th>{{ 'kernelLabel' | translate }}</th>
|
||||
<th>{{ 'architectureLabel' | translate }}</th>
|
||||
<th>{{ 'revisionLabel' | translate }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
|
|
@ -16,6 +16,8 @@ import { MatTableModule } from '@angular/material/table';
|
|||
import { MatTooltipModule } from '@angular/material/tooltip';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { ToastrModule } from 'ngx-toastr';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
describe('OgbootStatusComponent', () => {
|
||||
let component: OgbootStatusComponent;
|
||||
let fixture: ComponentFixture<OgbootStatusComponent>;
|
||||
|
@ -41,7 +43,9 @@ describe('OgbootStatusComponent', () => {
|
|||
MatDialogModule,
|
||||
ReactiveFormsModule,
|
||||
MatSelectModule,
|
||||
NgxChartsModule
|
||||
NgxChartsModule,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
],
|
||||
providers: [
|
||||
{ provide: MatDialogRef, useValue: {} },
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<div class="create-PxeBootFile-container">
|
||||
<h1 mat-dialog-title>{{ isEditMode ? 'Editar Cliente' : 'Añadir Cliente' }}</h1>
|
||||
<h1 mat-dialog-title>{{ isEditMode ? ('editClientTitle' | translate) : ('addClientTitle' | translate) }}</h1>
|
||||
<div class="mat-dialog-content">
|
||||
<mat-form-field appearance="fill">
|
||||
<mat-label>Seleccione una plantilla PXE</mat-label>
|
||||
<mat-label>{{ 'selectPxeTemplateLabel' | translate }}</mat-label>
|
||||
<mat-select [(value)]="selectedPxeTemplate">
|
||||
<mat-option *ngFor="let template of pxeTemplates" [value]="template.uuid">
|
||||
{{ template.name }}
|
||||
|
@ -11,7 +11,9 @@
|
|||
</mat-form-field>
|
||||
</div>
|
||||
<div class="mat-dialog-actions">
|
||||
<button mat-button (click)="onCancel()">Cancelar</button>
|
||||
<button mat-button color="primary" (click)="onSave()">{{ isEditMode ? 'Guardar' : 'Añadir' }}</button>
|
||||
<button mat-button (click)="onCancel()">{{ 'cancelButton' | translate }}</button>
|
||||
<button mat-button color="primary" (click)="onSave()">
|
||||
{{ isEditMode ? ('saveButton' | translate) : ('addButton' | translate) }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,26 +1,32 @@
|
|||
<div class="header-container">
|
||||
<h2 class="title" joyrideStep="titleStep" text="Esta sección permite la asignación masiva de plantillas de arranque a clientes.">Netboot avanzado</h2>
|
||||
<h2 class="title" joyrideStep="titleStep" text="{{ 'advancedNetbootDescription' | translate }}">
|
||||
{{ 'advancedNetbootTitle' | translate }}
|
||||
</h2>
|
||||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div [formGroup]="taskForm" class="search-container">
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="selectUnitStep" text="Selecciona la Unidad Organizacional para listar las aulas disponibles.">
|
||||
<mat-label>Selecciona Unidad Organizacional</mat-label>
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="selectUnitStep" text="{{ 'selectUnitDescription' | translate }}">
|
||||
<mat-label>{{ 'selectUnitLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="organizationalUnit" (selectionChange)="onOrganizationalUnitChange()">
|
||||
<mat-option *ngIf="loadingUnits" disabled>Cargando unidades...</mat-option>
|
||||
<mat-option *ngIf="loadingUnits" disabled>{{ 'loadingUnitsOption' | translate }}</mat-option>
|
||||
<mat-option *ngFor="let unit of availableOrganizationalUnits" [value]="unit['@id']">
|
||||
{{ unit.name }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error *ngIf="taskForm.get('organizationalUnit')?.invalid">Este campo es obligatorio</mat-error>
|
||||
<mat-error *ngIf="taskForm.get('organizationalUnit')?.invalid">
|
||||
{{ 'requiredFieldError' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="selectClassStep" text="Selecciona el aula para configurar las plantillas en sus dispositivos.">
|
||||
<mat-label>Selecciona aula</mat-label>
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="selectClassStep" text="{{ 'selectClassDescription' | translate }}">
|
||||
<mat-label>{{ 'selectClassLabel' | translate }}</mat-label>
|
||||
<mat-select formControlName="selectedChild" (selectionChange)="onChildChange()">
|
||||
<mat-option *ngIf="selectedUnitChildren.length === 0" disabled>No hay aulas disponibles</mat-option>
|
||||
<mat-option *ngIf="selectedUnitChildren.length === 0" disabled>
|
||||
{{ 'noClassesOption' | translate }}
|
||||
</mat-option>
|
||||
<mat-option *ngFor="let child of selectedUnitChildren" [value]="child['@id']">
|
||||
{{ child.name }}
|
||||
</mat-option>
|
||||
|
@ -31,34 +37,44 @@
|
|||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="global-selectors">
|
||||
<mat-form-field appearance="fill" class="selected-global" joyrideStep="applyToAllStep" text="Selecciona una plantilla para aplicarla a todos los clientes de esta aula.">
|
||||
<mat-label>Seleccione plantilla para aplicar a todos los clientes</mat-label>
|
||||
<mat-form-field appearance="fill" class="selected-global" joyrideStep="applyToAllStep" text="{{ 'applyToAllDescription' | translate }}">
|
||||
<mat-label>{{ 'applyToAllLabel' | translate }}</mat-label>
|
||||
<mat-select [(value)]="globalOgLive" (selectionChange)="applyToAll()">
|
||||
<mat-option *ngFor="let option of ogLiveOptions" [value]="option['@id']">{{ option.name }}</mat-option>
|
||||
<mat-option *ngFor="let option of ogLiveOptions" [value]="option['@id']">
|
||||
{{ option.name }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<button mat-flat-button color="primary" [disabled]="selectedUnitChildren.length === 0" (click)="saveOgLiveTemplates()" joyrideStep="saveButtonStep" text="Haz clic para guardar la configuración actual de plantillas.">Guardar</button>
|
||||
<button
|
||||
mat-flat-button
|
||||
color="primary"
|
||||
[disabled]="selectedUnitChildren.length === 0"
|
||||
(click)="saveOgLiveTemplates()"
|
||||
joyrideStep="saveButtonStep"
|
||||
text="{{ 'saveButtonDescription' | translate }}">
|
||||
{{ 'saveButtonLabel' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="Administra las plantillas de Netboot para cada cliente en esta tabla.">
|
||||
<mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="{{ 'tableDescription' | translate }}">
|
||||
<ng-container matColumnDef="id">
|
||||
<mat-header-cell *matHeaderCellDef> Id </mat-header-cell>
|
||||
<mat-cell *matCellDef="let element"> {{element.id}} </mat-cell>
|
||||
<mat-header-cell *matHeaderCellDef>{{ 'idColumnHeader' | translate }}</mat-header-cell>
|
||||
<mat-cell *matCellDef="let element"> {{ element.id }} </mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="name">
|
||||
<mat-header-cell *matHeaderCellDef> Nombre </mat-header-cell>
|
||||
<mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
|
||||
<mat-header-cell *matHeaderCellDef>{{ 'nameColumnHeader' | translate }}</mat-header-cell>
|
||||
<mat-cell *matCellDef="let element"> {{ element.name }} </mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="ogLive">
|
||||
<mat-header-cell *matHeaderCellDef> Plantilla </mat-header-cell>
|
||||
<mat-header-cell *matHeaderCellDef>{{ 'templateColumnHeader' | translate }}</mat-header-cell>
|
||||
<mat-cell *matCellDef="let client">
|
||||
<mat-form-field appearance="fill" joyrideStep="selectTemplateStep" text="Selecciona una plantilla específica para cada cliente.">
|
||||
<mat-label>Seleccione una plantilla</mat-label>
|
||||
<mat-form-field appearance="fill" joyrideStep="selectTemplateStep" text="{{ 'selectTemplateDescription' | translate }}">
|
||||
<mat-label>{{ 'selectTemplateLabel' | translate }}</mat-label>
|
||||
<mat-select [(ngModel)]="client.ogLive" [name]="'ogLive' + client.id">
|
||||
<mat-option [value]="null">Ninguna</mat-option>
|
||||
<mat-option [value]="null">{{ 'noTemplateOption' | translate }}</mat-option>
|
||||
<mat-option *ngFor="let template of ogLiveOptions" [value]="template['@id']">
|
||||
{{ template.name }}
|
||||
</mat-option>
|
||||
|
|
|
@ -12,6 +12,8 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
|||
import { FormsModule, NgControl, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
|
||||
describe('PxeBootFilesComponent', () => {
|
||||
let component: PxeBootFilesComponent;
|
||||
|
@ -37,7 +39,9 @@ describe('PxeBootFilesComponent', () => {
|
|||
FormsModule,
|
||||
MatInputModule,
|
||||
MatTableModule,
|
||||
ReactiveFormsModule
|
||||
ReactiveFormsModule,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
],
|
||||
providers: [NgControl]
|
||||
})
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
<mat-accordion class="example-headers-align">
|
||||
<mat-expansion-panel hideToggle>
|
||||
<mat-expansion-panel-header joyrideStep="serverInfoStep" text="Accede a información y opciones de sincronización en el servidor OgBoot.">
|
||||
<mat-panel-title> Información en servidor ogBoot </mat-panel-title>
|
||||
<mat-expansion-panel-header joyrideStep="serverInfoStep" [text]="'serverInfoDescription' | translate">
|
||||
<mat-panel-title>{{ 'serverInfoTitle' | translate }}</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<div class="button-row">
|
||||
<button mat-flat-button color="primary" (click)="syncOgBoot()" > Sincronizar base de datos</button>
|
||||
<button mat-flat-button color="primary" (click)="syncOgBoot()">{{ 'syncDatabaseButton' | translate }}</button>
|
||||
</div>
|
||||
<div class="button-row">
|
||||
<button mat-flat-button color="accent" (click)="openSubnetInfoDialog()" >Ver Información</button>
|
||||
<button mat-flat-button color="accent" (click)="openSubnetInfoDialog()">{{ 'viewInfoButton' | translate }}</button>
|
||||
</div>
|
||||
</mat-expansion-panel>
|
||||
</mat-accordion>
|
||||
|
@ -16,48 +16,57 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" i18n="@@adminImagesTitle" joyrideStep="titleStep" text="Desde aquí puedes gestionar las imágenes configuradas en el servidor OgBoot.">Administrar imágenes</h2>
|
||||
<h2 class="title" joyrideStep="titleStep" [text]="'adminImagesDescription' | translate">
|
||||
{{ 'adminImagesTitle' | translate }}
|
||||
</h2>
|
||||
<div class="images-button-row">
|
||||
<button mat-flat-button color="primary" (click)="addImage()" joyrideStep="addImageStep" text="Haz clic para añadir una nueva imagen.">Añadir imagen</button>
|
||||
<button mat-flat-button color="primary" (click)="addImage()" joyrideStep="addImageStep" [text]="'addImageButtonDescription' | translate">
|
||||
{{ 'addImageButton' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="search-container">
|
||||
<mat-form-field appearance="fill" class="search-string" joyrideStep="searchNameStep" text="Busca imágenes por nombre para encontrar rápidamente una imagen específica.">
|
||||
<mat-label i18n="@@searchLabel">Buscar nombre de imagen</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-form-field appearance="fill" class="search-string" joyrideStep="searchNameStep" [text]="'searchNameDescription' | translate">
|
||||
<mat-label>{{ 'searchLabel' | translate }}</mat-label>
|
||||
<input matInput [placeholder]="'searchPlaceholder' | translate" [(ngModel)]="filters['name']" (keyup.enter)="search()">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint>{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="searchDefaultImageStep" text="Filtra las imágenes para mostrar solo las imágenes por defecto o no por defecto.">
|
||||
<mat-label i18n="@@searchLabel">Imagen por defecto</mat-label>
|
||||
<mat-select [(ngModel)]="filters['isDefault']" (selectionChange)="search()" placeholder="Seleccionar opción">
|
||||
<mat-option [value]="''">Todos</mat-option>
|
||||
<mat-option [value]="true">Sí</mat-option>
|
||||
<mat-option [value]="false">No</mat-option>
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="searchDefaultImageStep" [text]="'searchDefaultDescription' | translate">
|
||||
<mat-label>{{ 'searchDefaultLabel' | translate }}</mat-label>
|
||||
<mat-select [(ngModel)]="filters['isDefault']" (selectionChange)="search()" [placeholder]="'selectOptionPlaceholder' | translate">
|
||||
<mat-option [value]="''">{{ 'allOption' | translate }}</mat-option>
|
||||
<mat-option [value]="true">{{ 'yesOption' | translate }}</mat-option>
|
||||
<mat-option [value]="false">{{ 'noOption' | translate }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="searchInstalledStep" text="Filtra las imágenes para mostrar solo las instaladas en el servidor OgBoot.">
|
||||
<mat-label i18n="@@searchLabel">Instalado servidor ogBoot</mat-label>
|
||||
<mat-select [(ngModel)]="filters['installed']" (selectionChange)="search()" placeholder="Seleccionar opción">
|
||||
<mat-option [value]="''">Todos</mat-option>
|
||||
<mat-option [value]="true">Sí</mat-option>
|
||||
<mat-option [value]="false">No</mat-option>
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="searchInstalledStep" [text]="'searchInstalledDescription' | translate">
|
||||
<mat-label>{{ 'searchInstalledLabel' | translate }}</mat-label>
|
||||
<mat-select [(ngModel)]="filters['installed']" (selectionChange)="search()" [placeholder]="'selectOptionPlaceholder' | translate">
|
||||
<mat-option [value]="''">{{ 'allOption' | translate }}</mat-option>
|
||||
<mat-option [value]="true">{{ 'yesOption' | translate }}</mat-option>
|
||||
<mat-option [value]="false">{{ 'noOption' | translate }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="Aquí se muestra la lista de imágenes disponibles para administrar.">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" [text]="'tableDescription' | translate">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ column.header }}</th>
|
||||
<td mat-cell *matCellDef="let image">
|
||||
<ng-container *ngIf="column.columnDef === 'isDefault' || column.columnDef === 'installed'">
|
||||
<mat-icon [color]="image[column.columnDef] ? 'primary' : 'warn'">
|
||||
{{ image[column.columnDef] ? 'check_circle' : 'cancel' }}
|
||||
<ng-container *ngIf="image[column.columnDef]; else cancelIcon">
|
||||
{{ 'checkCircle' | translate }}
|
||||
</ng-container>
|
||||
<ng-template #cancelIcon>
|
||||
{{ 'cancelIcon' | translate }}
|
||||
</ng-template>
|
||||
</mat-icon>
|
||||
</ng-container>
|
||||
|
||||
|
@ -79,25 +88,35 @@
|
|||
</mat-chip>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="column.columnDef !== 'isDefault' && column.columnDef !== 'installed' && column.columnDef !== 'downloadUrl' && column.columnDef !== 'status' && column.columnDef !== 'name' ">
|
||||
<ng-container *ngIf="column.columnDef !== 'isDefault' && column.columnDef !== 'installed' && column.columnDef !== 'downloadUrl' && column.columnDef !== 'status' && column.columnDef !== 'name'">
|
||||
{{ column.cell(image) }}
|
||||
</ng-container>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions">Acciones</th>
|
||||
<td mat-cell *matCellDef="let image" joyrideStep="actionsStep" text="Administra cada imagen con opciones para ver, editar, eliminar y más.">
|
||||
<button mat-icon-button color="info" (click)="showOgLive($event, image)"><mat-icon i18n="@@deleteElementTooltip">visibility</mat-icon></button>
|
||||
<button mat-icon-button color="primary" (click)="editImage(image)" i18n="@@editImage"><mat-icon>edit</mat-icon></button>
|
||||
<button mat-icon-button color="warn" (click)="deleteImage(image)" i18n="@@buttonDelete"><mat-icon>delete</mat-icon></button>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'actionsColumnHeader' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let image" joyrideStep="actionsStep" [text]="'actionsDescription' | translate">
|
||||
<button mat-icon-button color="info" (click)="showOgLive($event, image)">
|
||||
<mat-icon>{{ 'viewIcon' | translate }}</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="primary" (click)="editImage(image)">
|
||||
<mat-icon>{{ 'editIcon' | translate }}</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="warn" (click)="deleteImage(image)">
|
||||
<mat-icon>{{ 'deleteIcon' | translate }}</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button [matMenuTriggerFor]="menu">
|
||||
<mat-icon>menu</mat-icon>
|
||||
</button>
|
||||
<mat-menu #menu="matMenu">
|
||||
<button mat-menu-item (click)="toggleAction(image, 'install')">Instalar</button>
|
||||
<button mat-menu-item [disabled]="!image.installed" (click)="toggleAction(image, 'uninstall')">Desinstalar</button>
|
||||
<button mat-menu-item [disabled]="!image.installed" (click)="toggleAction(image, 'set-default')">Cambiar a imagen por defecto</button>
|
||||
<button mat-menu-item (click)="toggleAction(image, 'install')">{{ 'installOption' | translate }}</button>
|
||||
<button mat-menu-item [disabled]="!image.installed" (click)="toggleAction(image, 'uninstall')">
|
||||
{{ 'uninstallOption' | translate }}
|
||||
</button>
|
||||
<button mat-menu-item [disabled]="!image.installed" (click)="toggleAction(image, 'set-default')">
|
||||
{{ 'setDefaultOption' | translate }}
|
||||
</button>
|
||||
</mat-menu>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
@ -106,7 +125,7 @@
|
|||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="Navega entre las páginas de imágenes usando el paginador.">
|
||||
<div class="paginator-container" joyrideStep="paginationStep" [text]="'paginationDescription' | translate">
|
||||
<mat-paginator [length]="length"
|
||||
[pageSize]="itemsPerPage"
|
||||
[pageIndex]="page"
|
||||
|
|
|
@ -13,6 +13,8 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
|||
import { FormsModule } from '@angular/forms';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
|
||||
describe('PXEimagesComponent', () => {
|
||||
let component: PXEimagesComponent;
|
||||
|
@ -39,7 +41,10 @@ describe('PXEimagesComponent', () => {
|
|||
BrowserAnimationsModule,
|
||||
FormsModule,
|
||||
MatInputModule,
|
||||
MatTableModule, ],
|
||||
MatTableModule,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
],
|
||||
providers: [
|
||||
{ provide: ToastrService, useValue: mockToastrService }
|
||||
]
|
||||
|
|
|
@ -1,22 +1,32 @@
|
|||
<h2 mat-dialog-title>Añade clientes a {{data.subnetName}}</h2>
|
||||
<h2 mat-dialog-title>{{ 'addClientsTitle' | translate: { subnetName: data.subnetName } }}</h2>
|
||||
|
||||
<mat-dialog-content>
|
||||
<mat-form-field appearance="fill" class="search-select">
|
||||
<input type="text" matInput [formControl]="clientControl" [matAutocomplete]="clientAuto" placeholder="Seleccione un cliente">
|
||||
<mat-autocomplete #clientAuto="matAutocomplete" [displayWith]="displayFnClient" (optionSelected)="onOptionClientSelected($event.option.value)">
|
||||
<mat-option *ngFor="let client of filteredClients | async" [value]="client">
|
||||
<input
|
||||
type="text"
|
||||
matInput
|
||||
[formControl]="clientControl"
|
||||
[matAutocomplete]="clientAuto"
|
||||
[placeholder]="'selectClientPlaceholder' | translate">
|
||||
<mat-autocomplete
|
||||
#clientAuto="matAutocomplete"
|
||||
[displayWith]="displayFnClient"
|
||||
(optionSelected)="onOptionClientSelected($event.option.value)">
|
||||
<mat-option
|
||||
*ngFor="let client of filteredClients | async"
|
||||
[value]="client">
|
||||
{{ client.name }}
|
||||
</mat-option>
|
||||
</mat-autocomplete>
|
||||
</mat-form-field>
|
||||
|
||||
<div *ngIf="selectedClients.length > 0">
|
||||
<h3>Clientes seleccionados:</h3>
|
||||
<h3>{{ 'selectedClientsTitle' | translate }}</h3>
|
||||
<ul>
|
||||
<li *ngFor="let client of selectedClients">
|
||||
{{ client.name }}
|
||||
<button mat-icon-button color="warn" (click)="removeClient(client)">
|
||||
<mat-icon>delete</mat-icon>
|
||||
<mat-icon>{{ 'deleteIcon' | translate }}</mat-icon>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
@ -24,6 +34,6 @@
|
|||
</mat-dialog-content>
|
||||
|
||||
<mat-dialog-actions>
|
||||
<button mat-button (click)="close()">Cancelar</button>
|
||||
<button mat-button (click)="save()">Añadir</button>
|
||||
<button mat-button (click)="close()">{{ 'cancelButton' | translate }}</button>
|
||||
<button mat-button (click)="save()">{{ 'addButton' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -20,6 +20,7 @@ import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|||
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatListModule } from '@angular/material/list';
|
||||
import { MatTabsModule } from '@angular/material/tabs';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
describe('AddClientsToPxeComponent', () => {
|
||||
let component: AddClientsToPxeComponent;
|
||||
|
@ -47,7 +48,8 @@ describe('AddClientsToPxeComponent', () => {
|
|||
MatSelectModule,
|
||||
MatTabsModule,
|
||||
MatAutocompleteModule,
|
||||
MatListModule
|
||||
MatListModule,
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
{ provide: MatDialogRef, useValue: {} },
|
||||
|
|
|
@ -28,7 +28,6 @@ export class AddClientsToPxeComponent {
|
|||
) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
console.log('Selected subnet UUID:', this.data);
|
||||
this.loading = true;
|
||||
|
||||
this.loadClients();
|
||||
|
|
|
@ -1,19 +1,25 @@
|
|||
<h2 mat-dialog-title>Gestionar clientes </h2>
|
||||
<h2 mat-dialog-title>{{ 'manageClientsTitle' | translate }}</h2>
|
||||
<mat-dialog-content>
|
||||
<mat-list>
|
||||
<ng-container *ngFor="let client of clients">
|
||||
<mat-list-item >
|
||||
<mat-list-item>
|
||||
<div class="list-item-content">
|
||||
<mat-icon matListItemIcon [ngClass]="{'red-icon': client.pxeSync === false || !client.pxeSync, 'green-icon': client.pxeSync === true}">computer</mat-icon>
|
||||
<mat-icon matListItemIcon [ngClass]="{'red-icon': client.pxeSync === false || !client.pxeSync, 'green-icon': client.pxeSync === true}">
|
||||
computer
|
||||
</mat-icon>
|
||||
<div class="text-content">
|
||||
<div matListItemTitle>{{ client.name }}</div>
|
||||
<div matListItemLine>{{ client.mac }}</div>
|
||||
</div>
|
||||
<div class="icon-container">
|
||||
<button mat-icon-button color="info" (click)="showInfo(client)" i18n="@@editImage"> <mat-icon>visibility</mat-icon></button>
|
||||
<button mat-icon-button color="primary" (click)="addClientToTemplate(client)" i18n="@@editImage"> <mat-icon>sync</mat-icon></button>
|
||||
<button mat-icon-button color="info" (click)="showInfo(client)">
|
||||
<mat-icon>{{ 'viewIcon' | translate }}</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="primary" (click)="addClientToTemplate(client)">
|
||||
<mat-icon>{{ 'syncIcon' | translate }}</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="warn" class="right-icon" (click)="deleteClient(client)">
|
||||
<mat-icon>delete</mat-icon>
|
||||
<mat-icon>{{ 'deleteIcon' | translate }}</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -22,5 +28,5 @@
|
|||
</mat-list>
|
||||
</mat-dialog-content>
|
||||
<mat-dialog-actions align="end">
|
||||
<button mat-button type="button" (click)="onCancel()">Cancelar</button>
|
||||
<button mat-button type="button" (click)="onCancel()">{{ 'cancelButton' | translate }}</button>
|
||||
</mat-dialog-actions>
|
||||
|
|
|
@ -20,6 +20,7 @@ import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/materia
|
|||
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
||||
import { MatListModule } from '@angular/material/list';
|
||||
import { MatTabsModule } from '@angular/material/tabs';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
describe('ClientsComponent', () => {
|
||||
let component: ClientsComponent;
|
||||
|
@ -47,7 +48,8 @@ describe('ClientsComponent', () => {
|
|||
MatSelectModule,
|
||||
MatTabsModule,
|
||||
MatAutocompleteModule,
|
||||
MatListModule
|
||||
MatListModule,
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
{ provide: MatDialogRef, useValue: {} },
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
<h2 mat-dialog-title>{{ isEditMode ? 'Editar' : 'Añadir' }} plantilla</h2>
|
||||
<h2 mat-dialog-title>{{ isEditMode ? ('editTemplateTitle' | translate) : ('addTemplateTitle' | translate) }}</h2>
|
||||
|
||||
<mat-dialog-content>
|
||||
<div class="spacing-container">
|
||||
<form [formGroup]="templateForm" (ngSubmit)="onSave()">
|
||||
<mat-form-field appearance="fill">
|
||||
<mat-label>Nombre de la Plantilla</mat-label>
|
||||
<input matInput formControlName="name" placeholder="Introduce el nombre de la plantilla">
|
||||
<mat-label>{{ 'templateNameLabel' | translate }}</mat-label>
|
||||
<input matInput formControlName="name" [placeholder]="'templateNamePlaceholder' | translate">
|
||||
<mat-error *ngIf="templateForm.get('name')?.hasError('required')">
|
||||
El nombre de la plantilla es requerido.
|
||||
{{ 'templateNameError' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="fill">
|
||||
<mat-label>Contenido de la Plantilla</mat-label>
|
||||
<textarea matInput formControlName="templateContent" rows="20" placeholder="Introduce el contenido de la plantilla"></textarea>
|
||||
<mat-label>{{ 'templateContentLabel' | translate }}</mat-label>
|
||||
<textarea matInput formControlName="templateContent" rows="20" [placeholder]="'templateContentPlaceholder' | translate"></textarea>
|
||||
<mat-error *ngIf="templateForm.get('templateContent')?.hasError('required')">
|
||||
El contenido de la plantilla es requerido.
|
||||
{{ 'templateContentError' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
|
@ -24,16 +24,18 @@
|
|||
|
||||
<mat-dialog-actions>
|
||||
<div class="actions-container">
|
||||
<button mat-flat-button color="accent" [matMenuTriggerFor]="templateMenu">Cargar plantilla modelo</button>
|
||||
<button mat-flat-button color="accent" [matMenuTriggerFor]="templateMenu">
|
||||
{{ 'loadTemplateModelButton' | translate }}
|
||||
</button>
|
||||
<mat-menu #templateMenu="matMenu">
|
||||
<button mat-menu-item (click)="loadTemplateModel('ogLive')">ogLive</button>
|
||||
<button mat-menu-item (click)="loadTemplateModel('disco')">Arranque por disco</button>
|
||||
<button mat-menu-item (click)="loadTemplateModel('ogLive')">{{ 'ogLiveModel' | translate }}</button>
|
||||
<button mat-menu-item (click)="loadTemplateModel('disco')">{{ 'diskModel' | translate }}</button>
|
||||
</mat-menu>
|
||||
|
||||
<div class="action-buttons">
|
||||
<button mat-button type="button" (click)="onCancel()">Cancelar</button>
|
||||
<button mat-button type="button" (click)="onCancel()">{{ 'cancelButton' | translate }}</button>
|
||||
<button mat-raised-button color="primary" type="submit" (click)="onSave()" [disabled]="!templateForm.valid">
|
||||
{{ isEditMode ? 'Actualizar' : 'Crear' }}
|
||||
{{ isEditMode ? ('updateButton' | translate) : ('createButton' | translate) }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
<mat-accordion class="example-headers-align">
|
||||
<mat-expansion-panel hideToggle>
|
||||
<mat-expansion-panel-header joyrideStep="serverInfoStep" text="Accede a información y opciones de sincronización en el servidor OgBoot.">
|
||||
<mat-panel-title> Información en servidor ogBoot </mat-panel-title>
|
||||
<mat-expansion-panel-header joyrideStep="serverInfoStep" text="{{ 'serverInfoDescription' | translate }}">
|
||||
<mat-panel-title>{{ 'serverInfoTitle' | translate }}</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<div class="example-button-row">
|
||||
<button mat-flat-button color="primary" (click)="syncTemplates()" > Sincronizar base de datos</button>
|
||||
<button mat-flat-button color="primary" (click)="syncTemplates()">{{ 'syncDatabaseButton' | translate }}</button>
|
||||
</div>
|
||||
<div class="example-button-row">
|
||||
<button mat-flat-button color="accent" (click)="openSubnetInfoDialog()">Ver Información</button>
|
||||
<button mat-flat-button color="accent" (click)="openSubnetInfoDialog()">{{ 'viewInfoButton' | translate }}</button>
|
||||
</div>
|
||||
</mat-expansion-panel>
|
||||
</mat-accordion>
|
||||
|
@ -16,41 +16,40 @@
|
|||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" i18n="@@adminPXETitle" joyrideStep="titleStep" text="Desde aquí puedes gestionar las plantillas PXE configuradas en el servidor OgBoot.">Administrar plantillas PXE</h2>
|
||||
<h2 class="title" joyrideStep="titleStep" text="{{ 'adminPxeDescription' | translate }}">{{ 'adminPxeTitle' | translate }}</h2>
|
||||
<div class="pxe-button-row">
|
||||
<button mat-flat-button color="primary" (click)="addPxeTemplate()" joyrideStep="addTemplateStep" text="Haz clic para añadir una nueva plantilla PXE.">Añadir plantilla PXE</button>
|
||||
<button mat-flat-button color="primary" (click)="addPxeTemplate()" joyrideStep="addTemplateStep" text="{{ 'addTemplateButtonDescription' | translate }}">{{ 'addTemplateButton' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
||||
<div class="search-container">
|
||||
<mat-form-field appearance="fill" class="search-string" joyrideStep="searchNameStep" text="Busca plantillas PXE por nombre para localizar rápidamente una plantilla específica.">
|
||||
<mat-label i18n="@@searchLabel">Buscar nombre de plantilla</mat-label>
|
||||
<input matInput placeholder="Búsqueda" [(ngModel)]="filters['name']" (keyup.enter)="search()" i18n-placeholder="@@searchPlaceholder">
|
||||
<mat-form-field appearance="fill" class="search-string" joyrideStep="searchNameStep" text="{{ 'searchNameDescription' | translate }}">
|
||||
<mat-label>{{ 'searchLabel' | translate }}</mat-label>
|
||||
<input matInput placeholder="{{ 'searchPlaceholder' | translate }}" [(ngModel)]="filters['name']" (keyup.enter)="search()">
|
||||
<mat-icon matSuffix>search</mat-icon>
|
||||
<mat-hint i18n="@@searchHint">Pulsar 'enter' para buscar</mat-hint>
|
||||
<mat-hint>{{ 'searchHint' | translate }}</mat-hint>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="searchSyncStep" text="Filtra para ver solo las plantillas creadas en el servidor OgBoot.">
|
||||
<mat-label i18n="@@searchLabel">Creada en ogBoot</mat-label>
|
||||
<mat-select [(ngModel)]="filters['synchronized']" (selectionChange)="search()" placeholder="Seleccionar opción">
|
||||
<mat-option [value]="''">Todos</mat-option>
|
||||
<mat-option [value]="true">Sí</mat-option>
|
||||
<mat-option [value]="false">No</mat-option>
|
||||
<mat-form-field appearance="fill" class="search-boolean" joyrideStep="searchSyncStep" text="{{ 'searchSyncDescription' | translate }}">
|
||||
<mat-label>{{ 'createdInOgbootLabel' | translate }}</mat-label>
|
||||
<mat-select [(ngModel)]="filters['synchronized']" (selectionChange)="search()" placeholder="{{ 'selectOptionPlaceholder' | translate }}">
|
||||
<mat-option [value]="''">{{ 'allOption' | translate }}</mat-option>
|
||||
<mat-option [value]="true">{{ 'yesOption' | translate }}</mat-option>
|
||||
<mat-option [value]="false">{{ 'noOption' | translate }}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="Aquí se muestra la lista de plantillas PXE disponibles para administrar.">
|
||||
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" joyrideStep="tableStep" text="{{ 'tableDescription' | translate }}">
|
||||
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ column.header }} </th>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ column.header }}</th>
|
||||
<td mat-cell *matCellDef="let image">
|
||||
<ng-container *ngIf="column.columnDef === 'synchronized'">
|
||||
<mat-icon [color]="image[column.columnDef] ? 'primary' : 'warn'">
|
||||
{{ image[column.columnDef] ? 'check_circle' : 'cancel' }}
|
||||
</mat-icon>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="column.columnDef !== 'synchronized'">
|
||||
{{ column.cell(image) }}
|
||||
</ng-container>
|
||||
|
@ -58,20 +57,25 @@
|
|||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: center;">Acciones</th>
|
||||
<td mat-cell *matCellDef="let template" style="text-align: center;" joyrideStep="actionsStep" text="Gestiona cada plantilla PXE con opciones para ver, editar, eliminar y más.">
|
||||
<button mat-icon-button color="info" (click)="showTemplate($event, template)"><mat-icon i18n="@@deleteElementTooltip">visibility</mat-icon></button>
|
||||
<button mat-icon-button color="info" [disabled]="template.clientsLength === 0" (click)="editClients($event, template)"><mat-icon i18n="@@deleteElementTooltip">computer</mat-icon></button>
|
||||
<button mat-icon-button color="primary" (click)="editPxeTemplate(template)" i18n="@@editImage"><mat-icon>edit</mat-icon></button>
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'actionsColumn' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let template">
|
||||
<button mat-icon-button color="info" (click)="showTemplate($event, template)">
|
||||
<mat-icon>visibility</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="info" [disabled]="template.clientsLength === 0" (click)="editClients($event, template)">
|
||||
<mat-icon>computer</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button color="primary" (click)="editPxeTemplate(template)">
|
||||
<mat-icon>edit</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button [matMenuTriggerFor]="menu">
|
||||
<mat-icon>menu</mat-icon>
|
||||
</button>
|
||||
|
||||
<mat-menu #menu="matMenu">
|
||||
<button mat-menu-item (click)="toggleAction(template, 'create')">Crear en servidor ogBoot</button>
|
||||
<button mat-menu-item (click)="addClientsToPxe(template)">Añadir cliente</button>
|
||||
<button mat-menu-item (click)="toggleAction(template, 'sync')">Sincronizar base de datos</button>
|
||||
<button mat-menu-item (click)="toggleAction(template, 'delete')">Eliminar</button>
|
||||
<button mat-menu-item (click)="toggleAction(template, 'create')">{{ 'createServerButton' | translate }}</button>
|
||||
<button mat-menu-item (click)="addClientsToPxe(template)">{{ 'addClientButton' | translate }}</button>
|
||||
<button mat-menu-item (click)="toggleAction(template, 'sync')">{{ 'syncDatabaseButton' | translate }}</button>
|
||||
<button mat-menu-item (click)="toggleAction(template, 'delete')">{{ 'deleteButton' | translate }}</button>
|
||||
</mat-menu>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
@ -80,7 +84,7 @@
|
|||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="Navega entre las páginas de plantillas PXE usando el paginador.">
|
||||
<div class="paginator-container" joyrideStep="paginationStep" text="{{ 'paginationDescription' | translate }}">
|
||||
<mat-paginator [length]="length"
|
||||
[pageSize]="itemsPerPage"
|
||||
[pageIndex]="page"
|
||||
|
|
|
@ -21,6 +21,8 @@ import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
|
|||
import { FormsModule } from '@angular/forms';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
describe('PxeComponent', () => {
|
||||
let component: PxeComponent;
|
||||
let fixture: ComponentFixture<PxeComponent>;
|
||||
|
@ -45,7 +47,9 @@ describe('PxeComponent', () => {
|
|||
MatSelect,
|
||||
MatOption,
|
||||
MatPaginator,
|
||||
ToastrModule.forRoot()
|
||||
ToastrModule.forRoot(),
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
],
|
||||
providers: [
|
||||
DatePipe,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<div class="info-container">
|
||||
<h3>Detalles de {{ data.data.name }}</h3>
|
||||
<h3>{{ 'detailsTitle' | translate: { name: data.data.name } }}</h3>
|
||||
<pre class="code-block">{{ data.data.templateContent }}</pre>
|
||||
</div>
|
||||
|
|
|
@ -14,6 +14,8 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
|||
import { FormsModule } from '@angular/forms';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
|
||||
describe('OgDhcpSubnetsComponent', () => {
|
||||
let component: OgDhcpSubnetsComponent;
|
||||
|
@ -46,6 +48,8 @@ describe('OgDhcpSubnetsComponent', () => {
|
|||
FormsModule,
|
||||
MatInputModule,
|
||||
MatTableModule,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
],
|
||||
providers: [
|
||||
{ provide: MatDialog, useValue: mockDialog },
|
||||
|
|
|
@ -18,6 +18,8 @@ import { MatTooltipModule } from '@angular/material/tooltip';
|
|||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { ToastrModule } from 'ngx-toastr';
|
||||
import { NgxChartsModule } from '@swimlane/ngx-charts';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
|
||||
describe('StatusComponent', () => {
|
||||
let component: StatusComponent;
|
||||
|
@ -44,7 +46,9 @@ describe('StatusComponent', () => {
|
|||
ReactiveFormsModule,
|
||||
MatSelectModule,
|
||||
MatDialogModule,
|
||||
NgxChartsModule
|
||||
NgxChartsModule,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
],
|
||||
providers: [
|
||||
{ provide: MatDialogRef, useValue: {} },
|
||||
|
|
|
@ -14,6 +14,8 @@ import { MatTableModule } from '@angular/material/table';
|
|||
import { MatTooltipModule } from '@angular/material/tooltip';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { ToastrModule } from 'ngx-toastr';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
|
||||
describe('OperativeSystemComponent', () => {
|
||||
let component: OperativeSystemComponent;
|
||||
|
@ -35,7 +37,9 @@ describe('OperativeSystemComponent', () => {
|
|||
MatPaginatorModule,
|
||||
MatTooltipModule,
|
||||
FormsModule,
|
||||
MatProgressSpinner
|
||||
MatProgressSpinner,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
]
|
||||
})
|
||||
.compileComponents();
|
||||
|
|
|
@ -1,6 +1,18 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { CreateRepositoryComponent } from './create-repository.component';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { ReactiveFormsModule, FormBuilder } from '@angular/forms';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ToastrModule, ToastrService } from 'ngx-toastr';
|
||||
import { DataService } from '../../calendar/data.service';
|
||||
|
||||
describe('CreateRepositoryComponent', () => {
|
||||
let component: CreateRepositoryComponent;
|
||||
|
@ -8,9 +20,33 @@ describe('CreateRepositoryComponent', () => {
|
|||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [CreateRepositoryComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
imports: [
|
||||
ReactiveFormsModule,
|
||||
MatDialogModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
MatCheckboxModule,
|
||||
MatButtonModule,
|
||||
BrowserAnimationsModule,
|
||||
ToastrModule.forRoot(),
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
FormBuilder,
|
||||
ToastrService,
|
||||
DataService,
|
||||
provideHttpClient(),
|
||||
provideHttpClientTesting(),
|
||||
{
|
||||
provide: MatDialogRef,
|
||||
useValue: {}
|
||||
},
|
||||
{
|
||||
provide: MAT_DIALOG_DATA,
|
||||
useValue: {}
|
||||
}
|
||||
]
|
||||
}).compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(CreateRepositoryComponent);
|
||||
component = fixture.componentInstance;
|
||||
|
|
|
@ -1,6 +1,21 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { MainRepositoryViewComponent } from './main-repository-view.component';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { ReactiveFormsModule, FormBuilder, FormsModule } from '@angular/forms';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ToastrModule, ToastrService } from 'ngx-toastr';
|
||||
import { DataService } from '../../calendar/data.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||
import { provideRouter } from '@angular/router';
|
||||
|
||||
describe('MainRepositoryViewComponent', () => {
|
||||
let component: MainRepositoryViewComponent;
|
||||
|
@ -8,9 +23,38 @@ describe('MainRepositoryViewComponent', () => {
|
|||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [MainRepositoryViewComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
declarations: [MainRepositoryViewComponent],
|
||||
imports: [
|
||||
CommonModule,
|
||||
ReactiveFormsModule,
|
||||
FormsModule,
|
||||
MatDialogModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
MatCheckboxModule,
|
||||
MatButtonModule,
|
||||
BrowserAnimationsModule,
|
||||
ToastrModule.forRoot(),
|
||||
TranslateModule.forRoot()
|
||||
],
|
||||
providers: [
|
||||
FormBuilder,
|
||||
ToastrService,
|
||||
DataService,
|
||||
provideHttpClient(),
|
||||
provideHttpClientTesting(),
|
||||
provideRouter([]),
|
||||
{
|
||||
provide: MatDialogRef,
|
||||
useValue: {}
|
||||
},
|
||||
{
|
||||
provide: MAT_DIALOG_DATA,
|
||||
useValue: {}
|
||||
}
|
||||
],
|
||||
schemas: [NO_ERRORS_SCHEMA]
|
||||
}).compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(MainRepositoryViewComponent);
|
||||
component = fixture.componentInstance;
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
<div class="header-container">
|
||||
<h2 class="title">Administrar repositorios</h2>
|
||||
<button mat-icon-button color="primary" (click)="iniciarTour()">
|
||||
<mat-icon>help</mat-icon>
|
||||
</button>
|
||||
<h2 class="title" joyrideStep="titleStep" text="Desde esta pantalla podrás ver y administrar los respositioros exitentes.">Administrar repositorios</h2>
|
||||
<div class="images-button-row">
|
||||
<button mat-flat-button color="primary" (click)="addImage()">Añadir repositorio</button>
|
||||
<button mat-flat-button color="primary" (click)="addImage()" joyrideStep="addStep" text="Utiliza este botón para añadir un nuevo repositorio.">Añadir repositorio</button>
|
||||
</div>
|
||||
</div>
|
||||
<mat-divider class="divider"></mat-divider>
|
||||
|
|
|
@ -1,6 +1,24 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { RepositoriesComponent } from './repositories.component';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { ReactiveFormsModule, FormsModule, FormBuilder } from '@angular/forms';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { MatPaginatorModule } from '@angular/material/paginator';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ToastrModule, ToastrService } from 'ngx-toastr';
|
||||
import { DataService } from '../calendar/data.service';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
import { CommonModule } from '@angular/common';
|
||||
|
||||
describe('RepositoriesComponent', () => {
|
||||
let component: RepositoriesComponent;
|
||||
|
@ -8,9 +26,41 @@ describe('RepositoriesComponent', () => {
|
|||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [RepositoriesComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
declarations: [RepositoriesComponent],
|
||||
imports: [
|
||||
ReactiveFormsModule,
|
||||
FormsModule,
|
||||
MatDialogModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
MatCheckboxModule,
|
||||
MatButtonModule,
|
||||
MatTableModule,
|
||||
MatPaginatorModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
BrowserAnimationsModule,
|
||||
ToastrModule.forRoot(),
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
CommonModule
|
||||
],
|
||||
providers: [
|
||||
FormBuilder,
|
||||
ToastrService,
|
||||
DataService,
|
||||
provideHttpClient(),
|
||||
provideHttpClientTesting(),
|
||||
{
|
||||
provide: MatDialogRef,
|
||||
useValue: {}
|
||||
},
|
||||
{
|
||||
provide: MAT_DIALOG_DATA,
|
||||
useValue: {}
|
||||
}
|
||||
]
|
||||
}).compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(RepositoriesComponent);
|
||||
component = fixture.componentInstance;
|
||||
|
|
|
@ -4,8 +4,8 @@ import {DatePipe} from "@angular/common";
|
|||
import {MatDialog} from "@angular/material/dialog";
|
||||
import {HttpClient} from "@angular/common/http";
|
||||
import {ToastrService} from "ngx-toastr";
|
||||
import {CreateImageComponent} from "../images/create-image/create-image.component";
|
||||
import {DeleteModalComponent} from "../../shared/delete_modal/delete-modal/delete-modal.component";
|
||||
import { JoyrideService } from 'ngx-joyride';
|
||||
import {CreateRepositoryComponent} from "./create-repository/create-repository.component";
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
|
@ -53,6 +53,7 @@ export class RepositoriesComponent {
|
|||
public dialog: MatDialog,
|
||||
private http: HttpClient,
|
||||
private toastService: ToastrService,
|
||||
private joyrideService: JoyrideService,
|
||||
private router: Router
|
||||
) {}
|
||||
|
||||
|
@ -116,4 +117,16 @@ export class RepositoriesComponent {
|
|||
this.length = event.length;
|
||||
this.search();
|
||||
}
|
||||
|
||||
iniciarTour(): void {
|
||||
this.joyrideService.startTour({
|
||||
steps: [
|
||||
'titleStep',
|
||||
'addStep',
|
||||
],
|
||||
showPrevButton: true,
|
||||
themeColor: '#3f51b5'
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -10,24 +10,32 @@ import { MatFormFieldModule } from '@angular/material/form-field';
|
|||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatPaginatorModule } from '@angular/material/paginator';
|
||||
import { MatProgressSpinner } from '@angular/material/progress-spinner';
|
||||
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { MatTooltipModule } from '@angular/material/tooltip';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { BrowserAnimationsModule, NoopAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { ToastrModule } from 'ngx-toastr';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
|
||||
describe('SoftwareProfileComponent', () => {
|
||||
let component: SoftwareProfileComponent;
|
||||
let fixture: ComponentFixture<SoftwareProfileComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
Object.defineProperty(window, 'getComputedStyle', {
|
||||
value: () => ({
|
||||
getPropertyValue: (prop: string) => '',
|
||||
}),
|
||||
});
|
||||
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [SoftwareProfileComponent],
|
||||
imports: [
|
||||
HttpClientTestingModule,
|
||||
ToastrModule.forRoot(),
|
||||
BrowserAnimationsModule,
|
||||
NoopAnimationsModule,
|
||||
MatDividerModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
|
@ -37,10 +45,12 @@ describe('SoftwareProfileComponent', () => {
|
|||
MatPaginatorModule,
|
||||
MatTooltipModule,
|
||||
FormsModule,
|
||||
MatProgressSpinner,
|
||||
MatProgressSpinnerModule,
|
||||
MatOptionModule,
|
||||
ReactiveFormsModule,
|
||||
MatSelectModule
|
||||
MatSelectModule,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
]
|
||||
})
|
||||
.compileComponents();
|
||||
|
|
|
@ -16,6 +16,8 @@ import { ToastrModule } from 'ngx-toastr';
|
|||
import { MatOptionModule } from '@angular/material/core';
|
||||
import { ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { JoyrideModule } from 'ngx-joyride';
|
||||
|
||||
describe('SoftwareComponent', () => {
|
||||
let component: SoftwareComponent;
|
||||
|
@ -40,7 +42,9 @@ describe('SoftwareComponent', () => {
|
|||
MatProgressSpinner,
|
||||
MatOptionModule,
|
||||
ReactiveFormsModule,
|
||||
MatSelectModule
|
||||
MatSelectModule,
|
||||
TranslateModule.forRoot(),
|
||||
JoyrideModule.forRoot(),
|
||||
]
|
||||
})
|
||||
.compileComponents();
|
||||
|
|
|
@ -1,167 +1,167 @@
|
|||
<mat-nav-list>
|
||||
<mat-list-item disabled>
|
||||
<span class="user-logged" matTooltip="Bienvenido, {{username}}" matTooltipShowDelay="1000">
|
||||
<span i18n="@@welcomeUser">Bienvenido {{username}}</span>
|
||||
<span class="user-logged" matTooltip="{{ 'TOOLTIP_WELCOME_USER' | translate }}" matTooltipShowDelay="1000">
|
||||
<span>{{ 'welcomeUser' | translate:{username: username} }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<mat-divider></mat-divider>
|
||||
|
||||
<mat-list-item routerLink="/groups" matTooltip="Gestionar grupos de usuarios" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/groups" matTooltip="{{ 'TOOLTIP_GROUPS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">apartment</mat-icon>
|
||||
<span i18n="@@groups">Grupos</span>
|
||||
<span>{{ 'groups' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<mat-list-item (click)="toggleCommandSub()" matTooltip="Ver y ejecutar acciones predefinidas" matTooltipShowDelay="1000">
|
||||
<mat-list-item (click)="toggleCommandSub()" matTooltip="{{ 'TOOLTIP_ACTIONS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">playlist_play</mat-icon>
|
||||
<span i18n="@@actions">Acciones</span>
|
||||
<span>{{ 'actions' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<!-- Submenu items for commands -->
|
||||
<mat-nav-list *ngIf="showCommandSub" style="padding-left: 20px;">
|
||||
<mat-list-item routerLink="/commands" matTooltip="Lista de comandos disponibles" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/commands" matTooltip="{{ 'TOOLTIP_COMMANDS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">chevron_right</mat-icon>
|
||||
<span i18n="@@gallery">Comandos</span>
|
||||
<span>{{ 'commands' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
<mat-list-item routerLink="/commands-groups" matTooltip="Gestionar grupos de comandos" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/commands-groups" matTooltip="{{ 'TOOLTIP_COMMAND_GROUPS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">chevron_right</mat-icon>
|
||||
<span i18n="@@gallery">Grupos</span>
|
||||
<span>{{ 'commandGroups' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
<mat-list-item routerLink="/commands-task" matTooltip="Ver y gestionar tareas programadas" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/commands-task" matTooltip="{{ 'TOOLTIP_TASKS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">chevron_right</mat-icon>
|
||||
<span i18n="@@gallery">Tareas</span>
|
||||
<span>{{ 'tasks' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
</mat-nav-list>
|
||||
|
||||
<mat-list-item (click)="toggleOgDhcpSub()" matTooltip="Configurar y administrar DHCP" matTooltipShowDelay="1000">
|
||||
<mat-list-item (click)="toggleOgDhcpSub()" matTooltip="{{ 'TOOLTIP_DHCP' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">settings_ethernet</mat-icon>
|
||||
<span i18n="@@images">DHCP</span>
|
||||
<span>{{ 'dhcp' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<!-- Submenu items ogdhcp -->
|
||||
<!-- Submenu items for DHCP -->
|
||||
<mat-nav-list *ngIf="showOgDhcpSub" style="padding-left: 20px;">
|
||||
<mat-list-item routerLink="/ogdhcp-status" matTooltip="Estado actual del servicio DHCP" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/ogdhcp-status" matTooltip="{{ 'TOOLTIP_DHCP_STATUS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">analytics</mat-icon>
|
||||
<span i18n="@@gallery">Estado</span>
|
||||
<span>{{ 'status' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
<mat-list-item routerLink="/subnets" matTooltip="Gestionar y crea subredes" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/subnets" matTooltip="{{ 'TOOLTIP_SUBNETS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">lan</mat-icon>
|
||||
<span i18n="@@gallery">Subredes</span>
|
||||
<span>{{ 'subnets' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
</mat-nav-list>
|
||||
|
||||
<mat-list-item (click)="toggleOgBootSub()" matTooltip="Configurar y administrar opciones de arranque" matTooltipShowDelay="1000">
|
||||
<mat-list-item (click)="toggleOgBootSub()" matTooltip="{{ 'TOOLTIP_BOOT' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">desktop_windows</mat-icon>
|
||||
<span i18n="@@images">Boot</span>
|
||||
<span>{{ 'boot' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<!-- Submenu items for ogBoot -->
|
||||
<!-- Submenu items for Boot -->
|
||||
<mat-nav-list *ngIf="showOgBootSub" style="padding-left: 20px;">
|
||||
<mat-list-item routerLink="/ogboot-status" matTooltip="Estado del servicio de arranque" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/ogboot-status" matTooltip="{{ 'TOOLTIP_BOOT_STATUS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">analytics</mat-icon>
|
||||
<span i18n="@@gallery">Estado</span>
|
||||
<span>{{ 'status' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
<mat-list-item routerLink="/pxe-images" matTooltip="Ver imágenes disponibles para arranque PXE" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/pxe-images" matTooltip="{{ 'TOOLTIP_PXE_IMAGES' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">album</mat-icon>
|
||||
<span i18n="@@gallery">ogLive</span>
|
||||
<span>{{ 'ogLive' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
<mat-list-item routerLink="/pxe" matTooltip="Gestionar plantillas de arranque PXE" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/pxe" matTooltip="{{ 'TOOLTIP_PXE_TEMPLATES' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">assignment</mat-icon>
|
||||
<span i18n="@@upload">Plantillas PXE</span>
|
||||
<span>{{ 'pxeTemplates' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
<mat-list-item routerLink="/pxe-boot-file" matTooltip="Configurar archivos de arranque PXE" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/pxe-boot-file" matTooltip="{{ 'TOOLTIP_PXE_BOOT_FILES' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">save</mat-icon>
|
||||
<span i18n="@@upload">Arranque PXE</span>
|
||||
<span>{{ 'pxeBootFiles' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
</mat-nav-list>
|
||||
|
||||
<mat-list-item routerLink="/calendars" matTooltip="Gestionar calendarios de remotePC" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/calendars" matTooltip="{{ 'TOOLTIP_CALENDARS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">calendar_month</mat-icon>
|
||||
<span i18n="@@calendars">Calendarios</span>
|
||||
<span>{{ 'calendars' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<mat-list-item (click)="toggleSoftwareSub()" matTooltip="Administrar configuraciones de software" matTooltipShowDelay="1000">
|
||||
<mat-list-item (click)="toggleSoftwareSub()" matTooltip="{{ 'TOOLTIP_SOFTWARE' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">terminal</mat-icon>
|
||||
<span i18n="@@images">Software</span>
|
||||
<span>{{ 'software' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<!-- Submenu items ogdhcp -->
|
||||
<!-- Submenu items for Software -->
|
||||
<mat-nav-list *ngIf="showSoftwareSub" style="padding-left: 20px;">
|
||||
<mat-list-item routerLink="/software" matTooltip="Ver lista de software disponible" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/software" matTooltip="{{ 'TOOLTIP_SOFTWARE_LIST' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">list</mat-icon>
|
||||
<span i18n="@@gallery">Listado</span>
|
||||
<span>{{ 'softwareList' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
<mat-list-item routerLink="/software-profiles" matTooltip="Gestionar perfiles de software" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/software-profiles" matTooltip="{{ 'TOOLTIP_SOFTWARE_PROFILES' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">folder_shared</mat-icon>
|
||||
<span i18n="@@gallery">Perfiles</span>
|
||||
<span>{{ 'softwareProfiles' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
<mat-list-item routerLink="/operative-systems" matTooltip="Configurar sistemas operativos" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/operative-systems" matTooltip="{{ 'TOOLTIP_OPERATIVE_SYSTEMS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">terminal</mat-icon>
|
||||
<span i18n="@@gallery">S. Operativos</span>
|
||||
<span>{{ 'operativeSystems' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
</mat-nav-list>
|
||||
|
||||
<mat-list-item routerLink="/images" matTooltip="Gestionar imágenes del sistema" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/images" matTooltip="{{ 'TOOLTIP_IMAGES' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">photo</mat-icon>
|
||||
<span i18n="@@images">Imágenes</span>
|
||||
<span>{{ 'images' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<mat-list-item routerLink="/repositories" matTooltip="Ver y gestionar repositorios de software" matTooltipShowDelay="1000">
|
||||
<mat-list-item routerLink="/repositories" matTooltip="{{ 'TOOLTIP_REPOSITORIES' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">warehouse</mat-icon>
|
||||
<span i18n="@@repositories">Repositorios</span>
|
||||
<span>{{ 'repositories' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<mat-list-item class="disabled" matTooltip="Gestión de menús (opción deshabilitada)" matTooltipShowDelay="1000">
|
||||
<mat-list-item class="disabled" matTooltip="{{ 'TOOLTIP_MENUS' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">list</mat-icon>
|
||||
<span i18n="@@menus">Menús</span>
|
||||
<span>{{ 'menus' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
|
||||
<mat-list-item class="disabled" matTooltip="Función de búsqueda (opción deshabilitada)" matTooltipShowDelay="1000">
|
||||
<mat-list-item class="disabled" matTooltip="{{ 'TOOLTIP_SEARCH' | translate }}" matTooltipShowDelay="1000">
|
||||
<span class="entry">
|
||||
<mat-icon class="icon">search</mat-icon>
|
||||
<span i18n="@@search">Buscar</span>
|
||||
<span>{{ 'search' | translate }}</span>
|
||||
</span>
|
||||
</mat-list-item>
|
||||
</mat-nav-list>
|
||||
|
|
|
@ -0,0 +1,423 @@
|
|||
{
|
||||
"loginlabelUsername": "Enter your username",
|
||||
"loginlabelPassword": "Enter your password",
|
||||
"buttonLogin": "Login",
|
||||
"welcomeMessage": "Welcome {{username}}",
|
||||
"loginError": "Login error: {{error}}",
|
||||
"labelUsers": "Users",
|
||||
"labelRoles": "Roles",
|
||||
"adminImagesTitle": "Manage clients",
|
||||
"addUser": "Add users",
|
||||
"searchLabel": "Search image name",
|
||||
"searchPlaceholder": "Search",
|
||||
"searchHint": "Press 'enter' to search",
|
||||
"columnActions": "Actions",
|
||||
"dialogTitleAddUser": "Add User",
|
||||
"addUserlabelUsername": "Username",
|
||||
"addUserlabelPassword": "Password",
|
||||
"labelRole": "Role",
|
||||
"labelOrganizationalUnit": "Organizational Unit",
|
||||
"buttonCancel": "Cancel",
|
||||
"buttonAdd": "Add",
|
||||
"addButton": "Add",
|
||||
"addClientDialogTitle": "Add Client",
|
||||
"dialogTitleEditUser": "Edit User",
|
||||
"labelCurrentPassword": "Current password",
|
||||
"labelNewPassword": "New password",
|
||||
"labelRepeatPassword": "Repeat password",
|
||||
"errorPasswordMismatch": "Passwords do not match",
|
||||
"buttonEdit": "Edit",
|
||||
"adminRolesTitle": "Manage Roles",
|
||||
"addRole": "Add role",
|
||||
"searchRoleLabel": "Search role name",
|
||||
"dialogTitleAddRole": "Add Role",
|
||||
"labelRoleName": "Name",
|
||||
"sectionTitlePermissions": "Permissions:",
|
||||
"checkboxSuperAdmin": "Super Admin",
|
||||
"checkboxOrgAdmin": "Organizational Unit Admin",
|
||||
"checkboxOrgOperator": "Organizational Unit Operator",
|
||||
"checkboxOrgMinimal": "Minimal Organizational Unit",
|
||||
"checkboxUserRole": "User",
|
||||
"groupsTitleStepText": "On this screen, you can manage the main organizational units (Faculties, Classrooms, Classroom Groups, and clients).",
|
||||
"titleStepText": "On this screen, you can manage the calendars of remote teams connected to the UDS service",
|
||||
"groupsAddStepText": "Click to add a new organizational unit or client.",
|
||||
"adminCalendarsTitle": "Manage calendars",
|
||||
"addButtonStepText": "Click here to add a new calendar.",
|
||||
"addCalendar": "Add calendar",
|
||||
"searchStepText": "Use this search bar to filter existing calendars.",
|
||||
"searchCalendarLabel": "Search calendar name",
|
||||
"tableStepText": "Here are the existing calendars with their characteristics and settings.",
|
||||
"actionsStepText": "Access the available actions for each calendar here.",
|
||||
"editCalendar": "Edit calendar",
|
||||
"remoteAvailability": "Remote availability?",
|
||||
"selectWeekDays": "Select the days of the week",
|
||||
"startTime": "Start time",
|
||||
"startTimePlaceholder": "Select start time",
|
||||
"endTime": "End time",
|
||||
"endTimePlaceholder": "Select end time",
|
||||
"reasonLabel": "Reason",
|
||||
"reasonPlaceholder": "Reason for the exception",
|
||||
"startDate": "Start date",
|
||||
"endDate": "End date",
|
||||
"buttonSave": "Save",
|
||||
"adminCommandGroupsTitle": "Manage Command Groups",
|
||||
"addCommandGroupStepText": "Click to add a new command group.",
|
||||
"addCommandGroup": "Add Command Group",
|
||||
"searchGroupNameLabel": "Search group name",
|
||||
"loadingStepText": "Wait while the command groups are loading.",
|
||||
"viewCommands": "View commands",
|
||||
"paginationStepText": "Navigate between command group pages using the paginator.",
|
||||
"commandGroupDetailsTitle": "Command Group Details",
|
||||
"createdBy": "Created by",
|
||||
"groupId": "Group ID",
|
||||
"creationDate": "Creation Date",
|
||||
"includedCommands": "Included Commands",
|
||||
"nameColumn": "Name",
|
||||
"selectClients": "Select clients:",
|
||||
"clientsLabel": "Clients",
|
||||
"selectAtLeastOneClient": "You must select at least one client.",
|
||||
"execute": "Execute",
|
||||
"scheduleExecution": "Schedule Execution",
|
||||
"editCommandGroup": "Edit command group",
|
||||
"createCommandGroup": "Create command group",
|
||||
"groupNameLabel": "Group Name",
|
||||
"enabledToggle": "Enabled",
|
||||
"availableCommandsTitle": "Available Commands",
|
||||
"selectedCommandsTitle": "Selected Commands",
|
||||
"manageTasksTitle": "Manage Tasks",
|
||||
"addTaskStepText": "Click to add a new task.",
|
||||
"addTask": "Add Task",
|
||||
"searchTaskLabel": "Search task",
|
||||
"idColumn": "Id",
|
||||
"infoColumn": "Info",
|
||||
"createdByColumn": "Created by",
|
||||
"executionDateColumn": "Execution Date",
|
||||
"statusColumn": "Status",
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"adminCommandsTitle": "Command and procedure traces",
|
||||
"resetFiltersStepText": "Click to reset the applied filters and see all traces.",
|
||||
"resetFilters": "Reset filters",
|
||||
"clientSelectStepText": "Select a client to see the associated traces.",
|
||||
"selectClientPlaceholder": "Select a client",
|
||||
"commandSelectStepText": "Select a command to see the specific traces of that command.",
|
||||
"selectCommandPlaceholder": "Select a command",
|
||||
"taskDetailsTitle": "Task Details",
|
||||
"taskId": "Task ID",
|
||||
"status": "Status",
|
||||
"notes": "Notes",
|
||||
"includedCommandGroups": "Included Command Groups",
|
||||
"commandGroupColumn": "Command Group",
|
||||
"commandsToExecute": "Commands to execute",
|
||||
"group": "Group",
|
||||
"commandColumn": "Command",
|
||||
"editTask": "Edit Task",
|
||||
"createTask": "Create Task",
|
||||
"informationSectionTitle": "Information",
|
||||
"informationLabel": "Information",
|
||||
"notesPlaceholder": "Enter your notes here",
|
||||
"commandSelectionSectionTitle": "Command selection",
|
||||
"selectCommandsLabel": "Select Commands",
|
||||
"requiredFieldError": "This field is required",
|
||||
"executionDateTimeSectionTitle": "Execution date and time",
|
||||
"executionDateLabel": "Execution Date",
|
||||
"selectDatePlaceholder": "Select a date",
|
||||
"executionTimeLabel": "Execution Time",
|
||||
"selectTimePlaceholder": "Select a time",
|
||||
"destinationSelectionSectionTitle": "Select destination",
|
||||
"selectOrganizationalUnitLabel": "Select Organizational Unit",
|
||||
"selectClassroomLabel": "Select Classroom",
|
||||
"selectAllClients": "Select all",
|
||||
"addCommand": "Add Command",
|
||||
"searchCommandLabel": "Search command name",
|
||||
"executeCommandTitle": "Execute Command",
|
||||
"subOrganizationalUnitLabel": "Sub-organizational Unit",
|
||||
"noClientsAvailable": "No clients available",
|
||||
"buttonExecute": "Execute",
|
||||
"commandDetailsTitle": "Command Details",
|
||||
"nameLabel": "Name",
|
||||
"commentsLabel": "Comments",
|
||||
"createdByLabel": "Created by",
|
||||
"creationDateLabel": "Creation Date",
|
||||
"scriptLabel": "Script",
|
||||
"selectClientsTitle": "Select clients:",
|
||||
"selectAtLeastOneClientError": "You must select at least one client.",
|
||||
"editCommandTitle": "Edit Command",
|
||||
"createCommandTitle": "Create Command",
|
||||
"commandNamePlaceholder": "Command name",
|
||||
"commandScriptPlaceholder": "Command script",
|
||||
"readOnlyLabel": "Read only",
|
||||
"enabledLabel": "Enabled",
|
||||
"cancelButton": "Cancel",
|
||||
"saveButton": "Save",
|
||||
"generalTabLabel": "General",
|
||||
"tabsStepText": "Use the tabs to access different viewing and search options for organizational units and clients.",
|
||||
"adminGroupsTitle": "Manage groups",
|
||||
"newOrganizationalUnitTooltip": "Open modal to create organizational units of any type (Center, Classroom, Classroom Group, or Client Group)",
|
||||
"newOrganizationalUnitButton": "New Organizational Unit",
|
||||
"newClientButton": "New Client",
|
||||
"keyStepText": "The legend will show you the types of organizational units and their corresponding icons",
|
||||
"legendButton": "Legend",
|
||||
"unitStepText": "This is the section where 'Center' type organizational units will be displayed",
|
||||
"organizationalUnitTitle": "Centers",
|
||||
"elementsStepText": "This is the section to view internal units of the selected center and navigate through them.",
|
||||
"internalElementsTitle": "Internal elements",
|
||||
"noInternalElementsMessage": "No internal elements",
|
||||
"viewTreeTooltip": "View unit as a tree",
|
||||
"viewTreeMenu": "View organizational chart",
|
||||
"editUnitTooltip": "Edit this organizational unit",
|
||||
"viewUnitTooltip": "View organizational unit details",
|
||||
"viewUnitMenu": "View data",
|
||||
"addInternalUnitTooltip": "Create a new internal organizational unit",
|
||||
"addClientTooltip": "Register a client in this organizational unit",
|
||||
"deleteElementTooltip": "Delete this element",
|
||||
"deleteElementMenu": "Delete element",
|
||||
"executeCommandTooltip": "Execute command on this element",
|
||||
"advancedSearchTabLabel": "Advanced search",
|
||||
"clientsTabLabel": "Clients",
|
||||
"organizationalUnitsTabLabel": "Organizational units",
|
||||
"viewTreeTitle": "View organizational unit tree",
|
||||
"toggleNodeAriaLabel": "Toggle node",
|
||||
"closeButton": "Close",
|
||||
"orgUnitPropertiesTitle": "Organizational unit properties",
|
||||
"generalDataTab": "General data",
|
||||
"propertyHeader": "Property",
|
||||
"valueHeader": "Value",
|
||||
"classroomNetworkPropertiesTab": "Classroom and network properties",
|
||||
"editOrgUnitTitle": "Edit Organizational Unit",
|
||||
"generalStepLabel": "General",
|
||||
"typeLabel": "Type",
|
||||
"editOrgUnitParentLabel": "Parent",
|
||||
"descriptionLabel": "Description",
|
||||
"nextButton": "Next",
|
||||
"classroomInfoStepLabel": "Classroom Information",
|
||||
"locationLabel": "Location",
|
||||
"projectorToggle": "Projector",
|
||||
"boardToggle": "Board",
|
||||
"capacityLabel": "Capacity",
|
||||
"associatedCalendarLabel": "Associated Calendar",
|
||||
"backButton": "Back",
|
||||
"additionalInfoStepLabel": "Additional Information",
|
||||
"networkSettingsStepLabel": "Network Settings",
|
||||
"proxyUrlLabel": "Proxy server URL",
|
||||
"dnsIpLabel": "DNS server IP",
|
||||
"netmaskLabel": "Netmask",
|
||||
"routerLabel": "Router",
|
||||
"ntpIpLabel": "NTP server IP",
|
||||
"p2pModeLabel": "P2P Mode",
|
||||
"p2pTimeLabel": "P2P Time",
|
||||
"mcastIpLabel": "Multicast IP",
|
||||
"mcastSpeedLabel": "Multicast Speed",
|
||||
"mcastPortLabel": "Multicast Port",
|
||||
"mcastModeLabel": "Multicast Mode",
|
||||
"menuUrlLabel": "Menu URL",
|
||||
"hardwareProfileLabel": "Hardware Profile",
|
||||
"urlFormatError": "Invalid URL format.",
|
||||
"validationToggle": "Validation",
|
||||
"submitButton": "Add",
|
||||
"addOrgUnitTitle": "Add Organizational Unit",
|
||||
"createOrgUnitparentLabel": "Parent organizational unit",
|
||||
"noParentOption": "--",
|
||||
"nextServerLabel": "NextServer",
|
||||
"bootFileNameLabel": "bootFileName",
|
||||
"orgUnitTitle": "Organizational unit",
|
||||
"classroomGroupsTitle": "Classroom groups",
|
||||
"classroomTitle": "Classroom",
|
||||
"clientGroupsTitle": "Client groups",
|
||||
"clientTitle": "Client",
|
||||
"executeCommandOrGroupTitle": "Execute Command or Command Group",
|
||||
"selectCommandLabel": "Select Command",
|
||||
"selectCommandGroupLabel": "Select Command Group",
|
||||
"noClientsMessage": "No clients available",
|
||||
"editClientDialogTitle": "Edit Client",
|
||||
"organizationalUnitLabel": "Parent",
|
||||
"ogLiveLabel": "OgLive",
|
||||
"serialNumberLabel": "Serial Number",
|
||||
"netifaceLabel": "Network interface",
|
||||
"netDriverLabel": "Network driver",
|
||||
"macLabel": "MAC",
|
||||
"macError": "Invalid MAC format. Valid example: 00:11:22:33:44:55",
|
||||
"ipLabel": "IP Address",
|
||||
"ipError": "Invalid IP address format. Valid example: 127.0.0.1",
|
||||
"templateLabel": "PXE Template",
|
||||
"digitalBoard": "Digital board",
|
||||
"projectorAlt": "Projector",
|
||||
"clientAlt": "Client",
|
||||
"saveDispositionButton": "Save disposition",
|
||||
"actionsModalTitle": "Actions",
|
||||
"adminOuTitle": "Manage organizational units",
|
||||
"resetFiltersButton": "Reset filters",
|
||||
"addOUButton": "Add OU",
|
||||
"searchLabelOu": "Search OU name",
|
||||
"macHint": "Example: 00:11:22:33:44:55",
|
||||
"ipHint": "Example: 123.1.1.1",
|
||||
"allOption": "All",
|
||||
"centerOption": "Center",
|
||||
"classroomsGroupOption": "Classroom Groups",
|
||||
"classroomOption": "Classroom",
|
||||
"clientsGroupOption": "PC Groups",
|
||||
"roomMapOption": "Classroom map",
|
||||
"clientDetailsTitle": "Client details",
|
||||
"commandsButton": "Commands",
|
||||
"networkPropertiesTab": "Network properties",
|
||||
"disksPartitionsTitle": "Disks/Partitions",
|
||||
"diskTitle": "Disk",
|
||||
"diskUsedLabel": "Used",
|
||||
"diskTotalLabel": "Total",
|
||||
"diskImageAssistantTitle": "Disk image assistant",
|
||||
"partitionColumn": "Partition",
|
||||
"isoImageColumn": "ISO Image",
|
||||
"ogliveColumn": "OgLive",
|
||||
"selectImageOption": "Select image",
|
||||
"selectOgLiveOption": "Select OgLive",
|
||||
"saveAssociationsButton": "Save Associations",
|
||||
"partitionAssistantTitle": "Partition assistant",
|
||||
"diskSizeLabel": "Size",
|
||||
"partitionTypeColumn": "Partition type",
|
||||
"partitionSizeColumn": "Size (MB)",
|
||||
"usageColumn": "Usage (%)",
|
||||
"formatColumn": "Format",
|
||||
"ntfsOption": "NTFS",
|
||||
"linuxOption": "LINUX",
|
||||
"cacheOption": "CACHE",
|
||||
"deleteButton": "Delete",
|
||||
"searchTitle": "Advanced search",
|
||||
"selectFilterLabel": "Select filter",
|
||||
"gridViewButton": "Grid",
|
||||
"listViewButton": "List",
|
||||
"selectOptionLabel": "Select an option",
|
||||
"namePlaceholder": "Organizational unit",
|
||||
"selectAllButton": "Select/Deselect All",
|
||||
"saveFiltersButton": "Save Filters",
|
||||
"sendFiltersButton": "Send Action",
|
||||
"addPxeButton": "Add PXE file",
|
||||
"internalUnits": "Internal units",
|
||||
"noResultsMessage": "No results to display.",
|
||||
"imagesTitle": "Manage images",
|
||||
"addImageButton": "Add image",
|
||||
"searchNameDescription": "Search images by name to quickly find a specific image.",
|
||||
"searchDefaultDescription": "Filter images to show only default or non-default images.",
|
||||
"searchDefaultLabel": "Default image",
|
||||
"searchInstalledDescription": "Filter images to show only those installed on the OgBoot server.",
|
||||
"searchInstalledLabel": "Installed on OgBoot server",
|
||||
"tableDescription": "Here is the list of available images to manage.",
|
||||
"actionsColumnHeader": "Actions",
|
||||
"viewIcon": "visibility",
|
||||
"editIcon": "edit",
|
||||
"installOption": "Install",
|
||||
"uninstallOption": "Uninstall",
|
||||
"setDefaultOption": "Set as default image",
|
||||
"paginationDescription": "Navigate between image pages using the paginator.",
|
||||
"detailsTitle": "Details of {{ name }}",
|
||||
"editTemplateTitle": "Edit template",
|
||||
"addTemplateTitle": "Add template",
|
||||
"templateNameLabel": "Template Name",
|
||||
"templateNamePlaceholder": "Enter the template name",
|
||||
"templateContentPlaceholder": "Enter the template content",
|
||||
"loadTemplateModelButton": "Load model template",
|
||||
"diskModel": "Disk boot",
|
||||
"createButton": "Create",
|
||||
"manageClientsTitle": "Manage clients",
|
||||
"syncIcon": "sync",
|
||||
"addClientsTitle": "Add clients to {{ subnetName }}",
|
||||
"selectedClientsTitle": "Selected clients:",
|
||||
"editClientTitle": "Edit Client",
|
||||
"addClientTitle": "Add Client",
|
||||
"advancedNetbootTitle": "Advanced netboot",
|
||||
"selectUnitLabel": "Select Organizational Unit",
|
||||
"loadingUnitsOption": "Loading units...",
|
||||
"selectClassLabel": "Select classroom",
|
||||
"applyToAllLabel": "Select template to apply to all clients",
|
||||
"saveButtonLabel": "Save",
|
||||
"idColumnHeader": "Id",
|
||||
"nameColumnHeader": "Name",
|
||||
"templateColumnHeader": "Template",
|
||||
"pxeImageTitle": "Information on ogBoot server",
|
||||
"serverInfoDescription": "Access information and synchronization options on the OgBoot server.",
|
||||
"syncDatabaseButton": "Sync database",
|
||||
"viewInfoButton": "View Information",
|
||||
"adminImagesDescription": "From here you can manage the images configured on the OgBoot server.",
|
||||
"actionsDescription": "Manage each image with options to view, edit, delete, and more.",
|
||||
"addClientButton": "Add client",
|
||||
"searchClientNameLabel": "Search client name",
|
||||
"searchIPLabel": "Search IP",
|
||||
"searchMACLabel": "Search MAC",
|
||||
"diskUsageTitle": "Disk Usage",
|
||||
"ogBootServerStatus": "OgBoot Server Status",
|
||||
"servicesTitle": "Services",
|
||||
"Legend": "Legend",
|
||||
"totalLabel": "Total",
|
||||
"usedLabel": "Used",
|
||||
"freeLabel": "Free",
|
||||
"availableLabel": "Available",
|
||||
"InstalledOglivesTitle": "Installed OgLives",
|
||||
"idLabel": "ID",
|
||||
"KernelLabel": "Kernel",
|
||||
"architectureLabel": "Architecture",
|
||||
"revisionLabel": "Revision",
|
||||
"serverInfoTitle": "Server Information",
|
||||
"adminPxeTitle": "Manage PXE Files",
|
||||
"createdOgBootLabel": "Created in OgBoot",
|
||||
"selectOptionPlaceholder": "Select an option",
|
||||
"yesOption": "Yes",
|
||||
"noOption": "No",
|
||||
"actionsColumn": "Actions",
|
||||
"createServerButton": "Create Server",
|
||||
"labelName": "Name",
|
||||
"diskUsageDescription": "Here is the disk usage of the server.",
|
||||
"servicesStatusDescription": "Here is the status of the server services.",
|
||||
"oglivesDescription": "Here are the OgLives installed on the server.",
|
||||
"addImageButtonDescription": "Click to add a new image.",
|
||||
"adminPxeDescription": "From here you can manage the PXE templates of the server.",
|
||||
"addTemplateButtonDescription": "Add PXE Template",
|
||||
"addTemplateButton": "Add Template",
|
||||
"searchSyncDescription": "Filter PXE templates to show only synchronized or unsynchronized ones.",
|
||||
"advancedNetbootDescription": "From here you can configure the advanced netboot of the clients.",
|
||||
"selectUnitDescription": "Select the organizational unit to which the clients belong.",
|
||||
"selectClassDescription": "Select the classroom to which the clients belong.",
|
||||
"applyToAllDescription": "Select a template to apply to all clients.",
|
||||
"saveButtonDescription": "Save the changes made.",
|
||||
"welcomeUser": "Welcome {{username}}",
|
||||
"TOOLTIP_WELCOME_USER": "Welcome, {{username}}",
|
||||
"groups": "Groups",
|
||||
"TOOLTIP_GROUPS": "Manage user groups",
|
||||
"actions": "Actions",
|
||||
"TOOLTIP_ACTIONS": "View and execute predefined actions",
|
||||
"commands": "Commands",
|
||||
"TOOLTIP_COMMANDS": "List of available commands",
|
||||
"commandGroups": "Groups",
|
||||
"TOOLTIP_COMMAND_GROUPS": "Manage command groups",
|
||||
"tasks": "Tasks",
|
||||
"TOOLTIP_TASKS": "View and manage scheduled tasks",
|
||||
"dhcp": "DHCP",
|
||||
"TOOLTIP_DHCP": "Configure and manage DHCP",
|
||||
"TOOLTIP_DHCP_STATUS": "Current status of the DHCP service",
|
||||
"subnets": "Subnets",
|
||||
"TOOLTIP_SUBNETS": "Manage and create subnets",
|
||||
"boot": "Boot",
|
||||
"TOOLTIP_BOOT": "Configure and manage boot options",
|
||||
"ogLive": "ogLive",
|
||||
"TOOLTIP_PXE_IMAGES": "View available PXE boot images",
|
||||
"pxeTemplates": "PXE Templates",
|
||||
"TOOLTIP_PXE_TEMPLATES": "Manage PXE boot templates",
|
||||
"pxeBootFiles": "PXE Boot Files",
|
||||
"TOOLTIP_PXE_BOOT_FILES": "Configure PXE boot files",
|
||||
"calendars": "Calendars",
|
||||
"TOOLTIP_CALENDARS": "Manage remotePC calendars",
|
||||
"software": "Software",
|
||||
"TOOLTIP_SOFTWARE": "Manage software configurations",
|
||||
"softwareList": "List",
|
||||
"TOOLTIP_SOFTWARE_LIST": "View list of available software",
|
||||
"softwareProfiles": "Profiles",
|
||||
"TOOLTIP_SOFTWARE_PROFILES": "Manage software profiles",
|
||||
"operativeSystems": "Operating Systems",
|
||||
"TOOLTIP_OPERATIVE_SYSTEMS": "Configure operating systems",
|
||||
"images": "Images",
|
||||
"TOOLTIP_IMAGES": "Manage system images",
|
||||
"repositories": "Repositories",
|
||||
"TOOLTIP_REPOSITORIES": "View and manage software repositories",
|
||||
"menus": "Menus",
|
||||
"TOOLTIP_MENUS": "Menu management (option disabled)",
|
||||
"search": "Search",
|
||||
"TOOLTIP_SEARCH": "Search function (option disabled)"
|
||||
}
|
|
@ -0,0 +1,424 @@
|
|||
{
|
||||
"loginlabelUsername": "Introduce tu usuario",
|
||||
"loginlabelPassword": "Introduce tu contraseña",
|
||||
"buttonLogin": "Login",
|
||||
"welcomeMessage": "Bienvenido {{username}}",
|
||||
"loginError": "Login error: {{error}}",
|
||||
"labelUsers": "Usuarios",
|
||||
"labelRoles": "Roles",
|
||||
"adminImagesTitle": "Administrar clientes",
|
||||
"addUser": "Añadir usuarios",
|
||||
"searchLabel": "Buscar nombre de imagen",
|
||||
"searchPlaceholder": "Búsqueda",
|
||||
"searchHint": "Pulsar 'enter' para buscar",
|
||||
"columnActions": "Acciones",
|
||||
"dialogTitleAddUser": "Añadir Usuario",
|
||||
"addUserlabelUsername": "Nombre de usuario",
|
||||
"addUserlabelPassword": "Contraseña",
|
||||
"labelRole": "Rol",
|
||||
"labelOrganizationalUnit": "Unidad organizativa",
|
||||
"buttonCancel": "Cancelar",
|
||||
"buttonAdd": "Añadir",
|
||||
"addButton": "Añadir",
|
||||
"addClientDialogTitle": "Añadir Cliente",
|
||||
"dialogTitleEditUser": "Editar Usuario",
|
||||
"labelCurrentPassword": "Contraseña actual",
|
||||
"labelNewPassword": "Nueva contraseña",
|
||||
"labelRepeatPassword": "Repite la contraseña",
|
||||
"errorPasswordMismatch": "Las contraseñas no coinciden",
|
||||
"buttonEdit": "Editar",
|
||||
"adminRolesTitle": "Administrar Roles",
|
||||
"addRole": "Añadir rol",
|
||||
"searchRoleLabel": "Buscar nombre de rol",
|
||||
"dialogTitleAddRole": "Añadir Rol",
|
||||
"labelRoleName": "Nombre",
|
||||
"sectionTitlePermissions": "Permisos:",
|
||||
"checkboxSuperAdmin": "Super Admin",
|
||||
"checkboxOrgAdmin": "Admin de Unidad Organizativa",
|
||||
"checkboxOrgOperator": "Operador de Unidad Organizativa",
|
||||
"checkboxOrgMinimal": "Unidad Organizativa Mínima",
|
||||
"checkboxUserRole": "Usuario",
|
||||
"groupsTitleStepText": "En esta pantalla, puedes gestionar las principales unidades organizativas (Facultades, Aulas, Grupos de Aulas y clientes).",
|
||||
"titleStepText": "En esta pantalla, puedes gestionar los calendarios de los equipos remotos conectados con el servicio UDS",
|
||||
"groupsAddStepText": "Haz clic para añadir una nueva unidad organizativa o un cliente.",
|
||||
"adminCalendarsTitle": "Administrar calendarios",
|
||||
"addButtonStepText": "Haz clic aquí para añadir un nuevo calendario.",
|
||||
"addCalendar": "Añadir calendario",
|
||||
"searchStepText": "Utiliza esta barra de búsqueda para filtrar los calendarios existentes.",
|
||||
"searchCalendarLabel": "Buscar nombre de calendario",
|
||||
"tableStepText": "Aquí se muestran los calendarios existentes con sus características y configuraciones.",
|
||||
"actionsStepText": "Accede a las acciones disponibles para cada calendario aquí.",
|
||||
"editCalendar": "Editar calendario",
|
||||
"remoteAvailability": "¿Disponibilidad remota?",
|
||||
"selectWeekDays": "Selecciona los días de la semana",
|
||||
"startTime": "Hora de inicio",
|
||||
"startTimePlaceholder": "Selecciona la hora de inicio",
|
||||
"endTime": "Hora de fin",
|
||||
"endTimePlaceholder": "Selecciona la hora de fin",
|
||||
"reasonLabel": "Razón",
|
||||
"reasonPlaceholder": "Razón para la excepción",
|
||||
"startDate": "Fecha de inicio",
|
||||
"endDate": "Fecha de fin",
|
||||
"buttonSave": "Guardar",
|
||||
"adminCommandGroupsTitle": "Administrar Grupos de Comandos",
|
||||
"addCommandGroupStepText": "Haz clic para añadir un nuevo grupo de comandos.",
|
||||
"addCommandGroup": "Añadir Grupo de Comandos",
|
||||
"searchGroupNameLabel": "Buscar nombre de grupo",
|
||||
"loadingStepText": "Espera mientras se cargan los grupos de comandos.",
|
||||
"viewCommands": "Ver comandos",
|
||||
"paginationStepText": "Navega entre las páginas de grupos de comandos usando el paginador.",
|
||||
"commandGroupDetailsTitle": "Detalles del Grupo de Comandos",
|
||||
"createdBy": "Creado por",
|
||||
"groupId": "ID del Grupo",
|
||||
"creationDate": "Fecha de Creación",
|
||||
"includedCommands": "Comandos Incluidos",
|
||||
"nameColumn": "Nombre",
|
||||
"selectClients": "Selecciona los clientes:",
|
||||
"clientsLabel": "Clientes",
|
||||
"selectAtLeastOneClient": "Debes seleccionar al menos un cliente.",
|
||||
"execute": "Ejecutar",
|
||||
"scheduleExecution": "Programar Ejecución",
|
||||
"editCommandGroup": "Editar grupo de comando",
|
||||
"createCommandGroup": "Crear grupo de comando",
|
||||
"groupNameLabel": "Nombre del Grupo",
|
||||
"enabledToggle": "Habilitado",
|
||||
"availableCommandsTitle": "Comandos Disponibles",
|
||||
"selectedCommandsTitle": "Comandos Seleccionados",
|
||||
"manageTasksTitle": "Administrar Tareas",
|
||||
"addTaskStepText": "Haz clic para añadir una nueva tarea.",
|
||||
"addTask": "Añadir Tarea",
|
||||
"searchTaskLabel": "Buscar tarea",
|
||||
"idColumn": "Id",
|
||||
"infoColumn": "Info",
|
||||
"createdByColumn": "Creado por",
|
||||
"executionDateColumn": "Fecha de Ejecución",
|
||||
"statusColumn": "Estado",
|
||||
"enabled": "Habilitado",
|
||||
"disabled": "Deshabilitado",
|
||||
"adminCommandsTitle": "Trazas de comandos y procedimientos",
|
||||
"CommandsTitle": "Administrar Comandos",
|
||||
"resetFiltersStepText": "Haz clic para reiniciar los filtros aplicados y ver todas las trazas.",
|
||||
"resetFilters": "Reiniciar filtros",
|
||||
"clientSelectStepText": "Selecciona un cliente para ver las trazas asociadas.",
|
||||
"selectClientPlaceholder": "Seleccione un cliente",
|
||||
"commandSelectStepText": "Selecciona un comando para ver las trazas específicas de ese comando.",
|
||||
"selectCommandPlaceholder": "Seleccione un comando",
|
||||
"taskDetailsTitle": "Detalles de la Tarea",
|
||||
"taskId": "ID de la Tarea",
|
||||
"status": "Estado",
|
||||
"notes": "Notas",
|
||||
"includedCommandGroups": "Grupos de Comandos Incluidos",
|
||||
"commandGroupColumn": "Grupo de Comandos",
|
||||
"commandsToExecute": "Comandos a ejecutar",
|
||||
"group": "Grupo",
|
||||
"commandColumn": "Comando",
|
||||
"editTask": "Editar Tarea",
|
||||
"createTask": "Crear Tarea",
|
||||
"informationSectionTitle": "Información",
|
||||
"informationLabel": "Información",
|
||||
"notesPlaceholder": "Ingresa tus notas aquí",
|
||||
"commandSelectionSectionTitle": "Selección de comandos",
|
||||
"selectCommandsLabel": "Selecciona Comandos",
|
||||
"requiredFieldError": "Este campo es obligatorio",
|
||||
"executionDateTimeSectionTitle": "Fecha y hora de ejecución",
|
||||
"executionDateLabel": "Fecha de Ejecución",
|
||||
"selectDatePlaceholder": "Selecciona una fecha",
|
||||
"executionTimeLabel": "Hora de Ejecución",
|
||||
"selectTimePlaceholder": "Selecciona una hora",
|
||||
"destinationSelectionSectionTitle": "Selecciona destino",
|
||||
"selectOrganizationalUnitLabel": "Selecciona Unidad Organizacional",
|
||||
"selectClassroomLabel": "Selecciona Aula",
|
||||
"selectAllClients": "Seleccionar todos",
|
||||
"addCommand": "Añadir Comando",
|
||||
"searchCommandLabel": "Buscar nombre de comando",
|
||||
"executeCommandTitle": "Ejecutar Comando",
|
||||
"subOrganizationalUnitLabel": "Subunidad Organizativa",
|
||||
"noClientsAvailable": "No hay clientes disponibles",
|
||||
"buttonExecute": "Ejecutar",
|
||||
"commandDetailsTitle": "Detalles del Comando",
|
||||
"nameLabel": "Nombre",
|
||||
"commentsLabel": "Comentarios",
|
||||
"createdByLabel": "Creado por",
|
||||
"creationDateLabel": "Fecha de Creación",
|
||||
"scriptLabel": "Script",
|
||||
"selectClientsTitle": "Selecciona los clientes:",
|
||||
"selectAtLeastOneClientError": "Debes seleccionar al menos un cliente.",
|
||||
"editCommandTitle": "Editar Comando",
|
||||
"createCommandTitle": "Crear Comando",
|
||||
"commandNamePlaceholder": "Nombre del comando",
|
||||
"commandScriptPlaceholder": "Script del comando",
|
||||
"readOnlyLabel": "Solo lectura",
|
||||
"enabledLabel": "Habilitado",
|
||||
"cancelButton": "Cancelar",
|
||||
"saveButton": "Guardar",
|
||||
"generalTabLabel": "General",
|
||||
"tabsStepText": "Utiliza las pestañás para acceder a las diferentes opciones de visualización y busqueda de unidades organizativas y clientes.",
|
||||
"adminGroupsTitle": "Administrar grupos",
|
||||
"newOrganizationalUnitTooltip": "Abrir modal para crear unidades organizativas de cualquier tipo (Centro, Aula, Grupo de aulas o Grupo de clientes)",
|
||||
"newOrganizationalUnitButton": "Nueva Unidad Organizativa",
|
||||
"newClientButton": "Nuevo Cliente",
|
||||
"keyStepText": "La leyenda te mostrará los tipos de unidades organizativas y sus iconos correspondientes",
|
||||
"legendButton": "Leyenda",
|
||||
"unitStepText": "Esta es la sección donde se mostrarán las unidades organizativas de tipo 'Centro'",
|
||||
"organizationalUnitTitle": "Centros",
|
||||
"elementsStepText": "Esta es la sección para visualizar unidades internas del centro seleccionado y navegar por ellas.",
|
||||
"internalElementsTitle": "Elementos internos",
|
||||
"noInternalElementsMessage": "No hay elementos internos",
|
||||
"viewTreeTooltip": "Visualizar unidad en forma de árbol",
|
||||
"viewTreeMenu": "Ver organigrama",
|
||||
"editUnitTooltip": "Editar esta unidad organizativa",
|
||||
"viewUnitTooltip": "Ver detalles de la unidad organizativa",
|
||||
"viewUnitMenu": "Ver datos",
|
||||
"addInternalUnitTooltip": "Crear una nueva unidad organizativa interna",
|
||||
"addClientTooltip": "Registrar un cliente en esta unidad organizativa",
|
||||
"deleteElementTooltip": "Eliminar este elemento",
|
||||
"deleteElementMenu": "Eliminar elemento",
|
||||
"executeCommandTooltip": "Ejecutar comando en este elemento",
|
||||
"advancedSearchTabLabel": "Búsqueda avanzada",
|
||||
"clientsTabLabel": "Clientes",
|
||||
"organizationalUnitsTabLabel": "Unidades organizativas",
|
||||
"viewTreeTitle": "Visualizar árbol unidad Organizativa",
|
||||
"toggleNodeAriaLabel": "Alternar nodo",
|
||||
"closeButton": "Cerrar",
|
||||
"orgUnitPropertiesTitle": "Propiedades unidad organizativa",
|
||||
"generalDataTab": "Datos generales",
|
||||
"propertyHeader": "Propiedad",
|
||||
"valueHeader": "Valor",
|
||||
"classroomNetworkPropertiesTab": "Propiedades aula y de red",
|
||||
"editOrgUnitTitle": "Editar Unidad Organizativa",
|
||||
"generalStepLabel": "General",
|
||||
"typeLabel": "Tipo",
|
||||
"editOrgUnitParentLabel": "Padre",
|
||||
"descriptionLabel": "Descripción",
|
||||
"nextButton": "Siguiente",
|
||||
"classroomInfoStepLabel": "Información del Aula",
|
||||
"locationLabel": "Ubicación",
|
||||
"projectorToggle": "Proyector",
|
||||
"boardToggle": "Pizarra",
|
||||
"capacityLabel": "Aforo",
|
||||
"associatedCalendarLabel": "Calendario Asociado",
|
||||
"backButton": "Atrás",
|
||||
"additionalInfoStepLabel": "Información Adicional",
|
||||
"networkSettingsStepLabel": "Configuración de Red",
|
||||
"proxyUrlLabel": "Url servidor Proxy",
|
||||
"dnsIpLabel": "IP servidor DNS",
|
||||
"netmaskLabel": "Máscara de Red",
|
||||
"routerLabel": "Router",
|
||||
"ntpIpLabel": "IP servidor NTP",
|
||||
"p2pModeLabel": "Modo P2P",
|
||||
"p2pTimeLabel": "Tiempo P2P",
|
||||
"mcastIpLabel": "IP Multicast",
|
||||
"mcastSpeedLabel": "Velocidad Multicast",
|
||||
"mcastPortLabel": "Puerto Multicast",
|
||||
"mcastModeLabel": "Modo Multicast",
|
||||
"menuUrlLabel": "Menú URL",
|
||||
"hardwareProfileLabel": "Perfil de Hardware",
|
||||
"urlFormatError": "Formato de URL inválido.",
|
||||
"validationToggle": "Validación",
|
||||
"submitButton": "Añadir",
|
||||
"addOrgUnitTitle": "Añadir Unidad Organizativa",
|
||||
"createOrgUnitparentLabel": "Unidad organizativa padre",
|
||||
"noParentOption": "--",
|
||||
"nextServerLabel": "NextServer",
|
||||
"bootFileNameLabel": "bootFileName",
|
||||
"orgUnitTitle": "Unidad organizativa",
|
||||
"classroomGroupsTitle": "Grupos de aula",
|
||||
"classroomTitle": "Aula",
|
||||
"clientGroupsTitle": "Grupos de clientes",
|
||||
"clientTitle": "Cliente",
|
||||
"executeCommandOrGroupTitle": "Ejecutar Comando o Grupo de Comandos",
|
||||
"selectCommandLabel": "Seleccione Comando",
|
||||
"selectCommandGroupLabel": "Seleccione Grupo de Comandos",
|
||||
"noClientsMessage": "No hay clientes disponibles",
|
||||
"editClientDialogTitle": "Editar Cliente",
|
||||
"organizationalUnitLabel": "Padre",
|
||||
"ogLiveLabel": "OgLive",
|
||||
"serialNumberLabel": "Número de Serie",
|
||||
"netifaceLabel": "Interfaz de red",
|
||||
"netDriverLabel": "Controlador de red",
|
||||
"macLabel": "MAC",
|
||||
"macError": "Formato de MAC inválido. Ejemplo válido: 00:11:22:33:44:55",
|
||||
"ipLabel": "Dirección IP",
|
||||
"ipError": "Formato de dirección IP inválido. Ejemplo válido: 127.0.0.1",
|
||||
"templateLabel": "Plantilla PXE",
|
||||
"digitalBoard": "Pizarra digital",
|
||||
"projectorAlt": "Proyector",
|
||||
"clientAlt": "Cliente",
|
||||
"saveDispositionButton": "Guardar disposición",
|
||||
"actionsModalTitle": "Acciones",
|
||||
"adminOuTitle": "Administrar unidades organizativas",
|
||||
"resetFiltersButton": "Reiniciar filtros",
|
||||
"addOUButton": "Añadir OU",
|
||||
"searchLabelOu": "Buscar nombre de OU",
|
||||
"macHint": "Ejemplo: 00:11:22:33:44:55",
|
||||
"ipHint": "Ejemplo: 123.1.1.1",
|
||||
"allOption": "Todos",
|
||||
"centerOption": "Centro",
|
||||
"classroomsGroupOption": "Grupos de aulas",
|
||||
"classroomOption": "Aula",
|
||||
"clientsGroupOption": "Grupos de PCs",
|
||||
"roomMapOption": "Plano de aula",
|
||||
"clientDetailsTitle": "Datos de cliente",
|
||||
"commandsButton": "Comandos",
|
||||
"networkPropertiesTab": "Propiedades de red",
|
||||
"disksPartitionsTitle": "Discos/Particiones",
|
||||
"diskTitle": "Disco",
|
||||
"diskUsedLabel": "Usado",
|
||||
"diskTotalLabel": "Total",
|
||||
"diskImageAssistantTitle": "Asistente de imágenes en disco",
|
||||
"partitionColumn": "Partición",
|
||||
"isoImageColumn": "Imagen ISO",
|
||||
"ogliveColumn": "OgLive",
|
||||
"selectImageOption": "Seleccionar imagen",
|
||||
"selectOgLiveOption": "Seleccionar OgLive",
|
||||
"saveAssociationsButton": "Guardar Asociaciones",
|
||||
"partitionAssistantTitle": "Asistente de particionado",
|
||||
"diskSizeLabel": "Tamaño",
|
||||
"partitionTypeColumn": "Tipo partición",
|
||||
"partitionSizeColumn": "Tamaño (MB)",
|
||||
"usageColumn": "Uso (%)",
|
||||
"formatColumn": "Formatear",
|
||||
"ntfsOption": "NTFS",
|
||||
"linuxOption": "LINUX",
|
||||
"cacheOption": "CACHE",
|
||||
"deleteButton": "Eliminar",
|
||||
"searchTitle": "Búsqueda avanzada",
|
||||
"selectFilterLabel": "Seleccione filtro",
|
||||
"gridViewButton": "Cuadrícula",
|
||||
"listViewButton": "Lista",
|
||||
"selectOptionLabel": "Selecciona una opción",
|
||||
"namePlaceholder": "Unidad organizativa",
|
||||
"selectAllButton": "Seleccionar/Deseleccionar Todos",
|
||||
"saveFiltersButton": "Guardar Filtros",
|
||||
"sendFiltersButton": "Enviar Acción",
|
||||
"addPxeButton": "Añadir fichero PXE",
|
||||
"internalUnits": "Unidades internas",
|
||||
"noResultsMessage": "No hay resultados para mostrar.",
|
||||
"imagesTitle": "Administrar imágenes",
|
||||
"addImageButton": "Añadir imagen",
|
||||
"searchNameDescription": "Busca imágenes por nombre para encontrar rápidamente una imagen específica.",
|
||||
"searchDefaultDescription": "Filtra las imágenes para mostrar solo las imágenes por defecto o no por defecto.",
|
||||
"searchDefaultLabel": "Imagen por defecto",
|
||||
"searchInstalledDescription": "Filtra las imágenes para mostrar solo las instaladas en el servidor OgBoot.",
|
||||
"searchInstalledLabel": "Instalado servidor OgBoot",
|
||||
"tableDescription": "Aquí se muestra la lista de imágenes disponibles para administrar.",
|
||||
"actionsColumnHeader": "Acciones",
|
||||
"viewIcon": "visibility",
|
||||
"editIcon": "edit",
|
||||
"installOption": "Instalar",
|
||||
"uninstallOption": "Desinstalar",
|
||||
"setDefaultOption": "Cambiar a imagen por defecto",
|
||||
"paginationDescription": "Navega entre las páginas de imágenes usando el paginador.",
|
||||
"detailsTitle": "Detalles de {{ name }}",
|
||||
"editTemplateTitle": "Editar plantilla",
|
||||
"addTemplateTitle": "Añadir plantilla",
|
||||
"templateNameLabel": "Nombre de la Plantilla",
|
||||
"templateNamePlaceholder": "Introduce el nombre de la plantilla",
|
||||
"templateContentPlaceholder": "Introduce el contenido de la plantilla",
|
||||
"loadTemplateModelButton": "Cargar plantilla modelo",
|
||||
"diskModel": "Arranque por disco",
|
||||
"createButton": "Crear",
|
||||
"manageClientsTitle": "Gestionar clientes",
|
||||
"syncIcon": "sync",
|
||||
"addClientsTitle": "Añade clientes a {{ subnetName }}",
|
||||
"selectedClientsTitle": "Clientes seleccionados:",
|
||||
"editClientTitle": "Editar Cliente",
|
||||
"addClientTitle": "Añadir Cliente",
|
||||
"advancedNetbootTitle": "Netboot avanzado",
|
||||
"selectUnitLabel": "Selecciona Unidad Organizacional",
|
||||
"loadingUnitsOption": "Cargando unidades...",
|
||||
"selectClassLabel": "Selecciona aula",
|
||||
"applyToAllLabel": "Seleccione plantilla para aplicar a todos los clientes",
|
||||
"saveButtonLabel": "Guardar",
|
||||
"idColumnHeader": "Id",
|
||||
"nameColumnHeader": "Nombre",
|
||||
"templateColumnHeader": "Plantilla",
|
||||
"pxeImageTitle": "Información en servidor ogBoot",
|
||||
"serverInfoDescription": "Accede a información y opciones de sincronización en el servidor OgBoot.",
|
||||
"syncDatabaseButton": "Sincronizar base de datos",
|
||||
"viewInfoButton": "Ver Información",
|
||||
"adminImagesDescription": "Desde aquí puedes gestionar las imágenes configuradas en el servidor OgBoot.",
|
||||
"actionsDescription": "Administra cada imagen con opciones para ver, editar, eliminar y más.",
|
||||
"addClientButton": "Añadir cliente",
|
||||
"searchClientNameLabel": "Buscar nombre de cliente",
|
||||
"searchIPLabel": "Buscar IP",
|
||||
"searchMACLabel": "Buscar MAC",
|
||||
"diskUsageTitle": "Uso de disco",
|
||||
"ogBootServerStatus": "Estado del servidor OgBoot",
|
||||
"servicesTitle": "Servicios",
|
||||
"Legend": "Leyenda",
|
||||
"totalLabel": "Total",
|
||||
"usedLabel": "Usado",
|
||||
"freeLabel": "Libre",
|
||||
"availableLabel": "Disponible",
|
||||
"InstalledOglivesTitle": "OgLive instalados",
|
||||
"idLabel": "ID",
|
||||
"KernelLabel": "Kernel",
|
||||
"architectureLabel": "Arquitectura",
|
||||
"revisionLabel": "Revisión",
|
||||
"serverInfoTitle": "Información del servidor",
|
||||
"adminPxeTitle": "Administrar ficheros PXE",
|
||||
"createdOgBootLabel": "Creado en OgBoot",
|
||||
"selectOptionPlaceholder": "Selecciona una opción",
|
||||
"yesOption": "Sí",
|
||||
"noOption": "No",
|
||||
"actionsColumn": "Acciones",
|
||||
"createServerButton": "Crear servidor",
|
||||
"labelName": "Nombre",
|
||||
"diskUsageDescription": "Aquí se muestra el uso de disco del servidor.",
|
||||
"servicesStatusDescription": "Aquí se muestra el estado de los servicios del servidor.",
|
||||
"oglivesDescription": "Aquí se muestran los OgLive instalados en el servidor.",
|
||||
"addImageButtonDescription": "Haz clic para añadir una nueva imagen.",
|
||||
"adminPxeDescription": "Desde aquí puedes gestionar las plantillas PXE del servidor.",
|
||||
"addTemplateButtonDescription": "Añadir plantilla PXE",
|
||||
"addTemplateButton": "Añadir plantilla",
|
||||
"searchSyncDescription": "Filtra las plantillas PXE para mostrar solo las sincronizadas o no sincronizadas.",
|
||||
"advancedNetbootDescription": "Desde aquí puedes configurar el netboot avanzado de los clientes.",
|
||||
"selectUnitDescription": "Selecciona la unidad organizativa a la que pertenecen los clientes.",
|
||||
"selectClassDescription": "Selecciona el aula a la que pertenecen los clientes.",
|
||||
"applyToAllDescription": "Selecciona una plantilla para aplicar a todos los clientes.",
|
||||
"saveButtonDescription": "Guarda los cambios realizados.",
|
||||
"welcomeUser": "Bienvenido {{username}}",
|
||||
"TOOLTIP_WELCOME_USER": "Bienvenido, {{username}}",
|
||||
"groups": "Grupos",
|
||||
"TOOLTIP_GROUPS": "Gestionar grupos de usuarios",
|
||||
"actions": "Acciones",
|
||||
"TOOLTIP_ACTIONS": "Ver y ejecutar acciones predefinidas",
|
||||
"commands": "Comandos",
|
||||
"TOOLTIP_COMMANDS": "Lista de comandos disponibles",
|
||||
"commandGroups": "Grupos",
|
||||
"TOOLTIP_COMMAND_GROUPS": "Gestionar grupos de comandos",
|
||||
"tasks": "Tareas",
|
||||
"TOOLTIP_TASKS": "Ver y gestionar tareas programadas",
|
||||
"dhcp": "DHCP",
|
||||
"TOOLTIP_DHCP": "Configurar y administrar DHCP",
|
||||
"TOOLTIP_DHCP_STATUS": "Estado actual del servicio DHCP",
|
||||
"subnets": "Subredes",
|
||||
"TOOLTIP_SUBNETS": "Gestionar y crear subredes",
|
||||
"boot": "Boot",
|
||||
"TOOLTIP_BOOT": "Configurar y administrar opciones de arranque",
|
||||
"ogLive": "ogLive",
|
||||
"TOOLTIP_PXE_IMAGES": "Ver imágenes disponibles para arranque PXE",
|
||||
"pxeTemplates": "Plantillas PXE",
|
||||
"TOOLTIP_PXE_TEMPLATES": "Gestionar plantillas de arranque PXE",
|
||||
"pxeBootFiles": "Arranque PXE",
|
||||
"TOOLTIP_PXE_BOOT_FILES": "Configurar archivos de arranque PXE",
|
||||
"calendars": "Calendarios",
|
||||
"TOOLTIP_CALENDARS": "Gestionar calendarios de remotePC",
|
||||
"software": "Software",
|
||||
"TOOLTIP_SOFTWARE": "Administrar configuraciones de software",
|
||||
"softwareList": "Listado",
|
||||
"TOOLTIP_SOFTWARE_LIST": "Ver lista de software disponible",
|
||||
"softwareProfiles": "Perfiles",
|
||||
"TOOLTIP_SOFTWARE_PROFILES": "Gestionar perfiles de software",
|
||||
"operativeSystems": "S. Operativos",
|
||||
"TOOLTIP_OPERATIVE_SYSTEMS": "Configurar sistemas operativos",
|
||||
"images": "Imágenes",
|
||||
"TOOLTIP_IMAGES": "Gestionar imágenes del sistema",
|
||||
"repositories": "Repositorios",
|
||||
"TOOLTIP_REPOSITORIES": "Ver y gestionar repositorios de software",
|
||||
"menus": "Menús",
|
||||
"TOOLTIP_MENUS": "Gestión de menús (opción deshabilitada)",
|
||||
"search": "Buscar",
|
||||
"TOOLTIP_SEARCH": "Función de búsqueda (opción deshabilitada)"
|
||||
}
|
|
@ -1,221 +0,0 @@
|
|||
{
|
||||
"locale": "en",
|
||||
"translations": {
|
||||
"actions-modal-title": "Actions",
|
||||
"power-on-button": "Power On",
|
||||
"power-off-button": "Power Off",
|
||||
"reset-button": "Reset",
|
||||
"other-actions-1": "Other Actions 1",
|
||||
"other-actions-2": "Other Actions 2",
|
||||
"other-actions-3": "Other Actions 3",
|
||||
"digital-board": "Digital Board",
|
||||
"projector-alt": "Projector",
|
||||
"client-image-alt": "Client",
|
||||
"save-disposition-button": "Save Disposition",
|
||||
"client-properties-title": "Client Properties",
|
||||
"property-header": "Property",
|
||||
"value-header": "Value",
|
||||
"close-button": "Close",
|
||||
"add-client-dialog-title": "Add Client",
|
||||
"organizational-unit-label": "Parent",
|
||||
"name-label": "Name",
|
||||
"serial-number-label": "Serial Number",
|
||||
"netiface-label": "Network Interface",
|
||||
"net-driver-label": "Network Driver",
|
||||
"mac-label": "MAC",
|
||||
"mac-hint": "Example: 00:11:22:33:44:55",
|
||||
"mac-error": "Invalid MAC format. Valid example: 00:11:22:33:44:55",
|
||||
"ip-label": "IP Address",
|
||||
"ip-hint": "Example: 127.0.0.1",
|
||||
"ip-error": "Invalid IP address format. Valid example: 127.0.0.1",
|
||||
"menu-url-label": "Menu URL",
|
||||
"menu-url-error": "Invalid URL format.",
|
||||
"hardware-profile-label": "Hardware Profile",
|
||||
"hardware-profile-error": "Invalid URL format.",
|
||||
"cancel-button": "Cancel",
|
||||
"add-button": "Add",
|
||||
"edit-client-dialog-title": "Edit Client",
|
||||
"delete-dialog-title": "Delete",
|
||||
"delete-dialog-content": "Do you want to delete the clients located in {$INTERPOLATION} or do you want to relocate them to the higher level?",
|
||||
"delete-all-clients-button": "Delete all clients",
|
||||
"reposition-clients-button": "Relocate",
|
||||
"deleteDialogTitle": "Delete",
|
||||
"deleteConfirmationMessage": "Are you sure you want to delete {$INTERPOLATION}?",
|
||||
"cancelButton": "Cancel",
|
||||
"confirmButton": "Delete",
|
||||
"adminGroupsTitle": "Manage Groups",
|
||||
"newOrganizationalUnitButton": "New Organizational Unit",
|
||||
"newClientButton": "New Client",
|
||||
"legendButton": "Legend",
|
||||
"classroomMapButton": "Classroom Map",
|
||||
"searchLabel": "Search",
|
||||
"searchPlaceholder": "Search",
|
||||
"searchHint": "Press 'enter' to search among organizational units",
|
||||
"organizationalUnitTitle": "Organizational Unit",
|
||||
"viewTreeTooltip": "account_tree ",
|
||||
"viewTreeMenu": "View Organizational Chart",
|
||||
"editUnitTooltip": "edit ",
|
||||
"editUnitMenu": "Edit",
|
||||
"viewUnitTool": "visibility ",
|
||||
"viewUnitMenu": "View Data",
|
||||
"addInternalUnitTool": "add_home_work ",
|
||||
"addInternalUnitMenu": "Add Organizational Unit",
|
||||
"addClientDevice": "devices ",
|
||||
"addClientMenu": "Create Client",
|
||||
"internalElementsTitle": "Internal Elements",
|
||||
"noInternalElementsMessage": "No internal elements",
|
||||
"editElementTooltip": "edit",
|
||||
"editElementMenu": "Edit",
|
||||
"viewUnitTooltip": "visibility",
|
||||
"addInternalUnitTooltip": "add_home_work",
|
||||
"addClientTooltip": "devices",
|
||||
"deleteElementTooltip": "delete",
|
||||
"deleteElementMenu": "Delete Element",
|
||||
"7122753603772512402": "Advanced Search",
|
||||
"searchTitle": "Search",
|
||||
"selectFilterLabel": "Select Filter",
|
||||
"selectOptionLabel": "Select an Option",
|
||||
"organizationalUnitsOption": "Organizational Units",
|
||||
"clientsOption": "Clients",
|
||||
"nameLabel": "Name",
|
||||
"namePlaceholder": "Organizational Unit",
|
||||
"unitTypeLabel": "Unit Type",
|
||||
"organizationalUnitOption": "Organizational Unit",
|
||||
"classroomsGroupOption": "Classroom Groups",
|
||||
"classroomOption": "Classrooms",
|
||||
"clientGroupOption": "Client Groups",
|
||||
"floorLabel": "Floor",
|
||||
"noneOption": "None",
|
||||
"option1": "Floor 1",
|
||||
"option2": "Floor 2",
|
||||
"option3": "Floor 3",
|
||||
"selectAnotherOptionLabel": "Operating System",
|
||||
"selectStateLabel": "State",
|
||||
"offOption": "off",
|
||||
"initializingOption": "initializing",
|
||||
"ogliveOption": "oglive",
|
||||
"busyOption": "busy",
|
||||
"linuxOption": "linux",
|
||||
"linuxSessionOption": "linux_session",
|
||||
"macosOption": "macos",
|
||||
"windowsOption": "windows",
|
||||
"windowsSessionOption": "windows_session",
|
||||
"saveFiltersButton": "Save Filters",
|
||||
"sendFiltersButton": "Send Action",
|
||||
"internalUnits": "Internal units: {$INTERPOLATION}",
|
||||
"clients": "Clients: {$INTERPOLATION}",
|
||||
"noResultsMessage": "No results to display.",
|
||||
"orgUnitTitle": "Organizational Unit",
|
||||
"classroomGroupsTitle": "Classroom Groups",
|
||||
"classroomTitle": "Classroom",
|
||||
"clientGroupsTitle": "Client Groups",
|
||||
"clientTitle": "Client",
|
||||
"addOrgUnitTitle": "Add Organizational Unit",
|
||||
"generalStepLabel": "General",
|
||||
"typeLabel": "Type",
|
||||
"createOrgUnitparentLabel": "Parent Organizational Unit",
|
||||
"noParentOption": "--",
|
||||
"descriptionLabel": "Description",
|
||||
"nextButton": "Next",
|
||||
"classroomInfoStepLabel": "Classroom Information",
|
||||
"locationLabel": "Location",
|
||||
"projectorToggle": "Projector",
|
||||
"boardToggle": "Board",
|
||||
"capacityLabel": "Capacity",
|
||||
"backButton": "Back",
|
||||
"additionalInfoStepLabel": "Additional Information",
|
||||
"commentsLabel": "Comments",
|
||||
"networkSettingsStepLabel": "Network Settings",
|
||||
"proxyUrlLabel": "Proxy Server URL",
|
||||
"dnsIpLabel": "DNS Server IP",
|
||||
"netmaskLabel": "Netmask",
|
||||
"routerLabel": "Router",
|
||||
"ntpIpLabel": "NTP Server IP",
|
||||
"p2pModeLabel": "P2P Mode",
|
||||
"p2pTimeLabel": "P2P Time",
|
||||
"mcastIpLabel": "Multicast IP",
|
||||
"mcastSpeedLabel": "Multicast Speed",
|
||||
"mcastPortLabel": "Multicast Port",
|
||||
"mcastModeLabel": "Multicast Mode",
|
||||
"menuUrlLabel": "Menu URL",
|
||||
"hardwareProfileLabel": "Hardware Profile",
|
||||
"urlFormatError": "Invalid URL format.",
|
||||
"submitButton": "Add",
|
||||
"editOrgUnitTitle": "Edit Organizational Unit",
|
||||
"editOrgUnitParentLabel": "Parent",
|
||||
"validationToggle": "Validation",
|
||||
"orgUnitPropertiesTitle": "Organizational Unit Properties",
|
||||
"generalDataTab": "General Data",
|
||||
"classroomNetworkPropertiesTab": "Classroom and Network Properties",
|
||||
"actionsTab": "Actions",
|
||||
"2366056895545879062": "Power On",
|
||||
"7368908909686115507": "Power Off",
|
||||
"7760171369336053154": "Reset",
|
||||
"6799187990933478083": "Other Actions 1",
|
||||
"8971534271481971645": "Other Actions 2",
|
||||
"3300614831699539964": "Other Actions 3",
|
||||
"viewTreeTitle": "View Organizational Unit Tree",
|
||||
"closeButton": "Close",
|
||||
"webConsoleTitle": "Opengnsys Webconsole",
|
||||
"admin": "Administration",
|
||||
"editUser": "Edit User",
|
||||
"usersMenuItem": "Users",
|
||||
"rolesMenuItem": "Roles",
|
||||
"logout": "Logout",
|
||||
"welcomeUser": "Welcome {$INTERPOLATION}",
|
||||
"groups": "Groups",
|
||||
"actions": "Actions",
|
||||
"images": "Images",
|
||||
"components": "Components",
|
||||
"repositories": "Repositories",
|
||||
"menus": "Menus",
|
||||
"search": "Search",
|
||||
"calendars": "Calendars",
|
||||
"headerOpengnsys": "Opengnsys",
|
||||
"loginlabelUsername": "Enter your username",
|
||||
"loginlabelPassword": "Enter your password",
|
||||
"buttonLogin": "Login",
|
||||
"labelUsers": "Users",
|
||||
"labelRoles": "Roles",
|
||||
"dialogTitleAddRole": "Add Role (TBD)",
|
||||
"labelRoleName": "Name",
|
||||
"sectionTitlePermissions": "Permissions:",
|
||||
"checkboxManageUsers": "Manage Users",
|
||||
"checkboxPXEConfig": "PXE Configuration",
|
||||
"checkboxConsoleImages": "Web Console Images",
|
||||
"checkboxManageComponents": "Manage Different Components",
|
||||
"checkboxCreateImages": "Create Images",
|
||||
"checkboxServerConfigScript": "Server Configuration Script",
|
||||
"checkboxOther": "...",
|
||||
"buttonCancel": "Cancel",
|
||||
"buttonAdd": "Add",
|
||||
"dialogTitleDeleteRole": "Delete Role",
|
||||
"dialogContentDeleteRole": "Are you sure you want to delete the role {$INTERPOLATION}?",
|
||||
"buttonDelete": "Delete",
|
||||
"headerRoleManagement": "Role Management",
|
||||
"buttonAddRole": "+ Add",
|
||||
"headerActions": "Actions",
|
||||
"dialogTitleAddUser": "Add User",
|
||||
"addUserlabelUsername": "Username",
|
||||
"addUserlabelPassword": "Password",
|
||||
"labelRole": "Role",
|
||||
"labelOrganizationalUnit": "Organizational Unit",
|
||||
"dialogTitleEditUser": "Edit User",
|
||||
"labelCurrentPassword": "Current Password",
|
||||
"labelNewPassword": "New Password",
|
||||
"labelRepeatPassword": "Repeat Password",
|
||||
"errorPasswordMismatch": " Passwords do not match ",
|
||||
"errorUpdate": " {$INTERPOLATION} ",
|
||||
"buttonEdit": "Edit",
|
||||
"dialogTitleDeleteUser": "Delete User",
|
||||
"dialogContentDeleteUser": "Are you sure you want to delete {$INTERPOLATION}?",
|
||||
"editUserlabelUsername": "Username",
|
||||
"editUserlabelPassword": "Password",
|
||||
"labelOrgUnit": "Organizational Unit",
|
||||
"headerUserManagement": "User Management",
|
||||
"buttonAddUser": "+ Add",
|
||||
"columnActions": "Actions",
|
||||
"buttonEditUser": "Edit",
|
||||
"buttonDeleteUser": "Delete"
|
||||
}
|
||||
}
|
|
@ -1,221 +0,0 @@
|
|||
{
|
||||
"locale": "es",
|
||||
"translations": {
|
||||
"actions-modal-title": "Acciones",
|
||||
"power-on-button": "Encender",
|
||||
"power-off-button": "Apagar",
|
||||
"reset-button": "Resetear",
|
||||
"other-actions-1": "Otras acciones 1",
|
||||
"other-actions-2": "Otras acciones 2",
|
||||
"other-actions-3": "Otras acciones 3",
|
||||
"digital-board": "Pizarra digital",
|
||||
"projector-alt": "Proyector",
|
||||
"client-image-alt": "Client",
|
||||
"save-disposition-button": "Guardar disposición",
|
||||
"client-properties-title": "Propiedades cliente",
|
||||
"property-header": "Propiedad",
|
||||
"value-header": "Valor",
|
||||
"close-button": "Cerrar",
|
||||
"add-client-dialog-title": "Añadir Cliente",
|
||||
"organizational-unit-label": "Padre",
|
||||
"name-label": "Nombre",
|
||||
"serial-number-label": "Número de Serie",
|
||||
"netiface-label": "Interfaz de red",
|
||||
"net-driver-label": "Controlador de red",
|
||||
"mac-label": "MAC",
|
||||
"mac-hint": "Ejemplo: 00:11:22:33:44:55",
|
||||
"mac-error": "Formato de MAC inválido. Ejemplo válido: 00:11:22:33:44:55",
|
||||
"ip-label": "Dirección IP",
|
||||
"ip-hint": "Ejemplo: 127.0.0.1",
|
||||
"ip-error": "Formato de dirección IP inválido. Ejemplo válido: 127.0.0.1",
|
||||
"menu-url-label": "Menú URL",
|
||||
"menu-url-error": "Formato de URL inválido.",
|
||||
"hardware-profile-label": "Perfil de Hardware",
|
||||
"hardware-profile-error": "Formato de URL inválido.",
|
||||
"cancel-button": "Cancelar",
|
||||
"add-button": "Añadir",
|
||||
"edit-client-dialog-title": "Editar Cliente",
|
||||
"delete-dialog-title": "Eliminar",
|
||||
"delete-dialog-content": "¿Quiere borrar los clientes situados en {$INTERPOLATION} o quiere resituarlos en el nivel superior?",
|
||||
"delete-all-clients-button": "Borrar todos los clientes",
|
||||
"reposition-clients-button": "Resituar",
|
||||
"deleteDialogTitle": "Eliminar",
|
||||
"deleteConfirmationMessage": "¿Estás seguro que deseas eliminar {$INTERPOLATION}?",
|
||||
"cancelButton": "Cancelar",
|
||||
"confirmButton": "Eliminar",
|
||||
"adminGroupsTitle": "Administrar grupos",
|
||||
"newOrganizationalUnitButton": "Nueva Unidad Organizativa",
|
||||
"newClientButton": "Nuevo Cliente",
|
||||
"legendButton": "Leyenda",
|
||||
"classroomMapButton": "Plano de aula",
|
||||
"searchLabel": "Búsqueda",
|
||||
"searchPlaceholder": "Búsqueda",
|
||||
"searchHint": "Pulsar 'enter' para buscar entre las unidades organizativas",
|
||||
"organizationalUnitTitle": "Unidad organizativa",
|
||||
"viewTreeTooltip": "account_tree ",
|
||||
"viewTreeMenu": "Ver organigrama",
|
||||
"editUnitTooltip": "edit ",
|
||||
"editUnitMenu": "Editar",
|
||||
"viewUnitTool": "visibility ",
|
||||
"viewUnitMenu": "Visualizar datos",
|
||||
"addInternalUnitTool": "add_home_work ",
|
||||
"addInternalUnitMenu": "Añadir unidad organizativa",
|
||||
"addClientDevice": "devices ",
|
||||
"addClientMenu": "Crear cliente",
|
||||
"internalElementsTitle": "Elementos internos",
|
||||
"noInternalElementsMessage": "No hay elementos internos",
|
||||
"editElementTooltip": "edit",
|
||||
"editElementMenu": "Editar",
|
||||
"viewUnitTooltip": "visibility",
|
||||
"addInternalUnitTooltip": "add_home_work",
|
||||
"addClientTooltip": "devices",
|
||||
"deleteElementTooltip": "delete",
|
||||
"deleteElementMenu": "Borrar elemento",
|
||||
"7122753603772512402": "Búsqueda avanzada",
|
||||
"searchTitle": "Búsqueda",
|
||||
"selectFilterLabel": "Seleccione filtro",
|
||||
"selectOptionLabel": "Selecciona una opción",
|
||||
"organizationalUnitsOption": "Unidades organizativas",
|
||||
"clientsOption": "Clientes",
|
||||
"nameLabel": "Nombre",
|
||||
"namePlaceholder": "Unidad organizativa",
|
||||
"unitTypeLabel": "Tipo de unidad",
|
||||
"organizationalUnitOption": "Unidad organizativa",
|
||||
"classroomsGroupOption": "Grupos de aulas",
|
||||
"classroomOption": "Aulas",
|
||||
"clientGroupOption": "Grupos de clientes",
|
||||
"floorLabel": "Planta",
|
||||
"noneOption": "Ninguno",
|
||||
"option1": "Planta 1",
|
||||
"option2": "Planta 2",
|
||||
"option3": "Planta 3",
|
||||
"selectAnotherOptionLabel": "Sistema Operativo",
|
||||
"selectStateLabel": "Estado",
|
||||
"offOption": "off",
|
||||
"initializingOption": "initializing",
|
||||
"ogliveOption": "oglive",
|
||||
"busyOption": "busy",
|
||||
"linuxOption": "linux",
|
||||
"linuxSessionOption": "linux_session",
|
||||
"macosOption": "macos",
|
||||
"windowsOption": "windows",
|
||||
"windowsSessionOption": "windows_session",
|
||||
"saveFiltersButton": "Guardar Filtros",
|
||||
"sendFiltersButton": "Enviar Acción",
|
||||
"internalUnits": "Unidades internas: {$INTERPOLATION}",
|
||||
"clients": "Clientes: {$INTERPOLATION}",
|
||||
"noResultsMessage": "No hay resultados para mostrar.",
|
||||
"orgUnitTitle": "Unidad organizativa",
|
||||
"classroomGroupsTitle": "Grupos de aula",
|
||||
"classroomTitle": "Aula",
|
||||
"clientGroupsTitle": "Grupos de clientes",
|
||||
"clientTitle": "Cliente",
|
||||
"addOrgUnitTitle": "Añadir Unidad Organizativa",
|
||||
"generalStepLabel": "General",
|
||||
"typeLabel": "Tipo",
|
||||
"createOrgUnitparentLabel": "Unidad organizativa padre",
|
||||
"noParentOption": "--",
|
||||
"descriptionLabel": "Descripción",
|
||||
"nextButton": "Siguiente",
|
||||
"classroomInfoStepLabel": "Información del Aula",
|
||||
"locationLabel": "Ubicación",
|
||||
"projectorToggle": "Proyector",
|
||||
"boardToggle": "Pizarra",
|
||||
"capacityLabel": "Aforo",
|
||||
"backButton": "Atrás",
|
||||
"additionalInfoStepLabel": "Información Adicional",
|
||||
"commentsLabel": "Comentarios",
|
||||
"networkSettingsStepLabel": "Configuración de Red",
|
||||
"proxyUrlLabel": "Url servidor Proxy",
|
||||
"dnsIpLabel": "IP servidor DNS",
|
||||
"netmaskLabel": "Máscara de Red",
|
||||
"routerLabel": "Router",
|
||||
"ntpIpLabel": "IP servidor NTP",
|
||||
"p2pModeLabel": "Modo P2P",
|
||||
"p2pTimeLabel": "Tiempo P2P",
|
||||
"mcastIpLabel": "IP Multicast",
|
||||
"mcastSpeedLabel": "Velocidad Multicast",
|
||||
"mcastPortLabel": "Puerto Multicast",
|
||||
"mcastModeLabel": "Modo Multicast",
|
||||
"menuUrlLabel": "Menú URL",
|
||||
"hardwareProfileLabel": "Perfil de Hardware",
|
||||
"urlFormatError": "Formato de URL inválido.",
|
||||
"submitButton": "Añadir",
|
||||
"editOrgUnitTitle": "Editar Unidad Organizativa",
|
||||
"editOrgUnitParentLabel": "Padre",
|
||||
"validationToggle": "Validación",
|
||||
"orgUnitPropertiesTitle": "Propiedades unidad organizativa",
|
||||
"generalDataTab": "Datos generales",
|
||||
"classroomNetworkPropertiesTab": "Propiedades aula y de red",
|
||||
"actionsTab": "Acciones",
|
||||
"2366056895545879062": "Encender",
|
||||
"7368908909686115507": "Apagar",
|
||||
"7760171369336053154": "Resetear",
|
||||
"6799187990933478083": "Otras acciones 1",
|
||||
"8971534271481971645": "Otras acciones 2",
|
||||
"3300614831699539964": "Otras acciones 3",
|
||||
"viewTreeTitle": "Visualizar árbol unidad Organizativa",
|
||||
"closeButton": "Cerrar",
|
||||
"webConsoleTitle": "Opengnsys webconsole",
|
||||
"admin": "Administración",
|
||||
"editUser": "Editar usuario",
|
||||
"usersMenuItem": "Usuarios",
|
||||
"rolesMenuItem": "Roles",
|
||||
"logout": "Salir",
|
||||
"welcomeUser": "Bienvenido {$INTERPOLATION}",
|
||||
"groups": "Grupos",
|
||||
"actions": "Acciones",
|
||||
"images": "Imágenes",
|
||||
"components": "Componentes",
|
||||
"repositories": "Repositorios",
|
||||
"menus": "Menús",
|
||||
"search": "Buscar",
|
||||
"calendars": "Calendarios",
|
||||
"headerOpengnsys": "Opengnsys",
|
||||
"loginlabelUsername": "Introduce tu usuario",
|
||||
"loginlabelPassword": "Introduce tu contraseña",
|
||||
"buttonLogin": "Iniciar sesión",
|
||||
"labelUsers": "Usuarios",
|
||||
"labelRoles": "Roles",
|
||||
"dialogTitleAddRole": "Añadir Rol (TBD)",
|
||||
"labelRoleName": "Nombre",
|
||||
"sectionTitlePermissions": "Permisos:",
|
||||
"checkboxManageUsers": "Gestionar los usuarios",
|
||||
"checkboxPXEConfig": "Configuración PXE",
|
||||
"checkboxConsoleImages": "Imágenes de la consola web",
|
||||
"checkboxManageComponents": "Gestionar los distintos componentes",
|
||||
"checkboxCreateImages": "Crear imágenes",
|
||||
"checkboxServerConfigScript": "script de configuración del servidor",
|
||||
"checkboxOther": "...",
|
||||
"buttonCancel": "Cancelar",
|
||||
"buttonAdd": "Añadir",
|
||||
"dialogTitleDeleteRole": "Eliminar Rol",
|
||||
"dialogContentDeleteRole": "¿Estás seguro que deseas eliminar el rol {$INTERPOLATION}?",
|
||||
"buttonDelete": "Eliminar",
|
||||
"headerRoleManagement": "Gestión de roles",
|
||||
"buttonAddRole": "+ Añadir",
|
||||
"headerActions": "Acciones",
|
||||
"dialogTitleAddUser": "Añadir Usuario",
|
||||
"addUserlabelUsername": "Nombre de usuario",
|
||||
"addUserlabelPassword": "Contraseña",
|
||||
"labelRole": "Rol",
|
||||
"labelOrganizationalUnit": "Unidad organiativa",
|
||||
"dialogTitleEditUser": "Editar Usuario",
|
||||
"labelCurrentPassword": "Contraseña actual",
|
||||
"labelNewPassword": "Nueva contraseña",
|
||||
"labelRepeatPassword": "Repite la contraseña",
|
||||
"errorPasswordMismatch": " Las contraseñas no coinciden ",
|
||||
"errorUpdate": " {$INTERPOLATION} ",
|
||||
"buttonEdit": "Editar",
|
||||
"dialogTitleDeleteUser": "Eliminar Usuario",
|
||||
"dialogContentDeleteUser": "¿Estás seguro que deseas eliminar a {$INTERPOLATION}?",
|
||||
"editUserlabelUsername": "Nombre de usuario",
|
||||
"editUserlabelPassword": "Contraseña",
|
||||
"labelOrgUnit": "Unidad organizativa",
|
||||
"headerUserManagement": "Gestión de usuarios",
|
||||
"buttonAddUser": "+ Añadir",
|
||||
"columnActions": "Acciones",
|
||||
"buttonEditUser": "Editar",
|
||||
"buttonDeleteUser": "Eliminar"
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue