ecoportal-api-graphql 1.3.16 → 2.2.0

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 (482) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +746 -6
  3. data/LICENSE +21 -21
  4. data/README.md +24 -24
  5. data/lib/ecoportal/api/common/graphql/auth_service.rb +115 -115
  6. data/lib/ecoportal/api/common/graphql/class_helpers.rb +46 -46
  7. data/lib/ecoportal/api/common/graphql/client.rb +69 -69
  8. data/lib/ecoportal/api/common/graphql/hash_helpers.rb +105 -105
  9. data/lib/ecoportal/api/common/graphql/http_client.rb +85 -2
  10. data/lib/ecoportal/api/common/graphql/model/as_input.rb +54 -54
  11. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +49 -49
  12. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +188 -188
  13. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff.rb +55 -55
  14. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +295 -295
  15. data/lib/ecoportal/api/common/graphql/model/diffable/leaf_diff_service.rb +97 -0
  16. data/lib/ecoportal/api/common/graphql/model/diffable.rb +1 -0
  17. data/lib/ecoportal/api/common/graphql/model.rb +17 -17
  18. data/lib/ecoportal/api/common/graphql/patches.rb +1 -1
  19. data/lib/ecoportal/api/common/graphql/query_integration.rb +45 -45
  20. data/lib/ecoportal/api/common/graphql.rb +16 -16
  21. data/lib/ecoportal/api/common.graphql.rb +8 -8
  22. data/lib/ecoportal/api/graphql/base/action.rb +1 -1
  23. data/lib/ecoportal/api/graphql/base/action_category.rb +15 -15
  24. data/lib/ecoportal/api/graphql/base/action_event.rb +23 -0
  25. data/lib/ecoportal/api/graphql/base/action_event_page.rb +16 -0
  26. data/lib/ecoportal/api/graphql/base/activity.rb +38 -0
  27. data/lib/ecoportal/api/graphql/base/activity_log.rb +38 -0
  28. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +13 -8
  29. data/lib/ecoportal/api/graphql/base/auth_log.rb +24 -0
  30. data/lib/ecoportal/api/graphql/base/authorization_result.rb +20 -0
  31. data/lib/ecoportal/api/graphql/base/contractor_entity/member_changes.rb +17 -5
  32. data/lib/ecoportal/api/graphql/base/contractor_entity.rb +24 -24
  33. data/lib/ecoportal/api/graphql/base/date_time.rb +12 -12
  34. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -16
  35. data/lib/ecoportal/api/graphql/base/field.rb +12 -12
  36. data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -15
  37. data/lib/ecoportal/api/graphql/base/file_container.rb +12 -4
  38. data/lib/ecoportal/api/graphql/base/location_classification_type.rb +2 -0
  39. data/lib/ecoportal/api/graphql/base/location_node.rb +14 -14
  40. data/lib/ecoportal/api/graphql/base/location_structure/draft/structure.rb +37 -37
  41. data/lib/ecoportal/api/graphql/base/location_structure/draft.rb +93 -93
  42. data/lib/ecoportal/api/graphql/base/location_structure.rb +3 -0
  43. data/lib/ecoportal/api/graphql/base/minimal_dashboard.rb +25 -0
  44. data/lib/ecoportal/api/graphql/base/organization.rb +2 -0
  45. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -9
  46. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -18
  47. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -29
  48. data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +26 -3
  49. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +1 -1
  50. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -23
  51. data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +47 -8
  52. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -24
  53. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +6 -3
  54. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -8
  55. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -9
  56. data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +50 -12
  57. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -17
  58. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -26
  59. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -9
  60. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -17
  61. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -9
  62. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -21
  63. data/lib/ecoportal/api/graphql/base/page/data_field.rb +12 -18
  64. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +51 -0
  65. data/lib/ecoportal/api/graphql/base/page/phased.rb +15 -15
  66. data/lib/ecoportal/api/graphql/base/page/section.rb +48 -48
  67. data/lib/ecoportal/api/graphql/base/page_info.rb +12 -12
  68. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -39
  69. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -27
  70. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -30
  71. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -34
  72. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -35
  73. data/lib/ecoportal/api/graphql/base/permissions.rb +15 -0
  74. data/lib/ecoportal/api/graphql/base/person_member.rb +22 -22
  75. data/lib/ecoportal/api/graphql/base/person_member_changelog.rb +23 -0
  76. data/lib/ecoportal/api/graphql/base/preset_view.rb +136 -1
  77. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -23
  78. data/lib/ecoportal/api/graphql/base/register.rb +6 -1
  79. data/lib/ecoportal/api/graphql/base/resource.rb +13 -13
  80. data/lib/ecoportal/api/graphql/base/template/change_log_entry.rb +118 -0
  81. data/lib/ecoportal/api/graphql/base/template.rb +2 -0
  82. data/lib/ecoportal/api/graphql/base.rb +9 -0
  83. data/lib/ecoportal/api/graphql/builder/action.rb +41 -41
  84. data/lib/ecoportal/api/graphql/builder/contractor_entity.rb +10 -0
  85. data/lib/ecoportal/api/graphql/builder/location_structure/draft.rb +64 -64
  86. data/lib/ecoportal/api/graphql/builder/location_structure.rb +40 -40
  87. data/lib/ecoportal/api/graphql/builder/page.rb +0 -16
  88. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -84
  89. data/lib/ecoportal/api/graphql/builder/register.rb +49 -49
  90. data/lib/ecoportal/api/graphql/builder/template.rb +46 -0
  91. data/lib/ecoportal/api/graphql/builder/template_builder.rb +21 -2
  92. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -23
  93. data/lib/ecoportal/api/graphql/compat/pages.rb +7 -2
  94. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -84
  95. data/lib/ecoportal/api/graphql/compat/response.rb +14 -0
  96. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -33
  97. data/lib/ecoportal/api/graphql/compat.rb +17 -17
  98. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -71
  99. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +68 -68
  100. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -60
  101. data/lib/ecoportal/api/graphql/concerns/threadable.rb +58 -0
  102. data/lib/ecoportal/api/graphql/concerns.rb +1 -0
  103. data/lib/ecoportal/api/graphql/connection/action.rb +1 -1
  104. data/lib/ecoportal/api/graphql/connection/action_category.rb +1 -1
  105. data/lib/ecoportal/api/graphql/connection/activity.rb +11 -0
  106. data/lib/ecoportal/api/graphql/connection/activity_log.rb +11 -0
  107. data/lib/ecoportal/api/graphql/connection/auth_log.rb +11 -0
  108. data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +1 -1
  109. data/lib/ecoportal/api/graphql/connection/minimal_dashboard.rb +11 -0
  110. data/lib/ecoportal/api/graphql/connection/page.rb +1 -1
  111. data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +1 -1
  112. data/lib/ecoportal/api/graphql/connection/person_member.rb +1 -1
  113. data/lib/ecoportal/api/graphql/connection/person_member_changelog.rb +11 -0
  114. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -11
  115. data/lib/ecoportal/api/graphql/connection/preview_page.rb +1 -1
  116. data/lib/ecoportal/api/graphql/connection/template_change_log.rb +19 -0
  117. data/lib/ecoportal/api/graphql/connection.rb +6 -0
  118. data/lib/ecoportal/api/graphql/diff/change.rb +7 -2
  119. data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +19 -1
  120. data/lib/ecoportal/api/graphql/diff/pairing/signals.rb +21 -1
  121. data/lib/ecoportal/api/graphql/diff/version_diff.rb +13 -6
  122. data/lib/ecoportal/api/graphql/error/locations_error/fetch_nested.rb +51 -51
  123. data/lib/ecoportal/api/graphql/error/locations_error.rb +28 -28
  124. data/lib/ecoportal/api/graphql/error/locations_validation_error.rb +20 -20
  125. data/lib/ecoportal/api/graphql/error/validation_errors.rb +28 -28
  126. data/lib/ecoportal/api/graphql/error.rb +12 -12
  127. data/lib/ecoportal/api/graphql/file_upload/client.rb +199 -140
  128. data/lib/ecoportal/api/graphql/file_upload.rb +10 -10
  129. data/lib/ecoportal/api/graphql/fragment/action.rb +65 -65
  130. data/lib/ecoportal/api/graphql/fragment/action_category.rb +17 -17
  131. data/lib/ecoportal/api/graphql/fragment/activity.rb +84 -0
  132. data/lib/ecoportal/api/graphql/fragment/activity_log.rb +75 -0
  133. data/lib/ecoportal/api/graphql/fragment/auth_log.rb +29 -0
  134. data/lib/ecoportal/api/graphql/fragment/authorization_result.rb +14 -0
  135. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +20 -20
  136. data/lib/ecoportal/api/graphql/fragment/location_node.rb +1 -0
  137. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +19 -19
  138. data/lib/ecoportal/api/graphql/fragment/minimal_dashboard.rb +31 -0
  139. data/lib/ecoportal/api/graphql/fragment/page.rb +1 -0
  140. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +23 -0
  141. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -15
  142. data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -17
  143. data/lib/ecoportal/api/graphql/fragment/permissions.rb +98 -0
  144. data/lib/ecoportal/api/graphql/fragment/person_member_changelog.rb +33 -0
  145. data/lib/ecoportal/api/graphql/fragment/template_change_log.rb +102 -0
  146. data/lib/ecoportal/api/graphql/fragment.rb +8 -0
  147. data/lib/ecoportal/api/graphql/helpers/locations_tree.rb +41 -41
  148. data/lib/ecoportal/api/graphql/helpers.rb +10 -10
  149. data/lib/ecoportal/api/graphql/input/action/archive.rb +14 -14
  150. data/lib/ecoportal/api/graphql/input/action/create.rb +13 -13
  151. data/lib/ecoportal/api/graphql/input/action/update.rb +12 -0
  152. data/lib/ecoportal/api/graphql/input/action.rb +14 -14
  153. data/lib/ecoportal/api/graphql/input/contractor_entity/create.rb +14 -14
  154. data/lib/ecoportal/api/graphql/input/contractor_entity/destroy.rb +13 -13
  155. data/lib/ecoportal/api/graphql/input/contractor_entity/manager_settings.rb +20 -0
  156. data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +6 -27
  157. data/lib/ecoportal/api/graphql/input/contractor_entity.rb +1 -0
  158. data/lib/ecoportal/api/graphql/input/date_range.rb +16 -0
  159. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -16
  160. data/lib/ecoportal/api/graphql/input/id_diff.rb +11 -11
  161. data/lib/ecoportal/api/graphql/input/location_structure/apply_commands.rb +2 -2
  162. data/lib/ecoportal/api/graphql/input/location_structure/archive_command.rb +13 -13
  163. data/lib/ecoportal/api/graphql/input/location_structure/delete_command.rb +13 -13
  164. data/lib/ecoportal/api/graphql/input/location_structure/draft/add_commands.rb +2 -2
  165. data/lib/ecoportal/api/graphql/input/location_structure/draft/create.rb +15 -15
  166. data/lib/ecoportal/api/graphql/input/location_structure/draft/delete.rb +15 -15
  167. data/lib/ecoportal/api/graphql/input/location_structure/draft/drop_bad_commands.rb +16 -16
  168. data/lib/ecoportal/api/graphql/input/location_structure/draft/publish.rb +16 -16
  169. data/lib/ecoportal/api/graphql/input/location_structure/draft.rb +19 -19
  170. data/lib/ecoportal/api/graphql/input/location_structure/insert_command.rb +21 -13
  171. data/lib/ecoportal/api/graphql/input/location_structure/move_command.rb +14 -14
  172. data/lib/ecoportal/api/graphql/input/location_structure/reorder_command.rb +13 -13
  173. data/lib/ecoportal/api/graphql/input/location_structure/unarchive_command.rb +13 -13
  174. data/lib/ecoportal/api/graphql/input/location_structure/update_command.rb +6 -2
  175. data/lib/ecoportal/api/graphql/input/location_structure.rb +20 -20
  176. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -14
  177. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -13
  178. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -13
  179. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -18
  180. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -13
  181. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -13
  182. data/lib/ecoportal/api/graphql/input/page/review_task.rb +27 -14
  183. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -14
  184. data/lib/ecoportal/api/graphql/input/page.rb +26 -26
  185. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -18
  186. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -16
  187. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +17 -2
  188. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -14
  189. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -18
  190. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -15
  191. data/lib/ecoportal/api/graphql/input/register.rb +13 -13
  192. data/lib/ecoportal/api/graphql/input/search.rb +13 -13
  193. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -234
  194. data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -12
  195. data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -11
  196. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -18
  197. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -18
  198. data/lib/ecoportal/api/graphql/input/workflow_command/add_checklist_field_item.rb +19 -0
  199. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -18
  200. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -18
  201. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -18
  202. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -18
  203. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +10 -9
  204. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -18
  205. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -23
  206. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -18
  207. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -18
  208. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -18
  209. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -18
  210. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -18
  211. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -18
  212. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -18
  213. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -18
  214. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -18
  215. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -23
  216. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -18
  217. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -18
  218. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +25 -19
  219. data/lib/ecoportal/api/graphql/input/workflow_command/add_smart_fill_config.rb +23 -0
  220. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +3 -2
  221. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -18
  222. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -18
  223. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -18
  224. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -18
  225. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -18
  226. data/lib/ecoportal/api/graphql/input/workflow_command/add_viewable_field.rb +45 -0
  227. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -18
  228. data/lib/ecoportal/api/graphql/input/workflow_command/archive_public_config.rb +19 -0
  229. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -18
  230. data/lib/ecoportal/api/graphql/input/workflow_command/create_public_config.rb +19 -0
  231. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -18
  232. data/lib/ecoportal/api/graphql/input/workflow_command/edit_checklist_field_item.rb +19 -0
  233. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -18
  234. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -18
  235. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +17 -2
  236. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +21 -18
  237. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -19
  238. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -19
  239. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -18
  240. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -18
  241. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -18
  242. data/lib/ecoportal/api/graphql/input/workflow_command/edit_public_config.rb +19 -0
  243. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -18
  244. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -18
  245. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -18
  246. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -18
  247. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -22
  248. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -18
  249. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +23 -19
  250. data/lib/ecoportal/api/graphql/input/workflow_command/edit_smart_fill_config.rb +21 -0
  251. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -18
  252. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -18
  253. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -18
  254. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_advanced_settings.rb +19 -0
  255. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_basic_settings.rb +32 -0
  256. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_container_uid.rb +45 -0
  257. data/lib/ecoportal/api/graphql/input/workflow_command/{edit_page_creator_permissions.rb → edit_template_creator_permissions.rb} +3 -2
  258. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_descriptions.rb +19 -0
  259. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -18
  260. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -18
  261. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/action_list.rb +31 -0
  262. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +28 -24
  263. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +9 -1
  264. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +15 -2
  265. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/file.rb +21 -0
  266. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -20
  267. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +3 -2
  268. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -24
  269. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +27 -3
  270. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +9 -2
  271. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +3 -2
  272. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +3 -2
  273. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -20
  274. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -25
  275. data/lib/ecoportal/api/graphql/input/workflow_command/manage_copy_page_configuration.rb +47 -0
  276. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +3 -2
  277. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -18
  278. data/lib/ecoportal/api/graphql/input/workflow_command/move_viewable_field.rb +33 -0
  279. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -18
  280. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -18
  281. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -18
  282. data/lib/ecoportal/api/graphql/input/workflow_command/remove_checklist_field_item.rb +19 -0
  283. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -18
  284. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -18
  285. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -18
  286. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -18
  287. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -18
  288. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -18
  289. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -18
  290. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -18
  291. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -18
  292. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -18
  293. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -18
  294. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -18
  295. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -18
  296. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -18
  297. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -18
  298. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -18
  299. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -18
  300. data/lib/ecoportal/api/graphql/input/workflow_command/remove_smart_fill_config.rb +19 -0
  301. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -18
  302. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -18
  303. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -18
  304. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -18
  305. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -18
  306. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -18
  307. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -18
  308. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -18
  309. data/lib/ecoportal/api/graphql/input/workflow_command/remove_viewable_field.rb +21 -0
  310. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +3 -2
  311. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +3 -2
  312. data/lib/ecoportal/api/graphql/input/workflow_command.rb +46 -5
  313. data/lib/ecoportal/api/graphql/input.rb +1 -0
  314. data/lib/ecoportal/api/graphql/interface/base_page.rb +50 -3
  315. data/lib/ecoportal/api/graphql/interface/location_structure/command.rb +2 -1
  316. data/lib/ecoportal/api/graphql/interface/location_structure/node.rb +43 -43
  317. data/lib/ecoportal/api/graphql/interface/location_structure.rb +14 -14
  318. data/lib/ecoportal/api/graphql/interface.rb +11 -11
  319. data/lib/ecoportal/api/graphql/logic/base_model.rb +15 -15
  320. data/lib/ecoportal/api/graphql/logic/base_query.rb +260 -193
  321. data/lib/ecoportal/api/graphql/logic/connection.rb +17 -0
  322. data/lib/ecoportal/api/graphql/logic/input.rb +127 -0
  323. data/lib/ecoportal/api/graphql/logic/mutation.rb +59 -59
  324. data/lib/ecoportal/api/graphql/logic/payload.rb +42 -42
  325. data/lib/ecoportal/api/graphql/logic/query.rb +23 -23
  326. data/lib/ecoportal/api/graphql/logic/query_array.rb +30 -30
  327. data/lib/ecoportal/api/graphql/logic/query_connection.rb +48 -48
  328. data/lib/ecoportal/api/graphql/logic.rb +18 -18
  329. data/lib/ecoportal/api/graphql/model/account.rb +15 -15
  330. data/lib/ecoportal/api/graphql/model/action.rb +22 -22
  331. data/lib/ecoportal/api/graphql/model/action_event.rb +14 -0
  332. data/lib/ecoportal/api/graphql/model/action_event_page.rb +10 -0
  333. data/lib/ecoportal/api/graphql/model/activity.rb +14 -0
  334. data/lib/ecoportal/api/graphql/model/activity_log.rb +31 -0
  335. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -10
  336. data/lib/ecoportal/api/graphql/model/auth_log.rb +11 -0
  337. data/lib/ecoportal/api/graphql/model/authorization_result.rb +12 -0
  338. data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -12
  339. data/lib/ecoportal/api/graphql/model/field.rb +10 -10
  340. data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -10
  341. data/lib/ecoportal/api/graphql/model/file_container.rb +11 -11
  342. data/lib/ecoportal/api/graphql/model/location_node.rb +14 -14
  343. data/lib/ecoportal/api/graphql/model/location_structure/draft/structure.rb +15 -15
  344. data/lib/ecoportal/api/graphql/model/location_structure/draft.rb +15 -15
  345. data/lib/ecoportal/api/graphql/model/location_structure.rb +16 -16
  346. data/lib/ecoportal/api/graphql/model/minimal_dashboard.rb +14 -0
  347. data/lib/ecoportal/api/graphql/model/organization.rb +36 -0
  348. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -14
  349. data/lib/ecoportal/api/graphql/model/page/data_field.rb +12 -12
  350. data/lib/ecoportal/api/graphql/model/page/phased/stage.rb +14 -14
  351. data/lib/ecoportal/api/graphql/model/page/phased.rb +17 -0
  352. data/lib/ecoportal/api/graphql/model/page/section.rb +12 -12
  353. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -21
  354. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -20
  355. data/lib/ecoportal/api/graphql/model/permissions.rb +179 -0
  356. data/lib/ecoportal/api/graphql/model/person_member.rb +7 -0
  357. data/lib/ecoportal/api/graphql/model/person_member_changelog.rb +15 -0
  358. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -10
  359. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -10
  360. data/lib/ecoportal/api/graphql/model/register.rb +10 -10
  361. data/lib/ecoportal/api/graphql/model/resource.rb +13 -13
  362. data/lib/ecoportal/api/graphql/model/template/change_log_entry.rb +19 -0
  363. data/lib/ecoportal/api/graphql/model/template.rb +4 -1
  364. data/lib/ecoportal/api/graphql/model/user.rb +14 -14
  365. data/lib/ecoportal/api/graphql/model.rb +9 -0
  366. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +41 -41
  367. data/lib/ecoportal/api/graphql/mutation/action/create.rb +40 -40
  368. data/lib/ecoportal/api/graphql/mutation/action/update.rb +40 -40
  369. data/lib/ecoportal/api/graphql/mutation/action.rb +14 -14
  370. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +21 -11
  371. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +26 -11
  372. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -13
  373. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +40 -40
  374. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +40 -40
  375. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +40 -40
  376. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update_manager_settings.rb +37 -0
  377. data/lib/ecoportal/api/graphql/mutation/contractor_entity.rb +1 -0
  378. data/lib/ecoportal/api/graphql/mutation/file_container/upload.rb +78 -0
  379. data/lib/ecoportal/api/graphql/mutation/file_container.rb +15 -0
  380. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +54 -54
  381. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +55 -55
  382. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +54 -54
  383. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/delete.rb +43 -43
  384. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +56 -56
  385. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +66 -66
  386. data/lib/ecoportal/api/graphql/mutation/location_structure/draft.rb +18 -18
  387. data/lib/ecoportal/api/graphql/mutation/location_structure.rb +13 -13
  388. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +1 -1
  389. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -40
  390. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +1 -1
  391. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -50
  392. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +1 -1
  393. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -43
  394. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +1 -1
  395. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +1 -1
  396. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +1 -1
  397. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +1 -1
  398. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -40
  399. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +1 -1
  400. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -40
  401. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -28
  402. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -35
  403. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +1 -1
  404. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -37
  405. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -35
  406. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -15
  407. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -35
  408. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +1 -1
  409. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -35
  410. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -14
  411. data/lib/ecoportal/api/graphql/mutation/template/update_related_page.rb +79 -0
  412. data/lib/ecoportal/api/graphql/mutation/template.rb +1 -0
  413. data/lib/ecoportal/api/graphql/mutation.rb +1 -1
  414. data/lib/ecoportal/api/graphql/payload/action/archive.rb +13 -13
  415. data/lib/ecoportal/api/graphql/payload/action/create.rb +13 -13
  416. data/lib/ecoportal/api/graphql/payload/action/update.rb +13 -13
  417. data/lib/ecoportal/api/graphql/payload/action.rb +14 -14
  418. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -12
  419. data/lib/ecoportal/api/graphql/payload/contractor_entity/create.rb +13 -13
  420. data/lib/ecoportal/api/graphql/payload/contractor_entity/destroy.rb +12 -12
  421. data/lib/ecoportal/api/graphql/payload/contractor_entity/manager_settings.rb +20 -0
  422. data/lib/ecoportal/api/graphql/payload/contractor_entity/update.rb +12 -12
  423. data/lib/ecoportal/api/graphql/payload/contractor_entity.rb +1 -0
  424. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +2 -2
  425. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +2 -2
  426. data/lib/ecoportal/api/graphql/payload/location_structure/apply_commands.rb +51 -51
  427. data/lib/ecoportal/api/graphql/payload/location_structure/command_execution_result.rb +50 -50
  428. data/lib/ecoportal/api/graphql/payload/location_structure/draft/add_commands.rb +30 -30
  429. data/lib/ecoportal/api/graphql/payload/location_structure/draft/delete.rb +30 -30
  430. data/lib/ecoportal/api/graphql/payload/location_structure/draft/drop_bad_commands.rb +43 -43
  431. data/lib/ecoportal/api/graphql/payload/location_structure/draft/publish.rb +63 -63
  432. data/lib/ecoportal/api/graphql/payload/location_structure/draft.rb +18 -18
  433. data/lib/ecoportal/api/graphql/payload/location_structure.rb +14 -14
  434. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +1 -1
  435. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -13
  436. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -13
  437. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -13
  438. data/lib/ecoportal/api/graphql/payload/page/draft.rb +1 -1
  439. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +1 -1
  440. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -13
  441. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -13
  442. data/lib/ecoportal/api/graphql/payload/preset_view.rb +1 -1
  443. data/lib/ecoportal/api/graphql/payload/register.rb +1 -1
  444. data/lib/ecoportal/api/graphql/payload/template/update_related_page.rb +15 -0
  445. data/lib/ecoportal/api/graphql/payload/template.rb +1 -0
  446. data/lib/ecoportal/api/graphql/payload/upload.rb +12 -0
  447. data/lib/ecoportal/api/graphql/payload.rb +1 -0
  448. data/lib/ecoportal/api/graphql/query/action.rb +33 -33
  449. data/lib/ecoportal/api/graphql/query/action_categories.rb +53 -53
  450. data/lib/ecoportal/api/graphql/query/actions.rb +43 -43
  451. data/lib/ecoportal/api/graphql/query/activity_logs.rb +78 -0
  452. data/lib/ecoportal/api/graphql/query/auth_logs.rb +51 -0
  453. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +53 -53
  454. data/lib/ecoportal/api/graphql/query/dashboard_search.rb +57 -0
  455. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -76
  456. data/lib/ecoportal/api/graphql/query/location_classifications.rb +39 -39
  457. data/lib/ecoportal/api/graphql/query/location_structure.rb +2 -0
  458. data/lib/ecoportal/api/graphql/query/location_structures.rb +2 -0
  459. data/lib/ecoportal/api/graphql/query/page.rb +6 -1
  460. data/lib/ecoportal/api/graphql/query/page_activities.rb +56 -0
  461. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -47
  462. data/lib/ecoportal/api/graphql/query/pages.rb +59 -59
  463. data/lib/ecoportal/api/graphql/query/permissions.rb +35 -0
  464. data/lib/ecoportal/api/graphql/query/person_member_changelogs.rb +53 -0
  465. data/lib/ecoportal/api/graphql/query/person_members.rb +76 -0
  466. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +1 -1
  467. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -83
  468. data/lib/ecoportal/api/graphql/query/template_change_log.rb +118 -0
  469. data/lib/ecoportal/api/graphql/query/templates.rb +53 -53
  470. data/lib/ecoportal/api/graphql/query.rb +8 -0
  471. data/lib/ecoportal/api/graphql_version.rb +1 -1
  472. data/lib/ecoportal/api-graphql.rb +10 -10
  473. metadata +82 -19
  474. data/lib/ecoportal/api/common/graphql/CLAUDE.md +0 -36
  475. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +0 -28
  476. data/lib/ecoportal/api/graphql/CLAUDE.md +0 -37
  477. data/lib/ecoportal/api/graphql/base/CLAUDE.md +0 -50
  478. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +0 -65
  479. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +0 -28
  480. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +0 -36
  481. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +0 -40
  482. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +0 -13
