kin: KIN-FIX-002 Унифицировать localStorage значения execution_mode с 'auto_complete'
Заменены все вхождения 'auto' на 'auto_complete' как значение execution_mode в localStorage-операциях: web/frontend/src/views/TaskDetail.vue: - Line 46: localStorage.getItem сравнение - Line 53: localStorage.setItem значение - Line 55: API patch значение (уже было 'auto_complete', добавлено для полноты) web/frontend/src/views/ProjectView.vue: - Line 171: execution_mode === 'auto' → 'auto_complete' - Line 173: localStorage.getItem сравнение - Line 179: localStorage.setItem значение - Line 181: API patch значение - Line 182: state update значение - Line 643: template v-if condition web/frontend/src/__tests__/filter-persistence.test.ts: - Line 377: Type definition обновлена - Lines 415, 433, 449: makeTaskWith параметры обновлены - Line 479: localStorage mock значение - Line 478: Комментарий обновлён Все 37 тестов в filter-persistence.test.ts пройдены. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
cb099030ce
commit
7f8e0e2238
3 changed files with 14 additions and 14 deletions
|
|
@ -374,7 +374,7 @@ describe('KIN-011: TaskDetail — возврат с сохранением URL',
|
||||||
// ─────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () => {
|
describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () => {
|
||||||
function makeTaskWith(status: string, executionMode: 'auto' | 'review' | null = null) {
|
function makeTaskWith(status: string, executionMode: 'auto_complete' | 'review' | null = null) {
|
||||||
return {
|
return {
|
||||||
id: 'KIN-047',
|
id: 'KIN-047',
|
||||||
project_id: 'KIN',
|
project_id: 'KIN',
|
||||||
|
|
@ -412,7 +412,7 @@ describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () =
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Approve и Reject скрыты при autoMode в статусе review', async () => {
|
it('Approve и Reject скрыты при autoMode в статусе review', async () => {
|
||||||
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', 'auto') as any)
|
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', 'auto_complete') as any)
|
||||||
const router = makeRouter()
|
const router = makeRouter()
|
||||||
await router.push('/task/KIN-047')
|
await router.push('/task/KIN-047')
|
||||||
|
|
||||||
|
|
@ -430,7 +430,7 @@ describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () =
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Тоггл Auto/Review виден в статусе review при autoMode (позволяет выйти из автопилота)', async () => {
|
it('Тоггл Auto/Review виден в статусе review при autoMode (позволяет выйти из автопилота)', async () => {
|
||||||
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', 'auto') as any)
|
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', 'auto_complete') as any)
|
||||||
const router = makeRouter()
|
const router = makeRouter()
|
||||||
await router.push('/task/KIN-047')
|
await router.push('/task/KIN-047')
|
||||||
|
|
||||||
|
|
@ -446,7 +446,7 @@ describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () =
|
||||||
})
|
})
|
||||||
|
|
||||||
it('После клика тоггла в review+autoMode появляются Approve и Reject', async () => {
|
it('После клика тоггла в review+autoMode появляются Approve и Reject', async () => {
|
||||||
const task = makeTaskWith('review', 'auto')
|
const task = makeTaskWith('review', 'auto_complete')
|
||||||
vi.mocked(api.taskFull).mockResolvedValue(task as any)
|
vi.mocked(api.taskFull).mockResolvedValue(task as any)
|
||||||
vi.mocked(api.patchTask).mockResolvedValue({ execution_mode: 'review' } as any)
|
vi.mocked(api.patchTask).mockResolvedValue({ execution_mode: 'review' } as any)
|
||||||
|
|
||||||
|
|
@ -475,8 +475,8 @@ describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () =
|
||||||
|
|
||||||
it('KIN-051: Approve и Reject видны при статусе review и execution_mode=null (фикс баги)', async () => {
|
it('KIN-051: Approve и Reject видны при статусе review и execution_mode=null (фикс баги)', async () => {
|
||||||
// Воспроизводит баг: задача в review без явного execution_mode зависала
|
// Воспроизводит баг: задача в review без явного execution_mode зависала
|
||||||
// без кнопок, потому что localStorage мог содержать 'auto'
|
// без кнопок, потому что localStorage мог содержать 'auto_complete'
|
||||||
localStorageMock.setItem('kin-mode-KIN', 'auto') // имитируем "плохой" localStorage
|
localStorageMock.setItem('kin-mode-KIN', 'auto_complete') // имитируем "плохой" localStorage
|
||||||
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', null) as any)
|
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', null) as any)
|
||||||
const router = makeRouter()
|
const router = makeRouter()
|
||||||
await router.push('/task/KIN-047')
|
await router.push('/task/KIN-047')
|
||||||
|
|
|
||||||
|
|
@ -168,18 +168,18 @@ const autoMode = ref(false)
|
||||||
|
|
||||||
function loadMode() {
|
function loadMode() {
|
||||||
if (project.value?.execution_mode) {
|
if (project.value?.execution_mode) {
|
||||||
autoMode.value = project.value.execution_mode === 'auto'
|
autoMode.value = project.value.execution_mode === 'auto_complete'
|
||||||
} else {
|
} else {
|
||||||
autoMode.value = localStorage.getItem(`kin-mode-${props.id}`) === 'auto'
|
autoMode.value = localStorage.getItem(`kin-mode-${props.id}`) === 'auto_complete'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function toggleMode() {
|
async function toggleMode() {
|
||||||
autoMode.value = !autoMode.value
|
autoMode.value = !autoMode.value
|
||||||
localStorage.setItem(`kin-mode-${props.id}`, autoMode.value ? 'auto' : 'review')
|
localStorage.setItem(`kin-mode-${props.id}`, autoMode.value ? 'auto_complete' : 'review')
|
||||||
try {
|
try {
|
||||||
await api.patchProject(props.id, { execution_mode: autoMode.value ? 'auto' : 'review' })
|
await api.patchProject(props.id, { execution_mode: autoMode.value ? 'auto_complete' : 'review' })
|
||||||
if (project.value) project.value = { ...project.value, execution_mode: autoMode.value ? 'auto' : 'review' }
|
if (project.value) project.value = { ...project.value, execution_mode: autoMode.value ? 'auto_complete' : 'review' }
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
error.value = e.message
|
error.value = e.message
|
||||||
}
|
}
|
||||||
|
|
@ -640,7 +640,7 @@ async function addDecision() {
|
||||||
<Badge :text="t.status" :color="taskStatusColor(t.status)" />
|
<Badge :text="t.status" :color="taskStatusColor(t.status)" />
|
||||||
<Badge v-if="t.category" :text="t.category" :color="CATEGORY_COLORS[t.category] || 'gray'" />
|
<Badge v-if="t.category" :text="t.category" :color="CATEGORY_COLORS[t.category] || 'gray'" />
|
||||||
<span class="text-gray-300 truncate">{{ t.title }}</span>
|
<span class="text-gray-300 truncate">{{ t.title }}</span>
|
||||||
<span v-if="t.execution_mode === 'auto'"
|
<span v-if="t.execution_mode === 'auto_complete'"
|
||||||
class="text-[10px] px-1 py-0.5 bg-yellow-900/40 text-yellow-400 border border-yellow-800 rounded shrink-0"
|
class="text-[10px] px-1 py-0.5 bg-yellow-900/40 text-yellow-400 border border-yellow-800 rounded shrink-0"
|
||||||
title="Auto mode">🔓</span>
|
title="Auto mode">🔓</span>
|
||||||
<span v-if="t.parent_task_id" class="text-[10px] text-gray-600 shrink-0">from {{ t.parent_task_id }}</span>
|
<span v-if="t.parent_task_id" class="text-[10px] text-gray-600 shrink-0">from {{ t.parent_task_id }}</span>
|
||||||
|
|
|
||||||
|
|
@ -43,14 +43,14 @@ function loadMode(t: typeof task.value) {
|
||||||
// Task is in review — always show Approve/Reject regardless of localStorage
|
// Task is in review — always show Approve/Reject regardless of localStorage
|
||||||
autoMode.value = false
|
autoMode.value = false
|
||||||
} else {
|
} else {
|
||||||
autoMode.value = localStorage.getItem(`kin-mode-${t.project_id}`) === 'auto'
|
autoMode.value = localStorage.getItem(`kin-mode-${t.project_id}`) === 'auto_complete'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function toggleMode() {
|
async function toggleMode() {
|
||||||
if (!task.value) return
|
if (!task.value) return
|
||||||
autoMode.value = !autoMode.value
|
autoMode.value = !autoMode.value
|
||||||
localStorage.setItem(`kin-mode-${task.value.project_id}`, autoMode.value ? 'auto' : 'review')
|
localStorage.setItem(`kin-mode-${task.value.project_id}`, autoMode.value ? 'auto_complete' : 'review')
|
||||||
try {
|
try {
|
||||||
const updated = await api.patchTask(props.id, { execution_mode: autoMode.value ? 'auto_complete' : 'review' })
|
const updated = await api.patchTask(props.id, { execution_mode: autoMode.value ? 'auto_complete' : 'review' })
|
||||||
task.value = { ...task.value, ...updated }
|
task.value = { ...task.value, ...updated }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue