diff --git a/app/Providers/JetstreamServiceProvider.php b/app/Providers/JetstreamServiceProvider.php index 4cc09c4a..bca7bbbd 100644 --- a/app/Providers/JetstreamServiceProvider.php +++ b/app/Providers/JetstreamServiceProvider.php @@ -187,6 +187,7 @@ class JetstreamServiceProvider extends ServiceProvider 'members:invite-placeholder', 'members:make-placeholder', 'members:merge-into', + 'members:delete', 'members:update', 'reports:view', 'reports:create', diff --git a/resources/js/Components/Common/Member/MemberDeleteModal.vue b/resources/js/Components/Common/Member/MemberDeleteModal.vue new file mode 100644 index 00000000..5bb28208 --- /dev/null +++ b/resources/js/Components/Common/Member/MemberDeleteModal.vue @@ -0,0 +1,150 @@ + + + + + + + Delete Member + + + + + Are you sure you want to delete {{ member.name }}? This action cannot be undone. + + + This will permanently delete: + + + + All time entries created by this member + Their project assignments + Their organization membership + + + Note: Deleting time entries will affect all reports and statistics. + + + + { + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + } + "> + + + + + + + + I understand that this will permanently delete all data related to this member + + + + + + + + + Cancel + + + + {{ isSubmitting ? 'Deleting...' : 'Delete Member' }} + + + + + + + + \ No newline at end of file diff --git a/resources/js/Components/Common/Member/MemberMoreOptionsDropdown.vue b/resources/js/Components/Common/Member/MemberMoreOptionsDropdown.vue index 2d4a2cc7..6735a40a 100644 --- a/resources/js/Components/Common/Member/MemberMoreOptionsDropdown.vue +++ b/resources/js/Components/Common/Member/MemberMoreOptionsDropdown.vue @@ -49,15 +49,6 @@ const props = defineProps<{ Edit - - - Delete - Deactivate + + + Delete + diff --git a/resources/js/Components/Common/Member/MemberTableRow.vue b/resources/js/Components/Common/Member/MemberTableRow.vue index 7355df98..976be222 100644 --- a/resources/js/Components/Common/Member/MemberTableRow.vue +++ b/resources/js/Components/Common/Member/MemberTableRow.vue @@ -8,26 +8,30 @@ import SecondaryButton from '@/packages/ui/src/Buttons/SecondaryButton.vue'; import { getCurrentOrganizationId } from '@/utils/useUser'; import { useNotificationsStore } from '@/utils/notification'; import { canInvitePlaceholderMembers } from '@/utils/permissions'; -import { useMembersStore } from '@/utils/useMembers'; import { computed, type ComputedRef, inject, ref } from 'vue'; import MemberEditModal from '@/Components/Common/Member/MemberEditModal.vue'; import MemberMergeModal from '@/Components/Common/Member/MemberMergeModal.vue'; import MemberMakePlaceholderModal from '@/Components/Common/Member/MemberMakePlaceholderModal.vue'; +import MemberDeleteModal from '@/Components/Common/Member/MemberDeleteModal.vue'; import { capitalizeFirstLetter } from '../../../utils/format'; import { formatCents } from '../../../packages/ui/src/utils/money'; +import { useMembersStore } from '@/utils/useMembers'; const props = defineProps<{ member: Member; }>(); const organization = inject>('organization'); +const memberStore = useMembersStore(); const showEditMemberModal = ref(false); const showMergeMemberModal = ref(false); const showMakeMemberPlaceholderModal = ref(false); +const showDeleteMemberModal = ref(false); function removeMember() { - useMembersStore().removeMember(props.member.id); + showDeleteMemberModal.value = true; + memberStore.fetchMembers(); } async function invitePlaceholder(id: string) { @@ -121,6 +125,9 @@ const userHasValidMailAddress = computed(() => { + diff --git a/resources/js/Components/ui/dialog/DialogContent.vue b/resources/js/Components/ui/dialog/DialogContent.vue index 993ad9b9..a02e28d3 100644 --- a/resources/js/Components/ui/dialog/DialogContent.vue +++ b/resources/js/Components/ui/dialog/DialogContent.vue @@ -30,22 +30,22 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits) - - + - diff --git a/resources/js/packages/api/src/openapi.json.client.ts b/resources/js/packages/api/src/openapi.json.client.ts index 3e0d142d..0fe4e291 100644 --- a/resources/js/packages/api/src/openapi.json.client.ts +++ b/resources/js/packages/api/src/openapi.json.client.ts @@ -2407,6 +2407,11 @@ const endpoints = makeApi([ type: 'Path', schema: z.string(), }, + { + name: 'delete_related', + type: 'Query', + schema: z.enum(['true', 'false']).optional(), + }, ], response: z.void(), errors: [ @@ -2436,6 +2441,16 @@ const endpoints = makeApi([ description: `Not found`, schema: z.object({ message: z.string() }).passthrough(), }, + { + status: 422, + description: `Validation error`, + schema: z + .object({ + message: z.string(), + errors: z.record(z.array(z.string())), + }) + .passthrough(), + }, ], }, {
+ Are you sure you want to delete {{ member.name }}? This action cannot be undone. +
+ This will permanently delete: +
+ Note: Deleting time entries will affect all reports and statistics. +