@@ -1,24 +1,24 @@
1
- module Ecoportal::API::GraphQL::Base::Page
2
- class DataField
3
- class Geo < DataField
4
- passthrough :address, :coordinates # coordinates: { lat:, lon: }
5
-
6
- def address=(new_address)
7
- doc['address'] = new_address
8
- end
9
-
10
- def coordinates=(lat_lon_hash)
11
- doc['coordinates'] = lat_lon_hash
12
- end
13
-
14
- def as_input
15
- return nil unless dirty?
16
-
17
- payload = { id: id }
18
- payload[:address] = address if address
19
- payload[:coordinates] = coordinates if coordinates
20
- { geo: payload }
21
- end
22
- end
23
- end
24
- end
1
+ module Ecoportal::API::GraphQL::Base::Page
2
+ class DataField
3
+ class Geo < DataField
4
+ passthrough :address, :coordinates # coordinates: { lat:, lon: }
5
+
6
+ def address=(new_address)
7
+ doc['address'] = new_address
8
+ end
9
+
10
+ def coordinates=(lat_lon_hash)
11
+ doc['coordinates'] = lat_lon_hash
12
+ end
13
+
14
+ def as_input
15
+ return nil unless dirty?
16
+
17
+ payload = { id: id }
18
+ payload[:address] = address if address
19
+ payload[:coordinates] = coordinates if coordinates
20
+ { geo: payload }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,8 +1,11 @@
1
- module Ecoportal::API::GraphQL::Base::Page
1
+ module Ecoportal::API::GraphQL::Base::Page
2
2
  class DataField
