From 80f9b8b062c49c67589916d8759b55e676437dfa Mon Sep 17 00:00:00 2001 From: Steven Weathers Date: Mon, 8 Apr 2024 10:39:13 -0400 Subject: [PATCH] Redesign crud tables (#566) * Redesign crud tables * Add testid back to create button for table nav * Update organization and team pages to use new tablenav * Finish admin pages table updates * Add TableFooter with pagination * Update admin tests to reflect new table layouts * Move some svelte components from global folder * Abstract table crud actions and replace text buttons with icons --- e2e/tests/admin/alerts.spec.ts | 2 +- e2e/tests/admin/apikeys.spec.ts | 2 +- e2e/tests/admin/organizations.spec.ts | 2 +- e2e/tests/admin/poker-games.spec.ts | 2 +- e2e/tests/admin/team.spec.ts | 4 +- e2e/tests/admin/teams.spec.ts | 2 +- e2e/tests/admin/users.spec.ts | 4 +- e2e/tests/teams.spec.ts | 24 +- .../{global => }/AdminPageLayout.svelte | 4 +- .../components/{global => }/PageLayout.svelte | 0 ui/src/components/global/table/HeadCol.svelte | 16 - ui/src/components/global/table/Table.svelte | 19 - .../components/global/table/TableRow.svelte | 10 - ui/src/components/icons/EyeIcon.svelte | 18 + ui/src/components/table/CrudActions.svelte | 44 ++ ui/src/components/table/HeadCol.svelte | 13 + .../{global => }/table/RowCol.svelte | 4 +- ui/src/components/table/Table.svelte | 10 + ui/src/components/table/TableContainer.svelte | 5 + ui/src/components/table/TableFooter.svelte | 123 ++++ ui/src/components/table/TableNav.svelte | 90 +++ ui/src/components/table/TableRow.svelte | 9 + ui/src/components/team/UsersList.svelte | 227 ++++---- .../timezone-picker/Picker.svelte | 2 +- .../{global => }/timezone-picker/timezones.js | 0 .../{global => }/timezone-picker/utils.js | 0 ui/src/pages/admin/Admin.svelte | 2 +- ui/src/pages/admin/Alerts.svelte | 67 +-- ui/src/pages/admin/ApiKeys.svelte | 86 ++- ui/src/pages/admin/Department.svelte | 51 +- ui/src/pages/admin/Organization.svelte | 77 +-- ui/src/pages/admin/Organizations.svelte | 44 +- ui/src/pages/admin/PokerGame.svelte | 209 ++++--- ui/src/pages/admin/PokerGames.svelte | 73 ++- ui/src/pages/admin/Retro.svelte | 207 ++++--- ui/src/pages/admin/Retros.svelte | 70 +-- ui/src/pages/admin/Storyboard.svelte | 199 +++---- ui/src/pages/admin/Storyboards.svelte | 70 +-- ui/src/pages/admin/Subscription.svelte | 145 +++-- ui/src/pages/admin/Subscriptions.svelte | 79 +-- ui/src/pages/admin/Team.svelte | 540 +++++++++--------- ui/src/pages/admin/Teams.svelte | 44 +- ui/src/pages/admin/User.svelte | 143 ++--- ui/src/pages/admin/Users.svelte | 149 ++--- ui/src/pages/poker/PokerGame.svelte | 2 +- ui/src/pages/poker/PokerGames.svelte | 2 +- ui/src/pages/retro/Retro.svelte | 2 +- ui/src/pages/retro/Retros.svelte | 2 +- ui/src/pages/storyboard/Storyboard.svelte | 2 +- ui/src/pages/storyboard/Storyboards.svelte | 2 +- ui/src/pages/support/PrivacyPolicy.svelte | 2 +- ui/src/pages/support/Support.svelte | 2 +- ui/src/pages/support/TermsConditions.svelte | 2 +- ui/src/pages/team/Department.svelte | 55 +- ui/src/pages/team/Organization.svelte | 96 ++-- ui/src/pages/team/Team.svelte | 282 +++++---- ui/src/pages/team/TeamCheckin.svelte | 4 +- ui/src/pages/team/Teams.svelte | 199 +++---- ui/src/pages/user/Register.svelte | 2 +- ui/src/pages/user/ResetPassword.svelte | 2 +- ui/src/pages/user/UserProfile.svelte | 2 +- ui/src/pages/user/VerifyAccount.svelte | 2 +- 62 files changed, 1739 insertions(+), 1814 deletions(-) rename ui/src/components/{global => }/AdminPageLayout.svelte (96%) rename ui/src/components/{global => }/PageLayout.svelte (100%) delete mode 100644 ui/src/components/global/table/HeadCol.svelte delete mode 100644 ui/src/components/global/table/Table.svelte delete mode 100644 ui/src/components/global/table/TableRow.svelte create mode 100644 ui/src/components/icons/EyeIcon.svelte create mode 100644 ui/src/components/table/CrudActions.svelte create mode 100644 ui/src/components/table/HeadCol.svelte rename ui/src/components/{global => }/table/RowCol.svelte (57%) create mode 100644 ui/src/components/table/Table.svelte create mode 100644 ui/src/components/table/TableContainer.svelte create mode 100644 ui/src/components/table/TableFooter.svelte create mode 100644 ui/src/components/table/TableNav.svelte create mode 100644 ui/src/components/table/TableRow.svelte rename ui/src/components/{global => }/timezone-picker/Picker.svelte (99%) rename ui/src/components/{global => }/timezone-picker/timezones.js (100%) rename ui/src/components/{global => }/timezone-picker/utils.js (100%) diff --git a/e2e/tests/admin/alerts.spec.ts b/e2e/tests/admin/alerts.spec.ts index a28c092f..cb2b2b01 100644 --- a/e2e/tests/admin/alerts.spec.ts +++ b/e2e/tests/admin/alerts.spec.ts @@ -45,7 +45,7 @@ test.describe("The Admin Alerts Page", () => { await ap.goto(); - const title = ap.page.locator("h1"); + const title = ap.page.locator('[data-testid="tablenav-title"]'); await expect(title).toHaveText("Alerts"); }); }); diff --git a/e2e/tests/admin/apikeys.spec.ts b/e2e/tests/admin/apikeys.spec.ts index 980631c3..ca3a190a 100644 --- a/e2e/tests/admin/apikeys.spec.ts +++ b/e2e/tests/admin/apikeys.spec.ts @@ -45,7 +45,7 @@ test.describe("The Admin API Keys Page", () => { await ap.goto(); - const title = ap.page.locator("h1"); + const title = ap.page.locator('[data-testid="tablenav-title"]'); await expect(title).toHaveText("API Keys"); }); }); diff --git a/e2e/tests/admin/organizations.spec.ts b/e2e/tests/admin/organizations.spec.ts index 54aa2fb5..095c4e82 100644 --- a/e2e/tests/admin/organizations.spec.ts +++ b/e2e/tests/admin/organizations.spec.ts @@ -45,7 +45,7 @@ test.describe("The Admin Organizations Page", () => { await ap.goto(); - const title = ap.page.locator("h1"); + const title = ap.page.locator('[data-testid="tablenav-title"]'); await expect(title).toHaveText("Organizations"); }); }); diff --git a/e2e/tests/admin/poker-games.spec.ts b/e2e/tests/admin/poker-games.spec.ts index 2fe7d513..44184503 100644 --- a/e2e/tests/admin/poker-games.spec.ts +++ b/e2e/tests/admin/poker-games.spec.ts @@ -45,7 +45,7 @@ test.describe("The Admin Poker Games Page", () => { await ap.goto(); - const title = ap.page.locator("h1"); + const title = ap.page.locator('[data-testid="tablenav-title"]'); await expect(title).toHaveText("Battles"); }); }); diff --git a/e2e/tests/admin/team.spec.ts b/e2e/tests/admin/team.spec.ts index 29cbf563..61d923c0 100644 --- a/e2e/tests/admin/team.spec.ts +++ b/e2e/tests/admin/team.spec.ts @@ -46,7 +46,9 @@ test.describe("The Admin Team Page", () => { const team = await registeredPage.createTeam(testTeamName); await ap.goto(team.id); - await expect(ap.page.locator("h1")).toContainText(testTeamName); + await expect( + ap.page.locator('[data-testid="tablenav-title"]').nth(0), + ).toContainText(testTeamName); }); }); }); diff --git a/e2e/tests/admin/teams.spec.ts b/e2e/tests/admin/teams.spec.ts index 2ed9d3a0..1975ab70 100644 --- a/e2e/tests/admin/teams.spec.ts +++ b/e2e/tests/admin/teams.spec.ts @@ -45,7 +45,7 @@ test.describe("The Admin Teams Page", () => { await ap.goto(); - const title = ap.page.locator("h1"); + const title = ap.page.locator('[data-testid="tablenav-title"]'); await expect(title).toHaveText("Teams"); }); }); diff --git a/e2e/tests/admin/users.spec.ts b/e2e/tests/admin/users.spec.ts index f6438d63..daf75802 100644 --- a/e2e/tests/admin/users.spec.ts +++ b/e2e/tests/admin/users.spec.ts @@ -45,8 +45,8 @@ test.describe("The Admin Users Page", () => { await ap.goto(); - const title = ap.page.locator("h1"); - await expect(title).toHaveText("Users"); + const title = ap.page.locator('[data-testid="tablenav-title"]'); + await expect(title).toHaveText("Registered Users"); }); }); }); diff --git a/e2e/tests/teams.spec.ts b/e2e/tests/teams.spec.ts index 3d739c96..80d0347d 100644 --- a/e2e/tests/teams.spec.ts +++ b/e2e/tests/teams.spec.ts @@ -19,10 +19,14 @@ test.describe("Teams page", () => { await teamsPage.goto(); await expect( - teamsPage.page.locator("h2", { hasText: "Organizations" }), + teamsPage.page.locator('[data-testid="tablenav-title"]', { + hasText: "Organizations", + }), ).toBeVisible(); await expect( - teamsPage.page.locator("h2", { hasText: "Teams" }), + teamsPage.page.locator('[data-testid="tablenav-title"]', { + hasText: "Teams", + }), ).toBeVisible(); }); @@ -38,13 +42,19 @@ test.describe("Teams page", () => { }); await expect( - teamsPage.page.locator("h2", { hasText: "Departments" }), + teamsPage.page.locator('[data-testid="tablenav-title"]', { + hasText: "Departments", + }), ).toBeVisible(); await expect( - teamsPage.page.locator("h2", { hasText: "Teams" }), + teamsPage.page.locator('[data-testid="tablenav-title"]', { + hasText: "Teams", + }), ).toBeVisible(); await expect( - teamsPage.page.locator("h2", { hasText: "Users" }), + teamsPage.page.locator('[data-testid="tablenav-title"]', { + hasText: "Users", + }), ).toBeVisible(); }); }); @@ -68,7 +78,9 @@ test.describe("Teams page", () => { teamsPage.page.locator("h2", { hasText: "Storyboards" }), ).toBeVisible(); await expect( - teamsPage.page.locator("h2", { hasText: "Users" }), + teamsPage.page.locator('[data-testid="tablenav-title"]', { + hasText: "Users", + }), ).toBeVisible(); }); }); diff --git a/ui/src/components/global/AdminPageLayout.svelte b/ui/src/components/AdminPageLayout.svelte similarity index 96% rename from ui/src/components/global/AdminPageLayout.svelte rename to ui/src/components/AdminPageLayout.svelte index 36db1691..fde1cf41 100644 --- a/ui/src/components/global/AdminPageLayout.svelte +++ b/ui/src/components/AdminPageLayout.svelte @@ -1,6 +1,6 @@ - -{#if type === 'default'} - - - -{:else if type === 'action'} - - - -{/if} diff --git a/ui/src/components/global/table/Table.svelte b/ui/src/components/global/table/Table.svelte deleted file mode 100644 index 77a0409b..00000000 --- a/ui/src/components/global/table/Table.svelte +++ /dev/null @@ -1,19 +0,0 @@ -
-
-
-
- - - - - -
-
-
-
-
diff --git a/ui/src/components/global/table/TableRow.svelte b/ui/src/components/global/table/TableRow.svelte deleted file mode 100644 index 79db1d20..00000000 --- a/ui/src/components/global/table/TableRow.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/ui/src/components/icons/EyeIcon.svelte b/ui/src/components/icons/EyeIcon.svelte new file mode 100644 index 00000000..e0f17de7 --- /dev/null +++ b/ui/src/components/icons/EyeIcon.svelte @@ -0,0 +1,18 @@ + + + + + + diff --git a/ui/src/components/table/CrudActions.svelte b/ui/src/components/table/CrudActions.svelte new file mode 100644 index 00000000..c2e8c04c --- /dev/null +++ b/ui/src/components/table/CrudActions.svelte @@ -0,0 +1,44 @@ + + +
+ + {#if detailsLink !== ''} + + + View Details + + {/if} + {#if editBtnEnabled} + + {/if} + {#if deleteBtnEnabled} + + {/if} +
diff --git a/ui/src/components/table/HeadCol.svelte b/ui/src/components/table/HeadCol.svelte new file mode 100644 index 00000000..51262a0d --- /dev/null +++ b/ui/src/components/table/HeadCol.svelte @@ -0,0 +1,13 @@ + + +{#if type === 'default'} + + + +{:else if type === 'action'} + + + +{/if} diff --git a/ui/src/components/global/table/RowCol.svelte b/ui/src/components/table/RowCol.svelte similarity index 57% rename from ui/src/components/global/table/RowCol.svelte rename to ui/src/components/table/RowCol.svelte index 3c44a8b9..aa08a919 100644 --- a/ui/src/components/global/table/RowCol.svelte +++ b/ui/src/components/table/RowCol.svelte @@ -3,11 +3,11 @@ {#if type === 'default'} - + {:else if type === 'action'} - + {/if} diff --git a/ui/src/components/table/Table.svelte b/ui/src/components/table/Table.svelte new file mode 100644 index 00000000..74323e73 --- /dev/null +++ b/ui/src/components/table/Table.svelte @@ -0,0 +1,10 @@ +
+ + + + + +
+
diff --git a/ui/src/components/table/TableContainer.svelte b/ui/src/components/table/TableContainer.svelte new file mode 100644 index 00000000..3039b1f6 --- /dev/null +++ b/ui/src/components/table/TableContainer.svelte @@ -0,0 +1,5 @@ +
+ +
diff --git a/ui/src/components/table/TableFooter.svelte b/ui/src/components/table/TableFooter.svelte new file mode 100644 index 00000000..de504295 --- /dev/null +++ b/ui/src/components/table/TableFooter.svelte @@ -0,0 +1,123 @@ + + + diff --git a/ui/src/components/table/TableNav.svelte b/ui/src/components/table/TableNav.svelte new file mode 100644 index 00000000..5ef5aa39 --- /dev/null +++ b/ui/src/components/table/TableNav.svelte @@ -0,0 +1,90 @@ + + +
+
+
+
+ {title} +
+ {#if searchEnabled} +
+
+
+ +
+ +
+
+ {/if} +
+
+
+ + {#if createBtnEnabled} + + {/if} +
+
diff --git a/ui/src/components/table/TableRow.svelte b/ui/src/components/table/TableRow.svelte new file mode 100644 index 00000000..55bdae3f --- /dev/null +++ b/ui/src/components/table/TableRow.svelte @@ -0,0 +1,9 @@ + + + + + diff --git a/ui/src/components/team/UsersList.svelte b/ui/src/components/team/UsersList.svelte index e68f5184..4dbe3faa 100644 --- a/ui/src/components/team/UsersList.svelte +++ b/ui/src/components/team/UsersList.svelte @@ -1,17 +1,18 @@
-
-
-

- {$LL.users()} -

-
-
-
- {#if isAdmin} - - {$LL.userAdd()} - - {/if} -
-
-
- - - - - {$LL.name()} - - - {$LL.email()} - - - {$LL.role()} - - - {$LL.actions()} - - - - {#each users as user, i} - - -
-
- -
-
-
- {user.name} - {#if user.country} -   - - {/if} + + +
+ + + {$LL.name()} + + + {$LL.email()} + + + {$LL.role()} + + + {$LL.actions()} + + + + {#each users as user, i} + + +
+
+
+
+
+ {user.name} + {#if user.country} +   + + {/if} +
+
+
+
+ + {user.email} + + +
+ {user.role}
- -
- - {user.email} - - -
- {user.role} -
-
- - {#if isAdmin} - - {$LL.edit()} - - - {$LL.remove()} - - {/if} - -
- {/each} - -
+ + + {#if isAdmin} + + {/if} + + + {/each} + + + + + {#if showAddUser} + + {/if} + + {#if showUpdateUser} + + {/if} + + {#if showRemoveUser} + + {/if}
- -{#if showAddUser} - -{/if} - -{#if showUpdateUser} - -{/if} - -{#if showRemoveUser} - -{/if} diff --git a/ui/src/components/global/timezone-picker/Picker.svelte b/ui/src/components/timezone-picker/Picker.svelte similarity index 99% rename from ui/src/components/global/timezone-picker/Picker.svelte rename to ui/src/components/timezone-picker/Picker.svelte index cfd138ab..5904af80 100644 --- a/ui/src/components/global/timezone-picker/Picker.svelte +++ b/ui/src/components/timezone-picker/Picker.svelte @@ -13,7 +13,7 @@ uid, ungroup, } from './utils'; - import TextInput from '../TextInput.svelte'; + import TextInput from '../global/TextInput.svelte'; // ***** Public API ***** diff --git a/ui/src/components/global/timezone-picker/timezones.js b/ui/src/components/timezone-picker/timezones.js similarity index 100% rename from ui/src/components/global/timezone-picker/timezones.js rename to ui/src/components/timezone-picker/timezones.js diff --git a/ui/src/components/global/timezone-picker/utils.js b/ui/src/components/timezone-picker/utils.js similarity index 100% rename from ui/src/components/global/timezone-picker/utils.js rename to ui/src/components/timezone-picker/utils.js diff --git a/ui/src/pages/admin/Admin.svelte b/ui/src/pages/admin/Admin.svelte index b01a5c3d..63613edd 100644 --- a/ui/src/pages/admin/Admin.svelte +++ b/ui/src/pages/admin/Admin.svelte @@ -1,7 +1,7 @@ diff --git a/ui/src/pages/support/Support.svelte b/ui/src/pages/support/Support.svelte index b5e4d1b8..ffb6fb31 100644 --- a/ui/src/pages/support/Support.svelte +++ b/ui/src/pages/support/Support.svelte @@ -1,5 +1,5 @@ diff --git a/ui/src/pages/team/Department.svelte b/ui/src/pages/team/Department.svelte index a47ce009..ebc0b153 100644 --- a/ui/src/pages/team/Department.svelte +++ b/ui/src/pages/team/Department.svelte @@ -1,9 +1,7 @@