From c676ae5c021cc5cfa9782d6eda527b2ba3a43da9 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Tue, 17 Feb 2026 17:15:58 +0100 Subject: [PATCH 1/7] Focus and blur events and user avatar for collaboration addon --- resources/js/components/ui/Publish/Field.vue | 39 +++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/resources/js/components/ui/Publish/Field.vue b/resources/js/components/ui/Publish/Field.vue index 2f94dbe7345..46f8fecfc4b 100644 --- a/resources/js/components/ui/Publish/Field.vue +++ b/resources/js/components/ui/Publish/Field.vue @@ -1,5 +1,5 @@ From a42582415f97a0167be0992d6560b5c8962f874a Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Wed, 15 Apr 2026 11:15:15 -0400 Subject: [PATCH 4/7] fix tests --- resources/js/tests/FieldConditionsValidator.test.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/js/tests/FieldConditionsValidator.test.js b/resources/js/tests/FieldConditionsValidator.test.js index 4b7e16f57ea..d3db54895a0 100644 --- a/resources/js/tests/FieldConditionsValidator.test.js +++ b/resources/js/tests/FieldConditionsValidator.test.js @@ -26,6 +26,9 @@ const Statamic = { $dirty: { add: () => {}, }, + $events: { + $emit: () => {}, + }, }; window.Statamic = Statamic; window.__ = (msg) => msg; From b065b74e109aaedb37ea257f654437f5053511d5 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Wed, 15 Apr 2026 11:17:15 -0400 Subject: [PATCH 5/7] expose debounce util --- packages/cms/src/index.js | 1 + resources/js/bootstrap/cms/core.js | 1 + resources/js/tests/Package.test.js | 1 + 3 files changed, 3 insertions(+) diff --git a/packages/cms/src/index.js b/packages/cms/src/index.js index eef9b728733..8b30e9f288b 100644 --- a/packages/cms/src/index.js +++ b/packages/cms/src/index.js @@ -19,6 +19,7 @@ export const { requireElevatedSession, requireElevatedSessionIf, clone, + debounce, deepClone, resetValuesFromResponse, } = __STATAMIC__.core; diff --git a/resources/js/bootstrap/cms/core.js b/resources/js/bootstrap/cms/core.js index e0fbd25b601..05070c7d6c8 100644 --- a/resources/js/bootstrap/cms/core.js +++ b/resources/js/bootstrap/cms/core.js @@ -18,3 +18,4 @@ export { default as HasActionsMixin } from '../../components/publish/HasActions. export { default as resetValuesFromResponse } from '../../util/resetValuesFromResponse.js'; export { requireElevatedSession, requireElevatedSessionIf } from '../../components/elevated-sessions'; export { default as clone, deepClone } from '../../util/clone.js'; +export { default as debounce } from '../../util/debounce.js'; diff --git a/resources/js/tests/Package.test.js b/resources/js/tests/Package.test.js index 7f454e718c7..552869b9b56 100644 --- a/resources/js/tests/Package.test.js +++ b/resources/js/tests/Package.test.js @@ -35,6 +35,7 @@ it('exports core', async () => { 'SaveButtonOptions', 'SortableList', 'clone', + 'debounce', 'deepClone', 'requireElevatedSession', 'requireElevatedSessionIf', From f7639cae130e551c2b7b0b4caff2cde7dd606ef7 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Wed, 15 Apr 2026 12:16:12 -0400 Subject: [PATCH 6/7] add and expose a way to set entire meta object at once --- resources/js/components/ui/Publish/Container.vue | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/resources/js/components/ui/Publish/Container.vue b/resources/js/components/ui/Publish/Container.vue index a8220aef6fc..66957edb909 100644 --- a/resources/js/components/ui/Publish/Container.vue +++ b/resources/js/components/ui/Publish/Container.vue @@ -210,6 +210,10 @@ function setFieldValue(path, value) { data_set(values.value, path, value); } +function setMeta(newMeta) { + meta.value = newMeta; +} + function setFieldMeta(path, value) { data_set(meta.value, path, value); } @@ -297,6 +301,7 @@ const builtInProvides = { isTrackingOriginValues: computed(() => !!props.originValues), setValues, setFieldValue, + setMeta, setFieldMeta, setFieldPreviewValue, setRevealerField, @@ -330,6 +335,9 @@ onMounted(() => { values, setFieldValue, setValues, + meta, + setMeta, + setFieldMeta, pushComponent, fieldFocus, focusField, @@ -353,6 +361,7 @@ defineExpose({ pushComponent, visibleValues, setValues, + setMeta, setExtraValues, }); From fe1245d2f63de7056447d5a11daede1667c8ec17 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Thu, 16 Apr 2026 14:55:13 -0400 Subject: [PATCH 7/7] emit update:meta so parent can v-model it Co-Authored-By: Claude Opus 4.6 (1M context) --- resources/js/components/ui/Publish/Container.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/resources/js/components/ui/Publish/Container.vue b/resources/js/components/ui/Publish/Container.vue index 66957edb909..11834fe0e08 100644 --- a/resources/js/components/ui/Publish/Container.vue +++ b/resources/js/components/ui/Publish/Container.vue @@ -12,7 +12,7 @@ import Tabs from './Tabs.vue'; import Values from '@/components/publish/Values.js'; import { data_get } from '@/bootstrap/globals.js'; -const emit = defineEmits(['update:modelValue', 'update:visibleValues', 'update:modifiedFields']); +const emit = defineEmits(['update:modelValue', 'update:visibleValues', 'update:modifiedFields', 'update:meta']); const props = defineProps({ name: { @@ -179,6 +179,12 @@ watch( { deep: true }, ); +watch( + meta, + (meta) => emit('update:meta', meta), + { deep: true }, +); + const avoidTrackingDirtyState = ref(false); const trackingDirtyState = computed(() => props.trackDirtyState && !avoidTrackingDirtyState.value) const isDirty = computed(() => Statamic.$dirty.has(props.name));