3
3
  # Image gallery field.
4
- # Writing requires a prior file upload to the REST upload endpoint
5
- # to obtain fileContainerIds — see the file-upload TODO in projects/TODO.md.
4
+ # WRITE PATH BROKEN (schema-invalid, live-verified 2026-08): `ImageGalleryInput` has no
5
+ # `fileContainerIds`it takes `images: [ImageInput]`, attaching via `sourceId`, which is
6
+ # an `Enzyme::ImageReference::TempImage` (a DIFFERENT upload pipeline than file containers).
7
+ # Fixing this needs its own design — see the DataField shape-asymmetry review project.
8
+ # The reader is equally stale: live responses carry `images`, not `fileContainers`.
6
9
  class ImageGallery < DataField
7
10
  passarray :fileContainers # each: { id:, fileName:, url:, ... }
8
11
 
@@ -1,8 +1,8 @@
1
- module Ecoportal::API::GraphQL::Base::Page
2
- class DataField
3
- # Legal obligation / law snippets field — read access only.
4
- class Law < DataField
5
- passarray :laws # each: { id:, content: }
6
- end
7
- end
8
- end
1
+ module Ecoportal::API::GraphQL::Base::Page
2
+ class DataField
3
+ # Legal obligation / law snippets field — read access only.
4
+ class Law < DataField
5
+ passarray :laws # each: { id:, content: }
6
+ end
7
+ end
8
+ end
@@ -1,9 +1,9 @@
1
- module Ecoportal::API::GraphQL::Base::Page
2
- class DataField
3
- # Mailbox field — email inbox linked to this field.
4
- # Managed by the system; not settable via script.
5
- class Mailbox < DataField
6
- passthrough :email, :enabled
7
- end
8
- end
9
- end
1
+ module Ecoportal::API::GraphQL::Base::Page
2
+ class DataField
3
+ # Mailbox field — email inbox linked to this field.
4
+ # Managed by the system; not settable via script.
5
+ class Mailbox < DataField
6
+ passthrough :email, :enabled
7
+ end
8
+ end
9
+ end
@@ -4,20 +4,16 @@ module Ecoportal::API::GraphQL::Base::Page
4
4
  passarray :peopleIds
