From 9b4302c47ce733873ad351b53abd64ca475c5040 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Wed, 6 Nov 2024 16:47:23 -0500 Subject: [PATCH] [5.x] Extra values for entry field conditions, including depth (#11080) --- resources/js/components/entries/BaseCreateForm.vue | 2 ++ resources/js/components/entries/PublishForm.vue | 5 +++++ resources/js/components/publish/Container.vue | 14 ++++++++++++++ resources/views/entries/create.blade.php | 1 + resources/views/entries/edit.blade.php | 1 + src/Fieldtypes/Entries.php | 1 + .../CP/Collections/EntriesController.php | 9 +++++++-- .../CP/Collections/ExtractsFromEntryFields.php | 6 +++++- 8 files changed, 36 insertions(+), 3 deletions(-) diff --git a/resources/js/components/entries/BaseCreateForm.vue b/resources/js/components/entries/BaseCreateForm.vue index d2594cca09..7970232f62 100644 --- a/resources/js/components/entries/BaseCreateForm.vue +++ b/resources/js/components/entries/BaseCreateForm.vue @@ -10,6 +10,7 @@ :collection-has-routes="collectionHasRoutes" :initial-fieldset="fieldset" :initial-values="values" + :initial-extra-values="extraValues" :initial-meta="meta" :initial-localizations="localizations" :initial-has-origin="false" @@ -37,6 +38,7 @@ export default { 'collectionHasRoutes', 'fieldset', 'values', + 'extraValues', 'meta', 'localizations', 'revisions', diff --git a/resources/js/components/entries/PublishForm.vue b/resources/js/components/entries/PublishForm.vue index 0c8dd19a53..2f8d0b9d53 100644 --- a/resources/js/components/entries/PublishForm.vue +++ b/resources/js/components/entries/PublishForm.vue @@ -68,6 +68,7 @@ :name="publishContainer" :blueprint="fieldset" :values="values" + :extra-values="extraValues" :reference="initialReference" :meta="meta" :errors="errors" @@ -335,6 +336,7 @@ export default { initialReference: String, initialFieldset: Object, initialValues: Object, + initialExtraValues: Object, initialMeta: Object, initialTitle: String, initialLocalizations: Array, @@ -375,6 +377,7 @@ export default { title: this.initialTitle, values: _.clone(this.initialValues), meta: _.clone(this.initialMeta), + extraValues: _.clone(this.initialExtraValues), localizations: _.clone(this.initialLocalizations), localizedFields: this.initialLocalizedFields, hasOrigin: this.initialHasOrigin, @@ -606,6 +609,7 @@ export default { clearTimeout(this.trackDirtyStateTimeout) this.trackDirtyState = false this.values = this.resetValuesFromResponse(response.data.data.values); + this.extraValues = response.data.data.extraValues; this.trackDirtyStateTimeout = setTimeout(() => (this.trackDirtyState = true), 500) this.$nextTick(() => this.$emit('saved', response)); return; @@ -630,6 +634,7 @@ export default { clearTimeout(this.trackDirtyStateTimeout); this.trackDirtyState = false; this.values = this.resetValuesFromResponse(response.data.data.values); + this.extraValues = response.data.data.extraValues; this.trackDirtyStateTimeout = setTimeout(() => (this.trackDirtyState = true), 500); this.initialPublished = response.data.data.published; this.activeLocalization.published = response.data.data.published; diff --git a/resources/js/components/publish/Container.vue b/resources/js/components/publish/Container.vue index 5429ac5206..c02f4d45de 100644 --- a/resources/js/components/publish/Container.vue +++ b/resources/js/components/publish/Container.vue @@ -124,6 +124,9 @@ export default { setValues(state, values) { state.values = values; }, + setExtraValues(state, values) { + state.extraValues = values; + }, setHiddenField(state, field) { state.hiddenFields[field.dottedKey] = { hidden: field.hidden, @@ -211,6 +214,9 @@ export default { context.commit('setValues', payload); vm.emitUpdatedEvent(context.state.values); }, + setExtraValues(context, payload) { + context.commit('setExtraValues', payload); + }, setMeta(context, payload) { context.commit('setMeta', payload); } @@ -276,6 +282,14 @@ export default { } }, + extraValues: { + deep: true, + handler(after, before) { + if (_.isEqual(before, after)) return; + this.$store.commit(`publish/${this.name}/setExtraValues`, after); + } + }, + meta: { deep: true, handler(after, before) { diff --git a/resources/views/entries/create.blade.php b/resources/views/entries/create.blade.php index 580ea377a2..8f7392289e 100644 --- a/resources/views/entries/create.blade.php +++ b/resources/views/entries/create.blade.php @@ -10,6 +10,7 @@ :collection-has-routes="{{ Statamic\Support\Str::bool($collectionHasRoutes) }}" :fieldset="{{ json_encode($blueprint) }}" :values="{{ json_encode($values) }}" + :extra-values="{{ json_encode($extraValues) }}" :meta="{{ json_encode($meta) }}" :published="{{ json_encode($published) }}" :localizations="{{ json_encode($localizations) }}" diff --git a/resources/views/entries/edit.blade.php b/resources/views/entries/edit.blade.php index ee8cae9e06..29b74f3ae4 100644 --- a/resources/views/entries/edit.blade.php +++ b/resources/views/entries/edit.blade.php @@ -15,6 +15,7 @@ initial-reference="{{ $reference }}" :initial-fieldset="{{ json_encode($blueprint) }}" :initial-values="{{ json_encode($values) }}" + :initial-extra-values="{{ json_encode($extraValues) }}" :initial-localized-fields="{{ json_encode($localizedFields) }}" :initial-meta="{{ json_encode($meta) }}" initial-permalink="{{ $permalink }}" diff --git a/src/Fieldtypes/Entries.php b/src/Fieldtypes/Entries.php index cae2ffc025..b51f0706ce 100644 --- a/src/Fieldtypes/Entries.php +++ b/src/Fieldtypes/Entries.php @@ -46,6 +46,7 @@ class Entries extends Relationship 'initialReference' => 'reference', 'initialFieldset' => 'blueprint', 'initialValues' => 'values', + 'initialExtraValues' => 'extraValues', 'initialLocalizedFields' => 'localizedFields', 'initialMeta' => 'meta', 'initialPermalink' => 'permalink', diff --git a/src/Http/Controllers/CP/Collections/EntriesController.php b/src/Http/Controllers/CP/Collections/EntriesController.php index 0b412664d1..08921a71e1 100644 --- a/src/Http/Controllers/CP/Collections/EntriesController.php +++ b/src/Http/Controllers/CP/Collections/EntriesController.php @@ -101,7 +101,7 @@ public function edit(Request $request, $collection, $entry) $blueprint->ensureFieldHasConfig('author', ['visibility' => 'read_only']); } - [$values, $meta] = $this->extractFromFields($entry, $blueprint); + [$values, $meta, $extraValues] = $this->extractFromFields($entry, $blueprint); if ($hasOrigin = $entry->hasOrigin()) { [$originValues, $originMeta] = $this->extractFromFields($entry->origin(), $blueprint); @@ -121,6 +121,7 @@ public function edit(Request $request, $collection, $entry) 'editBlueprint' => cp_route('collections.blueprints.edit', [$collection, $blueprint]), ], 'values' => array_merge($values, ['id' => $entry->id()]), + 'extraValues' => $extraValues, 'meta' => $meta, 'collection' => $collection->handle(), 'collectionHasRoutes' => ! is_null($collection->route($entry->locale())), @@ -270,11 +271,12 @@ public function update(Request $request, $collection, $entry) $saved = $entry->updateLastModified(User::current())->save(); } - [$values] = $this->extractFromFields($entry, $blueprint); + [$values, $meta, $extraValues] = $this->extractFromFields($entry, $blueprint); return [ 'data' => array_merge((new EntryResource($entry->fresh()))->resolve()['data'], [ 'values' => $values, + 'extraValues' => $extraValues, ]), 'saved' => $saved, ]; @@ -321,6 +323,9 @@ public function create(Request $request, $collection, $site) 'save' => cp_route('collections.entries.store', [$collection->handle(), $site->handle()]), ], 'values' => $values->all(), + 'extraValues' => [ + 'depth' => 1, + ], 'meta' => $fields->meta(), 'collection' => $collection->handle(), 'collectionCreateLabel' => $collection->createLabel(), diff --git a/src/Http/Controllers/CP/Collections/ExtractsFromEntryFields.php b/src/Http/Controllers/CP/Collections/ExtractsFromEntryFields.php index 114b7eaecf..e196ada88a 100644 --- a/src/Http/Controllers/CP/Collections/ExtractsFromEntryFields.php +++ b/src/Http/Controllers/CP/Collections/ExtractsFromEntryFields.php @@ -41,6 +41,10 @@ protected function extractFromFields($entry, $blueprint) 'published' => $entry->published(), ]); - return [$values->all(), $fields->meta()]; + $extraValues = [ + 'depth' => $entry->page()?->depth(), + ]; + + return [$values->all(), $fields->meta(), $extraValues]; } }