wad-lab 1.1.5 → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/bin/index.js +30 -3
  2. package/package.json +1 -1
  3. package/templates/fullstack-springboot-vue/backend/src/main/java/com/example/company/controller/CompanyController.java +88 -74
  4. package/templates/fullstack-springboot-vue/backend/src/main/java/com/example/company/model/Employee.java +73 -73
  5. package/templates/fullstack-springboot-vue/backend/src/main/java/com/example/company/service/CompanyService.java +90 -60
  6. package/templates/fullstack-springboot-vue/frontend/vue-axios-basic/src/App.vue +429 -405
  7. package/templates/fullstack-springboot-vue/frontend/vue-axios-interceptor/src/App.vue +177 -159
  8. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia/src/App.vue +441 -427
  9. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia/src/stores/companyStore.js +126 -96
  10. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia-props/src/App.vue +84 -69
  11. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia-props/src/components/DepartmentSection.vue +164 -152
  12. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia-props/src/components/EmployeeSection.vue +193 -181
  13. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia-props/src/stores/companyStore.js +126 -35
  14. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/App.vue +191 -167
  15. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/components/DepartmentForm.vue +98 -98
  16. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/components/DepartmentList.vue +92 -91
  17. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/components/EmployeeForm.vue +128 -128
  18. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/components/EmployeeList.vue +95 -94
  19. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/App.vue +90 -90
  20. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/views/AddEmployeeView.vue +247 -247
  21. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/views/DepartmentView.vue +296 -273
  22. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/views/EmployeeView.vue +219 -196
  23. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/views/HomeDashboardView.vue +263 -263
  24. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-children/src/views/DepartmentListView.vue +250 -231
  25. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-children/src/views/EmployeeDetailView.vue +181 -159
  26. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-children/src/views/EmployeeListView.vue +315 -295
  27. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia/src/stores/companyStore.js +137 -70
  28. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia/src/views/DepartmentView.vue +229 -209
  29. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia/src/views/EmployeeView.vue +257 -237
  30. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia-props/src/components/EntityTable.vue +106 -92
  31. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia-props/src/stores/companyStore.js +139 -84
  32. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia-props/src/views/ManageDepartmentsView.vue +73 -64
  33. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia-props/src/views/ManageEmployeesView.vue +76 -67
  34. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-props/src/App.vue +59 -59
  35. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-props/src/components/DataCard.vue +72 -53
  36. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-props/src/views/DepartmentPage.vue +89 -77
  37. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-props/src/views/EmployeePage.vue +128 -116
  38. package/templates/springboot-2model-1controller-api/src/main/java/com/example/company/controller/CompanyController.java +88 -74
  39. package/templates/springboot-2model-1controller-api/src/main/java/com/example/company/model/Employee.java +73 -73
  40. package/templates/springboot-2model-1controller-api/src/main/java/com/example/company/service/CompanyService.java +90 -60
  41. package/templates/springboot-course-registration/src/main/java/com/example/coursereg/controller/CourseController.java +46 -42
  42. package/templates/springboot-course-registration/src/main/java/com/example/coursereg/service/CourseService.java +70 -60
  43. package/templates/springboot-hospital-api/src/main/java/com/example/hospital/controller/HospitalController.java +54 -50
  44. package/templates/springboot-hospital-api/src/main/java/com/example/hospital/service/HospitalService.java +65 -54
  45. package/templates/springboot-library-api/src/main/java/com/example/library/controller/LibraryController.java +57 -51
  46. package/templates/springboot-library-api/src/main/java/com/example/library/service/LibraryService.java +70 -60
  47. package/templates/springboot-mockmvc/src/main/java/com/example/mockmvc/controller/ItemController.java +45 -41
  48. package/templates/springboot-mockmvc/src/main/java/com/example/mockmvc/service/ItemService.java +48 -38
  49. package/templates/springboot-mongo-aggregation/src/main/java/com/example/aggregation/controller/ItemController.java +45 -41
  50. package/templates/springboot-mongo-aggregation/src/main/java/com/example/aggregation/service/ItemService.java +48 -38
  51. package/templates/springboot-mongo-aggregation-mockmvc/src/main/java/com/example/aggmockmvc/controller/ItemController.java +45 -41
  52. package/templates/springboot-mongo-aggregation-mockmvc/src/main/java/com/example/aggmockmvc/service/ItemService.java +48 -38
  53. package/templates/springboot-mongo-crud/src/main/java/com/example/crud/controller/ItemController.java +45 -41
  54. package/templates/springboot-mongo-crud/src/main/java/com/example/crud/service/ItemService.java +48 -38
  55. package/templates/vue-axios/src/App.vue +264 -243
  56. package/templates/vue-axios/src/services/ItemService.js +27 -21
  57. package/templates/vue-axios-basic/src/App.vue +429 -405
  58. package/templates/vue-axios-interceptor/src/App.vue +177 -159
  59. package/templates/vue-axios-pinia/src/App.vue +441 -427
  60. package/templates/vue-axios-pinia/src/stores/companyStore.js +126 -96
  61. package/templates/vue-axios-pinia-props/src/App.vue +84 -69
  62. package/templates/vue-axios-pinia-props/src/components/DepartmentSection.vue +164 -152
  63. package/templates/vue-axios-pinia-props/src/components/EmployeeSection.vue +193 -181
  64. package/templates/vue-axios-pinia-props/src/stores/companyStore.js +126 -35
  65. package/templates/vue-axios-props-emits/src/App.vue +191 -167
  66. package/templates/vue-axios-props-emits/src/components/DepartmentForm.vue +98 -98
  67. package/templates/vue-axios-props-emits/src/components/DepartmentList.vue +92 -91
  68. package/templates/vue-axios-props-emits/src/components/EmployeeForm.vue +128 -128
  69. package/templates/vue-axios-props-emits/src/components/EmployeeList.vue +95 -94
  70. package/templates/vue-axios-router/src/App.vue +90 -90
  71. package/templates/vue-axios-router/src/views/AddEmployeeView.vue +247 -247
  72. package/templates/vue-axios-router/src/views/DepartmentView.vue +296 -273
  73. package/templates/vue-axios-router/src/views/EmployeeView.vue +219 -196
  74. package/templates/vue-axios-router/src/views/HomeDashboardView.vue +263 -263
  75. package/templates/vue-axios-router-children/src/views/DepartmentListView.vue +250 -231
  76. package/templates/vue-axios-router-children/src/views/EmployeeDetailView.vue +181 -159
  77. package/templates/vue-axios-router-children/src/views/EmployeeListView.vue +315 -295
  78. package/templates/vue-axios-router-pinia/src/stores/companyStore.js +137 -70
  79. package/templates/vue-axios-router-pinia/src/views/DepartmentView.vue +229 -209
  80. package/templates/vue-axios-router-pinia/src/views/EmployeeView.vue +257 -237
  81. package/templates/vue-axios-router-pinia-props/src/components/EntityTable.vue +106 -92
  82. package/templates/vue-axios-router-pinia-props/src/stores/companyStore.js +139 -84
  83. package/templates/vue-axios-router-pinia-props/src/views/ManageDepartmentsView.vue +73 -64
  84. package/templates/vue-axios-router-pinia-props/src/views/ManageEmployeesView.vue +76 -67
  85. package/templates/vue-axios-router-props/src/App.vue +59 -59
  86. package/templates/vue-axios-router-props/src/components/DataCard.vue +72 -53
  87. package/templates/vue-axios-router-props/src/views/DepartmentPage.vue +89 -77
  88. package/templates/vue-axios-router-props/src/views/EmployeePage.vue +128 -116
  89. package/templates/vue-fetch/src/App.vue +285 -259
  90. package/templates/vue-router-pinia-springboot/backend/src/main/java/com/example/crud/controller/ItemController.java +45 -41
  91. package/templates/vue-router-pinia-springboot/backend/src/main/java/com/example/crud/service/ItemService.java +45 -35
  92. package/templates/vue-router-pinia-springboot/frontend/src/services/ItemService.js +24 -21
  93. package/templates/vue-router-pinia-springboot/frontend/src/stores/itemStore.js +42 -37
  94. package/templates/vue-router-pinia-springboot/frontend/src/views/ListView.vue +76 -67
  95. package/templates/vue-springboot-mongo-aggregation/backend/src/main/java/com/example/aggregation/controller/ItemController.java +45 -41
  96. package/templates/vue-springboot-mongo-aggregation/backend/src/main/java/com/example/aggregation/service/ItemService.java +45 -35
  97. package/templates/vue-springboot-mongo-crud/backend/src/main/java/com/example/crud/controller/ItemController.java +45 -41
  98. package/templates/vue-springboot-mongo-crud/backend/src/main/java/com/example/crud/service/ItemService.java +45 -35
  99. package/templates/vue-springboot-mongo-crud/frontend/src/App.vue +158 -149
  100. package/templates/vue-springboot-mongo-crud/frontend/src/services/ItemService.js +24 -21
