77 lines
3.3 KiB
Plaintext
77 lines
3.3 KiB
Plaintext
/**
|
||||
|
|
* 家书 FamilyBook · 任务的**写操作**(鸿蒙端)
|
|||
|
|
*
|
|||
|
|
* 对应服务端 `app/ApiHandler.php` 的 `tasks()`:
|
|||
|
|
* POST /api/v1/tasks 新建(title / note / due_at / board_id / status)
|
|||
|
|
* PATCH /api/v1/tasks/<id> 改(标题/备注/截止/看板/负责人/分类)
|
|||
|
|
* POST /api/v1/tasks/<id>/status 改状态(todo / doing / done)
|
|||
|
|
* DELETE /api/v1/tasks/<id> 删
|
|||
|
|
*
|
|||
|
|
* 🔴 用户 2026-10-20:「任务也是一样啊,任务也点不进去,也没法那个完成,
|
|||
|
|
* 新建任务、设置这些东西都这都没有。」
|
|||
|
|
* ⇒ 端上原来这三件事**一件都没接**(按钮没 onTap、列表项没 onClick)。
|
|||
|
|
*
|
|||
|
|
* ⚠️ **状态只走 `/status` 子动作**:服务端 `PATCH /tasks/<id>` 里
|
|||
|
|
* `'status' => (string)$t['status']` 是**原样回填**,显式忽略请求里的 status
|
|||
|
|
* (见 ApiHandler 那行注释「状态只走 /status 子动作」)。
|
|||
|
|
* 所以端上 toggle 完成必须打 `/status`,打 PATCH 会"看起来成功但状态没变"。
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
import { fbApi, FbApiResult, FbApiOptions } from './FbHttp';
|
|||
|
|
|
|||
|
|
/** 新建/编辑任务提交的字段 */
|
|||
|
|
export interface FbTaskDraft {
|
|||
|
|
title: string;
|
|||
|
|
note: string;
|
|||
|
|
/** `YYYY-MM-DD HH:MM`;空串 = 没有期限 */
|
|||
|
|
dueAt: string;
|
|||
|
|
/** 看板 id(0 = 不归指定看板 → 服务端落到「其他」那一列) */
|
|||
|
|
boardId: number;
|
|||
|
|
/** todo / doing / done(只在**新建**时生效;改状态走 `setTaskStatus`) */
|
|||
|
|
status: string;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 新建任务 */
|
|||
|
|
export async function createTask(token: string, d: FbTaskDraft): Promise<FbApiResult> {
|
|||
|
|
/* ⚠️ ArkTS 的 `arkts-no-untyped-obj-literals`:请求体必须
|
|||
|
|
`Record<string, Object> = {}` 逐键赋值(见 FbTripRepo 同一说明)。 */
|
|||
|
|
const body: Record<string, Object> = {};
|
|||
|
|
body['title'] = d.title;
|
|||
|
|
body['note'] = d.note;
|
|||
|
|
body['due_at'] = d.dueAt;
|
|||
|
|
body['board_id'] = d.boardId;
|
|||
|
|
body['status'] = d.status;
|
|||
|
|
const opts: FbApiOptions = { method: 'POST', token: token, body: body };
|
|||
|
|
return await fbApi('/api/v1/tasks', opts);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 改任务(标题 / 备注 / 截止 / 看板)。
|
|||
|
|
*
|
|||
|
|
* ⚠️ **不带 status**:服务端 PATCH 会忽略它(见文件头说明),
|
|||
|
|
* 带上只会让人以为"改成功了",实际状态没动。
|
|||
|
|
*/
|
|||
|
|
export async function updateTask(token: string, id: number, d: FbTaskDraft): Promise<FbApiResult> {
|
|||
|
|
const body: Record<string, Object> = {};
|
|||
|
|
body['title'] = d.title;
|
|||
|
|
body['note'] = d.note;
|
|||
|
|
body['due_at'] = d.dueAt;
|
|||
|
|
body['board_id'] = d.boardId;
|
|||
|
|
const opts: FbApiOptions = { method: 'PATCH', token: token, body: body };
|
|||
|
|
return await fbApi('/api/v1/tasks/' + id.toString(), opts);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 改状态(勾完成 / 取消完成 / 标记进行中) */
|
|||
|
|
export async function setTaskStatus(token: string, id: number, status: string): Promise<FbApiResult> {
|
|||
|
|
const body: Record<string, Object> = {};
|
|||
|
|
body['status'] = status;
|
|||
|
|
const opts: FbApiOptions = { method: 'POST', token: token, body: body };
|
|||
|
|
return await fbApi('/api/v1/tasks/' + id.toString() + '/status', opts);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 删任务 */
|
|||
|
|
export async function deleteTask(token: string, id: number): Promise<FbApiResult> {
|
|||
|
|
const opts: FbApiOptions = { method: 'DELETE', token: token };
|
|||
|
|
return await fbApi('/api/v1/tasks/' + id.toString(), opts);
|
|||
|
|
}
|