wad-lab 1.1.6 → 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 (93) hide show
  1. package/package.json +1 -1
  2. package/templates/fullstack-springboot-vue/backend/src/main/java/com/example/company/controller/CompanyController.java +88 -74
  3. package/templates/fullstack-springboot-vue/backend/src/main/java/com/example/company/model/Employee.java +73 -73
  4. package/templates/fullstack-springboot-vue/backend/src/main/java/com/example/company/service/CompanyService.java +90 -60
  5. package/templates/fullstack-springboot-vue/frontend/vue-axios-basic/src/App.vue +429 -405
  6. package/templates/fullstack-springboot-vue/frontend/vue-axios-interceptor/src/App.vue +177 -159
  7. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia/src/App.vue +441 -427
  8. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia/src/stores/companyStore.js +126 -96
  9. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia-props/src/App.vue +84 -69
  10. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia-props/src/components/DepartmentSection.vue +164 -152
  11. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia-props/src/components/EmployeeSection.vue +193 -181
  12. package/templates/fullstack-springboot-vue/frontend/vue-axios-pinia-props/src/stores/companyStore.js +126 -35
  13. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/App.vue +191 -167
  14. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/components/DepartmentForm.vue +98 -98
  15. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/components/DepartmentList.vue +92 -91
  16. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/components/EmployeeForm.vue +128 -128
  17. package/templates/fullstack-springboot-vue/frontend/vue-axios-props-emits/src/components/EmployeeList.vue +95 -94
  18. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/App.vue +90 -90
  19. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/views/AddEmployeeView.vue +247 -247
  20. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/views/DepartmentView.vue +296 -273
  21. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/views/EmployeeView.vue +219 -196
  22. package/templates/fullstack-springboot-vue/frontend/vue-axios-router/src/views/HomeDashboardView.vue +263 -263
  23. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-children/src/views/DepartmentListView.vue +250 -231
  24. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-children/src/views/EmployeeDetailView.vue +181 -159
  25. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-children/src/views/EmployeeListView.vue +315 -295
  26. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia/src/stores/companyStore.js +137 -70
  27. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia/src/views/DepartmentView.vue +229 -209
  28. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia/src/views/EmployeeView.vue +257 -237
  29. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia-props/src/components/EntityTable.vue +106 -92
  30. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia-props/src/stores/companyStore.js +139 -84
  31. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia-props/src/views/ManageDepartmentsView.vue +73 -64
  32. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-pinia-props/src/views/ManageEmployeesView.vue +76 -67
  33. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-props/src/App.vue +59 -59
  34. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-props/src/components/DataCard.vue +72 -53
  35. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-props/src/views/DepartmentPage.vue +89 -77
  36. package/templates/fullstack-springboot-vue/frontend/vue-axios-router-props/src/views/EmployeePage.vue +128 -116
  37. package/templates/springboot-2model-1controller-api/src/main/java/com/example/company/controller/CompanyController.java +88 -74
  38. package/templates/springboot-2model-1controller-api/src/main/java/com/example/company/model/Employee.java +73 -73
  39. package/templates/springboot-2model-1controller-api/src/main/java/com/example/company/service/CompanyService.java +90 -60
  40. package/templates/springboot-course-registration/src/main/java/com/example/coursereg/controller/CourseController.java +46 -42
  41. package/templates/springboot-course-registration/src/main/java/com/example/coursereg/service/CourseService.java +70 -60
  42. package/templates/springboot-hospital-api/src/main/java/com/example/hospital/controller/HospitalController.java +54 -50
  43. package/templates/springboot-hospital-api/src/main/java/com/example/hospital/service/HospitalService.java +65 -54
  44. package/templates/springboot-library-api/src/main/java/com/example/library/controller/LibraryController.java +57 -51
  45. package/templates/springboot-library-api/src/main/java/com/example/library/service/LibraryService.java +70 -60
  46. package/templates/springboot-mockmvc/src/main/java/com/example/mockmvc/controller/ItemController.java +45 -41
  47. package/templates/springboot-mockmvc/src/main/java/com/example/mockmvc/service/ItemService.java +48 -38
  48. package/templates/springboot-mongo-aggregation/src/main/java/com/example/aggregation/controller/ItemController.java +45 -41
  49. package/templates/springboot-mongo-aggregation/src/main/java/com/example/aggregation/service/ItemService.java +48 -38
  50. package/templates/springboot-mongo-aggregation-mockmvc/src/main/java/com/example/aggmockmvc/controller/ItemController.java +45 -41
  51. package/templates/springboot-mongo-aggregation-mockmvc/src/main/java/com/example/aggmockmvc/service/ItemService.java +48 -38
  52. package/templates/springboot-mongo-crud/src/main/java/com/example/crud/controller/ItemController.java +45 -41
  53. package/templates/springboot-mongo-crud/src/main/java/com/example/crud/service/ItemService.java +48 -38
  54. package/templates/vue-axios/src/App.vue +264 -243
  55. package/templates/vue-axios/src/services/ItemService.js +27 -21
  56. package/templates/vue-axios-basic/src/App.vue +24 -0
  57. package/templates/vue-axios-interceptor/src/App.vue +177 -159
  58. package/templates/vue-axios-pinia/src/App.vue +14 -0
  59. package/templates/vue-axios-pinia/src/stores/companyStore.js +126 -96
  60. package/templates/vue-axios-pinia-props/src/App.vue +84 -69
  61. package/templates/vue-axios-pinia-props/src/components/DepartmentSection.vue +164 -152
  62. package/templates/vue-axios-pinia-props/src/components/EmployeeSection.vue +193 -181
  63. package/templates/vue-axios-pinia-props/src/stores/companyStore.js +126 -35
  64. package/templates/vue-axios-props-emits/src/App.vue +24 -0
  65. package/templates/vue-axios-props-emits/src/components/DepartmentList.vue +2 -1
  66. package/templates/vue-axios-props-emits/src/components/EmployeeList.vue +2 -1
  67. package/templates/vue-axios-router/src/views/DepartmentView.vue +23 -0
  68. package/templates/vue-axios-router/src/views/EmployeeView.vue +23 -0
  69. package/templates/vue-axios-router-children/src/views/DepartmentListView.vue +250 -231
  70. package/templates/vue-axios-router-children/src/views/EmployeeDetailView.vue +181 -159
  71. package/templates/vue-axios-router-children/src/views/EmployeeListView.vue +315 -295
  72. package/templates/vue-axios-router-pinia/src/stores/companyStore.js +137 -70
  73. package/templates/vue-axios-router-pinia/src/views/DepartmentView.vue +229 -209
  74. package/templates/vue-axios-router-pinia/src/views/EmployeeView.vue +257 -237
  75. package/templates/vue-axios-router-pinia-props/src/components/EntityTable.vue +106 -92
  76. package/templates/vue-axios-router-pinia-props/src/stores/companyStore.js +139 -84
  77. package/templates/vue-axios-router-pinia-props/src/views/ManageDepartmentsView.vue +73 -64
  78. package/templates/vue-axios-router-pinia-props/src/views/ManageEmployeesView.vue +76 -67
  79. package/templates/vue-axios-router-props/src/components/DataCard.vue +72 -53
  80. package/templates/vue-axios-router-props/src/views/DepartmentPage.vue +89 -77
  81. package/templates/vue-axios-router-props/src/views/EmployeePage.vue +128 -116
  82. package/templates/vue-fetch/src/App.vue +285 -259
  83. package/templates/vue-router-pinia-springboot/backend/src/main/java/com/example/crud/controller/ItemController.java +45 -41
  84. package/templates/vue-router-pinia-springboot/backend/src/main/java/com/example/crud/service/ItemService.java +45 -35
  85. package/templates/vue-router-pinia-springboot/frontend/src/services/ItemService.js +24 -21
  86. package/templates/vue-router-pinia-springboot/frontend/src/stores/itemStore.js +42 -37
  87. package/templates/vue-router-pinia-springboot/frontend/src/views/ListView.vue +76 -67
  88. package/templates/vue-springboot-mongo-aggregation/backend/src/main/java/com/example/aggregation/controller/ItemController.java +45 -41
  89. package/templates/vue-springboot-mongo-aggregation/backend/src/main/java/com/example/aggregation/service/ItemService.java +45 -35
  90. package/templates/vue-springboot-mongo-crud/backend/src/main/java/com/example/crud/controller/ItemController.java +45 -41
  91. package/templates/vue-springboot-mongo-crud/backend/src/main/java/com/example/crud/service/ItemService.java +45 -35
  92. package/templates/vue-springboot-mongo-crud/frontend/src/App.vue +158 -149
  93. package/templates/vue-springboot-mongo-crud/frontend/src/services/ItemService.js +24 -21
@@ -1,70 +1,137 @@
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
- }),
9
- getters: {
10
- totalDepts: (state) => state.departments.length,
11
- totalEmployees: (state) => state.employees.length,
12
- getDepartmentName: (state) => (deptId) => {
13
- const dept = state.departments.find((d) => d.id === deptId)
14
- return dept ? dept.name : `Dept #${deptId}`
15
- }
16
- },
17
- actions: {
18
- async fetchDepartments() {
19
- try {
20
- const response = await api.get('/departments')
21
- this.departments = response.data
22
- } catch (error) {
23
- console.error(error)
24
- }
25
- },
26
- async addDepartment(dept) {
27
- try {
28
- const response = await api.post('/departments', dept)
29
- await this.fetchDepartments()
30
- return response.data
31
- } catch (error) {
32
- console.error(error)
33
- }
34
- },
35
- async deleteDepartment(id) {
36
- try {
37
- await api.delete(`/departments/${id}`)
38
- await this.fetchDepartments()
39
- await this.fetchEmployees()
40
- } catch (error) {
41
- console.error(error)
42
- }
43
- },
44
- async fetchEmployees() {
45
- try {
46
- const response = await api.get('/employees')
47
- this.employees = response.data
48
- } catch (error) {
49
- console.error(error)
50
- }
51
- },
52
- async addEmployee(emp) {
53
- try {
54
- const response = await api.post('/employees', emp)
55
- await this.fetchEmployees()
56
- return response.data
57
- } catch (error) {
58
- console.error(error)
59
- }
60
- },
61
- async deleteEmployee(id) {
62
- try {
63
- await api.delete(`/employees/${id}`)
64
- await this.fetchEmployees()
65
- } catch (error) {
66
- console.error(error)
67
- }
68
- }
69
- }
70
- })
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
+ totalDepts: (state) => state.departments.length,
13
+ totalDepartments: (state) => state.departments.length,
14
+ totalEmployees: (state) => state.employees.length,
15
+ totalPayroll: (state) => state.employees.reduce((sum, emp) => sum + (Number(emp.salary) || 0), 0),
16
+ getDepartmentName: (state) => (deptId) => {
17
+ const dept = state.departments.find((d) => d.id === deptId)
18
+ return dept ? dept.name : `Dept #${deptId}`
19
+ }
20
+ },
21
+ actions: {
22
+ async fetchDepartments() {
23
+ this.loading = true
24
+ this.error = null
25
+ try {
26
+ const response = await api.get('/departments')
27
+ this.departments = response.data
28
+ } catch (err) {
29
+ this.error = err.response?.data?.message || err.message
30
+ } finally {
31
+ this.loading = false
32
+ }
33
+ },
34
+ async addDepartment(dept) {
35
+ return this.createDepartment(dept)
36
+ },
37
+ async createDepartment(data) {
38
+ this.loading = true
39
+ this.error = null
40
+ try {
41
+ const response = await api.post('/departments', data)
42
+ this.departments.push(response.data)
43
+ return response.data
44
+ } catch (err) {
45
+ this.error = err.response?.data?.message || err.message
46
+ throw err
47
+ } finally {
48
+ this.loading = false
49
+ }
50
+ },
51
+ async deleteDepartment(id) {
52
+ this.loading = true
53
+ this.error = null
54
+ try {
55
+ await api.delete(`/departments/${id}`)
56
+ this.departments = this.departments.filter(dept => dept.id !== id)
57
+ } catch (err) {
58
+ this.error = err.response?.data?.message || err.message
59
+ throw err
60
+ } finally {
61
+ this.loading = false
62
+ }
63
+ },
64
+ async fetchEmployees() {
65
+ this.loading = true
66
+ this.error = null
67
+ try {
68
+ const response = await api.get('/employees')
69
+ this.employees = response.data
70
+ } catch (err) {
71
+ this.error = err.response?.data?.message || err.message
72
+ } finally {
73
+ this.loading = false
74
+ }
75
+ },
76
+ async addEmployee(emp) {
77
+ return this.createEmployee(emp)
78
+ },
79
+ async createEmployee(data) {
80
+ this.loading = true
81
+ this.error = null
82
+ try {
83
+ const response = await api.post('/employees', data)
84
+ this.employees.push(response.data)
85
+ return response.data
86
+ } catch (err) {
87
+ this.error = err.response?.data?.message || err.message
88
+ throw err
89
+ } finally {
90
+ this.loading = false
91
+ }
92
+ },
93
+ async deleteEmployee(id) {
94
+ this.loading = true
95
+ this.error = null
96
+ try {
97
+ await api.delete(`/employees/${id}`)
98
+ this.employees = this.employees.filter(emp => emp.id !== id)
99
+ } catch (err) {
100
+ this.error = err.response?.data?.message || err.message
101
+ throw err
102
+ } finally {
103
+ this.loading = false
104
+ }
105
+ },
106
+ async patchDepartment(id, data) {
107
+ this.loading = true
108
+ this.error = null
109
+ try {
110
+ const response = await api.patch(`/departments/${id}`, data)
111
+ const idx = this.departments.findIndex(dept => dept.id === id)
112
+ if (idx !== -1) this.departments[idx] = response.data
113
+ return response.data
114
+ } catch (err) {
115
+ this.error = err.response?.data?.message || err.message
116
+ throw err
117
+ } finally {
118
+ this.loading = false
119
+ }
120
+ },
121
+ async patchEmployee(id, data) {
122
+ this.loading = true
123
+ this.error = null
124
+ try {
125
+ const response = await api.patch(`/employees/${id}`, data)
126
+ const idx = this.employees.findIndex(emp => emp.id === id)
127
+ if (idx !== -1) this.employees[idx] = response.data
128
+ return response.data
129
+ } catch (err) {
130
+ this.error = err.response?.data?.message || err.message
131
+ throw err
132
+ } finally {
133
+ this.loading = false
134
+ }
135
+ }
136
+ }
137
+ })
@@ -1,209 +1,229 @@
1
- <template>
2
- <div class="department-view">
3
- <h2>Departments Management</h2>
4
-
5
- <section class="card">
6
- <h3>Add Department</h3>
7
- <form @submit.prevent="handleSubmit" class="form">
8
- <div class="form-group">
9
- <label for="dept-name">Department Name</label>
10
- <input
11
- id="dept-name"
12
- v-model="form.name"
13
- type="text"
14
- required
15
- placeholder="e.g. Engineering"
16
- />
17
- </div>
18
- <div class="form-group">
19
- <label for="dept-code">Department Code</label>
20
- <input
21
- id="dept-code"
22
- v-model="form.code"
23
- type="text"
24
- required
25
- placeholder="e.g. ENG"
26
- />
27
- </div>
28
- <button type="submit" class="btn btn-primary">Add Department</button>
29
- </form>
30
- </section>
31
-
32
- <section class="card table-card">
33
- <h3>Department List</h3>
34
- <div class="table-wrapper">
35
- <table>
36
- <thead>
37
- <tr>
38
- <th>ID</th>
39
- <th>Name</th>
40
- <th>Code</th>
41
- <th>Action</th>
42
- </tr>
43
- </thead>
44
- <tbody>
45
- <tr v-if="companyStore.departments.length === 0">
46
- <td colspan="4" class="empty">No departments found</td>
47
- </tr>
48
- <tr v-for="dept in companyStore.departments" :key="dept.id">
49
- <td>{{ dept.id }}</td>
50
- <td>{{ dept.name }}</td>
51
- <td><code>{{ dept.code }}</code></td>
52
- <td>
53
- <button @click="handleDelete(dept.id)" class="btn btn-danger">Delete</button>
54
- </td>
55
- </tr>
56
- </tbody>
57
- </table>
58
- </div>
59
- </section>
60
- </div>
61
- </template>
62
-
63
- <script setup>
64
- import { reactive, onMounted } from 'vue'
65
- import { useCompanyStore } from '../stores/companyStore'
66
-
67
- const companyStore = useCompanyStore()
68
-
69
- const form = reactive({
70
- name: '',
71
- code: ''
72
- })
73
-
74
- const handleSubmit = async () => {
75
- await companyStore.addDepartment({
76
- name: form.name,
77
- code: form.code
78
- })
79
- form.name = ''
80
- form.code = ''
81
- }
82
-
83
- const handleDelete = async (id) => {
84
- await companyStore.deleteDepartment(id)
85
- }
86
-
87
- onMounted(() => {
88
- companyStore.fetchDepartments()
89
- })
90
- </script>
91
-
92
- <style scoped>
93
- .department-view h2 {
94
- font-size: 22px;
95
- margin-bottom: 20px;
96
- color: #1a1a1a;
97
- }
98
-
99
- .card {
100
- background: #ffffff;
101
- border: 1px solid #e1e4e8;
102
- border-radius: 8px;
103
- padding: 20px;
104
- margin-bottom: 24px;
105
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
106
- }
107
-
108
- .card h3 {
109
- font-size: 16px;
110
- margin-bottom: 16px;
111
- color: #333333;
112
- }
113
-
114
- .form {
115
- display: flex;
116
- flex-direction: column;
117
- gap: 12px;
118
- max-width: 400px;
119
- }
120
-
121
- .form-group {
122
- display: flex;
123
- flex-direction: column;
124
- gap: 4px;
125
- }
126
-
127
- .form-group label {
128
- font-size: 13px;
129
- font-weight: 600;
130
- color: #444444;
131
- }
132
-
133
- .form-group input {
134
- padding: 8px 10px;
135
- border: 1px solid #cccccc;
136
- border-radius: 4px;
137
- font-size: 14px;
138
- }
139
-
140
- .form-group input:focus {
141
- outline: none;
142
- border-color: #0066cc;
143
- }
144
-
145
- .btn {
146
- padding: 8px 14px;
147
- border: none;
148
- border-radius: 4px;
149
- cursor: pointer;
150
- font-size: 13px;
151
- font-weight: 600;
152
- }
153
-
154
- .btn-primary {
155
- background-color: #0066cc;
156
- color: #ffffff;
157
- align-self: flex-start;
158
- }
159
-
160
- .btn-primary:hover {
161
- background-color: #0052a3;
162
- }
163
-
164
- .btn-danger {
165
- background-color: #d9383a;
166
- color: #ffffff;
167
- padding: 4px 8px;
168
- font-size: 12px;
169
- }
170
-
171
- .btn-danger:hover {
172
- background-color: #b8282a;
173
- }
174
-
175
- .table-wrapper {
176
- overflow-x: auto;
177
- }
178
-
179
- table {
180
- width: 100%;
181
- border-collapse: collapse;
182
- font-size: 13px;
183
- }
184
-
185
- th, td {
186
- text-align: left;
187
- padding: 8px 10px;
188
- border-bottom: 1px solid #eeeeee;
189
- }
190
-
191
- th {
192
- background-color: #fafbfc;
193
- color: #555555;
194
- font-weight: 600;
195
- }
196
-
197
- code {
198
- background: #f0f0f0;
199
- padding: 2px 4px;
200
- border-radius: 3px;
201
- font-size: 12px;
202
- }
203
-
204
- .empty {
205
- text-align: center;
206
- color: #888888;
207
- padding: 16px;
208
- }
209
- </style>
1
+ <template>
2
+ <div class="department-view">
3
+ <h2>Departments Management</h2>
4
+
5
+ <section class="card">
6
+ <h3>Add Department</h3>
7
+ <form @submit.prevent="handleSubmit" class="form">
8
+ <div class="form-group">
9
+ <label for="dept-name">Department Name</label>
10
+ <input
11
+ id="dept-name"
12
+ v-model="form.name"
13
+ type="text"
14
+ required
15
+ placeholder="e.g. Engineering"
16
+ />
17
+ </div>
18
+ <div class="form-group">
19
+ <label for="dept-code">Department Code</label>
20
+ <input
21
+ id="dept-code"
22
+ v-model="form.code"
23
+ type="text"
24
+ required
25
+ placeholder="e.g. ENG"
26
+ />
27
+ </div>
28
+ <button type="submit" class="btn btn-primary">Add Department</button>
29
+ </form>
30
+ </section>
31
+
32
+ <section class="card table-card">
33
+ <h3>Department List</h3>
34
+ <div class="table-wrapper">
35
+ <table>
36
+ <thead>
37
+ <tr>
38
+ <th>ID</th>
39
+ <th>Name</th>
40
+ <th>Code</th>
41
+ <th>Action</th>
42
+ </tr>
43
+ </thead>
44
+ <tbody>
45
+ <tr v-if="companyStore.departments.length === 0">
46
+ <td colspan="4" class="empty">No departments found</td>
47
+ </tr>
48
+ <tr v-for="dept in companyStore.departments" :key="dept.id">
49
+ <td>{{ dept.id }}</td>
50
+ <td>{{ dept.name }}</td>
51
+ <td><code>{{ dept.code }}</code></td>
52
+ <td>
53
+ <button @click="handlePatchDepartment(dept.id, dept.code)" class="btn btn-warning">Patch</button>
54
+ <button @click="handleDelete(dept.id)" class="btn btn-danger">Delete</button>
55
+ </td>
56
+ </tr>
57
+ </tbody>
58
+ </table>
59
+ </div>
60
+ </section>
61
+ </div>
62
+ </template>
63
+
64
+ <script setup>
65
+ import { reactive, onMounted } from 'vue'
66
+ import { useCompanyStore } from '../stores/companyStore'
67
+
68
+ const companyStore = useCompanyStore()
69
+
70
+ const form = reactive({
71
+ name: '',
72
+ code: ''
73
+ })
74
+
75
+ const handleSubmit = async () => {
76
+ await companyStore.addDepartment({
77
+ name: form.name,
78
+ code: form.code
79
+ })
80
+ form.name = ''
81
+ form.code = ''
82
+ }
83
+
84
+ const handleDelete = async (id) => {
85
+ await companyStore.deleteDepartment(id)
86
+ }
87
+
88
+ const handlePatchDepartment = async (id, code) => {
89
+ const newCode = prompt('New code:', code)
90
+ if (newCode) {
91
+ await companyStore.patchDepartment(id, { code: newCode })
92
+ }
93
+ }
94
+
95
+ onMounted(() => {
96
+ companyStore.fetchDepartments()
97
+ })
98
+ </script>
99
+
100
+ <style scoped>
101
+ .department-view h2 {
102
+ font-size: 22px;
103
+ margin-bottom: 20px;
104
+ color: #1a1a1a;
105
+ }
106
+
107
+ .card {
108
+ background: #ffffff;
109
+ border: 1px solid #e1e4e8;
110
+ border-radius: 8px;
111
+ padding: 20px;
112
+ margin-bottom: 24px;
113
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
114
+ }
115
+
116
+ .card h3 {
117
+ font-size: 16px;
118
+ margin-bottom: 16px;
119
+ color: #333333;
120
+ }
121
+
122
+ .form {
123
+ display: flex;
124
+ flex-direction: column;
125
+ gap: 12px;
126
+ max-width: 400px;
127
+ }
128
+
129
+ .form-group {
130
+ display: flex;
131
+ flex-direction: column;
132
+ gap: 4px;
133
+ }
134
+
135
+ .form-group label {
136
+ font-size: 13px;
137
+ font-weight: 600;
138
+ color: #444444;
139
+ }
140
+
141
+ .form-group input {
142
+ padding: 8px 10px;
143
+ border: 1px solid #cccccc;
144
+ border-radius: 4px;
145
+ font-size: 14px;
146
+ }
147
+
148
+ .form-group input:focus {
149
+ outline: none;
150
+ border-color: #0066cc;
151
+ }
152
+
153
+ .btn {
154
+ padding: 8px 14px;
155
+ border: none;
156
+ border-radius: 4px;
157
+ cursor: pointer;
158
+ font-size: 13px;
159
+ font-weight: 600;
160
+ }
161
+
162
+ .btn-primary {
163
+ background-color: #0066cc;
164
+ color: #ffffff;
165
+ align-self: flex-start;
166
+ }
167
+
168
+ .btn-primary:hover {
169
+ background-color: #0052a3;
170
+ }
171
+
172
+ .btn-danger {
173
+ background-color: #d9383a;
174
+ color: #ffffff;
175
+ padding: 4px 8px;
176
+ font-size: 12px;
177
+ }
178
+
179
+ .btn-danger:hover {
180
+ background-color: #b8282a;
181
+ }
182
+
183
+ .btn-warning {
184
+ background-color: #f0ad4e;
185
+ color: #ffffff;
186
+ padding: 4px 8px;
187
+ font-size: 12px;
188
+ margin-right: 6px;
189
+ }
190
+
191
+ .btn-warning:hover {
192
+ background-color: #ec971f;
193
+ }
194
+
195
+ .table-wrapper {
196
+ overflow-x: auto;
197
+ }
198
+
199
+ table {
200
+ width: 100%;
201
+ border-collapse: collapse;
202
+ font-size: 13px;
203
+ }
204
+
205
+ th, td {
206
+ text-align: left;
207
+ padding: 8px 10px;
208
+ border-bottom: 1px solid #eeeeee;
209
+ }
210
+
211
+ th {
212
+ background-color: #fafbfc;
213
+ color: #555555;
214
+ font-weight: 600;
215
+ }
216
+
217
+ code {
218
+ background: #f0f0f0;
219
+ padding: 2px 4px;
220
+ border-radius: 3px;
221
+ font-size: 12px;
222
+ }
223
+
224
+ .empty {
225
+ text-align: center;
226
+ color: #888888;
227
+ padding: 16px;
228
+ }
229
+ </style>