ecoportal-api-graphql 1.3.5 → 1.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.ai-assistance/bridge/CLAUDE.md +338 -0
- data/.ai-assistance/bridge/archive/.gitkeep +0 -0
- data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.inbox.md +29 -0
- data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.outbox.md +18 -0
- data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.inbox.md +42 -0
- data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.outbox.md +115 -0
- data/.ai-assistance/bridge/context/gemini-review-prompt.txt +48 -0
- data/.ai-assistance/bridge/context/gemini-review-response.md +104 -0
- data/.ai-assistance/bridge/context/project.md +42 -0
- data/.ai-assistance/bridge/inbox/.gitkeep +0 -0
- data/.ai-assistance/bridge/outbox/.gitkeep +0 -0
- data/.ai-assistance/bridge/outbox/request-for-standards-discovery.md +48 -0
- data/.ai-assistance/bridge/queue/.gitkeep +1 -0
- data/.ai-assistance/capabilities/CLAUDE.md +27 -0
- data/.ai-assistance/capabilities/assumptions-log.md +80 -0
- data/.ai-assistance/capabilities/code.md +47 -0
- data/.ai-assistance/capabilities/connectors.md +37 -0
- data/.ai-assistance/capabilities/cowork.md +55 -0
- data/.ai-assistance/code/OVERVIEW.md +155 -0
- data/.ai-assistance/code/data_fields.md +242 -0
- data/.ai-assistance/code/dependencies.md +151 -0
- data/.ai-assistance/code/diff_as_input.md +234 -0
- data/.ai-assistance/code/diff_service_deep_dive.md +192 -0
- data/.ai-assistance/code/ecoPortal_architecture/00_overview_and_index.md +55 -0
- data/.ai-assistance/code/ecoPortal_architecture/01_terminology_dictionary.md +181 -0
- data/.ai-assistance/code/ecoPortal_architecture/02_data_model.md +192 -0
- data/.ai-assistance/code/ecoPortal_architecture/03_api_layers.md +147 -0
- data/.ai-assistance/code/ecoPortal_architecture/04_graphql_queries_mutations.md +277 -0
- data/.ai-assistance/code/ecoPortal_architecture/05_page_workflows.md +200 -0
- data/.ai-assistance/code/ecoPortal_architecture/06_search_and_filters.md +228 -0
- data/.ai-assistance/code/ecoPortal_architecture/07_data_fields.md +197 -0
- data/.ai-assistance/code/ecoPortal_architecture/08_stages_sections.md +243 -0
- data/.ai-assistance/code/ecoPortal_architecture/09_people_contractors_locations.md +196 -0
- data/.ai-assistance/code/ecoPortal_architecture/10_forces_workflow_builder.md +132 -0
- data/.ai-assistance/code/ecoPortal_architecture/11_integration_gems.md +187 -0
- data/.ai-assistance/code/ecoPortal_architecture/12_ai_documentation_sources_gaps.md +236 -0
- data/.ai-assistance/code/ecoPortal_architecture/13_ai_infrastructure.md +183 -0
- data/.ai-assistance/code/ecoportal_schema_reference.md +240 -0
- data/.ai-assistance/code/graphql_domain_knowledge.md +230 -0
- data/.ai-assistance/code/refactoring/datafield-readwrite-shape-asymmetry.md +71 -0
- data/.ai-assistance/code/refactoring/opportunities.md +251 -0
- data/.ai-assistance/code/schema_analysis.md +321 -0
- data/.ai-assistance/code/search_filters.md +868 -0
- data/.ai-assistance/code/spec_coverage.md +73 -0
- data/.ai-assistance/code/workflow-command-guide.md +438 -0
- data/.ai-assistance/code/workflow-space.md +353 -0
- data/.ai-assistance/conventions/CLAUDE.md +30 -0
- data/.ai-assistance/conventions/code-working-tree-protocol.md +199 -0
- data/.ai-assistance/conventions/gitignore-rules.md +42 -0
- data/.ai-assistance/conventions/permission-guidance.md +120 -0
- data/.ai-assistance/integrations/README.md +70 -0
- data/.ai-assistance/integrations/gitkraken-mcp.md +107 -0
- data/.ai-assistance/integrations/gitlab-mcp.md +123 -0
- data/.ai-assistance/integrations/local-git.md +60 -0
- data/.ai-assistance/local_paths.example.md +17 -0
- data/.ai-assistance/projects/TODO.md +97 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/DECISIONS.md +168 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/INTENT.md +60 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/TODO.md +267 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/UPSTREAM.md +53 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/csv-template-pipeline-design.md +102 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/cutover-usecase-gap-audit.md +139 -0
- data/.ai-assistance/projects/dynamic-model-generation/INTENT.md +93 -0
- data/.ai-assistance/projects/eco-helpers-compat/INTENT.md +244 -0
- data/.ai-assistance/projects/eco-helpers-compat/MIGRATION_GUIDE.md +266 -0
- data/.ai-assistance/projects/eco-helpers-compat/TODO.md +86 -0
- data/.ai-assistance/projects/ecoportal-api-v2-doublemodel-review/INTENT.md +101 -0
- data/.ai-assistance/projects/graphql-agent/GAP_ANALYSIS.md +177 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/DECISIONS.md +161 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/INTENT.md +125 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/RISKS.md +126 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/TODO.md +256 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-06-30-cutover-workflow-deep-review.md +122 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-07-01-forces-via-workflow-commands-miss-rca.md +148 -0
- data/.ai-assistance/projects/page-model/DECISIONS.md +245 -0
- data/.ai-assistance/projects/page-model/TODO.md +190 -0
- data/.ai-assistance/projects/search-filter-builder/INTENT.md +107 -0
- data/.ai-assistance/projects/search-filter-builder/TODO.md +131 -0
- data/.ai-assistance/projects/template-maintenance/DESIGN.md +134 -0
- data/.ai-assistance/projects/workflow-space/TODO.md +213 -0
- data/.ai-assistance/reinstall-claude-desktop-windows.md +136 -0
- data/.ai-assistance/scripts/CLAUDE.md +150 -0
- data/.ai-assistance/scripts/bridge-init.sh +86 -0
- data/.ai-assistance/scripts/bridge-status.sh +44 -0
- data/.ai-assistance/scripts/capabilities-check.ts +104 -0
- data/.ai-assistance/scripts/check-outbox.sh +43 -0
- data/.ai-assistance/scripts/dep_graph.rb +91 -0
- data/.ai-assistance/scripts/lock-acquire.sh +103 -0
- data/.ai-assistance/scripts/lock-multi.sh +124 -0
- data/.ai-assistance/scripts/lock-queue.sh +94 -0
- data/.ai-assistance/scripts/setup-mcps.test.ts +188 -0
- data/.ai-assistance/scripts/setup-mcps.ts +234 -0
- data/.ai-assistance/scripts/task-complete.ts +74 -0
- data/.ai-assistance/scripts/task-create.ts +75 -0
- data/.ai-assistance/scripts/task-read.ts +125 -0
- data/.ai-assistance/scripts/token-logger.js +220 -0
- data/.ai-assistance/scripts/token-report.ts +158 -0
- data/.ai-assistance/scripts/token-session-start.js +66 -0
- data/.ai-assistance/skills/ai-instructions/SKILL.md +48 -0
- data/.ai-assistance/skills/code-specs/SKILL.md +69 -0
- data/.ai-assistance/skills/corporate-policies/SKILL.md +201 -0
- data/.ai-assistance/skills/dep-graph/SKILL.md +139 -0
- data/.ai-assistance/skills/ep-ai-manager/SKILL.md +417 -0
- data/.ai-assistance/skills/gemini-assist/SKILL.md +63 -0
- data/.ai-assistance/skills/gemini-assist/gemini-mcp-server.js +205 -0
- data/.ai-assistance/skills/gemini-assist/gemini_ask.py +1 -0
- data/.ai-assistance/skills/gemini-assist/gemini_ask.rb +240 -0
- data/.ai-assistance/skills/gemini-assist/prompts/cycle_end_review.txt +25 -0
- data/.ai-assistance/skills/graphql-schema-analysis/SKILL.md +261 -0
- data/.ai-assistance/skills/project-cycle/SKILL.md +177 -0
- data/.ai-assistance/skills/refactor/SKILL.md +62 -0
- data/.ai-assistance/skills/rubocop/SKILL.md +93 -0
- data/.ai-assistance/skills/ruby-scripting/SKILL.md +215 -0
- data/.ai-assistance/skills/spec-generation/SKILL.md +72 -0
- data/.ai-assistance/standards-version.json +21 -0
- data/.ai-assistance/token-budget.json +32 -0
- data/.ai-assistance/version.json +39 -0
- data/.claude/settings.json +146 -0
- data/.env.example +18 -0
- data/.gitattributes +15 -0
- data/.gitignore +13 -0
- data/.rubocop.yml +121 -97
- data/CHANGELOG.md +673 -477
- data/CLAUDE.md +232 -0
- data/Gemfile +30 -6
- data/Rakefile +90 -38
- data/docs/worklog.md +574 -0
- data/ecoportal-api-graphql.gemspec +40 -40
- data/lib/ecoportal/api/common/graphql/CLAUDE.md +36 -0
- data/lib/ecoportal/api/common/graphql/client.rb +1 -1
- data/lib/ecoportal/api/common/graphql/http_client.rb +35 -3
- data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +28 -0
- data/lib/ecoportal/api/common/graphql/model/as_input.rb +8 -5
- data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +3 -1
- data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +31 -23
- data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +54 -1
- data/lib/ecoportal/api/graphql/CLAUDE.md +37 -0
- data/lib/ecoportal/api/graphql/base/CLAUDE.md +50 -0
- data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -0
- data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -0
- data/lib/ecoportal/api/graphql/base/force/binding.rb +19 -0
- data/lib/ecoportal/api/graphql/base/force/binding_collection.rb +62 -0
- data/lib/ecoportal/api/graphql/base/force/collection.rb +47 -0
- data/lib/ecoportal/api/graphql/base/force.rb +65 -0
- data/lib/ecoportal/api/graphql/base/kickstand/job.rb +17 -0
- data/lib/ecoportal/api/graphql/base/kickstand/workflow.rb +18 -0
- data/lib/ecoportal/api/graphql/base/kickstand.rb +13 -0
- data/lib/ecoportal/api/graphql/base/page/basic.rb +38 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +112 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +54 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/gauge.rb +19 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/number.rb +20 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +35 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/select.rb +41 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -0
- data/lib/ecoportal/api/graphql/base/page/data_field.rb +137 -12
- data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +68 -14
- data/lib/ecoportal/api/graphql/base/page/phased.rb +1 -0
- data/lib/ecoportal/api/graphql/base/page/section.rb +36 -0
- data/lib/ecoportal/api/graphql/base/page/section_collection.rb +79 -0
- data/lib/ecoportal/api/graphql/base/page.rb +2 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/action_type_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/callback_type.rb +28 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_change.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_change_message.rb +15 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_es_change.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_interface.rb +36 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/email_config.rb +18 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/escalation_level.rb +19 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/in_system_config.rb +16 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/mailbox_field_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operations/create_page.rb +21 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/people_field_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/register_field.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/task_config_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/time_delay_config.rb +16 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/trigger_interface.rb +26 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/triggers/conditional_logic.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/user_selection.rb +16 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -0
- data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -0
- data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -0
- data/lib/ecoportal/api/graphql/base/register.rb +18 -0
- data/lib/ecoportal/api/graphql/base.rb +11 -0
- data/lib/ecoportal/api/graphql/builder/CLAUDE.md +65 -0
- data/lib/ecoportal/api/graphql/builder/kickstand.rb +73 -0
- data/lib/ecoportal/api/graphql/builder/page.rb +210 -41
- data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -0
- data/lib/ecoportal/api/graphql/builder/register.rb +27 -19
- data/lib/ecoportal/api/graphql/builder/template.rb +80 -0
- data/lib/ecoportal/api/graphql/builder.rb +2 -0
- data/lib/ecoportal/api/graphql/compat/filter_translator.rb +107 -0
- data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -0
- data/lib/ecoportal/api/graphql/compat/pages.rb +212 -0
- data/lib/ecoportal/api/graphql/compat/registers.rb +84 -0
- data/lib/ecoportal/api/graphql/compat/response.rb +35 -0
- data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -0
- data/lib/ecoportal/api/graphql/compat/stage_collection.rb +70 -0
- data/lib/ecoportal/api/graphql/compat/stage_view.rb +76 -0
- data/lib/ecoportal/api/graphql/compat.rb +17 -0
- data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -0
- data/lib/ecoportal/api/graphql/concerns/deprecation.rb +20 -0
- data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +21 -28
- data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -0
- data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -0
- data/lib/ecoportal/api/graphql/concerns.rb +4 -0
- data/lib/ecoportal/api/graphql/connection/page.rb +11 -0
- data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +13 -0
- data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -0
- data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -0
- data/lib/ecoportal/api/graphql/connection.rb +4 -0
- data/lib/ecoportal/api/graphql/file_upload/client.rb +181 -0
- data/lib/ecoportal/api/graphql/file_upload.rb +10 -0
- data/lib/ecoportal/api/graphql/fragment/action.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/action_category.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/force.rb +30 -0
- data/lib/ecoportal/api/graphql/fragment/location_draft.rb +2 -2
- data/lib/ecoportal/api/graphql/fragment/location_node.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/locations_error.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/page.rb +85 -0
- data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +395 -0
- data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -0
- data/lib/ecoportal/api/graphql/fragment/pages_workflow.rb +172 -0
- data/lib/ecoportal/api/graphql/fragment/pagination.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment.rb +37 -27
- data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +25 -0
- data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -0
- data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -0
- data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -0
- data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/review_task.rb +14 -0
- data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -0
- data/lib/ecoportal/api/graphql/input/page/update.rb +140 -0
- data/lib/ecoportal/api/graphql/input/page.rb +26 -0
- data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -0
- data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -0
- data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -0
- data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -0
- data/lib/ecoportal/api/graphql/input/register/create.rb +18 -0
- data/lib/ecoportal/api/graphql/input/register/update.rb +15 -0
- data/lib/ecoportal/api/graphql/input/register.rb +13 -0
- data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -0
- data/lib/ecoportal/api/graphql/input/search_conf.rb +367 -0
- data/lib/ecoportal/api/graphql/input/variable_binding.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_gauge_field_stop.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +24 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_gauge_field_stop.rb +17 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_field_config.rb +17 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_select_field_option.rb +17 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -0
- data/lib/ecoportal/api/graphql/input.rb +8 -0
- data/lib/ecoportal/api/graphql/interface/base_page.rb +100 -58
- data/lib/ecoportal/api/graphql/interface/location_structure/nodes.rb +27 -28
- data/lib/ecoportal/api/graphql/logic/base_model.rb +2 -0
- data/lib/ecoportal/api/graphql/logic/base_query.rb +45 -2
- data/lib/ecoportal/api/graphql/logic/input.rb +15 -0
- data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -0
- data/lib/ecoportal/api/graphql/model/organization.rb +65 -55
- data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -0
- data/lib/ecoportal/api/graphql/model/page/phased.rb +82 -20
- data/lib/ecoportal/api/graphql/model/page.rb +1 -0
- data/lib/ecoportal/api/graphql/model/page_union.rb +21 -0
- data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -0
- data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -0
- data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -0
- data/lib/ecoportal/api/graphql/model/register.rb +10 -0
- data/lib/ecoportal/api/graphql/model.rb +8 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_jobs.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_workflows.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/fail_job.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/fail_workflow.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/start_job.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/start_workflow.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/stop_workflow.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand.rb +18 -0
- data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +3 -3
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +2 -2
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +2 -2
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +3 -3
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +3 -3
- data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -0
- data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +69 -0
- data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +51 -0
- data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/update_variable_bindings.rb +44 -0
- data/lib/ecoportal/api/graphql/mutation/page.rb +28 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -0
- data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/register.rb +14 -0
- data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -0
- data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -0
- data/lib/ecoportal/api/graphql/mutation/template/create.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -0
- data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/template/publish.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/template/unpublish.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/template/update.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/template.rb +18 -0
- data/lib/ecoportal/api/graphql/mutation.rb +8 -0
- data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -0
- data/lib/ecoportal/api/graphql/payload/execute_workflow_commands.rb +36 -0
- data/lib/ecoportal/api/graphql/payload/force_commands.rb +31 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +36 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +36 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/job.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/workflow.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/kickstand.rb +15 -0
- data/lib/ecoportal/api/graphql/payload/location_structure/draft/create.rb +33 -34
- data/lib/ecoportal/api/graphql/payload/ok_payload.rb +21 -0
- data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/draft.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/update_variable_bindings.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page.rb +19 -0
- data/lib/ecoportal/api/graphql/payload/preset_view.rb +11 -0
- data/lib/ecoportal/api/graphql/payload/register.rb +11 -0
- data/lib/ecoportal/api/graphql/payload/template/create.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/publish.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/unpublish.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/update.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/update_information.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template.rb +18 -0
- data/lib/ecoportal/api/graphql/payload.rb +11 -0
- data/lib/ecoportal/api/graphql/query/action.rb +1 -1
- data/lib/ecoportal/api/graphql/query/action_categories.rb +1 -1
- data/lib/ecoportal/api/graphql/query/actions.rb +2 -2
- data/lib/ecoportal/api/graphql/query/contractor_entities.rb +1 -1
- data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -0
- data/lib/ecoportal/api/graphql/query/location_structure/draft.rb +2 -2
- data/lib/ecoportal/api/graphql/query/location_structure.rb +1 -1
- data/lib/ecoportal/api/graphql/query/location_structures.rb +1 -1
- data/lib/ecoportal/api/graphql/query/page.rb +45 -0
- data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -0
- data/lib/ecoportal/api/graphql/query/page_with_forces.rb +43 -0
- data/lib/ecoportal/api/graphql/query/pages.rb +59 -0
- data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +59 -0
- data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -0
- data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -0
- data/lib/ecoportal/api/graphql/query/templates.rb +53 -0
- data/lib/ecoportal/api/graphql/query.rb +11 -0
- data/lib/ecoportal/api/graphql.rb +60 -2
- data/lib/ecoportal/api/graphql_version.rb +5 -5
- data/scripts/auto-worker-scheduler.sh +386 -0
- data/tests/contractor_entity_create.rb +19 -19
- data/tests/contractor_entity_udpate.rb +20 -20
- data/tests/dump_page_model.rb +74 -0
- data/tests/loc_structure_get.rb +1 -2
- data/tests/loc_structure_update.rb +51 -51
- data/tests/loc_structures_get.rb +15 -15
- metadata +436 -5
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Compat
|
|
5
|
+
# v2-compatible pages API backed by GraphQL.
|
|
6
|
+
# Exposes the same interface as ecoportal-api-v2's pages object so that
|
|
7
|
+
# existing eco-helpers scripts work without modification.
|
|
8
|
+
#
|
|
9
|
+
# Key difference from v2:
|
|
10
|
+
# - get_new / create is a 2-step GraphQL workflow (build then create)
|
|
11
|
+
# - update requires patchVer — must always fetch the page first
|
|
12
|
+
# - search is via the GraphQL org search (register_filter + searchConf)
|
|
13
|
+
class Pages
|
|
14
|
+
def initialize(client)
|
|
15
|
+
@client = client
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Fetch a page by ID with full data — metadata, stages, sections, data fields.
|
|
19
|
+
# When stage_id is provided, wraps the result in a StageView that filters
|
|
20
|
+
# sections and components to that stage only — matching v2 per-stage behaviour.
|
|
21
|
+
def get(id, stage_id: nil)
|
|
22
|
+
page = Query::Page.new(@client).query(id: id) do
|
|
23
|
+
spread :CommonPageUnion
|
|
24
|
+
end
|
|
25
|
+
stage_id ? StageView.new(page, stage_id) : page
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Build a draft page from a template.
|
|
29
|
+
# Returns the built PageUnion with server-assigned field IDs and structure.
|
|
30
|
+
# This is step (a) of the 2-step creation sequence:
|
|
31
|
+
# (a) get_new → inspect/modify field values → (b) create
|
|
32
|
+
def get_new(template_id)
|
|
33
|
+
mutation = Mutation::Page::BuildFromTemplate.new(@client)
|
|
34
|
+
payload = mutation.query(input: { templateId: template_id, showHiddenData: true }) do
|
|
35
|
+
clientMutationId
|
|
36
|
+
errors {
|
|
37
|
+
details
|
|
38
|
+
fullMessages
|
|
39
|
+
}
|
|
40
|
+
item { spread :CommonPageUnion }
|
|
41
|
+
end
|
|
42
|
+
# Record the source template on the built draft: the read fragment does not fetch
|
|
43
|
+
# sourceTemplateId, and a built draft carries a (real) patchVer, so without this
|
|
44
|
+
# marker the dry-run can neither detect the draft nor recover its templateId — it
|
|
45
|
+
# would mis-preview a CREATE as an UPDATE. See #new_draft? / #create_body.
|
|
46
|
+
payload.item&.tap do |draft|
|
|
47
|
+
draft._compat_source_template_id = template_id if draft.respond_to?(:_compat_source_template_id=)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Create a page from a filled draft.
|
|
52
|
+
# Serialises any modified data fields from the draft into dataFields.updates.
|
|
53
|
+
# Returns a PageReference with .page_id and .active_stage_id.
|
|
54
|
+
def create(page, from: nil)
|
|
55
|
+
template_id = source_template_id(page, from)
|
|
56
|
+
field_updates = page.respond_to?(:data_fields_updates) ? page.data_fields_updates : []
|
|
57
|
+
|
|
58
|
+
# dataFields is a required (non-null) field on CreateFromTemplateInput — always
|
|
59
|
+
# send it, with an empty updates list when the draft has no field changes.
|
|
60
|
+
input = { templateId: template_id, showHiddenData: true, dataFields: { updates: field_updates } }
|
|
61
|
+
|
|
62
|
+
mutation = Mutation::Page::CreateFromTemplate.new(@client)
|
|
63
|
+
payload = mutation.query(input: input)
|
|
64
|
+
resp = Response.new(payload)
|
|
65
|
+
return PageReference.new(payload.item) if resp.success?
|
|
66
|
+
|
|
67
|
+
resp
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Update a page. Builds the mutation input from the page model diff.
|
|
71
|
+
# Returns a Compat::Response with .success? and .status.
|
|
72
|
+
# Returns nil (no-op) if there are no changes.
|
|
73
|
+
#
|
|
74
|
+
# When called with no explicit operation (the base eco-helpers update_ooze path does
|
|
75
|
+
# `pages.update(page)`), any captured submit!/sign_off! intent on the page is folded in
|
|
76
|
+
# so the SINGLE updatePage carries both the dirty fields and the submit.
|
|
77
|
+
def update(page, **kargs)
|
|
78
|
+
kargs = compat_submit_kargs(page) if kargs.empty?
|
|
79
|
+
input = Input::Page::Update.from_model(page, **kargs)
|
|
80
|
+
return nil if input.nil?
|
|
81
|
+
|
|
82
|
+
payload = Builder::Page.new(@client).update(input: input)
|
|
83
|
+
Response.new(payload)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Returns the pending changes on a page wrapped under the 'page' key.
|
|
87
|
+
# v2 equivalent: DocHelpers#get_body(doc, level: 'page') → { 'page' => {...} }.
|
|
88
|
+
# eco-helpers' OozeBaseCase reads patch_doc(ooze)['page'] (display_patch /
|
|
89
|
+
# backup_patch! / dirty?), so the body must be wrapped to match the v2 contract —
|
|
90
|
+
# otherwise ['page'] is always nil → diff never prints and "No changes to update"
|
|
91
|
+
# misfires.
|
|
92
|
+
#
|
|
93
|
+
# CRITICAL: the body is the SAME input #update/#create would send — NOT page.as_update.
|
|
94
|
+
# On a phased page, as_update only carries page-SCALAR changes; data-field edits
|
|
95
|
+
# (the bulk of what scripts do — set/select/add-reference) live in data_fields_updates
|
|
96
|
+
# and are invisible to as_update. Reading as_update here made the dry-run blind to
|
|
97
|
+
# every field change: toocs coded a Breakdown Agency reference yet the preview showed
|
|
98
|
+
# "No changes to update", while a real run (made dirty by submit!) DID patch it. Build
|
|
99
|
+
# the faithful body via the Input serialisers so the dry-run shows exactly what will be
|
|
100
|
+
# written. nil when there is genuinely nothing to send (and no submit/sign-off pending).
|
|
101
|
+
def get_body(page)
|
|
102
|
+
{ 'page' => patch_body(page) }
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Cursor-paginated iteration over pages matching searchConf.
|
|
106
|
+
# Yields full PageUnion objects (with patchVer and field IDs).
|
|
107
|
+
# Required for update workflows — register search returns PreviewPage only.
|
|
108
|
+
#
|
|
109
|
+
# Usage:
|
|
110
|
+
# api.pages.each(searchConf: SearchConf[:state].is(:active).to_h, first: 50) do |page|
|
|
111
|
+
# # page is a Model::Page::Basic or Model::Page::Phased
|
|
112
|
+
# end
|
|
113
|
+
def each(search_conf: {}, first: 50, &block)
|
|
114
|
+
Query::Pages.new(@client).each(searchConf: search_conf, first: first, &block)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
private
|
|
118
|
+
|
|
119
|
+
# The faithful "what will be sent" body for dry-run display / backup / dirty checks.
|
|
120
|
+
# - update path: the full UpdatePageInput (folds any captured submit!/sign_off!),
|
|
121
|
+
# which — unlike page.as_update — INCLUDES dataFields.updates (field edits).
|
|
122
|
+
# - create path: a never-saved draft has no patchVer; preview the
|
|
123
|
+
# CreateFromTemplateInput instead (matches #create's payload).
|
|
124
|
+
# Returns nil when there is nothing to send and no operation is pending.
|
|
125
|
+
def patch_body(page)
|
|
126
|
+
return create_body(page) if new_draft?(page)
|
|
127
|
+
|
|
128
|
+
Input::Page::Update.from_model(page, **compat_submit_kargs(page))
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Is this a never-saved CREATE draft (vs a persisted page to UPDATE)?
|
|
132
|
+
# A draft built via get_new/buildPageFromTemplate is marked with
|
|
133
|
+
# _compat_source_template_id — the authoritative signal, because such a draft DOES
|
|
134
|
+
# carry a server-assigned patchVer (so patchVer-nil alone misclassifies it as an
|
|
135
|
+
# update, the cans-upsert dry-run mislabel). patchVer-nil remains a fallback for any
|
|
136
|
+
# other unsaved model.
|
|
137
|
+
def new_draft?(page)
|
|
138
|
+
return true if page.respond_to?(:_compat_source_template_id) && page._compat_source_template_id
|
|
139
|
+
|
|
140
|
+
!page.respond_to?(:patchVer) || page.patchVer.nil?
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# CreateFromTemplateInput preview — mirrors #create's payload (templateId + the
|
|
144
|
+
# field updates serialised from the draft). Uses the SAME templateId resolution as
|
|
145
|
+
# the live #create, so the dry-run can't diverge from what gets sent.
|
|
146
|
+
def create_body(page, from: nil)
|
|
147
|
+
template_id = source_template_id(page, from)
|
|
148
|
+
updates = page.respond_to?(:data_fields_updates) ? page.data_fields_updates : []
|
|
149
|
+
return nil if updates.empty? && template_id.nil?
|
|
150
|
+
|
|
151
|
+
{ templateId: template_id, dataFields: { updates: updates } }
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# Resolve the source template id for a create, most-explicit first:
|
|
155
|
+
# 1. explicit `from:` (the caller passed it)
|
|
156
|
+
# 2. the get_new marker `_compat_source_template_id` — the read fragment does NOT
|
|
157
|
+
# fetch sourceTemplateId, and eco-helpers' Creatable passes `draft.template_id`
|
|
158
|
+
# which is nil on a GraphQL draft, so this marker is what actually carries it
|
|
159
|
+
# 3. a doc-provided `sourceTemplateId` (if the page happens to have one)
|
|
160
|
+
# Shared by the live #create AND the dry-run #create_body so they cannot diverge —
|
|
161
|
+
# they DID: the preview showed the marker's id while #create sent nil, and the server
|
|
162
|
+
# rejected `templateId: null` on a live cans-upsert create.
|
|
163
|
+
def source_template_id(page, from = nil)
|
|
164
|
+
return from if from
|
|
165
|
+
return page._compat_source_template_id if page.respond_to?(:_compat_source_template_id) && page._compat_source_template_id
|
|
166
|
+
|
|
167
|
+
page.respond_to?(:sourceTemplateId) ? page.sourceTemplateId : nil
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Translates a page's captured submit!/sign_off! intent (flags set by eco-helpers'
|
|
171
|
+
# OozeRedirect::FieldPatches) into update kwargs. Returns {} when nothing is pending.
|
|
172
|
+
# sign_off implies submit (a not-yet-submitted stage submits + approves inline);
|
|
173
|
+
# submit!(force: true) maps to forcedComplete (admin/superuser: skips required-field check).
|
|
174
|
+
def compat_submit_kargs(page)
|
|
175
|
+
if compat_flag(page, :_compat_sign_off?)
|
|
176
|
+
{ submit: true, stage_id: compat_stage_id(page, :_compat_sign_off_stage_id),
|
|
177
|
+
complete_page_task: { sign_off: true } }
|
|
178
|
+
elsif compat_flag(page, :_compat_submit?)
|
|
179
|
+
force = compat_flag(page, :_compat_submit_force?)
|
|
180
|
+
{ submit: true, stage_id: compat_stage_id(page, :_compat_submit_stage_id),
|
|
181
|
+
complete_page_task: force ? { forced_complete: true } : true }
|
|
182
|
+
else
|
|
183
|
+
{}
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def compat_flag(page, name)
|
|
188
|
+
page.respond_to?(name) && page.public_send(name)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Resolve the target stage for a submit/sign-off, most-explicit first:
|
|
192
|
+
# 1. pinned — the script passed submit!(stage_id:)/sign_off!(stage_id:)
|
|
193
|
+
# 2. active — the stage last viewed via a StageView (the stage the work was
|
|
194
|
+
# done on; set by Compat::StageView). This is the reliable source
|
|
195
|
+
# for the OozeSamples path, where the queued object is the full page.
|
|
196
|
+
# 3. current — server-state inference (state=='inprogress'/active==true). Last
|
|
197
|
+
# resort only: it guesses, and on a multi-stage page may name the
|
|
198
|
+
# WRONG stage — so the from_model guard still rejects a nil result.
|
|
199
|
+
def compat_stage_id(page, pinned_name)
|
|
200
|
+
pinned = compat_flag(page, pinned_name)
|
|
201
|
+
return pinned if pinned
|
|
202
|
+
|
|
203
|
+
active = compat_flag(page, :_compat_active_stage_id)
|
|
204
|
+
return active if active
|
|
205
|
+
|
|
206
|
+
page.respond_to?(:current_stage_id) ? page.current_stage_id : nil
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Compat
|
|
5
|
+
# v2-compatible registers API backed by GraphQL register search.
|
|
6
|
+
# Scripts call: apiv2.registers.search(register_id, options) { |result| ... }
|
|
7
|
+
#
|
|
8
|
+
# With a block: yields each PreviewPage result (cursor-paginated).
|
|
9
|
+
# Without a block (or only_first: true): returns a SearchResults object
|
|
10
|
+
# with .total and .total_before_filtering.
|
|
11
|
+
#
|
|
12
|
+
# Filter translation:
|
|
13
|
+
# v2 date_filter { lbound:, ubound: } → GraphQL date_filter { gte:, lte: }
|
|
14
|
+
# v2 tag_filter { tags:, mode: } → passed through (same ES backend)
|
|
15
|
+
# SearchConf filter objects → passed through directly
|
|
16
|
+
class Registers
|
|
17
|
+
def initialize(client)
|
|
18
|
+
@client = client
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Options:
|
|
22
|
+
# sort: 'created_at' | 'updated_at'
|
|
23
|
+
# dir: 'asc' | 'desc'
|
|
24
|
+
# query: String (full-text search)
|
|
25
|
+
# filters: Array of filter objects or v2 filter hashes
|
|
26
|
+
# batch_size: Integer (results per request, default 20)
|
|
27
|
+
# include_archived: Boolean (default false)
|
|
28
|
+
# only_first: Boolean — return after first page (no block needed)
|
|
29
|
+
def search(register_id, options = {}, &block)
|
|
30
|
+
conf = build_search_conf(options)
|
|
31
|
+
first = options.fetch(:batch_size, 20)
|
|
32
|
+
query = Query::RegisterPreviewPages.new(@client)
|
|
33
|
+
|
|
34
|
+
args = {
|
|
35
|
+
registerId: register_id,
|
|
36
|
+
searchConf: conf.to_h,
|
|
37
|
+
includeArchived: options.fetch(:include_archived, false),
|
|
38
|
+
first: first
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if block || !options[:only_first]
|
|
42
|
+
# Block mode: yield each result, stop if only_first
|
|
43
|
+
query.each(**args) do |result|
|
|
44
|
+
block&.call(result)
|
|
45
|
+
break if options[:only_first]
|
|
46
|
+
end
|
|
47
|
+
else
|
|
48
|
+
# No-block mode: return SearchResults with .total etc.
|
|
49
|
+
raw = query.query(**args)
|
|
50
|
+
SearchResults.new(raw)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def build_search_conf(options)
|
|
57
|
+
conf = Input::SearchConf.new
|
|
58
|
+
|
|
59
|
+
if (sort_key = options[:sort])
|
|
60
|
+
direction = options.fetch(:dir, 'desc').to_sym
|
|
61
|
+
conf.sort(sort_key.to_sym, direction)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
conf.query(options[:query]) if options[:query]
|
|
65
|
+
|
|
66
|
+
Array(options[:filters]).compact.each do |filter|
|
|
67
|
+
conf.filter(translate_filter(filter))
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
conf
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Translates a v2-style filter hash to a GraphQL-compatible filter hash.
|
|
74
|
+
# SearchConf filter objects (respond to to_h and are not Hash) pass through.
|
|
75
|
+
# v2 date_filter: lbound/ubound → gte/lte
|
|
76
|
+
# Other v2 types (tag_filter etc.): passed through — same ES backend.
|
|
77
|
+
def translate_filter(filter)
|
|
78
|
+
FilterTranslator.to_graphql(filter)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Compat
|
|
5
|
+
# Wraps a GraphQL mutation payload to expose the v2-compatible response interface.
|
|
6
|
+
# Scripts check .success? and .status after update/create operations.
|
|
7
|
+
class Response
|
|
8
|
+
def initialize(payload)
|
|
9
|
+
@payload = payload
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def success?
|
|
13
|
+
@payload.success?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def error?
|
|
17
|
+
@payload.error?
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def status
|
|
21
|
+
@payload.error? ? :error : :ok
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def body
|
|
25
|
+
@payload.error_doc
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def item
|
|
29
|
+
@payload.item
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Compat
|
|
5
|
+
# Wraps a GraphQL connection object to expose the v2-compatible search
|
|
6
|
+
# result interface. eco-helpers scripts access:
|
|
7
|
+
# search_results.total — filtered count
|
|
8
|
+
# search_results.total_before_filtering — pre-filter count (approximated)
|
|
9
|
+
# (also Enumerable for iteration)
|
|
10
|
+
class SearchResults
|
|
11
|
+
include Enumerable
|
|
12
|
+
|
|
13
|
+
attr_reader :total, :total_before_filtering
|
|
14
|
+
|
|
15
|
+
def initialize(connection)
|
|
16
|
+
@total = connection.totalCount
|
|
17
|
+
# GraphQL does not expose a pre-filter count — use the same value.
|
|
18
|
+
@total_before_filtering = connection.totalCount
|
|
19
|
+
@nodes = connection.nodes
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def each(&block)
|
|
23
|
+
@nodes.each(&block)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def empty?
|
|
27
|
+
@nodes.empty?
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Compat
|
|
5
|
+
# Wraps the stages array from a PhasedPage to expose the v2-compatible
|
|
6
|
+
# access patterns eco-helpers scripts rely on.
|
|
7
|
+
#
|
|
8
|
+
# Accepts either an array of Base::Page::Phased::Stage objects (the normal
|
|
9
|
+
# path via embeds_many) or raw stage hash docs (for direct construction in
|
|
10
|
+
# specs and legacy callers).
|
|
11
|
+
#
|
|
12
|
+
# v2 patterns supported:
|
|
13
|
+
# page.stages[id_or_name] — find stage by ID or name
|
|
14
|
+
# page.stages.get_by_name(name) — find stage by name
|
|
15
|
+
# page.stages.ordered — stages sorted by ordering
|
|
16
|
+
# page.stages.ordered.map(&:id) — map sorted stages to IDs
|
|
17
|
+
# page.stages.any? — whether the page has stages
|
|
18
|
+
# page.stages.each { |s| ... } — iterate stages
|
|
19
|
+
class StageCollection
|
|
20
|
+
include Enumerable
|
|
21
|
+
|
|
22
|
+
def initialize(stages_array)
|
|
23
|
+
@stages = Array(stages_array).map { |s| coerce_stage(s) }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Find a stage by ID or name (hash-style access matching v2 pattern).
|
|
27
|
+
def [](id_or_name)
|
|
28
|
+
return nil unless id_or_name
|
|
29
|
+
|
|
30
|
+
@stages.find { |s| s.id == id_or_name.to_s || s.name == id_or_name.to_s }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Find a stage by name (explicit v2 method).
|
|
34
|
+
def get_by_name(name)
|
|
35
|
+
return nil unless name
|
|
36
|
+
|
|
37
|
+
@stages.find { |s| s.name == name.to_s }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Stages sorted by ordering (ascending).
|
|
41
|
+
def ordered
|
|
42
|
+
@stages.sort_by { |s| s.ordering.to_i }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def each(&block)
|
|
46
|
+
@stages.each(&block)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def empty?
|
|
50
|
+
@stages.empty?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def length
|
|
54
|
+
@stages.length
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
alias_method :size, :length
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
# Accept Base::Page::Phased::Stage model objects (from embeds_many) directly.
|
|
62
|
+
# Wrap raw hashes in a Stage model for backwards-compatible direct construction.
|
|
63
|
+
def coerce_stage(stage)
|
|
64
|
+
stage.is_a?(Hash) ? Base::Page::Phased::Stage.new(stage) : stage
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Compat
|
|
5
|
+
# Client-side stage-specific view over a full page.
|
|
6
|
+
# Returned by Compat::Pages#get when stage_id is provided.
|
|
7
|
+
#
|
|
8
|
+
# Mimics the v2 behaviour where pages.get(id, stage_id:) returns a page
|
|
9
|
+
# object showing only the specified stage's sections and components.
|
|
10
|
+
# All other page accessors (id, name, state, patchVer, as_update, etc.)
|
|
11
|
+
# delegate to the underlying full page.
|
|
12
|
+
#
|
|
13
|
+
# This allows eco-helpers stage iteration patterns to work unchanged:
|
|
14
|
+
# stage_view = graphql.pages.get(page_id, stage_id: stg.id)
|
|
15
|
+
# stage_view.sections.doc.each { |sec_doc| ... }
|
|
16
|
+
# stage_view.components.doc.each { |comp_doc| ... }
|
|
17
|
+
class StageView
|
|
18
|
+
def initialize(page, stage_id)
|
|
19
|
+
@page = page
|
|
20
|
+
@stage_id = stage_id
|
|
21
|
+
@stage = find_stage(page, stage_id)
|
|
22
|
+
# Record the targeted stage on the underlying page. The base OozeSamples loop
|
|
23
|
+
# enqueues and updates the FULL page (first-wins by id — the StageView is never
|
|
24
|
+
# the queued object), so a later submit!/sign_off! on that page must still know
|
|
25
|
+
# which stage was viewed. Pin the RESOLVED stage id (@stage&.id) so a name-based
|
|
26
|
+
# view ('Coding') records the id the mutation needs; fall back to the raw arg.
|
|
27
|
+
return unless @page.respond_to?(:_compat_active_stage_id=)
|
|
28
|
+
@page._compat_active_stage_id = @stage&.id || stage_id
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# The stage's sections only (not the full page's).
|
|
32
|
+
def sections
|
|
33
|
+
@stage&.sections || Base::Page::SectionCollection.from_doc([])
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# All data fields across the stage's sections (not the full page's).
|
|
37
|
+
def components
|
|
38
|
+
@stage&.components || Base::Page::DataField::Collection.from_doc([])
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# The ID of this stage view's stage.
|
|
42
|
+
def current_stage_id
|
|
43
|
+
@stage&.id
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Always true — this view is stage-specific.
|
|
47
|
+
def stages?
|
|
48
|
+
true
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Delegate all other accessors to the underlying full page.
|
|
52
|
+
def method_missing(method, *args, &block)
|
|
53
|
+
return @page.send(method, *args, &block) if @page.respond_to?(method)
|
|
54
|
+
|
|
55
|
+
super
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def respond_to_missing?(method, include_private = false)
|
|
59
|
+
@page.respond_to?(method, include_private) || super
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def find_stage(page, stage_id)
|
|
65
|
+
return nil unless page.respond_to?(:stages)
|
|
66
|
+
|
|
67
|
+
stages = page.stages
|
|
68
|
+
return nil unless stages.respond_to?(:[])
|
|
69
|
+
|
|
70
|
+
stages[stage_id] || (stages.respond_to?(:get_by_name) ? stages.get_by_name(stage_id) : nil)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Compat
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
require_relative 'compat/filter_translator'
|
|
11
|
+
require_relative 'compat/stage_collection'
|
|
12
|
+
require_relative 'compat/search_results'
|
|
13
|
+
require_relative 'compat/page_reference'
|
|
14
|
+
require_relative 'compat/response'
|
|
15
|
+
require_relative 'compat/stage_view'
|
|
16
|
+
require_relative 'compat/pages'
|
|
17
|
+
require_relative 'compat/registers'
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Concerns
|
|
5
|
+
# Provides typed data field access on page models.
|
|
6
|
+
# Include in Interface::BasePage so all concrete page classes inherit it.
|
|
7
|
+
#
|
|
8
|
+
# Exposes:
|
|
9
|
+
# page.components — DataField::Collection (v2 compat alias for dataFields)
|
|
10
|
+
# page.field_collection — same, memoized
|
|
11
|
+
# page.data_fields_updates — [DataFieldInput, ...] for dirty fields
|
|
12
|
+
# page.data_fields_additions — [DataFieldInput, ...] for added fields
|
|
13
|
+
# page.data_fields_deletions — [field_id, ...] queued for deletion
|
|
14
|
+
module DataFieldAccess
|
|
15
|
+
# Returns a DataField::Collection wrapping raw dataFields from doc.
|
|
16
|
+
# Memoized — mutating a field object persists across calls.
|
|
17
|
+
def field_collection
|
|
18
|
+
@field_collection ||= Base::Page::DataField::Collection.from_doc(raw_data_fields)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# v2 compat alias — eco-helpers scripts call entry.components
|
|
22
|
+
def components
|
|
23
|
+
field_collection
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns a SectionCollection wrapping sections from doc.
|
|
27
|
+
# For BasicPage: doc['sections']. For PhasedPage: merged from stages (override in Phased).
|
|
28
|
+
def section_collection
|
|
29
|
+
@section_collection ||= Base::Page::SectionCollection.from_doc(raw_sections)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# v2 compat alias — eco-helpers scripts call entry.sections
|
|
33
|
+
def sections
|
|
34
|
+
section_collection
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Returns DataFieldInput hashes for modified existing fields (updates).
|
|
38
|
+
def data_fields_updates
|
|
39
|
+
field_collection.dirty_inputs
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Returns DataFieldInput hashes for newly added fields (via components.add).
|
|
43
|
+
def data_fields_additions
|
|
44
|
+
field_collection.dirty_additions
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Returns field IDs queued for deletion (via components.mark_for_deletion).
|
|
48
|
+
def data_fields_deletions
|
|
49
|
+
field_collection.dirty_deletions
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def data_fields_dirty?
|
|
53
|
+
field_collection.dirty?
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
# Override in subclasses if fields live elsewhere (e.g. nested in stages).
|
|
59
|
+
def raw_data_fields
|
|
60
|
+
doc['dataFields'] || []
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Override in subclasses for different section sources.
|
|
64
|
+
def raw_sections
|
|
65
|
+
doc['sections'] || []
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Concerns
|
|
5
|
+
module Deprecation
|
|
6
|
+
SCHEMA_VERSION = '20260605'.freeze
|
|
7
|
+
|
|
8
|
+
WARNED = Set.new
|
|
9
|
+
|
|
10
|
+
def self.warn_once(key, message)
|
|
11
|
+
return if WARNED.include?(key)
|
|
12
|
+
|
|
13
|
+
WARNED << key
|
|
14
|
+
warn "[ecoportal-api-graphql] DEPRECATED (#{key}): #{message}"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|