@@ -21,7 +21,7 @@
import HeaderComponent from '../bars/HeaderComponent.vue';
-import ProjectSidebarComponent from '../bars/ProjectSidebarComponent.vue';
+import SidebarComponent from '../bars/SidebarComponent.vue';
import ProcurementsItemComponent from '../material/ProcurementsItemComponent.vue';
import axios from 'axios';
-import { useCookies } from '@/src/js/useCookies';
+import {clearAllCookies, useCookies} from '@/src/js/useCookies';
const { getProjectId, getProjectName } = useCookies();
export default {
components: {
HeaderComponent,
- ProjectSidebarComponent,
+ SidebarComponent,
ProcurementsItemComponent,
},
data() {
@@ -69,7 +69,7 @@ export default {
// this.$router.push({ path: `/material-details/${materialId}` });
},
deleteMaterial(materialId) {
- this.materials = this.materials.filter(material => material.id !== materialId);
+ this.procurements = this.procurements.filter(material => material.materialId !== materialId);
},
async fetchStageData() {
try {
@@ -88,6 +88,11 @@ export default {
}));
console.log(this.procurements);
} catch (error) {
+ if(error.response.status === 401){
+ this.$store.commit('removeUsers'); // Изменяем состояние
+ clearAllCookies();
+ this.$router.push("/login");
+ }
console.error('Ошибка при загрузке Закупок:', error);
}
}
@@ -107,7 +112,7 @@ export default {
.content {
display: flex;
margin-left: 150px;
- padding-top: 60px;
+ padding-top: 30px;
}
.purchases-container {
@@ -137,14 +142,15 @@ export default {
.add-button {
margin-top: 10px;
padding: 10px;
- background-color: #007bff;
+ background-color: #625b71;
color: white;
border: none;
cursor: pointer;
margin-left: auto;
+ border-radius: 15px;
}
.materials-list {
margin-top: 20px;
}
-
\ No newline at end of file
+
diff --git a/frontend/src/src/components/message/AddContactPage.vue b/frontend/src/src/components/message/AddContactPage.vue
index 2bcdedd..f0633dd 100644
--- a/frontend/src/src/components/message/AddContactPage.vue
+++ b/frontend/src/src/components/message/AddContactPage.vue
@@ -34,7 +34,7 @@
import HeaderComponent from '../bars/HeaderComponent.vue';
import SidebarComponent from '../bars/SidebarComponent.vue';
import axios from 'axios';
-import { useCookies } from '@/src/js/useCookies';
+import {clearAllCookies, useCookies} from '@/src/js/useCookies';
const { getProjectId } = useCookies();
@@ -61,19 +61,41 @@ export default {
async searchUsers() {
this.users = [];
try {
- console.log(this.lastname);
- const response = await axios.get(`/api/auth/get_user/${this.lastname}`);
- // console.log(response.data);
- this.users.push(response.data);
- // this.users = Object.values(response.data).map(user => ({
- // name: user.name,
- // lastname: user.lastname,
- // middlename: user.middlename,
- // id: user.id,
- // role: user.role,
- // }));
- console.log(this.users);
+ const params = new URLSearchParams({
+ });
+
+ if (this.selectedRole) {
+ params.append('role', this.selectedRole);
+ }
+ if(this.name){
+ params.append('name', this.name);
+ }
+ if (this.middelname) {
+ params.append('middlename', this.middelname);
+ }
+ if(this.lastname){
+ params.append('lastname', this.lastname);
+ }
+ // console.log(params.toString());
+ // console.log(this.lastname);
+ // console.log(`/api/user/find/?${params.toString()}`);
+ const response = await axios.get(`/api/user/find/?${params.toString()}`);
+ // console.log("это дата",response.data);
+ // this.users.push(response.data);
+ this.users = Object.values(response.data).map(user => ({
+ name: user.name,
+ lastname: user.lastname,
+ middlename: user.middlename,
+ id: user.id,
+ role: user.role,
+ }));
+ // console.log(this.users);
} catch (error) {
+ if(error.response.status === 401){
+ this.$store.commit('removeUsers'); // Изменяем состояние
+ clearAllCookies();
+ this.$router.push("/login");
+ }
console.error('Ошибка при загрузке контактов:', error);
if (error.response && error.response.data.detail) {
this.errorMessage = error.response.data.detail;
@@ -97,6 +119,16 @@ export default {
alert(`Пользователь ${user.lastname} ${user.name} ${user.middlename} добавлен в контакты`);
this.$router.push(`/project`);
} catch (error) {
+ if(error.response.status === 401){
+ this.$store.commit('removeUsers'); // Изменяем состояние
+ clearAllCookies();
+ this.$router.push("/login");
+ }
+ if(error.response.status === 400){
+ if (confirm(`Не удалось добавить {user.lastname} ${user.name} ${user.middlename} в контакты. Убедитесь что он уже не добавлен. Хотите вернуться к задаче?`)) {
+ this.$router.push(`/project`);
+ }
+ }
console.error("Ошибка сети:", error.message);
if (error.response && error.response.data.detail) {
this.errorMessage = error.response.data.detail;
@@ -137,7 +169,7 @@ export default {
}
.input-field:focus {
- border-color: #007BFF;
+ border-color: #625b71;
outline: none;
}
@@ -150,7 +182,7 @@ export default {
}
.select-field:focus {
- border-color: #007BFF;
+ border-color: #625b71;
outline: none;
}
@@ -174,7 +206,7 @@ export default {
}
.user-item button {
- background-color: #007BFF;
+ background-color: #625b71;
color: #fff;
border: none;
padding: 6px 12px;
@@ -184,11 +216,11 @@ export default {
}
.user-item button:hover {
- background-color: #0056b3;
+ background-color: #625b71;
}
.search-filters button {
- background-color: #007BFF;
+ background-color: #625b71;
color: #fff;
padding: 8px 15px;
font-size: 16px;
@@ -199,7 +231,7 @@ export default {
}
.search-filters button:hover {
- background-color: #0056b3;
+ background-color: #625b71;
transform: scale(1.05);
}
diff --git a/frontend/src/src/components/message/AddWorkerNewPage.vue b/frontend/src/src/components/message/AddWorkerNewPage.vue
new file mode 100644
index 0000000..94b5bfc
--- /dev/null
+++ b/frontend/src/src/components/message/AddWorkerNewPage.vue
@@ -0,0 +1,210 @@
+
+
+
+
+
Поиск пользователя
+
+
+
+
+
+
+
+
+
+
+
+
{{ user.username }}
+
Должность - {{ user.role }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/src/components/message/AddWorkerPage.vue b/frontend/src/src/components/message/AddWorkerPage.vue
new file mode 100644
index 0000000..f8d2b24
--- /dev/null
+++ b/frontend/src/src/components/message/AddWorkerPage.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
Поиск пользователя
+
+
+
+
+
+
+
+
+
+
+
+
{{ user.username }}
+
Должность - {{ user.role }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/src/components/message/ChatPage.vue b/frontend/src/src/components/message/ChatPage.vue
index 47bc5c6..81b1cb5 100644
--- a/frontend/src/src/components/message/ChatPage.vue
+++ b/frontend/src/src/components/message/ChatPage.vue
@@ -37,7 +37,7 @@
import HeaderComponent from '../bars/HeaderComponent.vue';
import SidebarComponent from '../bars/SidebarComponent.vue';
import axios from 'axios';
-import { useCookies } from '@/src/js/useCookies';
+import {clearAllCookies, useCookies} from '@/src/js/useCookies';
const { getReceiverId, getChatName,getChatId,getUserId } = useCookies();
export default {
@@ -52,43 +52,8 @@ export default {
newMessage: '',
errorMessage: '',
messages: [
- /*{
- text: "Как обстоят дела с ремонтом, когда завершите?",
- date: new Date("2024-10-03T21:37:00"),
- sender: "other",
- status: "read"
- },
- {
- text: "Работаем, но возникли задержки с поставками материалов. Без них продолжить не можем.",
- date: new Date("2024-10-03T21:38:00"),
- sender: "self",
- status: "read"
- },
- {
- text: "Опять? Это уже третья неделя идёт!",
- date: new Date("2024-10-03T21:39:00"),
- sender: "other",
- status: "read"
- },
- {
- text: "К сожалению, задержки по вине поставщика. Мы делаем всё возможное на нашем уровне.",
- date: new Date("2024-10-03T21:40:00"),
- sender: "self",
- status: "read"
- },
- {
- text: "Хорошо, но постарайтесь уложиться в сроки. Ещё неделя – и начнутся проблемы.",
- date: new Date("2024-10-03T21:41:00"),
- sender: "other",
- status: "read"
- },
- {
- text: "Приложим максимум усилий, однако если материалы вновь задержатся, это не будет зависеть от нас.",
- date: new Date("2024-10-03T21:42:00"),
- sender: "self",
- status: "unread"
- }*/
- ]
+ ],
+ socket: null
};
},
computed: {
@@ -97,6 +62,41 @@ export default {
}
},
methods: {
+ async connectWebSocket() {
+ if (!this.chatId) return;
+
+ this.socket = new WebSocket(`ws://localhost:8080/api/message/chat/${this.chatId}`); // Замените на ваш WebSocket URL
+ this.socket.onopen = () => console.log('WebSocket соединение установлено'); // Логируем успешное подключение
+ this.socket.onopen = () => {
+ console.log("WebSocket подключен.");
+ };
+
+ this.socket.onmessage = (event) => {
+ const message = JSON.parse(event.data);
+ console.log("hfghfh");
+ // Обновляем сообщения
+ this.messages.push({
+ text: message.content,
+ date: message.timestamp,
+ status: message.status,
+ sender: message.sender === getUserId() ? "self" : "other",
+ });
+
+ this.$nextTick(() => this.scrollToBottom());
+ };
+
+ this.socket.onerror = (error) => {
+ console.error("WebSocket ошибка:", error);
+ };
+
+ this.socket.onclose = () => {
+ console.log("WebSocket отключен.");
+ setTimeout(() => {
+ // Попытка переподключения
+ this.connectWebSocket();
+ }, 5000);
+ };
+ },
async fetchChat() {
this.chatId = getChatId();
if(!this.chatId){
@@ -120,10 +120,18 @@ export default {
status: message.status,
sender: message.sender === getUserId() ? "self" : "other"
}));
+ console.log("вызываю сокет");
+ await this.connectWebSocket(); // Подключаем WebSocket после загрузки чата
} catch (error) {
+ if(error.response.status === 401){
+ this.$store.commit('removeUsers'); // Изменяем состояние
+ clearAllCookies();
+ this.$router.push("/login");
+ }
this.errorMessage = error;
console.error('Ошибка при загрузке чата:', error);
}
+
}
},
async sendMessage() {
@@ -133,6 +141,7 @@ export default {
id_receiver: getReceiverId(),
content: this.newMessage
};
+ this.newMessage = "";
// console.log(this.messages.length);
try {
const res = await axios.post(`/api/message/create_chat`, dataToSend, {
@@ -153,6 +162,11 @@ export default {
});
}
} catch (error) {
+ if(error.response.status === 401){
+ this.$store.commit('removeUsers'); // Изменяем состояние
+ clearAllCookies();
+ this.$router.push("/login");
+ }
this.errorMessage = error;
console.error("Ошибка сети:", error.message);
if (error.response && error.response.data.detail) {
@@ -168,8 +182,12 @@ export default {
receiver: getReceiverId(),
content: this.newMessage
};
+ this.newMessage = "";
// console.log(dataToSend);
try {
+ if (this.socket && this.socket.readyState === WebSocket.OPEN) {
+ this.socket.send(JSON.stringify(dataToSend));
+ }
const res = await axios.post(`/api/message/create_message`, dataToSend, {
headers: {
'Content-Type': 'application/json',
@@ -183,8 +201,12 @@ export default {
sender: res.data.sender === getUserId() ? "self" : "other",
status: res.data.status,
});
- this.newMessage = "";
} catch (error) {
+ if(error.response.status === 401){
+ this.$store.commit('removeUsers'); // Изменяем состояние
+ clearAllCookies();
+ this.$router.push("/login");
+ }
this.errorMessage = error;
console.error("Ошибка сети:", error.message);
if (error.response && error.response.data.detail) {
@@ -205,6 +227,11 @@ export default {
beforeMount() {
this.fetchChat();
},
+ beforeUnmount() {
+ if (this.socket) {
+ this.socket.close();
+ }
+ },
};
diff --git a/frontend/src/src/components/message/MessagesPage.vue b/frontend/src/src/components/message/MessagesPage.vue
index 1bc100b..3d263d0 100644
--- a/frontend/src/src/components/message/MessagesPage.vue
+++ b/frontend/src/src/components/message/MessagesPage.vue
@@ -30,7 +30,7 @@
import HeaderComponent from '../bars/HeaderComponent.vue';
import SidebarComponent from '../bars/SidebarComponent.vue';
import axios from 'axios';
- import { useCookies } from '@/src/js/useCookies';
+ import {clearAllCookies, useCookies} from '@/src/js/useCookies';
const { getUserId,setChatId,setChatName,setReceiverId } = useCookies();
export default {
components: {
@@ -75,6 +75,11 @@
);
console.log(this.chats);
} catch (error) {
+ if(error.response.status === 401){
+ this.$store.commit('removeUsers'); // Изменяем состояние
+ clearAllCookies();
+ this.$router.push("/login");
+ }
console.error('Ошибка при загрузке чатов:', error);
}
},
@@ -105,6 +110,20 @@
background-color: #fff;
padding: 10px 20px;
}
+
+ button {
+ padding: 8px 12px;
+ background-color: #625b71;
+ color: white;
+ border: none;
+ border-radius: 15px;
+ cursor: pointer;
+ margin-right: 15px;
+}
+
+button:hover {
+ background-color: #4f416d;
+}
.search-input {
width: 300px;
diff --git a/frontend/src/src/components/message/UserSearchPage.vue b/frontend/src/src/components/message/UserSearchPage.vue
index 37dad27..dc94fb8 100644
--- a/frontend/src/src/components/message/UserSearchPage.vue
+++ b/frontend/src/src/components/message/UserSearchPage.vue
@@ -2,6 +2,17 @@
+
Данные приложения
+
Поиск пользователя
@@ -25,6 +36,7 @@
+
@@ -34,10 +46,9 @@
import HeaderComponent from '../bars/HeaderComponent.vue';
import SidebarComponent from '../bars/SidebarComponent.vue';
import axios from 'axios';
-import { useCookies } from '@/src/js/useCookies';
+import {clearAllCookies, useCookies} from '@/src/js/useCookies';
const { setReceiverId, setChatName, setChatId } = useCookies();
-
export default {
components: {
HeaderComponent,
@@ -45,6 +56,7 @@ export default {
},
data() {
return {
+ jsonData:[],
lastname: '',
name: '',
middelname: '',
@@ -53,23 +65,147 @@ export default {
],
};
},
+ computed: {
+ userRole() {
+ const user = this.$store.getters.getUser[0];
+ return user ? user.role : null;
+ },
+ },
methods: {
+ triggerFileInput() {
+ this.$refs.fileInput.click();
+ },
+ async importBD(event) {
+ const file = event.target.files[0];
+ if (!file) {
+ alert("Файл не выбран!");
+ return;
+ }
+
+ const reader = new FileReader();
+
+ reader.onload = async (e) => {
+ try {
+ const importedData = JSON.parse(e.target.result);
+
+ // Проверяем наличие поля `users` и его содержимого
+ if (!importedData.user || !Array.isArray(importedData.user) || importedData.user.length === 0) {
+ throw new Error("Коллекция `user` должна существовать и содержать данные!");
+ }
+
+ const formData = new FormData();
+ formData.append("file", file);
+
+ // Удаляем `Content-Type` из заголовков, так как браузер сам установит правильный
+ try {
+ const res = await axios.post(`api/data/import`, formData, {
+ headers: {
+ "Content-Type": "multipart/form-data",
+ },
+ withCredentials: true,
+ });
+ console.log(res);
+ this.showErrors = false;
+ alert('Данные успешно импортированы!');
+ } catch (error) {
+ if (error.response && error.response.status === 401) {
+ this.$store.commit('removeUsers'); // Изменяем состояние
+ clearAllCookies();
+ this.$router.push("/login");
+ }
+ if (error.response && error.response.status === 400) {
+ alert('Бд не пуста');
+ }
+ console.error("Ошибка сети:", error);
+ if (error.response && error.response.data.detail) {
+ this.errorMessage = error.response.data.detail;
+ }
+ }
+ } catch (error) {
+ console.error("Ошибка импорта:", error);
+ alert(error.message || "Произошла ошибка при импорте данных.");
+ }
+ };
+
+ reader.onerror = () => {
+ alert("Ошибка чтения файла!");
+ };
+
+ reader.readAsText(file);
+ },
+ async exportBD() {
+ try {
+ const response = await axios.get(`api/data/export/json`);
+ this.jsonData = response.data;
+ } catch (error) {
+ if (error.response?.status === 401) {
+ this.$store.commit('removeUsers');
+ clearAllCookies();
+ this.$router.push("/login");
+ }
+ console.error('Ошибка при загрузке контактов:', error);
+ if (error.response?.data?.detail) {
+ this.errorMessage = error.response.data.detail;
+ }
+ return;
+ }
+
+ console.log(this.jsonData);
+
+ if (Object.keys(this.jsonData).length > 0) {
+ // Преобразуем Proxy в обычный объект, если требуется
+ const normalizedData = JSON.parse(JSON.stringify(this.jsonData));
+
+ const json = JSON.stringify(normalizedData, null, 2); // Преобразуем объект в JSON строку
+ const blob = new Blob([json], { type: "application/json" }); // Создаём Blob объект
+ const url = URL.createObjectURL(blob); // Генерируем URL
+
+ // Создаём временный
элемент для скачивания файла
+ const link = document.createElement("a");
+ link.href = url;
+ link.download = `dumpBd.json`; // Имя файла
+ document.body.appendChild(link); // Добавляем в DOM, чтобы клик сработал
+ link.click(); // Программно кликаем по ссылке
+ document.body.removeChild(link); // Удаляем элемент ссылки из DOM
+
+ // Освобождаем память
+ URL.revokeObjectURL(url);
+ } else {
+ alert("У вас нет данных БД, которые можно экспортировать");
+ }
+ },
async searchUsers() {
this.users = [];
try {
- // console.log(this.lastname);
- const response = await axios.get(`/api/auth/get_user/${this.lastname}`);
- // console.log(response.data);
- this.users.push(response.data);
- // this.users = Object.values(response.data).map(user => ({
- // name: user.name,
- // lastname: user.lastname,
- // middlename: user.middlename,
- // id: user.id,
- // role: user.role,
- // }));
- // console.log(this.users);
+ const params = new URLSearchParams({
+ });
+
+ if (this.selectedRole) {
+ params.append('role', this.selectedRole);
+ }
+ if(this.name){
+ params.append('name', this.name);
+ }
+ if (this.middelname) {
+ params.append('middlename', this.middlename);
+ }
+ if(this.lastname){
+ params.append('lastname', this.lastname);
+ }
+ const response = await axios.get(`/api/user/find/?${params.toString()}`);
+ this.users = Object.values(response.data).map(user => ({
+ name: user.name,
+ lastname: user.lastname,
+ middlename: user.middlename,
+ id: user.id,
+ role: user.role,
+ }));
} catch (error) {
+ if(error.response.status === 401){
+ this.$store.commit('removeUsers');
+ clearAllCookies();
+ this.$router.push("/login");
+ }
console.error('Ошибка при загрузке контактов:', error);
if (error.response && error.response.data.detail) {
this.errorMessage = error.response.data.detail;
@@ -92,6 +228,13 @@ export default {
padding-top: 60px;
}
+.header-buttons {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ margin-bottom: 50px;
+}
+
.search-filters {
display: flex;
gap: 15px;
@@ -109,7 +252,7 @@ export default {
}
.input-field:focus {
- border-color: #007BFF;
+ border-color: #625b71;
outline: none;
}
@@ -122,7 +265,7 @@ export default {
}
.select-field:focus {
- border-color: #007BFF;
+ border-color: #625b71;
outline: none;
}
@@ -145,27 +288,28 @@ export default {
gap: 10px;
}
+.header-buttons button,
.user-item button {
- background-color: #007BFF;
+ background-color: #625b71;
color: #fff;
border: none;
padding: 6px 12px;
- border-radius: 5px;
+ border-radius: 15px;
cursor: pointer;
transition: background-color 0.3s;
}
.user-item button:hover {
- background-color: #0056b3;
+ background-color: #625b71;
}
.search-filters button {
- background-color: #007BFF;
+ background-color: #625b71;
color: #fff;
padding: 8px 15px;
font-size: 16px;
border: none;
- border-radius: 5px;
+ border-radius: 15px;
cursor: pointer;
transition: background-color 0.3s, transform 0.2s;
}
diff --git a/frontend/src/src/components/project/ContactsComponent.vue b/frontend/src/src/components/project/ContactsComponent.vue
index 4f41a95..52a49d5 100644
--- a/frontend/src/src/components/project/ContactsComponent.vue
+++ b/frontend/src/src/components/project/ContactsComponent.vue
@@ -2,7 +2,7 @@
+
@@ -18,19 +21,78 @@
@@ -50,12 +112,12 @@ export default {
}
.add-button {
- background-color: #007bff;
+ background-color: #625b71;
color: white;
border: none;
padding: 5px 10px;
cursor: pointer;
- border-radius: 4px;
+ border-radius: 10px;
}
.contacts ul {
@@ -81,4 +143,17 @@ export default {
display: flex;
flex-direction: column;
}
-
+
+.delete-button {
+ background-color: transparent;
+ border: none;
+ cursor: pointer;
+ padding: 5px;
+ margin-left: 10px;
+}
+
+.delete-icon {
+ width: 30px;
+ height: 30px;
+}
+
\ No newline at end of file
diff --git a/frontend/src/src/components/project/NewProjectButton.vue b/frontend/src/src/components/project/NewProjectButton.vue
index 5e9ea22..5140835 100644
--- a/frontend/src/src/components/project/NewProjectButton.vue
+++ b/frontend/src/src/components/project/NewProjectButton.vue
@@ -19,7 +19,7 @@
.create-project-button {
width: 500px; /* Ширина, соответствующая компоненту проекта */
height: 350px; /* Высота, соответствующая компоненту проекта */
- background-color: #007bff; /* Фоновый цвет кнопки */
+ background-color: #625b71; /* Фоновый цвет кнопки */
color: white; /* Цвет текста */
border: 1px solid #ccc;
border-radius: 8px;
@@ -36,7 +36,7 @@
}
.create-project-button:hover {
- background-color: #0056b3; /* Цвет кнопки при наведении */
+ background-color: #615b6d; /* Цвет кнопки при наведении */
}
\ No newline at end of file
diff --git a/frontend/src/src/components/project/NewProjectPage.vue b/frontend/src/src/components/project/NewProjectPage.vue
index 296933c..9910f63 100644
--- a/frontend/src/src/components/project/NewProjectPage.vue
+++ b/frontend/src/src/components/project/NewProjectPage.vue
@@ -1,6 +1,6 @@
-
+
Опишите проект
@@ -17,12 +17,13 @@
@@ -27,9 +55,10 @@
button {
margin: 5px;
padding: 5px 10px;
- background-color: #007bff;
+ background-color: #625b71;
color: white;
border: none;
cursor: pointer;
+ border-radius: 10px;
}
-
\ No newline at end of file
+
diff --git a/frontend/src/src/components/stage/AddStagePage.vue b/frontend/src/src/components/stage/AddStagePage.vue
index dc48975..b9dd026 100644
--- a/frontend/src/src/components/stage/AddStagePage.vue
+++ b/frontend/src/src/components/stage/AddStagePage.vue
@@ -1,7 +1,7 @@
-
+
Добавить этап
@@ -37,15 +37,15 @@
+
+
\ No newline at end of file
diff --git a/frontend/src/src/components/statics/StatisticsPage.vue b/frontend/src/src/components/statics/StatisticsPage.vue
new file mode 100644
index 0000000..a49674b
--- /dev/null
+++ b/frontend/src/src/components/statics/StatisticsPage.vue
@@ -0,0 +1,438 @@
+
+
+
+
+
+
Статистика
+
+
+
+
+
Текущий график {{selectedStatType ==='risks'? "рисков": "закупок"}}
+
+
+
+
Импортированный график {{importType ==='risks'? "рисков": "закупок"}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/src/components/task/TaskAddPage.vue b/frontend/src/src/components/task/TaskAddPage.vue
index 13e7e00..cf4a84c 100644
--- a/frontend/src/src/components/task/TaskAddPage.vue
+++ b/frontend/src/src/components/task/TaskAddPage.vue
@@ -1,19 +1,20 @@
-
+
@@ -31,7 +32,7 @@
@@ -44,13 +45,6 @@
-
-
-
-
-
-
-
{{ errorMessage }}
@@ -58,20 +52,20 @@