ecoportal-api-graphql 1.3.5 → 1.3.16

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 (434) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +934 -477
  3. data/lib/ecoportal/api/common/graphql/CLAUDE.md +36 -0
  4. data/lib/ecoportal/api/common/graphql/client.rb +1 -1
  5. data/lib/ecoportal/api/common/graphql/http_client.rb +195 -145
  6. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +28 -0
  7. data/lib/ecoportal/api/common/graphql/model/as_input.rb +8 -5
  8. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +3 -1
  9. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +31 -23
  10. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +54 -1
  11. data/lib/ecoportal/api/common/graphql/model/diffable.rb +54 -54
  12. data/lib/ecoportal/api/graphql/CLAUDE.md +37 -0
  13. data/lib/ecoportal/api/graphql/base/CLAUDE.md +50 -0
  14. data/lib/ecoportal/api/graphql/base/action.rb +43 -43
  15. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -0
  16. data/lib/ecoportal/api/graphql/base/contractor_entity/member_changes.rb +67 -67
  17. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -0
  18. data/lib/ecoportal/api/graphql/base/file_container.rb +14 -14
  19. data/lib/ecoportal/api/graphql/base/force/binding.rb +19 -0
  20. data/lib/ecoportal/api/graphql/base/force/binding_collection.rb +62 -0
  21. data/lib/ecoportal/api/graphql/base/force/collection.rb +47 -0
  22. data/lib/ecoportal/api/graphql/base/force.rb +65 -0
  23. data/lib/ecoportal/api/graphql/base/kickstand/job.rb +17 -0
  24. data/lib/ecoportal/api/graphql/base/kickstand/workflow.rb +18 -0
  25. data/lib/ecoportal/api/graphql/base/kickstand.rb +13 -0
  26. data/lib/ecoportal/api/graphql/base/location_classification_type.rb +15 -15
  27. data/lib/ecoportal/api/graphql/base/location_structure.rb +27 -27
  28. data/lib/ecoportal/api/graphql/base/organization.rb +15 -15
  29. data/lib/ecoportal/api/graphql/base/page/basic.rb +38 -0
  30. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -0
  31. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -0
  32. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -0
  33. data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +119 -0
  34. data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -0
  35. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +54 -0
  36. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -0
  37. data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -0
  38. data/lib/ecoportal/api/graphql/base/page/data_field/gauge.rb +19 -0
  39. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -0
  40. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -0
  41. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -0
  42. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -0
  43. data/lib/ecoportal/api/graphql/base/page/data_field/number.rb +20 -0
  44. data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +35 -0
  45. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -0
  46. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -0
  47. data/lib/ecoportal/api/graphql/base/page/data_field/select.rb +41 -0
  48. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -0
  49. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -0
  50. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -0
  51. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -0
  52. data/lib/ecoportal/api/graphql/base/page/data_field.rb +137 -12
  53. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +68 -14
  54. data/lib/ecoportal/api/graphql/base/page/phased.rb +1 -0
  55. data/lib/ecoportal/api/graphql/base/page/section.rb +36 -0
  56. data/lib/ecoportal/api/graphql/base/page/section_collection.rb +85 -0
  57. data/lib/ecoportal/api/graphql/base/page/task.rb +24 -0
  58. data/lib/ecoportal/api/graphql/base/page.rb +17 -14
  59. data/lib/ecoportal/api/graphql/base/pages_workflow/action_type_selection.rb +17 -0
  60. data/lib/ecoportal/api/graphql/base/pages_workflow/callback_type.rb +28 -0
  61. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change.rb +17 -0
  62. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change_message.rb +15 -0
  63. data/lib/ecoportal/api/graphql/base/pages_workflow/command_es_change.rb +17 -0
  64. data/lib/ecoportal/api/graphql/base/pages_workflow/command_interface.rb +36 -0
  65. data/lib/ecoportal/api/graphql/base/pages_workflow/email_config.rb +18 -0
  66. data/lib/ecoportal/api/graphql/base/pages_workflow/escalation_level.rb +19 -0
  67. data/lib/ecoportal/api/graphql/base/pages_workflow/in_system_config.rb +16 -0
  68. data/lib/ecoportal/api/graphql/base/pages_workflow/mailbox_field_selection.rb +17 -0
  69. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -0
  70. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -0
  71. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/create_page.rb +21 -0
  72. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -0
  73. data/lib/ecoportal/api/graphql/base/pages_workflow/people_field_selection.rb +17 -0
  74. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -0
  75. data/lib/ecoportal/api/graphql/base/pages_workflow/register_field.rb +17 -0
  76. data/lib/ecoportal/api/graphql/base/pages_workflow/task_config_selection.rb +17 -0
  77. data/lib/ecoportal/api/graphql/base/pages_workflow/time_delay_config.rb +16 -0
  78. data/lib/ecoportal/api/graphql/base/pages_workflow/trigger_interface.rb +26 -0
  79. data/lib/ecoportal/api/graphql/base/pages_workflow/triggers/conditional_logic.rb +17 -0
  80. data/lib/ecoportal/api/graphql/base/pages_workflow/user_selection.rb +16 -0
  81. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -0
  82. data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -0
  83. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -0
  84. data/lib/ecoportal/api/graphql/base/register.rb +18 -0
  85. data/lib/ecoportal/api/graphql/base/template.rb +35 -0
  86. data/lib/ecoportal/api/graphql/base.rb +37 -24
  87. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +65 -0
  88. data/lib/ecoportal/api/graphql/builder/contractor_entity.rb +41 -41
  89. data/lib/ecoportal/api/graphql/builder/kickstand.rb +73 -0
  90. data/lib/ecoportal/api/graphql/builder/page.rb +210 -41
  91. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -0
  92. data/lib/ecoportal/api/graphql/builder/register.rb +27 -19
  93. data/lib/ecoportal/api/graphql/builder/template.rb +80 -0
  94. data/lib/ecoportal/api/graphql/builder/template_builder.rb +174 -0
  95. data/lib/ecoportal/api/graphql/builder.rb +17 -14
  96. data/lib/ecoportal/api/graphql/compat/filter_translator.rb +142 -0
  97. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -0
  98. data/lib/ecoportal/api/graphql/compat/pages.rb +212 -0
  99. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -0
  100. data/lib/ecoportal/api/graphql/compat/response.rb +35 -0
  101. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -0
  102. data/lib/ecoportal/api/graphql/compat/stage_collection.rb +70 -0
  103. data/lib/ecoportal/api/graphql/compat/stage_view.rb +76 -0
  104. data/lib/ecoportal/api/graphql/compat.rb +17 -0
  105. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -0
  106. data/lib/ecoportal/api/graphql/concerns/deprecation.rb +20 -0
  107. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +21 -28
  108. data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -0
  109. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -0
  110. data/lib/ecoportal/api/graphql/concerns.rb +14 -10
  111. data/lib/ecoportal/api/graphql/connection/action.rb +11 -11
  112. data/lib/ecoportal/api/graphql/connection/action_category.rb +11 -11
  113. data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +11 -11
  114. data/lib/ecoportal/api/graphql/connection/page.rb +11 -0
  115. data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +13 -0
  116. data/lib/ecoportal/api/graphql/connection/person_member.rb +11 -11
  117. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -0
  118. data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -0
  119. data/lib/ecoportal/api/graphql/connection.rb +17 -13
  120. data/lib/ecoportal/api/graphql/diff/change.rb +59 -0
  121. data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +329 -0
  122. data/lib/ecoportal/api/graphql/diff/cross_object_diff.rb +165 -0
  123. data/lib/ecoportal/api/graphql/diff/deploy.rb +121 -0
  124. data/lib/ecoportal/api/graphql/diff/id_resolver.rb +64 -0
  125. data/lib/ecoportal/api/graphql/diff/pairing/candidate.rb +32 -0
  126. data/lib/ecoportal/api/graphql/diff/pairing/engine.rb +173 -0
  127. data/lib/ecoportal/api/graphql/diff/pairing/ledger.rb +119 -0
  128. data/lib/ecoportal/api/graphql/diff/pairing/signals.rb +104 -0
  129. data/lib/ecoportal/api/graphql/diff/strategy.rb +113 -0
  130. data/lib/ecoportal/api/graphql/diff/version_diff.rb +332 -0
  131. data/lib/ecoportal/api/graphql/diff.rb +34 -0
  132. data/lib/ecoportal/api/graphql/file_upload/client.rb +192 -0
  133. data/lib/ecoportal/api/graphql/file_upload.rb +10 -0
  134. data/lib/ecoportal/api/graphql/fragment/action.rb +1 -1
  135. data/lib/ecoportal/api/graphql/fragment/action_category.rb +1 -1
  136. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +1 -1
  137. data/lib/ecoportal/api/graphql/fragment/field_configuration.rb +38 -0
  138. data/lib/ecoportal/api/graphql/fragment/force.rb +34 -0
  139. data/lib/ecoportal/api/graphql/fragment/location_draft.rb +53 -53
  140. data/lib/ecoportal/api/graphql/fragment/location_node.rb +26 -26
  141. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +1 -1
  142. data/lib/ecoportal/api/graphql/fragment/page.rb +85 -0
  143. data/lib/ecoportal/api/graphql/fragment/page_task.rb +39 -0
  144. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +396 -0
  145. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -0
  146. data/lib/ecoportal/api/graphql/fragment/pages_workflow.rb +172 -0
  147. data/lib/ecoportal/api/graphql/fragment/pagination.rb +1 -1
  148. data/lib/ecoportal/api/graphql/fragment/template.rb +51 -0
  149. data/lib/ecoportal/api/graphql/fragment.rb +40 -27
  150. data/lib/ecoportal/api/graphql/input/action/update.rb +14 -14
  151. data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +41 -16
  152. data/lib/ecoportal/api/graphql/input/contractor_entity.rb +14 -14
  153. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -0
  154. data/lib/ecoportal/api/graphql/input/location_structure/apply_commands.rb +47 -47
  155. data/lib/ecoportal/api/graphql/input/location_structure/draft/add_commands.rb +49 -49
  156. data/lib/ecoportal/api/graphql/input/location_structure/update_command.rb +27 -27
  157. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -0
  158. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -0
  159. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -0
  160. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -0
  161. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -0
  162. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -0
  163. data/lib/ecoportal/api/graphql/input/page/review_task.rb +14 -0
  164. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -0
  165. data/lib/ecoportal/api/graphql/input/page/update.rb +140 -0
  166. data/lib/ecoportal/api/graphql/input/page.rb +26 -0
  167. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -0
  168. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -0
  169. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -0
  170. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -0
  171. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -0
  172. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -0
  173. data/lib/ecoportal/api/graphql/input/register.rb +13 -0
  174. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -0
  175. data/lib/ecoportal/api/graphql/input/search_conf.rb +436 -0
  176. data/lib/ecoportal/api/graphql/input/variable_binding.rb +20 -0
  177. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -0
  178. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -0
  179. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -0
  180. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -0
  181. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -0
  182. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -0
  183. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +27 -0
  184. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -0
  185. data/lib/ecoportal/api/graphql/input/workflow_command/add_gauge_field_stop.rb +19 -0
  186. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -0
  187. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -0
  188. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -0
  189. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -0
  190. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -0
  191. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -0
  192. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -0
  193. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -0
  194. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -0
  195. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -0
  196. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -0
  197. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -0
  198. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -0
  199. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +19 -0
  200. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -0
  201. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -0
  202. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -0
  203. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -0
  204. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -0
  205. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -0
  206. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -0
  207. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -0
  208. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -0
  209. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -0
  210. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -0
  211. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -0
  212. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +18 -0
  213. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -0
  214. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -0
  215. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -0
  216. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -0
  217. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -0
  218. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -0
  219. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -0
  220. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -0
  221. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -0
  222. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -0
  223. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -0
  224. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -0
  225. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -0
  226. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +19 -0
  227. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -0
  228. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -0
  229. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -0
  230. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -0
  231. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -0
  232. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +24 -0
  233. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -0
  234. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -0
  235. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -0
  236. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -0
  237. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -0
  238. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -0
  239. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -0
  240. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -0
  241. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -0
  242. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -0
  243. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -0
  244. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -0
  245. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -0
  246. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -0
  247. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -0
  248. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -0
  249. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -0
  250. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -0
  251. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -0
  252. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -0
  253. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -0
  254. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -0
  255. data/lib/ecoportal/api/graphql/input/workflow_command/remove_gauge_field_stop.rb +17 -0
  256. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_field_config.rb +17 -0
  257. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -0
  258. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -0
  259. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -0
  260. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -0
  261. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -0
  262. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -0
  263. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -0
  264. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -0
  265. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -0
  266. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -0
  267. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -0
  268. data/lib/ecoportal/api/graphql/input/workflow_command/remove_select_field_option.rb +17 -0
  269. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -0
  270. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -0
  271. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -0
  272. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -0
  273. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -0
  274. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -0
  275. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -0
  276. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -0
  277. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -0
  278. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -0
  279. data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -0
  280. data/lib/ecoportal/api/graphql/input.rb +24 -16
  281. data/lib/ecoportal/api/graphql/interface/base_page.rb +100 -58
  282. data/lib/ecoportal/api/graphql/interface/location_structure/command.rb +30 -30
  283. data/lib/ecoportal/api/graphql/interface/location_structure/nodes.rb +27 -28
  284. data/lib/ecoportal/api/graphql/logic/base_model.rb +2 -0
  285. data/lib/ecoportal/api/graphql/logic/base_query.rb +45 -2
  286. data/lib/ecoportal/api/graphql/logic/connection.rb +34 -34
  287. data/lib/ecoportal/api/graphql/logic/input.rb +26 -11
  288. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -0
  289. data/lib/ecoportal/api/graphql/model/organization.rb +65 -55
  290. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -0
  291. data/lib/ecoportal/api/graphql/model/page/phased.rb +82 -20
  292. data/lib/ecoportal/api/graphql/model/page/task.rb +16 -0
  293. data/lib/ecoportal/api/graphql/model/page.rb +16 -14
  294. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -0
  295. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -0
  296. data/lib/ecoportal/api/graphql/model/person_member.rb +15 -15
  297. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -0
  298. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -0
  299. data/lib/ecoportal/api/graphql/model/register.rb +10 -0
  300. data/lib/ecoportal/api/graphql/model/template.rb +15 -0
  301. data/lib/ecoportal/api/graphql/model.rb +32 -22
  302. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +1 -1
  303. data/lib/ecoportal/api/graphql/mutation/action/create.rb +1 -1
  304. data/lib/ecoportal/api/graphql/mutation/action/update.rb +1 -1
  305. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -0
  306. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -0
  307. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -0
  308. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +1 -1
  309. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +1 -1
  310. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +1 -1
  311. data/lib/ecoportal/api/graphql/mutation/contractor_entity.rb +14 -14
  312. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_jobs.rb +43 -0
  313. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_workflows.rb +43 -0
  314. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_job.rb +39 -0
  315. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_workflow.rb +39 -0
  316. data/lib/ecoportal/api/graphql/mutation/kickstand/start_job.rb +39 -0
  317. data/lib/ecoportal/api/graphql/mutation/kickstand/start_workflow.rb +39 -0
  318. data/lib/ecoportal/api/graphql/mutation/kickstand/stop_workflow.rb +39 -0
  319. data/lib/ecoportal/api/graphql/mutation/kickstand.rb +18 -0
  320. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +3 -3
  321. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +2 -2
  322. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +2 -2
  323. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +3 -3
  324. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +3 -3
  325. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -0
  326. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -0
  327. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +38 -0
  328. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -0
  329. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +38 -0
  330. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -0
  331. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +38 -0
  332. data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +69 -0
  333. data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +52 -0
  334. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +38 -0
  335. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -0
  336. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -0
  337. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -0
  338. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -0
  339. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -0
  340. data/lib/ecoportal/api/graphql/mutation/page/update_variable_bindings.rb +44 -0
  341. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -0
  342. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -0
  343. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +34 -0
  344. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -0
  345. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -0
  346. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -0
  347. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -0
  348. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -0
  349. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -0
  350. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -0
  351. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -0
  352. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -0
  353. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -0
  354. data/lib/ecoportal/api/graphql/mutation/template/create.rb +39 -0
  355. data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -0
  356. data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +43 -0
  357. data/lib/ecoportal/api/graphql/mutation/template/publish.rb +39 -0
  358. data/lib/ecoportal/api/graphql/mutation/template/unpublish.rb +39 -0
  359. data/lib/ecoportal/api/graphql/mutation/template/update.rb +43 -0
  360. data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +43 -0
  361. data/lib/ecoportal/api/graphql/mutation/template.rb +18 -0
  362. data/lib/ecoportal/api/graphql/mutation.rb +20 -12
  363. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -0
  364. data/lib/ecoportal/api/graphql/payload/contractor_entity.rb +14 -14
  365. data/lib/ecoportal/api/graphql/payload/execute_workflow_commands.rb +36 -0
  366. data/lib/ecoportal/api/graphql/payload/force_commands.rb +31 -0
  367. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +36 -0
  368. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +36 -0
  369. data/lib/ecoportal/api/graphql/payload/kickstand/job.rb +13 -0
  370. data/lib/ecoportal/api/graphql/payload/kickstand/workflow.rb +13 -0
  371. data/lib/ecoportal/api/graphql/payload/kickstand.rb +15 -0
  372. data/lib/ecoportal/api/graphql/payload/location_structure/draft/create.rb +33 -34
  373. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +36 -0
  374. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -0
  375. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -0
  376. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -0
  377. data/lib/ecoportal/api/graphql/payload/page/draft.rb +26 -0
  378. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -0
  379. data/lib/ecoportal/api/graphql/payload/page/review_task_batch.rb +23 -0
  380. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -0
  381. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -0
  382. data/lib/ecoportal/api/graphql/payload/page/update_variable_bindings.rb +13 -0
  383. data/lib/ecoportal/api/graphql/payload/page.rb +20 -0
  384. data/lib/ecoportal/api/graphql/payload/preset_view.rb +15 -0
  385. data/lib/ecoportal/api/graphql/payload/register.rb +15 -0
  386. data/lib/ecoportal/api/graphql/payload/template/create.rb +13 -0
  387. data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +13 -0
  388. data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +13 -0
  389. data/lib/ecoportal/api/graphql/payload/template/publish.rb +13 -0
  390. data/lib/ecoportal/api/graphql/payload/template/unpublish.rb +13 -0
  391. data/lib/ecoportal/api/graphql/payload/template/update.rb +13 -0
  392. data/lib/ecoportal/api/graphql/payload/template/update_information.rb +13 -0
  393. data/lib/ecoportal/api/graphql/payload/template.rb +18 -0
  394. data/lib/ecoportal/api/graphql/payload.rb +23 -12
  395. data/lib/ecoportal/api/graphql/query/action.rb +1 -1
  396. data/lib/ecoportal/api/graphql/query/action_categories.rb +1 -1
  397. data/lib/ecoportal/api/graphql/query/actions.rb +2 -2
  398. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +1 -1
  399. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -0
  400. data/lib/ecoportal/api/graphql/query/location_structure/draft.rb +62 -62
  401. data/lib/ecoportal/api/graphql/query/location_structure.rb +61 -61
  402. data/lib/ecoportal/api/graphql/query/location_structures.rb +57 -57
  403. data/lib/ecoportal/api/graphql/query/page.rb +45 -0
  404. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -0
  405. data/lib/ecoportal/api/graphql/query/page_with_forces.rb +49 -0
  406. data/lib/ecoportal/api/graphql/query/pages.rb +59 -0
  407. data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +65 -0
  408. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -0
  409. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -0
  410. data/lib/ecoportal/api/graphql/query/templates.rb +53 -0
  411. data/lib/ecoportal/api/graphql/query.rb +27 -16
  412. data/lib/ecoportal/api/graphql.rb +143 -80
  413. data/lib/ecoportal/api/graphql_version.rb +5 -5
  414. metadata +333 -25
  415. data/.gitignore +0 -24
  416. data/.markdownlint.json +0 -4
  417. data/.rspec +0 -3
  418. data/.rubocop.yml +0 -97
  419. data/.ruby-version +0 -1
  420. data/.yardopts +0 -10
  421. data/Gemfile +0 -6
  422. data/Rakefile +0 -38
  423. data/bin/console +0 -14
  424. data/bin/setup +0 -8
  425. data/bin/setup.ps1 +0 -6
  426. data/ecoportal-api-graphql.gemspec +0 -40
  427. data/tests/actions_get.rb +0 -7
  428. data/tests/contractor_entities_get.rb +0 -20
  429. data/tests/contractor_entity_create.rb +0 -19
  430. data/tests/contractor_entity_udpate.rb +0 -20
  431. data/tests/loc_structure_get.rb +0 -11
  432. data/tests/loc_structure_update.rb +0 -51
  433. data/tests/loc_structures_get.rb +0 -15
  434. data/tests/local_libs.rb +0 -20
