Class: Ecoportal::API::GraphQL::Base::Page::DataField

Inherits:
Logic::BaseModel show all
Defined in:
lib/ecoportal/api/graphql/base/page/data_field.rb,
lib/ecoportal/api/graphql/base/page/data_field/geo.rb,
lib/ecoportal/api/graphql/base/page/data_field/law.rb,
lib/ecoportal/api/graphql/base/page/data_field/gauge.rb,
lib/ecoportal/api/graphql/base/page/data_field/table.rb,
lib/ecoportal/api/graphql/base/page/data_field/number.rb,
lib/ecoportal/api/graphql/base/page/data_field/people.rb,
lib/ecoportal/api/graphql/base/page/data_field/select.rb,
lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb,
lib/ecoportal/api/graphql/base/page/data_field/checklist.rb,
lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb,
lib/ecoportal/api/graphql/base/page/data_field/signature.rb,
lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb,
lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb,
lib/ecoportal/api/graphql/base/page/data_field/collection.rb,
lib/ecoportal/api/graphql/base/page/data_field/date_field.rb,
lib/ecoportal/api/graphql/base/page/data_field/file_field.rb,
lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb,
lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb,
lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb,
lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb,
lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb,
lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb

Overview

Base class for all data field types. Subclasses expose typed value accessors and serialise to DataFieldInput format.

Direct Known Subclasses

Model::Page::DataField

Defined Under Namespace

Classes: ActionsList, AiSummary, Checklist, Collection, ContractorEntities, CrossReference, DateField, FileField, Gauge, Geo, ImageGallery, Law, Mailbox, Number, People, PlainText, RichText, Select, Signature, SmartFill, Table, TagField

Constant Summary collapse

DIFF_CLASS =

Diff strategy for leaf data fields.

A DataField's array attributes (options, peopleIds, contractors, pages, fileContainers, items, ...) are declared with passarray, which registers them as cascaded attributes invisible to the default DiffService (see Diffable::LeafDiffService for the full explanation). A DataField is a pure leaf model (no nested GraphQL::Model children), so it diffs flat: true — the promoted shared LeafDiffService keeps the array doc keys inline.

Ecoportal::API::Common::GraphQL::Model::Diffable::LeafDiffService
TYPE_MAP =

Map GraphQL __typename values to subclass names.

{
  'PlainText'          => 'PlainText',
  'RichText'           => 'RichText',
  'Date'               => 'DateField',
  'Number'             => 'Number',
  'Gauge'              => 'Gauge',
  'People'             => 'People',
  'Select'             => 'Select',
  'Checklist'          => 'Checklist',
  'TagField'           => 'TagField',
  'Geo'                => 'Geo',
  'Signature'          => 'Signature',
  'ContractorEntities' => 'ContractorEntities',
  'CrossReference'     => 'CrossReference',
  'ImageGallery'       => 'ImageGallery',
  'File'               => 'FileField',
  'Mailbox'            => 'Mailbox',
  'ActionsList'        => 'ActionsList',
  'Law'                => 'Law',
  'AiSummary'          => 'AiSummary',
  'Table'              => 'Table',
  'SmartFill'          => 'SmartFill'
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Concerns::SnakeCamelAccess

#method_missing, #respond_to_missing?

Methods included from Common::GraphQL::Model::AsInput

included

Methods included from Common::GraphQL::Model::Diffable

#as_update

Methods included from Common::GraphQL::ClassHelpers

included

Constructor Details

#initialize(raw_doc = {}) ⇒ DataField

Returns a new instance of DataField.



67
68
69
70
71
72
# File 'lib/ecoportal/api/graphql/base/page/data_field.rb', line 67

def initialize(raw_doc = {})
  # Normalise __typename → type for passthrough accessor
  raw_doc = raw_doc.dup if raw_doc.is_a?(Hash)
  raw_doc['type'] ||= raw_doc['__typename'] if raw_doc.is_a?(Hash)
  super
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Ecoportal::API::GraphQL::Concerns::SnakeCamelAccess

Class Method Details

.from_doc(raw_doc) ⇒ Object

Build the correct subclass from a raw field doc.



57
58
59
60
61
62
63
64
# File 'lib/ecoportal/api/graphql/base/page/data_field.rb', line 57

def from_doc(raw_doc)
  type    = raw_doc.is_a?(Hash) ? (raw_doc['__typename'] || raw_doc['type']) : nil
  subname = TYPE_MAP[type]
  klass   = subname ? const_get(subname) : self
  klass.new(raw_doc)
rescue NameError
  new(raw_doc)
end

Instance Method Details

#as_inputObject

Produces the DataFieldInput hash for this field. Returns nil if the field has not been modified. Subclasses override to produce typed payloads.



85
86
87
# File 'lib/ecoportal/api/graphql/base/page/data_field.rb', line 85

def as_input
  nil
end

#dirty?Boolean

DataField is a leaf model: it has no nested GraphQL::Model children. flat: true skips diff_reduce — required here, since diff_reduce would dig_delete! the (cascaded) array keys and never re-add them. The flat classic diff still sees those keys because LeafDiffService keeps them.

Returns:

  • (Boolean)


78
79
80
# File 'lib/ecoportal/api/graphql/base/page/data_field.rb', line 78

def dirty?
  super(flat: true)
end