From 60dbcc3927d550e93577297764b44f8395725824 Mon Sep 17 00:00:00 2001 From: Chris Dombroski Date: Fri, 29 Nov 2024 12:23:33 -0500 Subject: [PATCH] Basic pages; half of owner endpoints --- angular-client/angular.json | 1 + angular-client/build.gradle.kts | 2 +- angular-client/package-lock.json | 586 +++++++++++++++++- angular-client/package.json | 2 + angular-client/public/assets/images/pets.png | Bin 0 -> 67721 bytes angular-client/src/app/app.component.html | 381 ++---------- angular-client/src/app/app.component.ts | 9 +- angular-client/src/app/app.config.ts | 3 +- angular-client/src/app/app.routes.ts | 12 +- .../app/owner-add/owner-add.component.html | 55 ++ .../app/owner-add/owner-add.component.scss | 0 .../app/owner-add/owner-add.component.spec.ts | 23 + .../src/app/owner-add/owner-add.component.ts | 39 ++ .../app/owner-list/owner-list.component.html | 29 + .../app/owner-list/owner-list.component.scss | 0 .../owner-list/owner-list.component.spec.ts | 23 + .../app/owner-list/owner-list.component.ts | 34 + .../page-not-found.component.html | 5 + .../page-not-found.component.scss | 0 .../page-not-found.component.spec.ts | 23 + .../page-not-found.component.ts | 12 + .../src/app/welcome/welcome.component.html | 5 + .../src/app/welcome/welcome.component.scss | 0 .../src/app/welcome/welcome.component.spec.ts | 23 + .../src/app/welcome/welcome.component.ts | 12 + angular-client/src/index.html | 4 +- angular-client/src/styles.scss | 11 + 27 files changed, 949 insertions(+), 345 deletions(-) create mode 100644 angular-client/public/assets/images/pets.png create mode 100644 angular-client/src/app/owner-add/owner-add.component.html create mode 100644 angular-client/src/app/owner-add/owner-add.component.scss create mode 100644 angular-client/src/app/owner-add/owner-add.component.spec.ts create mode 100644 angular-client/src/app/owner-add/owner-add.component.ts create mode 100644 angular-client/src/app/owner-list/owner-list.component.html create mode 100644 angular-client/src/app/owner-list/owner-list.component.scss create mode 100644 angular-client/src/app/owner-list/owner-list.component.spec.ts create mode 100644 angular-client/src/app/owner-list/owner-list.component.ts create mode 100644 angular-client/src/app/page-not-found/page-not-found.component.html create mode 100644 angular-client/src/app/page-not-found/page-not-found.component.scss create mode 100644 angular-client/src/app/page-not-found/page-not-found.component.spec.ts create mode 100644 angular-client/src/app/page-not-found/page-not-found.component.ts create mode 100644 angular-client/src/app/welcome/welcome.component.html create mode 100644 angular-client/src/app/welcome/welcome.component.scss create mode 100644 angular-client/src/app/welcome/welcome.component.spec.ts create mode 100644 angular-client/src/app/welcome/welcome.component.ts diff --git a/angular-client/angular.json b/angular-client/angular.json index a61606a..d595dc8 100644 --- a/angular-client/angular.json +++ b/angular-client/angular.json @@ -91,6 +91,7 @@ } ], "styles": [ + "@angular/material/prebuilt-themes/cyan-orange.css", "src/styles.scss" ], "scripts": [] diff --git a/angular-client/build.gradle.kts b/angular-client/build.gradle.kts index 97bda96..8e49ea9 100644 --- a/angular-client/build.gradle.kts +++ b/angular-client/build.gradle.kts @@ -27,5 +27,5 @@ tasks.register("start") { dependsOn("npmInstall") dependsOn("getClient") command = "ng" - args.add("start") + args.add("serve") } diff --git a/angular-client/package-lock.json b/angular-client/package-lock.json index 281ae88..b43a529 100644 --- a/angular-client/package-lock.json +++ b/angular-client/package-lock.json @@ -9,10 +9,12 @@ "version": "0.0.0", "dependencies": { "@angular/animations": "^19.0.0", + "@angular/cdk": "^19.0.0", "@angular/common": "^19.0.0", "@angular/compiler": "^19.0.0", "@angular/core": "^19.0.0", "@angular/forms": "^19.0.0", + "@angular/material": "^19.0.0", "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", @@ -34,6 +36,21 @@ "typescript": "~5.6.2" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -349,6 +366,23 @@ } } }, + "node_modules/@angular/cdk": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.0.0.tgz", + "integrity": "sha512-KcOYhCwN4Bw3L4+W4ymTfPGqRjrkwD8M5jX8GM7YsZ5DsX9OEd/gNrwRvjn+8JItzimXLXdGrcqXrMTxkq7QPA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@angular/cli": { "version": "19.0.1", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.1.tgz", @@ -482,6 +516,24 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@angular/material": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.0.0.tgz", + "integrity": "sha512-j7dDFUh8dqiysuWu32biukDTHScajUYHFR9Srhn98kBwnXMob5y1paMoOx5RQO5DU4KCxKaKx8HcHJBJeTKHjw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": "^19.0.0 || ^20.0.0", + "@angular/cdk": "19.0.0", + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", + "@angular/forms": "^19.0.0 || ^20.0.0", + "@angular/platform-browser": "^19.0.0 || ^20.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@angular/platform-browser": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.0.tgz", @@ -5529,6 +5581,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -5556,6 +5617,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -6142,6 +6212,18 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001684", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", @@ -6944,6 +7026,24 @@ "dev": true, "license": "MIT" }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -7165,7 +7265,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, + "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -9463,6 +9563,18 @@ } } }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -10477,6 +10589,20 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -11021,6 +11147,18 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", @@ -11366,7 +11504,7 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "entities": "^4.5.0" @@ -11525,6 +11663,18 @@ "node": ">=6" } }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/piscina": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", @@ -11580,6 +11730,101 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/postcss-loader": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", @@ -11682,6 +11927,50 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-selector-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", @@ -11863,6 +12152,30 @@ "node": ">= 0.8" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -13137,6 +13450,96 @@ "node": ">=8" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13173,6 +13576,134 @@ "node": ">=0.10" } }, + "node_modules/tailwindcss": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz", + "integrity": "sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/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", + "optional": true, + "peer": true, + "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/tailwindcss/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", + "optional": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/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", + "optional": true, + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tailwindcss/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", + "optional": true, + "peer": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -13364,6 +13895,33 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -13447,6 +14005,15 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -14998,6 +15565,21 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/angular-client/package.json b/angular-client/package.json index b8633b3..da022c8 100644 --- a/angular-client/package.json +++ b/angular-client/package.json @@ -11,10 +11,12 @@ "private": true, "dependencies": { "@angular/animations": "^19.0.0", + "@angular/cdk": "^19.0.0", "@angular/common": "^19.0.0", "@angular/compiler": "^19.0.0", "@angular/core": "^19.0.0", "@angular/forms": "^19.0.0", + "@angular/material": "^19.0.0", "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", diff --git a/angular-client/public/assets/images/pets.png b/angular-client/public/assets/images/pets.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5cf3a341298064901422ee30f3515a41acf4a6 GIT binary patch literal 67721 zcmeFabzD?k*YH1tfJh7_Ev1waLk}%24MQl1#1IbMLo+DC5E3HNq9|P|-5}l4(%mK9 z%x}D|>%MO8cpl&P_j&*H@EK;Y_gZV8^Id!Iv-X*Dh7e74MM8WUd;kDI_&`Zc8~whG ze&yg{qJMV;M}p9A*BzA}xc~q+$bP;s0Ex*|006!QOjcG?^QnWYgUeF~N5%)TvW$+- z4wf)m3jn}lECphv16jQ(aWu6rqk=@dR&mg#z+=>w2}6)avvM+B2Pz|(-j7mfHIT^5 zW7D?1Lt;flAi^oM?h%CIf5%;5N{e{@0U6qHHtYStX1Mxjsr#~IL~=QAFQup#w;qq+ zjS|0>Ac7!U<`&7!^VX)8*#&Ot0Q}pI03cqGIg`r;3kKlWPh9*ib3JY?0K;S81|FbZ zEvcTDE*M3;CX?_O0}+T(?;0(lf`=dnNP9)dWB{ZUFc2y6tPsFEY=B88)NCH0$ptWB z^IsYOAX1JKyfFZVubC(?-bDi#$t;j^fTv=Byk5OfdB8(n0J)_~6BzKF3&8t8-%<(i zsSHrx1HADCfJXq})k41D0APCqOxjpjJOF_S0CI(0ees>U1;AxaG^vCy;uW{S@&Sf; zTu!+9`rNnJdmd2UB^NTqG)M27KsRKX(KG>{dB646@^4A)Y>;?S-SZr7jfT-2osh zAG~q`0G`O*=GN&bl4`{R0OZ~UaDKW^yWc={uO5f4;o3yQjdK&BK$+W3UuA$Y_~r;Y zXA_RRXEN+T-Jj?=O?U>S=>_Vwo(9D@5^;akEhmz2BtA98d)vTX9dI4{ej6T{DbpAd z!z}b6O9UQe!i!_31|@9Lu-lC7NOCP^m1sdFkanmJqplMDu7ootIQX$bWwclufbZFP zP_-iHb-))bi9v!A*@`S-nm~oL8{f=bL5Yz!-z9x>E~b$P7ka<^E%zz$Sfr$ED{uV@ z6)u01EiZRVqs(WKd)H&2ou8TW2y$C!KI!FQRfQZtdq2amNdx5TuM1(rWf)Cw-B)_3 z`cVD5QWhiKZ2^+8>%!Nu0=2%fF~?-76th;6oHS9H@qvOLD&1olCXFQH0eT~4n}lzZ zhRE`wAoM+g>cBEHp0gFVHS9 z?Hb~zm`OW*Jci7%Yj;>HQ!fG+1r~8E;`#3Den`}w%zCdwA{c2PlmEU{yHG1Qi%h^R z5#0U!<^z@V{Iu8snx~Xck6?u>u9YN{vA5LYzUlXOt}3p?tzhlL2?&EIp0^^c*r}7K zaH*`Q;Z%k3su|P+VbrZUyuzUM_~iuR1P9%RoTZ#T6ww{{vC6Tmv9z2#I@viHIa4_| zboX>Sbt1E$Kzs`nbon9k+1Cf( zEv0bh-fQG7|$2gL|b}rR5e6zAPAIJlZO)wtry&ew6-D*TASqAwMPm z&Tv(JRVGPhg?fy7?%QFj#!ow??WNge)Sni=(zgdl2nxRbu(+ca7$1h8jTKbjbBX5`m>++^4u7`7Hn0VnaUD)3%MMe5Rx2_@3w<7|{z&zm?%{xTZ^{VU2zS zY%hXe=m$wfI3gd?^nv08;e8XbF4JZ|()prOe%!_oj^JX)|*4eBbkR|3&7_Y;MwfqHm;C zk?JC^f7}OhX59?Gvr7iQ6M^sfmHw+0Gf$sTAM(5GW6oRZyGopDUavNys|7u8H}j|8 zTdW9V%Z{p6B~+bE5`B9!(VfwbPeQZ?^!!zHl#@&jlUhuv)tc3krF&EYywmxq>e+6`&sZtBMs_|>p_so4ZP zY3O*?P=aBzenS_3@rCdD#K@+R#zUS*(