@@ -0,0 +1,192 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'json'
4
+ require 'mime/types'
5
+
6
+ module Ecoportal
7
+ module API
8
+ class GraphQL
9
+ module FileUpload
10
+ # Orchestrates the full file upload workflow:
11
+ #
12
+ # Step 1 — Get S3 pre-signed credentials via GraphQL
13
+ # Step 2 — Upload file directly to S3 (multipart form POST)
14
+ # Step 3 — Register the upload with EcoPortal (REST POST /v2/s3/files)
15
+ # Step 4 — Poll until the FileContainer is created
16
+ #
17
+ # Returns a fileContainerId string on success, suitable for use in
18
+ # DataField::FileField#file_container_ids= or DataField::ImageGallery#file_container_ids=
19
+ #
20
+ # Usage:
21
+ # container_id = api.file_upload.upload('/path/to/report.pdf')
22
+ # page.components.get_by_name('Attachment').file_container_ids = [container_id]
23
+ # api.pages.update(page)
24
+ #
25
+ # Step 1 (GraphQL) authenticates via the gem's email/pass OAuth bearer token.
26
+ # Steps 3-4 (REST v2 `/s3/files`) require the gem to ALSO have been initialised
27
+ # with `api_key:` — `Ecoportal::API::GraphQL.new(email:, pass:, api_key:)` — since
28
+ # those endpoints authenticate via `X-ECOPORTAL-API-KEY`, not the GraphQL bearer
29
+ # token (mirrors `Ecoportal::API::Common::Content::Client#base_request` in
30
+ # ecoportal-api-v2).
31
+ class Client
32
+ POLL_INTERVAL = 2 # seconds between poll attempts
33
+ POLL_MAX_WAIT = 120 # seconds before giving up
34
+
35
+ def initialize(graphql_client)
36
+ @graphql_client = graphql_client
37
+ @http_client = graphql_client.client.http_client
38
+ @org_id = @http_client.org_id
39
+ @host = @http_client.host
40
+ end
41
+
42
+ # Upload a file and return the fileContainerId.
43
+ # Raises RuntimeError on failure.
44
+ def upload(file_path)
45
+ raise ArgumentError, "File not found: #{file_path}" unless File.exist?(file_path)
46
+
47
+ creds = fetch_s3_credentials
48
+ s3_key = direct_upload_to_storage(file_path, creds)
49
+ poll_id = register_upload(file_path, s3_key)
50
+ poll_for_container_id(poll_id)
51
+ end
52
+
53
+ private
54
+
55
+ # Step 1: GraphQL query → S3 presigned credentials
56
+ def fetch_s3_credentials
57
+ Query::FileUploadSignature.new(@graphql_client.client).query
58
+ end
59
+
60
+ # Step 2: Direct multipart POST to S3
61
+ def direct_upload_to_storage(file_path, creds)
62
+ filename = File.basename(file_path)
63
+ s3_key = "#{creds.upload_prefix}#{filename}"
64
+ mime_type = detect_mime_type(file_path)
65
+ endpoint = URI(creds.endpoint)
66
+
67
+ File.open(file_path, 'rb') do |file|
68
+ Net::HTTP.start(endpoint.host, endpoint.port,
69
+ use_ssl: endpoint.scheme == 'https') do |http|
70
+ boundary = "EcoPortalUpload#{SecureRandom.hex(8)}"
71
+ body = build_multipart(boundary, {
72
+ s3_key: s3_key, access_key: creds.access_key,
73
+ policy: creds.policy, signature: creds.signature,
74
+ mime_type: mime_type, filename: filename
75
+ }, file)
76
+ request = Net::HTTP::Post.new(endpoint.path.empty? ? '/' : endpoint.path)
77
+ request['Content-Type'] = "multipart/form-data; boundary=#{boundary}"
78
+ request.body = body
79
+ response = http.request(request)
80
+ raise "S3 upload failed (#{response.code}): #{response.body}" unless response.code.to_i < 300
81
+ end
82
+ end
83
+
84
+ s3_key
85
+ end
86
+
87
+ # Step 3: Register with EcoPortal backend (REST v2)
88
+ def register_upload(file_path, s3_key)
89
+ filename = File.basename(file_path)
90
+ mime_type = detect_mime_type(file_path)
91
+ filesize = File.size(file_path)
92
+
93
+ body = { filename: filename, filetype: mime_type, filesize: filesize, path: s3_key }
94
+ response = upload_post('/s3/files', body)
95
+ raise "File registration failed: #{response.body}" unless response.code.to_i < 300
96
+
97
+ JSON.parse(response.body)['id']
98
+ end
99
+
100
+ # Step 4: Poll until FileContainer is created; return fileContainerId
101
+ def poll_for_container_id(poll_id)
102
+ deadline = Time.now + POLL_MAX_WAIT
103
+ loop do
104
+ raise 'File upload timed out' if Time.now > deadline
105
+
106
+ response = upload_get("/s3/files/poll/#{poll_id}")
107
+ raise "Poll failed: #{response.body}" unless response.code.to_i < 300
108
+
109
+ data = JSON.parse(response.body)
110
+ status = data['status'] || data.dig('file', 'status')
111
+
112
+ return data.dig('file', 'file_container_id') if data['status'] == 'success'
113
+ raise "File upload failed: #{data.inspect}" if status == 'failed'
114
+
115
+ sleep POLL_INTERVAL
116
+ end
117
+ end
118
+
119
+ # --- REST helpers (v2 endpoints, X-ECOPORTAL-API-KEY auth) ---
120
+
121
+ def api_key
122
+ @api_key ||= @http_client.api_key.tap do |key|
123
+ if key.nil? || key.to_s.strip.empty?
124
+ raise 'File upload requires an api_key: Ecoportal::API::GraphQL.new(email:, pass:, api_key:). ' \
125
+ 'The v2 REST endpoints used to register/poll an upload authenticate via ' \
126
+ 'X-ECOPORTAL-API-KEY, not the GraphQL OAuth bearer token.'
127
+ end
128
+ end
129
+ end
130
+
131
+ def upload_base_url
132
+ "https://#{@host}/api/v2/#{@org_id}"
133
+ end
134
+
135
+ def upload_get(path)
136
+ uri = URI("#{upload_base_url}#{path}")
137
+ request = Net::HTTP::Get.new(uri)
138
+ request['X-ECOPORTAL-API-KEY'] = api_key
139
+ request['Accept'] = 'application/json'
140
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
141
+ end
142
+
143
+ def upload_post(path, body)
144
+ uri = URI("#{upload_base_url}#{path}")
145
+ request = Net::HTTP::Post.new(uri)
146
+ request['X-ECOPORTAL-API-KEY'] = api_key
147
+ request['Content-Type'] = 'application/json'
148
+ request['Accept'] = 'application/json'
149
+ request.body = JSON.generate(body)
150
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
151
+ end
152
+
153
+ # --- Multipart builder ---
154
+
155
+ def build_multipart(boundary, opts, file_io)
156
+ parts = {
157
+ 'key' => opts[:s3_key],
158
+ 'AWSAccessKeyId' => opts[:access_key],
159
+ 'policy' => opts[:policy],
160
+ 'signature' => opts[:signature],
161
+ 'x-amz-server-side-encryption' => 'AES256',
162
+ 'Content-Type' => opts[:mime_type]
163
+ }
164
+ filename = opts[:filename]
165
+ mime_type = opts[:mime_type]
166
+
167
+ body = +''
168
+ parts.each do |name, value|
169
+ body << "--#{boundary}\r\n"
170
+ body << "Content-Disposition: form-data; name=\"#{name}\"\r\n\r\n"
171
+ body << "#{value}\r\n"
172
+ end
173
+ # File field last
174
+ body << "--#{boundary}\r\n"
175
+ body << "Content-Disposition: form-data; name=\"file\"; filename=\"#{filename}\"\r\n"
176
+ body << "Content-Type: #{mime_type}\r\n\r\n"
177
+ body << file_io.read
178
+ body << "\r\n--#{boundary}--\r\n"
179
+ body
180
+ end
181
+
182
+ def detect_mime_type(file_path)
183
+ types = MIME::Types.type_for(file_path)
184
+ types.first&.to_s || 'application/octet-stream'
185
+ rescue StandardError
186
+ 'application/octet-stream'
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,10 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module FileUpload
5
+ end
6
+ end
7
+ end
8
+ end
9
+
10
+ require_relative 'file_upload/client'
@@ -3,7 +3,7 @@ module Ecoportal
3
3
  class GraphQL
