diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/ShoppingListWidgetController.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/ShoppingListWidgetController.java index ccf3acc..ce21901 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/ShoppingListWidgetController.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/ShoppingListWidgetController.java @@ -2,10 +2,7 @@ import com.dhbw.get2gether.backend.event.model.Event; import com.dhbw.get2gether.backend.widget.application.ShoppingListWidgetService; -import com.dhbw.get2gether.backend.widget.model.shoppinglist.EntryAddCommand; -import com.dhbw.get2gether.backend.widget.model.shoppinglist.EntryCheckCommand; -import com.dhbw.get2gether.backend.widget.model.shoppinglist.ShoppingListCreateCommand; -import com.dhbw.get2gether.backend.widget.model.shoppinglist.ShoppingListWidget; +import com.dhbw.get2gether.backend.widget.model.shoppinglist.*; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.web.bind.annotation.*; @@ -60,4 +57,15 @@ public ShoppingListWidget checkEntry( return service.checkEntry(principal, eventId, widgetId, entryId, checkCommand); } + @PutMapping("/{widgetId}/entries/update/{entryId}") + public ShoppingListWidget updateEntry( + @AuthenticationPrincipal OAuth2User principal, + @PathVariable String eventId, + @PathVariable String widgetId, + @PathVariable String entryId, + @RequestBody EntryUpdateCommand updateCommand + ) { + return service.updateEntry(principal, eventId, widgetId, entryId, updateCommand); + } + } diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/ShoppingListWidgetService.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/ShoppingListWidgetService.java index 56abca8..4a7d5a1 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/ShoppingListWidgetService.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/ShoppingListWidgetService.java @@ -68,11 +68,25 @@ public ShoppingListWidget removeEntry(AuthenticatedPrincipal principal, String e public ShoppingListWidget checkEntry(AuthenticatedPrincipal principal, String eventId, String widgetId, String entryId, EntryCheckCommand checkCommand) { Event event = getEventById(principal, eventId); ShoppingListWidget widget = getWidgetFromEvent(event, widgetId); - Entry entry = widget.getEntries().stream() - .filter(l -> Objects.equals(l.getId(), entryId)).findFirst() - .orElseThrow(() -> new EntityNotFoundException("Entry not found")); + Entry entry = getEntry(widget, entryId); entry.check(userService.getUserByPrincipal(principal).getId(), mapper.mapEntryCheckCommandToEntryCheck(checkCommand)); return updateAndGetWidget(principal, event, widget); } + @PreAuthorize("hasRole('USER')") + public ShoppingListWidget updateEntry(AuthenticatedPrincipal principal, String eventId, String widgetId, String entryId, EntryUpdateCommand updateCommand) { + Event event = getEventById(principal, eventId); + ShoppingListWidget widget = getWidgetFromEvent(event, widgetId); + Entry entry = getEntry(widget, entryId); + entry.update(updateCommand); + return updateAndGetWidget(principal, event, widget); + } + + private Entry getEntry(ShoppingListWidget widget, String entryId) { + return widget.getEntries().stream() + .filter(l -> Objects.equals(l.getId(), entryId)).findFirst() + .orElseThrow(() -> new EntityNotFoundException("Entry not found")); + } + + } diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/shoppinglist/Entry.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/shoppinglist/Entry.java index 62330b2..e256d91 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/shoppinglist/Entry.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/shoppinglist/Entry.java @@ -24,4 +24,9 @@ public void check(String buyerId, EntryCheck entryCheck) { // BuyerID soll nicht gelöscht werden, wenn der Eintrag nicht mehr gecheckt ist, aber überschrieben werden können } } + + public void update(EntryUpdateCommand updateEntry) { + this.description = updateEntry.getDescription(); + this.amount = updateEntry.getAmount(); + } } diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/shoppinglist/EntryUpdateCommand.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/shoppinglist/EntryUpdateCommand.java new file mode 100644 index 0000000..113cec7 --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/shoppinglist/EntryUpdateCommand.java @@ -0,0 +1,13 @@ +package com.dhbw.get2gether.backend.widget.model.shoppinglist; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Builder(toBuilder = true) +@Getter +@AllArgsConstructor +public class EntryUpdateCommand { + private String description; + private String amount; +} diff --git a/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/ShoppingListWidgetServiceTest.java b/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/ShoppingListWidgetServiceTest.java index 5de76db..7e081c3 100644 --- a/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/ShoppingListWidgetServiceTest.java +++ b/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/ShoppingListWidgetServiceTest.java @@ -336,4 +336,61 @@ void shouldUnCheckEntry() { .isEqualTo(entryAfterCheck); assertThat(returnedWidget.getEntries().get(0).getId()).isNotBlank(); } + + @Test + @WithMockOAuth2User + void shouldUpdateEntry() { + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Entry entry = Entry.builder() + .description("Test") + .amount("1") + .checked(false) + .creatorId("creator-id") + .id("123") + .build(); + ShoppingListWidget widget = ShoppingListWidget.builder() + .id("wi-123") + .entries(new ArrayList<>(List.of(entry))) + .build(); + Event event = Event.builder() + .id("ev-123") + .widgets(new ArrayList<>(List.of(widget))) + .build(); + EntryUpdateCommand updateCommand = EntryUpdateCommand.builder() + .description("Edited") + .amount("2") + .build(); + Entry entryAfterUpdate = Entry.builder() + .description("Edited") + .amount("2") + .checked(false) + .creatorId("creator-id") + .id("123") + .build(); + + when(eventService.getSingleEvent(any(), eq(event.getId()))).thenReturn(event); + when(eventService.updateEventWidgets(any(), eq(event.getId()), any())) + .thenAnswer(i -> event.toBuilder() + .widgets( + i.getArgument(2, EventWidgetUpdateCommand.class).getWidgets() + ) + .build() + ); + when(userService.getUserByPrincipal(principal)).thenReturn(User.builder() + .id("test") + .email("test@example.com").build()); + + // when + ShoppingListWidget returnedWidget = shoppingListWidgetService.updateEntry(principal, event.getId(), widget.getId(), entry.getId(), updateCommand); + + // then + assertThat(returnedWidget).isNotNull(); + assertThat(returnedWidget.getEntries()).hasSize(1); + assertThat(returnedWidget.getEntries().get(0)).usingRecursiveComparison() + .ignoringFields("id") + .isEqualTo(entryAfterUpdate); + assertThat(returnedWidget.getEntries().get(0).getId()).isNotBlank(); + } } \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3dcf50e..5dde955 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -20,7 +20,6 @@ "@angular/platform-browser": "^17.3.6", "@angular/platform-browser-dynamic": "^17.3.6", "@angular/router": "^17.3.6", - "material-components-web": "^14.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.14.3" @@ -671,6 +670,48 @@ "@angular/platform-browser": "^17.0.0 || ^18.0.0" } }, + "node_modules/@angular/material-experimental/node_modules/@material/snackbar": { + "version": "15.0.0-canary.7f224ddd4.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.7f224ddd4.0.tgz", + "integrity": "sha512-sm7EbVKddaXpT/aXAYBdPoN0k8yeg9+dprgBUkrdqGzWJAeCkxb4fv2B3He88YiCtvkTz2KLY4CThPQBSEsMFQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.7f224ddd4.0", + "@material/base": "15.0.0-canary.7f224ddd4.0", + "@material/button": "15.0.0-canary.7f224ddd4.0", + "@material/dom": "15.0.0-canary.7f224ddd4.0", + "@material/elevation": "15.0.0-canary.7f224ddd4.0", + "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", + "@material/icon-button": "15.0.0-canary.7f224ddd4.0", + "@material/ripple": "15.0.0-canary.7f224ddd4.0", + "@material/rtl": "15.0.0-canary.7f224ddd4.0", + "@material/shape": "15.0.0-canary.7f224ddd4.0", + "@material/theme": "15.0.0-canary.7f224ddd4.0", + "@material/tokens": "15.0.0-canary.7f224ddd4.0", + "@material/typography": "15.0.0-canary.7f224ddd4.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@angular/material/node_modules/@material/snackbar": { + "version": "15.0.0-canary.7f224ddd4.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.7f224ddd4.0.tgz", + "integrity": "sha512-sm7EbVKddaXpT/aXAYBdPoN0k8yeg9+dprgBUkrdqGzWJAeCkxb4fv2B3He88YiCtvkTz2KLY4CThPQBSEsMFQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.7f224ddd4.0", + "@material/base": "15.0.0-canary.7f224ddd4.0", + "@material/button": "15.0.0-canary.7f224ddd4.0", + "@material/dom": "15.0.0-canary.7f224ddd4.0", + "@material/elevation": "15.0.0-canary.7f224ddd4.0", + "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", + "@material/icon-button": "15.0.0-canary.7f224ddd4.0", + "@material/ripple": "15.0.0-canary.7f224ddd4.0", + "@material/rtl": "15.0.0-canary.7f224ddd4.0", + "@material/shape": "15.0.0-canary.7f224ddd4.0", + "@material/theme": "15.0.0-canary.7f224ddd4.0", + "@material/tokens": "15.0.0-canary.7f224ddd4.0", + "@material/typography": "15.0.0-canary.7f224ddd4.0", + "tslib": "^2.1.0" + } + }, "node_modules/@angular/platform-browser": { "version": "17.3.6", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.6.tgz", @@ -2493,358 +2534,6 @@ "node": ">=10.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", - "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", - "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", - "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", - "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", - "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", - "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", - "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", - "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", - "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", - "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", - "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", - "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", - "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", - "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", - "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", - "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", - "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", - "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", - "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", - "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", - "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", - "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/win32-x64": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", @@ -3609,27 +3298,6 @@ "tslib": "^2.1.0" } }, - "node_modules/@material/snackbar": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-sm7EbVKddaXpT/aXAYBdPoN0k8yeg9+dprgBUkrdqGzWJAeCkxb4fv2B3He88YiCtvkTz2KLY4CThPQBSEsMFQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/icon-button": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, "node_modules/@material/switch": { "version": "15.0.0-canary.7f224ddd4.0", "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.7f224ddd4.0.tgz", @@ -4117,244 +3785,49 @@ "integrity": "sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==", "dev": true, "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", - "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", - "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", - "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", - "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", - "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", - "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", - "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", - "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", - "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", - "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", - "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", - "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", - "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", - "cpu": [ - "x64" - ], + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=16" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", - "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", - "cpu": [ - "arm64" - ], + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", - "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", - "cpu": [ - "ia32" - ], + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=14" + } }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.16.4", @@ -7328,20 +6801,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -9037,796 +8496,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/material-components-web": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/material-components-web/-/material-components-web-14.0.0.tgz", - "integrity": "sha512-bfGTQQOMhlBfZYkMzXNdydotG8p/hntiln13IRVIN38F170OU/y7ONpCxUweANDEVxrMeKAupVw/4u9in+LKFA==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/auto-init": "^14.0.0", - "@material/banner": "^14.0.0", - "@material/base": "^14.0.0", - "@material/button": "^14.0.0", - "@material/card": "^14.0.0", - "@material/checkbox": "^14.0.0", - "@material/chips": "^14.0.0", - "@material/circular-progress": "^14.0.0", - "@material/data-table": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dialog": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/drawer": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/fab": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/floating-label": "^14.0.0", - "@material/focus-ring": "^14.0.0", - "@material/form-field": "^14.0.0", - "@material/icon-button": "^14.0.0", - "@material/image-list": "^14.0.0", - "@material/layout-grid": "^14.0.0", - "@material/line-ripple": "^14.0.0", - "@material/linear-progress": "^14.0.0", - "@material/list": "^14.0.0", - "@material/menu": "^14.0.0", - "@material/menu-surface": "^14.0.0", - "@material/notched-outline": "^14.0.0", - "@material/radio": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/segmented-button": "^14.0.0", - "@material/select": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/slider": "^14.0.0", - "@material/snackbar": "^14.0.0", - "@material/switch": "^14.0.0", - "@material/tab": "^14.0.0", - "@material/tab-bar": "^14.0.0", - "@material/tab-indicator": "^14.0.0", - "@material/tab-scroller": "^14.0.0", - "@material/textfield": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/tokens": "^14.0.0", - "@material/tooltip": "^14.0.0", - "@material/top-app-bar": "^14.0.0", - "@material/touch-target": "^14.0.0", - "@material/typography": "^14.0.0" - } - }, - "node_modules/material-components-web/node_modules/@material/animation": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-14.0.0.tgz", - "integrity": "sha512-VlYSfUaIj/BBVtRZI8Gv0VvzikFf+XgK0Zdgsok5c1v5DDnNz5tpB8mnGrveWz0rHbp1X4+CWLKrTwNmjrw3Xw==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/auto-init": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-14.0.0.tgz", - "integrity": "sha512-RtrHVRTRtUvOd5PC5EZkwYrab11n4sVroYL5g9lH0+cvK6PDXv1M/wVdwOSWHYgzBUU1aSf9ZTMkKdrvharU+A==", - "dependencies": { - "@material/base": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/banner": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/banner/-/banner-14.0.0.tgz", - "integrity": "sha512-z0WPBVQxbQVcV1km4hFD40xBEeVWYtCzl2jrkHd8xXexP/fMvXkFU1UfwSWvY3jlWx//j4/Xd7VpnRdEXS4RLQ==", - "dependencies": { - "@material/base": "^14.0.0", - "@material/button": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/tokens": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/base": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-14.0.0.tgz", - "integrity": "sha512-Ou7vS7n1H4Y10MUZyYAbt6H0t67c6urxoCgeVT7M38aQlaNUwFMODp7KT/myjYz2YULfhu3PtfSV3Sltgac9mA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/button": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-14.0.0.tgz", - "integrity": "sha512-dqqHaJq0peyXBZupFzCjmvScrfljyVU66ZCS3oldsaaj5iz8sn33I/45Z4zPzdR5F5z8ExToHkRcXhakj1UEAA==", - "dependencies": { - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/focus-ring": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/tokens": "^14.0.0", - "@material/touch-target": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/card": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/card/-/card-14.0.0.tgz", - "integrity": "sha512-SnpYWUrCb92meGYLXV7qa/k40gnHR6rPki6A1wz0OAyG2twY48f0HLscAqxBLvbbm1LuRaqjz0RLKGH3VzxZHw==", - "dependencies": { - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/checkbox": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-14.0.0.tgz", - "integrity": "sha512-OoqwysCqvj1d0cRmEwVWPvg5OqYAiCFpE6Wng6me/Cahfe4xgRxSPa37WWqsClw20W7PG/5RrYRCBtc6bUUUZA==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/focus-ring": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/touch-target": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/chips": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/chips/-/chips-14.0.0.tgz", - "integrity": "sha512-SfZX/Ovdq4NgjdtIr/N1O3fEHisZC+t8G8629OV/NrniSS6rKOa+q1mImzna8R4pfuYO+7nT5nZewQpL/JSYaQ==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/checkbox": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/focus-ring": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/tokens": "^14.0.0", - "@material/touch-target": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/circular-progress": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-14.0.0.tgz", - "integrity": "sha512-7EdkP6ty54g6qs6zzlsw29vWlUyrcSWr9b4pGGx4D/iNJww+eyxXZ07iWoNOr4uLgguauWEft2axpQiFCwFD0g==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/progress-indicator": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/data-table": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-14.0.0.tgz", - "integrity": "sha512-tnmLawGaMtnp29KH8pX99bqeKmFODE+MtRUTt6TauupkEfQE/wd0Um4JQDFiI0kCch7uF3r/NmQKyKuan10hXw==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/checkbox": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/icon-button": "^14.0.0", - "@material/linear-progress": "^14.0.0", - "@material/list": "^14.0.0", - "@material/menu": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/select": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/touch-target": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/density": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-14.0.0.tgz", - "integrity": "sha512-NlxXBV5XjNsKd8UXF4K/+fOXLxoFNecKbsaQO6O2u+iG8QBfFreKRmkhEBb2hPPwC3w8nrODwXX0lHV+toICQw==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/dialog": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-14.0.0.tgz", - "integrity": "sha512-E07NEE4jP8jHaw/y2Il2R1a3f4wDFh2sgfCBtRO/Xh0xxJUMuQ7YXo/F3SAA8jfMbbkUv/PHdJUM3I3HmI9mAA==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/button": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/icon-button": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/tokens": "^14.0.0", - "@material/touch-target": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/dom": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-14.0.0.tgz", - "integrity": "sha512-8t88XyacclTj8qsIw9q0vEj4PI2KVncLoIsIMzwuMx49P2FZg6TsLjor262MI3Qs00UWAifuLMrhnOnfyrbe7Q==", - "dependencies": { - "@material/feature-targeting": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/drawer": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-14.0.0.tgz", - "integrity": "sha512-VPrxMIhbkXVbfH7aMFV+Um0tjOVrU/Y65X2hWsVdmjASadE8C5UYjIE3vjL1DM1M+zIa3qZZRUWqz0j1zqbr3w==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/list": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/elevation": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-14.0.0.tgz", - "integrity": "sha512-Di3tkxTpXwvf1GJUmaC8rd+zVh5dB2SWMBGagL4+kT8UmjSISif/OPRGuGnXs3QhF6nmEjkdC0ijdZLcYQkepw==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/fab": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/fab/-/fab-14.0.0.tgz", - "integrity": "sha512-s4rrw2TLU8ITKopHSTEHuJEFsGEZsb+ijwW16pQt0h9GArxPGaALT+CCJIPjf75D3wPEEMW0vnLj7oMoII2VFg==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/focus-ring": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/tokens": "^14.0.0", - "@material/touch-target": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/feature-targeting": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-14.0.0.tgz", - "integrity": "sha512-a5WGgHEq5lJeeNL5yevtgoZjBjXWy6+klfVWQEh8oyix/rMJygGgO7gEc52uv8fB8uAIoYEB3iBMOv8jRq8FeA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/floating-label": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-14.0.0.tgz", - "integrity": "sha512-Aq8BboP1sbNnOtsV72AfaYirHyOrQ/GKFoLrZ1Jt+ZGIAuXPETcj9z7nQDznst0ZeKcz420PxNn9tsybTbeL/Q==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/focus-ring": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-14.0.0.tgz", - "integrity": "sha512-fqqka6iSfQGJG3Le48RxPCtnOiaLGPDPikhktGbxlyW9srBVMgeCiONfHM7IT/1eu80O0Y67Lh/4ohu5+C+VAQ==", - "dependencies": { - "@material/dom": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/rtl": "^14.0.0" - } - }, - "node_modules/material-components-web/node_modules/@material/form-field": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-14.0.0.tgz", - "integrity": "sha512-k1GNBj6Sp8A7Xsn5lTMp5DkUkg60HX7YkQIRyFz1qCDCKJRWh/ou7Z45GMMgKmG3aF6LfjIavc7SjyCl8e5yVg==", - "dependencies": { - "@material/base": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/icon-button": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-14.0.0.tgz", - "integrity": "sha512-wHMqzm7Q/UwbWLoWv32Li1r2iVYxadIrwTNxT0+p+7NdfI3lEwMN3NoB0CvoJnHTljjXDzce0KJ3nZloa0P0gA==", - "dependencies": { - "@material/base": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/focus-ring": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/touch-target": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/image-list": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-14.0.0.tgz", - "integrity": "sha512-vx/7WCMbiZoy/R+DmO7r0N3jWzFjlvvDMeBpXt0btglWP3EYbVnDqzseW4u1TtY+IBbJldW/DsiCN1oLnlEVxw==", - "dependencies": { - "@material/feature-targeting": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/layout-grid": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-14.0.0.tgz", - "integrity": "sha512-tAce0PR/c85VI2gf1HUdM0Y15ZWpfZWAFIwaCRW1+jnOLWnG1/aOJYLlzqtVEv2m0TS1R1WRRGN3Or+CWvpDRA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/line-ripple": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-14.0.0.tgz", - "integrity": "sha512-Rx9eSnfp3FcsNz4O+fobNNq2PSm5tYHC3hRpY2ZK3ghTvgp3Y40/soaGEi/Vdg0F7jJXRaBSNOe6p5t9CVfy8Q==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/linear-progress": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-14.0.0.tgz", - "integrity": "sha512-MGIAWMHMW6TSV/TNWyl5N/escpDHk3Rq6hultFif+D9adqbOXrtfZZIFPLj1FpMm1Ucnj6zgOmJHgCDsxRVNIA==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/progress-indicator": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/list": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-14.0.0.tgz", - "integrity": "sha512-AFaBGV9vQyfnG8BT2R3UGVdF5w2SigQqBH+qbOSxQhk4BgVvhDfJUIKT415poLNMdnaDtcuYz+ZWvVNoRDaL7w==", - "dependencies": { - "@material/base": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/menu": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-14.0.0.tgz", - "integrity": "sha512-oU6GjbYnkG6a5nX9HUSege5OQByf6yUteEij8fpf0ci3f5BWf/gr39dnQ+rfl+q119cW0WIEmVK2YJ/BFxMzEQ==", - "dependencies": { - "@material/base": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/list": "^14.0.0", - "@material/menu-surface": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/menu-surface": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-14.0.0.tgz", - "integrity": "sha512-wRz3UCrhJ4kRrijJEbvIPRa0mqA5qkQmKXjBH4Xu1ApedZruP+OM3Qb2Bj4XugCA3eCXpiohg+gdyTAX3dVQyw==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/notched-outline": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-14.0.0.tgz", - "integrity": "sha512-6S58DlWmhCDr4RQF2RuwqANxlmLdHtWy2mF4JQLD9WOiCg4qY9eCQnMXu3Tbhr7f/nOZ0vzc7AtA3vfJoZmCSw==", - "dependencies": { - "@material/base": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/floating-label": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/progress-indicator": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-14.0.0.tgz", - "integrity": "sha512-09JRTuIySxs670Tcy4jVlqCUbyrO+Ad6z3nHnAi8pYl74duco4n/9jTROV0mlFdr9NIFifnd08lKbiFLDmfJGQ==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/radio": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-14.0.0.tgz", - "integrity": "sha512-VwPOi5fAoZXL3RhQJ6iDWTR34L6JXlwd5VXli8ZhzNHnUzcmpMODrRhGVew4Z5uuNj6/n2Jbn1zcS9XmmqjssA==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/focus-ring": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/touch-target": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/ripple": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-14.0.0.tgz", - "integrity": "sha512-9XoGBFd5JhFgELgW7pqtiLy+CnCIcV2s9cQ2BWbOQeA8faX9UZIDUx/g76nHLZ7UzKFtsULJxZTwORmsEt2zvw==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/rtl": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-14.0.0.tgz", - "integrity": "sha512-xl6OZYyRjuiW2hmbjV2omMV8sQtfmKAjeWnD1RMiAPLCTyOW9Lh/PYYnXjxUrNa0cRwIIbOn5J7OYXokja8puA==", - "dependencies": { - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/segmented-button": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-14.0.0.tgz", - "integrity": "sha512-6es7PPNX3T3h7bOLyb8L38hMoTXqBs5XX8XCKycKZG2Dm4stac/yYMKKO/q3MOn36t37s+JAVTjyRB8HnJu5Gg==", - "dependencies": { - "@material/base": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/touch-target": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/select": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-14.0.0.tgz", - "integrity": "sha512-4aY1kUHEnbOCRG3Tkuuk8yFfyNYSvOstBbjiYE/Z1ZGF3P1z+ON35iLatP84LvNteX4F1EMO2QAta2QbLRMAkw==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/floating-label": "^14.0.0", - "@material/line-ripple": "^14.0.0", - "@material/list": "^14.0.0", - "@material/menu": "^14.0.0", - "@material/menu-surface": "^14.0.0", - "@material/notched-outline": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/tokens": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/shape": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-14.0.0.tgz", - "integrity": "sha512-o0mJB0+feOv473KckI8gFnUo8IQAaEA6ynXzw3VIYFjPi48pJwrxa0mZcJP/OoTXrCbDzDeFJfDPXEmRioBb9A==", - "dependencies": { - "@material/feature-targeting": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/slider": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/slider/-/slider-14.0.0.tgz", - "integrity": "sha512-m5RqySIps1vhAQnGp2eg4Sh2Ss6bzrZm10TWBw2cNFHmbiI72rK2EeFnMsBXAarplY0cot/FaMuj91VP36gKFQ==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/snackbar": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-14.0.0.tgz", - "integrity": "sha512-28uQBj9bw7BalNarK9j8/aVW4Ys5aRaGHoWH+CeYvAjqQUJkrYoqM52aiKhBwqrjBPMJHk1aXthe3YbzMBm6vA==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/button": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/icon-button": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/switch": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-14.0.0.tgz", - "integrity": "sha512-vHVKzbvHVKGSrkMB1lZAl8z3eJ8sPRnSR+DWn+IhqHcTsDdDyly2NNj4i2vTSrEA39CztGqkx0OnKM4vkpiZHw==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/focus-ring": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/tokens": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/tab": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/tab/-/tab-14.0.0.tgz", - "integrity": "sha512-jGSQdp6BvZOVnvGbv0DvNDJL2lHYVFtKGehV0gSZ7FrjHK6gZnKZjWOVwt1NPu9ig9zy85vPRFpvFTeje1KZpg==", - "dependencies": { - "@material/base": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/focus-ring": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/tab-indicator": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/tab-bar": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-14.0.0.tgz", - "integrity": "sha512-G/UYEOIcljCHlkj3iCRGIz4zE9RVcsdC9wuOR6LE2rla6EGyT0x2psNlL0pIMROjXoB0HGda/gB90ovzKcbURA==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/density": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/tab": "^14.0.0", - "@material/tab-indicator": "^14.0.0", - "@material/tab-scroller": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/tab-indicator": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-14.0.0.tgz", - "integrity": "sha512-wfq136fsJGqtCIW8x1wFQHgRr7dIQ9SWqp6WG4FQGHpSzliNDA23/bdBUjh3lX2U+mfbdsFmZWEPy06jg2uc5g==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/tab-scroller": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-14.0.0.tgz", - "integrity": "sha512-wadETsRM7vT4mRjXedaPXxI/WFSSgqHRNI//dORJ6627hoiJfLb5ixwUKTYk9zTz6gNwAlRTrKh98Dr9T7n7Kw==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/tab": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/textfield": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-14.0.0.tgz", - "integrity": "sha512-HGbtAlvlIB2vWBq85yw5wQeeP3Kndl6Z0TJzQ6piVtcfdl2mPyWhuuVHQRRAOis3rCIaAAaxCQYYTJh8wIi0XQ==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/density": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/floating-label": "^14.0.0", - "@material/line-ripple": "^14.0.0", - "@material/notched-outline": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/tokens": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/theme": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-14.0.0.tgz", - "integrity": "sha512-6/SENWNIFuXzeHMPHrYwbsXKgkvCtWuzzQ3cUu4UEt3KcQ5YpViazIM6h8ByYKZP8A9d8QpkJ0WGX5btGDcVoA==", - "dependencies": { - "@material/feature-targeting": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/tokens": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-14.0.0.tgz", - "integrity": "sha512-SXgB9VwsKW4DFkHmJfDIS0x0cGdMWC1D06m6z/WQQ5P5j6/m0pKrbHVlrLzXcRjau+mFhXGvj/KyPo9Pp/Rc8Q==", - "dependencies": { - "@material/elevation": "^14.0.0" - } - }, - "node_modules/material-components-web/node_modules/@material/tooltip": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-14.0.0.tgz", - "integrity": "sha512-rp7sOuVE1hmg4VgBJMnSvtDbSzctL42X7y1yv8ukuu40Sli+H5FT0Zbn351EfjJgQWg/AlXA6+reVXkXje8JzQ==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/dom": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/top-app-bar": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-14.0.0.tgz", - "integrity": "sha512-uPej5vHgZnlSB1+koiA9FnabXrHh3O/Npl2ifpUgDVwHDSOxKvLp2LNjyCO71co1QLNnNHIU0xXv3B97Gb0rpA==", - "dependencies": { - "@material/animation": "^14.0.0", - "@material/base": "^14.0.0", - "@material/elevation": "^14.0.0", - "@material/ripple": "^14.0.0", - "@material/rtl": "^14.0.0", - "@material/shape": "^14.0.0", - "@material/theme": "^14.0.0", - "@material/typography": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/touch-target": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-14.0.0.tgz", - "integrity": "sha512-o3kvxmS4HkmZoQTvtzLJrqSG+ezYXkyINm3Uiwio1PTg67pDgK5FRwInkz0VNaWPcw9+5jqjUQGjuZMtjQMq8w==", - "dependencies": { - "@material/base": "^14.0.0", - "@material/feature-targeting": "^14.0.0", - "@material/rtl": "^14.0.0", - "tslib": "^2.1.0" - } - }, - "node_modules/material-components-web/node_modules/@material/typography": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-14.0.0.tgz", - "integrity": "sha512-/QtHBYiTR+TPMryM/CT386B2WlAQf/Ae32V324Z7P40gHLKY/YBXx7FDutAWZFeOerq/two4Nd2aAHBcMM2wMw==", - "dependencies": { - "@material/feature-targeting": "^14.0.0", - "@material/theme": "^14.0.0", - "tslib": "^2.1.0" - } - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -10291,28 +8960,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -10346,18 +8993,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/node-gyp/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -13303,358 +11938,6 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", diff --git a/frontend/package.json b/frontend/package.json index 49a2787..e551d79 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,7 +23,6 @@ "@angular/platform-browser": "^17.3.6", "@angular/platform-browser-dynamic": "^17.3.6", "@angular/router": "^17.3.6", - "material-components-web": "^14.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.14.3" diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index 946ae1f..7084e4e 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -54,6 +54,9 @@ import {WidgetsBarComponent} from './eventpage/widgets-section/widgets-bar/widge import {MatTabsModule} from "@angular/material/tabs"; import { ParticipantsSidenavComponent } from './eventpage/participants-sidenav/participants-sidenav.component'; import { ParticipantCardComponent } from './eventpage/participants-sidenav/participant-card/participant-card.component'; +import { ShoppingListWidgetComponent } from './widgets/shopping-list-widget/shopping-list-widget.component'; +import { DefaultShoppingPageComponent } from './widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component'; +import { AddEntryDialogComponent } from './widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component'; import { MatDatepicker, MatDatepickerActions, MatDatepickerApply, MatDatepickerCancel, MatDatepickerToggle, @@ -66,6 +69,9 @@ import { CreateEditExpenseEntryDialogComponent } from './widgets/expense-split-w import {MatSelectModule} from "@angular/material/select"; import { ExpenseEntryCardComponent } from './widgets/expense-split-widget/expense-entry-card/expense-entry-card.component'; import { DeleteEntryConfirmationDialogComponent } from './widgets/expense-split-widget/delete-entry-confirmation-dialog/delete-entry-confirmation-dialog.component'; +import { EditEntryDialogComponent } from './widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component'; +import { ShoppingListEntryListItemComponent } from './widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component'; +import {MatCheckboxModule} from "@angular/material/checkbox"; registerLocaleData(localeDe); @@ -118,6 +124,11 @@ function loadMapApi(httpClient: HttpClient) { CreateEditExpenseEntryDialogComponent, ExpenseEntryCardComponent, DeleteEntryConfirmationDialogComponent, + ShoppingListWidgetComponent, + DefaultShoppingPageComponent, + AddEntryDialogComponent, + EditEntryDialogComponent, + ShoppingListEntryListItemComponent, ], imports: [ BrowserModule, @@ -160,7 +171,8 @@ function loadMapApi(httpClient: HttpClient) { MatDatepickerApply, ReactiveFormsModule, MatNativeDateModule, - MatSelectModule + MatSelectModule, + MatCheckboxModule ], providers: [ { diff --git a/frontend/src/app/eventcreation/event-creation.component.scss b/frontend/src/app/eventcreation/event-creation.component.scss index 4133887..0200274 100644 --- a/frontend/src/app/eventcreation/event-creation.component.scss +++ b/frontend/src/app/eventcreation/event-creation.component.scss @@ -12,6 +12,10 @@ p { font-weight: var(--font-weight-subtitle); } +mat-divider { + margin: 0 var(--size-24); +} + .cdk-overlay-container { padding: 25px; } diff --git a/frontend/src/app/eventcreation/event-creation.component.ts b/frontend/src/app/eventcreation/event-creation.component.ts index e1efbbe..3ea105e 100644 --- a/frontend/src/app/eventcreation/event-creation.component.ts +++ b/frontend/src/app/eventcreation/event-creation.component.ts @@ -83,7 +83,6 @@ export class EventCreationComponent implements OnInit { } else { date.setUTCHours(0, 0, 0, 0); } - console.log(date) this.form.patchValue({ date: date }); diff --git a/frontend/src/app/eventpage/widgets-section/widget-container/widget-container.component.html b/frontend/src/app/eventpage/widgets-section/widget-container/widget-container.component.html index a2abee8..c9b27c9 100644 --- a/frontend/src/app/eventpage/widgets-section/widget-container/widget-container.component.html +++ b/frontend/src/app/eventpage/widgets-section/widget-container/widget-container.component.html @@ -6,6 +6,13 @@ (onWidgetUpdated)="onWidgetUpdated.emit($event)" > } + @case (WidgetType.SHOPPING_LIST) { + + } @case (WidgetType.EXPENSE_SPLIT) { Einkaufseintrag hinzufügen + +
+

Beschreibung*

+ + + +

Menge

+ + + +
+
+ + + + + + diff --git a/frontend/src/app/widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component.scss b/frontend/src/app/widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component.scss new file mode 100644 index 0000000..385be78 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component.scss @@ -0,0 +1,21 @@ +.create-eintrag-container { + display: grid; + grid: auto / 1fr 2fr; + gap: 12px; +} + +@media (max-width: 600px) { + .create-eintrag-container { + display: flex; + flex-direction: column; + gap: 0; + } +} + +mat-form-field { + width: 100%; +} + +mat-divider { + margin: 0 var(--size-24); +} diff --git a/frontend/src/app/widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component.spec.ts b/frontend/src/app/widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component.spec.ts new file mode 100644 index 0000000..dd85d72 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AddEntryDialogComponent } from './add-entry-dialog.component'; + +describe('AddEintragDialogComponent', () => { + let component: AddEntryDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [AddEntryDialogComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AddEntryDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component.ts b/frontend/src/app/widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component.ts new file mode 100644 index 0000000..8df47dd --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/add-entry-dialog/add-entry-dialog.component.ts @@ -0,0 +1,36 @@ +import {Component, OnInit} from '@angular/core'; +import {MatDialogRef} from "@angular/material/dialog"; +import {EntryCommand} from "../../../../model/shoppinglist-widget"; +import {FormBuilder, FormGroup, Validators} from "@angular/forms"; + +@Component({ + selector: 'app-add-eintrag-dialog', + templateUrl: './add-entry-dialog.component.html', + styleUrl: './add-entry-dialog.component.scss' +}) +export class AddEntryDialogComponent implements OnInit { + form!: FormGroup; + + constructor( + private fb: FormBuilder, + private dialogRef: MatDialogRef, + ) { + } + + ngOnInit(): void { + this.form = this.fb.group({ + description: ['', Validators.required], + amount: [null] + }); + } + + closeDialog() { + if (this.form.valid) { + const addCommand: EntryCommand = { + description: this.form.value.description, + amount: this.form.value.amount + } + this.dialogRef.close(addCommand); + } + } +} diff --git a/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.html b/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.html new file mode 100644 index 0000000..08cb911 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.html @@ -0,0 +1,16 @@ +
+ no Shopping-List Bild +

Kein Einkaufseintrag angelegt

+

+ Lege einen Einkaufseintrag über dieses + + an +

+
diff --git a/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.scss b/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.scss new file mode 100644 index 0000000..40df952 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.scss @@ -0,0 +1,13 @@ +.page-container { + display: flex; + flex-direction: column; + align-items: center; + + p { + margin-top: 0; + } +} + +img { + margin-top: var(--size-12); +} diff --git a/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.spec.ts b/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.spec.ts new file mode 100644 index 0000000..2faf4b4 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DefaultShoppingPageComponent } from './default-shopping-page.component'; + +describe('DefaultPageComponent', () => { + let component: DefaultShoppingPageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [DefaultShoppingPageComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DefaultShoppingPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.ts b/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.ts new file mode 100644 index 0000000..33d2715 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/default-shopping-page/default-shopping-page.component.ts @@ -0,0 +1,13 @@ +import {Component, EventEmitter, Output} from '@angular/core'; + +@Component({ + selector: 'app-default-shopping-page', + templateUrl: './default-shopping-page.component.html', + styleUrl: './default-shopping-page.component.scss' +}) +export class DefaultShoppingPageComponent { + + @Output() + onCreateEntryClicked = new EventEmitter(); + +} diff --git a/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.html b/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.html new file mode 100644 index 0000000..d037335 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.html @@ -0,0 +1,26 @@ +

Einkaufseintrag bearbeiten

+ +
+

Beschreibung*

+ + + +

Menge

+ + + +
+
+ + + + + + diff --git a/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.scss b/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.scss new file mode 100644 index 0000000..385be78 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.scss @@ -0,0 +1,21 @@ +.create-eintrag-container { + display: grid; + grid: auto / 1fr 2fr; + gap: 12px; +} + +@media (max-width: 600px) { + .create-eintrag-container { + display: flex; + flex-direction: column; + gap: 0; + } +} + +mat-form-field { + width: 100%; +} + +mat-divider { + margin: 0 var(--size-24); +} diff --git a/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.spec.ts b/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.spec.ts new file mode 100644 index 0000000..a5b3646 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditEntryDialogComponent } from './edit-entry-dialog.component'; + +describe('EditEintragDialogComponent', () => { + let component: EditEntryDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [EditEntryDialogComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(EditEntryDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.ts b/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.ts new file mode 100644 index 0000000..48edc0f --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/edit-entry-dialog/edit-entry-dialog.component.ts @@ -0,0 +1,40 @@ +import {Component, Inject, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from "@angular/forms"; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {Entry, EntryCommand} from "../../../../model/shoppinglist-widget"; + +@Component({ + selector: 'app-edit-eintrag-dialog', + templateUrl: './edit-entry-dialog.component.html', + styleUrl: './edit-entry-dialog.component.scss' +}) +export class EditEntryDialogComponent implements OnInit{ + form!: FormGroup; + entry: Entry; + + constructor( + private fb: FormBuilder, + private dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: { entry:Entry} + ) { + this.entry = data.entry + } + + ngOnInit(): void { + this.form = this.fb.group({ + description: [this.entry.description, Validators.required], + amount: [this.entry.amount] + }); + } + + closeDialog() { + if(this.form.valid) { + const updateCommand: EntryCommand = { + description: this.form.value.description, + amount: this.form.value.amount + }; + this.dialogRef.close(updateCommand); + } + } + +} diff --git a/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.html b/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.html new file mode 100644 index 0000000..68a1345 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.html @@ -0,0 +1,26 @@ + + +

{{ item.description }}

+

{{ item.amount }}

+ @if (item.buyerId) { +

+ person + {{ buyer?.firstName }} {{ buyer?.lastName }} +

+ } + + + + + + +
+
diff --git a/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.scss b/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.scss new file mode 100644 index 0000000..6e05367 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.scss @@ -0,0 +1,59 @@ +.einkaufliste-eintrag-card { + display: flex; + padding: 0; + margin-right: var(--size-10); + + &-content { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-grow: 1; + text-align: center; + align-items: center; + gap: var(--size-10); + width: 100%; + padding: 0 0 0 var(--size-12); + + p { + margin: 0; + text-align: left; + } + + &-buyerProfile { + display: flex; + align-items: center; + } + } +} + +einkaufliste-eintrag-card-content-buyerProfile { + +} + +@media (max-width: 600px) { + .einkaufliste-eintrag-card-content { + display: flex; + flex-direction: column; + align-items: flex-start; + + p { + width: 100%; + } + + &-buyerProfile { + display: flex; + align-items: center; + width: 100%; + } + } + + .einkaufliste-eintrag-card { + padding: var(--size-10) 0; + + button { + position: absolute; + top: var(--size-10); + right: var(--size-10); + } + } +} diff --git a/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.spec.ts b/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.spec.ts new file mode 100644 index 0000000..022fb9c --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShoppingListEntryListItemComponent } from './shopping-list-entry-list-item.component'; + +describe('EinkauflisteEintragListItemComponent', () => { + let component: ShoppingListEntryListItemComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ShoppingListEntryListItemComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ShoppingListEntryListItemComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.ts b/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.ts new file mode 100644 index 0000000..5e5fab3 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/shopping-list-entry-list-item/shopping-list-entry-list-item.component.ts @@ -0,0 +1,24 @@ +import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Entry} from "../../../../model/shoppinglist-widget"; +import {Event} from "../../../../model/event"; +import {SimpleUser} from "../../../../model/user"; + +@Component({ + selector: 'app-einkaufliste-eintrag-list-item', + templateUrl: './shopping-list-entry-list-item.component.html', + styleUrl: './shopping-list-entry-list-item.component.scss' +}) +export class ShoppingListEntryListItemComponent { + @Input() item!: Entry; + @Input() eventData!: Event; + @Output() onEdit = new EventEmitter(); + @Output() onDelete = new EventEmitter(); + + get buyer(): SimpleUser | undefined { + if (!this.item.buyerId) { + return undefined; + } + return this.eventData.participants.find(p => p.id === this.item.buyerId); + } + +} diff --git a/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.html b/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.html new file mode 100644 index 0000000..634b412 --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.html @@ -0,0 +1,35 @@ +
+ +
    + @for (item of entries; track item.id) { +
  • + + +
  • + } +
+
+ + + + + + + diff --git a/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.scss b/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.scss new file mode 100644 index 0000000..bdbc32d --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.scss @@ -0,0 +1,33 @@ +.einkaufliste-eintrag-addButton { + width: calc(100% - 20px); + box-sizing: border-box; + margin: var(--size-10); + font-size: var(--font-size-standard); +} + +button { + border-radius: 12px; +} + +.einkaufliste-eintrag-liste { + display: flex; + flex-direction: column; + gap: var(--size-10); + list-style: none; + padding: 0; + margin-left: var(--size-10); +} + +.einkaufliste-eintrag-item { + display: flex; + flex-direction: row; + align-items: center; +} + +.entry-item { + width: calc(100% - 20px); +} + +.entry-check { + margin-right: 5px; +} diff --git a/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.spec.ts b/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.spec.ts new file mode 100644 index 0000000..162914f --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShoppingListWidgetComponent } from './shopping-list-widget.component'; + +describe('EinkaufslisteWidgetComponent', () => { + let component: ShoppingListWidgetComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ShoppingListWidgetComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ShoppingListWidgetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.ts b/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.ts new file mode 100644 index 0000000..03d2abe --- /dev/null +++ b/frontend/src/app/widgets/shopping-list-widget/shopping-list-widget.component.ts @@ -0,0 +1,120 @@ +import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {BaseWidget} from "../../../model/common-widget"; +import {Entry, EntryCommand, EntryCheckCommand, ShoppingWidget} from "../../../model/shoppinglist-widget"; +import {AddEntryDialogComponent} from "./add-entry-dialog/add-entry-dialog.component"; +import {MatDialog} from "@angular/material/dialog"; +import {EinkaufslisteWidgetService} from "../../../services/widgets/einkaufsliste-widget.service"; +import {MatSnackBar} from "@angular/material/snack-bar"; +import {MatCheckboxChange} from "@angular/material/checkbox"; +import {Event} from "../../../model/event"; +import {EditEntryDialogComponent} from "./edit-entry-dialog/edit-entry-dialog.component"; + +@Component({ + selector: 'app-einkaufsliste-widget', + templateUrl: './shopping-list-widget.component.html', + styleUrl: './shopping-list-widget.component.scss' +}) +export class ShoppingListWidgetComponent { + @Input() + eventData!: Event; + + @Input({transform: (value: BaseWidget): ShoppingWidget => value as ShoppingWidget}) + widget!: ShoppingWidget; + + @Output() + onWidgetUpdated = new EventEmitter(); + + constructor( + private dialog: MatDialog, + private service: EinkaufslisteWidgetService, + private _snackbar: MatSnackBar + ) { + } + + openAddEntryDialog() { + const dialogRef = this.dialog.open(AddEntryDialogComponent, {width: "400px"}); + dialogRef.afterClosed().subscribe(addCommand => { + if (addCommand) { + this.addEntry(addCommand); + } + }); + } + + addEntry(addCommand: EntryCommand) { + if (addCommand) { + this.service.addEntry(this.eventData.id, this.widget.id, addCommand).subscribe({ + next: response => { + this.onWidgetUpdated.emit(response); + this.showMessage("Eintrag angelegt") + }, + error: error => { + console.error('Error:', error); + this.showMessage("Fehler beim Anlegen", "error") + } + }); + } + } + + openEditEntryDialog(entry: Entry) { + const dialogRef = this.dialog.open(EditEntryDialogComponent, { + data: {entry: entry}, + width: "400px" + }); + dialogRef.afterClosed().subscribe(updateCommand => { + if (updateCommand) { + this.service.editEntry(this.eventData.id, this.widget.id, entry.id, updateCommand).subscribe({ + next: response => { + this.onWidgetUpdated.emit(response); + this.showMessage("Eintrag bearbeitet") + }, + error: error => { + console.error('Error:', error); + this.showMessage("Fehler beim Bearbeiten", "error") + } + }); + } + }); + } + + onCheckboxChange(item: Entry, event: MatCheckboxChange) { + const checkCommand: EntryCheckCommand = { + checked: event.checked + }; + this.service.checkEntry(this.eventData.id, this.widget.id, item, checkCommand).subscribe({ + next: response => { + this.onWidgetUpdated.emit(response); + }, + error: error => { + console.error('Error:', error); + } + }); + } + + deleteEntry(entry: Entry) { + this.service.deleteEntry(this.eventData.id, this.widget.id, entry.id).subscribe({ + next: response => { + this.onWidgetUpdated.emit(response); + this.showMessage("Eintrag gelöscht") + }, + error: error => { + console.error('Error:', error); + this.showMessage("Fehler beim Löschen", "error") + } + }); + } + + get entriesCount(): number { + return this.widget.entries.length; + } + + get entries() { + return this.widget.entries; + } + + private showMessage(messageToShow: string, snackBarClass: string = "successfull") { + this._snackbar.open(messageToShow, 'schließen', { + duration: 5000, + panelClass: snackBarClass + }); + } +} diff --git a/frontend/src/assets/noShoppingList.svg b/frontend/src/assets/noShoppingList.svg new file mode 100644 index 0000000..affe491 --- /dev/null +++ b/frontend/src/assets/noShoppingList.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/model/shoppinglist-widget.ts b/frontend/src/model/shoppinglist-widget.ts new file mode 100644 index 0000000..4fc6517 --- /dev/null +++ b/frontend/src/model/shoppinglist-widget.ts @@ -0,0 +1,23 @@ +import {BaseWidget} from "./common-widget"; + +export type ShoppingWidget = BaseWidget & { + entries: Entry[]; +} + +export type Entry = { + id: string; + checked: boolean; + creatorId: string; + description: string; + amount: string; + buyerId: string; +} + +export type EntryCommand = { + description: string; + amount: string; +} + +export type EntryCheckCommand = { + checked: boolean; +} diff --git a/frontend/src/services/widgets/einkaufsliste-widget.service.ts b/frontend/src/services/widgets/einkaufsliste-widget.service.ts new file mode 100644 index 0000000..406e1d5 --- /dev/null +++ b/frontend/src/services/widgets/einkaufsliste-widget.service.ts @@ -0,0 +1,30 @@ +import {Injectable} from '@angular/core'; +import {HttpClient} from "@angular/common/http"; +import {Observable} from "rxjs"; +import {environment} from "../../environment/environment"; +import {Entry, EntryCheckCommand, EntryCommand, ShoppingWidget} from "../../model/shoppinglist-widget"; + +@Injectable({ + providedIn: 'root' +}) +export class EinkaufslisteWidgetService { + + constructor(private http: HttpClient) { + } + + addEntry(eventId: string, widgetId: string, entryCommand: EntryCommand): Observable { + return this.http.post(`${environment.api}/event/${eventId}/widgets/shopping-list/${widgetId}/entries`, entryCommand, {withCredentials: true}); + } + + editEntry(eventId: string, widgetId: string, entryId: string, entry: EntryCommand) { + return this.http.put(`${environment.api}/event/${eventId}/widgets/shopping-list/${widgetId}/entries/update/${entryId}`, entry, {withCredentials: true}); + } + + checkEntry(eventId: string, widgetId: string, entry: Entry, value: EntryCheckCommand) { + return this.http.put(`${environment.api}/event/${eventId}/widgets/shopping-list/${widgetId}/entries/${entry.id}`, value, {withCredentials: true}); + } + + deleteEntry(eventId: string, widgetId: string, entryId: string){ + return this.http.delete(`${environment.api}/event/${eventId}/widgets/shopping-list/${widgetId}/entries/${entryId}`, {withCredentials: true}); + } +} diff --git a/frontend/src/styles/variables/size.scss b/frontend/src/styles/variables/size.scss index 039a9a0..2e93b22 100644 --- a/frontend/src/styles/variables/size.scss +++ b/frontend/src/styles/variables/size.scss @@ -6,6 +6,7 @@ //--------------------------------------------------// :root { + --size-10: 10px; --size-12: 12px; --size-24: 24px; }