diff --git a/web/src/components/common/DashboardCard.vue b/web/src/components/common/DashboardCard.vue new file mode 100644 index 0000000..b54c903 --- /dev/null +++ b/web/src/components/common/DashboardCard.vue @@ -0,0 +1,55 @@ + + + + + + + + + {{ title }} + {{ subtitle }} + + + + + + + + + {{ count ?? " " }} + + mdi-chevron-right + + + {{ countLabel }} + + + + + diff --git a/web/src/components/common/UniqueTextField.vue b/web/src/components/common/UniqueTextField.vue new file mode 100644 index 0000000..6af99ba --- /dev/null +++ b/web/src/components/common/UniqueTextField.vue @@ -0,0 +1,104 @@ + + + + mdi-progress-clock + + mdi-check-circle-outline + mdi-alert-circle-outline + + + + + diff --git a/web/src/components/layout/DefaultAppBar.vue b/web/src/components/layout/DefaultAppBar.vue index 2a9a279..ababaf5 100644 --- a/web/src/components/layout/DefaultAppBar.vue +++ b/web/src/components/layout/DefaultAppBar.vue @@ -10,31 +10,15 @@ - - - mdi-robot-outline - diff --git a/web/src/components/users/UserEmailUniqueTextField.vue b/web/src/components/users/UserEmailUniqueTextField.vue new file mode 100644 index 0000000..13eb4f4 --- /dev/null +++ b/web/src/components/users/UserEmailUniqueTextField.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/web/src/components/users/UserRoleChip.vue b/web/src/components/users/UserRoleChip.vue new file mode 100644 index 0000000..1fd2748 --- /dev/null +++ b/web/src/components/users/UserRoleChip.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/web/src/components/users/UsersDataTableServer.vue b/web/src/components/users/UsersDataTableServer.vue index 33741fb..16b648b 100644 --- a/web/src/components/users/UsersDataTableServer.vue +++ b/web/src/components/users/UsersDataTableServer.vue @@ -9,7 +9,14 @@ @click:row="rowClicked" @update:page="updatePage" > - {{ item.roles?.join(", ") }} affaafafa + + + {{ formatDate(value) }} {{ formatDate(value) }} - - diff --git a/web/src/pages/DashboardPage.vue b/web/src/pages/DashboardPage.vue index 114c46a..8b9826a 100644 --- a/web/src/pages/DashboardPage.vue +++ b/web/src/pages/DashboardPage.vue @@ -1,6 +1,8 @@ - You are a system admin + You are a system admin diff --git a/web/src/pages/administration/AdministrationDashboardPage.vue b/web/src/pages/administration/AdministrationDashboardPage.vue index 9a9dc8e..3092f8b 100644 --- a/web/src/pages/administration/AdministrationDashboardPage.vue +++ b/web/src/pages/administration/AdministrationDashboardPage.vue @@ -1,105 +1,48 @@ - - + - - - - - - mdi-account-group - - - - Users - Manage users and permissions - - - - - - - - - {{ usersCount }} - - mdi-chevron-right - - - Total Users - - + + + + - - - - - - - - mdi-cog - - - - Settings - System configuration - - - - - - - - - - - - mdi-chevron-right - - - Configure System - - + + + + @@ -110,6 +53,8 @@ import useBreadcrumbs from "@/use/use-breadcrumbs" import useUsers from "@/use/use-users" import useCurrentUser from "@/use/use-current-user" +import DashboardCard from "@/components/common/DashboardCard.vue" + const { isSystemAdmin } = useCurrentUser() const { totalCount: usersCount } = useUsers() diff --git a/web/src/pages/administration/users/UserNewPage.vue b/web/src/pages/administration/users/UserNewPage.vue index 3ee6a05..fe2bee1 100644 --- a/web/src/pages/administration/users/UserNewPage.vue +++ b/web/src/pages/administration/users/UserNewPage.vue @@ -53,114 +53,8 @@ validate-on="blur" /> - - - - - - - - - - - - - Images - - - - - - - - - - - - - - - - - - Notification Details - - - - - - >({ @@ -205,88 +98,8 @@ const userAttributes = ref>({ displayName: "", firstName: "", lastName: "", - title: null, - pilotLicense: null, - ameLicense: null, - emailNotificationsEnabled: true, }) -// Image handling -const profileImageFile = ref(null) -const signatureImageFile = ref(null) -const profileImagePreview = ref(null) -const signatureImagePreview = ref(null) - -async function handleProfileImageUpload() { - if (!profileImageFile.value) { - profileImagePreview.value = null - userAttributes.value.profileImage = null - return - } - - // Handle both array and single file - const file = Array.isArray(profileImageFile.value) - ? profileImageFile.value[0] - : profileImageFile.value - - if (!file) { - profileImagePreview.value = null - userAttributes.value.profileImage = null - return - } - - // Ensure we have a valid File object - if (!(file instanceof File)) { - console.error("Invalid file type:", file) - return - } - - try { - // Resize image to 512x512 before upload - const base64DataUrl = await resizeToStandard(file) - profileImagePreview.value = base64DataUrl - userAttributes.value.profileImage = base64DataUrl - } catch (error) { - console.error("Error resizing profile image:", error) - snack.error("Failed to process profile image") - } -} - -async function handleSignatureImageUpload() { - if (!signatureImageFile.value) { - signatureImagePreview.value = null - userAttributes.value.signatureImage = null - return - } - - // Handle both array and single file - const file = Array.isArray(signatureImageFile.value) - ? signatureImageFile.value[0] - : signatureImageFile.value - - if (!file) { - signatureImagePreview.value = null - userAttributes.value.signatureImage = null - return - } - - // Ensure we have a valid File object - if (!(file instanceof File)) { - console.error("Invalid file type:", file) - return - } - - try { - // Resize image to 512x512 before upload - const base64DataUrl = await resizeToStandard(file) - signatureImagePreview.value = base64DataUrl - userAttributes.value.signatureImage = base64DataUrl - } catch (error) { - console.error("Error resizing signature image:", error) - snack.error("Failed to process signature image") - } -} - function autoFillDependentFields(focused: boolean) { if (focused) return