5
5
 
6
6
  def people_ids
7
- ids = Array(peopleIds)
8
- return ids unless ids.empty?
9
-
10
- # Fallback: the read fragment populates `peopleIds`, but if a response ever returns it
11
- # null/empty while the expanded `people { id }` nodes ARE present (a partial / non-
12
- # $content read), seed from the nodes. The backend write replaces peopleIds wholesale,
13
- # so a `people_ids << x` append must start from the existing set or it would WIPE the
14
- # field. Mirrors CrossReference's references.nodes fallback. Read key == write key
15
- # (peopleIds), so this only widens the read; it never creates phantom-dirty.
16
- Array(doc['people']).map { |p| p.is_a?(Hash) ? p['id'] : p }.compact
7
+ people_ids_from(doc)
17
8
  end
18
9
 
19
10
  def people_ids=(ids)
20
- doc['peopleIds'] = Array(ids).compact
11
+ # An explicit write makes `peopleIds` authoritative for THIS instance: without the
12
+ # flag, a deliberate clear (`people_ids = []`) on a `peopleIds: null` baseline would
13
+ # fall back to the `people` nodes on the doc side too, compare equal, and be silently
14
+ # dropped. The flag confines the fallback to un-written docs.
15
+ @people_ids_written = true
16
+ doc['peopleIds'] = Array(ids).compact
21
17
  end