-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 - - - - - - - - - - -

-
-
- -

Hello, {{ title }}

-

Congratulations! Your app is running. 🎉

-
- -
-
- @for (item of [ - { title: 'Explore the Docs', link: 'https://angular.dev' }, - { title: 'Learn with Tutorials', link: 'https://angular.dev/tutorials' }, - { title: 'CLI Docs', link: 'https://angular.dev/tools/cli' }, - { title: 'Angular Language Service', link: 'https://angular.dev/tools/language-service' }, - { title: 'Angular DevTools', link: 'https://angular.dev/tools/devtools' }, - ]; track item.title) { - - {{ item.title }} - - - - - } -
- -
-
-
- - - - - - - - - - - + + + + Home + + + + + + Search + + + + Add New + + + + + + + All + + + + Add New + + + + + Pet Types + + + + Specialties + + +
+ +
\ No newline at end of file diff --git a/angular-client/src/app/app.component.ts b/angular-client/src/app/app.component.ts index 4492543..bf50937 100644 --- a/angular-client/src/app/app.component.ts +++ b/angular-client/src/app/app.component.ts @@ -1,12 +1,15 @@ import { Component } from '@angular/core'; -import { RouterOutlet } from '@angular/router'; +import { RouterLink, RouterOutlet } from '@angular/router'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; @Component({ selector: 'app-root', - imports: [RouterOutlet], + imports: [RouterLink, RouterOutlet, MatToolbarModule, MatButtonModule, MatIconModule, MatMenuModule], templateUrl: './app.component.html', styleUrl: './app.component.scss' }) export class AppComponent { - title = 'angular-client'; } diff --git a/angular-client/src/app/app.config.ts b/angular-client/src/app/app.config.ts index 61548f6..aab26ad 100644 --- a/angular-client/src/app/app.config.ts +++ b/angular-client/src/app/app.config.ts @@ -4,8 +4,9 @@ import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; import { provideHttpClient } from '@angular/common/http'; import { Configuration } from '../../build/client'; +import { provideAnimationsAsync } from '@angular/platform-browser/animations/async'; export const appConfig: ApplicationConfig = { providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideHttpClient(), {provide: Configuration, useValue: new Configuration({ - })}] + })}, provideAnimationsAsync()] }; diff --git a/angular-client/src/app/app.routes.ts b/angular-client/src/app/app.routes.ts index dc39edb..92bb2da 100644 --- a/angular-client/src/app/app.routes.ts +++ b/angular-client/src/app/app.routes.ts @@ -1,3 +1,13 @@ import { Routes } from '@angular/router'; +import { PageNotFoundComponent } from './page-not-found/page-not-found.component'; +import { WelcomeComponent } from './welcome/welcome.component'; +import { OwnerListComponent } from './owner-list/owner-list.component'; +import { OwnerAddComponent } from './owner-add/owner-add.component'; -export const routes: Routes = []; +export const routes: Routes = [ + { path: 'welcome', component: WelcomeComponent }, + { path: 'owners', component: OwnerListComponent }, + { path: 'owners/add', component: OwnerAddComponent }, + { path: '', component: WelcomeComponent }, + { path: '**', component: PageNotFoundComponent } +]; diff --git a/angular-client/src/app/owner-add/owner-add.component.html b/angular-client/src/app/owner-add/owner-add.component.html new file mode 100644 index 0000000..1ece570 --- /dev/null +++ b/angular-client/src/app/owner-add/owner-add.component.html @@ -0,0 +1,55 @@ +

