@topogram/template-todo 0.1.30
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/README.md +91 -0
- package/implementation/README.md +9 -0
- package/implementation/backend/reference.js +206 -0
- package/implementation/backend/repository-reference.js +74 -0
- package/implementation/backend/repository-renderers.js +442 -0
- package/implementation/index.js +53 -0
- package/implementation/runtime/check-renderers.js +215 -0
- package/implementation/runtime/checks.js +120 -0
- package/implementation/runtime/reference.js +92 -0
- package/implementation/web/reference.js +51 -0
- package/implementation/web/renderers.js +1223 -0
- package/implementation/web/screens-reference.js +15 -0
- package/package.json +31 -0
- package/topogram/actors/actor-user.tg +6 -0
- package/topogram/capabilities/cap-complete-task.tg +12 -0
- package/topogram/capabilities/cap-create-project.tg +11 -0
- package/topogram/capabilities/cap-create-task.tg +14 -0
- package/topogram/capabilities/cap-create-user.tg +11 -0
- package/topogram/capabilities/cap-delete-task.tg +12 -0
- package/topogram/capabilities/cap-download-task-export.tg +10 -0
- package/topogram/capabilities/cap-export-tasks.tg +11 -0
- package/topogram/capabilities/cap-get-project.tg +11 -0
- package/topogram/capabilities/cap-get-task-export-job.tg +11 -0
- package/topogram/capabilities/cap-get-task.tg +11 -0
- package/topogram/capabilities/cap-get-user.tg +11 -0
- package/topogram/capabilities/cap-list-projects.tg +11 -0
- package/topogram/capabilities/cap-list-tasks.tg +11 -0
- package/topogram/capabilities/cap-list-users.tg +11 -0
- package/topogram/capabilities/cap-update-project.tg +12 -0
- package/topogram/capabilities/cap-update-task.tg +12 -0
- package/topogram/capabilities/cap-update-user.tg +12 -0
- package/topogram/components/component-ui-task-board.tg +33 -0
- package/topogram/components/component-ui-task-calendar.tg +30 -0
- package/topogram/components/component-ui-task-summary.tg +23 -0
- package/topogram/components/component-ui-task-table.tg +34 -0
- package/topogram/decisions/decision-task-ownership.tg +9 -0
- package/topogram/docs/glossary/user.md +22 -0
- package/topogram/docs/journeys/task-creation-and-ownership.md +57 -0
- package/topogram/entities/entity-project.tg +28 -0
- package/topogram/entities/entity-task.tg +38 -0
- package/topogram/entities/entity-user.tg +24 -0
- package/topogram/enums/enum-export-job-status.tg +3 -0
- package/topogram/enums/enum-project-status.tg +3 -0
- package/topogram/enums/enum-task-priority.tg +3 -0
- package/topogram/enums/enum-task-status.tg +3 -0
- package/topogram/operations/operation-task-creation-monitoring.tg +10 -0
- package/topogram/projections/proj-api.tg +177 -0
- package/topogram/projections/proj-db-postgres.tg +55 -0
- package/topogram/projections/proj-db-sqlite.tg +47 -0
- package/topogram/projections/proj-ui-shared.tg +133 -0
- package/topogram/projections/proj-ui-web-react.tg +92 -0
- package/topogram/projections/proj-ui-web.tg +92 -0
- package/topogram/rules/rule-no-task-creation-in-archived-project.tg +10 -0
- package/topogram/rules/rule-only-active-users-may-own-tasks.tg +10 -0
- package/topogram/shapes/shape-input-complete-task.tg +11 -0
- package/topogram/shapes/shape-input-create-project.tg +6 -0
- package/topogram/shapes/shape-input-create-task.tg +6 -0
- package/topogram/shapes/shape-input-create-user.tg +6 -0
- package/topogram/shapes/shape-input-delete-task.tg +10 -0
- package/topogram/shapes/shape-input-export-tasks.tg +13 -0
- package/topogram/shapes/shape-input-get-project.tg +10 -0
- package/topogram/shapes/shape-input-get-task-export-job.tg +10 -0
- package/topogram/shapes/shape-input-get-task.tg +10 -0
- package/topogram/shapes/shape-input-get-user.tg +10 -0
- package/topogram/shapes/shape-input-list-projects.tg +11 -0
- package/topogram/shapes/shape-input-list-tasks.tg +14 -0
- package/topogram/shapes/shape-input-list-users.tg +11 -0
- package/topogram/shapes/shape-input-update-project.tg +14 -0
- package/topogram/shapes/shape-input-update-task.tg +16 -0
- package/topogram/shapes/shape-input-update-user.tg +13 -0
- package/topogram/shapes/shape-output-project-card.tg +6 -0
- package/topogram/shapes/shape-output-project-detail.tg +6 -0
- package/topogram/shapes/shape-output-task-card.tg +19 -0
- package/topogram/shapes/shape-output-task-detail.tg +6 -0
- package/topogram/shapes/shape-output-task-export-callback.tg +14 -0
- package/topogram/shapes/shape-output-task-export-job.tg +13 -0
- package/topogram/shapes/shape-output-task-export-status.tg +17 -0
- package/topogram/shapes/shape-output-user-card.tg +6 -0
- package/topogram/shapes/shape-output-user-detail.tg +6 -0
- package/topogram/terms/term-user.tg +5 -0
- package/topogram/verifications/verification-create-task-policy.tg +15 -0
- package/topogram/verifications/verification-runtime-smoke.tg +16 -0
- package/topogram/verifications/verification-task-runtime-flow.tg +31 -0
- package/topogram-template.json +11 -0
- package/topogram.project.json +53 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
projection proj_api {
|
|
2
|
+
name "API"
|
|
3
|
+
description "HTTP API realization for Todo"
|
|
4
|
+
platform dotnet
|
|
5
|
+
|
|
6
|
+
realizes [cap_create_task, cap_get_task, cap_update_task, cap_complete_task, cap_list_tasks, cap_delete_task, cap_export_tasks, cap_get_task_export_job, cap_download_task_export, cap_list_projects, cap_get_project, cap_create_project, cap_update_project, cap_list_users, cap_get_user, cap_create_user, cap_update_user]
|
|
7
|
+
|
|
8
|
+
outputs [
|
|
9
|
+
database_schema,
|
|
10
|
+
entity_models,
|
|
11
|
+
request_contracts,
|
|
12
|
+
response_contracts,
|
|
13
|
+
validation_handlers,
|
|
14
|
+
endpoints
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
http {
|
|
18
|
+
cap_create_task method POST path /tasks success 201 auth user request body
|
|
19
|
+
cap_get_task method GET path /tasks/:id success 200 auth user request path
|
|
20
|
+
cap_update_task method PATCH path /tasks/:id success 200 auth user request body
|
|
21
|
+
cap_complete_task method POST path /tasks/:id/complete success 200 auth user request body
|
|
22
|
+
cap_list_tasks method GET path /tasks success 200 auth user request query
|
|
23
|
+
cap_delete_task method DELETE path /tasks/:id success 200 auth user request path
|
|
24
|
+
cap_create_project method POST path /projects success 201 auth user request body
|
|
25
|
+
cap_get_project method GET path /projects/:id success 200 auth user request path
|
|
26
|
+
cap_update_project method PATCH path /projects/:id success 200 auth user request body
|
|
27
|
+
cap_list_projects method GET path /projects success 200 auth user request query
|
|
28
|
+
cap_create_user method POST path /users success 201 auth user request body
|
|
29
|
+
cap_get_user method GET path /users/:id success 200 auth user request path
|
|
30
|
+
cap_update_user method PATCH path /users/:id success 200 auth user request body
|
|
31
|
+
cap_list_users method GET path /users success 200 auth user request query
|
|
32
|
+
cap_export_tasks method POST path /tasks/export success 202 auth user request body
|
|
33
|
+
cap_get_task_export_job method GET path /task-exports/:job_id success 200 auth user request path
|
|
34
|
+
cap_download_task_export method GET path /task-exports/:job_id/download success 200 auth user request path
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
http_errors {
|
|
38
|
+
cap_create_task rule_no_task_creation_in_archived_project 409
|
|
39
|
+
cap_create_task rule_only_active_users_may_own_tasks 400
|
|
40
|
+
cap_create_task cap_create_task_invalid_request 400
|
|
41
|
+
cap_get_task cap_get_task_not_found 404
|
|
42
|
+
cap_get_project cap_get_project_not_found 404
|
|
43
|
+
cap_update_project cap_get_project_not_found 404
|
|
44
|
+
cap_get_user cap_get_user_not_found 404
|
|
45
|
+
cap_update_user cap_get_user_not_found 404
|
|
46
|
+
cap_delete_task cap_delete_task_not_found 404
|
|
47
|
+
cap_get_task_export_job cap_get_task_export_job_not_found 404
|
|
48
|
+
cap_download_task_export cap_download_task_export_not_found 404
|
|
49
|
+
cap_download_task_export cap_download_task_export_not_ready 409
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
http_fields {
|
|
53
|
+
cap_create_task input title in body
|
|
54
|
+
cap_create_task input description in body
|
|
55
|
+
cap_create_task input priority in body
|
|
56
|
+
cap_create_task input owner_id in body
|
|
57
|
+
cap_create_task input project_id in body
|
|
58
|
+
cap_create_task input due_at in body
|
|
59
|
+
|
|
60
|
+
cap_update_task input task_id in path as id
|
|
61
|
+
cap_update_task input title in body
|
|
62
|
+
cap_update_task input description in body
|
|
63
|
+
cap_update_task input priority in body
|
|
64
|
+
cap_update_task input owner_id in body
|
|
65
|
+
cap_update_task input due_at in body
|
|
66
|
+
cap_update_task input status in body
|
|
67
|
+
|
|
68
|
+
cap_complete_task input task_id in path as id
|
|
69
|
+
cap_complete_task input completed_at in body
|
|
70
|
+
|
|
71
|
+
cap_get_task input task_id in path as id
|
|
72
|
+
|
|
73
|
+
cap_delete_task input task_id in path as id
|
|
74
|
+
cap_get_project input project_id in path as id
|
|
75
|
+
cap_update_project input project_id in path as id
|
|
76
|
+
cap_get_user input user_id in path as id
|
|
77
|
+
cap_update_user input user_id in path as id
|
|
78
|
+
cap_get_task_export_job input job_id in path as job_id
|
|
79
|
+
cap_download_task_export input job_id in path as job_id
|
|
80
|
+
|
|
81
|
+
cap_list_tasks input project_id in query
|
|
82
|
+
cap_list_tasks input owner_id in query
|
|
83
|
+
cap_list_tasks input status in query
|
|
84
|
+
cap_list_tasks input after in query
|
|
85
|
+
cap_list_tasks input limit in query
|
|
86
|
+
cap_list_projects input after in query
|
|
87
|
+
cap_list_projects input limit in query
|
|
88
|
+
cap_list_users input after in query
|
|
89
|
+
cap_list_users input limit in query
|
|
90
|
+
|
|
91
|
+
cap_create_project input name in body
|
|
92
|
+
cap_create_project input description in body
|
|
93
|
+
cap_create_project input status in body
|
|
94
|
+
cap_create_project input owner_id in body
|
|
95
|
+
|
|
96
|
+
cap_update_project input name in body
|
|
97
|
+
cap_update_project input description in body
|
|
98
|
+
cap_update_project input status in body
|
|
99
|
+
cap_update_project input owner_id in body
|
|
100
|
+
|
|
101
|
+
cap_create_user input email in body
|
|
102
|
+
cap_create_user input display_name in body
|
|
103
|
+
cap_create_user input is_active in body
|
|
104
|
+
|
|
105
|
+
cap_update_user input email in body
|
|
106
|
+
cap_update_user input display_name in body
|
|
107
|
+
cap_update_user input is_active in body
|
|
108
|
+
|
|
109
|
+
cap_export_tasks input project_id in body
|
|
110
|
+
cap_export_tasks input owner_id in body
|
|
111
|
+
cap_export_tasks input status in body
|
|
112
|
+
cap_export_tasks input callback_url in body
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
http_responses {
|
|
116
|
+
cap_list_tasks mode cursor item shape_output_task_detail cursor request_after after response_next next_cursor limit field limit default 25 max 100 sort by created_at direction desc total included false
|
|
117
|
+
cap_list_projects mode cursor item shape_output_project_detail cursor request_after after response_next next_cursor limit field limit default 25 max 100 sort by created_at direction desc total included false
|
|
118
|
+
cap_list_users mode cursor item shape_output_user_detail cursor request_after after response_next next_cursor limit field limit default 25 max 100 sort by created_at direction desc total included false
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
http_preconditions {
|
|
122
|
+
cap_update_task header If-Match required true error 412 source updated_at code cap_update_task_precondition_failed
|
|
123
|
+
cap_complete_task header If-Match required true error 412 source updated_at code cap_complete_task_precondition_failed
|
|
124
|
+
cap_delete_task header If-Match required true error 412 source updated_at code cap_delete_task_precondition_failed
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
http_idempotency {
|
|
128
|
+
cap_create_task header Idempotency-Key required true error 409 code cap_create_task_idempotency_conflict
|
|
129
|
+
cap_complete_task header Idempotency-Key required true error 409 code cap_complete_task_idempotency_conflict
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
http_cache {
|
|
133
|
+
cap_get_task response_header ETag request_header If-None-Match required false not_modified 304 source updated_at code cap_get_task_not_modified
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
http_delete {
|
|
137
|
+
cap_delete_task mode soft field status value archived response body
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
http_async {
|
|
141
|
+
cap_export_tasks mode job accepted 202 location_header Location retry_after_header Retry-After status_path /task-exports/:job_id status_capability cap_get_task_export_job job shape_output_task_export_job
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
http_status {
|
|
145
|
+
cap_get_task_export_job async_for cap_export_tasks state_field status completed completed failed failed expired expired download_capability cap_download_task_export download_field download_url error_field error_message
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
http_download {
|
|
149
|
+
cap_download_task_export async_for cap_export_tasks media application/zip filename task-export.zip disposition attachment
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
http_authz {
|
|
153
|
+
cap_create_task permission tasks.create
|
|
154
|
+
cap_get_task ownership owner_or_admin ownership_field owner_id
|
|
155
|
+
cap_update_task ownership owner_or_admin ownership_field owner_id permission tasks.update
|
|
156
|
+
cap_complete_task ownership owner_or_admin ownership_field owner_id permission tasks.complete
|
|
157
|
+
cap_list_tasks permission tasks.read
|
|
158
|
+
cap_delete_task role manager permission tasks.delete
|
|
159
|
+
cap_create_project permission projects.create
|
|
160
|
+
cap_get_project permission projects.read
|
|
161
|
+
cap_update_project permission projects.update
|
|
162
|
+
cap_list_projects permission projects.read
|
|
163
|
+
cap_create_user permission users.create
|
|
164
|
+
cap_get_user permission users.read
|
|
165
|
+
cap_update_user permission users.update
|
|
166
|
+
cap_list_users permission users.read
|
|
167
|
+
cap_export_tasks permission tasks.export
|
|
168
|
+
cap_get_task_export_job permission tasks.export.read ownership owner_or_admin ownership_field owner_id
|
|
169
|
+
cap_download_task_export permission tasks.export.download ownership owner_or_admin ownership_field owner_id
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
http_callbacks {
|
|
173
|
+
cap_export_tasks event export_completed target_field callback_url method POST payload shape_output_task_export_callback success 202
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
status active
|
|
177
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
projection proj_db_postgres {
|
|
2
|
+
name "Todo Postgres DB"
|
|
3
|
+
description "Postgres persistence realization for the Todo domain"
|
|
4
|
+
|
|
5
|
+
platform db_postgres
|
|
6
|
+
realizes [entity_task, entity_project, entity_user]
|
|
7
|
+
outputs [db_contract, sql_schema]
|
|
8
|
+
|
|
9
|
+
db_tables {
|
|
10
|
+
entity_task table tasks
|
|
11
|
+
entity_project table projects
|
|
12
|
+
entity_user table users
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
db_columns {
|
|
16
|
+
entity_task field owner_id column owner_id
|
|
17
|
+
entity_task field project_id column project_id
|
|
18
|
+
entity_project field owner_id column owner_id
|
|
19
|
+
entity_project field created_at column created_at
|
|
20
|
+
entity_user field display_name column display_name
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
db_keys {
|
|
24
|
+
entity_task primary [id]
|
|
25
|
+
entity_project primary [id]
|
|
26
|
+
entity_user primary [id]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
db_indexes {
|
|
30
|
+
entity_task index [project_id, status]
|
|
31
|
+
entity_task index [owner_id, status]
|
|
32
|
+
entity_project unique [name]
|
|
33
|
+
entity_project index [owner_id, status]
|
|
34
|
+
entity_user unique [email]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
db_relations {
|
|
38
|
+
entity_task foreign_key owner_id references entity_user.id on_delete set_null
|
|
39
|
+
entity_task foreign_key project_id references entity_project.id on_delete cascade
|
|
40
|
+
entity_project foreign_key owner_id references entity_user.id on_delete set_null
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
db_lifecycle {
|
|
44
|
+
entity_task soft_delete field status value archived
|
|
45
|
+
entity_task timestamps created_at created_at updated_at updated_at
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
generator_defaults {
|
|
49
|
+
profile postgres_sql
|
|
50
|
+
language sql
|
|
51
|
+
styling css
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
status active
|
|
55
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
projection proj_db_sqlite {
|
|
2
|
+
name "Todo SQLite DB"
|
|
3
|
+
description "SQLite persistence realization for the Todo domain"
|
|
4
|
+
|
|
5
|
+
platform db_sqlite
|
|
6
|
+
realizes [entity_task, entity_project, entity_user]
|
|
7
|
+
outputs [db_contract, sql_schema]
|
|
8
|
+
|
|
9
|
+
db_tables {
|
|
10
|
+
entity_task table tasks
|
|
11
|
+
entity_project table projects
|
|
12
|
+
entity_user table users
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
db_keys {
|
|
16
|
+
entity_task primary [id]
|
|
17
|
+
entity_project primary [id]
|
|
18
|
+
entity_user primary [id]
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
db_indexes {
|
|
22
|
+
entity_task index [project_id, status]
|
|
23
|
+
entity_task index [owner_id, status]
|
|
24
|
+
entity_project unique [name]
|
|
25
|
+
entity_project index [owner_id, status]
|
|
26
|
+
entity_user unique [email]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
db_relations {
|
|
30
|
+
entity_task foreign_key owner_id references entity_user.id on_delete set_null
|
|
31
|
+
entity_task foreign_key project_id references entity_project.id on_delete cascade
|
|
32
|
+
entity_project foreign_key owner_id references entity_user.id on_delete set_null
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
db_lifecycle {
|
|
36
|
+
entity_task soft_delete field status value archived
|
|
37
|
+
entity_task timestamps created_at created_at updated_at updated_at
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
generator_defaults {
|
|
41
|
+
profile sqlite_sql
|
|
42
|
+
language sql
|
|
43
|
+
styling css
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
status active
|
|
47
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
projection proj_ui_shared {
|
|
2
|
+
name "Todo Shared UI"
|
|
3
|
+
description "Platform-neutral UI semantics for the Todo product"
|
|
4
|
+
|
|
5
|
+
platform ui_shared
|
|
6
|
+
realizes [
|
|
7
|
+
cap_list_projects,
|
|
8
|
+
cap_get_project,
|
|
9
|
+
cap_create_project,
|
|
10
|
+
cap_update_project,
|
|
11
|
+
cap_list_users,
|
|
12
|
+
cap_get_user,
|
|
13
|
+
cap_create_user,
|
|
14
|
+
cap_update_user,
|
|
15
|
+
cap_list_tasks,
|
|
16
|
+
cap_get_task,
|
|
17
|
+
cap_create_task,
|
|
18
|
+
cap_update_task,
|
|
19
|
+
cap_complete_task,
|
|
20
|
+
cap_delete_task,
|
|
21
|
+
cap_export_tasks,
|
|
22
|
+
cap_get_task_export_job,
|
|
23
|
+
cap_download_task_export
|
|
24
|
+
]
|
|
25
|
+
outputs [ui_contract]
|
|
26
|
+
|
|
27
|
+
ui_app_shell {
|
|
28
|
+
brand "Topogram Todo"
|
|
29
|
+
shell bottom_tabs
|
|
30
|
+
global_search true
|
|
31
|
+
notifications true
|
|
32
|
+
account_menu true
|
|
33
|
+
footer legal
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ui_screens {
|
|
37
|
+
screen project_list kind list title "Projects" load cap_list_projects item_shape shape_output_project_card detail_capability cap_get_project primary_action cap_create_project empty_title "No projects yet" empty_body "Create a project to organize your tasks" loading_state skeleton error_state inline
|
|
38
|
+
screen project_detail kind detail title "Project Details" load cap_get_project view_shape shape_output_project_detail primary_action cap_update_project loading_state skeleton
|
|
39
|
+
screen project_create kind form title "Create Project" input_shape shape_input_create_project submit cap_create_project success_navigate project_detail success_state banner
|
|
40
|
+
screen project_edit kind form title "Edit Project" input_shape shape_input_update_project submit cap_update_project success_navigate project_detail success_state banner
|
|
41
|
+
screen user_list kind list title "Users" load cap_list_users item_shape shape_output_user_card detail_capability cap_get_user primary_action cap_create_user empty_title "No users yet" empty_body "Create a user to start assigning work" loading_state skeleton error_state inline
|
|
42
|
+
screen user_detail kind detail title "User Details" load cap_get_user view_shape shape_output_user_detail primary_action cap_update_user loading_state skeleton
|
|
43
|
+
screen user_create kind form title "Create User" input_shape shape_input_create_user submit cap_create_user success_navigate user_detail success_state banner
|
|
44
|
+
screen user_edit kind form title "Edit User" input_shape shape_input_update_user submit cap_update_user success_navigate user_detail success_state banner
|
|
45
|
+
screen task_list kind list title "Tasks" load cap_list_tasks item_shape shape_output_task_card detail_capability cap_get_task primary_action cap_create_task empty_title "No tasks yet" empty_body "Create a task to get started" loading_state skeleton error_state inline
|
|
46
|
+
screen task_board kind board title "Task Board" load cap_list_tasks item_shape shape_output_task_card detail_capability cap_get_task primary_action cap_create_task empty_title "No tasks on this board" empty_body "Create a task to start planning work" loading_state skeleton error_state inline
|
|
47
|
+
screen task_calendar kind calendar title "Task Calendar" load cap_list_tasks item_shape shape_output_task_card detail_capability cap_get_task primary_action cap_create_task empty_title "No scheduled tasks" empty_body "Create a task with dates to populate the calendar" loading_state skeleton error_state inline
|
|
48
|
+
screen task_detail kind detail title "Task Details" load cap_get_task view_shape shape_output_task_detail primary_action cap_update_task secondary_action cap_complete_task destructive_action cap_delete_task loading_state skeleton
|
|
49
|
+
screen task_create kind wizard title "Create Task" input_shape shape_input_create_task submit cap_create_task success_navigate task_detail success_state banner
|
|
50
|
+
screen task_edit kind form title "Edit Task" input_shape shape_input_update_task submit cap_update_task success_navigate task_detail success_state banner
|
|
51
|
+
screen task_exports kind job_status title "Export Status" load cap_get_task_export_job view_shape shape_output_task_export_status terminal_action cap_download_task_export
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
ui_collections {
|
|
55
|
+
screen project_list pagination cursor
|
|
56
|
+
screen project_list sort created_at desc
|
|
57
|
+
screen project_list view table
|
|
58
|
+
screen user_list pagination cursor
|
|
59
|
+
screen user_list sort created_at desc
|
|
60
|
+
screen user_list view table
|
|
61
|
+
screen task_list filter project_id
|
|
62
|
+
screen task_list filter owner_id
|
|
63
|
+
screen task_list filter status
|
|
64
|
+
screen task_list pagination cursor
|
|
65
|
+
screen task_list sort created_at desc
|
|
66
|
+
screen task_list group status
|
|
67
|
+
screen task_list view table
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
ui_actions {
|
|
71
|
+
screen project_list action cap_create_project prominence primary placement toolbar
|
|
72
|
+
screen user_list action cap_create_user prominence primary placement toolbar
|
|
73
|
+
screen task_list action cap_export_tasks prominence secondary placement toolbar
|
|
74
|
+
screen task_detail action cap_complete_task prominence primary placement footer
|
|
75
|
+
screen task_detail action cap_delete_task prominence destructive placement footer
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
ui_visibility {
|
|
79
|
+
action cap_create_project visible_if permission projects.create
|
|
80
|
+
action cap_update_project visible_if permission projects.update
|
|
81
|
+
action cap_create_user visible_if permission users.create
|
|
82
|
+
action cap_update_user visible_if permission users.update
|
|
83
|
+
action cap_delete_task visible_if permission tasks.delete
|
|
84
|
+
action cap_update_task visible_if ownership owner_or_admin
|
|
85
|
+
action cap_complete_task visible_if ownership owner_or_admin
|
|
86
|
+
action cap_export_tasks visible_if permission tasks.export
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
ui_lookups {
|
|
90
|
+
screen project_create field owner_id entity entity_user label_field display_name empty_label "Unassigned"
|
|
91
|
+
screen project_edit field owner_id entity entity_user label_field display_name empty_label "Unassigned"
|
|
92
|
+
screen task_list field project_id entity entity_project label_field name empty_label "All projects"
|
|
93
|
+
screen task_list field owner_id entity entity_user label_field display_name empty_label "All owners"
|
|
94
|
+
screen task_create field project_id entity entity_project label_field name
|
|
95
|
+
screen task_create field owner_id entity entity_user label_field display_name empty_label "Unassigned"
|
|
96
|
+
screen task_edit field owner_id entity entity_user label_field display_name empty_label "Unassigned"
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
ui_navigation {
|
|
100
|
+
group workspace label "Workspace" placement primary pattern bottom_tabs
|
|
101
|
+
group admin label "Admin" placement primary pattern bottom_tabs
|
|
102
|
+
screen task_list group workspace label "Tasks" order 10 visible true default true sitemap include pattern bottom_tabs
|
|
103
|
+
screen task_board group workspace label "Board" order 20 visible true sitemap include pattern bottom_tabs
|
|
104
|
+
screen task_calendar group workspace label "Calendar" order 30 visible true sitemap include pattern bottom_tabs
|
|
105
|
+
screen project_list group workspace label "Projects" order 40 visible true sitemap include pattern bottom_tabs
|
|
106
|
+
screen user_list group admin label "Users" order 50 visible true sitemap include pattern bottom_tabs
|
|
107
|
+
screen task_create group workspace label "Create Task" visible false breadcrumb task_list sitemap exclude
|
|
108
|
+
screen task_detail group workspace label "Task Details" visible false breadcrumb task_list sitemap exclude pattern stack_navigation
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
ui_screen_regions {
|
|
112
|
+
screen task_list region hero pattern summary_stats placement primary
|
|
113
|
+
screen task_list region toolbar pattern action_bar placement primary
|
|
114
|
+
screen task_list region results pattern resource_table placement primary
|
|
115
|
+
screen task_board region toolbar pattern action_bar placement primary
|
|
116
|
+
screen task_board region results pattern board_view placement primary
|
|
117
|
+
screen task_calendar region toolbar pattern action_bar placement primary
|
|
118
|
+
screen task_calendar region results pattern calendar_view placement primary
|
|
119
|
+
screen task_detail region summary pattern detail_panel placement primary
|
|
120
|
+
screen task_detail region activity pattern activity_feed placement supporting
|
|
121
|
+
screen project_list region results pattern resource_table placement primary
|
|
122
|
+
screen user_list region results pattern resource_table placement primary
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
ui_components {
|
|
126
|
+
screen task_list region hero component component_ui_task_summary data metrics from cap_list_tasks
|
|
127
|
+
screen task_list region results component component_ui_task_table data rows from cap_list_tasks event row_select navigate task_detail event export_request action cap_export_tasks
|
|
128
|
+
screen task_board region results component component_ui_task_board data columns from cap_list_tasks event card_select navigate task_detail event card_move action cap_update_task
|
|
129
|
+
screen task_calendar region results component component_ui_task_calendar data events from cap_list_tasks event event_select navigate task_detail
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
status active
|
|
133
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
projection proj_ui_web_react {
|
|
2
|
+
name "Todo Web UI (React)"
|
|
3
|
+
description "Web realization for the shared Todo UI using a React profile"
|
|
4
|
+
|
|
5
|
+
platform ui_web
|
|
6
|
+
realizes [
|
|
7
|
+
cap_list_projects,
|
|
8
|
+
cap_get_project,
|
|
9
|
+
cap_create_project,
|
|
10
|
+
cap_update_project,
|
|
11
|
+
cap_list_users,
|
|
12
|
+
cap_get_user,
|
|
13
|
+
cap_create_user,
|
|
14
|
+
cap_update_user,
|
|
15
|
+
proj_ui_shared,
|
|
16
|
+
cap_list_tasks,
|
|
17
|
+
cap_get_task,
|
|
18
|
+
cap_create_task,
|
|
19
|
+
cap_update_task,
|
|
20
|
+
cap_complete_task,
|
|
21
|
+
cap_delete_task,
|
|
22
|
+
cap_export_tasks,
|
|
23
|
+
cap_get_task_export_job,
|
|
24
|
+
cap_download_task_export
|
|
25
|
+
]
|
|
26
|
+
outputs [ui_contract, web_app]
|
|
27
|
+
|
|
28
|
+
ui_routes {
|
|
29
|
+
screen project_list path /projects
|
|
30
|
+
screen project_detail path /projects/:id
|
|
31
|
+
screen project_create path /projects/new
|
|
32
|
+
screen project_edit path /projects/:id/edit
|
|
33
|
+
screen user_list path /users
|
|
34
|
+
screen user_detail path /users/:id
|
|
35
|
+
screen user_create path /users/new
|
|
36
|
+
screen user_edit path /users/:id/edit
|
|
37
|
+
screen task_list path /tasks
|
|
38
|
+
screen task_board path /tasks/board
|
|
39
|
+
screen task_calendar path /tasks/calendar
|
|
40
|
+
screen task_detail path /tasks/:id
|
|
41
|
+
screen task_create path /tasks/new
|
|
42
|
+
screen task_edit path /tasks/:id/edit
|
|
43
|
+
screen task_exports path /task-exports/:job_id
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
ui_web {
|
|
47
|
+
screen task_list shell bottom_tabs
|
|
48
|
+
screen project_list layout responsive_collection
|
|
49
|
+
screen project_list desktop_variant table
|
|
50
|
+
screen project_list mobile_variant cards
|
|
51
|
+
screen project_list collection table
|
|
52
|
+
screen project_detail layout detail_page
|
|
53
|
+
screen project_create present page
|
|
54
|
+
screen project_edit present page
|
|
55
|
+
screen user_list layout responsive_collection
|
|
56
|
+
screen user_list desktop_variant table
|
|
57
|
+
screen user_list mobile_variant cards
|
|
58
|
+
screen user_list collection table
|
|
59
|
+
screen user_detail layout detail_page
|
|
60
|
+
screen user_create present page
|
|
61
|
+
screen user_edit present page
|
|
62
|
+
screen task_list layout responsive_collection
|
|
63
|
+
screen task_list desktop_variant table
|
|
64
|
+
screen task_list mobile_variant cards
|
|
65
|
+
screen task_list collection table
|
|
66
|
+
screen task_board layout responsive_collection
|
|
67
|
+
screen task_board desktop_variant board
|
|
68
|
+
screen task_board mobile_variant cards
|
|
69
|
+
screen task_board collection board
|
|
70
|
+
screen task_calendar layout responsive_collection
|
|
71
|
+
screen task_calendar desktop_variant calendar
|
|
72
|
+
screen task_calendar mobile_variant list
|
|
73
|
+
screen task_calendar collection calendar
|
|
74
|
+
screen task_detail breadcrumbs visible
|
|
75
|
+
screen task_detail layout detail_page
|
|
76
|
+
screen task_create present bottom_sheet
|
|
77
|
+
screen task_edit present page
|
|
78
|
+
screen task_exports present page
|
|
79
|
+
action cap_create_task present fab
|
|
80
|
+
action cap_delete_task confirm modal
|
|
81
|
+
action cap_delete_task present button
|
|
82
|
+
action cap_delete_task placement footer
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
generator_defaults {
|
|
86
|
+
profile react
|
|
87
|
+
language typescript
|
|
88
|
+
styling css
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
status active
|
|
92
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
projection proj_ui_web {
|
|
2
|
+
name "Todo Web UI"
|
|
3
|
+
description "Web realization for the shared Todo UI using a SvelteKit profile"
|
|
4
|
+
|
|
5
|
+
platform ui_web
|
|
6
|
+
realizes [
|
|
7
|
+
cap_list_projects,
|
|
8
|
+
cap_get_project,
|
|
9
|
+
cap_create_project,
|
|
10
|
+
cap_update_project,
|
|
11
|
+
cap_list_users,
|
|
12
|
+
cap_get_user,
|
|
13
|
+
cap_create_user,
|
|
14
|
+
cap_update_user,
|
|
15
|
+
proj_ui_shared,
|
|
16
|
+
cap_list_tasks,
|
|
17
|
+
cap_get_task,
|
|
18
|
+
cap_create_task,
|
|
19
|
+
cap_update_task,
|
|
20
|
+
cap_complete_task,
|
|
21
|
+
cap_delete_task,
|
|
22
|
+
cap_export_tasks,
|
|
23
|
+
cap_get_task_export_job,
|
|
24
|
+
cap_download_task_export
|
|
25
|
+
]
|
|
26
|
+
outputs [ui_contract, web_app]
|
|
27
|
+
|
|
28
|
+
ui_routes {
|
|
29
|
+
screen project_list path /projects
|
|
30
|
+
screen project_detail path /projects/:id
|
|
31
|
+
screen project_create path /projects/new
|
|
32
|
+
screen project_edit path /projects/:id/edit
|
|
33
|
+
screen user_list path /users
|
|
34
|
+
screen user_detail path /users/:id
|
|
35
|
+
screen user_create path /users/new
|
|
36
|
+
screen user_edit path /users/:id/edit
|
|
37
|
+
screen task_list path /tasks
|
|
38
|
+
screen task_board path /tasks/board
|
|
39
|
+
screen task_calendar path /tasks/calendar
|
|
40
|
+
screen task_detail path /tasks/:id
|
|
41
|
+
screen task_create path /tasks/new
|
|
42
|
+
screen task_edit path /tasks/:id/edit
|
|
43
|
+
screen task_exports path /task-exports/:job_id
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
ui_web {
|
|
47
|
+
screen task_list shell bottom_tabs
|
|
48
|
+
screen project_list layout responsive_collection
|
|
49
|
+
screen project_list desktop_variant table
|
|
50
|
+
screen project_list mobile_variant cards
|
|
51
|
+
screen project_list collection table
|
|
52
|
+
screen project_detail layout detail_page
|
|
53
|
+
screen project_create present page
|
|
54
|
+
screen project_edit present page
|
|
55
|
+
screen user_list layout responsive_collection
|
|
56
|
+
screen user_list desktop_variant table
|
|
57
|
+
screen user_list mobile_variant cards
|
|
58
|
+
screen user_list collection table
|
|
59
|
+
screen user_detail layout detail_page
|
|
60
|
+
screen user_create present page
|
|
61
|
+
screen user_edit present page
|
|
62
|
+
screen task_list layout responsive_collection
|
|
63
|
+
screen task_list desktop_variant table
|
|
64
|
+
screen task_list mobile_variant cards
|
|
65
|
+
screen task_list collection table
|
|
66
|
+
screen task_board layout responsive_collection
|
|
67
|
+
screen task_board desktop_variant board
|
|
68
|
+
screen task_board mobile_variant cards
|
|
69
|
+
screen task_board collection board
|
|
70
|
+
screen task_calendar layout responsive_collection
|
|
71
|
+
screen task_calendar desktop_variant calendar
|
|
72
|
+
screen task_calendar mobile_variant list
|
|
73
|
+
screen task_calendar collection calendar
|
|
74
|
+
screen task_detail breadcrumbs visible
|
|
75
|
+
screen task_detail layout detail_page
|
|
76
|
+
screen task_create present bottom_sheet
|
|
77
|
+
screen task_edit present page
|
|
78
|
+
screen task_exports present page
|
|
79
|
+
action cap_create_task present fab
|
|
80
|
+
action cap_delete_task confirm modal
|
|
81
|
+
action cap_delete_task present button
|
|
82
|
+
action cap_delete_task placement footer
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
generator_defaults {
|
|
86
|
+
profile sveltekit
|
|
87
|
+
language typescript
|
|
88
|
+
styling css
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
status active
|
|
92
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
rule rule_no_task_creation_in_archived_project {
|
|
2
|
+
name "Cannot create tasks in archived projects"
|
|
3
|
+
description "New tasks may not be created in archived projects"
|
|
4
|
+
|
|
5
|
+
applies_to [cap_create_task]
|
|
6
|
+
requirement "project.status != archived"
|
|
7
|
+
severity error
|
|
8
|
+
|
|
9
|
+
status active
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
rule rule_only_active_users_may_own_tasks {
|
|
2
|
+
name "Only active users may own tasks"
|
|
3
|
+
description "A task owner must be an active user"
|
|
4
|
+
|
|
5
|
+
applies_to [cap_create_task, cap_update_task]
|
|
6
|
+
requirement "owner.is_active == true"
|
|
7
|
+
severity error
|
|
8
|
+
|
|
9
|
+
status active
|
|
10
|
+
}
|