@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.
Files changed (85) hide show
  1. package/README.md +91 -0
  2. package/implementation/README.md +9 -0
  3. package/implementation/backend/reference.js +206 -0
  4. package/implementation/backend/repository-reference.js +74 -0
  5. package/implementation/backend/repository-renderers.js +442 -0
  6. package/implementation/index.js +53 -0
  7. package/implementation/runtime/check-renderers.js +215 -0
  8. package/implementation/runtime/checks.js +120 -0
  9. package/implementation/runtime/reference.js +92 -0
  10. package/implementation/web/reference.js +51 -0
  11. package/implementation/web/renderers.js +1223 -0
  12. package/implementation/web/screens-reference.js +15 -0
  13. package/package.json +31 -0
  14. package/topogram/actors/actor-user.tg +6 -0
  15. package/topogram/capabilities/cap-complete-task.tg +12 -0
  16. package/topogram/capabilities/cap-create-project.tg +11 -0
  17. package/topogram/capabilities/cap-create-task.tg +14 -0
  18. package/topogram/capabilities/cap-create-user.tg +11 -0
  19. package/topogram/capabilities/cap-delete-task.tg +12 -0
  20. package/topogram/capabilities/cap-download-task-export.tg +10 -0
  21. package/topogram/capabilities/cap-export-tasks.tg +11 -0
  22. package/topogram/capabilities/cap-get-project.tg +11 -0
  23. package/topogram/capabilities/cap-get-task-export-job.tg +11 -0
  24. package/topogram/capabilities/cap-get-task.tg +11 -0
  25. package/topogram/capabilities/cap-get-user.tg +11 -0
  26. package/topogram/capabilities/cap-list-projects.tg +11 -0
  27. package/topogram/capabilities/cap-list-tasks.tg +11 -0
  28. package/topogram/capabilities/cap-list-users.tg +11 -0
  29. package/topogram/capabilities/cap-update-project.tg +12 -0
  30. package/topogram/capabilities/cap-update-task.tg +12 -0
  31. package/topogram/capabilities/cap-update-user.tg +12 -0
  32. package/topogram/components/component-ui-task-board.tg +33 -0
  33. package/topogram/components/component-ui-task-calendar.tg +30 -0
  34. package/topogram/components/component-ui-task-summary.tg +23 -0
  35. package/topogram/components/component-ui-task-table.tg +34 -0
  36. package/topogram/decisions/decision-task-ownership.tg +9 -0
  37. package/topogram/docs/glossary/user.md +22 -0
  38. package/topogram/docs/journeys/task-creation-and-ownership.md +57 -0
  39. package/topogram/entities/entity-project.tg +28 -0
  40. package/topogram/entities/entity-task.tg +38 -0
  41. package/topogram/entities/entity-user.tg +24 -0
  42. package/topogram/enums/enum-export-job-status.tg +3 -0
  43. package/topogram/enums/enum-project-status.tg +3 -0
  44. package/topogram/enums/enum-task-priority.tg +3 -0
  45. package/topogram/enums/enum-task-status.tg +3 -0
  46. package/topogram/operations/operation-task-creation-monitoring.tg +10 -0
  47. package/topogram/projections/proj-api.tg +177 -0
  48. package/topogram/projections/proj-db-postgres.tg +55 -0
  49. package/topogram/projections/proj-db-sqlite.tg +47 -0
  50. package/topogram/projections/proj-ui-shared.tg +133 -0
  51. package/topogram/projections/proj-ui-web-react.tg +92 -0
  52. package/topogram/projections/proj-ui-web.tg +92 -0
  53. package/topogram/rules/rule-no-task-creation-in-archived-project.tg +10 -0
  54. package/topogram/rules/rule-only-active-users-may-own-tasks.tg +10 -0
  55. package/topogram/shapes/shape-input-complete-task.tg +11 -0
  56. package/topogram/shapes/shape-input-create-project.tg +6 -0
  57. package/topogram/shapes/shape-input-create-task.tg +6 -0
  58. package/topogram/shapes/shape-input-create-user.tg +6 -0
  59. package/topogram/shapes/shape-input-delete-task.tg +10 -0
  60. package/topogram/shapes/shape-input-export-tasks.tg +13 -0
  61. package/topogram/shapes/shape-input-get-project.tg +10 -0
  62. package/topogram/shapes/shape-input-get-task-export-job.tg +10 -0
  63. package/topogram/shapes/shape-input-get-task.tg +10 -0
  64. package/topogram/shapes/shape-input-get-user.tg +10 -0
  65. package/topogram/shapes/shape-input-list-projects.tg +11 -0
  66. package/topogram/shapes/shape-input-list-tasks.tg +14 -0
  67. package/topogram/shapes/shape-input-list-users.tg +11 -0
  68. package/topogram/shapes/shape-input-update-project.tg +14 -0
  69. package/topogram/shapes/shape-input-update-task.tg +16 -0
  70. package/topogram/shapes/shape-input-update-user.tg +13 -0
  71. package/topogram/shapes/shape-output-project-card.tg +6 -0
  72. package/topogram/shapes/shape-output-project-detail.tg +6 -0
  73. package/topogram/shapes/shape-output-task-card.tg +19 -0
  74. package/topogram/shapes/shape-output-task-detail.tg +6 -0
  75. package/topogram/shapes/shape-output-task-export-callback.tg +14 -0
  76. package/topogram/shapes/shape-output-task-export-job.tg +13 -0
  77. package/topogram/shapes/shape-output-task-export-status.tg +17 -0
  78. package/topogram/shapes/shape-output-user-card.tg +6 -0
  79. package/topogram/shapes/shape-output-user-detail.tg +6 -0
  80. package/topogram/terms/term-user.tg +5 -0
  81. package/topogram/verifications/verification-create-task-policy.tg +15 -0
  82. package/topogram/verifications/verification-runtime-smoke.tg +16 -0
  83. package/topogram/verifications/verification-task-runtime-flow.tg +31 -0
  84. package/topogram-template.json +11 -0
  85. 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
+ }
@@ -0,0 +1,11 @@
1
+ shape shape_input_complete_task {
2
+ name "Complete Task Input"
3
+ description "Input for marking a task complete"
4
+
5
+ fields {
6
+ task_id uuid required
7
+ completed_at datetime optional
8
+ }
9
+
10
+ status active
11
+ }
@@ -0,0 +1,6 @@
1
+ shape shape_input_create_project from entity_project {
2
+ name "Create Project Input"
3
+ description "Fields accepted when creating a project"
4
+ include [name, description, status, owner_id]
5
+ status active
6
+ }
@@ -0,0 +1,6 @@
1
+ shape shape_input_create_task from entity_task {
2
+ name "Create Task Input"
3
+ description "Fields accepted when creating a task"
4
+ include [title, description, priority, owner_id, project_id, due_at]
5
+ status active
6
+ }
@@ -0,0 +1,6 @@
1
+ shape shape_input_create_user from entity_user {
2
+ name "Create User Input"
3
+ description "Fields accepted when creating a user"
4
+ include [email, display_name, is_active]
5
+ status active
6
+ }
@@ -0,0 +1,10 @@
1
+ shape shape_input_delete_task {
2
+ name "Delete Task Input"
3
+ description "Input for deleting a task"
4
+
5
+ fields {
6
+ task_id uuid required
7
+ }
8
+
9
+ status active
10
+ }