4
4
  class Fragment
5
5
  fragment :Action, <<~GRAPHQL
6
- fragment on Action {
6
+ fragment Action on Action {
7
7
  id
8
8
  altId
9
9
  actionCategory {
@@ -3,7 +3,7 @@ module Ecoportal
3
3
  class GraphQL
4
4
  class Fragment
5
5
  fragment :ActionCategory, <<~GRAPHQL
6
- fragment on Category {
6
+ fragment ActionCategory on Category {
7
7
  id
8
8
  name
9
9
  value
@@ -3,7 +3,7 @@ module Ecoportal
3
3
  class GraphQL
4
4
  class Fragment
5
5
  fragment :ContractorEntity, <<~GRAPHQL
6
- fragment on ContractorEntity {
6
+ fragment ContractorEntity on ContractorEntity {
7
7
  id
8
8
  externalId
9
9
  name
@@ -0,0 +1,38 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ # `RegisterPresetView#fieldConfigurations` returns a FieldConfigurationUnion.
6
+ # Selections can't be made directly on a union (GraphQL error: "Selections can't
7
+ # be made directly on unions"); the common fields live on FieldConfigurationInterface,
8
+ # which every union member implements, so they're pulled via an inline fragment on
9
+ # the interface rather than repeated per concrete type. Verified against the real
10
+ # frontend fragment (RegisterDataGrid/api/fieldConfigurationFragments/
11
+ # fieldConfigurationFields.graphql) — kept to the interface surface + the same three
12
+ # concrete-type extras it selects; other concrete types fall back to interface-only
13
+ # fields (matches the frontend, which doesn't cover every member either).
14
+ fragment :FieldConfiguration, <<~GRAPHQL
15
+ fragment FieldConfiguration on FieldConfigurationUnion {
16
+ __typename
17
+ ... on FieldConfigurationInterface {
18
+ id
19
+ key
20
+ name
21
+ dataFieldLabel
22
+ weight
23
+ }
24
+ ... on DateFieldConfiguration {
25
+ showTime
26
+ }
27
+ ... on DisplayLocationsFieldConfiguration {
28
+ mode
29
+ }
30
+ ... on PageNameFieldConfiguration {
31
+ displayUid
32
+ }
33
+ }
34
+ GRAPHQL
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ # Fields for a Force object, including all bindings needed for scripting.
6
+ #
7
+ # `Force.bindings` is `[BindingInterface]` (verified in the backend:
8
+ # `app/graphql/types/force_type.rb` + `types/forces/binding_interface.rb`), so its common
9
+ # fields are selected directly on the interface — no per-member inline fragments needed.
10
+ #
11
+ # ★ The interface exposes ONLY `name` and `referenceId` (+ `reference` per concrete type):
12
+ # there is NO `id` on a binding. The previous selection asked for `id` inside
13
+ # `... on DataFieldBinding` / `... on SectionBinding`, which makes the whole query invalid.
14
+ # Read/write asymmetry to be aware of: `WorkflowEditBindingInput` / `removeBinding` DO
15
+ # require a binding `id`, so `Force::Binding#id` (and `BindingCollection#delete!`) has no
16
+ # readable source for it — tracked as a shape-asymmetry finding, not fixable client-side.
17
+ fragment :ForceFields, <<~GRAPHQL
18
+ fragment ForceFields on Force {
19
+ id
20
+ name
21
+ script
22
+ customScript
23
+ globalBindingIds
24
+ bindings {
25
+ __typename
26
+ name
27
+ referenceId
28
+ }
29
+ }
30
+ GRAPHQL
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,53 +1,53 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- class Fragment
5
- fragment :LocationDraft, <<~GRAPHQL
6
- fragment on Draft {
7
- id
8
- name
9
- notes
10
- committed
11
- createdAt
12
- ok
13
- conflictingIds
14
- results {
15
- ok
16
- command {
17
- id
18
- state
19
- __typename
20
- ... on LocationInsertCommand {
21
- nodeId name parentId insertBefore classificationIds
22
- }
23
- ... on LocationUpdateCommand {
24
- nodeId newId
25
- newName: name
26
- newClassificationIds: classificationIds
27
- }
28
- ... on LocationArchiveCommand { nodeId }
29
- ... on LocationUnarchiveCommand { nodeId }
30
- ... on LocationMoveCommand { nodeId parentId insertBefore }
31
- ... on LocationReorderCommand { parentId orderedIds }
32
- }
33
- error {
34
- message
35
- conflictingIds
36
- validationErrors {
37
- property
38
- error
39
- message
40
- }
41
- }
42
- }
43
- commands {
44
- id
45
- state
46
- __typename
47
- }
48
- }
49
- GRAPHQL
50
- end
51
- end
52
- end
53
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ fragment :LocationDraft, <<~GRAPHQL
6
+ fragment LocationDraft on Draft {
7
+ id
8
+ name
9
+ notes
10
+ committed
11
+ createdAt
12
+ ok
13
+ conflictingIds
14
+ results {
15
+ ok
16
+ command {
17
+ id
18
+ state
19
+ __typename
20
+ ... on LocationInsertCommand {
21
+ nodeId name parentId insertBefore classificationIds
22
+ }
23
+ ... on LocationUpdateCommand {
24
+ nodeId newId
25
+ newName: name
26
+ newClassificationIds: classificationIds
27
+ }
28
+ ... on LocationArchiveCommand { nodeId }
29
+ ... on LocationUnarchiveCommand { nodeId }
30
+ ... on LocationMoveCommand { nodeId parentId insertBefore }
31
+ ... on LocationReorderCommand { parentId orderedIds }
32
+ }
33
+ error {
34
+ message
35
+ conflictingIds
36
+ validationErrors {
37
+ property
38
+ error
39
+ message
40
+ }
41
+ }
42
+ }
43
+ commands {
44
+ id
45
+ state
46
+ __typename
47
+ }
48
+ }
49
+ GRAPHQL
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,26 +1,26 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- class Fragment
5
- fragment :LocationNode, <<~GRAPHQL
6
- fragment on LocationNodeInterface {
7
- id
8
- name
9
- weight
10
- archived
11
- archivedToken
12
- parent {
13
- id
14
- name
15
- }
16
- classifications {
17
- active
18
- id
19
- name
20
- }
21
- }
22
- GRAPHQL
23
- end
24
- end
25
- end
26
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ fragment :LocationNode, <<~GRAPHQL
6
+ fragment LocationNode on LocationNodeInterface {
7
+ id
8
+ name
9
+ weight
10
+ archived
11
+ archivedToken
12
+ parent {
13
+ id
14
+ name
15
+ }
16
+ classifications {
17
+ active
18
+ id
19
+ name
20
+ }
21
+ }
22
+ GRAPHQL
23
+ end
24
+ end
25
+ end
26
+ end
@@ -3,7 +3,7 @@ module Ecoportal
3
3
  class GraphQL
4
4
  class Fragment
5
5
  fragment :LocationsError, <<~GRAPHQL
6
- fragment on LocationsError {
6
+ fragment LocationsError on LocationsError {
7
7
  message
8
8
  conflictingIds
9
9
  validationErrors {
@@ -0,0 +1,85 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ # Shared fields for both BasicPage and PhasedPage (spread on BasePageInterface).
6
+ # Always include __typename so PageUnion can dispatch to the right concrete class.
7
+ fragment :PageFields, <<~GRAPHQL
8
+ fragment PageFields on BasePageInterface {
9
+ __typename
10
+ id
11
+ name
12
+ uid
13
+ icon
14
+ patchVer
15
+ state
16
+ archived
17
+ archivedAt { dateTime }
18
+ draft
19
+ externalId
20
+ timeZone
21
+ otherTags
22
+ taskPriority
23
+ sourceTemplateId
24
+ createdAt { dateTime }
25
+ updatedAt { dateTime }
26
+ creatorName
27
+ locations {
28
+ ...LocationNode
29
+ }
30
+ workflow {
31
+ autoPageCreationEnabled
32
+ fields { key name type total missing }
33
+ }
34
+ }
35
+ GRAPHQL
36
+
37
+ # BasicPage-only fields — spread alongside PageFields for basic pages.
38
+ # BasicPage has sections directly (PhasedPage sections live under stages).
39
+ fragment :BasicPageFields, <<~GRAPHQL
40
+ fragment BasicPageFields on BasicPage {
41
+ sections {
42
+ __typename
43
+ ... on ContentSection {
44
+ id
45
+ heading
46
+ }
47
+ ... on SplitSection {
48
+ id
49
+ heading
50
+ }
51
+ }
52
+ }
53
+ GRAPHQL
54
+
55
+ # PhasedPage-only fields — spread alongside PageFields for phased pages.
56
+ # Provides lightweight stage index, current stage, and active stages.
57
+ # For full stage content (sections, data fields), use CommonPageUnion.
58
+ fragment :PhasedPageFields, <<~GRAPHQL
59
+ fragment PhasedPageFields on PhasedPage {
60
+ stagesIndex {
61
+ id
62
+ name
63
+ ordering
64
+ state
65
+ started
66
+ hasCompleteTask
67
+ hasReviewTask
68
+ }
69
+ currentStage {
70
+ id
71
+ name
72
+ ordering
73
+ state
74
+ }
75
+ activeStages {
76
+ id
77
+ name
78
+ ordering
79
+ }
80
+ }
81
+ GRAPHQL
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,39 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ # Fields of a page TASK (`TaskInterface`: CompletePage / InComment / ReviewPage).
6
+ #
7
+ # The review-task mutations (`approve/reject/restart/undoReviewPageTask`) return
8
+ # `item: TaskInterface` — NOT a page. They used to select `item { ...PageFields }`,
9
+ # which is invalid GraphQL ("Fragment PageFields on BasePageInterface can't be spread
10
+ # inside TaskInterface") and made every one of those mutations fail. The page the
11
+ # caller was after is reachable through `subject` (a `PageUnion`), so it is spread
12
+ # there — where `PageFields` is legal.
13
+ #
14
+ # Verified against the live schema (2026-07-30): TaskInterface exposes complete,
15
+ # completedAt, completedBy, completedByUser, createdAt, due, escalated, escalatedAt,
16
+ # escalationTimes, escalationsDetails, fromPublicTemplate, id, nextEscalationTime,
17
+ # overdue, relativeStatus, scheduledCallbacks, stageId, subject, taskNotes, users.
18
+ fragment :PageTaskFields, <<~GRAPHQL
19
+ fragment PageTaskFields on TaskInterface {
20
+ __typename
21
+ id
22
+ stageId
23
+ complete
24
+ overdue
25
+ escalated
26
+ relativeStatus
27
+ taskNotes
28
+ createdAt { dateTime }
29
+ completedAt { dateTime }
30
+ due { dateTime }
31
+ subject {
32
+ ...PageFields
33
+ }
34
+ }
35
+ GRAPHQL
36
+ end
37
+ end
38
+ end
39
+ end