@@ -1,92 +1,106 @@
1
- <script setup>
2
- defineProps({
3
- items: {
4
- type: Array,
5
- default: () => []
6
- },
7
- columns: {
8
- type: Array,
9
- default: () => []
10
- },
11
- title: {
12
- type: String,
13
- default: ''
14
- }
15
- })
16
-
17
- const emit = defineEmits(['delete-item'])
18
-
19
- const getColKey = (col) => (typeof col === 'object' && col.key ? col.key : col)
20
- const getColLabel = (col) => (typeof col === 'object' && col.label ? col.label : col)
21
-
22
- const handleDelete = (id) => {
23
- emit('delete-item', id)
24
- }
25
- </script>
26
-
27
- <template>
28
- <div class="entity-table-container">
29
- <h3 v-if="title" class="table-title">{{ title }}</h3>
30
- <table v-if="items && items.length > 0" class="entity-table">
31
- <thead>
32
- <tr>
33
- <th v-for="col in columns" :key="getColKey(col)">
34
- {{ getColLabel(col) }}
35
- </th>
36
- <th>Actions</th>
37
- </tr>
38
- </thead>
39
- <tbody>
40
- <tr v-for="item in items" :key="item.id">
41
- <td v-for="col in columns" :key="getColKey(col)">
42
- {{ item[getColKey(col)] }}
43
- </td>
44
- <td>
45
- <button class="btn-delete" @click="handleDelete(item.id)">Delete</button>
46
- </td>
47
- </tr>
48
- </tbody>
49
- </table>
50
- <p v-else class="empty-msg">No records found.</p>
51
- </div>
52
- </template>
53
-
54
- <style scoped>
55
- .entity-table-container {
56
- margin-top: 16px;
57
- }
58
- .table-title {
59
- margin-bottom: 12px;
60
- font-size: 1.2rem;
61
- }
62
- .entity-table {
63
- width: 100%;
64
- border-collapse: collapse;
65
- }
66
- .entity-table th,
67
- .entity-table td {
68
- border: 1px solid #d0d7de;
69
- padding: 10px 12px;
70
- text-align: left;
71
- }
72
- .entity-table th {
73
- background-color: #f6f8fa;
74
- font-weight: 600;
75
- }
76
- .btn-delete {
77
- background-color: #cf222e;
78
- color: #ffffff;
79
- border: none;
80
- padding: 6px 12px;
81
- border-radius: 4px;
82
- cursor: pointer;
83
- font-size: 0.85rem;
84
- }
85
- .btn-delete:hover {
86
- background-color: #a40e26;
87
- }
88
- .empty-msg {
89
- color: #57606a;
90
- padding: 12px 0;
91
- }
92
- </style>
1
+ <script setup>
2
+ defineProps({
3
+ items: {
4
+ type: Array,
5
+ default: () => []
6
+ },
7
+ columns: {
8
+ type: Array,
9
+ default: () => []
10
+ },
11
+ title: {
12
+ type: String,
13
+ default: ''
14
+ }
15
+ })
16
+
17
+ const emit = defineEmits(['delete-item', 'patch-item'])
18
+
19
+ const getColKey = (col) => (typeof col === 'object' && col.key ? col.key : col)
20
+ const getColLabel = (col) => (typeof col === 'object' && col.label ? col.label : col)
21
+
22
+ const handleDelete = (id) => {
23
+ emit('delete-item', id)
24
+ }
25
+ </script>
26
+
27
+ <template>
28
+ <div class="entity-table-container">
29
+ <h3 v-if="title" class="table-title">{{ title }}</h3>
30
+ <table v-if="items && items.length > 0" class="entity-table">
31
+ <thead>
32
+ <tr>
33
+ <th v-for="col in columns" :key="getColKey(col)">
34
+ {{ getColLabel(col) }}
35
+ </th>
36
+ <th>Actions</th>
37
+ </tr>
38
+ </thead>
39
+ <tbody>
40
+ <tr v-for="item in items" :key="item.id">
41
+ <td v-for="col in columns" :key="getColKey(col)">
42
+ {{ item[getColKey(col)] }}
43
+ </td>
44
+ <td>
45
+ <button @click="$emit('patch-item', item)" class="btn-patch">Patch</button>
46
+ <button class="btn-delete" @click="handleDelete(item.id)">Delete</button>
47
+ </td>
48
+ </tr>
49
+ </tbody>
50
+ </table>
51
+ <p v-else class="empty-msg">No records found.</p>
52
+ </div>
53
+ </template>
54
+
55
+ <style scoped>
56
+ .entity-table-container {
57
+ margin-top: 16px;
58
+ }
59
+ .table-title {
60
+ margin-bottom: 12px;
61
+ font-size: 1.2rem;
62
+ }
63
+ .entity-table {
64
+ width: 100%;
65
+ border-collapse: collapse;
66
+ }
67
+ .entity-table th,
68
+ .entity-table td {
69
+ border: 1px solid #d0d7de;
70
+ padding: 10px 12px;
71
+ text-align: left;
72
+ }
73
+ .entity-table th {
74
+ background-color: #f6f8fa;
75
+ font-weight: 600;
76
+ }
77
+ .btn-patch {
78
+ background-color: #0969da;
79
+ color: #ffffff;
80
+ border: none;
81
+ padding: 6px 12px;
82
+ border-radius: 4px;
83
+ cursor: pointer;
84
+ font-size: 0.85rem;
85
+ margin-right: 6px;
86
+ }
87
+ .btn-patch:hover {
88
+ background-color: #0856b3;
89
+ }
90
+ .btn-delete {
91
+ background-color: #cf222e;
92
+ color: #ffffff;
93
+ border: none;
94
+ padding: 6px 12px;
95
+ border-radius: 4px;
96
+ cursor: pointer;
97
+ font-size: 0.85rem;
98
+ }
99
+ .btn-delete:hover {
100
+ background-color: #a40e26;
101
+ }
102
+ .empty-msg {
103
+ color: #57606a;
104
+ padding: 12px 0;
105
+ }
106
+ </style>
@@ -1,84 +1,139 @@
1
- import { defineStore } from 'pinia'
2
- import api from '../services/api'
3
-
4
- export const useCompanyStore = defineStore('company', {
5
- state: () => ({
6
- departments: [
7
- { id: 1, name: 'Engineering', code: 'ENG', budget: 150000 },
8
- { id: 2, name: 'Marketing', code: 'MKT', budget: 80000 },
9
- { id: 3, name: 'Human Resources', code: 'HR', budget: 60000 }
10
- ],
11
- employees: [
12
- { id: 1, name: 'Alice Smith', email: 'alice@example.com', role: 'Lead Architect', department: 'Engineering' },
13
- { id: 2, name: 'Bob Jones', email: 'bob@example.com', role: 'Marketing Specialist', department: 'Marketing' },
14
- { id: 3, name: 'Charlie Brown', email: 'charlie@example.com', role: 'HR Coordinator', department: 'Human Resources' }
15
- ],
16
- loading: false,
17
- error: null
18
- }),
19
- getters: {
20
- totalDepartments: (state) => state.departments.length,
21
- totalEmployees: (state) => state.employees.length,
22
- totalBudget: (state) => state.departments.reduce((sum, d) => sum + Number(d.budget || 0), 0)
23
- },
24
- actions: {
25
- async fetchDepartments() {
26
- this.loading = true
27
- try {
28
- const response = await api.getDepartments()
29
- this.departments = response.data
30
- this.error = null
31
- } catch (err) {
32
- this.error = err.message
33
- } finally {
34
- this.loading = false
35
- }
36
- },
37
- async addDepartment(dept) {
38
- try {
39
- const response = await api.createDepartment(dept)
40
- this.departments.push(response.data)
41
- } catch (err) {
42
- const newDept = { ...dept, id: dept.id || Date.now() }
43
- this.departments.push(newDept)
44
- }
45
- },
46
- async removeDepartment(id) {
47
- try {
48
- await api.deleteDepartment(id)
49
- this.departments = this.departments.filter(d => d.id !== id)
50
- } catch (err) {
51
- this.departments = this.departments.filter(d => d.id !== id)
52
- }
53
- },
54
- async fetchEmployees() {
55
- this.loading = true
56
- try {
57
- const response = await api.getEmployees()
58
- this.employees = response.data
59
- this.error = null
60
- } catch (err) {
61
- this.error = err.message
62
- } finally {
63
- this.loading = false
64
- }
65
- },
66
- async addEmployee(emp) {
67
- try {
68
- const response = await api.createEmployee(emp)
69
- this.employees.push(response.data)
70
- } catch (err) {
71
- const newEmp = { ...emp, id: emp.id || Date.now() }
72
- this.employees.push(newEmp)
73
- }
74
- },
75
- async removeEmployee(id) {
76
- try {
77
- await api.deleteEmployee(id)
78
- this.employees = this.employees.filter(e => e.id !== id)
79
- } catch (err) {
80
- this.employees = this.employees.filter(e => e.id !== id)
81
- }
82
- }
83
- }
84
- })
1
+ import { defineStore } from 'pinia'
2
+ import api from '../services/api'
3
+
4
+ export const useCompanyStore = defineStore('company', {
5
+ state: () => ({
6
+ departments: [],
7
+ employees: [],
8
+ loading: false,
9
+ error: null
10
+ }),
11
+ getters: {
12
+ totalDepartments: (state) => state.departments.length,
13
+ totalEmployees: (state) => state.employees.length,
14
+ totalPayroll: (state) => state.employees.reduce((sum, emp) => sum + (Number(emp.salary) || 0), 0),
15
+ totalBudget: (state) => state.departments.reduce((sum, d) => sum + Number(d.budget || 0), 0)
16
+ },
17
+ actions: {
18
+ async fetchDepartments() {
19
+ this.loading = true
20
+ this.error = null
21
+ try {
22
+ const response = await api.get('/departments')
23
+ this.departments = response.data
24
+ } catch (err) {
25
+ this.error = err.response?.data?.message || err.message
26
+ } finally {
27
+ this.loading = false
28
+ }
29
+ },
30
+ async addDepartment(dept) {
31
+ return this.createDepartment(dept)
32
+ },
33
+ async removeDepartment(id) {
34
+ return this.deleteDepartment(id)
35
+ },
36
+ async createDepartment(data) {
37
+ this.loading = true
38
+ this.error = null
39
+ try {
40
+ const response = await api.post('/departments', data)
41
+ this.departments.push(response.data)
42
+ return response.data
43
+ } catch (err) {
44
+ this.error = err.response?.data?.message || err.message
45
+ throw err
46
+ } finally {
47
+ this.loading = false
48
+ }
49
+ },
50
+ async deleteDepartment(id) {
51
+ this.loading = true
52
+ this.error = null
53
+ try {
54
+ await api.delete(`/departments/${id}`)
55
+ this.departments = this.departments.filter(dept => dept.id !== id)
56
+ } catch (err) {
57
+ this.error = err.response?.data?.message || err.message
58
+ throw err
59
+ } finally {
60
+ this.loading = false
61
+ }
62
+ },
63
+ async fetchEmployees() {
64
+ this.loading = true
65
+ this.error = null
66
+ try {
67
+ const response = await api.get('/employees')
68
+ this.employees = response.data
69
+ } catch (err) {
70
+ this.error = err.response?.data?.message || err.message
71
+ } finally {
72
+ this.loading = false
73
+ }
74
+ },
75
+ async addEmployee(emp) {
76
+ return this.createEmployee(emp)
77
+ },
78
+ async removeEmployee(id) {
79
+ return this.deleteEmployee(id)
80
+ },
81
+ async createEmployee(data) {
82
+ this.loading = true
83
+ this.error = null
84
+ try {
85
+ const response = await api.post('/employees', data)
86
+ this.employees.push(response.data)
87
+ return response.data
88
+ } catch (err) {
89
+ this.error = err.response?.data?.message || err.message
90
+ throw err
91
+ } finally {
92
+ this.loading = false
93
+ }
94
+ },
95
+ async deleteEmployee(id) {
96
+ this.loading = true
97
+ this.error = null
98
+ try {
99
+ await api.delete(`/employees/${id}`)
100
+ this.employees = this.employees.filter(emp => emp.id !== id)
101
+ } catch (err) {
102
+ this.error = err.response?.data?.message || err.message
103
+ throw err
104
+ } finally {
105
+ this.loading = false
106
+ }
107
+ },
108
+ async patchDepartment(id, data) {
109
+ this.loading = true
110
+ this.error = null
111
+ try {
112
+ const response = await api.patch(`/departments/${id}`, data)
113
+ const idx = this.departments.findIndex(dept => dept.id === id)
114
+ if (idx !== -1) this.departments[idx] = response.data
115
+ return response.data
116
+ } catch (err) {
117
+ this.error = err.response?.data?.message || err.message
118
+ throw err
119
+ } finally {
120
+ this.loading = false
121
+ }
122
+ },
123
+ async patchEmployee(id, data) {
124
+ this.loading = true
125
+ this.error = null
126
+ try {
127
+ const response = await api.patch(`/employees/${id}`, data)
128
+ const idx = this.employees.findIndex(emp => emp.id === id)
129
+ if (idx !== -1) this.employees[idx] = response.data
130
+ return response.data
131
+ } catch (err) {
132
+ this.error = err.response?.data?.message || err.message
133
+ throw err
134
+ } finally {
135
+ this.loading = false
136
+ }
137
+ }
138
+ }
139
+ })
@@ -1,64 +1,73 @@
1
- <script setup>
2
- import { onMounted } from 'vue'
3
- import { useCompanyStore } from '../stores/companyStore'
4
- import EntityTable from '../components/EntityTable.vue'
5
- import EntityForm from '../components/EntityForm.vue'
6
-
7
- const store = useCompanyStore()
8
-
9
- const departmentFields = [
10
- { key: 'name', label: 'Department Name', type: 'text', placeholder: 'e.g. Finance' },
11
- { key: 'code', label: 'Department Code', type: 'text', placeholder: 'e.g. FIN' },
12
- { key: 'budget', label: 'Annual Budget ($)', type: 'number', placeholder: 'e.g. 50000' }
13
- ]
14
-
15
- const departmentColumns = [
16
- { key: 'id', label: 'ID' },
17
- { key: 'name', label: 'Name' },
18
- { key: 'code', label: 'Code' },
19
- { key: 'budget', label: 'Budget' }
20
- ]
21
-
22
- const handleAddDepartment = (formData) => {
23
- store.addDepartment({
24
- name: formData.name,
25
- code: formData.code,
26
- budget: Number(formData.budget)
27
- })
28
- }
29
-
30
- const handleDeleteDepartment = (id) => {
31
- store.removeDepartment(id)
32
- }
33
-
34
- onMounted(() => {
35
- store.fetchDepartments()
36
- })
37
- </script>
38
-
39
- <template>
40
- <div class="manage-departments-view">
41
- <h2>Manage Departments</h2>
42
- <EntityForm
43
- :fields="departmentFields"
44
- title="Add New Department"
45
- @submit-form="handleAddDepartment"
46
- />
47
- <EntityTable
48
- :items="store.departments"
49
- :columns="departmentColumns"
50
- title="All Departments"
51
- @delete-item="handleDeleteDepartment"
52
- />
53
- </div>
54
- </template>
55
-
56
- <style scoped>
57
- .manage-departments-view {
58
- padding: 16px 0;
59
- }
60
- .manage-departments-view h2 {
61
- font-size: 1.5rem;
62
- margin-bottom: 20px;
63
- }
64
- </style>
1
+ <script setup>
2
+ import { onMounted } from 'vue'
3
+ import { useCompanyStore } from '../stores/companyStore'
4
+ import EntityTable from '../components/EntityTable.vue'
5
+ import EntityForm from '../components/EntityForm.vue'
6
+
7
+ const companyStore = useCompanyStore()
8
+ const store = companyStore
9
+
10
+ const departmentFields = [
11
+ { key: 'name', label: 'Department Name', type: 'text', placeholder: 'e.g. Finance' },
12
+ { key: 'code', label: 'Department Code', type: 'text', placeholder: 'e.g. FIN' },
13
+ { key: 'budget', label: 'Annual Budget ($)', type: 'number', placeholder: 'e.g. 50000' }
14
+ ]
15
+
16
+ const departmentColumns = [
17
+ { key: 'id', label: 'ID' },
18
+ { key: 'name', label: 'Name' },
19
+ { key: 'code', label: 'Code' },
20
+ { key: 'budget', label: 'Budget' }
21
+ ]
22
+
23
+ const handleAddDepartment = (formData) => {
24
+ store.addDepartment({
25
+ name: formData.name,
26
+ code: formData.code,
27
+ budget: Number(formData.budget)
28
+ })
29
+ }
30
+
31
+ const handleDeleteDepartment = (id) => {
32
+ store.removeDepartment(id)
33
+ }
34
+
35
+ const handlePatch = (item) => {
36
+ const code = prompt('New code:', item.code)
37
+ if (code) {
38
+ companyStore.patchDepartment(item.id, { code })
39
+ }
40
+ }
41
+
42
+ onMounted(() => {
43
+ store.fetchDepartments()
44
+ })
45
+ </script>
46
+
47
+ <template>
48
+ <div class="manage-departments-view">
49
+ <h2>Manage Departments</h2>
50
+ <EntityForm
51
+ :fields="departmentFields"
52
+ title="Add New Department"
53
+ @submit-form="handleAddDepartment"
54
+ />
55
+ <EntityTable
56
+ :items="store.departments"
57
+ :columns="departmentColumns"
58
+ title="All Departments"
59
+ @delete-item="handleDeleteDepartment"
60
+ @patch-item="handlePatch"
61
+ />
62
+ </div>
63
+ </template>
64
+
65
+ <style scoped>
66
+ .manage-departments-view {
67
+ padding: 16px 0;
68
+ }
69
+ .manage-departments-view h2 {
70
+ font-size: 1.5rem;
71
+ margin-bottom: 20px;
72
+ }
73
+ </style>