Extending a flex-object blueprint to page

Hello,
I’ve been experimenting and working on the powerful flex-objects and wondering if there is (I am sure of that!) a way to extend properties from a flex-object blueprint definition to a page blueprint.
As of now I am duplicating fields with prefixes:

  • collection.* for the flex-object blueprint
  • header.* for the page blueprint

As fields are growing in number, this is becoming harder to maintain.

Flow logic whether to consider collection.* or header.* field happens in Twig of course.

Flex-Objects blueprint:

title: Photos
description: Simple Photo directory with Categories and Tags.
type: flex-objects

# Flex Configuration
config:
  # Administration Configuration
  admin:
    # Admin router (optional)
    router:
      path: '/photos'

    # Admin menu (optional)
    menu:
      list:
        route: '/photos'
        title: Photos
        icon: fa-photo
        # Authorization to collection admin
        authorize: ['admin.photos.list', 'admin.super']
        # Priority -10 .. 10 (highest goes up)
        priority: 2

    # Admin template type / folder
    template: default

    # Permissions
    permissions:
      # Primary permissions
      admin.photos:
        type: crudpl
        label: Photos

    # Preferences (defaults) - Available in Twig through 'directory.config.admin.collection.prefs' as an array.
    collection:
      prefs:
        sort_key: title
        sort_direction: ASC
        tn_size: 640
        tn_resize_method: 'resize' # [resize, cropResize, cropZoom]
        ph_lightbox: true
        ph_size: 1600
        ph_resize_method: 'cropResize' # [resize, cropResize, cropZoom]
        gallery_class: 'columns is-multiline'
        gallery_element_class: 'column is-one-quarter-desktop is-half-tablet'
        gallery_element_title_class: 'subtitle is-6 has-text-centered'
        gallery_element_caption_class: 'subtitle is-7 has-text-centered'
        gallery_element_category_class: 'tag is-primary is-light'
        gallery_element_tags_class: 'tag is-light'
    # List view
    list:
      title: title
      fields:
        published:
          field:
            type: toggle
            label: Publ
          width: 8
        title:
          link: edit
        caption:
          link: edit
        test_tags:
    # Edit View
    edit:
      title:
        template: '[{{ object.photo|first.name ?? ''<i>File Name</i>'' }}] | {{ object.title ?? ''Title'' }} | {{ object.caption ?? ''<i>no caption</i>'' }}'

    views:
      # List view
      list:
        options:
          per_page: 30    # Default number of items per page
          order:
            by: title # Default field used for ordering
            dir: asc      # Default ordering direction

    # Preview View
    preview:
      enabled: false
      route:
        #template: '/plugins/flex-objects/directory:photos'

    # Data Export
    export:
      enabled: true
      method: 'jsonSerialize'
      formatter:
        class: 'Grav\Framework\File\Formatter\YamlFormatter'
      filename: 'photos'

  # Site Configuration
  site:
    templates:
      collection:
        # Lookup for the template layout files for collections of objects
        paths:
          - 'flex/{TYPE}/collection/{LAYOUT}{EXT}'
      object:
        # Lookup for the template layout files for objects
        paths:
          - 'flex/{TYPE}/object/{LAYOUT}{EXT}'
      defaults:
        # Default template {TYPE}; overridden by filename of this blueprint if template folder exists
        type: photos
        # Default template {LAYOUT}; can be overridden in render calls (usually Twig in templates)
        layout: default

  # Data Configuration
  data:
    # Object class to be used, allowing custom methods for the object
    object: 'Grav\Common\Flex\Types\Generic\GenericObject'
    # Collection class to be used, allowing custom methods for the collections
    collection: 'Grav\Common\Flex\Types\Generic\GenericCollection'
    # Index class to be used, works as a quick database-like lookup index
    index: 'Grav\Common\Flex\Types\Generic\GenericIndex'
    storage:
      # Storage class, use single file storage (does not support images and assets)
      class: 'Grav\Framework\Flex\Storage\FolderStorage'
      options:
        formatter:
          class: 'Grav\Framework\File\Formatter\YamlFormatter'
          options:
            file_extension: '.yaml'
            inline: 5           # Save with up to 4 expanded levels
            indent: 2           # Indent with 2 spaces
            native: true        # Use native YAML decoder if available
            compat: true        # If YAML cannot be decoded, use compatibility mode (SLOW)
        folder: user-data://flex-photos
    search:
      # Search options
      options:
        contains: 1
      # Fields to be searched
      fields:
        - title
        - caption
        - test_tags

