Skip to content
Snippets Groups Projects
Commit 18d81d92 authored by migudel's avatar migudel :speech_balloon:
Browse files

Mocked List hotels

parent 1632b54c
No related branches found
No related tags found
3 merge requests!10Add ts types and json mocks, remove poblate scripts and fix the cascade...,!5Mocked List hotels,!4Add ts types and json mocks, remove poblate scripts and fix the cascade...
Showing
with 455 additions and 569 deletions
...@@ -16,9 +16,7 @@ ...@@ -16,9 +16,7 @@
"outputPath": "dist/rest-client", "outputPath": "dist/rest-client",
"index": "src/index.html", "index": "src/index.html",
"browser": "src/main.ts", "browser": "src/main.ts",
"polyfills": [ "polyfills": ["zone.js"],
"zone.js"
],
"tsConfig": "tsconfig.app.json", "tsConfig": "tsconfig.app.json",
"assets": [ "assets": [
{ {
...@@ -27,6 +25,7 @@ ...@@ -27,6 +25,7 @@
} }
], ],
"styles": [ "styles": [
"@angular/material/prebuilt-themes/azure-blue.css",
"src/styles.css" "src/styles.css"
], ],
"scripts": [], "scripts": [],
...@@ -78,10 +77,7 @@ ...@@ -78,10 +77,7 @@
"test": { "test": {
"builder": "@angular-devkit/build-angular:karma", "builder": "@angular-devkit/build-angular:karma",
"options": { "options": {
"polyfills": [ "polyfills": ["zone.js", "zone.js/testing"],
"zone.js",
"zone.js/testing"
],
"tsConfig": "tsconfig.spec.json", "tsConfig": "tsconfig.spec.json",
"assets": [ "assets": [
{ {
...@@ -90,6 +86,7 @@ ...@@ -90,6 +86,7 @@
} }
], ],
"styles": [ "styles": [
"@angular/material/prebuilt-themes/cyan-orange.css",
"src/styles.css" "src/styles.css"
], ],
"scripts": [] "scripts": []
......
...@@ -9,10 +9,12 @@ ...@@ -9,10 +9,12 @@
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@angular/animations": "^18.2.0", "@angular/animations": "^18.2.0",
"@angular/cdk": "^18.2.9",
"@angular/common": "^18.2.0", "@angular/common": "^18.2.0",
"@angular/compiler": "^18.2.0", "@angular/compiler": "^18.2.0",
"@angular/core": "^18.2.0", "@angular/core": "^18.2.0",
"@angular/forms": "^18.2.0", "@angular/forms": "^18.2.0",
"@angular/material": "^18.2.9",
"@angular/platform-browser": "^18.2.0", "@angular/platform-browser": "^18.2.0",
"@angular/platform-browser-dynamic": "^18.2.0", "@angular/platform-browser-dynamic": "^18.2.0",
"@angular/platform-server": "^18.2.0", "@angular/platform-server": "^18.2.0",
...@@ -356,6 +358,23 @@ ...@@ -356,6 +358,23 @@
} }
} }
}, },
"node_modules/@angular/cdk": {
"version": "18.2.9",
"resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.9.tgz",
"integrity": "sha512-hV2dXpvy2TLwCsRtI/ZXkb2EoaJiellRr+kbcnKwO15LFoz3mTAOhKtsvu7yOyURkaPiI605qiIZrPP4zLL1qw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
},
"optionalDependencies": {
"parse5": "^7.1.2"
},
"peerDependencies": {
"@angular/common": "^18.0.0 || ^19.0.0",
"@angular/core": "^18.0.0 || ^19.0.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/cli": { "node_modules/@angular/cli": {
"version": "18.2.8", "version": "18.2.8",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.8.tgz", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.8.tgz",
...@@ -455,6 +474,36 @@ ...@@ -455,6 +474,36 @@
"typescript": ">=5.4 <5.6" "typescript": ">=5.4 <5.6"
} }
}, },
"node_modules/@angular/compiler-cli/node_modules/chokidar": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
"integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"readdirp": "^4.0.1"
},
"engines": {
"node": ">= 14.16.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/@angular/compiler-cli/node_modules/readdirp": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
"integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 14.16.0"
},
"funding": {
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/@angular/core": { "node_modules/@angular/core": {
"version": "18.2.8", "version": "18.2.8",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.8.tgz", "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.8.tgz",
...@@ -489,6 +538,24 @@ ...@@ -489,6 +538,24 @@
"rxjs": "^6.5.3 || ^7.4.0" "rxjs": "^6.5.3 || ^7.4.0"
} }
}, },
"node_modules/@angular/material": {
"version": "18.2.9",
"resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.9.tgz",
"integrity": "sha512-M2oCgPPIMMd6BLgEJCD+FvdC7gRDeCjj9yktNn3ctHmkKUWRvpJ3xRBH/WjVXb+9fPCCW1iNwZI7+bN1fHE7cA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/animations": "^18.0.0 || ^19.0.0",
"@angular/cdk": "18.2.9",
"@angular/common": "^18.0.0 || ^19.0.0",
"@angular/core": "^18.0.0 || ^19.0.0",
"@angular/forms": "^18.0.0 || ^19.0.0",
"@angular/platform-browser": "^18.0.0 || ^19.0.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/platform-browser": { "node_modules/@angular/platform-browser": {
"version": "18.2.8", "version": "18.2.8",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.8.tgz", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.8.tgz",
...@@ -5556,19 +5623,41 @@ ...@@ -5556,19 +5623,41 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/chokidar": { "node_modules/chokidar": {
"version": "4.0.1", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"readdirp": "^4.0.1" "anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
}, },
"engines": { "engines": {
"node": ">= 14.16.0" "node": ">= 8.10.0"
}, },
"funding": { "funding": {
"url": "https://paulmillr.com/funding/" "url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/chokidar/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
} }
}, },
"node_modules/chownr": { "node_modules/chownr": {
...@@ -8741,31 +8830,6 @@ ...@@ -8741,31 +8830,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1" "url": "https://github.com/chalk/ansi-styles?sponsor=1"
} }
}, },
"node_modules/karma/node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/karma/node_modules/cliui": { "node_modules/karma/node_modules/cliui": {
"version": "7.0.4", "version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
...@@ -8805,19 +8869,6 @@ ...@@ -8805,19 +8869,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/karma/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/karma/node_modules/is-fullwidth-code-point": { "node_modules/karma/node_modules/is-fullwidth-code-point": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
...@@ -8828,32 +8879,6 @@ ...@@ -8828,32 +8879,6 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/karma/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/karma/node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/karma/node_modules/source-map": { "node_modules/karma/node_modules/source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
...@@ -10854,7 +10879,7 @@ ...@@ -10854,7 +10879,7 @@
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz",
"integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==",
"dev": true, "devOptional": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"entities": "^4.5.0" "entities": "^4.5.0"
...@@ -11348,17 +11373,29 @@ ...@@ -11348,17 +11373,29 @@
} }
}, },
"node_modules/readdirp": { "node_modules/readdirp": {
"version": "4.0.2", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": { "engines": {
"node": ">= 14.16.0" "node": ">=8.10.0"
}
},
"node_modules/readdirp/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
}, },
"funding": { "funding": {
"type": "individual", "url": "https://github.com/sponsors/jonschlinkert"
"url": "https://paulmillr.com/funding/"
} }
}, },
"node_modules/reflect-metadata": { "node_modules/reflect-metadata": {
...@@ -11789,70 +11826,6 @@ ...@@ -11789,70 +11826,6 @@
} }
} }
}, },
"node_modules/sass/node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/sass/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/sass/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/sass/node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/sax": { "node_modules/sax": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
...@@ -14022,31 +13995,6 @@ ...@@ -14022,31 +13995,6 @@
"balanced-match": "^1.0.0" "balanced-match": "^1.0.0"
} }
}, },
"node_modules/webpack-dev-server/node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/webpack-dev-server/node_modules/glob": { "node_modules/webpack-dev-server/node_modules/glob": {
"version": "10.4.5", "version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
...@@ -14068,19 +14016,6 @@ ...@@ -14068,19 +14016,6 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/webpack-dev-server/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": {
"version": "2.0.7", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
...@@ -14132,32 +14067,6 @@ ...@@ -14132,32 +14067,6 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/webpack-dev-server/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/webpack-dev-server/node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/webpack-dev-server/node_modules/rimraf": { "node_modules/webpack-dev-server/node_modules/rimraf": {
"version": "5.0.10", "version": "5.0.10",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
......
...@@ -12,10 +12,12 @@ ...@@ -12,10 +12,12 @@
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^18.2.0", "@angular/animations": "^18.2.0",
"@angular/cdk": "^18.2.9",
"@angular/common": "^18.2.0", "@angular/common": "^18.2.0",
"@angular/compiler": "^18.2.0", "@angular/compiler": "^18.2.0",
"@angular/core": "^18.2.0", "@angular/core": "^18.2.0",
"@angular/forms": "^18.2.0", "@angular/forms": "^18.2.0",
"@angular/material": "^18.2.9",
"@angular/platform-browser": "^18.2.0", "@angular/platform-browser": "^18.2.0",
"@angular/platform-browser-dynamic": "^18.2.0", "@angular/platform-browser-dynamic": "^18.2.0",
"@angular/platform-server": "^18.2.0", "@angular/platform-server": "^18.2.0",
......
This diff is collapsed.
...@@ -3,7 +3,14 @@ import { provideRouter } from '@angular/router'; ...@@ -3,7 +3,14 @@ import { provideRouter } from '@angular/router';
import { routes } from './app.routes'; import { routes } from './app.routes';
import { provideClientHydration } from '@angular/platform-browser'; import { provideClientHydration } from '@angular/platform-browser';
import { provideHttpClient, withFetch } from '@angular/common/http';
import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
export const appConfig: ApplicationConfig = { export const appConfig: ApplicationConfig = {
providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideClientHydration()] providers: [
provideZoneChangeDetection({ eventCoalescing: true }),
provideRouter(routes),
provideClientHydration(),
provideHttpClient(withFetch()), provideAnimationsAsync(),
],
}; };
import { Routes } from '@angular/router'; import { Routes } from '@angular/router';
import { HotelListComponent } from './hotel-list/hotel-list.component';
export const routes: Routes = []; export const routes: Routes = [
{
path: 'hotels',
component: HotelListComponent,
},
{
path: '**',
redirectTo: 'hotels',
pathMatch: 'full',
},
];
<div class="container">
<h2>Hotel List</h2>
<mat-accordion>
@for(hotel of hotels; track hotel.id) {
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title> {{ hotel.name }} </mat-panel-title>
<mat-panel-description>
{{ hotel.address.streetKind }} {{ hotel.address.streetName }} No.
{{ hotel.address.number }}, {{ hotel.address.postCode }}
{{ hotel.address.otherInfo }}
</mat-panel-description>
</mat-expansion-panel-header>
<table mat-table [dataSource]="hotel.rooms" class="mat-elevation-z8">
<ng-container matColumnDef="roomNumber">
<th mat-header-cell *matHeaderCellDef>Room Number</th>
<td mat-cell *matCellDef="let room">{{ room.roomNumber }}</td>
</ng-container>
<ng-container matColumnDef="type">
<th mat-header-cell *matHeaderCellDef>Type</th>
<td mat-cell *matCellDef="let room">{{ room.type }}</td>
</ng-container>
<ng-container matColumnDef="available">
<th mat-header-cell *matHeaderCellDef>Available</th>
<td mat-cell *matCellDef="let room">
<mat-slide-toggle
[checked]="room.available"
(change)="toggleRoomAvailability(hotel.id, room.id)"
></mat-slide-toggle>
</td>
</ng-container>
<tr
mat-header-row
*matHeaderRowDef="['roomNumber', 'type', 'available']"
></tr>
<tr
mat-row
*matRowDef="let row; columns: ['roomNumber', 'type', 'available']"
></tr>
</table>
<button mat-raised-button (click)="deleteHotel(hotel.id)">
Delete Hotel
</button>
</mat-expansion-panel>
}
</mat-accordion>
</div>
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HotelListComponent } from './hotel-list.component';
describe('HotelListComponent', () => {
let component: HotelListComponent;
let fixture: ComponentFixture<HotelListComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [HotelListComponent]
})
.compileComponents();
fixture = TestBed.createComponent(HotelListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component } from '@angular/core';
import { RouterModule, Router } from '@angular/router';
import { Hotel, Address } from '../../types';
import {
MatAccordion,
MatExpansionPanel,
MatExpansionPanelDescription,
MatExpansionPanelHeader,
MatExpansionPanelTitle,
} from '@angular/material/expansion';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { MatTable, MatTableModule } from '@angular/material/table';
import { MatButton } from '@angular/material/button';
import hotels from '../../mocks/hotels.json';
import { ClienteApiRestService } from '../shared/cliente-api-rest.service';
@Component({
selector: 'app-hotel-list',
standalone: true,
imports: [
RouterModule,
MatAccordion,
MatSlideToggle,
MatButton,
MatTable,
MatTableModule,
MatExpansionPanel,
MatExpansionPanelHeader,
MatExpansionPanelTitle,
MatExpansionPanelDescription,
],
templateUrl: './hotel-list.component.html',
styleUrl: './hotel-list.component.css',
})
export class HotelListComponent {
hotels!: Hotel[];
mostrarMensaje!: boolean;
mensaje!: string;
constructor(private router: Router, private client: ClienteApiRestService) {}
ngOnInit() {
this.getHotelsResponse();
}
getHotelsResponse() {
this.hotels = hotels as Hotel[];
return;
this.client.getAllHotels().subscribe({
next: (resp) => {
if (resp.body != null) this.hotels = resp.body;
},
error(err) {
console.log('Error al traer la lista: ' + err.message);
throw err;
},
});
}
deleteHotel(id: number) {
if (!confirm(`Borrar hotel con id ${id}. Continuar?`)) return;
this.hotels = this.hotels.filter((h) => h.id !== id);
return;
this.client.deleteHotel(id).subscribe({
next: (resp) => {
if (resp.status < 400) {
this.mostrarMensaje = true;
this.mensaje = resp.body as string;
this.getHotelsResponse();
} else {
this.mostrarMensaje = true;
this.mensaje = 'Error al eliminar registro';
}
},
error: (err) => {
console.log('Error al borrar: ' + err.message);
throw err;
},
});
}
toggleRoomAvailability(hotelId: number, roomId: number) {
const target = hotels
.find((hotel) => hotel.id === hotelId)!
.rooms.find((room) => room.id === roomId);
if (!target) {
alert('Error');
return;
}
const availability = !target.available;
target.available = availability;
alert(`Change availability from room ${roomId} to ${availability}`);
}
goToEdit(hotelId: number): void {
this.router.navigate(['/hotels', hotelId, 'edit']);
}
}
import { TestBed } from '@angular/core/testing';
import { ClienteApiRestService } from './cliente-api-rest.service';
describe('ClienteApiRestService', () => {
let service: ClienteApiRestService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(ClienteApiRestService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import hotels from '../../mocks/hotels.json';
import { Hotel } from '../../types';
@Injectable({
providedIn: 'root',
})
export class ClienteApiRestService {
private static readonly BASE_URI = 'http://localhost:8080';
private static readonly HOTEL_URI = `${ClienteApiRestService.BASE_URI}/hotels`;
constructor(private http: HttpClient) {}
getAllHotels() {
const url = `${ClienteApiRestService.HOTEL_URI}`;
return this.http.get<Hotel[]>(url, { observe: 'response' });
}
deleteHotel(id: number) {
const url = `${ClienteApiRestService.HOTEL_URI}/${id}`;
return this.http.delete(url, { observe: 'response', responseType: 'text' });
}
addHotel(hotel: Hotel) {
const url = `${ClienteApiRestService.HOTEL_URI}`;
return this.http.post(url, hotel, {
observe: 'response',
responseType: 'text',
});
}
alterRoomAvailability(
hotelId: number,
roomId: number,
availability: boolean
) {
const url = `${ClienteApiRestService.HOTEL_URI}/${hotelId}/rooms/${roomId}`;
return this.http.patch(
url,
{ availability },
{
observe: 'response',
responseType: 'text',
}
);
}
}
import { TestBed } from '@angular/core/testing';
import { DataService } from './data.service';
describe('DataService', () => {
let service: DataService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(DataService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class DataService {
private message = new BehaviorSubject('hotel list');
currentMessage = this.message.asObservable();
private showMessage = new BehaviorSubject<boolean>(false);
showCurrentMessage = this.showMessage.asObservable();
constructor() {}
setMessage(message: string) {
this.message.next(message);
}
setShowCurrentMessage(valor: boolean) {
this.showMessage.next(valor);
}
}
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
<base href="/"> <base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico"> <link rel="icon" type="image/x-icon" href="favicon.ico">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head> </head>
<body> <body>
<app-root></app-root> <app-root></app-root>
......
[ [
{ {
"id": 1,
"name": "Hotel 1", "name": "Hotel 1",
"address": { "address": {
"id": 1,
"streetName": "Aca al lao", "streetName": "Aca al lao",
"streetKind": "Alargada", "streetKind": "Alargada",
"number": 12, "number": 12,
...@@ -9,11 +11,13 @@ ...@@ -9,11 +11,13 @@
}, },
"rooms": [ "rooms": [
{ {
"id": 1,
"roomNumber": "101", "roomNumber": "101",
"type": "SINGLE", "type": "SINGLE",
"available": true "available": true
}, },
{ {
"id": 2,
"roomNumber": "102", "roomNumber": "102",
"type": "DOUBLE", "type": "DOUBLE",
"available": false "available": false
...@@ -21,8 +25,10 @@ ...@@ -21,8 +25,10 @@
] ]
}, },
{ {
"id": 2,
"name": "Hotel 2", "name": "Hotel 2",
"address": { "address": {
"id": 2,
"streetName": "Calle de la plaza", "streetName": "Calle de la plaza",
"streetKind": "Alargada", "streetKind": "Alargada",
"number": 12, "number": 12,
...@@ -30,6 +36,7 @@ ...@@ -30,6 +36,7 @@
}, },
"rooms": [ "rooms": [
{ {
"id": 3,
"roomNumber": "103", "roomNumber": "103",
"type": "SUITE", "type": "SUITE",
"available": true "available": true
......
/* You can add global styles to this file, and also import other style files */ /* You can add global styles to this file, and also import other style files */
html, body { height: 100%; }
body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; }
export interface Address { export interface Address {
id: number;
streetKind: string; streetKind: string;
streetName: string; streetName: string;
number: number; number: number;
......
import { Room } from "./Room"; import { Room } from './Room';
import { User } from "./User"; import { User } from './User';
export interface Booking { export interface Booking {
id: number;
startDate: Date; startDate: Date;
endDate: Date; endDate: Date;
user: User; user: User;
......
import { Room } from "./Room";
import { User } from "./User";
export interface Booking {
startDate: Date;
endDate: Date;
user: User;
room: Room;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment