195 Commits

Author SHA1 Message Date
Nitwel
858892f73d Add a force option to schema apply to bypass hash check (#27136)
* added force option to schema apply

* Update api/src/controllers/schema.ts

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

* Update .changeset/cute-rivers-mate.md

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

* cleanup

* default to false

* adjust error message

* add test

* add jsdoc

* add new option to service type

* Update cute-rivers-mate.md

* Update cute-rivers-mate.md

---------

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>
2026-04-16 18:51:47 +00:00
ian
ab1f135e08 Release 11.17.3 (#27132)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-15 14:26:23 -04:00
Alex Gaillard
791f9b642d Revert "Improve configurability of health checks (#26987)" (#27131)
This reverts commit 41edb6c653.
2026-04-15 16:03:53 +00:00
Nitwel
e976510960 Fix api building with node_modules (#27067)
* start fixing building of api

* fully migrate from typebox to zod

* add changeset

* fmt

* cleanup

* update lock
2026-04-14 11:20:01 -04:00
judda
41edb6c653 Improve configurability of health checks (#26987)
* suffix file health checks with machine id

* add changeset

* add ttl support for local cache

* improve configurability of healthcheck and cache results

* add cahngesets

* restrict `/server/health` to authenticated users

* tweaks

* Ensure consistent bracket usage

* Apply suggestion from @ComfortablyCoding

* add notice for dropping cache/ratelimiter/ratelimiterglobal

* move unauthenticated check to service

* add bb tests

* improve server health return type

* Update shaggy-news-check.md

* fix vendor db check

* Update shaggy-news-check.md

* Fix bb tests
2026-04-10 19:29:19 -04:00
ian
32d5650f4f Release 11.17.1 (#27007)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Alex Gaillard <alex@directus.io>
2026-03-30 12:29:03 -04:00
ian
dfb2db349f Release 11.17.0 (#26960)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-24 18:15:34 -04:00
Brainslug
c1509b335c Fix revisions not using prepareDelta (#26867)
* track user pre suspended status

* omit relational fields from revision data

* sanitize data input in update

* move relational sanitize to service

* sanitize user payload on suspend

* sanitize sensitive fields in flows

* update prepareDelta type

* add preparedelta coverage

* sanitize updateMany when applicable

* fix wrong collection being referenced

* update item test util to support super options

* add tests

* Revert "update item test util to support super options"

This reverts commit e3e0cdfb72.

* Revert "add tests"

This reverts commit 90f39104c1.

* Revert "fix wrong collection being referenced"

This reverts commit ee1662bc52.

* Revert "sanitize updateMany when applicable"

This reverts commit fdafe0132f.

* revert

* revert revision change

* dont double check conditions

* set data to null not undefined

* cleanup

* move relation lookup to util

* add full selection fallback

* createOne revision payload should be with presets

* add basic encrypt transformer tests

* changeset

* lint

* Apply suggestion from @ComfortablyCoding

* Fix unit tests after merge

* use difference for arrays

* Fix build per new requirements

---------

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
2026-03-24 13:08:23 -04:00
Brainslug
c565429918 Fix file renaming (#26946)
* enforce unique names and rename for changed names

* simplify filename unique query

* Correct comments

* restrict update/delete to users own files

* fix generated assets getting replaced

- only rename prefix for generated assets
- update extension if applicable

* remove unused import

* add repoint vs remove support

* filename_disk should store resolved path

* remove unused import

* always delete generated assets

* add rollback support

* dont read as sudo

* revert back to sudo service so read is not enforced

* add default cast for env var

* Improve comments for update storage disk

* fix delete occurring for move

* add explicit boolean cast

* improve comments

* account for location change

* Update app/src/app-permissions.ts

* transaction should be on a per file basis

* account for folder to folder changes

* rename FILES_SKIP_PRIMARY_ASSET to FILES_DELETE_ORIGINAL_ON_MOVE

* remove storage change support

* improve itemservice mock

* add tests

* add useEnv test util

* fmt

* add storage driver test-util

* reduce regression chance

* improve tests

* permission check before throwing fordbidden

* restrict filename_disk updates to one or batch

* improve test coverage

* do not process filename disk if bulk update with filename_disk

* dont loop for non filename_disk changes

* cleanup

* removed merge artifacts from tests

* format and fix tests

* Fix import order

* utilize mock driver and move fs tests to uploadOne

* add changeset

* prettier

* fix tests

* Fix folder tests

---------

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
Co-authored-by: Alex Gaillard <alex@directus.io>
2026-03-24 11:37:56 -04:00
Brainslug
fff7ce88f8 Add GraphQL resolver deduplication (#26949)
* don't duplicate health calls

* Created some resolver deduplication helpers

* update gql types

* apply dedup helper to all system read resolvers

* apply dedup helper to all items read resolvers

* not a typo

* add comment

* changeset

* prettier

---------

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
2026-03-24 10:47:55 -04:00
Gaetan SENN
754358d96c Update FilesService.uploadOne to support an optional storage parameter (#26882)
* refactor: make storage parameter optional in file uploads

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* build: updaate changeset

* fix: use File that contain storage

* refactor: centralize storage default in uploadOne

* refactor: remove storage param

* Apply suggestion from @ComfortablyCoding

* Apply suggestion from @ComfortablyCoding

* tests: add tests

* refactor: apply formater

* Apply suggestion from @ComfortablyCoding

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>
2026-03-13 16:54:06 -04:00
Nitwel
3c2efc1fb6 Improve build times using tsdown’s oxc-transform (#26604)
* start supporting isolatedDeclarations

* add errors and storage package

* add utils, and storage-driver-local

* fix rest of packages

* fix types/collab import

* hardcode "isolatedDeclarations": true in all configs for now

* Revert "hardcode "isolatedDeclarations": true in all configs for now"

This reverts commit ac71582159.

* fix formatting

* undo readme change

* remove link

* fix lockfile

* dont do a js string cast here I guess

* use tsc over tsdown because of failing tests

* last fixes

* use tsdown --clean instead of rimraf

* fmt and fixes

* re add weird space

* add run as entry

* undo api using tsdown

* switch back to tsdown again now with unbundle 🥳

* more ts fixes

* build with tsdown in @directus/themes

* fix bb tests

* undo spaces

* another space

* fix collab import

* add changeset

* Apply suggestion from @ComfortablyCoding

* Apply suggestion from @ComfortablyCoding

* Update .changeset/hungry-yaks-enter.md

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

---------

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>
2026-03-11 14:56:12 -04:00
ian
40ec421fdf Release 11.16.1 (#26871)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-10 18:11:36 -04:00
ian
d273af9e3c Release 11.16.0 (#26810)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-04 15:48:22 -05:00
Gaetan SENN
dfc8797d5f feat: optimize project synchronization (#26794)
* feat: optimize project synchronization

* fix: optimize code

* fix: optimize stats and code

* fix: remove url / framework from projects sync

* tests: add missing tests
2026-03-04 12:21:21 -05:00
Gaetan SENN
920d452f12 Support provider webhooks for deployment real-time updates (#26683)
* feat(deployment): support netlify

feat(deployment): support netlify

fix(): style, format and tests

fix(netlify): filter by account slug

chore(): remove the need for siteId in deploy logs

wip

* test(): mock listSitesForAccount

* format

* test(): fix with account_slug test

* fix(): error handling + cancel deployment

* fix(deployLogs): new implementation

* chore: remove test data

* fix: use currentColor svg

* fix: fix some issues and improve code

* fix: wait until the end of the logs when build is finished

* refactor: format code

* Update changeset

* refactor: use tokenUrl as vercel does

* fix tooltip placement

* fix: provider change refresh

* feat: implement webhook sync

* feat: implement netlify webhook and refactor logic

* feat: implement netlify webhook and refactor logic

* refactor: clean up code

* test: update netlify tests

* build: add changeset

* build: clean up changeset

* refactor: clean up logs

* refactor: optimize status code error

* refactor: clean up code

* fix: change list project limit to 100

* fix: fix tests

* refactor: handle feedbacks

* fix: flash issue from runs

* refactor: avoid duplicated range schema

* feat: add missing cmd save

* fix: fix naming variable

* refactor: move logic to service

* refactor: optimize emitAction usage

* refactor: use drivers pagination for projects

* fix: fix pluralization

* fix: fix timestamp duration

* fix: fix dashboard i18n

* fix: add missing netlify test

* refactor: improve typing

* refactor: add runs stats and fix some issues

* fix: fix run build time issue

* refactor: fix typing

* Implement RBAC for deployment module (#26726)

* refactor: implement RBAC for deployment

* build: update build

* fix: linter

* refactor: clean up

* fix: fix naming variable

* Update app/src/modules/deployment/index.ts

Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com>

* refactor: move logic to service

* refactor: optimize emitAction usage

* refactor: use drivers pagination for projects

* fix: scope null accountability to name-sync write only

* feat: restrict button actions and sections according to rights

---------

Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com>

---------

Co-authored-by: Yasser Lahbibi <yasser.lahbibi@apenhet.com>
Co-authored-by: Florian C. Wachmann <dev@formfcw.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Alex Gaillard <alex@directus.io>
Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com>
2026-03-02 11:57:30 -05:00
ian
f0f0c605e3 Release 11.15.3 (#26663)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-16 09:52:22 -05:00
ian
7f6f6728d7 Release 11.15.2 (#26641)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-12 14:02:25 -05:00
Yasser Lahbibi
a55610a182 Add Netlify as a deployment provider (#26594)
* feat(deployment): support netlify

feat(deployment): support netlify

fix(): style, format and tests

fix(netlify): filter by account slug

chore(): remove the need for siteId in deploy logs

wip

* test(): mock listSitesForAccount

* format

* test(): fix with account_slug test

* fix(): error handling + cancel deployment

* fix(deployLogs): new implementation

* chore: remove test data

* fix: use currentColor svg

* fix: fix some issues and improve code

* fix: wait until the end of the logs when build is finished

* refactor: format code

* Update changeset

* refactor: use tokenUrl as vercel does

* fix tooltip placement

* fix: provider change refresh

---------

Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com>
Co-authored-by: Florian C. Wachmann <dev@formfcw.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 09:29:53 -05:00
ian
47c60716b5 Release 11.15.0 (#26590)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-05 14:16:37 -05:00
Gaetan SENN
d8bd5d42f2 Add deployment module with Vercel provider support (#26473)
* feat: add deployment migration

* feat: add deployment and deployment projects collections with corresponding fields and relations

* build: add changeset

* feat: set type as unique

* build: set type to unique

* build: set type to unique

* feat: add missing run tables

* feat: add deployment module

* fix: add missing run migration

* refactor: remove local project

* refactor: use provider instead of type

* refactor: use provider instead of type

* Add database schema for deployment module with encrypted credentials support

* feat: add deployment migration

* feat: add deployment and deployment projects collections with corresponding fields and relations

* build: add changeset

* feat: set type as unique

* build: set type to unique

* feat: add missing run tables

* fix: add missing run migration

* refactor: use provider instead of type

* feat: add logs / runs routes

* refactor: remove project name for realtime from vercel

* feat: implement runs logs

* fix: formater

* refactor: clean up

* feat: add vercel

* build: mv types and add changeset

* refactor: register drivers once

* feat: add sdk implementation

* refactor: fix lint

* refactor: simplify runs status

* build: update changeset

* feat: clean up module

* fix: fix merge

* refactor: finalize implementation

* build: add changeset

* refactor: update cache logic and fix some issues

* fix: fix missing file

* refactor: merge changeset

* fix: move project selection logic in service

* refactor: removed dashboard stats

* fix: use snake case for deploy input for consistency

* refactor: avoid copy of req.body

* refactor: apply concurrency limit of 5 to provider

* refactor: remove extends of Item

* fix: export deployment for extensions

* fix: remove name from deployment project

* fix: fix spinner padding injected from button class

* fix: fix some feedbacks

* fix: duration size and redirect after first provider configuration

* Reorganize translation strings (#26533)

* Reorganize translation strings

* Remove artifact

* fix: restore name from projects

* fix: hide back button from settings if no projects

* fix(dashboad): use inline for url

* fix: refresh config value options on save

* fix: extend Deployment methods

* fix: export DeploymentConfig from types

* fix: first check the resource access and improve error

* refactor: batch updates

* refactor: clean up code

* refactor: optimize comments

* feat: improve js docs errors

* fix: check permission before connection test from provider

* refactor: use front end user extraction

* refactor: optimize code

* fix: fix avoid composable inside computed

* fix: fix i18n change

* fix: use dynamic provider name

* fix: remove unused class scope

* fix: fix credentials read and move logic into service

* feaet: display warning of team id change and add it to setup drawer

* refactor: remove comments

* refactor: handle feedback

* fix: snake case refactoring

* fix: fix clear cache variable

* Update app/src/lang/translations/en-US.yaml

Update i18n

Co-authored-by: Alex Gaillard <alex@directus.io>

* refactor: remove changeset

* refactor: remove meta from sdk

* fix: fix preview state

* fix: remove meta type injection

* refactor: change to pluralization

* refactor: update logic

* refactor: update changeset

* fix: optimize switch case

* fix: keep filter from query

* refactor: use directError type

* refactor: fix not used typing

* refactor: add new error code utility function

* refactor: add aria label for search input

* Potential fix for pull request finding 'Useless assignment to local variable'

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* refactor: clean up unused import

* fix: fix feedbacks

* fix: fix switch case logic

* fix: use mergeFilter util function

* refactor: align with Judd preference

* refactor: rename cache variable and add in missing files

* refactor: clean up axios usage

* fix: assign data.options from parseValue

* refactor: update date of deployment migration file

* fix: lint

* fix: add missing package

* build: run formatter

* Fix stylint errors

* deploy ← design updates (#26585)

* use VBreadcrumb for VDrawer subtitle to match design

* use form-row-gap between notice and form to match the design

* style: enhance layout and styling for deployment settings page

* use global back button instead of custom one

* use PrivateViewHeaderBarActionButton instead of custom one

* fix: use dynamic provider var for back link

* use global back button instead of custom one

* ensure consistent appearance of more-options button

* use global back button instead of custom one

* use PrivateViewHeaderBarActionButton instead of custom one

* tests: add api side tests

* fix: prevent chip from using parent font-weight

* refactor: apply admin access middleware for deployment routes

* tests: add cache tests

* fix: fix loader alignment

---------

Co-authored-by: Alex Gaillard <alex@directus.io>
Co-authored-by: Alvaro Saburido <alvaro.saburido@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Co-authored-by: Florian C. Wachmann <dev@formfcw.com>
2026-02-05 12:27:40 -05:00
Nitwel
50b496f0a5 Collaborative Editing Implementation (〃 ̄︶ ̄)人( ̄︶ ̄〃) (#26172)
* Test save action broadcast

* Fix formatting

* fix frontend connecting multiple times

* improve room inactivity logic

* fix client clearing

* fix update before focus

* ignore changes to fields focused by other users

* fix rejoining a room

* fix singleton not rendering HeaderCollab

* make collab work with ai

* don't give out duplicate colors if not necessary.

* fix giving out invalid colors

* update disconnection logic to be instance based instead of client based

* update timings

* Remove unused imports

* Update test to pass client.uid instead

* Fix security of nested payload sanitization

* Use prettier to format

* Fix messenger race condition

* Fix empty keys array invalidation

* Fix mocks

* Add collab and store tests

* reuse verify permissions for sanitize payload

* remove unused code

* fix ai chat working with collab

* fix cleaning clients that are in room but not in messenger

* Fix wildcard access

* Fix nested create without PK

* Cleanup removed fn

* Remove room

* Add missing await

* Patch unit tests

* Merge async deepMapWithSchema and refactor sanitization

* Fix usages and tests

* Fix relational null updates treated as objects

* Prevent unauthorized field unsets and relationship updates

* Propagate item deletion

* Simplify room lifecycle and add recovery

* Update tests

* Implement distributed cleanup and standardize env configuration

* Cleanup and refactor to RoomManager

* Address CodeQL warning

* Add blackbox tests

* Handle integer PK and handle invalid schema

* add error messages to client

* fix error types

* Add basic deep relational tests

* Patch tests and improve websocket transport

* remove unused import

* add frontend delete

* improve error handling and fix item delete

* clearn up room logic

* update tests

* Update blackbox tests

* Use waitForMatchingMessage

* Specify timeout for seeding

* Improve tests

* fix room tests

* fix sanitize-payload and verify-permissions

* update discard banner in app

* Implicitly switch focus when updating

* Try accounting for misordered messages

* clean console

* Fix build

* fmt

* fmt

* fmt

* Verify permissions before relational processing

* Improve update clearing

* Fix double join events

* Fix disconnected icon when disabled

* Handle error from getService

* Pass collab context to overlay

* Broadcast to all users to fix relational item not receiving update

* Skip disabling interfaces with relational specials

* Add shared discard and drawer refinements

* sync item update notification

* fix double save message in frontend

* Add collab for users and files

* fix join error showing on non existent items

* Reset changes when last person leaves

* don't focus on focused fields

* fix headerCollab not showing with coll-template

* Check if values has changed on update

* fix page header hiding collab

* Remove unused imports

* Fix versioned propagation

* Improve copy

* Fix delete handler

* Update collab tests

* fmt

* Update comments

* fix making color tab persistent

* only enable collab if needed

* fix wrong collision on no changes

* Validate changes on join and update

* Update packages/utils/shared/generate-joi.ts

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

* Simplify permission tagging and add integration test

* Test color propagation

* Fix rerun constraint

* Optional colors

* cleanup code

* Add namespace config and fix redlock

* update room functions to use global memory

* code cleanup

* Add fields to discard

* Fix messenger mock

* fix m2m and m2a and initialChanges in frontend

* Mock global rooms

* update error types and improve verify permissions

* add version permission check

* Match message instead

* Add missing await for version check

* Ensure consistent error types and patch tests

* Fix lint

* Fix version perms check

* Update mock and errors

* Use fake timers

* Improve collab disabling

* Add leader based room closure

* Optimize distributed messaging and implement non-blocking termination

* Optimize with validateItemAccess

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

* Streamline field permissions check

* Fix focus erroring

* Try improve blackbox stability with waitForMatchingMessage

* Improve numeric keys stability

* Fallback to collection perms when sanitizing missing items

* Add tests

* Sanitize encrypt field special

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

* Fix double o2m edits not cleared in app

* Reuse util

* Clear relational detailed update syntax

* Unify event sync to distributed bus

* Catch unhandled promise rejections during test cleanup

* Fix M2O null propagation by ensuring correct item context

* Update api/src/websocket/handlers/collab/sanitize-payload.ts

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

* Consolidate watchers to resolve double join and race conditions

* Allow metadata propagation in detailed relational updates

* simplify discard message

* early return on empty updateAll message

* improve discard further

* fix tests

* Consolidate and optimize payload validation and sanitization

* fix permission check on discard

* fix collab connecting when it shouldn't

* maybe fix room closure bug

* Polish

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

* Check singleton create

* Reconcile M2O objects

* fix orphan clients cleanup

* cleanup and fix code further

* move deep-map-with-schema to shared

* improve logs

* fix leave message

* cleanup singleton check

* remove duplicate perm check

* improve message handler singleton check

* fix self refernced relation disconnects

* fix frontend user name containing null

* fix * in discard

* fix leave counter

* fix race condition on edits being updated before fieldUpdate gets called

* separate ws sdk

* move collab sdk inside use-collab

* remove unused imports

* move collab folder 1 level up

* fix test

* fix headerCollab when formFieldLabel is hidden

* Cleanup discard message in app

* Discard should check read and update perms

* Rename to collaborative editing

* Add to telemetry

* Move getSchema in

* Fix renaming

* use newer sdk functions

* Remove moved files

* fix rejoining rooms

* Optimize discard

* Collab editing design fixes (#26528)

* Update avatar border styling and adjust x-small size in v-avatar component to match title baseline

* Refactor HeaderCollab component to use UserPopover for user avatars

* Remove unused template for HeaderCollab and clean up overlay-item component by deleting the "Avatars" span

* Remove unnecessary blank line in HeaderCollab component styling

* Move HeaderCollab to action slot and self align center

* Add v-avatar border color and width variables

* Add font-size comment for v-avatar in HeaderCollab component

* Update v-avatar border width to use theme variable instead of local variable

* Apply minor styles fixes

* Refactor HeaderCollab component template by repositioning icons and margin rules

* Refactor HeaderCollab slot position in other files

* Enhance form field label styles by adding flex-grow property and adjusting HeaderCollab margin for improved layout

* Remove unnecessary margin styles from header-collab in item and overlay-item components

* format

* Remove unnecessary hide-current and x-small prop from HeaderCollab component

* improve focus handling

* refactor v-avatar component to use a single component tag for clickable and non-clickable states

* fix: adjust sizes in HeaderCollab

* feat: add type prop to HeaderCollab for flexible usage in header and field contexts

* fix: adjust HeaderCollab styling for field context and improve layout in form-field-label

* fix: update HeaderCollab instances to use 'avatars' class for improved styling

* refactor: replace HeaderCollab with CollabAvatars component across multiple files for consistent collaboration user display

* fix eslint

---------

Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: formfcw <dev@formfcw.com>

* Rename blackbox for consistency

* Handle empty buffers to prevent errors during race conditions or disconnects

* Optimizations

* Use debug instead of info

* Cleanup on shutdown signal

* Cleanup optimization

* Add test and cleanup

* Ensure sequential bus processing

* Use isRelational util

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Fix import and accept DeepPartial

* Wait for connection

* fix too strict pk check

* Improve bb flakiness

* Unset should not acquire focus

* Test sticky focus behavior

* Update telemetry to include env accuracy

* Use getter for reactivity

* Ensure focus state initialization

* Add composable tests

* Await lock releasing

* Update memory tests

* Update translations

* Add websockets_enabled to telemetry

* Update changesets

* Reduce LRU cache capacity to 2000

* Add missing await

* Fix room cleanup

* Fix non-existent items (null) skipping cache

* Move zod to dependencies in @directus/types

* Update lockfile

* Fmt

* Skip cache metadata calculation if invalidated

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

* Add reconnect param

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

* make relational disabled on focus again

* only show 1st letter in CollabAvatars

* fix: use collab typescript (#26549)

* Refactor message handling in useCollab composable for type safety

* Enhance type safety in useCollab composable by updating field definitions to use object syntax for nested fields

* Add CollabUserInfo type for user data structure in useCollab composable

* Update TODO links in useCollab to GH issue instead

* Refactor field definitions in useCollab to use dot notation for nested avatar properties and keep types

* Update field definitions in useCollab to utilize DirectusUser

* Revert to object notation

* fix sending leave message on item delete

* Optimize client room lookup to check local node only (#26569)

* Optimize client room lookup to check local node only

* Update test

* Update comment

* Update wording

Co-authored-by: Nitwel <mail@nitwel.de>

---------

Co-authored-by: Nitwel <mail@nitwel.de>

* update unknown user to use icon instead

* code cleanup

* Fix blackbox create policy naming

* undo ai suggestion

* improve jsdoc

* fix jsdoc

* fix again jsdoc

* more fixidixi

* make collab opt in by default

* Update default enabled state to false

* Enable collab for blackbox

* Remove only sequential

* Fix MSSQL default value

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

---------

Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>
Co-authored-by: Alvaro Saburido <alvaro.saburido@gmail.com>
Co-authored-by: formfcw <dev@formfcw.com>
Co-authored-by: Alex Gaillard <alex@directus.io>
2026-02-05 12:23:48 -05:00
Bryant Gillespie
8884e25f98 Add multi-provider AI support with Google and OpenAI-compatible providers. Extract shared AI types into new @directus/ai package. (#26481)
* feat: add multi-provider AI support

* refactor: separate ai package

* fixes based on AI review

* Add provider options for open-ai-compatible to support things like reasoning

* formatter

* fix changeset maybe?

* fix copilot feedback

* Apply suggestion from @robluton

Co-authored-by: Rob Luton <rob.luton@gmail.com>

* fix: package version

* fix: reuse existing types

* fix tests

---------

Co-authored-by: Rob Luton <rob.luton@gmail.com>
2026-01-20 17:28:47 -05:00
ian
2cb91fcc6a Release 11.14.1 (#26486)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-01-14 19:41:14 +02:00
Bryant Gillespie
3fd2388de9 Add MCP settings to Settings type (#26469)
* fix: add MCP settings to Settings type

* add changeset

* did i get it?

* Update version change for '@directus/types'

* Update .changeset/slick-knives-turn.md

Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com>
2026-01-09 10:57:46 -05:00
Florian C. Wachmann
79cd1b57d9 Add ESLint rules to enforce consistent import order (#26445)
* add eslint-plugin-import and configure import sorting rules

* apply `eslint . --fix`

* disable import order rule for test files

* enable import order rule for test files and disable it inline after mock imports

* prettier

* address failed tests by removing unused i18n mocks from test files

* reorder import statement for createApp to address failed test

* Remove disable/enable blocks

* Resolve conflict with VSCode organize imports functionality (#26461)

* Update to use default grouping and prevent adding newlines in between

Co-authored-by: ian <licitdev@gmail.com>

* apply eslint fix

* run prettier

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: ian <licitdev@gmail.com>
2026-01-07 10:04:54 -05:00
Oscar Murrieta
acf6d3d4ca Remove deprecated /webhooks route and related dead code (#26311)
* chore: remove deprecated /webhooks route code and related tests

* build: add changeset

* docs: add mobml to contributors list (CLA)

* Remove WebhooksService

* Remove other traces of webhooks

* Update last mentions

* Add migration to drop webhooks table completely

* Add changeset

* Clean up changesets

* Remove translations

* Remove webhooks from bb test tables

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
2025-12-24 11:35:20 -05:00
ian
385d56c0cf Release 11.14.0 (#26352)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-12-09 15:43:44 -05:00
Nitwel
274fc44340 📂 Add support for downloading multiple files and entire folder trees (#26006)
* add files and folder download functionallity

* undo test

* deduplicate file names and add permission checks

* improve access handling

* fix filesService accountability

* fix app download

* add changeset

* use $t for script translation

* add Folder type

* prefer post for folder download

* add translated download folder

* rename admin filesService to sudo

* rename file deduper to name deduper

* add permissioned downloads and seperate zip for file/folder

* update lock

* default zipped name should be consistent

* remove dead code

* auto add extension for file name default

* update changeset

* update param naming for filesToZip

* only retrieve required fields

* Add faster dedupe lookup times

* add scope to sudo service

* files uses uuids, so ids should be strings

* prefer folder name as root over generic folder-

* update changeset

* update default app side file/folder names

* improve zip folder name format

* improve mime guess for fallback filename

* update package version

* rename `getDateFormatted` to `getDateTimeFormatted`

* do not limit file query to 100

* remove dead type

* move folderName from zipFolders under metadata

* Fix zip folder name

* auto sanitize names

* error if no files are in the tree

* add any empty folders to the tree

* rename tree to buildTree and add comment

* add test utils

* expose new methods to types

* Improve test coverage

* add comments

* remove dead type from name-deduper

* improve name-deduper tests

* dont restrict folder depth in tree

* remove unnecessary cast

* inline storage mock

* move mocked services to respective folder

* improve folders buildTree tests

* add comment for id restriction on child lookup

* add limit check to buildTree

* bring buildtree in zipfolder inline with other tests

* Update legal-streets-wonder.md

* Improve /assets/files/ error handling

* cleanup

* add sdk methods

* Update legal-streets-wonder.md

* correct key type in downloadFolderZip

* free URL memory after download

* rename type to output and improve return type

---------

Co-authored-by: Alex Gaillard <alex@directus.io>
Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
2025-12-10 04:11:38 +08:00
Rijk van Zanten
d8d8a06c18 Add AI Chat sidebar (#26259)
* Install vue split panel

* Recreate private-view

* Persist size

* Setup headerbar

* Add collapse expand

* Add resize handle

* Remove tw cruft

* Hack in right sidebar

* Fix right sidebar expand/collapse

* Fix content spacing

* Tweak scrolling containers, fix header shadow

* Remove margins

* Make nav responsive

* Nav toggles, remove latency

* Finish basic responsiveness

* Bry/split panel tiny twak (#25967)

* really missed the e in that branch name

* all the small thi..buttons

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* Style expand button

* Tweak sizing of icons

* Reduce search input sizing

* Remove margin from children

* Tweak header bar layout

* Remove page icons

* Tweak responsive breakpoints

* Add support for icons

* Tweak spacing

* they're back but as props this time (#25987)

* Fix z-index

* Header Bar to V Drawer Header Bar (#25988)

* they're back but as props this time

* rename to v-drawer header

* refactor to match private-view-header-bar pattern

* remove small header and header shadow props on private view

* Drop small prop from v-drawer-header

* Remove primary action item

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* Added `directus_comments` and `directus_extensions` to websocket subscriptions (#25464)

* utilize system data for registering system module subscriptions

* add changeset

* update changeset wording

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: Nitwel <mail@nitwel.de>

* Speed up dialogs a bit

* Add top padding in collections

* Re-add support for custom header border

* Slow down tooltips

* Responsiveness for header bar

* Recreate lockfile

* Add changeset

* Run formatter

* Fix linter warnings

* Add encryption support to special flags (#26096)

* Warn on secret values shorter than 32 bytes

* Warn on byte instead of string length

* Add encrypt/decrypt logic

* Add encrypt special flag support

* Rework encryption to use version envelope

* Format

* Pass accountability to payload service

* Return decrypted value to system calls

* Fix tampered test

* Add basic AI settings (#26097)

* Add ai settings

* Run formatter

* Add heading and notice

* Feat/refactor mcp (#26098)

* Refactor MCP into AI folder

* Run formatter

* Format translation

* Add dirname definitions

* Add ai/chat endpoint (#26104)

* Setup AI SDK endpoint

* Add tests

* Fix test quirks

* Implement tool support in chat endpoint (#26116)

* Add ai chat tool usage

* Gen in some tests

* Add json schema validation

* Update api/src/ai/chat/utils/chat-request-tool-to-ai-sdk-tool.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Refactor DRY

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Regen pnpmlock

* Update changeset to include themes pkg

* Feat/ai system prompt (#26124)

* Add system prompt setting

* Load middleware setting

* Add translatoins

* Allow passing systemprompt to createuimessages

* Pass system prompt from ai settings

* AI -> Add base layer AI UI components (#26115)

* components

* add ai sidebar to item route

* rough in ai model selector

* rough - ai-input

* mock message

* add reka-ui

* move to ai folder

* ai sdk vue

* model selector refactor

* shrink padding

* quick cleanup

* shorten model list

* install rest of ai sdk

* ai message parts

* refactor text area

* ai store

* update sidebar

* fix deps mismatch

* delete step

* update models to long form (again)

* refactor to pinia store

* remove tools stuff for now

* add openai reasoning detailed

* Update app/src/ai/components/ai-sidebar-detail.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix whitespace

* fix em up

* make max width 600 px

* fix sidebar scroll

* fix packages

* fix reka-ui

* cleanup message list

* cleanup message

* cleanup margins and unused css vars

* start reasoning open and then close when done

* refactor message list animation

* add reasoning translations

* refactor out scss

* remove progress bar

* model selector

* ai sidebar detail

* fix styling of message text

* refactor out variants in favor of simple role basis

* fix extra space

* remove unneeded variant

* refactor side prop

* replace spread with backwards loop

* fixes 1

* Move reka to devDependencies

* Logical properties

* Run stylelint

* convert to rem

* back to pickles

* Clean up multi-line tracking

* Use transition variables

* Use lodash throttle

* Use v-bind for css var

* Use $t instead of usei18n

* computed

* textarea magic

* Only show models from configured providers

* message tool translation

* Use transition vars

* Use vars for transition

* fix dupe

* remove opacity

* refactor reasonign

* add back empty tools array

* Refactor AI model selector dropdown to use transitions instead of keyframe animations (#26122)

* Initial plan

* Refactor dropdown animation to use transitions instead of keyframes

Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com>

* Update app/src/ai/components/ai-model-selector.vue

* Update app/src/ai/components/ai-model-selector.vue

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com>
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* fix animation

* refactor model selector to use vmenu

* New Crowdin updates (#25908)

* New translations en-us.yaml (Russian)

* New translations en-us.yaml (Russian)

* New translations en-us.yaml (Czech)

* New translations en-us.yaml (Russian)

* New translations en-us.yaml (Arabic)

* New translations en-us.yaml (Lithuanian)

* New translations en-us.yaml (Portuguese)

* New translations en-us.yaml (Albanian)

* Update source file en-US.yaml

* New translations en-us.yaml (Persian)

* New translations en-us.yaml (Persian)

* New translations en-us.yaml (Korean)

* New translations en-us.yaml (Turkish)

* New translations en-us.yaml (French)

* New translations en-us.yaml (Turkish)

* New translations en-us.yaml (Turkish)

* New translations en-us.yaml (French)

* New translations en-us.yaml (French, Canada)

* Update source file en-US.yaml

* New translations en-us.yaml (Korean)

* Update source file en-US.yaml

* New translations en-us.yaml (Persian)

* New translations en-us.yaml (Persian)

* New translations en-us.yaml (Persian)

* Update source file en-US.yaml

* New translations en-us.yaml (Russian)

* New translations en-us.yaml (Czech)

* New translations en-us.yaml (Romanian)

* New translations en-us.yaml (French)

* New translations en-us.yaml (Spanish)

* New translations en-us.yaml (Arabic)

* New translations en-us.yaml (Bulgarian)

* New translations en-us.yaml (Catalan)

* New translations en-us.yaml (Danish)

* New translations en-us.yaml (German)

* New translations en-us.yaml (Greek)

* New translations en-us.yaml (Finnish)

* New translations en-us.yaml (Hebrew)

* New translations en-us.yaml (Hungarian)

* New translations en-us.yaml (Italian)

* New translations en-us.yaml (Japanese)

* New translations en-us.yaml (Georgian)

* New translations en-us.yaml (Korean)

* New translations en-us.yaml (Lithuanian)

* New translations en-us.yaml (Mongolian)

* New translations en-us.yaml (Dutch)

* New translations en-us.yaml (Polish)

* New translations en-us.yaml (Portuguese)

* New translations en-us.yaml (Slovak)

* New translations en-us.yaml (Slovenian)

* New translations en-us.yaml (Albanian)

* New translations en-us.yaml (Swedish)

* New translations en-us.yaml (Turkish)

* New translations en-us.yaml (Ukrainian)

* New translations en-us.yaml (Chinese Simplified)

* New translations en-us.yaml (Chinese Traditional)

* New translations en-us.yaml (Vietnamese)

* New translations en-us.yaml (Icelandic)

* New translations en-us.yaml (Portuguese, Brazilian)

* New translations en-us.yaml (Indonesian)

* New translations en-us.yaml (Persian)

* New translations en-us.yaml (Spanish, Chile)

* New translations en-us.yaml (Spanish, Mexico)

* New translations en-us.yaml (Marathi)

* New translations en-us.yaml (Thai)

* New translations en-us.yaml (Croatian)

* New translations en-us.yaml (Estonian)

* New translations en-us.yaml (Azerbaijani)

* New translations en-us.yaml (English, Canada)

* New translations en-us.yaml (English, United Kingdom)

* New translations en-us.yaml (French, Canada)

* New translations en-us.yaml (Esperanto)

* New translations en-us.yaml (Bosnian)

* New translations en-us.yaml (Nepali)

* New translations en-us.yaml (Kurmanji (Kurdish))

* New translations en-us.yaml (Sorani (Kurdish))

* New translations en-us.yaml (Spanish, Latin America)

* Update source file en-US.yaml

* New translations en-us.yaml (Persian)

* New translations en-us.yaml (Russian)

* New translations en-us.yaml (Czech)

* New translations en-us.yaml (Romanian)

* New translations en-us.yaml (French)

* New translations en-us.yaml (Spanish)

* New translations en-us.yaml (Afrikaans)

* New translations en-us.yaml (Arabic)

* New translations en-us.yaml (Bulgarian)

* New translations en-us.yaml (Catalan)

* New translations en-us.yaml (Danish)

* New translations en-us.yaml (German)

* New translations en-us.yaml (Greek)

* New translations en-us.yaml (Finnish)

* New translations en-us.yaml (Hebrew)

* New translations en-us.yaml (Hungarian)

* New translations en-us.yaml (Italian)

* New translations en-us.yaml (Japanese)

* New translations en-us.yaml (Georgian)

* New translations en-us.yaml (Korean)

* New translations en-us.yaml (Lithuanian)

* New translations en-us.yaml (Mongolian)

* New translations en-us.yaml (Dutch)

* New translations en-us.yaml (Norwegian)

* New translations en-us.yaml (Polish)

* New translations en-us.yaml (Portuguese)

* New translations en-us.yaml (Slovak)

* New translations en-us.yaml (Slovenian)

* New translations en-us.yaml (Albanian)

* New translations en-us.yaml (Serbian (Cyrillic))

* New translations en-us.yaml (Swedish)

* New translations en-us.yaml (Turkish)

* New translations en-us.yaml (Ukrainian)

* New translations en-us.yaml (Chinese Simplified)

* New translations en-us.yaml (Chinese Traditional)

* New translations en-us.yaml (Vietnamese)

* New translations en-us.yaml (Icelandic)

* New translations en-us.yaml (Portuguese, Brazilian)

* New translations en-us.yaml (Indonesian)

* New translations en-us.yaml (Persian)

* New translations en-us.yaml (Spanish, Chile)

* New translations en-us.yaml (Spanish, Mexico)

* New translations en-us.yaml (Marathi)

* New translations en-us.yaml (Thai)

* New translations en-us.yaml (Croatian)

* New translations en-us.yaml (Estonian)

* New translations en-us.yaml (Malay)

* New translations en-us.yaml (English, Canada)

* New translations en-us.yaml (English, United Kingdom)

* New translations en-us.yaml (French, Canada)

* New translations en-us.yaml (Esperanto)

* New translations en-us.yaml (Breton)

* New translations en-us.yaml (Bosnian)

* New translations en-us.yaml (Serbian (Latin))

* New translations en-us.yaml (Nepali)

* New translations en-us.yaml (Kurmanji (Kurdish))

* New translations en-us.yaml (Sorani (Kurdish))

* New translations en-us.yaml (Spanish, Latin America)

* Update source file en-US.yaml

* Fix broken tests

---------

Co-authored-by: Alex Gaillard <alex@directus.io>

* Release 11.13.0 (#26114)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Update changeset to include themes pkg

* refactor message list scrolling

* Rerender based on parts hash

* Remove unused imports

* Allow more models

* cleanup tool markup

* cleanup more

* fix resizing

* Remove unused import

* Apply suggestion from @rijkvanzanten

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com>
Co-authored-by: Alex Gaillard <alex@directus.io>
Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Delete .github/CODEOWNERS

* Fix layout display dependant on item count request (#26045)

* Fix itemCount dep for item display

* add changeset

* Update app/src/layouts/cards/cards.vue

Co-authored-by: Alex Gaillard <alex@directus.io>

* Update app/src/layouts/tabular/tabular.vue

Co-authored-by: Alex Gaillard <alex@directus.io>

* add pagination skeleton loader

* only display skeleton if items are at least page limit

* Prefer 3 skeletons over 1

* fix skeleton loader tests

---------

Co-authored-by: Alex Gaillard <alex@directus.io>

* Add loading indicator when saving setup forms (#26130)

* Add loading indicator when saving

* Rename instance to project for consistency

* Add loading indicator when launching

* Rename remaining instances

* Add changeset

* Remove invalid label

* Remove accepted terms (#26135)

* Remove  accepted_terms

* Add changeset

---------

Co-authored-by: Alex Gaillard <alex@directus.io>

* Add Error Handling (#26138)

* error handling

* retry vs regenerate

* Update app/src/ai/components/ai-conversation.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/ai/components/ai-conversation.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Add `defineTool` composable (#26140)

* Don't send system prompt if it's empty

* Remove unnecessary functions

* Support dynamic tool registratoin

* Create defineTool composable

* Define form tools

* Add tests

* Update app/src/components/v-form/v-form.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/components/v-form/composables/use-input-schema.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/components/v-form/v-form.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Add reset button (#26141)

* Tweak sidebar min size

* Move model selector out of chat input

* Tweak spacing

* Make it less button-y

* Reduce hackiness

* Add reset method

* Add section subheader

* Use reset

* Reduce sidebar detail padding

* Move ctx to bottom start

* AI -> Reasoning message cleanup (#26145)

* cleanup reasoning

* fix fontsize

* Only show reasoning summary once exists

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* AI -> Improve rendering of messages (#26144)

* cleanup message structure

* fix mounting / unmount using id instead of hash

* Tweak loading state

* Tweak delays

* Remove needless hash

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* AI -> Add logos for model selector (#26142)

* add logos to model selector

* refactor

* Update app/src/ai/components/logos/anthropic.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/ai/components/logos/openai.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* final answer

* swap claude logo

* Render divider in selector

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* Tweak spacing

* AI -> Submit and Stop Button (#26150)

* wip

* refactor

* handle reasoning errors on stop

* hide messages without text

* still show reasoning if streaming but no text

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Redo the sidebar (#26149)

* [WIP] Remove info sidebar detail

* [WIP] Style new accordion

* Render ai sidebar detail at bottom

* Add expand animation

* Sidebar collapse/expand

* Various tweaks and fixes

* Fix transition states

* Fix active state on navigate

* Update app/src/modules/files/components/file-info-sidebar-detail.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* AI -> Submit and Stop Button (#26150)

* wip

* refactor

* handle reasoning errors on stop

* hide messages without text

* still show reasoning if streaming but no text

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Re-add support for badge, fix other comments

* Fix z-indexing

* Persist ai chat active state

* Move aiChat active state to ai store

* Remove notes

* Remove bak

* fix revisions overflow

* Resolve comment

* Bump +1 boop

* Add units to rotate 0

* Remove unused placement prop

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com>

* Fix font size of layout options

* Hack in empty state (#26151)

* Add support for local tool display names

* Fix server tools not being called

* Add tooltip

* Fix absolute positioned elements in scrolling container

* AI -> Cleanup Tool Messages (#26163)

* cleanup tool message part

* match text message padding

* drop content to 280px

* Fix horizontal overflw

* Update app/src/components/v-drawer.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/views/private/components/sidebar-detail.vue

Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com>

* Update app/src/components/v-drawer.vue

Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com>

* Remove old file

* Update app/src/components/v-drawer.vue

Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com>

* Re-add activity link

* Use hyphens for template ref

* No small

* Remove unused class

* Only show sections when sidebar open

* Only show notifications preview when bar is expanded

* Expand sidebar on activity click

* Please formatter, forgive my sins

* Fix duplicate attributes

* AI -> Chat Flow Improvements (#26185)

* store chat open in local storage for refreshes

* fix autoscrolling

* move input to store and fix submission with enter

* add meta j keyboard shortcut to open close ai chat

* measure no longer needed

* Fix button jumping on scroll

* Replace watcher with event hook

* Capture shortcut globally, add tooltip

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* fix items prompt for ai tools (#26183)

* Tweak scrolling behavior (#26211)

* AI -> Fix failed tool calls (#26179)

* add helper to ensure input in failed tool calls

* use helper -- don't validate the tools themselves

* fix reasoning message issues

* add test suite

* update chat controller tests

* thanks copilot

* Fix merge conflict whoopsies (#26214)

* AI → Limit context usage (#26202)

* Use : instead of / for model ids

* Refactor to use full model definition

* Calculate usage

* Remove pro

* Show context usage progress indicator

* Remove unused package

* Don't show context usage

* Limit messages we're sending

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove unused comment

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix schemas for dates

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: bryantgillespie <hey@bryantgillespie.com>

* AI -> Message Styling (#26198)

* store chat open in local storage for refreshes

* fix autoscrolling

* move input to store and fix submission with enter

* add meta j keyboard shortcut to open close ai chat

* measure no longer needed

* increase message gap

* cleanup message tool styling

* fix padding and scrollbar on chat

* refactor ai-message component to improve structure and styling; updated gap variable and added role prop to AiMessageText

* message styling

* add css animation on hover when not expanded

* fix height transition

* fix trailing space

* add  todo list focus

* fix border radius for user messages

* fix duped

* remove unneeded watch

* fix import order

* animate text and icons only

* Update app/src/ai/components/parts/ai-message-tool.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Tweak spacing for loading indicator

* Resolve translation comment

* Magic is magic

* Enough magic

* Remove unused stuff

* Resolve hardcoded reused msg height

* Run formatter

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* Re-add notifications

* AI -> Persist session using local storage (#26199)

* persist current session

* Use sessionstorage instead

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* Run formatter

* Tie AI access to app access (#26251)

* Allow divider to overlap sticky headings in main (#26252)

* Some Fixes for Split Panel (#26254)

* use container queries for form

* wip

* back to percent

* unwrap preview

* fix type

* unneeded setter

* remove unneded function

* cleaner compueted

* its either 100 or 0

* Add changeset

* Run formatter

* Fix stylelint warning

* Fix API typing of sanitizeQuery

* AI → Refresh stores on system tool calls (#26253)

* Refresh schema on system tool calls

* Refactor relations store to setup

* Add item refresh to all layouts

* Add item refresh on detail view

* Refresh fields on collection changes

* AI → Re-enable notifications (#26250)

* Render notifications outside of sidebar

* Use absolute in split container

* Fix animation

* Render link to activity in notifications drawer

* Add AI Chat sidebar  (#26261)

* Initial plan

* Refactor test to use typed mockNext instead of inline vi.fn() for RequestHandler calls

Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com>

* Happy now?

* Resolve test issue

* Make sure left/right panel close icons RTL

* Resolve test issues

* AI → Add soft-default for system prompt (#26268)

* Add soft-default for system prompt

* Update test to account for default value

* update system prompt

---------

Co-authored-by: bryantgillespie <hey@bryantgillespie.com>
Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com>

* AI -> Tool Approval Functionality (#26265)

* Refactor to tool card for approvals and web search tool (later)

* update to ai sdk beta for tool approvals

* add settings menu

* adust padding for settings menu

* update store

* add approvals to chat request

* stronger types

* update controller

* update send automatically when

* run formatter

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/ai/stores/use-ai.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* remove assets from translations for now

* refactor approval options

* tool card disabled

* add icons to map as well

* remove casting

* fix double scroll bar

* Apply suggestion from @Copilot

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix typing of stream call

* Add enter key for translate shortcut

* Translate keyboard shortcuts

* Remove keyboard shortcuts

* Use css vars

* Use translated tool names

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* AI -> Hide when No Providers / Not Configured (#26269)

* add beta

* move header

* add no provider empty states

* translations

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* Nudge nudge

* I'm sorry.

* Update .changeset/small-doodles-join.md

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/settings/routes/flows/components/logs-sidebar-detail.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/private-view/components/private-view-resize-handle.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/components/layout-sidebar-detail.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/components/sidebar-detail.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/settings/routes/marketplace/routes/registry/registry.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/settings/routes/system-logs/logs.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/settings/routes/system-logs/logs.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/interfaces/_system/system-owner/system-owner.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/components/skip-menu.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/private-view/components/private-view-main.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/components/v-form/composables/use-input-schema.ts

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/components/v-form/composables/use-input-schema.ts

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/private-view/components/private-view.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/ai/components/parts/ai-message-text.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/visual/components/editing-layer.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/visual/components/editing-layer.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/components/v-drawer-header.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/components/v-drawer-header.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/private-view/components/private-view-main.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/private-view/components/private-view-header-bar.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/components/notifications-drawer.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/routes/item.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* search input: match header button height and refine styles with CSS variables (#26308)

* add BREAKPOINTS constant and update private-view-root.vue to demonstrate example usage (#26310)

* AI → Resolve review comments (#26290)

* Add a smidge of padding

* Add a pinch of flex

* Stir in the drawing spacing

* Re-add missing drawer close on mobile

* Fix z-index of header bar

* Tweak stacking order of search input

* Resolve shadow showing up on nav on mobile

* Only show tooltip when sidebar is closed

* Drop shortcut

* Nudge cancel button size and positioning

* Make drawer buttons smaller

* Fix input height in sidebar

* Drop unused dependency

* Change translation key

* Add in type label tweaks

* Tweak drawer title styling

* Stick header bar at 0

* Tweak skeleton loader

* Allow inline size to shrink

* Fix missing import

* Don't inherit attrs on private view

* Collapse right sidebar when making window small

* fix appearance

* Tweak sizing of right rail

* Don't deactivate on unmount

* Fix right sidebar alignment

* sidebar is closed and you try to open it by resizing while the preview split-panel is open

* Re-add non-editable

* Tweak revision styling

* 💅 f l  o   r    i     a      n

* Refactor v-form ai usage to composable

* Tweak spacing

* Update import

* Rename description to llmDescription

* Use prop shorthands

* Don't use flow sidebar detail in translations

* Don't use unused prop

* Move vars to top

* Add comment

* Remove unused ref

* Drop navbar/sidebar from app store

* Revert version menu

* button type

* Remove fullscreen

* Use private view header bar actions

* Fix custom icons not scaling

* Remove unused css

* Use class instead of id

Don't you forget about the ˚₊‧꒰ა best practices ໒꒱ ‧₊˚

* Update input-hash component to conditionally set input type and autocomplete attributes based on masked state

* revert fields user change

* remove todos

* Update app/src/components/v-drawer-header.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Pass direction to split panel

* Update split panel

* Revert "Rename description to llmDescription"

This reverts commit 162a6d5fdc.

* Solve name confusion with just comments

* Update app/src/components/v-form/composables/use-ai-tools.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/components/v-drawer-header.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Run formatter/linter

---------

Co-authored-by: bryantgillespie <hey@bryantgillespie.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* AI ← Spacing & responsive refinements (#26309)

* introduce --form-column-min-width var

* move container-type: inline-size to the form-grid mixin

* set inline-size container query to 556px

* adjust sidebar content padding to match sidebar toggle buttons

* refine the project name padding so it optically matches the contents of the navigation bar

* set --content-padding and --content-padding-bottom vars globally

* refine spacing of item form

* add top padding to content components

* remove top margin in favor of added top padding

* Tweak spacing a bit more

---------

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>

* Prettier doesn't agree sadly

* Add changeset for stores package

* Update app/src/modules/content/routes/item.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/ai/components/ai-sidebar-detail.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/routes/item.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Remove unused file

* Icon sizes

* Align drawer header with other header

* Fix descender overflow

* Re-add tooltip

* AI ← Drawer & Header (#26317)

* add Esc hint to cancel tooltip for consistency with the cancel button outside the drawer

* adjust alignment of drawer cancel button to match header bar icons

* prevent extra padding-right of forms in the drawer

* ensure that title styles are applied to the drawer header

* prevent the title text from being cut off in the header bar and the drawer header

* Update app/src/views/private/private-view/components/private-view-header-bar.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/private-view/components/private-view-main.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/private-view/components/private-view-main.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/private-view/components/private-view-main.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/views/private/private-view/components/private-view-main.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/routes/item.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/routes/item.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/routes/item.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* fix private view main

* update docs link and system prompt help text

* formatter

* fix stylelint comments

* AI -> Add Back Scroll Shadows but Better (#26313)

* add scroll shadows to scroll container in private view

* Update app/src/styles/themes/_dark.scss

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/views/private/private-view/components/private-view.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* set to false instead of undefined

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/src/modules/content/routes/item.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* render only split panel

* Fix calendar/map view

* fix header border mismatch for color match theme

* Fix button size in field detail

* Fix more drawer button sizes

* borders are back

* Fix map / calendar not resizing on sidebar size change

* Run formatter

* fix layout bottom

* fix calendar

* fizx tests

* update test snapshot

* use internal BREAKPOINTS const and remove redundant use of useBreakpoints (#26329)

* fix form type imports

* Update app/src/views/private/private-view/components/private-view-header-bar.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/components/v-drawer-header.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* enforce map view shadows and fix initialization issue

* remove unused line

* fix border for color match themne

* Tweak default

* Revert input-hash changes, use new autocomplete prop

* oops missed the import

* AI ← Live Preview (#26330)

* prevent iframe from loading when live preview is not active

* add default live preview size as snap point so that we can easily resize to the default size

* ensure that the live preview panel border only appears when not displayed at full width (mobile)

* Run formatter

* Add changeset

* fix search input for mobile (#26331)

* prevent submissions when pending tool call

* AI ← Improve input focusing (#26334)

* Focus on textarea when clicking within ai-input

* Use text cursor

* Fix cursor when disabled

* fix max-width issue of search input on mobile (#26339)

* AI ← A11y adjustments for Skip Menu and headline elements (#26337)

* refactor SkipMenu usage so it appears next to its section

* refactor SkipMenu keys to match section ID naming

* ensure that sections accessed via the skip menu expand properly if they are collapsed

* adjust the SkipMenu min-width to match the sidebar min-width

* update tests

* fix focus styles for headline elements

* adjust positioning for mobile skip menu inside module navigation

* add dynamic id binding to module navigation content for improved accessibility

* Update app/src/views/private/components/skip-menu.vue

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix line-height in type-title mixin (#26341)

* AI <- Hot Last Minute Quick Fixes (#26332)

* close inline nav on route change

* fix activator warnings

* Update app/src/views/private/private-view/stores/nav-bar.ts

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* pull in sidebar store

---------

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* AI Chat <- Clears Messages and Settings on Sign Out (#26342)

* clear messages and settings on signout

* Add test coverage for AI store dehydrate function (#26343)

* Initial plan

* Add test coverage for dehydrate function in AI store

Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com>

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com>

* Update .changeset/short-lamps-hunt.md

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Add AI Telemetry (#26347)

* Add AI-related fields to telemetry

* Include AI-related fields in tests

* Use AI suggestion

---------

Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com>
Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
Co-authored-by: Nitwel <mail@nitwel.de>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com>
Co-authored-by: Alex Gaillard <alex@directus.io>
Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Gerard Lamusse <gerardlamo@gmail.com>
Co-authored-by: bryantgillespie <hey@bryantgillespie.com>
Co-authored-by: Florian C. Wachmann <dev@formfcw.com>
Co-authored-by: Connor Winston <connor@winston.guru>
2025-12-09 13:36:32 -05:00
Brainslug
278e7d9f4a Marketplace extension file synchronization (#26192)
* inintial sync logic update

* fixed file removal

* removed old checksum tests

* make reloads blocking

* fix deletion of folders

* move status utils into the sync folder

* extract logic out to a manager class

* some uber basic tests for status utilities

* over engineer it less

* clean up some code

* fix debug logs

* prettier

* fix status file deadlock

* remove obsolete forceSync

* WIP partial syncing

* checking for existing remote folders isnt reliable

* catch non existed folder error

* re-introduce delete only escape

* force sync on startup

* clean up some code

* extracting some utility functions

* extract path creation and address some sanitization

* resolve user provided data when installing

* extracted some more utils for readability

* updated status tests

* added basic utility tests

* fix tests hanging in an infinte loop

* added tests for the file tracker

* prettier

* added changeset

* attempted some sync.ts tests

* removed debug lock clearing

* fix supabase driver stat function for nested folders

* normalize the remote paths to fix windows path separators

* fixed cloudinary path normalization and fixes sub folder listing

* fix updated list call tests

* updated cloudinary tests

* updated changeset

* revert cloudinary changes

* re-add normalization of windows paths

* skip sync for the installing instance

* fixed path joining tests

---------

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
2025-12-09 08:22:34 -05:00
daedalus
b5b80b78b8 Move fetchRolesTree,fetchGlobalAccess, fetchGlobalAccessForUser and fetchGlobalAccessForRoles to the public utility package (#26248)
* move ipinnetworks to utils package

* extract fetchRolesTree to utils

* extract fetchGlobalAccess to utils

* add changeset

* Fix tests

* Fix tests again

* Add support for withCache to use any params for memoization

* add basic withCache tests

* Simplify interfaces

* Update relevent tests

* Ensure no attempt to memoize not stringifiable  data

* Improve function comments

* Update api/src/permissions/utils/with-cache.ts

Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>

* Update api/src/permissions/utils/with-cache.ts

Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>

* Update .changeset/silver-steaks-tease.md

* Update packages/utils/node/fetch-roles-tree.ts

---------

Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
Co-authored-by: Alex Gaillard <alex@directus.io>
2025-11-26 13:10:52 -05:00
ian
15276cd55c Release 11.13.3 (#26225)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-19 11:44:19 -05:00
daedalus
b5aff1a1bd Fix aliases on GQL M2A filters (#26148)
* account for aliases in m2a replacement

* move tests under their own describe

* account for deep alias

* add tests

* add changeset
2025-11-17 11:17:56 -05:00
Gaetan SENN
ee30132778 Add support for CSV files export in UTF-8 encoding (Excel format) (#26177)
* feat: add utf8 csv support

* build: add changeset
2025-11-14 17:19:21 +08:00
ian
f636050870 Release 11.13.1 (#26143)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-07 13:07:48 -05:00
Nitwel
d0800c54ef Fix system owner interface behaving unexpectedly (#26132)
* fix system owner interface behaving unexpectedly

* add changeset

* Reset drawer value on close and clear setup org

* Rename allowSave to isSaveAllowed

---------

Co-authored-by: Alex Gaillard <alex@directus.io>
2025-11-06 19:19:33 +00:00
ian
79b0648d4f Release 11.13.0 (#26114)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-04 20:14:16 +00:00
Florian C. Wachmann
4ade8c6e4f Add comparison indicators for group interfaces (#26086)
* basic layout

* styling

* add metadata to version heading

* rename version-promote-drawer to comparison-modal

* styling and fields edited count

* Select all checkbox

* remove css no longer being used

* add border below the version headers

* rework css and class naming

* extract header component

* add checkbox to interfaces

* only show checkboxes next to fields in the version

* create a diff between version and main, as a version can include fields with values that match those on main

* simplify diff

* green and red color indicators

* refactor to pass down object instead of several props

* responsive styling

* changeset

* lint changes

* remove redundant types and unneeded defaults

* move computed vars and methods into composable

* incorporate revisions into content comparison modal

* get checkboxes to work with revisions

* refactor

* separate normalizer into its own util

* refactor to use new normalizer

* delta selector

* consolidate and cleanup

* simplify tests

* add versions to selectableDeltas for consistency

* more refactoring - normalize more data to allow the modal to get it from the same places

* the latest tag should only show up if the base is showing the latest state of the current version

* tests and small refactor

* remove dead code from earlier refactor

* fix bug with latest tag for version

* use consistent terminology for comparison sides

* cleanup

* add translations

* put toggleComparison inside comparison context object

* remove data attrs

* cleanup

* copmarison-specific breakpoints

* Update .changeset/free-trains-clap.md

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* checkbox styles

* loading state

* change terminology for left and right sides

* change revision revert to promote

* remove legacy revisions code

* use subdued foreground color for unchecked checkbox

* Update app/src/modules/content/components/comparison-modal.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/components/comparison-header.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/components/comparison-header.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/components/comparison-header.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/components/comparison-header.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/components/comparison-header.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* updates

* updates

* keep full width fields until 1330px

* updates

* more feedback updates

* feedback updates

* remove latest tag feature

* change sides to base and incoming to avoid confusion with version comparison api response

* adjust tests

* style tweaks

* change title of left side back to Main

* use the term Latest in place of the date on left side of comparison

* calculate updated fields for revisions list

* label first revision in drawer as Latest

* Show hidden fields in comparison view (#25878)

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Apply suggestions from code review

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Update app/src/modules/content/components/comparison-modal.vue

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* use new translations

* Refine comparison component styles and structure (#25897)

* apply margin only to comparison checkbox

* update comparison padding values according to the design

* remove unnecessary wrapper from the title

* simplify meta-content structure and remove dropdown class

* ensure meta selection text always aligns left/start

* add hover style for dropdown

* adjust focus ring offset of dropdown button

* adjust dropdown option styling

* reuse delta option time and user extraction logic

* simplify vertical divider

* Use "Latest" instead of "Created"

* fix issue causing field count differences

* filter out read-only fields after api call

* add debug button to help investigate any issues with the diff

* do not allow fields that do not exist in the collection itself

* fix tests

* remove more legacy code

* rename revisions-drawer-detail to revisions-sidebar-detail

* Prevent empty fields when trying to promote a version that has not diverged from main

* Refine comparison style (#25904)

* simplify grid adjustments for comparison forms

* improve field label responsiveness

* add intermediate breakpoint for the column width

* update header height according to design

* fix responsiveness of comparison header

* adjust padding for meta text in comparison header according to design

* improve responsiveness and text-overflow for comparison header

* remove extra flex-wrap property

---------

Co-authored-by: Rob Luton <rob.luton@gmail.com>

* change terminology from "udpated" to "differences"

* do not allow click event on latest revision

* do not include latest revision in comparison dropdown

* Revision Updates (#25954)

Co-authored-by: formfcw <dev@formfcw.com>

* Apply suggestions from code review

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* Revision diff bug fixes (#25969)

* Apply suggestions from code review

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* more updates from code review

* deal with revisionId and versionId type mismatch

* add translations

* Apply suggestions from code review

Co-authored-by: Florian C. Wachmann <dev@formfcw.com>

* skip auto date fields

* for revisions, use related values from main so the form is consistent

* use correct endpoints for system collections

* use new translation

* fix type issue

* ignore primary key fields and user-created and user-updated fields for comparisons

* fix count issue between revision list and modal

* skip primary key fields for version promotion

* Comparison < Updates (#25991)

* simplify props usage in revisions-date-group component

* simplify field retrieval

* make array merge customizer reusable

* use existing isSystemCollection function and sort imports

* streamline comparison logic and enhance readability

* simplify currentVersion handling in comparison data normalization *

* simplify revisions handling in comparison data normalization *

* simplify versions handling in comparison data normalization *

* simplify system collection check

* replace getSystemCollectionEndpoint with existing getEndpoint function

* simplify item endpoint retrieval in useRevisions and remove isSystemCollection check

* remove unnecessary export keywords

* remove unused ComparisonSide type and related constants

* rename copyRelationalFieldsFromBaseToIncoming to copySpecialFieldsFromBaseToIncoming for clarity

* remove comment

* update css var for clarity

* use formatTitle for version key for human-readable titles

* improve footer responsiveness

* simplify item fetching logic in useComparison (#25993)

* Comparison < Updated Fields Indication (#26011)

* add updated fields indication

* update badge class for v-chip and adjust import order

* update translation for revision messages for clarity

* improve responsiveness of field label (#26015)

* Comparison < fix merge bug (#26017)

* fix merge bug

* add tests

* refactor: move getFieldsWithDifferences test into utils test file

* refactor: rename mergeMissingMainItemKeysIntoRevision to mergeMainItemKeysIntoRevision

* refactor buildRevisionComparison logic

* Comparison < sidebar updates (#26042)

* squash commit robl/sidebar-updates

* (re-)use existing i18n key

* remove unused isFirstGroup prop

* remove unused computeDifferentFields function and lodash mergeWith import

* refactor: move getItemEndpoint function into useComparison and restore import

* refactor: remove unused mergeMainItemKeysIntoRevision function

* refactor: remove unnecessary differentFields from revision data structure

* improve field comparison logic and enhance revision handling

* Comparison < Updates 27/1 (#26054)

* drill down comparisonActive prop instead of recalculating

* remove debug mode

* Ensure NormalizedItem gets correct user for the base side

* Refactor to use type PrimaryKey instead of `string | number`

* refactor to require collection parameter

* rename normalizeComparisonData to getNormalizedComparisonData for clarity

* add mainVersionMeta to ComparisonData to get activity information of latest main

* refactor user fetching logic for clarity

* Comparison ← refactor, clean up and small fixes (#26063)

* use a different tooltip for the updated badge when the field auto-populates

* refactor: move data fetching logic to the modal component

* refactor: remove comparison-utils and reorganize utility functions

- Deleted the comparison-utils and moved relevant functions to new utility files and the use-comparison composable
- Refactored use-comparison composable to utilize the utility functions
- Added new field-utils for field-related checks (e.g., isPrimaryKey, isRelational)
- Added new get-revision-fields utility to handle revision field filtering logic
- Added new get-version-display-name utility for version display name formatting

* refactor: move files comparison-header.vue, comparison-modal.vue, use-comparison.ts and use-comparison.test.ts to @/views/private/components/comparison

* refactor: move type definitions to types.ts and update imports in use-comparison.ts

* refactor: rename main to base and current to incoming

* fix types by preventing renaming when newVersionKey is null

* add comparisonIndicator prop for FormField and InterfaceConfig

* update comparisonIndicator default value based on whether the field is a group

* move comparison indicator classes/logic to v-form so that they can be applied to groups as well

* refactor to reuse first visible field class logic

* update condition to show label always in comparison mode

* add background color for comparison track in base and incoming forms

* add comparison indicator mixin and update styles

* add comparison indicators for the group detail interface

* ensure smooth animation of the accordion

* add comparison indicators for the accordion interface

* rename comparisonIndicator values to on | off | guide

* refactor: rename track to guide

* add changesets

* update tests

* add test cases for comparisonIndicator behavior in group fields

* add tests for GroupDetail component comparison indicator behavior

* refactor: rename comparisonIndicator to indicatorStyle with the values active | hidden | muted

* add tests for GroupDetail component containing the edited class when having edits

* fix type errors

* remove unused comparisonType prop from comparison form components

---------

Co-authored-by: Rob Luton <rob.luton@gmail.com>
2025-11-04 12:08:16 -05:00
Nitwel
552d14f486 Add setup flow and license agreement banner 🧑‍⚖️ (#25983)
* add setup flow and drawer for editing owner

* add popup on setup instance and cookie to dismiss

* fix editing product owner

* add env variable and organize code

* small fix

* don't generate creds when bootstrapping

* fix types

* cleanup

* fmt

* fix router test

* insert project owner on migrate and move email regex into constants

* improve editing experience

* fix input password

* add email validation to other forms

* update setup, make form hide menu, persist usage and co.

* fmt

* Fix rename

* Use boolean-ish name

* change names and cleanup migrations

* cleanup logger

* add project id to owner report

* fix building

* Prefix usage translation keys

* Update translations
changes could be tidied up to reduce duplication depending on requirements

* Tighten up gaps

* Rename for consistency

* add retries when sending fails

* add utm-location prop

* remove email regex and other fixes

* fix ts

* utilize same sendReport function

* small tweaks

* add form validation

* cleanup

* cleanup

* temp commit

* finish polishing

* update pnpm-lock

* fmt

* small fixes

* add changeset

* improve owner interface, vue form and hopefuly last cleanups

* emit changed value again

* Update .changeset/quick-seals-add.md

Co-authored-by: ian <licitdev@gmail.com>

* Use past tense

* Fix lint warnings

* fix form field label and system owner product_updates

* rename email to product_owner

* fix rename email to project owner

* fix tests

* fix rename

* fix app tests

* Update api/src/controllers/server.ts

Co-authored-by: ian <licitdev@gmail.com>

---------

Co-authored-by: ian <licitdev@gmail.com>
2025-11-04 12:02:18 -05:00
Brainslug
6312231c82 Add retention indexes (#25199)
* Added isSystemField helper

* Add some joi validation

* Fixed error list mapping

* merge edited system fields

* prettier

* updated merging logic

* Create rude-walls-add.md

* Removed silly unneeded merging logic

* Block creating a database record for system table

* removed obsolete filtering

* Added same check for graphql mutations

* fixed merge conflicts

* fixed incorrect collection usage in bulk update

* Add bb tests

* throw all errors for batch updates

* add early return/abort

* Fix graphql updateField

* return single error for graphql

* Adding system indexes to the system-data package

* Add system indexes to get-snapshot

* WIP adding indexes to schema diff

* WIP snapshot diffing system fields

* basic diffing

* WIP applying systemFields

* first working system field snapshot apply

* address some of the broken tests

* ran prettier

* ran eslint

* fixed remaining unit tests

* include snapshot type in bb test

* removed comment

* Add systemfields to cli output

* fixed bug in diffing

* fixed sorting systemFields

* simplified mapping

* removed temprorary index definition

* added diff validation

* fix validation strictness

* Add expected index definitions

* WIP index creation

* WIP index migration

* mssql enterprise concurrent constraint support

* Oracle concurrent indexes seem widely supported

* Added basic index fallback

* remove fallback for postgres

* Fix mysql index creation

* refactor create index function

* Side step knex for index creation

* support creating unique indexes concurrently

* fix unique index naming

* avoid knex for creating indexes and only alter column if something has changed

* remove failed optimization

* allow for unique indexes

* quick n dirty check for system collections

* explicit boolean casting

* add unique index test

* use zod instead of joi

* prettier

* undo scope creep

* undo unique scope creep

* passing down the concurrent toggle

* small cleanup

* added missing fallback

* prevent injection with bindings

* removed unused imports

* use old behavior as default

* add concurrent bb test

* Create warm-chefs-draw.md

* passthrough collection creation with fields

* update rest controllers

* Add concurrent option to graphql resolvers

* make sure old snapshots can be force applied

* fixed missed rename

* Update api/src/utils/get-snapshot-diff.ts

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>

* Update api/src/utils/get-snapshot-diff.ts

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>

* updated gql error formatting

* Fix accidental diff duplication

* rename to FieldMutationOptions

* skip unneeded db call

* simplify mysql index fallback

* fixed boolean check

* EXPERIMENT test if we get the BB error back

* updated query param bool logic

* Revert "EXPERIMENT test if we get the BB error back"

This reverts commit d145437a51.

* renamed to `attemptConcurrentIndex`

* fix merge errror

* fix merge

* missed type

* Add missing fields update implementations (#25331)

* Add support for concurrentIndexCreation in the SDK

* Add update_fields_items resolver

* Add concurrentIndex option the SDK createField command

* add changeset

* updated changeset

* format

* fixed duplicate function

* added test for missing systemfields in snapshot

* prefer the "test" function over "it"

* add tests for get-snapshot-diff

* prettier

* add tests for get-snapshot

* removed unused imports

* added sanitize schema tests

* add validate-diff tests

* added validate-snapshot tests

* added tests to the system-data package

* added tests for the system collections

* add apply-diff tests

* add tests for the collections controller

* added sql dialect tests

* prettier

* extra get-snapshot-diff tests

* export apply functions for testing

* add tests for the cli apply function

* prettier

* add correct migration date

* add changeset

* format

* more formatting

* add await

* add comment

* undo await

* remove async from addColumnToTable

* prettier

* account for existing primary key

* ensure trx is passed down

* Move indexes outside trx's

* make sure the old code path is taken by default

* remove additional cast

* simplified object access and merged if statements

* catch index error

* allow for both indexes

* directly use variable

* prettier

* dont hide potential errors

* remove unused import

* initial vibe coded service tests

* extract some shared mocking functions

* extract cache mocking

* extract emitter mocking

* extract ItemsService mocking

* extracted more knex helpers

* track all the system crud operations in the mock

* more comprehensive knex mocks

* extract the transaction mock

* fix knex mock

* update mock itemsService usage

* update naming

* rename schemabuilder

* comment out unused knex functions

* WIP service tests

* prettier

* added missing tests for the addColumnIndex function

* renamed __mocks__ folder to __test-utils__ so it doesnt automatically get picked up  by vitest

* remove underscores from test utils folder

---------

Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
2025-10-31 15:18:33 -04:00
Jordan Phillips
f133888fcd Add field-level searchable option to improve search performance (#25970)
* perf: use debounce + synchronize items and count queries with debounce

* feat: add field-level searchable field + metadata

* chore: accept CLA

* chore: prettier

* test: update schema-builder snapshots

* test: fix failing tests

* fix: use toBoolean for boolean field properties

* refactor: add SEARCHABLE_TYPES as a const in @directus/constants

* style: prettier

* build: add changeset

* build: add missing package

---------

Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com>
2025-10-30 16:38:38 -04:00
Brainslug
d6c4e23f53 Add support for indexes on system fields to snapshots (#25127)
* Added isSystemField helper

* Add some joi validation

* Fixed error list mapping

* merge edited system fields

* prettier

* updated merging logic

* Create rude-walls-add.md

* Removed silly unneeded merging logic

* Block creating a database record for system table

* removed obsolete filtering

* Added same check for graphql mutations

* fixed merge conflicts

* fixed incorrect collection usage in bulk update

* Add bb tests

* throw all errors for batch updates

* add early return/abort

* Fix graphql updateField

* return single error for graphql

* Adding system indexes to the system-data package

* Add system indexes to get-snapshot

* WIP adding indexes to schema diff

* WIP snapshot diffing system fields

* basic diffing

* WIP applying systemFields

* first working system field snapshot apply

* address some of the broken tests

* ran prettier

* ran eslint

* fixed remaining unit tests

* include snapshot type in bb test

* removed comment

* Add systemfields to cli output

* fixed bug in diffing

* fixed sorting systemFields

* simplified mapping

* removed temprorary index definition

* added diff validation

* fix validation strictness

* allow for unique indexes

* quick n dirty check for system collections

* explicit boolean casting

* add unique index test

* use zod instead of joi

* prettier

* undo scope creep

* undo unique scope creep

* Create warm-chefs-draw.md

* make sure old snapshots can be force applied

* Update api/src/utils/get-snapshot-diff.ts

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>

* Update api/src/utils/get-snapshot-diff.ts

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>

* updated gql error formatting

* Fix accidental diff duplication

* fix merge errror

* fix merge

* updated changeset

* format

* fixed duplicate function

* added test for missing systemfields in snapshot

* prefer the "test" function over "it"

* add tests for get-snapshot-diff

* prettier

* add tests for get-snapshot

* removed unused imports

* added sanitize schema tests

* add validate-diff tests

* added validate-snapshot tests

* added tests to the system-data package

* added tests for the system collections

* add apply-diff tests

* extra get-snapshot-diff tests

* export apply functions for testing

* add tests for the cli apply function

* prettier

---------

Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
2025-10-28 21:47:12 -04:00
Brainslug
cacb71c8bd Add rate limiting options for sending emails (#25966)
* experiment mail queue

* moved rate limiter to own file

* defined env variables

* shortened env var names

* added a flow specific rate limiter

* Update packages/env/src/constants/defaults.ts

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>

* Fix formatting

* updated test

* Update api/src/services/mail/rate-limiter.ts

Co-authored-by: ian <licitdev@gmail.com>

* updated name

* updated getter pattern

* added some error handling

* removed obsolete variable regexes

* prettier

* move error handling to the rate limiter file

* created new email limit error

* commit suggestion

* update error and export it

* use proper error checking and use new error

* fixed error catching

* updated default msg

* convert seconds to milliseconds

* updated default msg

* updated default msg

* fixed bad copy paste

* check for plural naming in the error

* check for plural naming in the error

* initial mail rate limiter tests

* added test for the other rate limiter

* prettier

* added changeset

* added missing packages

* updated naming

* prettier

* added error tests

---------

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
Co-authored-by: ian <licitdev@gmail.com>
2025-10-22 13:52:21 -04:00
Florian C. Wachmann
50aad8f252 Remove non-relational types from RELATIONAL_TYPES constant (#25964)
Co-authored-by: ian <licitdev@gmail.com>
2025-10-10 15:50:00 +02:00
ian
17665bf348 Release 11.12.0 (#25850)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-16 19:42:40 +00:00
Florian C. Wachmann
5bdf3e6ed1 Add cache-busting to image asset URLs in the studio (#25833)
* refactor getAssetUrl() util to enhance parameter handling for consistency

* add tests

* refactor: update getAssetUrl calls to use object parameter for isDownload option

* refactor: update getAssetUrl calls to use object parameter

* refactor and add modified date to the File Display asset URL

* refactor and add modified date to the Image Display asset URL

* refactor and add modified date to the User Display asset URL

* add cache buster to File Interface and update to use refactored getAssetUrl()

* add cache buster to User View and update to use refactored getAssetUrl()

* add cache buster to Comment Input and update to use refactored getAssetUrl()

* add cache buster to Comment Header and update to use refactored getAssetUrl()

* add cache buster to Module Bar Avatar and update to use refactored getAssetUrl()

* add cache buster to User Popover and update to use refactored getAssetUrl()

* make value prop optional in File component

* simplify getAssetUrl call in customLogoPath

* add optional modified_on field to Avatar type

* add changeset

* add avatar fields to user item query

* add modified_on field to user avatar in loadUsers API call

* add avatar.modified_on field to user fetch API call

* add modified_on field to user_created.avatar in useComments function to provide the field in <comment-item-header>

* add hydration for avatar.modified_on field in module-bar-avatar component

* add modified_on field to file query and update image thumbnail computed
2025-09-15 16:07:19 -04:00
Nitwel
89cd877560 Fix USER_CREATED, USER_UPDATED, DATE_CREATED, and DATE_UPDATED values in content versioning (#25744)
* initial testing

* bypass accountability and fix error

* continue implementing new content versioning

* fix versionRaw and tweak post nulling

* fix circular references

* improve deep-map and add testing

* add blackbox tests

* add load tests

* update loadtests

* update testsuite

* update load-tests

* undo package.json change

* add way to run everything in parallel

* add github actions

* fix gh action

* improve logging and add wait

* update runners and fmt

* cleanup

* add deadlock tests

* fix deadlock tests for oracle and mssql

* cleanup

* shorten transaction duration

* add web preview option to load tests

* fix lockfile

* fix import for QueryOptions

* format

* use admin for versioned writes

* Fix workflow permissions warning

* move loadtests to separate branch

* fix admin on read

* fix another bug

* update pnpm lock

* fix gql read one

* fix requesting version in gql

* rename bypassAccountability to skipTracking

* not filter default value fields

* content versioning processing values properly

* fix prepareDelta

* continue trying out approaches for inserting user and date defaults

* first final iteration of cv defaulting

* update tests

* stupid mistake fix

* always use overwriteDefaults if present

* fix building and o2m

* map delta to include default values

* fix for promotion

* fix 2 small bugs

* fix promoting

* cleanup

* fmt

* fix and improve tests

* final tweaks

* Update pnpm-lock.yaml

* Apply suggestion from @ComfortablyCoding

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>

* Remove additional --- in changeset

---------

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: Alex Gaillard <alex@directus.io>
2025-09-15 14:32:14 -04:00
Alex Gaillard
f55913653b Release 11.11.0 (#25765) 2025-08-27 18:04:33 +00:00
Nitwel
ea31721914 Improve Content Versioning (#25437)
* initial testing

* bypass accountability and fix error

* continue implementing new content versioning

* fix versionRaw and tweak post nulling

* fix circular references

* improve deep-map and add testing

* add blackbox tests

* add load tests

* update loadtests

* update testsuite

* update load-tests

* undo package.json change

* add way to run everything in parallel

* add github actions

* fix gh action

* improve logging and add wait

* update runners and fmt

* cleanup

* add deadlock tests

* fix deadlock tests for oracle and mssql

* cleanup

* shorten transaction duration

* add web preview option to load tests

* fix lockfile

* fix import for QueryOptions

* format

* use admin for versioned writes

* Fix workflow permissions warning

* move loadtests to separate branch

* fix admin on read

* fix another bug

* update pnpm lock

* fix gql read one

* fix requesting version in gql

* rename bypassAccountability to skipTracking

* not filter default value fields

* update tests

* stupid mistake fix

* fix gql *_by_version

* Create great-experts-clap.md

* Revert "fix gql *_by_version"

This reverts commit 82bf7239e8.

* Update .changeset/great-experts-clap.md

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>

* Update .changeset/great-experts-clap.md

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>

* Update great-experts-clap.md

---------

Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com>
Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: Alex Gaillard <alex@directus.io>
2025-08-27 13:25:21 -04:00