diff --git a/package-lock.json b/package-lock.json index 34eeb2f..9027eaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6507,17 +6507,6 @@ "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/@trivago/prettier-plugin-sort-imports": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", @@ -7519,15 +7508,6 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -7883,14 +7863,6 @@ "node": ">=12" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/autoprefixer": { "version": "10.4.20", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", @@ -8748,20 +8720,6 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -9189,20 +9147,6 @@ "node": ">=4" } }, - "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/custom-idle-queue": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/custom-idle-queue/-/custom-idle-queue-3.0.1.tgz", @@ -9224,37 +9168,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, - "node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/debug": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", @@ -9271,14 +9184,6 @@ } } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -9367,17 +9272,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -9494,21 +9388,6 @@ } ] }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", @@ -10521,22 +10400,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -10984,20 +10847,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/html-entities": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", @@ -11590,14 +11439,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -11789,110 +11630,6 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "devOptional": true }, - "node_modules/jsdom": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", - "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "abab": "^2.0.6", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", - "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/jsdom/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -13956,14 +13693,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nwsapi": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", - "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -15627,14 +15356,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -15861,20 +15582,6 @@ "dev": true, "optional": true }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, "node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -16781,14 +16488,6 @@ "node": ">=0.10" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/tailwindcss": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", @@ -17842,20 +17541,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -18225,45 +17910,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/whatwg-url": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", @@ -18451,25 +18097,6 @@ } } }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index be061ae..9424c4d 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -10,5 +10,11 @@ export const routes: Routes = [ path: 'settings', loadChildren: () => import('./settings/settings.routes').then(m => m.settingsRoutes), }, - { path: '', redirectTo: '/planting', pathMatch: 'full' }, + { + path: '', + loadChildren: () => import('./home/home.routes').then(m => m.homeRoutes), + }, + + // rest + { path: '**', redirectTo: '/' }, ]; diff --git a/src/app/cultivating/cultivating-page.component.ts b/src/app/cultivating/cultivating-page.component.ts index 55fd460..1134aa6 100644 --- a/src/app/cultivating/cultivating-page.component.ts +++ b/src/app/cultivating/cultivating-page.component.ts @@ -2,8 +2,8 @@ import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/cor import { BarnService } from '../barn/barn.service'; import { LearnCardsComponent } from '../learning/learn-cards.component'; -import { DialogComponent } from '../ui/dialog/dialog.component'; -import { SproutDetailsComponent, type SproutDetailsSprout } from './sprout-details/sprout-details.component'; +import { SproutDetailsDialogComponent } from './sprout-details-dialog/sprout-details-dialog.component'; +import { type SproutDetailsSprout } from './sprout-details/sprout-details.component'; import { SproutsListComponent } from './sprouts-list/sprouts-list.component'; @Component({ @@ -15,18 +15,11 @@ import { SproutsListComponent } from './sprouts-list/sprouts-list.component'; @if (sproutDetails(); as sprout) { - - - + } `, - imports: [SproutsListComponent, SproutDetailsComponent, DialogComponent, LearnCardsComponent], + imports: [SproutsListComponent, SproutDetailsDialogComponent, LearnCardsComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, }) @@ -45,14 +38,4 @@ export class CultivatingPageComponent { this.sproutDetails.set(sprout); } - - onRemoveSprout(id: string) { - this.barnService.removeSprout(id); - this.sproutDetails.set(null); - } - - onUpdateSprout(id: string, value: Partial) { - this.barnService.updateSprout(id, value); - this.sproutDetails.set(null); - } } diff --git a/src/app/cultivating/sprout-details-dialog/sprout-details-dialog.component.ts b/src/app/cultivating/sprout-details-dialog/sprout-details-dialog.component.ts new file mode 100644 index 0000000..6a19595 --- /dev/null +++ b/src/app/cultivating/sprout-details-dialog/sprout-details-dialog.component.ts @@ -0,0 +1,39 @@ +import { ChangeDetectionStrategy, Component, inject, input, output } from '@angular/core'; + +import { BarnService } from '../../barn/barn.service'; +import { DialogComponent } from '../../ui/dialog/dialog.component'; +import { SproutDetailsComponent, type SproutDetailsSprout } from '../sprout-details/sprout-details.component'; + +@Component({ + selector: 'app-sprout-details-dialog', + template: ` + + + + `, + imports: [DialogComponent, SproutDetailsComponent], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class SproutDetailsDialogComponent { + private barnService = inject(BarnService); + + sprout = input.required(); + + close = output(); + + onRemoveSprout(id: string) { + this.barnService.removeSprout(id); + this.close.emit(); + } + + onUpdateSprout(id: string, value: Partial) { + this.barnService.updateSprout(id, value); + this.close.emit(); + } +} diff --git a/src/app/home/add-terms-button/add-terms-button.component.ts b/src/app/home/add-terms-button/add-terms-button.component.ts new file mode 100644 index 0000000..cf34d02 --- /dev/null +++ b/src/app/home/add-terms-button/add-terms-button.component.ts @@ -0,0 +1,23 @@ +import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; + +import { IconComponent } from '../../ui/icon/icon'; +import { AddTermsDialogComponent } from '../add-terms-dialog/add-terms-dialog.component'; + +@Component({ + selector: 'app-add-terms-button', + template: ` + + + @if (showAddTermsDialog()) { + + } + `, + imports: [IconComponent, AddTermsDialogComponent], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AddTermsButtonComponent { + showAddTermsDialog = signal(false); +} diff --git a/src/app/home/add-terms-dialog/add-terms-dialog.component.ts b/src/app/home/add-terms-dialog/add-terms-dialog.component.ts new file mode 100644 index 0000000..bb44a95 --- /dev/null +++ b/src/app/home/add-terms-dialog/add-terms-dialog.component.ts @@ -0,0 +1,56 @@ +import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core'; + +import { BarnService } from '../../barn/barn.service'; +import { ButtonDirective } from '../../ui/button/button'; +import { DialogComponent } from '../../ui/dialog/dialog.component'; +import { InputDirective } from '../../ui/input/input'; + +@Component({ + selector: 'app-add-terms-dialog', + template: ` + +
+ + +
+ + +
+
+
+ `, + imports: [DialogComponent, ButtonDirective, InputDirective], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AddTermsDialogComponent { + private barnService = inject(BarnService); + + close = output(); + + newSeed = signal(''); + + updateSeed(event: Event) { + this.newSeed.set((event.target as HTMLTextAreaElement).value); + } + + add() { + const newSeeds = this.newSeed() + .split('\n') + .map(seed => seed.trim()) + .filter(seed => !!seed); + + if (newSeeds.length !== 0) { + this.barnService.addSeeds(newSeeds); + } + + this.close.emit(); + } +} diff --git a/src/app/home/home-page.component.ts b/src/app/home/home-page.component.ts new file mode 100644 index 0000000..0b0d0b3 --- /dev/null +++ b/src/app/home/home-page.component.ts @@ -0,0 +1,25 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +import { LearnCardsComponent } from '../learning/learn-cards.component'; +import { AddTermsButtonComponent } from './add-terms-button/add-terms-button.component'; +import { LastSeedsListComponent } from './last-seeds-list/last-seeds-list.component'; +import { UnsortedSproutsComponent } from './unsorted-sprouts/unsorted-sprouts.component'; + +@Component({ + selector: 'app-home-page', + template: ` +
+ + + + + + + +
+ `, + imports: [UnsortedSproutsComponent, LearnCardsComponent, AddTermsButtonComponent, LastSeedsListComponent], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class HomePageComponent {} diff --git a/src/app/home/home.routes.ts b/src/app/home/home.routes.ts new file mode 100644 index 0000000..4e137b8 --- /dev/null +++ b/src/app/home/home.routes.ts @@ -0,0 +1,9 @@ +import type { Routes } from '@angular/router'; + +export const homeRoutes: Routes = [ + { + path: '', + title: 'Akker', + loadComponent: () => import('./home-page.component').then(m => m.HomePageComponent), + }, +]; diff --git a/src/app/home/last-seeds-list/last-seeds-list.component.ts b/src/app/home/last-seeds-list/last-seeds-list.component.ts new file mode 100644 index 0000000..c74bb09 --- /dev/null +++ b/src/app/home/last-seeds-list/last-seeds-list.component.ts @@ -0,0 +1,35 @@ +import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core'; + +import { BarnService } from '../../barn/barn.service'; + +@Component({ + selector: 'app-last-seeds-list', + template: ` +
+

Last seeds

+ +
    + @for (seed of lastAddedSeeds(); track seed.name) { +
  • + {{ seed.name }} +
  • + } +
+
+ `, + imports: [], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class LastSeedsListComponent { + private barnService = inject(BarnService); + + lastAddedSeeds = computed(() => + this.barnService + .seeds() + ?.toSorted((a, b) => b.lastAddedAt.localeCompare(a.lastAddedAt)) + .slice(0, lastSeedsCount), + ); +} + +const lastSeedsCount = 10; diff --git a/src/app/home/unsorted-sprouts/unsorted-sprouts.component.ts b/src/app/home/unsorted-sprouts/unsorted-sprouts.component.ts new file mode 100644 index 0000000..afc090e --- /dev/null +++ b/src/app/home/unsorted-sprouts/unsorted-sprouts.component.ts @@ -0,0 +1,44 @@ +import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core'; + +import { BarnService } from '../../barn/barn.service'; +import { SproutDetailsDialogComponent } from '../../cultivating/sprout-details-dialog/sprout-details-dialog.component'; +import { type SproutDetailsSprout } from '../../cultivating/sprout-details/sprout-details.component'; + +@Component({ + selector: 'app-unsorted-sprouts', + template: ` + @if (someUnsortedSprouts().length > 0) { +
+

Unsorted sprouts ({{ unsortedSproutsAmount() }})

+ +
    + @for (sprout of someUnsortedSprouts(); track sprout.id) { +
  • + +
  • + } +
+
+ + @if (sproutDetails(); as sprout) { + + } + } + `, + imports: [SproutDetailsDialogComponent], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UnsortedSproutsComponent { + private barnService = inject(BarnService); + private unsortedSprouts = computed(() => this.barnService.sprouts()?.filter(sprout => !sprout.definition)); + + unsortedSproutsAmount = computed(() => this.unsortedSprouts()?.length ?? 0); + someUnsortedSprouts = computed(() => this.unsortedSprouts()?.slice(0, someUnsortedSproutsAmount) ?? []); + + sproutDetails = signal(null); +} + +const someUnsortedSproutsAmount = 10; diff --git a/src/app/layout/layout.component.ts b/src/app/layout/layout.component.ts index bad155f..7ab4496 100644 --- a/src/app/layout/layout.component.ts +++ b/src/app/layout/layout.component.ts @@ -5,21 +5,22 @@ import { RouterLink, RouterLinkActive } from '@angular/router'; selector: 'app-layout', template: `
-
+
-
`, @@ -29,6 +30,7 @@ import { RouterLink, RouterLinkActive } from '@angular/router'; }) export class LayoutComponent { navigationLinks = [ + { path: '/', label: 'Home', options: { exact: true } }, { path: '/planting', label: 'Planting' }, { path: '/cultivating', label: 'Cultivating' }, { path: '/settings', label: 'Settings' }, diff --git a/src/app/planting/new-seed/assets/input.svg b/src/app/planting/new-seed/assets/input.svg deleted file mode 100644 index 865f620..0000000 --- a/src/app/planting/new-seed/assets/input.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/app/planting/new-seed/assets/multiline-input.svg b/src/app/planting/new-seed/assets/multiline-input.svg deleted file mode 100644 index 86a092c..0000000 --- a/src/app/planting/new-seed/assets/multiline-input.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/app/planting/new-seed/new-seed.component.ts b/src/app/planting/new-seed/new-seed.component.ts deleted file mode 100644 index ab87a46..0000000 --- a/src/app/planting/new-seed/new-seed.component.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { ChangeDetectionStrategy, Component, output, signal } from '@angular/core'; - -import { IconComponent } from '../../ui/icon/icon'; -import { provideIcons } from '../../ui/icon/provide-icons'; -import { InputDirective } from '../../ui/input/input'; -import input from './assets/input.svg'; -import multilineInput from './assets/multiline-input.svg'; - -@Component({ - selector: 'app-new-seed', - template: ` -
- - - - @if (mode() === 'single') { - - } @else { - - } - - -
- `, - imports: [InputDirective, IconComponent], - providers: [provideIcons({ multilineInput, input })], - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class NewSeedComponent { - addSeeds = output(); - - mode = signal<'single' | 'multiple'>('single'); - newSeed = signal(''); - - toggleMode() { - this.mode.set(this.mode() === 'single' ? 'multiple' : 'single'); - } - - updateSeed(event: Event) { - this.newSeed.set((event.target as HTMLInputElement | HTMLTextAreaElement).value); - } - - onAdd() { - if (this.mode() === 'single') { - this.saveSeed(); - } else { - this.saveSeedsList(); - } - } - - private saveSeed() { - const seed = this.newSeed(); - - if (!seed) { - return; - } - - this.addSeeds.emit([seed]); - this.newSeed.set(''); - } - - private saveSeedsList() { - const seedsList = this.newSeed(); - - if (!seedsList) { - return; - } - - const newSeeds = seedsList - .split('\n') - .map(seed => seed.trim()) - .filter(seed => !!seed); - - if (newSeeds.length === 0) { - return; - } - - this.addSeeds.emit(newSeeds); - this.newSeed.set(''); - } -} diff --git a/src/app/planting/planting-page.component.ts b/src/app/planting/planting-page.component.ts index 59d6d2b..57c29d5 100644 --- a/src/app/planting/planting-page.component.ts +++ b/src/app/planting/planting-page.component.ts @@ -1,8 +1,8 @@ import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core'; import { BarnService } from '../barn/barn.service'; +import { AddTermsButtonComponent } from '../home/add-terms-button/add-terms-button.component'; import { DialogComponent } from '../ui/dialog/dialog.component'; -import { NewSeedComponent } from './new-seed/new-seed.component'; import { SeedDetailsComponent, type SeedDetailsSeed } from './seed-details/seed-details.component'; import { SeedsListComponent } from './seeds-list/seeds-list.component'; @@ -10,9 +10,10 @@ import { SeedsListComponent } from './seeds-list/seeds-list.component'; selector: 'app-planting-page', template: `
- + + @if (seedDetails(); as seed) { `, - imports: [NewSeedComponent, SeedsListComponent, SeedDetailsComponent, DialogComponent], + imports: [SeedsListComponent, SeedDetailsComponent, DialogComponent, AddTermsButtonComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, }) @@ -35,10 +36,6 @@ export class PlantingPageComponent { seeds = this.barnService.seeds; seedDetails = signal(null); - onAddSeeds(names: string[]) { - this.barnService.addSeeds(names); - } - onRemoveSeed(name: string) { this.barnService.removeSeed(name); this.seedDetails.set(null); diff --git a/vite.config.mts b/vite.config.mts index 76900c3..5011a15 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -8,7 +8,6 @@ export default defineConfig(({ mode }) => { plugins: [angular()], test: { globals: true, - environment: 'jsdom', setupFiles: ['src/test-setup.ts'], include: ['**/*.spec.ts'], reporters: ['default'],