Правки
This commit is contained in:
@@ -434,8 +434,6 @@ defineExpose({ saveTask, deleteTask, archiveTask })
|
|||||||
-ms-overflow-style: none;
|
-ms-overflow-style: none;
|
||||||
/* Предотвращаем системные жесты (pull-to-refresh) */
|
/* Предотвращаем системные жесты (pull-to-refresh) */
|
||||||
overscroll-behavior: contain;
|
overscroll-behavior: contain;
|
||||||
/* Разрешаем и горизонтальный и вертикальный pan - колонки внутри скроллятся вертикально */
|
|
||||||
touch-action: pan-x pan-y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.board.mobile .columns::-webkit-scrollbar {
|
.board.mobile .columns::-webkit-scrollbar {
|
||||||
|
|||||||
@@ -142,17 +142,33 @@ const handleDrop = (e) => {
|
|||||||
.column.mobile {
|
.column.mobile {
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
min-width: 100vw;
|
min-width: 100vw;
|
||||||
height: 100%;
|
/* Высота по контенту, но ограничена доступным пространством */
|
||||||
max-height: none;
|
height: fit-content;
|
||||||
|
max-height: calc(100% - 20px);
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
scroll-snap-align: start;
|
scroll-snap-align: start;
|
||||||
scroll-snap-stop: always;
|
scroll-snap-stop: always;
|
||||||
flex-shrink: 0;
|
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 {
|
.column.mobile .cards {
|
||||||
max-height: calc(100vh - 320px);
|
/* Без overflow - скролл на уровне .column */
|
||||||
overflow-y: auto;
|
max-height: none;
|
||||||
|
overflow: visible;
|
||||||
|
min-height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.column.drag-over .cards {
|
.column.drag-over .cards {
|
||||||
|
|||||||
@@ -772,6 +772,13 @@ const handleSave = async () => {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if (isNew.value) {
|
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())
|
const emptyDeptNew = form.value.departments.find(d => !d.name_departments?.trim())
|
||||||
if (emptyDeptNew) {
|
if (emptyDeptNew) {
|
||||||
@@ -826,6 +833,13 @@ const handleSave = async () => {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Редактирование проекта
|
// Редактирование проекта
|
||||||
|
// Проверяем что у всех колонок есть имена
|
||||||
|
const emptyColumn = form.value.columns.find(c => !c.name_columns?.trim())
|
||||||
|
if (emptyColumn) {
|
||||||
|
toast.error('Укажите название для всех колонок')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Обновляем название если изменилось
|
// Обновляем название если изменилось
|
||||||
if (form.value.name !== initialForm.value.name) {
|
if (form.value.name !== initialForm.value.name) {
|
||||||
await store.updateProject(props.project.id, form.value.name)
|
await store.updateProject(props.project.id, form.value.name)
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
:alt="selectedOption.label"
|
:alt="selectedOption.label"
|
||||||
class="option-avatar"
|
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 v-else-if="!selectedOption" class="no-selection-icon">—</span>
|
||||||
<span class="selected-label">{{ selectedOption?.label || placeholder }}</span>
|
<span class="selected-label">{{ selectedOption?.label || placeholder }}</span>
|
||||||
</slot>
|
</slot>
|
||||||
@@ -54,6 +55,7 @@
|
|||||||
:alt="option.label"
|
:alt="option.label"
|
||||||
class="option-avatar"
|
class="option-avatar"
|
||||||
>
|
>
|
||||||
|
<span v-else class="avatar-placeholder">{{ (option.label || '?')[0] }}</span>
|
||||||
<div class="option-content">
|
<div class="option-content">
|
||||||
<span class="option-label">{{ option.label }}</span>
|
<span class="option-label">{{ option.label }}</span>
|
||||||
<a
|
<a
|
||||||
@@ -127,13 +129,14 @@
|
|||||||
:class="{ active: isActive(option.value) }"
|
:class="{ active: isActive(option.value) }"
|
||||||
@click="selectOption(option.value)"
|
@click="selectOption(option.value)"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
v-if="option.avatar"
|
v-if="option.avatar"
|
||||||
:src="option.avatar"
|
:src="option.avatar"
|
||||||
:alt="option.label"
|
:alt="option.label"
|
||||||
class="option-avatar"
|
class="option-avatar"
|
||||||
>
|
>
|
||||||
<div class="option-content">
|
<span v-else class="avatar-placeholder">{{ (option.label || '?')[0] }}</span>
|
||||||
|
<div class="option-content">
|
||||||
<span class="option-label">{{ option.label }}</span>
|
<span class="option-label">{{ option.label }}</span>
|
||||||
<a
|
<a
|
||||||
v-if="option.subtitle"
|
v-if="option.subtitle"
|
||||||
@@ -498,11 +501,31 @@ onUpdated(refreshIcons)
|
|||||||
.option-avatar {
|
.option-avatar {
|
||||||
width: 28px;
|
width: 28px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
border-radius: 6px;
|
border-radius: 50%;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
flex-shrink: 0;
|
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 {
|
.option-content {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -703,7 +726,14 @@ onUpdated(refreshIcons)
|
|||||||
.mobile-select-item .option-avatar {
|
.mobile-select-item .option-avatar {
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 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 {
|
.mobile-select-item .option-content {
|
||||||
|
|||||||
@@ -316,15 +316,15 @@ onUnmounted(() => {
|
|||||||
border-top: 1px solid rgba(255, 255, 255, 0.06);
|
border-top: 1px solid rgba(255, 255, 255, 0.06);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Transition — плавное появление */
|
/* Transition — выезд справа для десктопа */
|
||||||
.panel-enter-active,
|
.panel-enter-active,
|
||||||
.panel-leave-active {
|
.panel-leave-active {
|
||||||
transition: opacity 0.2s ease;
|
transition: opacity 0.25s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.panel-enter-active .panel,
|
.panel-enter-active .panel,
|
||||||
.panel-leave-active .panel {
|
.panel-leave-active .panel {
|
||||||
transition: opacity 0.2s ease, transform 0.2s ease;
|
transition: transform 0.25s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.panel-enter-from,
|
.panel-enter-from,
|
||||||
@@ -334,8 +334,7 @@ onUnmounted(() => {
|
|||||||
|
|
||||||
.panel-enter-from .panel,
|
.panel-enter-from .panel,
|
||||||
.panel-leave-to .panel {
|
.panel-leave-to .panel {
|
||||||
opacity: 0;
|
transform: translateX(100%);
|
||||||
transform: scale(0.98);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* На мобильных убираем transform из анимации - он ломает layout в iOS PWA */
|
/* На мобильных убираем transform из анимации - он ломает layout в iOS PWA */
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
Target Server Version : 90200 (9.2.0)
|
Target Server Version : 90200 (9.2.0)
|
||||||
File Encoding : 65001
|
File Encoding : 65001
|
||||||
|
|
||||||
Date: 18/01/2026 17:17:50
|
Date: 20/01/2026 10:20:56
|
||||||
*/
|
*/
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
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,
|
`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,
|
`telegram` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
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
|
-- 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,
|
`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,
|
`user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
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
|
-- Table structure for cards_task
|
||||||
@@ -69,7 +69,7 @@ CREATE TABLE `cards_task` (
|
|||||||
`id_project` int NULL DEFAULT NULL,
|
`id_project` int NULL DEFAULT NULL,
|
||||||
`create_id_account` int NULL DEFAULT NULL,
|
`create_id_account` int NULL DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
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
|
-- Table structure for columns
|
||||||
@@ -82,7 +82,7 @@ CREATE TABLE `columns` (
|
|||||||
`id_project` int NULL DEFAULT NULL,
|
`id_project` int NULL DEFAULT NULL,
|
||||||
`id_order` int NULL DEFAULT NULL,
|
`id_order` int NULL DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
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
|
-- Table structure for comments
|
||||||
@@ -97,7 +97,7 @@ CREATE TABLE `comments` (
|
|||||||
`date_create` datetime NULL DEFAULT NULL,
|
`date_create` datetime NULL DEFAULT NULL,
|
||||||
`file_img` json NULL,
|
`file_img` json NULL,
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
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
|
-- 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,
|
`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,
|
`color` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
|
||||||
`id_project` int NULL DEFAULT NULL,
|
`id_project` int NULL DEFAULT NULL,
|
||||||
|
`order_id` int NULL DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
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
|
-- Table structure for labels
|
||||||
@@ -134,7 +135,7 @@ CREATE TABLE `project` (
|
|||||||
`id_ready` int NULL DEFAULT NULL,
|
`id_ready` int NULL DEFAULT NULL,
|
||||||
`id_admin` json NULL,
|
`id_admin` json NULL,
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
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
|
-- Table structure for project_invites
|
||||||
@@ -152,7 +153,7 @@ CREATE TABLE `project_invites` (
|
|||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
INDEX `idx_to_user`(`id_to_user` ASC, `status` ASC) USING BTREE,
|
INDEX `idx_to_user`(`id_to_user` ASC, `status` ASC) USING BTREE,
|
||||||
INDEX `idx_project`(`id_project` 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
|
-- 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,
|
UNIQUE INDEX `unique_member`(`id_project` ASC, `id_user` ASC) USING BTREE,
|
||||||
INDEX `idx_project`(`id_project` ASC) USING BTREE,
|
INDEX `idx_project`(`id_project` ASC) USING BTREE,
|
||||||
INDEX `idx_user`(`id_user` 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;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user