22
18
 
23
19
  # v2 compat: scripts may set via people_ids= or direct assignment
@@ -25,10 +21,52 @@ module Ecoportal::API::GraphQL::Base::Page
25
21
  self.people_ids = ids
26
22
  end
27
23
 
24
+ # Dirty only when the effective people-id SET actually changed.
25
+ #
26
+ # The read response can carry `peopleIds: null` while still populating the expanded
27
+ # `people { id }` (and `cachedPeople`) nodes (a partial / non-$content read). The
28
+ # default key-level leaf diff baselines on `original_doc['peopleIds']` (null), so
29
+ # writing the SAME id set as already attached looks like a brand-new key and flags
30
+ # a change — a phantom-dirty update that sends `peopleIds` for a no-op. Compare id
31
+ # SETS (falling back to `people[].id` on both sides) instead. Mirrors CrossReference's
32
+ # `references.nodes` fallback / `dirty?` override for the identical disease.
33
+ def dirty?
34
+ effective_people_ids.sort != people_ids_from(original_doc).sort
35
+ end
36
+
28
37
  def as_input
29
38
  return nil unless dirty?
30
39
 
31
- { people: { id: id, peopleIds: Array(peopleIds) } }
40
+ { people: { id: id, peopleIds: effective_people_ids } }
41
+ end
42
+
43
+ private
44
+
45
+ # The id set the client currently means: after an explicit `people_ids=` write the raw
46
+ # `peopleIds` doc key is authoritative (so `[]` means CLEAR, no fallback); before any
47
+ # write it is the shape-agnostic read (fallback to `people[].id` nodes). Keeping
48
+ # `as_input` on the same source as `dirty?` also prevents an explicit clear from
49
+ # re-serialising fallback-seeded node ids.
50
+ def effective_people_ids
51
+ return Array(doc['peopleIds']).compact if @people_ids_written
52
+
53
+ people_ids_from(doc)
54
+ end
55
+
56
+ # Extract the people id set from a doc snapshot. `original_doc` is the server baseline
57
+ # (the diff prev_doc — see Diffable::ClassicDiffService), `doc` carries client changes.
58
+ # Prefer `peopleIds` when it is present and non-empty (the write shape, and the normal
59
+ # read shape); fall back to the expanded `people[].id` nodes (the read-only lookup
60
+ # shape) when `peopleIds` is absent/null/empty — so the comparison is shape-agnostic on
61
+ # both sides and stays correct after `consolidate!` copies `doc` into `original_doc`.
62
+ # `people` nodes are a lookup only, never written.
63
+ def people_ids_from(source_doc)
64
+ return [] unless source_doc
65
+
66
+ ids = Array(source_doc['peopleIds']).compact
67
+ return ids unless ids.empty?
68
+
69
+ Array(source_doc['people']).map { |p| p.is_a?(Hash) ? p['id'] : p }.compact
32
70
  end
