Skip to content

Commit 666f937

Browse files
committed
exchange: option api to composition api in projectsPage (and extract crudOperations method to generic one)
1 parent eb72a08 commit 666f937

File tree

9 files changed

+96
-63
lines changed

9 files changed

+96
-63
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
import { type Ref } from 'vue'
3+
import { deleteGenericEndPoint } from '@/api/api'
4+
5+
interface CrudOptions<T> {
6+
listRef: Ref<T[]>
7+
onEdit: (item: T) => void
8+
onCreate: () => void
9+
}
10+
11+
export function useCrudOperations<T extends { id: string | number }>(
12+
entityName: string,
13+
options: CrudOptions<T>,
14+
) {
15+
const { listRef, onEdit, onCreate } = options
16+
17+
async function handleCrudOperation(data: Record<string, any>) {
18+
switch (data.event) {
19+
case 'delete':
20+
await deleteGenericEndPoint(entityName, data.item.id)
21+
listRef.value = listRef.value.filter((item: T) => item.id !== data.item.id)
22+
break
23+
case 'edit':
24+
onEdit(data.item)
25+
break
26+
case 'create':
27+
onCreate()
28+
break
29+
}
30+
}
31+
32+
return {
33+
handleCrudOperation,
34+
}
35+
}

frontend/src/components/LoginForm.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
22
import { defineComponent } from 'vue'
3-
import { loginEndPoint } from '../api'
3+
import { loginEndPoint } from '../api/api'
44
55
export default defineComponent({
66
name: 'LoginForm',

frontend/src/components/ModalForm.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
</template>
2626

2727
<script lang="ts">
28-
import { patchGenericEndPoint, postGenericEndPoint } from '@/api'
28+
import { patchGenericEndPoint, postGenericEndPoint } from '@/api/api'
2929
import { defineComponent } from 'vue'
3030
3131
export default defineComponent({

frontend/src/pages/CollaboratorsPage.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</template>
1010

1111
<script lang="ts">
12-
import { getGenericEndPoint } from '@/api'
12+
import { getGenericEndPoint } from '@/api/api'
1313
import DefaultMain from '@/components/DefaultMain.vue'
1414
import List from '@/components/List.vue'
1515
import type { ICollaborators } from '@/interfaces.ts/collaborators.interface'

frontend/src/pages/HomePage.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export default defineComponent({
3636
if (!resJson.user_id) {
3737
throw new Error('não foi possível encontrar nenhum usuário com esse token')
3838
}
39-
39+
4040
this.username = resJson.username
4141
} catch (err) {
4242
console.error('Token inválido:', err)

frontend/src/pages/ProjectsPage.vue

Lines changed: 55 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<template>
22
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css" />
33
<DefaultMain :primary-text="'Projetos'" :second-text="'Organize seu trabalho em projetos'">
4-
<CreateButton :name="name" @open-modal="crudOperation" />
5-
<List :list="projectsList" @edit="crudOperation" @delete="crudOperation" />
4+
<CreateButton :name="name" @open-modal="handleCrudOperation" />
5+
<List :list="projectsList" @edit="handleCrudOperation" @delete="handleCrudOperation" />
66
<ModalForm
77
:class="{ 'is-active': showEditOrCreateModal }"
88
:inputData="projectNameModal"
@@ -16,71 +16,69 @@
1616
</template>
1717

1818
<script lang="ts">
19-
import { deleteGenericEndPoint, getGenericEndPoint } from '@/api'
19+
import { defineComponent, ref, onMounted } from 'vue'
2020
import DefaultMain from '@/components/DefaultMain.vue'
2121
import List from '@/components/List.vue'
22-
import type { IProjects } from '@/interfaces.ts/projects.interface'
23-
import { defineComponent } from 'vue'
2422
import CreateButton from '../components/CreateButton.vue'
2523
import ModalForm from '@/components/ModalForm.vue'
24+
import { getGenericEndPoint } from '@/api/api'
25+
import { useCrudOperations } from '@/api/utils/crud-operations'
26+
import type { IProjects } from '@/interfaces.ts/projects.interface'
2627
2728
export default defineComponent({
2829
name: 'ProjectsPage',
29-
components: {
30-
DefaultMain,
31-
List,
32-
CreateButton,
33-
ModalForm,
34-
},
35-
data() {
30+
components: { DefaultMain, List, CreateButton, ModalForm },
31+
setup() {
32+
const projectsList = ref<IProjects[]>([])
33+
const showEditOrCreateModal = ref(false)
34+
const projectNameModal = ref('')
35+
const projectIdModal = ref('')
36+
const event = ref('')
37+
const name = 'projeto'
38+
39+
const { handleCrudOperation } = useCrudOperations<IProjects>('projects', {
40+
listRef: projectsList,
41+
onEdit: (item) => {
42+
event.value = 'edit'
43+
projectNameModal.value = item.name
44+
projectIdModal.value = item.id
45+
showEditOrCreateModal.value = true
46+
},
47+
onCreate: () => {
48+
event.value = 'create'
49+
projectIdModal.value = ''
50+
projectNameModal.value = ''
51+
showEditOrCreateModal.value = true
52+
},
53+
})
54+
55+
const updateListWithNewCreatedData = (data: IProjects) => {
56+
projectsList.value.push(data)
57+
showEditOrCreateModal.value = false
58+
}
59+
60+
const updateListWithNewUpdatedData = (data: IProjects) => {
61+
const index = projectsList.value.findIndex((p) => p.id === data.id)
62+
if (index !== -1) projectsList.value[index].name = data.name
63+
showEditOrCreateModal.value = false
64+
}
65+
66+
onMounted(async () => {
67+
projectsList.value = await getGenericEndPoint('projects')
68+
})
69+
3670
return {
37-
projectsList: [] as IProjects[],
38-
name: 'projeto',
39-
showEditOrCreateModal: false,
40-
projectNameModal: '',
41-
projectIdModal: '',
42-
event: '',
71+
projectsList,
72+
showEditOrCreateModal,
73+
projectNameModal,
74+
projectIdModal,
75+
event,
76+
name,
77+
handleCrudOperation,
78+
updateListWithNewCreatedData,
79+
updateListWithNewUpdatedData,
4380
}
4481
},
45-
methods: {
46-
async crudOperation(data: Record<string, any>) {
47-
console.log({ data })
48-
switch (data.event) {
49-
case 'delete':
50-
await deleteGenericEndPoint('projects', data.item.id)
51-
this.projectsList = this.projectsList.filter((project) => project.id != data.item.id)
52-
break
53-
case 'edit':
54-
this.event = data.event
55-
this.projectNameModal = data.item.name
56-
this.projectIdModal = data.item.id
57-
this.showEditOrCreateModal = true
58-
break
59-
case 'create':
60-
this.event = data.event
61-
this.projectIdModal = ''
62-
this.projectNameModal = ''
63-
this.showEditOrCreateModal = true
64-
break
65-
}
66-
},
67-
updateListWithNewCreatedData(data: IProjects) {
68-
this.projectsList.push(data)
69-
this.showEditOrCreateModal = false
70-
},
71-
updateListWithNewUpdatedData(data: IProjects) {
72-
this.projectsList = this.projectsList.filter((project) => {
73-
if (project.id === data.id) {
74-
project.name = data.name
75-
}
76-
return project
77-
})
78-
this.showEditOrCreateModal = false
79-
},
80-
},
81-
async created() {
82-
this.projectsList = await getGenericEndPoint('projects')
83-
},
8482
})
8583
</script>
8684

frontend/src/pages/TasksPage.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
</template>
77

88
<script lang="ts">
9-
import { getGenericEndPoint } from '@/api'
9+
import { getGenericEndPoint } from '@/api/api'
1010
import DefaultMain from '@/components/DefaultMain.vue'
1111
import List from '@/components/List.vue'
1212
import type { ITasks } from '@/interfaces.ts/tasks.interface'

frontend/src/pages/UsersPage.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
</template>
77

88
<script lang="ts">
9-
import { getGenericEndPoint } from '@/api'
9+
import { getGenericEndPoint } from '@/api/api'
1010
import DefaultMain from '@/components/DefaultMain.vue'
1111
import List from '@/components/List.vue'
1212
import type { IUsers } from '@/interfaces.ts/users.interface'

0 commit comments

Comments
 (0)