New Owner

+
+ + First Name + + @if (form.controls["firstName"].hasError('required')) {First name is required} + @if (form.controls["firstName"].hasError('minlength')) {First name must be at least 1 character + long} + @if (form.controls["firstName"].hasError('maxlength')) {First name may be at most 30 characters + long} + @if (form.controls["firstName"].hasError('pattern')) {First name must consist of letters + only} + +
+ + Last Name + + @if (form.controls["lastName"].hasError('required')) {Last name is required} + @if (form.controls["lastName"].hasError('minlength')) {Last name must be at least 1 character + long} + @if (form.controls["lastName"].hasError('maxlength')) {Last name may be at most 30 characters + long} + @if (form.controls["lastName"].hasError('pattern')) {Last name must consist of letters + only} + +
+ + Address + + @if (form.controls["address"].hasError('required')) {Address is required} + @if (form.controls["address"].hasError('maxlength')) {Address may be at most 255 characters + long} + +
+ + City + + @if (form.controls["city"].hasError('required')) {City is required} + @if (form.controls["city"].hasError('maxlength')) {City may be at most 80 characters + long} + +
+ + Telephone + + @if (form.controls["telephone"].hasError('required')) {Telephone is required} + @if (form.controls["telephone"].hasError('maxlength')) {Telephone may be at most 20 numbers + long} + @if (form.controls["telephone"].hasError('pattern')) {Telephone must consist of numbers + only} + +
+ Back + +
\ No newline at end of file diff --git a/angular-client/src/app/owner-add/owner-add.component.scss b/angular-client/src/app/owner-add/owner-add.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/angular-client/src/app/owner-add/owner-add.component.spec.ts b/angular-client/src/app/owner-add/owner-add.component.spec.ts new file mode 100644 index 0000000..4108f3d --- /dev/null +++ b/angular-client/src/app/owner-add/owner-add.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OwnerAddComponent } from './owner-add.component'; + +describe('OwnerAddComponent', () => { + let component: OwnerAddComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [OwnerAddComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(OwnerAddComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular-client/src/app/owner-add/owner-add.component.ts b/angular-client/src/app/owner-add/owner-add.component.ts new file mode 100644 index 0000000..53d2b91 --- /dev/null +++ b/angular-client/src/app/owner-add/owner-add.component.ts @@ -0,0 +1,39 @@ +import { Component, inject } from '@angular/core'; +import { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { OwnerService } from '../../../build/client'; +import { Router, RouterLink } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatSnackBar } from '@angular/material/snack-bar'; + +@Component({ + selector: 'app-owner-add', + imports: [ReactiveFormsModule, RouterLink, MatButtonModule, MatFormFieldModule, MatInputModule], + templateUrl: './owner-add.component.html', + styleUrl: './owner-add.component.scss' +}) +export class OwnerAddComponent { + form: FormGroup; + private readonly ownerService = inject(OwnerService); + private readonly router = inject(Router); + private readonly snackBar = inject(MatSnackBar); + constructor(builder: FormBuilder) { + this.form = builder.group({ + firstName: [null, [Validators.minLength(1), Validators.maxLength(30), Validators.pattern(/^[a-zA-Z]*$/), Validators.required]], + lastName: [null, [Validators.minLength(1), Validators.maxLength(30), Validators.pattern(/^[a-zA-Z]*$/), Validators.required]], + address: [null, [Validators.required, Validators.maxLength(255)]], + city: [null, [Validators.required, Validators.maxLength(80)]], + telephone: [null, [Validators.minLength(1), Validators.maxLength(20), Validators.pattern(/^[0-9]*$/), Validators.required]], + }); + } + + onSubmit() { + this.ownerService.addOwner(this.form.value).subscribe({ + next: _newOwner => { + this.router.navigate(['/owners']); + }, + error: error => this.snackBar.open(error) + }); + } +} diff --git a/angular-client/src/app/owner-list/owner-list.component.html b/angular-client/src/app/owner-list/owner-list.component.html new file mode 100644 index 0000000..ff77203 --- /dev/null +++ b/angular-client/src/app/owner-list/owner-list.component.html @@ -0,0 +1,29 @@ +

Owners

+
+
+ + Last Name + + +
+ +
+ + + + + + + + + + + + + + +
Name{{owner.firstName}} + {{owner.lastName}}Pets +
    @for (pet of owner.pets; track pet.id) {
  • {{pet.name}}
  • }
+
+Add Owner \ No newline at end of file diff --git a/angular-client/src/app/owner-list/owner-list.component.scss b/angular-client/src/app/owner-list/owner-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/angular-client/src/app/owner-list/owner-list.component.spec.ts b/angular-client/src/app/owner-list/owner-list.component.spec.ts new file mode 100644 index 0000000..f7a1f19 --- /dev/null +++ b/angular-client/src/app/owner-list/owner-list.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OwnerListComponent } from './owner-list.component'; + +describe('OwnerListComponent', () => { + let component: OwnerListComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [OwnerListComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(OwnerListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular-client/src/app/owner-list/owner-list.component.ts b/angular-client/src/app/owner-list/owner-list.component.ts new file mode 100644 index 0000000..dc45859 --- /dev/null +++ b/angular-client/src/app/owner-list/owner-list.component.ts @@ -0,0 +1,34 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { FormControl, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatTableModule } from '@angular/material/table'; +import { Owner, OwnerService } from '../../../build/client'; +import { RouterLink } from '@angular/router'; +import { Observable, startWith, Subject, switchMap } from 'rxjs'; +import { CollectionViewer, DataSource } from '@angular/cdk/collections'; + +@Component({ + selector: 'app-owner-list', + imports: [RouterLink, MatCardModule, MatTableModule, MatButtonModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule], + templateUrl: './owner-list.component.html', + styleUrl: './owner-list.component.scss' +}) +export class OwnerListComponent implements DataSource { + lastNameInput = new FormControl(); + lastName$ = new Subject(); + columnsToDisplay = ["name", "address", "city", "telephone", "pets"]; + private readonly ownerService = inject(OwnerService); + + connect(_collectionViewer: CollectionViewer): Observable { + return this.lastName$.pipe(startWith(this.lastNameInput.value), switchMap(lastName => this.ownerService.listOwners(lastName))) + } + disconnect(_collectionViewer: CollectionViewer): void { + } + + onSubmit() { + this.lastName$.next(this.lastNameInput.value || undefined); + } +} \ No newline at end of file diff --git a/angular-client/src/app/page-not-found/page-not-found.component.html b/angular-client/src/app/page-not-found/page-not-found.component.html new file mode 100644 index 0000000..c683218 --- /dev/null +++ b/angular-client/src/app/page-not-found/page-not-found.component.html @@ -0,0 +1,5 @@ + + Oops! Page not found ! + Not Found - 404 error + pets logo + \ No newline at end of file diff --git a/angular-client/src/app/page-not-found/page-not-found.component.scss b/angular-client/src/app/page-not-found/page-not-found.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/angular-client/src/app/page-not-found/page-not-found.component.spec.ts b/angular-client/src/app/page-not-found/page-not-found.component.spec.ts new file mode 100644 index 0000000..878de5b --- /dev/null +++ b/angular-client/src/app/page-not-found/page-not-found.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PageNotFoundComponent } from './page-not-found.component'; + +describe('PageNotFoundComponent', () => { + let component: PageNotFoundComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PageNotFoundComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PageNotFoundComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular-client/src/app/page-not-found/page-not-found.component.ts b/angular-client/src/app/page-not-found/page-not-found.component.ts new file mode 100644 index 0000000..4783a40 --- /dev/null +++ b/angular-client/src/app/page-not-found/page-not-found.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; + +@Component({ + selector: 'app-page-not-found', + imports: [MatCardModule], + templateUrl: './page-not-found.component.html', + styleUrl: './page-not-found.component.scss' +}) +export class PageNotFoundComponent { + +} diff --git a/angular-client/src/app/welcome/welcome.component.html b/angular-client/src/app/welcome/welcome.component.html new file mode 100644 index 0000000..a234aee --- /dev/null +++ b/angular-client/src/app/welcome/welcome.component.html @@ -0,0 +1,5 @@ + + Welcome to Petclinic + Welcome + pets logo + \ No newline at end of file diff --git a/angular-client/src/app/welcome/welcome.component.scss b/angular-client/src/app/welcome/welcome.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/angular-client/src/app/welcome/welcome.component.spec.ts b/angular-client/src/app/welcome/welcome.component.spec.ts new file mode 100644 index 0000000..92182b5 --- /dev/null +++ b/angular-client/src/app/welcome/welcome.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WelcomeComponent } from './welcome.component'; + +describe('WelcomeComponent', () => { + let component: WelcomeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [WelcomeComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(WelcomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular-client/src/app/welcome/welcome.component.ts b/angular-client/src/app/welcome/welcome.component.ts new file mode 100644 index 0000000..304b2c0 --- /dev/null +++ b/angular-client/src/app/welcome/welcome.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; + +@Component({ + selector: 'app-welcome', + imports: [MatCardModule], + templateUrl: './welcome.component.html', + styleUrl: './welcome.component.scss' +}) +export class WelcomeComponent { + +} diff --git a/angular-client/src/index.html b/angular-client/src/index.html index ed43911..5347070 100644 --- a/angular-client/src/index.html +++ b/angular-client/src/index.html @@ -6,8 +6,10 @@ + + - + diff --git a/angular-client/src/styles.scss b/angular-client/src/styles.scss index 90d4ee0..4bd30ea 100644 --- a/angular-client/src/styles.scss +++ b/angular-client/src/styles.scss @@ -1 +1,12 @@ /* You can add global styles to this file, and also import other style files */ +@use '@angular/material' as mat; +html { + color-scheme: light; + @include mat.theme(( + color: mat.$green-palette, + typography: Roboto, + density: 0 + )); +} +html, body { height: 100%; } +body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } \ No newline at end of file