1
0

Правки

This commit is contained in:
2026-01-21 12:46:43 +07:00
parent 8e3cd770df
commit 88189a3f04
6 changed files with 88 additions and 30 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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)

View File

@@ -9,6 +9,7 @@
:alt="selectedOption.label"
class="option-avatar"
>
<span v-else-if="selectedOption?.label" class="avatar-placeholder">{{ selectedOption.label[0] }}</span>
<span v-else-if="!selectedOption" class="no-selection-icon"></span>
<span class="selected-label">{{ selectedOption?.label || placeholder }}</span>
</slot>
@@ -54,6 +55,7 @@
:alt="option.label"
class="option-avatar"
>
<span v-else class="avatar-placeholder">{{ (option.label || '?')[0] }}</span>
<div class="option-content">
<span class="option-label">{{ option.label }}</span>
<a
@@ -133,6 +135,7 @@
:alt="option.label"
class="option-avatar"
>
<span v-else class="avatar-placeholder">{{ (option.label || '?')[0] }}</span>
<div class="option-content">
<span class="option-label">{{ option.label }}</span>
<a
@@ -498,11 +501,31 @@ onUpdated(refreshIcons)
.option-avatar {
width: 28px;
height: 28px;
border-radius: 6px;
border-radius: 50%;
object-fit: cover;
flex-shrink: 0;
}
.avatar-placeholder {
width: 28px;
height: 28px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: 600;
color: var(--text-secondary);
background: rgba(255, 255, 255, 0.1);
text-transform: uppercase;
flex-shrink: 0;
}
.dropdown-item.active .avatar-placeholder {
background: rgba(0, 0, 0, 0.15);
color: #000;
}
.option-content {
display: flex;
flex-direction: column;
@@ -703,7 +726,14 @@ onUpdated(refreshIcons)
.mobile-select-item .option-avatar {
width: 40px;
height: 40px;
border-radius: 10px;
border-radius: 50%;
}
.mobile-select-item .avatar-placeholder {
width: 40px;
height: 40px;
border-radius: 50%;
font-size: 16px;
}
.mobile-select-item .option-content {

View File

@@ -316,15 +316,15 @@ onUnmounted(() => {
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 */

View File

@@ -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;