33
71
  end
34
72
  end
@@ -1,17 +1,17 @@
1
- module Ecoportal::API::GraphQL::Base::Page
2
- class DataField
3
- class PlainText < DataField
4
- passthrough :value
5
-
6
- def value=(new_value)
7
- doc['value'] = new_value
8
- end
9
-
10
- def as_input
11
- return nil unless dirty?
12
-
13
- { plainText: { id: id, value: value } }
14
- end
15
- end
16
- end
17
- end
1
+ module Ecoportal::API::GraphQL::Base::Page
2
+ class DataField
3
+ class PlainText < DataField
4
+ passthrough :value
5
+
6
+ def value=(new_value)
7
+ doc['value'] = new_value
8
+ end
9
+
10
+ def as_input
11
+ return nil unless dirty?
12
+
13
+ { plainText: { id: id, value: value } }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,26 +1,26 @@
1
- module Ecoportal::API::GraphQL::Base::Page
2
- class DataField
3
- class RichText < DataField
4
- passthrough :content
5
-
6
- def content=(new_content)
7
- doc['content'] = new_content
8
- end
9
-
10
- # v2 compat alias — RichText value is stored as content
11
- def value
12
- content
13
- end
14
-
15
- def value=(new_value)
16
- self.content = new_value
17
- end
18
-
19
- def as_input
20
- return nil unless dirty?
21
-
22
- { richText: { id: id, content: content } }
23
- end
24
- end
25
- end
26
- end
1
+ module Ecoportal::API::GraphQL::Base::Page
2
+ class DataField
3
+ class RichText < DataField
4
+ passthrough :content
5
+
6
+ def content=(new_content)
7
+ doc['content'] = new_content
8
+ end
9
+
10
+ # v2 compat alias — RichText value is stored as content
11
+ def value
12
+ content
13
+ end
14
+
15
+ def value=(new_value)
16
+ self.content = new_value
17
+ end
18
+
19
+ def as_input
20
+ return nil unless dirty?
21
+
22
+ { richText: { id: id, content: content } }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,9 +1,9 @@
1
- module Ecoportal::API::GraphQL::Base::Page
2
- class DataField
3
- # Digital signature capture field — read access only.
4
- # Signatures are captured through the UI; not settable via script.
5
- class Signature < DataField
6
- passthrough :signedAt, :signerName
7
- end
8
- end
9
- end
1
+ module Ecoportal::API::GraphQL::Base::Page
2
+ class DataField
3
+ # Digital signature capture field — read access only.
4
+ # Signatures are captured through the UI; not settable via script.
5
+ class Signature < DataField
6
+ passthrough :signedAt, :signerName
7
+ end
8
+ end
9
+ end
@@ -1,17 +1,17 @@
1
- module Ecoportal::API::GraphQL::Base::Page
2
- class DataField
3
- # SmartFill field — AI-auto-populated field using a template-defined prompt.
4
- # Value is generated server-side via Bedrock; trigger_type controls when.
5
- #
6
- # Read-only for DataFieldInput — use the generateSmartFill GraphQL mutation
7
- # (or its trigger) to populate. The instructions field is template-configured
8
- # and can be reviewed/updated via template management.
9
- class SmartFill < DataField
10
- passthrough :status # pending | generating | success | failed
11
- passthrough :trigger_type # manual | snapshot | live
12
- passthrough :instructions # the AI prompt configured on the template field
13
- passboolean :edit_enabled
14
- passthrough :generated_at
15
- end
16
- end
17
- end
1
+ module Ecoportal::API::GraphQL::Base::Page
2
+ class DataField
3
+ # SmartFill field — AI-auto-populated field using a template-defined prompt.
4
+ # Value is generated server-side via Bedrock; trigger_type controls when.
5
+ #
6
+ # Read-only for DataFieldInput — use the generateSmartFill GraphQL mutation
7
+ # (or its trigger) to populate. The instructions field is template-configured
8
+ # and can be reviewed/updated via template management.
9
+ class SmartFill < DataField
10
+ passthrough :status # pending | generating | success | failed
11
+ passthrough :trigger_type # manual | snapshot | live
12
+ passthrough :instructions # the AI prompt configured on the template field
13
+ passboolean :edit_enabled
14
+ passthrough :generated_at
15
+ end
16
+ end
17
+ end
@@ -1,9 +1,9 @@
1
- module Ecoportal::API::GraphQL::Base::Page
2
- class DataField
3
- # Table / embedded structure field — read access only.
4
- # Complex structured data managed via its own mutation path.
5
- class Table < DataField
6
- passarray :rows
7
- end
8
- end
9
- end
1
+ module Ecoportal::API::GraphQL::Base::Page
2
+ class DataField
3
+ # Table / embedded structure field — read access only.
4
+ # Complex structured data managed via its own mutation path.
5
+ class Table < DataField
6
+ passarray :rows
7
+ end
8
+ end
9
+ end
@@ -1,21 +1,21 @@
1
- module Ecoportal::API::GraphQL::Base::Page
2
- class DataField
3
- # Location/tag field — mapped from __typename 'TagField'.
4
- class TagField < DataField
5
- passarray :locations # each: { id:, name: }
6
-
7
- def location_ids
8
- Array(locations).map { |l| l['id'] }.compact
9
- end
10
-
11
- def location_ids=(ids)
12
- doc['locations'] = Array(ids).map { |id_val| { 'id' => id_val } }
13
- end
14
-
15
- # NOTE: LocationFieldInput has NO location-value field — page locations are set at the
16
- # PAGE level (UpdatePageInput.page.locations, via Interface::BasePage#location_ids=),
17
- # not via the data field. So this field contributes no value to dataFields.updates;
18
- # it inherits DataField#as_input (nil). location_ids/= stay as field-level read/staging.
19
- end
20
- end
21
- end
1
+ module Ecoportal::API::GraphQL::Base::Page
2
+ class DataField
3
+ # Location/tag field — mapped from __typename 'TagField'.
4
+ class TagField < DataField
5
+ passarray :locations # each: { id:, name: }
6
+
7
+ def location_ids
8
+ Array(locations).map { |l| l['id'] }.compact
9
+ end
10
+
11
+ def location_ids=(ids)
12
+ doc['locations'] = Array(ids).map { |id_val| { 'id' => id_val } }
13
+ end
14
+
15
+ # NOTE: LocationFieldInput has NO location-value field — page locations are set at the
16
+ # PAGE level (UpdatePageInput.page.locations, via Interface::BasePage#location_ids=),
17
+ # not via the data field. So this field contributes no value to dataFields.updates;
18
+ # it inherits DataField#as_input (nil). location_ids/= stay as field-level read/staging.
19
+ end
20
+ end
21
+ end
@@ -10,24 +10,12 @@ module Ecoportal
10
10
  #
