Skip to content

Conversation

@Baspa
Copy link
Contributor

@Baspa Baspa commented Dec 12, 2025

Remaining tasks

  • Check composer.json files
  • Fix tests (workflows)
  • Add tests
  • Try to upgrade existing website from 0.x or 1.x to 2.x.
  • @Baspa: clear up redundant code
  • @Baspa: improve code quality in changed files (Uploadcare.php, ContentFieldValueObserver, etc.)
  • @Baspa: write automated tests as described in Productive
  • @Baspa: check for code that's purely for Uploadcare. This code should not be present in "core" and other packages.
  • Check for todo's in code.

Release notes

What's changed

  • Fields package now provides the hydrate method to allow you to transform raw values stores in the database into a runtime representation. Useful when you want to convert stored IDs into models, format dates or process JSON data into specific objects.
  • Media package now provides an event to handle file uploads via custom providers (like Uploadcare) or to perform file processing before saving.
  • Backstage Uploadcare Field now contains a "media grid picker" to pick already uploaded media files to prevent duplicate files in Uploadcare.
  • All uploaded media files are now saved in the media table, including metadata in the media_relationships table. Here unique (meta)data for each content_field_value is stored.
  • The media package now includes laravel-translations to set (and translate) alt text for each configured language.

Breaking changes

  • Media ULIDs are now stored in the content_field_values table instead of the whole file objects. You can migrate existing Uploadcare data using php artisan vendor:publish --tag=backstage/uploadcare-field-migrations && migrate. When you want to get the meta of an "edit", you can access it like $media->edit.
  • Relationships on Content model will now be returned as a Collection instead of an array.
  • $item->field('image') will now return a Media model
  • $images in blocks will now return a single Media model when not multiple. When multiple, it will return a collection instead of an array.
  • The following PageComponent slots are replaced by stacks: headFirst > head-first, headLast > headLast, bodyFirst > body-first, bodyLast > body-last

Upgrade guide

Uploadcare

To upgrade when using Uploadcare, run:

composer update && php artisan vendor:publish --tag=backstage/uploadcare-field-migrations && migrate

Not using Uploadcare?

Simply run composer update.

* Squashed 'packages/filament-uploadcare-field/' content from commit 34c1516

git-subtree-dir: packages/filament-uploadcare-field
git-subtree-split: 34c15165cfe7d938bdd1a77db2b1a2b01551b7b6

* Squashed 'packages/uploadcare-field/' content from commit a994f38

git-subtree-dir: packages/uploadcare-field
git-subtree-split: a994f3896d2f93608a518261885576f3c0c31c57

* import media package changes

* import uploadcare-field changes

* import core changes

* build uploadcare assets

* fix icon path

* packages

* add missing files

* columnSpanFull for first alt

* rename alt tag to alt text

* remove original filename and set filename as modal heading

* add translations to the media model

* fix: styling

* wip it

* fix: styling

* remove dupe notification

* fix: styling

* improve media picker

* media grid picker improvements

* fix: styling

* feat: check on file types and allow multiple

* fix: keyvalue nested arrays

* fix uploading files

* backstage specific listmedia

* custom uploadcare src attribute

* fix: styling

* remove code

* fix: nested array values

* fix: styling

* fix imports

* feat: add database view

* fix: styling

* feat: add image preview in edit mode and show array values correct

* fix: translations in UC

* remove hardcoded lang

* fix: styling

* alignCenter

* decouple Uploadcare from core packages

* fix: styling

* this needs testing: check if saving works correctly

* feat: allow hydrating values from custom fields

* give custom fields priority over normal fields

* fix handling nested fields in repeater/builder

* fix: styling

* reduce redundant code

* wip

* fix: styling

* return Media model

* getMimeTypeAttribute

* fix: styling

* cast metadata to array

* fix: styling

* wip

* convert data to media_relationships

* relationships and hydrating

* observer and define relation

* fix: styling

* rename usages to edits

* load edits for media

* `getEditAttribute`

* `getEditAttribute`

* fix: styling

* disable future mediaPicker

* fix: styling

* return relation

* fix manoj

* wip

* remove media resource

* fix: styling

* disable broken translations in edit form

* fix file upload by uploadcare

* extends functionality from the media baseclass

* fix translations

* hide translate button when no openai key set

* file icons for previews

* fix: styling

* dont encode metadata

* use correct md5 hashes for normal media and uploadcare

* fix: styling

* docs: hydrating fields

* docs: custom mediaupload using events

* fix: media grid picker and cleanup Uploadcare code

* styles: darkmode issues

* fix migration

* wip

* fix: styling

* fix: defining extension

* fix: styling

* fix: saving crop doesnt always saves cdnUrlModifiers

* fix: load values when getting field

* wip

* wip

* fix: styling

* wip

* fix: styling

* fix: order of executing

* fix: load site relation

* fix: styling

* wip

* wip it

* fix composer.json

* test: trigger workflow

* test: trigger workflow

* self.version

* fix incorrect config key

* get nested configs

* wip

* fix phpstan issues

---------

Co-authored-by: Baspa <[email protected]>
Co-authored-by: Mathieu <[email protected]>
@Baspa Baspa self-assigned this Dec 12, 2025
@Baspa Baspa added the release label Dec 12, 2025
Baspa and others added 27 commits December 12, 2025 14:08
* Remove publishing of translation config in backstage:install

* Dont add default vk10 users

* Remove translation config & option for creating user in install

* Add secret as password

* Remove vk10 users

* fix: styling

* email and pw required

* RedirectFactory

* Dont duplicate pw hash

* fix: styling

* Feedback

* fix: styling

---------

Co-authored-by: Casmo <[email protected]>
@Casmo
Copy link
Contributor

Casmo commented Jan 9, 2026

Ik heb:

  • use Backstage\Fields\Contracts\HydratesValues; toegevoegd fields (alleen voor Text::class) nu.
  • Deze hydrate() functie wordt nu aangeroepen bij $content->field('slug'); (indien het field deze implementeerd)
  • Text::class wordt nu ook geregistreerd bij de FieldsServiceProvider

De hydrate() functie wordt ook gebruikt bij de Content Form voor het vullen van de values. Ik weet niet of we dat willen. Ik zou eigenlijk de hydrate() functie echt alleen gebruiken voor front(enders). Even onderzoeken nog.

Er moet nog hoop gedaan worden want de hydrate() functie wordt nu op meer plekken (dubbel) gebruikt. Kijken of we deze code uit cms kunnen halen en naar de specifieke fields kunnen toevoegen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants