@nocobase/app-plugin-projects 0.1.0-beta.7 → 0.1.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +60 -104
- package/dist/client/api/changed-issues.d.ts +12 -0
- package/dist/client/api/changed-issues.d.ts.map +1 -0
- package/dist/client/api/changed-issues.js +30 -0
- package/dist/client/api/changed-issues.js.map +1 -0
- package/dist/client/api/client.d.ts +4 -23
- package/dist/client/api/client.d.ts.map +1 -1
- package/dist/client/api/client.js +4 -48
- package/dist/client/api/client.js.map +1 -1
- package/dist/client/api/keys.d.ts +2 -8
- package/dist/client/api/keys.d.ts.map +1 -1
- package/dist/client/api/keys.js +2 -17
- package/dist/client/api/keys.js.map +1 -1
- package/dist/client/components/pm-badges.d.ts +1 -1
- package/dist/client/components/pm-badges.d.ts.map +1 -1
- package/dist/client/components/pm-executor-select.d.ts +2 -0
- package/dist/client/components/pm-executor-select.d.ts.map +1 -1
- package/dist/client/components/pm-executor-select.js.map +1 -1
- package/dist/client/components/ui/radio-group.d.ts +7 -0
- package/dist/client/components/ui/radio-group.d.ts.map +1 -0
- package/dist/client/components/ui/radio-group.js +12 -0
- package/dist/client/components/ui/radio-group.js.map +1 -0
- package/dist/client/config.d.ts +0 -2
- package/dist/client/config.d.ts.map +1 -1
- package/dist/client/config.js +1 -5
- package/dist/client/config.js.map +1 -1
- package/dist/client/issues.d.ts +2 -4
- package/dist/client/issues.d.ts.map +1 -1
- package/dist/client/issues.js +2 -3
- package/dist/client/issues.js.map +1 -1
- package/dist/client/kit/plans/lookup.d.ts +2 -2
- package/dist/client/kit/plans/lookup.js +3 -3
- package/dist/client/kit/plans/lookup.js.map +1 -1
- package/dist/client/kit/plans/plan-row.js +2 -2
- package/dist/client/kit/plans/plan-row.js.map +1 -1
- package/dist/client/kit.d.ts +3 -9
- package/dist/client/kit.d.ts.map +1 -1
- package/dist/client/kit.js +3 -9
- package/dist/client/kit.js.map +1 -1
- package/dist/client/lib/kinds.d.ts +3 -29
- package/dist/client/lib/kinds.d.ts.map +1 -1
- package/dist/client/lib/kinds.js +7 -46
- package/dist/client/lib/kinds.js.map +1 -1
- package/dist/client/lib/status-events.d.ts +21 -0
- package/dist/client/lib/status-events.d.ts.map +1 -0
- package/dist/client/lib/status-events.js +31 -0
- package/dist/client/lib/status-events.js.map +1 -0
- package/dist/client/lib/status.d.ts +5 -7
- package/dist/client/lib/status.d.ts.map +1 -1
- package/dist/client/lib/status.js +5 -7
- package/dist/client/lib/status.js.map +1 -1
- package/dist/client/locales/en-US.d.ts +6 -256
- package/dist/client/locales/en-US.d.ts.map +1 -1
- package/dist/client/locales/en-US.js +9 -255
- package/dist/client/locales/en-US.js.map +1 -1
- package/dist/client/locales/zh-CN.d.ts.map +1 -1
- package/dist/client/locales/zh-CN.js +10 -248
- package/dist/client/locales/zh-CN.js.map +1 -1
- package/dist/client/pages/issues/board/board-model.d.ts +1 -1
- package/dist/client/pages/issues/board/board-model.js +1 -1
- package/dist/client/pages/issues/board/use-board-move.d.ts +2 -8
- package/dist/client/pages/issues/board/use-board-move.d.ts.map +1 -1
- package/dist/client/pages/issues/board/use-board-move.js +5 -42
- package/dist/client/pages/issues/board/use-board-move.js.map +1 -1
- package/dist/client/pages/issues/detail/new-subtask.d.ts.map +1 -1
- package/dist/client/pages/issues/detail/new-subtask.js +6 -28
- package/dist/client/pages/issues/detail/new-subtask.js.map +1 -1
- package/dist/client/pages/issues/detail/subtask-model.d.ts +1 -1
- package/dist/client/pages/issues/detail/subtask-model.js +1 -1
- package/dist/client/pages/issues/detail/use-confirmed-update.d.ts +6 -8
- package/dist/client/pages/issues/detail/use-confirmed-update.d.ts.map +1 -1
- package/dist/client/pages/issues/detail/use-confirmed-update.js +9 -42
- package/dist/client/pages/issues/detail/use-confirmed-update.js.map +1 -1
- package/dist/client/pages/issues/detail/use-issue-page.d.ts +0 -4
- package/dist/client/pages/issues/detail/use-issue-page.d.ts.map +1 -1
- package/dist/client/pages/issues/detail/use-issue-page.js +0 -14
- package/dist/client/pages/issues/detail/use-issue-page.js.map +1 -1
- package/dist/client/pages/issues/detail/use-issue-update.d.ts +2 -2
- package/dist/client/pages/issues/detail/use-issue-update.d.ts.map +1 -1
- package/dist/client/pages/issues/detail/use-issue-update.js +4 -6
- package/dist/client/pages/issues/detail/use-issue-update.js.map +1 -1
- package/dist/client/pages/issues/new-issue-form.d.ts +11 -8
- package/dist/client/pages/issues/new-issue-form.d.ts.map +1 -1
- package/dist/client/pages/issues/new-issue-form.js +47 -79
- package/dist/client/pages/issues/new-issue-form.js.map +1 -1
- package/dist/client/pages/issues/new.d.ts.map +1 -1
- package/dist/client/pages/issues/new.js +2 -1
- package/dist/client/pages/issues/new.js.map +1 -1
- package/dist/client/pages/issues/use-executor-options.d.ts +3 -2
- package/dist/client/pages/issues/use-executor-options.d.ts.map +1 -1
- package/dist/client/pages/issues/use-executor-options.js +5 -23
- package/dist/client/pages/issues/use-executor-options.js.map +1 -1
- package/dist/client/pages/projects/detail/use-project-page.d.ts +4 -26
- package/dist/client/pages/projects/detail/use-project-page.d.ts.map +1 -1
- package/dist/client/pages/projects/detail/use-project-page.js +7 -53
- package/dist/client/pages/projects/detail/use-project-page.js.map +1 -1
- package/dist/client/pages/projects/new.d.ts +1 -1
- package/dist/client/pages/projects/new.d.ts.map +1 -1
- package/dist/client/pages/projects/new.js +3 -7
- package/dist/client/pages/projects/new.js.map +1 -1
- package/dist/client/plugin.d.ts +3 -0
- package/dist/client/plugin.d.ts.map +1 -1
- package/dist/client/plugin.js +8 -1
- package/dist/client/plugin.js.map +1 -1
- package/dist/client/projects.d.ts +2 -2
- package/dist/client/projects.d.ts.map +1 -1
- package/dist/client/projects.js +2 -2
- package/dist/client/projects.js.map +1 -1
- package/dist/client/providers/query-provider.d.ts.map +1 -1
- package/dist/client/providers/query-provider.js +13 -10
- package/dist/client/providers/query-provider.js.map +1 -1
- package/dist/database/migrations/.manifest.json +8 -0
- package/dist/database/migrations/202610240010_pm_fixed_statuses.d.ts +4 -0
- package/dist/database/migrations/202610240010_pm_fixed_statuses.d.ts.map +1 -0
- package/dist/database/migrations/202610240010_pm_fixed_statuses.js +189 -0
- package/dist/database/migrations/202610240010_pm_fixed_statuses.js.map +1 -0
- package/dist/database/migrations/202610240011_pm_issue_progress.d.ts +4 -0
- package/dist/database/migrations/202610240011_pm_issue_progress.d.ts.map +1 -0
- package/dist/database/migrations/202610240011_pm_issue_progress.js +19 -0
- package/dist/database/migrations/202610240011_pm_issue_progress.js.map +1 -0
- package/dist/server/composition.d.ts +11 -17
- package/dist/server/composition.d.ts.map +1 -1
- package/dist/server/composition.js +11 -56
- package/dist/server/composition.js.map +1 -1
- package/dist/server/domains/comments/comment.queries.d.ts +31 -0
- package/dist/server/domains/comments/comment.queries.d.ts.map +1 -1
- package/dist/server/domains/comments/comment.queries.js +27 -1
- package/dist/server/domains/comments/comment.queries.js.map +1 -1
- package/dist/server/domains/comments/comment.store.d.ts +19 -0
- package/dist/server/domains/comments/comment.store.d.ts.map +1 -1
- package/dist/server/domains/comments/comment.store.js +55 -0
- package/dist/server/domains/comments/comment.store.js.map +1 -1
- package/dist/server/domains/comments/index.d.ts +1 -1
- package/dist/server/domains/comments/index.d.ts.map +1 -1
- package/dist/server/domains/comments/index.js.map +1 -1
- package/dist/server/domains/issues/index.d.ts +1 -1
- package/dist/server/domains/issues/index.d.ts.map +1 -1
- package/dist/server/domains/issues/index.js +1 -1
- package/dist/server/domains/issues/index.js.map +1 -1
- package/dist/server/domains/issues/issue.context.d.ts +6 -22
- package/dist/server/domains/issues/issue.context.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.context.js +1 -22
- package/dist/server/domains/issues/issue.context.js.map +1 -1
- package/dist/server/domains/issues/issue.fields.d.ts +5 -3
- package/dist/server/domains/issues/issue.fields.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.fields.js +37 -16
- package/dist/server/domains/issues/issue.fields.js.map +1 -1
- package/dist/server/domains/issues/issue.projects.d.ts +2 -2
- package/dist/server/domains/issues/issue.projects.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.projects.js +1 -2
- package/dist/server/domains/issues/issue.projects.js.map +1 -1
- package/dist/server/domains/issues/issue.queries.d.ts +10 -7
- package/dist/server/domains/issues/issue.queries.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.queries.js +15 -41
- package/dist/server/domains/issues/issue.queries.js.map +1 -1
- package/dist/server/domains/issues/issue.routes.d.ts +1 -1
- package/dist/server/domains/issues/issue.routes.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.routes.js +20 -38
- package/dist/server/domains/issues/issue.routes.js.map +1 -1
- package/dist/server/domains/issues/issue.service.d.ts +20 -44
- package/dist/server/domains/issues/issue.service.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.service.js +26 -81
- package/dist/server/domains/issues/issue.service.js.map +1 -1
- package/dist/server/domains/issues/issue.status.d.ts +6 -10
- package/dist/server/domains/issues/issue.status.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.status.js +3 -20
- package/dist/server/domains/issues/issue.status.js.map +1 -1
- package/dist/server/domains/issues/issue.store.d.ts +2 -0
- package/dist/server/domains/issues/issue.store.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.store.js +2 -0
- package/dist/server/domains/issues/issue.store.js.map +1 -1
- package/dist/server/domains/issues/ports.d.ts +19 -36
- package/dist/server/domains/issues/ports.d.ts.map +1 -1
- package/dist/server/domains/issues/ports.js +0 -5
- package/dist/server/domains/issues/ports.js.map +1 -1
- package/dist/server/domains/notices/notice.planner.d.ts +2 -1
- package/dist/server/domains/notices/notice.planner.d.ts.map +1 -1
- package/dist/server/domains/notices/notice.planner.js +2 -1
- package/dist/server/domains/notices/notice.planner.js.map +1 -1
- package/dist/server/domains/notices/notice.rules.d.ts +1 -4
- package/dist/server/domains/notices/notice.rules.d.ts.map +1 -1
- package/dist/server/domains/notices/notice.rules.js +4 -5
- package/dist/server/domains/notices/notice.rules.js.map +1 -1
- package/dist/server/domains/plans/plan.ops.d.ts +3 -3
- package/dist/server/domains/plans/plan.ops.d.ts.map +1 -1
- package/dist/server/domains/plans/plan.ops.js +23 -13
- package/dist/server/domains/plans/plan.ops.js.map +1 -1
- package/dist/server/domains/projects/index.d.ts +1 -1
- package/dist/server/domains/projects/index.d.ts.map +1 -1
- package/dist/server/domains/projects/index.js.map +1 -1
- package/dist/server/domains/projects/project.events.d.ts +10 -0
- package/dist/server/domains/projects/project.events.d.ts.map +1 -0
- package/dist/server/domains/projects/project.events.js +2 -0
- package/dist/server/domains/projects/project.events.js.map +1 -0
- package/dist/server/domains/projects/project.routes.d.ts.map +1 -1
- package/dist/server/domains/projects/project.routes.js +1 -3
- package/dist/server/domains/projects/project.routes.js.map +1 -1
- package/dist/server/domains/projects/project.service.d.ts +1 -7
- package/dist/server/domains/projects/project.service.d.ts.map +1 -1
- package/dist/server/domains/projects/project.service.js +2 -17
- package/dist/server/domains/projects/project.service.js.map +1 -1
- package/dist/server/domains/projects/project.store.d.ts +0 -1
- package/dist/server/domains/projects/project.store.d.ts.map +1 -1
- package/dist/server/domains/projects/project.store.js +0 -1
- package/dist/server/domains/projects/project.store.js.map +1 -1
- package/dist/server/domains/reports/report.service.d.ts +1 -12
- package/dist/server/domains/reports/report.service.d.ts.map +1 -1
- package/dist/server/domains/reports/report.service.js +23 -79
- package/dist/server/domains/reports/report.service.js.map +1 -1
- package/dist/server/domains/statuses/event-types.d.ts +16 -0
- package/dist/server/domains/statuses/event-types.d.ts.map +1 -0
- package/dist/server/domains/statuses/event-types.js +31 -0
- package/dist/server/domains/statuses/event-types.js.map +1 -0
- package/dist/server/domains/statuses/index.d.ts +4 -0
- package/dist/server/domains/statuses/index.d.ts.map +1 -0
- package/dist/server/domains/statuses/index.js +4 -0
- package/dist/server/domains/statuses/index.js.map +1 -0
- package/dist/server/domains/statuses/status.catalog.d.ts +15 -0
- package/dist/server/domains/statuses/status.catalog.d.ts.map +1 -0
- package/dist/server/domains/statuses/status.catalog.js +119 -0
- package/dist/server/domains/statuses/status.catalog.js.map +1 -0
- package/dist/server/domains/statuses/status.events.d.ts +15 -0
- package/dist/server/domains/statuses/status.events.d.ts.map +1 -0
- package/dist/server/domains/statuses/status.events.js +2 -0
- package/dist/server/domains/statuses/status.events.js.map +1 -0
- package/dist/server/domains/statuses/status.fire.d.ts +48 -0
- package/dist/server/domains/statuses/status.fire.d.ts.map +1 -0
- package/dist/server/domains/statuses/status.fire.js +38 -0
- package/dist/server/domains/statuses/status.fire.js.map +1 -0
- package/dist/server/domains/subscriptions/subscription.routes.d.ts.map +1 -1
- package/dist/server/domains/subscriptions/subscription.routes.js +4 -2
- package/dist/server/domains/subscriptions/subscription.routes.js.map +1 -1
- package/dist/server/domains/subtasks/subtask.blocking.d.ts +4 -4
- package/dist/server/domains/subtasks/subtask.blocking.d.ts.map +1 -1
- package/dist/server/domains/subtasks/subtask.blocking.js +2 -10
- package/dist/server/domains/subtasks/subtask.blocking.js.map +1 -1
- package/dist/server/domains/subtasks/subtask.release.d.ts +5 -9
- package/dist/server/domains/subtasks/subtask.release.d.ts.map +1 -1
- package/dist/server/domains/subtasks/subtask.release.js +0 -4
- package/dist/server/domains/subtasks/subtask.release.js.map +1 -1
- package/dist/server/domains/subtasks/subtask.service.d.ts +1 -3
- package/dist/server/domains/subtasks/subtask.service.d.ts.map +1 -1
- package/dist/server/domains/subtasks/subtask.service.js +0 -12
- package/dist/server/domains/subtasks/subtask.service.js.map +1 -1
- package/dist/server/kernel/http.d.ts.map +1 -1
- package/dist/server/kernel/http.js +0 -3
- package/dist/server/kernel/http.js.map +1 -1
- package/dist/server/kernel/kinds.d.ts +24 -6
- package/dist/server/kernel/kinds.d.ts.map +1 -1
- package/dist/server/kernel/kinds.js +21 -1
- package/dist/server/kernel/kinds.js.map +1 -1
- package/dist/server/kernel/work.d.ts +8 -4
- package/dist/server/kernel/work.d.ts.map +1 -1
- package/dist/server/kernel/work.js +21 -10
- package/dist/server/kernel/work.js.map +1 -1
- package/dist/server/locales/en-US.d.ts +0 -9
- package/dist/server/locales/en-US.d.ts.map +1 -1
- package/dist/server/locales/en-US.js +0 -9
- package/dist/server/locales/en-US.js.map +1 -1
- package/dist/server/locales/zh-CN.d.ts.map +1 -1
- package/dist/server/locales/zh-CN.js +2 -11
- package/dist/server/locales/zh-CN.js.map +1 -1
- package/dist/server/providers/change-announcer.d.ts +27 -0
- package/dist/server/providers/change-announcer.d.ts.map +1 -0
- package/dist/server/providers/change-announcer.js +74 -0
- package/dist/server/providers/change-announcer.js.map +1 -0
- package/dist/server/providers/notifications.d.ts +1 -0
- package/dist/server/providers/notifications.d.ts.map +1 -1
- package/dist/server/providers/notifications.js +6 -120
- package/dist/server/providers/notifications.js.map +1 -1
- package/dist/server/providers/projects.d.ts +3 -8
- package/dist/server/providers/projects.d.ts.map +1 -1
- package/dist/server/providers/projects.js +14 -37
- package/dist/server/providers/projects.js.map +1 -1
- package/dist/server/routes/api.d.ts.map +1 -1
- package/dist/server/routes/api.js +0 -6
- package/dist/server/routes/api.js.map +1 -1
- package/dist/server/routes/schemas.d.ts +1 -27
- package/dist/server/routes/schemas.d.ts.map +1 -1
- package/dist/server/routes/schemas.js +23 -167
- package/dist/server/routes/schemas.js.map +1 -1
- package/dist/server/tokens.d.ts +12 -34
- package/dist/server/tokens.d.ts.map +1 -1
- package/dist/server/tokens.js +4 -16
- package/dist/server/tokens.js.map +1 -1
- package/dist/shared/access.d.ts +0 -1
- package/dist/shared/access.d.ts.map +1 -1
- package/dist/shared/access.js +2 -11
- package/dist/shared/access.js.map +1 -1
- package/dist/shared/issues.d.ts +14 -36
- package/dist/shared/issues.d.ts.map +1 -1
- package/dist/shared/issues.js +1 -0
- package/dist/shared/issues.js.map +1 -1
- package/dist/shared/kinds.d.ts +3 -1
- package/dist/shared/kinds.d.ts.map +1 -1
- package/dist/shared/kinds.js +1 -1
- package/dist/shared/locales/access.en-US.d.ts +0 -1
- package/dist/shared/locales/access.en-US.d.ts.map +1 -1
- package/dist/shared/locales/access.en-US.js +1 -2
- package/dist/shared/locales/access.en-US.js.map +1 -1
- package/dist/shared/locales/access.zh-CN.d.ts.map +1 -1
- package/dist/shared/locales/access.zh-CN.js +1 -2
- package/dist/shared/locales/access.zh-CN.js.map +1 -1
- package/dist/shared/plans.d.ts +6 -6
- package/dist/shared/plans.d.ts.map +1 -1
- package/dist/shared/plans.js +2 -1
- package/dist/shared/plans.js.map +1 -1
- package/dist/shared/projects.d.ts +0 -4
- package/dist/shared/projects.d.ts.map +1 -1
- package/dist/shared/projects.js.map +1 -1
- package/dist/shared/realtime.d.ts +9 -3
- package/dist/shared/realtime.d.ts.map +1 -1
- package/dist/shared/realtime.js +3 -2
- package/dist/shared/realtime.js.map +1 -1
- package/dist/shared/statuses.d.ts +42 -0
- package/dist/shared/statuses.d.ts.map +1 -0
- package/dist/shared/statuses.js +73 -0
- package/dist/shared/statuses.js.map +1 -0
- package/dist/shared/subtasks.d.ts +3 -3
- package/dist/shared/subtasks.d.ts.map +1 -1
- package/package.json +9 -17
- package/skills/nocobase-app-plugin-projects/SKILL.md +27 -51
- package/dist/client/hooks/use-workflow-leave-guard.d.ts +0 -3
- package/dist/client/hooks/use-workflow-leave-guard.d.ts.map +0 -1
- package/dist/client/hooks/use-workflow-leave-guard.js +0 -31
- package/dist/client/hooks/use-workflow-leave-guard.js.map +0 -1
- package/dist/client/lib/built-in-rule-editors.d.ts +0 -13
- package/dist/client/lib/built-in-rule-editors.d.ts.map +0 -1
- package/dist/client/lib/built-in-rule-editors.js +0 -86
- package/dist/client/lib/built-in-rule-editors.js.map +0 -1
- package/dist/client/lib/built-in-rule-types.d.ts +0 -3
- package/dist/client/lib/built-in-rule-types.d.ts.map +0 -1
- package/dist/client/lib/built-in-rule-types.js +0 -63
- package/dist/client/lib/built-in-rule-types.js.map +0 -1
- package/dist/client/lib/status-rule-types.d.ts +0 -60
- package/dist/client/lib/status-rule-types.d.ts.map +0 -1
- package/dist/client/lib/status-rule-types.js +0 -38
- package/dist/client/lib/status-rule-types.js.map +0 -1
- package/dist/client/lib/workflow-events.d.ts +0 -25
- package/dist/client/lib/workflow-events.d.ts.map +0 -1
- package/dist/client/lib/workflow-events.js +0 -30
- package/dist/client/lib/workflow-events.js.map +0 -1
- package/dist/client/pages/config/workflow-detail.d.ts +0 -10
- package/dist/client/pages/config/workflow-detail.d.ts.map +0 -1
- package/dist/client/pages/config/workflow-detail.js +0 -207
- package/dist/client/pages/config/workflow-detail.js.map +0 -1
- package/dist/client/pages/config/workflows/flow-editor.d.ts +0 -15
- package/dist/client/pages/config/workflows/flow-editor.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/flow-editor.js +0 -76
- package/dist/client/pages/config/workflows/flow-editor.js.map +0 -1
- package/dist/client/pages/config/workflows/status-rules.d.ts +0 -21
- package/dist/client/pages/config/workflows/status-rules.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/status-rules.js +0 -203
- package/dist/client/pages/config/workflows/status-rules.js.map +0 -1
- package/dist/client/pages/config/workflows/transitions-matrix.d.ts +0 -20
- package/dist/client/pages/config/workflows/transitions-matrix.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/transitions-matrix.js +0 -114
- package/dist/client/pages/config/workflows/transitions-matrix.js.map +0 -1
- package/dist/client/pages/config/workflows/use-status-name.d.ts +0 -4
- package/dist/client/pages/config/workflows/use-status-name.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/use-status-name.js +0 -17
- package/dist/client/pages/config/workflows/use-status-name.js.map +0 -1
- package/dist/client/pages/config/workflows/workflow-diagram.d.ts +0 -17
- package/dist/client/pages/config/workflows/workflow-diagram.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/workflow-diagram.js +0 -298
- package/dist/client/pages/config/workflows/workflow-diagram.js.map +0 -1
- package/dist/client/pages/config/workflows/workflow-model.d.ts +0 -157
- package/dist/client/pages/config/workflows/workflow-model.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/workflow-model.js +0 -403
- package/dist/client/pages/config/workflows/workflow-model.js.map +0 -1
- package/dist/client/pages/config/workflows/workflow-views.d.ts +0 -31
- package/dist/client/pages/config/workflows/workflow-views.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/workflow-views.js +0 -76
- package/dist/client/pages/config/workflows/workflow-views.js.map +0 -1
- package/dist/client/pages/config/workflows.d.ts +0 -8
- package/dist/client/pages/config/workflows.d.ts.map +0 -1
- package/dist/client/pages/config/workflows.js +0 -139
- package/dist/client/pages/config/workflows.js.map +0 -1
- package/dist/client/pages/issues/detail/start-dialog.d.ts +0 -20
- package/dist/client/pages/issues/detail/start-dialog.d.ts.map +0 -1
- package/dist/client/pages/issues/detail/start-dialog.js +0 -31
- package/dist/client/pages/issues/detail/start-dialog.js.map +0 -1
- package/dist/client/pages/projects/workflow-select.d.ts +0 -14
- package/dist/client/pages/projects/workflow-select.d.ts.map +0 -1
- package/dist/client/pages/projects/workflow-select.js +0 -34
- package/dist/client/pages/projects/workflow-select.js.map +0 -1
- package/dist/server/domains/approvals/approval.events.d.ts +0 -47
- package/dist/server/domains/approvals/approval.events.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.events.js +0 -2
- package/dist/server/domains/approvals/approval.events.js.map +0 -1
- package/dist/server/domains/approvals/approval.lifecycle.d.ts +0 -8
- package/dist/server/domains/approvals/approval.lifecycle.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.lifecycle.js +0 -54
- package/dist/server/domains/approvals/approval.lifecycle.js.map +0 -1
- package/dist/server/domains/approvals/approval.routes.d.ts +0 -10
- package/dist/server/domains/approvals/approval.routes.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.routes.js +0 -87
- package/dist/server/domains/approvals/approval.routes.js.map +0 -1
- package/dist/server/domains/approvals/approval.service.d.ts +0 -72
- package/dist/server/domains/approvals/approval.service.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.service.js +0 -261
- package/dist/server/domains/approvals/approval.service.js.map +0 -1
- package/dist/server/domains/approvals/approval.store.d.ts +0 -42
- package/dist/server/domains/approvals/approval.store.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.store.js +0 -66
- package/dist/server/domains/approvals/approval.store.js.map +0 -1
- package/dist/server/domains/approvals/index.d.ts +0 -4
- package/dist/server/domains/approvals/index.d.ts.map +0 -1
- package/dist/server/domains/approvals/index.js +0 -3
- package/dist/server/domains/approvals/index.js.map +0 -1
- package/dist/server/domains/checklists/checklist.routes.d.ts +0 -9
- package/dist/server/domains/checklists/checklist.routes.d.ts.map +0 -1
- package/dist/server/domains/checklists/checklist.routes.js +0 -62
- package/dist/server/domains/checklists/checklist.routes.js.map +0 -1
- package/dist/server/domains/checklists/checklist.service.d.ts +0 -26
- package/dist/server/domains/checklists/checklist.service.d.ts.map +0 -1
- package/dist/server/domains/checklists/checklist.service.js +0 -80
- package/dist/server/domains/checklists/checklist.service.js.map +0 -1
- package/dist/server/domains/checklists/checklist.store.d.ts +0 -32
- package/dist/server/domains/checklists/checklist.store.d.ts.map +0 -1
- package/dist/server/domains/checklists/checklist.store.js +0 -66
- package/dist/server/domains/checklists/checklist.store.js.map +0 -1
- package/dist/server/domains/checklists/index.d.ts +0 -4
- package/dist/server/domains/checklists/index.d.ts.map +0 -1
- package/dist/server/domains/checklists/index.js +0 -4
- package/dist/server/domains/checklists/index.js.map +0 -1
- package/dist/server/domains/workflows/built-in-rule-types.d.ts +0 -40
- package/dist/server/domains/workflows/built-in-rule-types.d.ts.map +0 -1
- package/dist/server/domains/workflows/built-in-rule-types.js +0 -260
- package/dist/server/domains/workflows/built-in-rule-types.js.map +0 -1
- package/dist/server/domains/workflows/event-types.d.ts +0 -21
- package/dist/server/domains/workflows/event-types.d.ts.map +0 -1
- package/dist/server/domains/workflows/event-types.js +0 -31
- package/dist/server/domains/workflows/event-types.js.map +0 -1
- package/dist/server/domains/workflows/index.d.ts +0 -10
- package/dist/server/domains/workflows/index.d.ts.map +0 -1
- package/dist/server/domains/workflows/index.js +0 -10
- package/dist/server/domains/workflows/index.js.map +0 -1
- package/dist/server/domains/workflows/rule-types.d.ts +0 -129
- package/dist/server/domains/workflows/rule-types.d.ts.map +0 -1
- package/dist/server/domains/workflows/rule-types.js +0 -33
- package/dist/server/domains/workflows/rule-types.js.map +0 -1
- package/dist/server/domains/workflows/templates.d.ts +0 -62
- package/dist/server/domains/workflows/templates.d.ts.map +0 -1
- package/dist/server/domains/workflows/templates.js +0 -63
- package/dist/server/domains/workflows/templates.js.map +0 -1
- package/dist/server/domains/workflows/workflow.diff.d.ts +0 -14
- package/dist/server/domains/workflows/workflow.diff.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.diff.js +0 -80
- package/dist/server/domains/workflows/workflow.diff.js.map +0 -1
- package/dist/server/domains/workflows/workflow.events.d.ts +0 -26
- package/dist/server/domains/workflows/workflow.events.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.events.js +0 -2
- package/dist/server/domains/workflows/workflow.events.js.map +0 -1
- package/dist/server/domains/workflows/workflow.fire.d.ts +0 -38
- package/dist/server/domains/workflows/workflow.fire.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.fire.js +0 -57
- package/dist/server/domains/workflows/workflow.fire.js.map +0 -1
- package/dist/server/domains/workflows/workflow.registry.d.ts +0 -27
- package/dist/server/domains/workflows/workflow.registry.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.registry.js +0 -132
- package/dist/server/domains/workflows/workflow.registry.js.map +0 -1
- package/dist/server/domains/workflows/workflow.routes.d.ts +0 -6
- package/dist/server/domains/workflows/workflow.routes.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.routes.js +0 -148
- package/dist/server/domains/workflows/workflow.routes.js.map +0 -1
- package/dist/server/domains/workflows/workflow.rules.d.ts +0 -14
- package/dist/server/domains/workflows/workflow.rules.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.rules.js +0 -212
- package/dist/server/domains/workflows/workflow.rules.js.map +0 -1
- package/dist/server/domains/workflows/workflow.service.d.ts +0 -71
- package/dist/server/domains/workflows/workflow.service.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.service.js +0 -366
- package/dist/server/domains/workflows/workflow.service.js.map +0 -1
- package/dist/server/domains/workflows/workflow.store.d.ts +0 -33
- package/dist/server/domains/workflows/workflow.store.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.store.js +0 -148
- package/dist/server/domains/workflows/workflow.store.js.map +0 -1
- package/dist/shared/approvals.d.ts +0 -37
- package/dist/shared/approvals.d.ts.map +0 -1
- package/dist/shared/approvals.js +0 -4
- package/dist/shared/approvals.js.map +0 -1
- package/dist/shared/checklists.d.ts +0 -27
- package/dist/shared/checklists.d.ts.map +0 -1
- package/dist/shared/checklists.js +0 -7
- package/dist/shared/checklists.js.map +0 -1
- package/dist/shared/workflows.d.ts +0 -276
- package/dist/shared/workflows.d.ts.map +0 -1
- package/dist/shared/workflows.js +0 -151
- package/dist/shared/workflows.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,63 @@
|
|
|
1
1
|
# @nocobase/app-plugin-projects
|
|
2
2
|
|
|
3
|
+
## 0.1.0-beta.9
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 862a542: Support global default skills and transactional defaults for newly created Studio projects. Resolve skills from global through application scopes to working directories in one query, with more specific targets winning. Stop reading and exposing legacy agent skill attachments while preserving agent variables.
|
|
8
|
+
- f43817d: Persist the owner's required decision and the next step as structured issue fields. Require needsYou only for authenticated Studio project-manager direct status updates to Blocked or In review, keep generic and human progress input optional, clear it when work resumes, and clear next when work ends. Studio displays these fields without extracting progress or delivery notes from comments and links to the project manager's latest explanation.
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- 92afa27: Make My follow-ups fast for someone who owns many open issues. `GET /api/followUps` reads what every row's progress needs in a fixed number of queries instead of a few per issue, and a row no longer works out why queued work has not been claimed (`waiting`, `managerWait`): the issue's own progress (`GET /api/issueProgress/{issueId}`), shown beside the list, still does. A new `GET /api/followUps/issues?issueIds=…` answers the rows of the named issues, and the page uses it to refresh only the rows an announced change names, a burst at a time, reading the whole overview again only when the list itself changed, on reconnect, for a change that names no issue, and on its fallback poll. The follow star on an issue reads only what the viewer follows from a new `GET /api/followUps/following` (`follow-up following` on the command line) instead of the whole overview, and an agent session's issue progress reads its issues in the same fixed number of queries. The projects plugin's comment queries gain `newestByEach`, the agents plugin's runs gain `openOnEach`, and its run request list takes `subjectIds` and `statuses`.
|
|
13
|
+
- facfe5c: Remove a duplicate Issue type import that prevented type checking and builds.
|
|
14
|
+
- bdb0581: Reduce the server load of open issue and My follow-ups pages. Issue change announcements are gathered for a moment and name the issues that changed, so a page refreshes only what it shows of them; Studio announces new runs on an issue, so issue pages, What it waits for, owner handoffs and My follow-ups fall back to a slow poll instead of polling every few seconds; a preview label the server failed to set no longer makes the issue page poll every three seconds. Polled reads check issue visibility without loading the whole issue page (`IssueQueries.visible`), What it waits for reads only the project manager's newest comments (`CommentQueries.newestBy`), My follow-ups shares lookups across its issues, and pull request marks check visibility in one read. A runner heartbeat no longer announces a runner change, waking every waiting claim and refreshing every runtimes page, unless its disk sample moved by a gigabyte, crossed the free-space threshold or changed size.
|
|
15
|
+
- 7534a32: Restore the previous task tables and remove grouped task tables for now.
|
|
16
|
+
- 6c4634b: Scope Studio's pull request announcements (`studio:git`) to the issues they affect. Stores of a moment are gathered into one announcement naming the issues the changed pull requests are linked to, and pages read again only those issues' pull requests, marks, previews and progress, through one subscription per page; an announcement it cannot tie to pull requests, and a reconnect, still refresh everything. The topic now reaches signed-in connections only, and a hidden tab no longer polls an issue's previews. Also removes a duplicated type import in the projects plugin's issue queries.
|
|
17
|
+
- bdb0581: A public realtime topic can be defined with `authenticated: true` (`defineTopic` and `registerTopic` of `@nocobase/app-server/realtime`): subscribing without a signed-in principal is then refused with `AUTHENTICATION_REQUIRED`, as for a user topic, and publishing skips connections without one. The projects plugin's `pm:changes`, the agents plugin's `agents:runners` and Studio's `studio:issues:runs`, whose announcements name records by id, now reach signed-in connections only. The authentication plugin opens the realtime connection again when the signed-in person changes, so a page signed in without a reload receives these topics and user topics.
|
|
18
|
+
- Updated dependencies [69e212c]
|
|
19
|
+
- Updated dependencies [943a9a8]
|
|
20
|
+
- Updated dependencies [943a9a8]
|
|
21
|
+
- Updated dependencies [1cd749c]
|
|
22
|
+
- Updated dependencies [bdb0581]
|
|
23
|
+
- Updated dependencies [9b946f4]
|
|
24
|
+
- @nocobase/app-server@2.0.0-beta.7
|
|
25
|
+
- @nocobase/db@1.0.0-beta.20
|
|
26
|
+
- @nocobase/app-plugin-authentication@2.0.0-beta.9
|
|
27
|
+
- @nocobase/app-plugin-file@1.0.0-beta.23
|
|
28
|
+
- @nocobase/app-plugin-authorization@1.0.0-beta.27
|
|
29
|
+
- @nocobase/app-plugin-notification@1.0.0-beta.27
|
|
30
|
+
- @nocobase/app-plugin-users@2.0.0-beta.4
|
|
31
|
+
|
|
32
|
+
## 0.1.0-beta.8
|
|
33
|
+
|
|
34
|
+
### Minor Changes
|
|
35
|
+
|
|
36
|
+
- 6fc0af2: Require the issue owner to start or continue Studio project manager work, and ignore agent wakeups from comments on unstarted issues. Run the manager and its delegated steps as the current owner while preserving trigger audit information. Withdraw all queued agent work and request cancellation of held runs on owner transfers, without automatically restarting them. Correct legacy queued identities before claim and expose waiting reasons.
|
|
37
|
+
|
|
38
|
+
Expose the existing transactional `Projects.activity` recorder for application issue events and deliver owner transfers to all work kinds before ordinary triggers, including executor clearing. Restore Studio wording for models, efforts, the start dialog and historical sub-issue activity.
|
|
39
|
+
|
|
40
|
+
Preserve delegated execution identity throughout repeated retries, including handled inputs, and show the initiator of the current retry instead of copied retry history.
|
|
41
|
+
|
|
42
|
+
- ddfe1b1: Replace workflows with six fixed issue statuses: Backlog, In progress, Blocked, In review, Done and Cancelled. Workflows, workflow templates, status rules, approval requests and checklists are removed, together with their routes, CLI commands, settings (`pm.workflows`) and client pieces (`WorkflowSelect`, the start dialog, status rule editors). A new issue starts in Backlog unless it is created in In progress ("Start now"); moving an issue to Blocked or In review notifies its owner. Other plugins register status events with `projectsStatusEventsToken` (`{ key, from, to }`) and fire them with `projects.statusEvents.fire`, replacing `workflowEvents`; a principal kind may now say which moves it makes (`moves`, `mayMove`) and which executor it defaults to (`defaultExecutor`). `PATCH /api/projects/issues/{issueId}` answers `{ data: { issue } }`. The migration `202610240010_pm_fixed_statuses` maps every issue to the fixed statuses by key and category (todo and other started statuses to In progress, ui_review to In review, done to Done, closed to Cancelled) and drops the workflow, approval and checklist tables and `pmProjects.workflowId`; it cannot be rolled back to the workflows it removed.
|
|
43
|
+
|
|
44
|
+
### Patch Changes
|
|
45
|
+
|
|
46
|
+
- 0e28a3c: Describe `issue subscribe` and `issue unsubscribe` (`POST /api/projects/issues/{issueId}/subscribe|unsubscribe`) as subscribing to and unsubscribing from an issue's notifications, so the API document and the command line no longer call them following, which Studio's "My follow-ups" means.
|
|
47
|
+
- cb009d7: Pause agent work after an owner transfer until the new owner accepts. Add owner acceptance and rejection in issue pages and inbox decisions, with transfer activities and localized waiting reasons.
|
|
48
|
+
- fad531f: Initialize the project manager's name and description once in the installation's default language and allow administrators to edit them, including clearing the description. Restarts and unrelated settings saves preserve the identity. Later changes to the installation language do not rename an initialized manager.
|
|
49
|
+
|
|
50
|
+
An upgrade seed preserves valid explicit settings, custom legacy agent values, empty descriptions, and unknown settings. Legacy agent values identical to the former built-in English defaults cannot be distinguished from manual writes and are initialized in the upgrade language when no valid explicit setting exists. A damaged `studioSettings.projectManager.value` stops initialization with a repair instruction instead of overwriting it.
|
|
51
|
+
|
|
52
|
+
Resolve historical run inputs, notifications, delegation cards, plans, and consultation identity labels from stable agent IDs without rewriting historical text or execution snapshots. Legacy limit notices and plans whose identity cannot be recovered use neutral labels, and unresolved consultations mark the originally requested subject. Refresh identity caches when the manager is renamed.
|
|
53
|
+
|
|
54
|
+
Mount application query effects inside the projects plugin's cache using its optional `queryEffects` composition point. Keep completed consultation labels current after renames and distinguish loading, inaccessible agents, and historical request snapshots.
|
|
55
|
+
|
|
56
|
+
- Updated dependencies [9e99702]
|
|
57
|
+
- @nocobase/app-server@2.0.0-beta.6
|
|
58
|
+
- @nocobase/app-plugin-authentication@2.0.0-beta.8
|
|
59
|
+
- @nocobase/app-plugin-file@1.0.0-beta.23
|
|
60
|
+
|
|
3
61
|
## 0.1.0-beta.7
|
|
4
62
|
|
|
5
63
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @nocobase/app-plugin-projects
|
|
2
2
|
|
|
3
|
-
Projects, issues,
|
|
3
|
+
Projects, issues, fixed statuses, labels and members for a NocoBase application.
|
|
4
4
|
|
|
5
5
|
## What it provides
|
|
6
6
|
|
|
@@ -17,16 +17,17 @@ Projects, issues, workflows, labels and members for a NocoBase application.
|
|
|
17
17
|
- **Labels**: a shared label list.
|
|
18
18
|
- **Kinds**: who acts on issues or is named in them. `user` (people) and `system` (the plugin's own rules) are built
|
|
19
19
|
in; another plugin registers more through `projectsKindsToken` (`server/kernel/kinds.ts`): a key, a title, how its
|
|
20
|
-
ids are named, whether it may execute issues (and who may give it work), whether it may be mentioned,
|
|
21
|
-
moves
|
|
22
|
-
|
|
20
|
+
ids are named, whether it may execute issues (and who may give it work), whether it may be mentioned, the status
|
|
21
|
+
moves its principals may make (`moves`, with an optional `mayMove` check per principal and issue), and the executor
|
|
22
|
+
a new issue gets when it names none (`defaultExecutor`). Executors, activity, mentions and status moves name a kind
|
|
23
|
+
by its key; the browser reads the list from `GET /api/projects/me` (`kinds`). A kind may
|
|
23
24
|
also do work (`work`, an `IssueWorkHandler`, `server/kernel/work.ts`): unless a plugin binds `projectsTriggersToken`,
|
|
24
25
|
every change, comment and release is handed, in its transaction, to the work handler of each kind it concerns (the
|
|
25
26
|
executor before and after, the kinds a comment mentions or answers), which answers what it started (`RunAttempt[]`;
|
|
26
27
|
`collectRunAttempts` gathers them around a call). A handler asks `projects.subtasks.blockersOf` whether the issue
|
|
27
28
|
waits for unfinished issues and then starts nothing (`skipped: 'blocked'`); it starts nothing either for an issue in
|
|
28
|
-
backlog (`BACKLOG_STATUS`, `skipped: 'dormant'`), or for a principal's comment past the
|
|
29
|
-
|
|
29
|
+
backlog (`BACKLOG_STATUS`, `skipped: 'dormant'`), or for a principal's comment past a limit the kind keeps
|
|
30
|
+
(`skipped: 'limited'`). A comment of anyone but the system reaches the handlers, with the person it
|
|
30
31
|
was written for (`CommentChange.userId`). When a new `blockedBy` holds the issue, every kind's
|
|
31
32
|
`onBlocked` withdraws the work it had not taken up yet. These skips and withdrawals are recorded on the issue's
|
|
32
33
|
activity as the principal's (`work_skipped`, `work_withdrawn`, with the issues it waits for). It may name the business actions a principal of the kind may be
|
|
@@ -36,58 +37,30 @@ Projects, issues, workflows, labels and members for a NocoBase application.
|
|
|
36
37
|
`projects.issues.releaseExecutor(executor, { actor, name })`: every live, unfinished issue it executes is left with
|
|
37
38
|
no executor, recorded as `executor_changed` with `reason: 'executorRemoved'` and the executor's name ("Executor X was
|
|
38
39
|
removed" on the timeline), and handed to the triggers like any change of executor.
|
|
39
|
-
- **
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
contributed ones; `projects.statusRules.list()` lists both. In the browser, `StatusRuleTypesContext` (`client/kit`)
|
|
56
|
-
gives each contributed type its title and hint, the categories it may sit on, its group in the editor's "Add rule"
|
|
57
|
-
menu (`action`, the default, or `condition`), an icon, the settings a new rule starts with, a settings editor and a
|
|
58
|
-
one-line summary; the plugin describes its own types the same way (`client/lib/built-in-rule-types.ts`), and the
|
|
59
|
-
editor has no case of its own for any type. The rules dialog lists the rules a status has as cards, collapsed to
|
|
60
|
-
their title and summary, and adds one from the menu ("When entering", "Entry conditions", "Automatic moves");
|
|
61
|
-
`PmExpandableTextarea` (`client/kit`) is the compact text area for long settings such as an instruction. A rule
|
|
62
|
-
whose plugin is gone stays in the definition: the editor shows it as unavailable and entering the status skips it.
|
|
63
|
-
`POST /api/projects/workflows/{workflowId}/preview` lists what saving a definition would change in the rules, and which rules wake
|
|
64
|
-
someone without anybody confirming it. A contributed type may also hold an entry condition (`canEnter`): every move
|
|
65
|
-
into a status carrying it asks it first, whoever moves (a person, an agent, a plan, an applied approval, the system
|
|
66
|
-
on an event), and a refusal is 400 with the type's own code. An exit condition (`canLeave`) is asked the same way
|
|
67
|
-
before an issue leaves a status carrying the rule.
|
|
68
|
-
- **Contributed workflow events and issue marks**: other plugins register workflow events through
|
|
69
|
-
`projectsWorkflowEventsToken` (a dotted key such as `acme.merged`, and the status categories a transition on it may
|
|
70
|
-
leave and enter) and fire one for a batch of issues with `projects.workflowEvents.fire({ event, issueIds, actor?,
|
|
71
|
-
note?, details? }, tx?)`: each issue moves along its workflow's `on` transition, as the system, and the activity names
|
|
72
|
-
`actor`. `projects.workflowEvents.target(event, issueId)` says where firing it would take one issue without moving it
|
|
73
|
-
(for a confirmation that says what an action will do). The plugin never knows what an event means. A transition on an event whose plugin is gone stays in the
|
|
74
|
-
definition and shows as unavailable. In the browser, `WorkflowEventsContext` (`client/kit`) titles the events for the
|
|
75
|
-
editor and the timeline. The issues pages show the list and the board, the board by default.
|
|
76
|
-
- **Ways to start an issue**: a status carrying a `startOption` rule (with an optional label and hint, text or i18n
|
|
77
|
-
keys) is offered by the New issue form as a process to start in, such as "Design first" on Analysis or "Straight to
|
|
78
|
-
development" on Todo; `GET /api/projects/issues/starts?projectId=` lists them, the workflow's initial status first, and
|
|
79
|
-
nothing while no status carries the rule (the form then shows no choice). `POST /api/projects/issues` takes the choice as
|
|
80
|
-
`statusKey`.
|
|
40
|
+
- **Statuses**: six, fixed for every project (`shared/statuses.ts`): `backlog` (nothing starts), `in_progress`,
|
|
41
|
+
`blocked` (waiting for a person), `in_review` (waiting to be accepted), `done` and `cancelled`. People move an issue
|
|
42
|
+
between any two of them; a principal of another kind only along its kind's `moves`, and only when its `mayMove`
|
|
43
|
+
agrees; the system only along a status event. Entering `blocked` or `in_review` tells the issue's owner, unless the
|
|
44
|
+
owner moved it (`owner_notified`). The moves go through `server/lifecycle` (below), compiled from the statuses, the
|
|
45
|
+
registered kinds' moves and the registered status events (`domains/statuses/`).
|
|
46
|
+
- **Status events**: other plugins register status events through `projectsStatusEventsToken` (a dotted key such as
|
|
47
|
+
`acme.merged`, the statuses it moves an issue out of, `from`, and the status it moves it to, `to`) and fire one for a
|
|
48
|
+
batch of issues with `projects.statusEvents.fire({ event, issueIds, actor?, note?, details? }, tx?)`: each issue in
|
|
49
|
+
one of `from` moves to `to`, as the system, and the activity names `actor`. `projects.statusEvents.target(event,
|
|
50
|
+
issueId)` says where firing it would take one issue without moving it (for a confirmation that says what an action
|
|
51
|
+
will do). The plugin never knows what an event means. In the browser, `StatusEventsContext` (`client/kit`) titles the
|
|
52
|
+
events for the timeline. The issues pages show the list and the board, the board by default.
|
|
53
|
+
- **Starting an issue**: a new issue starts in `backlog` or `in_progress` (`START_STATUSES`; `backlog` when the request
|
|
54
|
+
names none, `DEFAULT_START_STATUS`), and the New issue form asks "Start now" or "Later". Created in `in_progress`, or
|
|
55
|
+
moved there, an issue's work starts.
|
|
81
56
|
- **Projects**: a lead, members, visibility (`workspace` or `members`), status, dates and linked resources.
|
|
82
|
-
- **Issues**: an owner, an executor (nobody, a member, or a principal of another registered kind), a status
|
|
83
|
-
|
|
57
|
+
- **Issues**: an owner, an executor (nobody, a member, or a principal of another registered kind), a status,
|
|
58
|
+
priority, dates, a parent, labels and an activity history. Admins can soft-delete and restore.
|
|
84
59
|
- **Sub-issues and dependencies**: a sub-issue may have a stage (0–1000); a later stage waits until every earlier
|
|
85
60
|
stage of its siblings is finished (done or closed). An issue may be blocked by others; a link that would make issues
|
|
86
61
|
wait for each other in a cycle is refused. When an issue finishes, the issues waiting only on it are released (their
|
|
87
62
|
executor, or with nobody working on them their owner, is told), and the parent's owner is told when a stage or all
|
|
88
|
-
sub-issues are finished
|
|
89
|
-
`system` actor. A status may also refuse issues whose sub-issues are open (`subtasksDone`) or that are blocked
|
|
90
|
-
(`blockersDone`). A project may have a setup issue (`Project.setupIssueId`, an issue created with
|
|
63
|
+
sub-issues are finished; the parent's own status does not move on its own. A project may have a setup issue (`Project.setupIssueId`, an issue created with
|
|
91
64
|
`projectSetup: true` by someone who manages the project, one unfinished at a time): every issue created in the
|
|
92
65
|
project after it, except its own sub-issues, is created blocked by it until it is finished. `IssueTriggers` (`onUnblocked`, `onBlocked`, `onSubtasksFinished`) let other plugins react, and
|
|
93
66
|
`subtasks.visibleBlockers(viewer, issueIds)` tells another plugin's board what holds each issue now, in a fixed number
|
|
@@ -118,9 +91,8 @@ note?, details? }, tx?)`: each issue moves along its workflow's `on` transition,
|
|
|
118
91
|
so an inbox can merge it.
|
|
119
92
|
- **Batch reads for boards**: `issueQueries.matching(viewer, query, { executorType?, issueIds?, limit? })` answers, in
|
|
120
93
|
a fixed number of reads, the viewer's issues within the list's filters that an executor of a kind works on (unless
|
|
121
|
-
finished) or that are among the ids given (whatever their status), with `truncated` past the limit
|
|
122
|
-
`
|
|
123
|
-
issueIds)` those of them a person follows. An application's board of work joins its own records to issues with
|
|
94
|
+
finished) or that are among the ids given (whatever their status), with `truncated` past the limit, and
|
|
95
|
+
`subscriptions.followedBy(conn, userId, issueIds)` those of them a person follows. An application's board of work joins its own records to issues with
|
|
124
96
|
them, without a query per issue.
|
|
125
97
|
- **Operation plans** (`shared/plans.ts`, `server/domains/plans/`): a short list of changes (create or update an
|
|
126
98
|
issue, comment, add or remove a dependency, create a project; 1–50 rows, later rows may refer to what earlier ones
|
|
@@ -136,7 +108,7 @@ issueIds)` those of them a person follows. An application's board of work joins
|
|
|
136
108
|
made through a plan, or by an agent for a person (`Actor.via = 'agent'` with its trace), show on the timeline as
|
|
137
109
|
"via ‹Agent›" or "via ‹Agent›'s plan" (`Activity.via`). Other plugins use `projects.plans` (`PlanService`) and hear
|
|
138
110
|
decisions through `projectsPlanHooksToken` (`PlanHooks.onPlanDecided`). A plan is visible to its decider and, for a
|
|
139
|
-
status rule's plan about an issue, to the issue's owner and editors.
|
|
111
|
+
status rule's plan about an issue (from earlier versions), to the issue's owner and editors.
|
|
140
112
|
- **Intake with AI** (`shared/intake-ai.ts`, `server/domains/plans/intake/intake.ai.*`): as the old NocoProject, AI
|
|
141
113
|
splits requirements into drafts ("AI split"), revises the drafts by one instruction ("Ask AI to revise", with the
|
|
142
114
|
rows it added or changed highlighted and an undo), and breaks an issue down into sub-issue drafts ("AI breakdown" on
|
|
@@ -165,15 +137,12 @@ New accounts register directly from the invitation link with a name and password
|
|
|
165
137
|
| `GET/POST /invitations`, `POST …/{invitationId}/resend`, `DELETE …/{invitationId}` | Member invitations |
|
|
166
138
|
| `GET /settings`, `PATCH /settings` | Workspace settings |
|
|
167
139
|
| `GET/POST /labels`, `PATCH/DELETE /labels/{labelId}` | Labels |
|
|
168
|
-
| `GET/POST /workflows`, `GET/PATCH/DELETE /workflows/{workflowId}` | Workflows; a new one is a copy (`copyFrom`) |
|
|
169
|
-
| `POST /workflows/{workflowId}/preview` | What saving a definition would change |
|
|
170
|
-
| `POST /workflows/{workflowId}/setDefault` | Makes a workflow the default |
|
|
171
140
|
| `GET/POST /` , `GET/PATCH/DELETE /{projectId}` | Projects |
|
|
172
141
|
| `POST /{projectId}/members`, `DELETE …/members/{userId}` | Project members (201 the member added; 204) |
|
|
173
142
|
| `POST /{projectId}/resources`, `PATCH/DELETE …/resources/{resourceId}` | Project resources |
|
|
174
143
|
| `GET /issues?…&orderBy&pageSize&pageToken` | A page of issues, cursor-paginated |
|
|
175
144
|
| `GET /issues/board` | The board: a column per status, each a first page |
|
|
176
|
-
| `GET /issues/statuses
|
|
145
|
+
| `GET /issues/statuses` | The fixed statuses |
|
|
177
146
|
| `POST /issues`, `GET/PATCH/DELETE /issues/{issueId}` | Issues, by id or identifier (`PM-12`) |
|
|
178
147
|
| `POST /issues/{issueId}/restore` | Restores a deleted issue |
|
|
179
148
|
| `GET /issues/{issueId}/activities?pageSize&pageToken` | Older activities |
|
|
@@ -185,15 +154,10 @@ New accounts register directly from the invitation link with a name and password
|
|
|
185
154
|
| `GET/POST /issues/{issueId}/attachments` | The issue's own files; uploads one onto it |
|
|
186
155
|
| `POST /attachments` | Uploads one file, attached to nothing yet |
|
|
187
156
|
| `GET /attachments/{attachmentId}`, `…/content`, `DELETE` | A file, its bytes (`?download=true`), removing it |
|
|
188
|
-
| `GET /issues/{issueId}/checklists` | Every checklist the issue has had |
|
|
189
|
-
| `PATCH /issues/{issueId}/checklists/{statusKey}/items/{itemKey}` | Checks or unchecks an item (`{ checked }`) |
|
|
190
157
|
| `POST /issues/{issueId}/dependencies` | Adds a link (`{ dependsOnIssueId, type }`) |
|
|
191
158
|
| `PATCH /issues/{issueId}/dependencies/{dependencyId}` | Changes a link type (`{ type, expectedType }`) atomically |
|
|
192
159
|
| `DELETE /issues/{issueId}/dependencies/{dependencyId}` | Removes a link |
|
|
193
160
|
| `POST /issues/{issueId}/removeDependency` | Removes the link to an issue (`{ dependsOnIssueId, type }`) |
|
|
194
|
-
| `GET /approvals` | Status changes waiting for the caller's approval |
|
|
195
|
-
| `POST /approvals/{approvalId}/approve`, `…/reject` | An approver decides (`{ comment? }`) |
|
|
196
|
-
| `POST /approvals/{approvalId}/withdraw` | Whoever asked withdraws the request |
|
|
197
161
|
| `POST /plans/rehearse` | Rehearses a plan and stores nothing |
|
|
198
162
|
| `GET/POST /plans`, `GET/PATCH /plans/{planId}` | Operation plans: list, create, read, edit rows |
|
|
199
163
|
| `POST /plans/{planId}/execute`, `…/retry`, `…/void` | Decides a plan (`{ revision }`) |
|
|
@@ -205,38 +169,29 @@ New accounts register directly from the invitation link with a name and password
|
|
|
205
169
|
|
|
206
170
|
Relationship conversion preserves the link ID and checks the type the caller read (`expectedType`). A stale change returns 409 `DEPENDENCY_CHANGED`; if the target relationship already exists, it returns 409 `DEPENDENCY_EXISTS` and keeps both links. A related link may be converted from either end: the current issue becomes the waiting issue when changed to `blockedBy`.
|
|
207
171
|
|
|
208
|
-
Operations that add explicit or implicit waits (dependencies, conversions, issue creation, parent/stage changes and restores) share a dedicated database graph revision row. Its conditional increment protects cycle detection and writes until the outer transaction commits, across processes and projects. An outdated transaction snapshot returns 409 `DEPENDENCY_GRAPH_CHANGED`; reload and retry the whole operation. Every issue creation takes this protection before allocating its number, so plans that create issues and add dependencies use the same lock order. Standalone creates without dependencies lock the row without advancing the graph revision, so independent parallel creates still succeed without retrying each other. The revision is separate from settings/counters so MySQL reads of those rows after writing them cannot disguise an old graph snapshot. Restoring an issue is rejected if its waits would now create a cycle. Every relationship write, including both removal endpoints, acquires this protection before reading its type and endpoints, keeping duplicate checks, activity and release notifications consistent with conversions. Issue status and project changes,
|
|
172
|
+
Operations that add explicit or implicit waits (dependencies, conversions, issue creation, parent/stage changes and restores) share a dedicated database graph revision row. Its conditional increment protects cycle detection and writes until the outer transaction commits, across processes and projects. An outdated transaction snapshot returns 409 `DEPENDENCY_GRAPH_CHANGED`; reload and retry the whole operation. Every issue creation takes this protection before allocating its number, so plans that create issues and add dependencies use the same lock order. Standalone creates without dependencies lock the row without advancing the graph revision, so independent parallel creates still succeed without retrying each other. The revision is separate from settings/counters so MySQL reads of those rows after writing them cannot disguise an old graph snapshot. Restoring an issue is rejected if its waits would now create a cycle. Every relationship write, including both removal endpoints, acquires this protection before reading its type and endpoints, keeping duplicate checks, activity and release notifications consistent with conversions. Issue status and project changes, status events and deletion take the same guard before writing an issue, so concurrent changes cannot each see an old blocker and miss the last release. Automatic parent/stage completion keeps the originating guard; ordinary edits that cannot change waits do not acquire it. Plans acquire the guard without advancing its revision before their first row, including rehearsal and undo, so earlier issue edits cannot reverse the lock order of a later graph write.
|
|
209
173
|
|
|
210
174
|
Cursor lists (issues, activities, comment threads, plans) take `pageSize` (20 by default, at most 100; plans 50) and `pageToken`, and answer `meta.nextPageToken` until the last page. `orderBy` on issues is `updatedAt`, `createdAt`, `number` or `priority`, optionally followed by `asc` or `desc` (`updatedAt desc` by default). The other lists are answered whole with `meta.total`. A scoped API key may not use `/intake` or `/plans` (403 `SCOPED_KEY_FORBIDDEN`).
|
|
211
175
|
|
|
212
|
-
Errors are the standard error body with domain `projects`; clients branch on `reason`, and `metadata` carries the details. A missing resource the URL names is 404 `<RESOURCE>_NOT_FOUND` (such as `ISSUE_NOT_FOUND`); a project or issue named in the query that does not exist is 400 with a field violation. `PATCH /issues/{issueId}`
|
|
176
|
+
Errors are the standard error body with domain `projects`; clients branch on `reason`, and `metadata` carries the details. A missing resource the URL names is 404 `<RESOURCE>_NOT_FOUND` (such as `ISSUE_NOT_FOUND`); a project or issue named in the query that does not exist is 400 with a field violation. `PATCH /issues/{issueId}` needs the `revision` the caller read; a stale one is 409 `ABORTED` `REVISION_CONFLICT`. It answers 200 `{ data: { issue } }`. A status that does not exist, or a new issue in any status but `backlog` and `in_progress`, is 400 `INVALID_STATUS`; a move the caller's kind may not make is 400 `TRANSITION_NOT_ALLOWED`. A dependency that would close a cycle is 400 `DEPENDENCY_CYCLE` (`metadata.via`), one too deep to check 400 `DEPENDENCY_TOO_DEEP`, a duplicate 409 `ALREADY_EXISTS` `DEPENDENCY_EXISTS`. A plan with a failing row is 400 `PLAN_INVALID` with every row's check in `metadata.rows`; deciding a plan that is not open is 400 `PLAN_NOT_OPEN`, an expired one 400 `PLAN_EXPIRED`; undoing after the window is 400 `UNDO_EXPIRED`, with nothing left to revert 400 `NOTHING_TO_UNDO`, and when something changed since the preview 409 `ABORTED` `UNDO_STALE`. Other refusals by state are 400 `FAILED_PRECONDITION` too.
|
|
213
177
|
|
|
214
|
-
##
|
|
178
|
+
## Statuses and the lifecycle module
|
|
215
179
|
|
|
216
180
|
`server/lifecycle/` is a self-contained state machine for records, with no import from the domains, so it can become
|
|
217
181
|
a platform package: a definition as data (states with a category, transitions `from → to` naming who may take them,
|
|
218
|
-
`*` for any state, and event transitions `on` an event
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
`server/domains/
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
`
|
|
228
|
-
`
|
|
229
|
-
|
|
230
|
-
`
|
|
231
|
-
withdrawn or stale, each decision a transition with a "who may" rule). Approving moves the issue as the requester's
|
|
232
|
-
move, checked again; when it no longer passes, the request goes stale. Notices (`server/providers/notifications.ts`:
|
|
233
|
-
the owner told, approvers asked to decide, the requester told the outcome) go to `projectsNoticesToken` when the App
|
|
234
|
-
binds it (`ProjectsNotices`: `send` each notice with its kind, type, issue and approval request; `resolve` a decision
|
|
235
|
-
once its request is decided) — the assembling application keeps its inbox that way. A request another kind (an agent) made tells the
|
|
236
|
-
issue's owner its outcome instead of the requester; an approved request that no longer applies (its conditions failed
|
|
237
|
-
when it was approved) tells the approvers and whoever asked, except the approver (`approval_stale`). The issue page lists
|
|
238
|
-
the last five decided requests (`IssueDetail.recentApprovals`). Without it they go straight to the notification
|
|
239
|
-
plugin's in-app channel `projects.inboxChannel` names (`inbox` by default) when that channel is configured.
|
|
182
|
+
`*` for any state, and event transitions `on` an event, which only `fire` takes), `validateDefinition`, `compile` (the
|
|
183
|
+
questions the application asks) and `move`, the one path through which a state changes. It runs in the caller's unit
|
|
184
|
+
of work, in order: who may (the actor on the transition, and a registered "who may" rule over the record), the guards
|
|
185
|
+
of the state left and the state entered, the caller's write, and the entry actions, each in its own savepoint. Rules
|
|
186
|
+
are registered by name (`createLifecycleRegistry`).
|
|
187
|
+
|
|
188
|
+
`server/domains/statuses/` compiles the fixed statuses into such a definition: people `* → *`, each registered kind's
|
|
189
|
+
`moves` (behind a "who may" rule asking the kind's `mayMove`), and each status event's transitions for the system; the
|
|
190
|
+
definition is compiled again whenever the kinds or events change. The entry action `notifyOwner` on `blocked` and
|
|
191
|
+
`in_review` records `owner_notified` and announces it. Notices (`server/providers/notifications.ts`) go to
|
|
192
|
+
`projectsNoticesToken` when the App binds it (`ProjectsNotices`: `send` each notice with its kind, type and issue) —
|
|
193
|
+
the assembling application keeps its inbox that way. Without it they go straight to the notification plugin's in-app
|
|
194
|
+
channel `projects.inboxChannel` names (`inbox` by default) when that channel is configured.
|
|
240
195
|
|
|
241
196
|
## Permissions
|
|
242
197
|
|
|
@@ -248,7 +203,7 @@ What can be granted (`shared/access.ts`); the application stores and assigns the
|
|
|
248
203
|
| Business actions | `pm.issues` | `view`, `create`, `edit`, `comment`, `moderate-comments`, |
|
|
249
204
|
| | | `close`, `change-owner`, `delete` |
|
|
250
205
|
| Business actions | `pm.attachments` | `upload` |
|
|
251
|
-
| Settings items | `pm.general`, `pm.labels
|
|
206
|
+
| Settings items | `pm.general`, `pm.labels` | `read`, `update` |
|
|
252
207
|
| Settings items | `pm.members` | `read`, `invite`, `assign`, `define-roles` |
|
|
253
208
|
| Pages | `pm-my-issues`, `pm-issues`, `pm-projects` | `access` |
|
|
254
209
|
|
|
@@ -277,34 +232,31 @@ The plugin seeds no roles: the application that assembles it seeds its own (the
|
|
|
277
232
|
|
|
278
233
|
As the old NocoProject had it, My issues has "I own" and "I execute" only, and the New issue dialog opens on its "AI
|
|
279
234
|
draft" tab (the last tab used is remembered in the browser): requirements typed or uploaded are split into a draft of
|
|
280
|
-
issues, edited row by row and created together, after which the dialog closes. Its manual tab
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
moving an issue it executes out of backlog (a status change or a board drag). Nothing starts in backlog or a finished
|
|
284
|
-
status, so a change landing there asks nothing. Approvals are decided on the issue
|
|
285
|
-
page and wherever the application sends their notices (for example, its inbox).
|
|
235
|
+
issues, edited row by row and created together, after which the dialog closes. Its manual tab asks when the issue
|
|
236
|
+
starts: "Start now" (`in_progress`) or "Later" (`backlog`), and preselects the default executor. Nothing asks "Start
|
|
237
|
+
now?" any more: moving an issue to `in_progress` starts its work.
|
|
286
238
|
|
|
287
239
|
The settings pages are exported for the application to route under its own `/config` (`client/config.ts`: the issue
|
|
288
|
-
prefix
|
|
240
|
+
prefix and labels), and components it reuses on its member pages are exported from
|
|
289
241
|
`client/kit.ts`. The application routes an issue's page itself and presents it (for example, with the UI Library's
|
|
290
242
|
`issue-detail`, `comment-thread` and `attachment-list`) over the headless parts in `client/issues.ts`: the issue
|
|
291
|
-
(`useIssueDetail`), its property changes (`useIssueUpdate
|
|
243
|
+
(`useIssueDetail`), its property changes (`useIssueUpdate`; `useConfirmedUpdate` applies a change at once), every other
|
|
292
244
|
change of the page (`useIssuePageActions`), the activity line (`useIssueTimeline`, `useIssueCommentActions`,
|
|
293
245
|
`useMentionSearch`, `useAttachmentUploads`), "Break into sub-issues" (`useIntakeBreakdown`), and the permission and
|
|
294
246
|
wording helpers. It routes a project's page the same way, as a child of the plugin's `/projects` (`projectsRoute` from
|
|
295
|
-
`client/pages`), over the headless parts in `client/projects.ts`: the project with
|
|
296
|
-
(`useProjectDetail`, `useProjectStatuses
|
|
247
|
+
`client/pages`), over the headless parts in `client/projects.ts`: the project with the statuses
|
|
248
|
+
(`useProjectDetail`, `useProjectStatuses`), its property changes (`useProjectUpdate`), members and
|
|
297
249
|
visibility (`useProjectMembership`), working directories (`useProjectResources`, `useResourceValidation`), deleting it
|
|
298
250
|
(`useDeleteProject`), and the progress, numbers and permission helpers. The pages are behind the `pm-my-issues`, `pm-issues` and `pm-projects` page grants. They hide
|
|
299
251
|
what the server would refuse (`client/lib/permissions.ts` mirrors its rules); the server still checks every request.
|
|
300
|
-
Open pages refresh when the server announces a change on the `pm:changes` realtime topic.
|
|
252
|
+
Open pages refresh when the server announces a change on the `pm:changes` realtime topic: once for the events of a moment, naming the issues that changed when no change moved an issue between lists (`issueIds`), so a page refreshes only what it shows of them (`announcedIssueIds`, `changedIssueSegments` and `isIssueRead` in `client/kit`).
|
|
301
253
|
|
|
302
254
|
## Layout
|
|
303
255
|
|
|
304
256
|
- `shared/`: types and constants the server and the client share.
|
|
305
257
|
- `server/kernel/`: infrastructure with no business rules (errors, events, transactions, pagination, validation).
|
|
306
258
|
- `server/access/`: how a request becomes a `Viewer` with resolved permissions.
|
|
307
|
-
- `server/lifecycle/`: the record state machine behind
|
|
259
|
+
- `server/lifecycle/`: the record state machine behind the statuses (see above).
|
|
308
260
|
- `server/domains/<name>/`: one folder per domain: `*.store.ts` (tables), `*.access.ts` (who sees what),
|
|
309
261
|
`*.service.ts` (writes), `*.routes.ts` (HTTP), `index.ts` (the domain's public surface).
|
|
310
262
|
- `server/composition.ts`: wires the domains; `server/providers/` registers them with the app.
|
|
@@ -323,3 +275,7 @@ pnpm --filter @nocobase/app-plugin-projects check
|
|
|
323
275
|
When renewing an invitation, deleted projects are ignored if at least one selected project remains. The inviter must still be authorized to invite into every remaining project. If all originally selected projects were deleted, renewal is rejected.
|
|
324
276
|
|
|
325
277
|
Invitation emails use `notificationService.sendTransient()` so credentials never enter notification message snapshots or job storage. This performs one bounded attempt without durable retries or deduplication. Failures retain safe status/category diagnostics without raw provider messages. The inviter can generate and privately deliver a new link if delivery fails. Historical notification snapshots are not rewritten.
|
|
278
|
+
|
|
279
|
+
## Structured issue progress
|
|
280
|
+
|
|
281
|
+
`Issue` exposes nullable text `needsYou` and `next`. `PATCH /api/projects/issues/{issueId}` and `issue.update` plan rows accept them in the same transaction as `statusKey`. Both fields are optional for people, agents, plans and system events. Omitted needsYou is retained in Blocked or In review; null, empty or whitespace clears it. Applications may constrain authenticated callers at their request boundary. Leaving these states clears it. Omitted `next` is retained; nonblank text replaces it; null, an empty string or whitespace clears it. Done and Cancelled always clear it. Both fields allow at most 2,000 characters. Progress-only writes advance revision and emit the existing refresh event. System status events share the optional-field validation and clearing rules. The new reversible migration adds the two columns without backfilling comments.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which cached issue reads an announcement (`PmChangeEvent.issueIds`) concerns: an issue's reads are keyed by
|
|
3
|
+
* `pmKeys.issue(idOrKey)` and what sits under it, with the id or, on a page opened by its key, the identifier.
|
|
4
|
+
*/
|
|
5
|
+
import type { QueryClient, QueryKey } from '@tanstack/react-query';
|
|
6
|
+
/** The issue ids an announcement names, or null when any issue may have changed. */
|
|
7
|
+
export declare function announcedIssueIds(payload: unknown): ReadonlySet<string> | null;
|
|
8
|
+
/** The key segments (`pmKeys.issue(segment)`) whose reads are of one of `issueIds`: the ids, and the keys loaded for them. */
|
|
9
|
+
export declare function changedIssueSegments(client: Pick<QueryClient, 'getQueryCache'>, issueIds: ReadonlySet<string>): Set<string>;
|
|
10
|
+
/** Whether a query key is one issue's read (`['pm', 'issue', segment, ...]`) of a segment among `segments`. */
|
|
11
|
+
export declare function isIssueRead(key: QueryKey, segments: ReadonlySet<string>): boolean;
|
|
12
|
+
//# sourceMappingURL=changed-issues.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changed-issues.d.ts","sourceRoot":"","sources":["../../../client/api/changed-issues.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAInE,oFAAoF;AACpF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,GACf,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAK5B;AAED,8HAA8H;AAC9H,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAC1C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAC5B,GAAG,CAAC,MAAM,CAAC,CAeb;AAED,+GAA+G;AAC/G,wBAAgB,WAAW,CACzB,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAC5B,OAAO,CAOT"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** The issue ids an announcement names, or null when any issue may have changed. */
|
|
2
|
+
export function announcedIssueIds(payload) {
|
|
3
|
+
const ids = payload?.issueIds;
|
|
4
|
+
return Array.isArray(ids) && ids.every((id) => typeof id === 'string')
|
|
5
|
+
? new Set(ids)
|
|
6
|
+
: null;
|
|
7
|
+
}
|
|
8
|
+
/** The key segments (`pmKeys.issue(segment)`) whose reads are of one of `issueIds`: the ids, and the keys loaded for them. */
|
|
9
|
+
export function changedIssueSegments(client, issueIds) {
|
|
10
|
+
const segments = new Set(issueIds);
|
|
11
|
+
for (const query of client
|
|
12
|
+
.getQueryCache()
|
|
13
|
+
.findAll({ queryKey: ['pm', 'issue'] })) {
|
|
14
|
+
const segment = query.queryKey[2];
|
|
15
|
+
const id = query.state.data?.id;
|
|
16
|
+
if (typeof segment === 'string' &&
|
|
17
|
+
typeof id === 'string' &&
|
|
18
|
+
issueIds.has(id))
|
|
19
|
+
segments.add(segment);
|
|
20
|
+
}
|
|
21
|
+
return segments;
|
|
22
|
+
}
|
|
23
|
+
/** Whether a query key is one issue's read (`['pm', 'issue', segment, ...]`) of a segment among `segments`. */
|
|
24
|
+
export function isIssueRead(key, segments) {
|
|
25
|
+
return (key[0] === 'pm' &&
|
|
26
|
+
key[1] === 'issue' &&
|
|
27
|
+
typeof key[2] === 'string' &&
|
|
28
|
+
segments.has(key[2]));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=changed-issues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changed-issues.js","sourceRoot":"","sources":["../../../client/api/changed-issues.ts"],"names":[],"mappings":"AAQA,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAC/B,OAAgB;IAEhB,MAAM,GAAG,GAAI,OAAyC,EAAE,QAAQ,CAAC;IACjE,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC;QACpE,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC;QACd,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,8HAA8H;AAC9H,MAAM,UAAU,oBAAoB,CAClC,MAA0C,EAC1C,QAA6B;IAE7B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM;SACvB,aAAa,EAAE;SACf,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,EAAE,GAAI,KAAK,CAAC,KAAK,CAAC,IAAqC,EAAE,EAAE,CAAC;QAClE,IACE,OAAO,OAAO,KAAK,QAAQ;YAC3B,OAAO,EAAE,KAAK,QAAQ;YACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAEhB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,WAAW,CACzB,GAAa,EACb,QAA6B;IAE7B,OAAO,CACL,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;QACf,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO;QAClB,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ;QAC1B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACrB,CAAC;AACJ,CAAC"}
|
|
@@ -5,12 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { ApiClient } from '@nocobase/app-client';
|
|
7
7
|
import type { Page } from '../../shared/common.js';
|
|
8
|
-
import type { ApprovalRequest } from '../../shared/approvals.js';
|
|
9
8
|
import type { Attachment } from '../../shared/attachments.js';
|
|
10
|
-
import type { IssueChecklist, UpdateChecklistItemRequest } from '../../shared/checklists.js';
|
|
11
9
|
import { type CommentReaction, type CreateCommentRequest, type CreateCommentResult, type IssueComment, type MentionCandidate, type ThreadPage, type ThreadResolution } from '../../shared/comments.js';
|
|
12
10
|
import type { CreateInvitationsRequest, Invitation, InvitationResult } from '../../shared/invitations.js';
|
|
13
|
-
import { type ActivityPage, type CreateIssueRequest, type Issue, type IssueBoard, type
|
|
11
|
+
import { type ActivityPage, type CreateIssueRequest, type Issue, type IssueBoard, type IssueDetail, type IssueListItem, type IssueListQuery, type StatusDefinition, type UpdateIssueRequest, type UpdateIssueResult } from '../../shared/issues.js';
|
|
14
12
|
import type { CreateLabelRequest, Label, UpdateLabelRequest } from '../../shared/labels.js';
|
|
15
13
|
import type { ExecutorCandidate } from '../../shared/kinds.js';
|
|
16
14
|
import type { ApiKeyActor, Me, Member } from '../../shared/members.js';
|
|
@@ -19,7 +17,6 @@ import type { UpdateSettingsRequest, WorkspaceSettings } from '../../shared/sett
|
|
|
19
17
|
import type { AddDependencyRequest, IssueDependency, UpdateDependencyRequest } from '../../shared/subtasks.js';
|
|
20
18
|
import type { UserRef } from '../../shared/common.js';
|
|
21
19
|
import type { SubscriptionState } from '../../shared/subscriptions.js';
|
|
22
|
-
import type { CreateWorkflowRequest, UpdateWorkflowRequest, WorkflowDefinition, WorkflowListItem, WorkflowPreview } from '../../shared/workflows.js';
|
|
23
20
|
export declare class PmApi {
|
|
24
21
|
private readonly api;
|
|
25
22
|
constructor(api: ApiClient);
|
|
@@ -39,14 +36,6 @@ export declare class PmApi {
|
|
|
39
36
|
createLabel(input: CreateLabelRequest): Promise<Label>;
|
|
40
37
|
updateLabel(labelId: string, input: UpdateLabelRequest): Promise<Label>;
|
|
41
38
|
deleteLabel(labelId: string): Promise<void>;
|
|
42
|
-
workflows(): Promise<WorkflowListItem[]>;
|
|
43
|
-
workflow(workflowId: string): Promise<WorkflowListItem>;
|
|
44
|
-
createWorkflow(input: CreateWorkflowRequest): Promise<WorkflowListItem>;
|
|
45
|
-
updateWorkflow(workflowId: string, input: UpdateWorkflowRequest): Promise<WorkflowListItem>;
|
|
46
|
-
/** What saving `definition` would change in the workflow's rules; nothing is written. */
|
|
47
|
-
previewWorkflow(workflowId: string, definition: WorkflowDefinition): Promise<WorkflowPreview>;
|
|
48
|
-
setDefaultWorkflow(workflowId: string): Promise<WorkflowListItem>;
|
|
49
|
-
deleteWorkflow(workflowId: string): Promise<void>;
|
|
50
39
|
projects(): Promise<ProjectListItem[]>;
|
|
51
40
|
project(projectId: string): Promise<ProjectDetail>;
|
|
52
41
|
createProject(input: CreateProjectRequest): Promise<ProjectDetail>;
|
|
@@ -58,10 +47,8 @@ export declare class PmApi {
|
|
|
58
47
|
addProjectResource(projectId: string, input: CreateProjectResourceRequest): Promise<ProjectResource>;
|
|
59
48
|
updateProjectResource(projectId: string, resourceId: string, input: UpdateProjectResourceRequest): Promise<ProjectResource>;
|
|
60
49
|
deleteProjectResource(projectId: string, resourceId: string): Promise<void>;
|
|
61
|
-
/** The statuses
|
|
62
|
-
statuses(
|
|
63
|
-
/** The ways a new issue may start in a project's workflow; without a project, in that of issues without one. */
|
|
64
|
-
starts(projectId?: string | null): Promise<IssueStarts>;
|
|
50
|
+
/** The fixed statuses, in order. */
|
|
51
|
+
statuses(): Promise<StatusDefinition[]>;
|
|
65
52
|
issuePage(query: IssueListQuery): Promise<Page<IssueListItem>>;
|
|
66
53
|
/** A column per status, each with its first `ISSUE_PAGE_LIMIT.default` issues. */
|
|
67
54
|
board(query: IssueListQuery): Promise<IssueBoard>;
|
|
@@ -69,14 +56,10 @@ export declare class PmApi {
|
|
|
69
56
|
issue(idOrKey: string): Promise<IssueDetail>;
|
|
70
57
|
activities(issueId: string, cursor?: string): Promise<ActivityPage>;
|
|
71
58
|
createIssue(input: CreateIssueRequest): Promise<Issue>;
|
|
72
|
-
/** The issue after the change
|
|
59
|
+
/** The issue after the change. */
|
|
73
60
|
updateIssue(issueId: string, input: UpdateIssueRequest): Promise<UpdateIssueResult>;
|
|
74
61
|
deleteIssue(issueId: string): Promise<void>;
|
|
75
62
|
restoreIssue(issueId: string): Promise<Issue>;
|
|
76
|
-
/** The status changes waiting for the caller's approval. */
|
|
77
|
-
approvals(): Promise<ApprovalRequest[]>;
|
|
78
|
-
decideApproval(requestId: string, decision: 'approve' | 'reject', comment?: string): Promise<ApprovalRequest>;
|
|
79
|
-
withdrawApproval(requestId: string): Promise<ApprovalRequest>;
|
|
80
63
|
/** Makes the issue wait for (`blockedBy`, the default) or link to (`relatedTo`) another; answers the link. */
|
|
81
64
|
addDependency(issueId: string, input: AddDependencyRequest): Promise<IssueDependency>;
|
|
82
65
|
/** Converts a relationship atomically, keeping its id and checking the type the caller read. */
|
|
@@ -84,8 +67,6 @@ export declare class PmApi {
|
|
|
84
67
|
/** Removes the link to `dependsOnIssueId` of `type` (`blockedBy` when left out). */
|
|
85
68
|
removeDependencyTo(issueId: string, input: AddDependencyRequest): Promise<void>;
|
|
86
69
|
removeDependency(issueId: string, dependencyId: string): Promise<void>;
|
|
87
|
-
/** Checks or unchecks one item of the issue's checklist of `statusKey`; answers that checklist. */
|
|
88
|
-
setChecklistItem(issueId: string, statusKey: string, itemKey: string, input: UpdateChecklistItemRequest): Promise<IssueChecklist>;
|
|
89
70
|
/** Threads older than `cursor` (the detail brings the newest page and its cursor). */
|
|
90
71
|
threads(issueId: string, cursor?: string): Promise<ThreadPage>;
|
|
91
72
|
createComment(issueId: string, input: CreateCommentRequest): Promise<CreateCommentResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../client/api/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../client/api/client.ts"],"names":[],"mappings":"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"}
|