diff --git a/front_vue/src/components/Board.vue b/front_vue/src/components/Board.vue index a058063..d56fb69 100644 --- a/front_vue/src/components/Board.vue +++ b/front_vue/src/components/Board.vue @@ -434,8 +434,6 @@ defineExpose({ saveTask, deleteTask, archiveTask }) -ms-overflow-style: none; /* Предотвращаем системные жесты (pull-to-refresh) */ overscroll-behavior: contain; - /* Разрешаем и горизонтальный и вертикальный pan - колонки внутри скроллятся вертикально */ - touch-action: pan-x pan-y; } .board.mobile .columns::-webkit-scrollbar { diff --git a/front_vue/src/components/Column.vue b/front_vue/src/components/Column.vue index a6fc421..3a2a0cc 100644 --- a/front_vue/src/components/Column.vue +++ b/front_vue/src/components/Column.vue @@ -142,17 +142,33 @@ const handleDrop = (e) => { .column.mobile { width: 100vw; min-width: 100vw; - height: 100%; - max-height: none; + /* Высота по контенту, но ограничена доступным пространством */ + height: fit-content; + max-height: calc(100% - 20px); padding: 0 16px; scroll-snap-align: start; scroll-snap-stop: always; flex-shrink: 0; + /* Вертикальный скролл на уровне колонки - убирает вложенные скроллы */ + overflow-y: auto; + overflow-x: hidden; +} + +/* Скрываем скроллбар в мобильной версии - пользователи свайпают пальцем */ +.column.mobile { + scrollbar-width: none; + -ms-overflow-style: none; +} + +.column.mobile::-webkit-scrollbar { + display: none; } .column.mobile .cards { - max-height: calc(100vh - 320px); - overflow-y: auto; + /* Без overflow - скролл на уровне .column */ + max-height: none; + overflow: visible; + min-height: auto; } .column.drag-over .cards { diff --git a/front_vue/src/components/ProjectPanel.vue b/front_vue/src/components/ProjectPanel.vue index c4e0d64..425843c 100644 --- a/front_vue/src/components/ProjectPanel.vue +++ b/front_vue/src/components/ProjectPanel.vue @@ -772,6 +772,13 @@ const handleSave = async () => { try { if (isNew.value) { + // Проверяем что у всех колонок есть имена + const emptyColumnNew = form.value.columns.find(c => !c.name_columns?.trim()) + if (emptyColumnNew) { + toast.error('Укажите название для всех колонок') + return + } + // Проверяем что у всех отделов есть имена (для нового проекта тоже) const emptyDeptNew = form.value.departments.find(d => !d.name_departments?.trim()) if (emptyDeptNew) { @@ -826,6 +833,13 @@ const handleSave = async () => { } } else { // Редактирование проекта + // Проверяем что у всех колонок есть имена + const emptyColumn = form.value.columns.find(c => !c.name_columns?.trim()) + if (emptyColumn) { + toast.error('Укажите название для всех колонок') + return + } + // Обновляем название если изменилось if (form.value.name !== initialForm.value.name) { await store.updateProject(props.project.id, form.value.name) diff --git a/front_vue/src/components/ui/SelectDropdown.vue b/front_vue/src/components/ui/SelectDropdown.vue index 8091119..8320470 100644 --- a/front_vue/src/components/ui/SelectDropdown.vue +++ b/front_vue/src/components/ui/SelectDropdown.vue @@ -9,6 +9,7 @@ :alt="selectedOption.label" class="option-avatar" > + {{ selectedOption.label[0] }} {{ selectedOption?.label || placeholder }} @@ -54,6 +55,7 @@ :alt="option.label" class="option-avatar" > + {{ (option.label || '?')[0] }}
{{ option.label }} - -
+ + {{ (option.label || '?')[0] }} +
{{ option.label }} { border-top: 1px solid rgba(255, 255, 255, 0.06); } -/* Transition — плавное появление */ +/* Transition — выезд справа для десктопа */ .panel-enter-active, .panel-leave-active { - transition: opacity 0.2s ease; + transition: opacity 0.25s ease; } .panel-enter-active .panel, .panel-leave-active .panel { - transition: opacity 0.2s ease, transform 0.2s ease; + transition: transform 0.25s ease; } .panel-enter-from, @@ -334,8 +334,7 @@ onUnmounted(() => { .panel-enter-from .panel, .panel-leave-to .panel { - opacity: 0; - transform: scale(0.98); + transform: translateX(100%); } /* На мобильных убираем transform из анимации - он ломает layout в iOS PWA */ diff --git a/taskboard.sql b/taskboard.sql index 09fa22f..c345820 100644 --- a/taskboard.sql +++ b/taskboard.sql @@ -11,7 +11,7 @@ Target Server Version : 90200 (9.2.0) File Encoding : 65001 - Date: 18/01/2026 17:17:50 + Date: 20/01/2026 10:20:56 */ SET NAMES utf8mb4; @@ -30,7 +30,7 @@ CREATE TABLE `accounts` ( `avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `telegram` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for accounts_session @@ -45,7 +45,7 @@ CREATE TABLE `accounts_session` ( `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 101 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 137 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for cards_task @@ -69,7 +69,7 @@ CREATE TABLE `cards_task` ( `id_project` int NULL DEFAULT NULL, `create_id_account` int NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 64 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 103 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for columns @@ -82,7 +82,7 @@ CREATE TABLE `columns` ( `id_project` int NULL DEFAULT NULL, `id_order` int NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 62 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 158 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for comments @@ -97,7 +97,7 @@ CREATE TABLE `comments` ( `date_create` datetime NULL DEFAULT NULL, `file_img` json NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for departments @@ -108,8 +108,9 @@ CREATE TABLE `departments` ( `name_departments` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `color` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `id_project` int NULL DEFAULT NULL, + `order_id` int NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 44 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for labels @@ -134,7 +135,7 @@ CREATE TABLE `project` ( `id_ready` int NULL DEFAULT NULL, `id_admin` json NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for project_invites @@ -152,7 +153,7 @@ CREATE TABLE `project_invites` ( PRIMARY KEY (`id`) USING BTREE, INDEX `idx_to_user`(`id_to_user` ASC, `status` ASC) USING BTREE, INDEX `idx_project`(`id_project` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for project_members @@ -169,6 +170,6 @@ CREATE TABLE `project_members` ( UNIQUE INDEX `unique_member`(`id_project` ASC, `id_user` ASC) USING BTREE, INDEX `idx_project`(`id_project` ASC) USING BTREE, INDEX `idx_user`(`id_user` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;