11
11
  # A DataField's array attributes (`options`, `peopleIds`, `contractors`,
12
12
  # `pages`, `fileContainers`, `items`, ...) are declared with `passarray`,
13
- # which registers them as *cascaded* attributes. The default `DiffService`
14
- # strips cascaded keys from the flat classic diff (`doc_with_non_cascaded_attributes`)
15
- # on the assumption that a later `diff_reduce` pass re-adds them by cascading
16
- # into nested `GraphQL::Model` children. DataField arrays are plain hashes /
17
- # strings, not `GraphQL::Model` objects, so that re-add never happens and the
18
- # array change becomes invisible to the diff (scalar `passthrough` fields are
19
- # unaffected). For a leaf model we want every doc key diffed inline, so this
20
- # service keeps cascaded keys in place.
21
- class LeafDiffService < Ecoportal::API::Common::GraphQL::Model::Diffable::DiffService
22
- private
23
-
24
- # Keep all doc keys: leaf-field arrays are data, not nested models.
25
- def doc_with_non_cascaded_attributes(json)
26
- json
27
- end
28
- end
29
-
30
- DIFF_CLASS = LeafDiffService
13
+ # which registers them as *cascaded* attributes invisible to the default
14
+ # `DiffService` (see `Diffable::LeafDiffService` for the full explanation).
15
+ # A DataField is a pure leaf model (no nested `GraphQL::Model` children), so
16
+ # it diffs `flat: true` the promoted shared `LeafDiffService` keeps the
17
+ # array doc keys inline.
18
+ DIFF_CLASS = Ecoportal::API::Common::GraphQL::Model::Diffable::LeafDiffService
31
19
  # Map GraphQL __typename values to subclass names.