form:
  validation: loose

  fields:
    published:
      type: toggle
      label: Published
      highlight: 1
      default: 1
      options:
        1: PLUGIN_ADMIN.YES
        0: PLUGIN_ADMIN.NO
      validate:
        type: bool
        required: true

    photo:
      type: file
      multiple: false
      accept:
        - image/*
      label: Photo
      destination: self@

    catalog_id:
      type: text
      label: Catalog ID
      validate:
        required: false

    title:
      type: text
      label: Title
      validate:
        required: true

    caption:
      type: text
      label: Caption
      validate:
        required: false

    author:
      type: text
      label: Author

    test_tags:
      type: selectize
      size: large
      label: Test Tags
      classes: fancy
      validate:
        type: commalist

    categories_and_tags:
      type: taxonomy
      label: Category and Tag
      multiple: true
      validate:
        type: array

blueprints:
  # Blueprint for configure view.
  configure:
    # We are inside TABS field.
    fields:
      # Add our own tab
      preferences:
        type: tab
        title: Preferences
        fields:
          # Fields should be prefixed with object, collection etc..
          # Available in Twig through 'directory.config.collection.prefs' as an array.
          spacer.sorting:
            type: spacer
            title: Sorting
          collection.prefs.sort_key:
            type: select
            size: small
            label: Sorting field
            classes: fancy
            default: 'title'
            options:
              'title': 'Title'
              'caption': 'Caption'
              'catalog_id': 'Catalog ID'
          collection.prefs.sort_direction:
            type: select
            size: small
            label: Sorting direction
            classes: fancy
            default: 'ASC'
            options:
              'ASC': 'Ascending (A-Z)'
              'DESC': 'Descending (Z-A)'
          spacer.thumbnails:
            type: spacer
            title: Thumbnails
          collection.prefs.tn_size:
            type: range
            label: Thumbnail Size in px
            help: Size step is 32 px
            id: tn_size
            default: 640
            validate:
              min: 32
              max: 3072
              step: 32
          collection.prefs.tn_resize_method:
            type: select
            size: medium
            label: Resize method
            classes: fancy
            default: 'resize'
            options:
              'resize': 'resize'
              'cropResize': 'cropResize'
              'cropZoom': 'cropZoom'
          spacer.fullsize:
            type: spacer
            title: Full size images
          collection.prefs.ph_lightbox:
              type: toggle
              label: Enable Lightbox
              highlight: 1
              help: Enables or disables Lightbox functionality.
              options:
                  1: PLUGIN_ADMIN.YES
                  0: PLUGIN_ADMIN.NO
              validate:
                  type: bool
          collection.prefs.ph_size:
            type: range
            label: Photo Size in px
            help: Size step is 64 px
            id: ph_size
            default: 1600
            validate:
              min: 0
              max: 3072
              step: 64
          collection.prefs.ph_resize_method:
            type: select
            size: medium
            label: Resize method
            classes: fancy
            default: 'cropResize'
            options:
              'resize': 'resize'
              'cropResize': 'cropResize'
              'cropZoom': 'cropZoom'
          spacer.element:
            type: spacer
            title: Element
          collection.prefs.gallery_class:
            type: text
            size: medium
            label: Gallery container class(es)
            default: 'columns is-multiline'
          collection.prefs.gallery_element_class:
            type: text
            size: medium
            label: Gallery element class(es)
            default: 'column is-one-quarter-desktop is-half-tablet'
          collection.prefs.gallery_element_title:
              type: toggle
              label: Show Photo Title
              highlight: 1
              help: Show/hide Photo Title.
              options:
                  1: PLUGIN_ADMIN.YES
                  0: PLUGIN_ADMIN.NO
              validate:
                  type: bool
          collection.prefs.gallery_element_title_class:
            type: text
            size: medium
            label: Element Title class(es)
            default: 'subtitle is-6 has-text-centered'
          collection.prefs.gallery_element_caption:
              type: toggle
              label: Show Photo Caption
              highlight: 1
              help: Show/hide Photo Caption (if present).
              options:
                  1: PLUGIN_ADMIN.YES
                  0: PLUGIN_ADMIN.NO
              validate:
                  type: bool
          collection.prefs.gallery_element_caption_class:
            type: text
            size: medium
            label: Element Caption class(es)
            default: 'subtitle is-7 has-text-centered'
          collection.prefs.gallery_element_category:
              type: toggle
              label: Show Photo Category
              highlight: 1
              help: Show/hide Photo Category (if present).
              options:
                  1: PLUGIN_ADMIN.YES
                  0: PLUGIN_ADMIN.NO
              validate:
                  type: bool
          collection.prefs.gallery_element_category_class:
            type: text
            size: medium
            label: Element Category class(es)
            default: 'tag is-primary is-light'
          collection.prefs.gallery_element_tags:
              type: toggle
              label: Show Photo Tags
              highlight: 1
              help: Show/hide Photo Tags (if present).
              options:
                  1: PLUGIN_ADMIN.YES
                  0: PLUGIN_ADMIN.NO
              validate:
                  type: bool
          collection.prefs.gallery_element_tags_class:
            type: text
            size: medium
            label: Element Tags class(es)
            default: 'tag is-light'

Page blueprint:

'@extends':
    type: default
    context: blueprints://pages
form:
  fields:
    tabs:
      type: tabs
      active: 1

      fields:
        preferences:
          type: tab
          title: Photos
          fields:
            # Fields should be prefixed with object, collection etc..
            # Available in Twig through 'header.prefs' as an array.
            spacer.sorting:
              type: spacer
              title: Sorting
            header.prefs.sort_key:
              type: select
              size: small
              label: Sorting field
              classes: fancy
              default: 'title'
              options:
                'title': 'Title'
                'caption': 'Caption'
                'catalog_id': 'Catalog ID'
            header.prefs.sort_direction:
              type: select
              size: small
              label: Sorting direction
              classes: fancy
              default: 'ASC'
              options:
                'ASC': 'Ascending (A-Z)'
                'DESC': 'Descending (Z-A)'
            spacer.thumbnails:
              type: spacer
              title: Thumbnails
            header.prefs.tn_size:
              type: range
              label: Thumbnail Size in px
              help: Size step is 32 px
              id: tn_size
              default: 640
              validate:
                min: 32
                max: 3072
                step: 32
            header.prefs.tn_resize_method:
              type: select
              size: medium
              label: Resize method
              classes: fancy
              default: 'resize'
              options:
                'resize': 'resize'
                'cropResize': 'cropResize'
                'cropZoom': 'cropZoom'
            spacer.fullsize:
              type: spacer
              title: Full size images
            header.prefs.ph_lightbox:
              type: toggle
              label: Enable Lightbox
              highlight: 1
              help: Enables or disables Lightbox functionality.
              options:
                1: PLUGIN_ADMIN.YES
                0: PLUGIN_ADMIN.NO
              validate:
                type: bool
            header.prefs.ph_size:
              type: range
              label: Photo Size in px
              help: Size step is 64 px
              id: ph_size
              default: 1600
              validate:
                min: 0
                max: 3072
                step: 64
            header.prefs.ph_resize_method:
              type: select
              size: medium
              label: Resize method
              classes: fancy
              default: 'cropResize'
              options:
                'resize': 'resize'
                'cropResize': 'cropResize'
                'cropZoom': 'cropZoom'
            spacer.element:
              type: spacer
              title: Element
            header.prefs.gallery_class:
              type: text
              size: medium
              label: Gallery container class(es)
              default: 'columns is-multiline'
            header.prefs.gallery_element_class:
              type: text
              size: medium
              label: Gallery element class(es)
              default: 'column is-one-quarter-desktop is-half-tablet'
            header.prefs.gallery_element_title:
              type: toggle
              label: Show Photo Title
              highlight: 1
              help: Show/hide Photo Title.
              options:
                1: PLUGIN_ADMIN.YES
                0: PLUGIN_ADMIN.NO
              validate:
                type: bool
            header.prefs.gallery_element_title_class:
              type: text
              size: medium
              label: Element Title class(es)
              default: 'subtitle is-6 has-text-centered'
            header.prefs.gallery_element_caption:
              type: toggle
              label: Show Photo Caption
              highlight: 1
              help: Show/hide Photo Caption (if present).
              options:
                1: PLUGIN_ADMIN.YES
                0: PLUGIN_ADMIN.NO
              validate:
                type: bool
            header.prefs.gallery_element_caption_class:
              type: text
              size: medium
              label: Element Caption class(es)
              default: 'subtitle is-7 has-text-centered'
            header.prefs.gallery_element_category:
              type: toggle
              label: Show Photo Category
              highlight: 1
              help: Show/hide Photo Category (if present).
              options:
                1: PLUGIN_ADMIN.YES
                0: PLUGIN_ADMIN.NO
              validate:
                type: bool
            header.prefs.gallery_element_category_class:
              type: text
              size: medium
              label: Element Category class(es)
              default: 'tag is-primary is-light'
            header.prefs.gallery_element_tags:
              type: toggle
              label: Show Photo Tags
              highlight: 1
              help: Show/hide Photo Tags (if present).
              options:
                1: PLUGIN_ADMIN.YES
                0: PLUGIN_ADMIN.NO
              validate:
                type: bool
            header.prefs.gallery_element_tags_class:
              type: text
              size: medium
              label: Element Tags class(es)
              default: 'tag is-light'

Thank you!

Any clues? Maybe I just got the syntax wrong :confused:
Thanks!