diff --git a/src/api/admin.ts b/src/api/admin.ts index 8cc92fcf..df2edbf7 100644 --- a/src/api/admin.ts +++ b/src/api/admin.ts @@ -1,6 +1,6 @@ -import type { NewLabelTypes, UserRegistrationProps } from '@/types/admin' +import type { NewLabelTypes, UserRegistrationApiProps, UserUpdateValue } from '@/types/admin' import type { LabelDataTypes } from '@/types/common' -import { axiosInstance } from '@/utils/axios' +import { axiosInstance, formDataAxiosInstance } from '@/utils/axios' export const deleteLabelAdmin = async (id: number) => { const response = await axiosInstance.delete(`/api/managements/labels/${id}`) @@ -25,7 +25,27 @@ export const deleteCategoryAdmin = async (id: number) => { return response.data } -export const addMemberAdmin = async (memberData: UserRegistrationProps) => { +export const addMemberAdmin = async (memberData: UserRegistrationApiProps) => { const response = await axiosInstance.post('/api/managements/members', memberData) return response.data } + +export const getDepartmentsAdmin = async () => { + const response = await axiosInstance.get('/api/managements/departments') + return response.data +} + +export const addMemberAdminByCsv = async (formdata: FormData) => { + const response = await formDataAxiosInstance.post('/api/managements/members/upload', formdata) + return response.data +} + +export const getMemberDetailAdmin = async (id: string) => { + const response = await axiosInstance.get(`api/managements/members/${id}/details`) + return response.data +} + +export const updateMemberAdmin = async (id: string, data: UserUpdateValue) => { + const response = await axiosInstance.post(`api/managements/members/${id}`, data) + return response.data +} diff --git a/src/api/user.ts b/src/api/user.ts index cd736d9a..8bcfa9f7 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -77,3 +77,8 @@ export const patchTaskRequest = async (taskId: string, formdata: FormData) => { const response = await formDataAxiosInstance.patch(`/api/tasks/${taskId}`, formdata) return response.data } + +export const cancelTaskUser = async (taskId: number) => { + const response = await axiosInstance.patch(`/api/tasks/${taskId}/cancel`) + return response.data +} diff --git a/src/components/common/FormCheckbox.vue b/src/components/common/FormCheckbox.vue index ec71c773..081663a1 100644 --- a/src/components/common/FormCheckbox.vue +++ b/src/components/common/FormCheckbox.vue @@ -2,8 +2,11 @@

{{ labelName }}

+ @click="!isDisabled && updateValue()" + :class="[ + 'w-fit flex gap-2 items-center', + { 'cursor-pointer': !isDisabled, 'cursor-not-allowed': isDisabled } + ]"> import { checkBoxIcon } from '@/constants/iconPath' import type { FormCheckboxProps } from '@/types/common' +import { watch } from 'vue' import CommonIcons from './CommonIcons.vue' -const { labelName, checkButtonName, isChecked } = defineProps() +const { labelName, checkButtonName, isChecked, isDisabled } = defineProps() const emit = defineEmits(['update:modelValue']) const updateValue = () => { emit('update:modelValue', !isChecked) } + +watch( + () => isDisabled, + newVal => { + if (newVal) { + emit('update:modelValue', false) + } + } +) diff --git a/src/components/member-management/MemberManagementAddByCsv.vue b/src/components/member-management/MemberManagementAddByCsv.vue new file mode 100644 index 00000000..fc25fadd --- /dev/null +++ b/src/components/member-management/MemberManagementAddByCsv.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/components/member-management/MemberManagementList.vue b/src/components/member-management/MemberManagementList.vue index 18e2e250..bda06767 100644 --- a/src/components/member-management/MemberManagementList.vue +++ b/src/components/member-management/MemberManagementList.vue @@ -22,22 +22,21 @@ diff --git a/src/components/user-manage/DepartmentDropDown.vue b/src/components/user-manage/DepartmentDropDown.vue new file mode 100644 index 00000000..61bc38f9 --- /dev/null +++ b/src/components/user-manage/DepartmentDropDown.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/components/user-manage/UserRegistration.vue b/src/components/user-manage/UserRegistration.vue index ead5d1a8..2b01daf1 100644 --- a/src/components/user-manage/UserRegistration.vue +++ b/src/components/user-manage/UserRegistration.vue @@ -14,25 +14,31 @@ v-model="userRegistrationForm.nickname" :placeholderText="'회원의 아이디를 입력해주세요'" :labelName="'아이디'" /> - +
+ + +
- + import { addMemberAdmin } from '@/api/admin' -import { INITIAL_USER_REGISTRATION, RoleKeys } from '@/constants/admin' -import { ref } from 'vue' +import { INITIAL_USER_REGISTRATION, RoleKeys, RoleTypeMapping } from '@/constants/admin' +import { computed, onMounted, ref } from 'vue' import { useRouter } from 'vue-router' import FormButtonContainer from '../common/FormButtonContainer.vue' import FormCheckbox from '../common/FormCheckbox.vue' import ModalView from '../ModalView.vue' import RequestTaskDropdown from '../request-task/RequestTaskDropdown.vue' import RequestTaskInput from '../request-task/RequestTaskInput.vue' +import DepartmentDropDown from './DepartmentDropDown.vue' +const router = useRouter() const isModalVisible = ref(false) const userRegistrationForm = ref(INITIAL_USER_REGISTRATION) +const isManager = computed(() => userRegistrationForm.value.role === '담당자') -const router = useRouter() +onMounted(async () => { + userRegistrationForm.value = { ...INITIAL_USER_REGISTRATION } +}) const handleCancel = () => { - userRegistrationForm.value = { ...INITIAL_USER_REGISTRATION } isModalVisible.value = false router.back() } const handleSubmit = async () => { - const formData = { ...userRegistrationForm.value, role: 'ROLE_USER', departmentId: 1 } + const formData = { + ...userRegistrationForm.value, + isReviewer: isManager.value ? userRegistrationForm.value.isReviewer : false, + role: RoleTypeMapping[userRegistrationForm.value.role], + email: userRegistrationForm.value.nickname + userRegistrationForm.value.email + } await addMemberAdmin(formData) isModalVisible.value = true } diff --git a/src/components/user-manage/UserUpdate.vue b/src/components/user-manage/UserUpdate.vue index a76881f6..165f7c2c 100644 --- a/src/components/user-manage/UserUpdate.vue +++ b/src/components/user-manage/UserUpdate.vue @@ -15,25 +15,32 @@ :placeholderText="'회원의 아이디를 입력해주세요'" :isEdit="true" :labelName="'아이디'" /> - +
+ + +
- + diff --git a/src/constants/admin.ts b/src/constants/admin.ts index da6707c2..aefb085c 100644 --- a/src/constants/admin.ts +++ b/src/constants/admin.ts @@ -48,13 +48,13 @@ export const CATEGORY_FORM: CategoryForm = { } export const INITIAL_USER_REGISTRATION: UserRegistrationProps = { - name: '조철득', - email: 'choiron@gmail.com', - nickname: 'iron.ch', + name: '', + email: '', + nickname: '', isReviewer: false, + role: '사용자', departmentId: 1, - role: 'ROLE_USER', - departmentRole: 'FE' + departmentRole: '' } export const RoleTypeMapping: { [key in RoleTypes]: RoleTypesEnum } = { @@ -63,4 +63,10 @@ export const RoleTypeMapping: { [key in RoleTypes]: RoleTypesEnum } = { 관리자: 'ROLE_ADMIN' } +export const RoleMapping: { [key in RoleTypesEnum]: RoleTypes } = { + ROLE_USER: '사용자', + ROLE_MANAGER: '담당자', + ROLE_ADMIN: '관리자' +} + export const RoleKeys: RoleTypes[] = Object.keys(RoleTypeMapping) as RoleTypes[] diff --git a/src/types/admin.ts b/src/types/admin.ts index 857a0535..b97e4c3a 100644 --- a/src/types/admin.ts +++ b/src/types/admin.ts @@ -38,10 +38,15 @@ export interface UserRegistrationProps { nickname: string isReviewer: boolean departmentId: number - role: string + role: RoleTypes departmentRole: string } +export interface UserInfoForAdmin extends UserRegistrationProps { + profileImageUrl: string + departmentName: string +} + export type RoleTypes = '관리자' | '사용자' | '담당자' export type RoleTypesEnum = 'ROLE_ADMIN' | 'ROLE_USER' | 'ROLE_MANAGER' @@ -95,3 +100,26 @@ export interface ApiLogsResponse { isFirst: boolean isLast: boolean } + +export interface DepartmentType { + departmentId: number + name: string +} + +export interface UserRegistrationApiProps { + name: string + email: string + nickname: string + isReviewer: boolean + departmentId: number + role: RoleTypesEnum + departmentRole: string +} + +export interface UserUpdateValue { + name: string + isReviewer: boolean + departmentId: number + role: RoleTypesEnum + departmentRole: string +} diff --git a/src/types/common.ts b/src/types/common.ts index f83de8c4..be4c829f 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -70,9 +70,10 @@ export interface FormButtonProps { } export interface FormCheckboxProps { - labelName?: string checkButtonName: string isChecked: boolean + labelName?: string + isDisabled?: boolean } export interface ColorSelectProps { diff --git a/src/types/user.ts b/src/types/user.ts index 8dea123a..d298ec61 100644 --- a/src/types/user.ts +++ b/src/types/user.ts @@ -20,7 +20,6 @@ export interface RequestTaskDropdownProps { labelName: string modelValue: string isLabel?: boolean - disabled?: boolean } export interface RequestTaskInputProps { @@ -30,6 +29,7 @@ export interface RequestTaskInputProps { isNotRequired?: boolean isEdit?: boolean isInvalidate?: string + isDisbled?: boolean } export interface RequestTaskFileInputProps { diff --git a/src/views/MemberManagement.vue b/src/views/MemberManagement.vue index b119f97d..8b33d3dd 100644 --- a/src/views/MemberManagement.vue +++ b/src/views/MemberManagement.vue @@ -2,14 +2,7 @@