32
20
  TYPE_MAP = {
33
21
  'PlainText' => 'PlainText',
@@ -55,6 +43,12 @@ module Ecoportal
55
43
 
56
44
  passkey :id
57
45
  passthrough :label, :deindex, :genomeSignature
46
+ # `read_only: true` is load-bearing, not documentation: `description` is readable on
47
+ # `DataFieldsInterface` but ABSENT from `DataFieldInput` and every per-type member of
48
+ # it, so a writable accessor would make the field dirty and push a key `updatePage`
49
+ # cannot accept. The only writer is the `editFieldConfiguration` workflow command
50
+ # (`Input::WorkflowCommand::EditFieldConfiguration`).
51
+ passthrough :description, read_only: true
58
52
  # __typename is stored under the 'type' key after mapping
59
53
  passthrough :type
60
54
 
@@ -10,6 +10,9 @@ module Ecoportal
10
10
  passkey :id
11
11
  passthrough :name, :ordering, :state
12
12
  passboolean :active, :started
13
+ # Per-stage tag set (Stage.tags in the schema). Fetched by the stageAttrs
14
+ # fragment; a component of #all_tags. Empty array when not queried.
15
+ passarray :tags
13
16
 
14
17
  class_resolver :callback_type_class, 'Ecoportal::API::GraphQL::Base::PagesWorkflow::CallbackType'
15
18
 
@@ -17,6 +20,54 @@ module Ecoportal
17
20
  # canonical field objects (filtered to this stage) rather than fresh dups.
18
21
  attr_writer :page_field_collection
19
22
 
23
+ # The owning page, resolved via the DoubleModel's NATIVE nesting reference rather
24
+ # than a manually-injected back-ref. A stage is embedded under the page as
25
+ # page -> stages (CollectionModel) -> stage, so `_parent` is the intermediate
26
+ # collection, NOT the page. `root` walks the whole `_parent` chain to the top of
27
+ # the doc model (the page), which is robust to that intermediate nesting.
28
+ #
29
+ # Returns the page for an embedded stage, or nil for a standalone stage whose root
30
+ # is itself (i.e. not a page — has no baseTags/otherTags/location_ids to fold in).
31
+ def page
32
+ top = root
33
+ top.equal?(self) ? nil : top
34
+ end
35
+
36
+ # location_ids redirect: the GraphQL Stage type has NO location field — locations
37
+ # are assigned at the PAGE level (page.locations { id }). So a stage's location ids
38
+ # are the page's location ids. Empty array for a standalone stage.
39
+ def location_ids
40
+ Array(page&.location_ids)
41
+ end
42
+
43
+ # The stage's fully-compiled tag set (client-side build of the backend-only
44
+ # "compiled_tags"), per the domain formula:
45
+ #
46
+ # Stage.all_tags = page.baseTags + page.location_ids + page.otherTags + stage.tags
47
+ #
48
+ # (page.location_ids — surfaced here via #location_ids — stands in for the per-stage
49
+ # "location_ids" of the formula: the GraphQL schema does NOT expose locations on the
50
+ # Stage type, they are assigned at the PAGE level.)
51
+ #
52
+ # Returns a de-duplicated Array of tag strings. For a standalone stage (no owning
53
+ # page) folds in only the stage's own tags.
54
+ def all_tags
55
+ (page_base_tags + location_ids + page_other_tags + Array(tags)).
56
+ compact.uniq
57
+ end
58
+
59
+ private
60
+
61
+ def page_base_tags
62
+ page ? Array(page.baseTags) : []
63
+ end
64
+
65
+ def page_other_tags
66
+ page ? Array(page.otherTags) : []
67
+ end
68
+
69
+ public
70
+
20
71
  def workflow_callbacks
21
72
  @workflow_callbacks ||= Array(doc['workflowCallbacks'] || []).map { |cb| callback_type_class.from_doc(cb) }
22
73
  end
@@ -1,15 +1,15 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Base
5
- module Page
6
- class Phased < Interface::BasePage
7
- require_relative 'phased/stage'
8
-
9
- embeds_many :stages, klass: Stage, read_only: true
10
- end
11
- end
12
- end
13
- end
14
- end
15
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Base
5
+ module Page
6
+ class Phased < Interface::BasePage
7
+ require_relative 'phased/stage'
8
+
9
+ embeds_many :stages, klass: Stage, read_only: true
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,48 +1,48 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Base
5
- module Page
6
- # Wraps a SectionUnion doc (ContentSection or SplitSection).
7
- # Provides access to heading, type, and data fields within the section.
8
- class Section < Logic::BaseModel
9
- read_only!
10
-
11
- passkey :id
12
- passthrough :heading
13
-
14
- # __typename normalised to 'type' during initialisation
15
- passthrough :type
16
-
17
- def initialize(raw_doc = {})
18
- raw_doc = raw_doc.dup if raw_doc.is_a?(Hash)
19
- raw_doc['type'] ||= raw_doc['__typename'] if raw_doc.is_a?(Hash)
20
- super
21
- end
22
-
23
- # All data fields in this section.
24
- # ContentSection → dataFields
25
- # SplitSection → leftDataFields + rightDataFields (merged)
26
- def components
27
- all = (doc['dataFields'] || []) +
28
- (doc['leftDataFields'] || []) +
29
- (doc['rightDataFields'] || [])
30
- DataField::Collection.from_doc(all)
31
- end
32
-
33
- # v2 compat alias
34
- alias_method :data_fields, :components
35
-
36
- def content_section?
37
- type.to_s == 'ContentSection'
38
- end
39
-
40
- def split_section?
41
- type.to_s == 'SplitSection'
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Base
5
+ module Page
6
+ # Wraps a SectionUnion doc (ContentSection or SplitSection).
7
+ # Provides access to heading, type, and data fields within the section.
8
+ class Section < Logic::BaseModel
9
+ read_only!
10
+
11
+ passkey :id
12
+ passthrough :heading
13
+
14
+ # __typename normalised to 'type' during initialisation
15
+ passthrough :type
16
+
17
+ def initialize(raw_doc = {})
18
+ raw_doc = raw_doc.dup if raw_doc.is_a?(Hash)
19
+ raw_doc['type'] ||= raw_doc['__typename'] if raw_doc.is_a?(Hash)
20
+ super
21
+ end
22
+
23
+ # All data fields in this section.
24
+ # ContentSection → dataFields
25
+ # SplitSection → leftDataFields + rightDataFields (merged)
26
+ def components
27
+ all = (doc['dataFields'] || []) +
28
+ (doc['leftDataFields'] || []) +
29
+ (doc['rightDataFields'] || [])
30
+ DataField::Collection.from_doc(all)
31
+ end
32
+
33
+ # v2 compat alias
34
+ alias_method :data_fields, :components
35
+
36
+ def content_section?
37
+ type.to_s == 'ContentSection'
38
+ end
39
+
40
+ def split_section?
41
+ type.to_s == 'SplitSection'
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,12 +1,12 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Base
5
- class PageInfo < Logic::BaseModel
6
- passthrough :startCursor, :endCursor
7
- passboolean :hasNextPage, :hasPreviousPage
8
- end
9
- end
10
- end
11
- end
12
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Base
5
+ class PageInfo < Logic::BaseModel
6
+ passthrough :startCursor, :endCursor
7
+ passboolean :hasNextPage, :hasPreviousPage
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end