From e9d887c79089b6902f2afc6b8f0e9a174aa0d89c Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Thu, 21 Apr 2022 00:15:18 -0400 Subject: [PATCH 1/5] Track revealer field paths. --- resources/js/components/fieldtypes/RevealerFieldtype.vue | 6 ++++++ resources/js/components/publish/Container.vue | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/resources/js/components/fieldtypes/RevealerFieldtype.vue b/resources/js/components/fieldtypes/RevealerFieldtype.vue index cd7b9d62a55..156a5f6726c 100644 --- a/resources/js/components/fieldtypes/RevealerFieldtype.vue +++ b/resources/js/components/fieldtypes/RevealerFieldtype.vue @@ -25,6 +25,12 @@ export default { }, + inject: ['storeName'], + + mounted() { + this.$store.commit(`publish/${this.storeName}/setRevealerFields`, this.fieldPathPrefix || this.handle); + }, + methods: { reveal() { diff --git a/resources/js/components/publish/Container.vue b/resources/js/components/publish/Container.vue index 12fe9ff1cf4..c073b8b026c 100644 --- a/resources/js/components/publish/Container.vue +++ b/resources/js/components/publish/Container.vue @@ -98,6 +98,7 @@ export default { values: initial.values, hiddenFields: {}, jsonSubmittingFields: [], + revealerFields: [], meta: initial.meta, localizedFields: initial.localizedFields, site: initial.site, @@ -122,6 +123,11 @@ export default { state.jsonSubmittingFields.push(dottedKey); } }, + setRevealerFields(state, dottedKey) { + if (state.revealerFields.indexOf(dottedKey) === -1) { + state.revealerFields.push(dottedKey); + } + }, setMeta(state, meta) { state.meta = meta; }, From eb4657f46a664f9f1fd3acb1661de010d462407c Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Thu, 21 Apr 2022 00:16:33 -0400 Subject: [PATCH 2/5] Add `hasRevealerCondition()` logic to validator. --- .../components/field-conditions/Validator.js | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/resources/js/components/field-conditions/Validator.js b/resources/js/components/field-conditions/Validator.js index f227b89d471..d0e7dbbb2d2 100644 --- a/resources/js/components/field-conditions/Validator.js +++ b/resources/js/components/field-conditions/Validator.js @@ -260,4 +260,27 @@ export default class { return this.showOnPass ? passes : ! passes; } + + hasRevealerCondition(dottedPrefix) { + if (! this.store || ! this.storeName) { + return false; + } + + let conditions = this.getConditions(); + let revealerFields = data_get(this.store.state.publish[this.storeName], 'revealerFields', []); + + if (conditions === undefined || isString(conditions) || ! revealerFields.length) { + return false; + } + + let checkedFields = this.converter + .fromBlueprint(conditions, this.field.prefix) + .map(field => field.field); + + if (dottedPrefix) { + checkedFields = checkedFields.map(field => dottedPrefix + '.' + field); + } + + return intersection(checkedFields, revealerFields).length; + } } From 7f66a2eed27d4430163483ad4aefb2e0b8af7c77 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Thu, 21 Apr 2022 00:17:21 -0400 Subject: [PATCH 3/5] Expect `omitValue` boolean before running Omitter. --- resources/js/components/data-list/HasHiddenFields.js | 2 +- resources/js/components/publish/Container.vue | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/js/components/data-list/HasHiddenFields.js b/resources/js/components/data-list/HasHiddenFields.js index 8944bba13d4..85bc4c74815 100644 --- a/resources/js/components/data-list/HasHiddenFields.js +++ b/resources/js/components/data-list/HasHiddenFields.js @@ -14,7 +14,7 @@ export default { visibleValues() { let hiddenFields = _.chain(this.hiddenFields) - .pick(hidden => hidden) + .pick(field => field.hidden && field.omitValue) .keys() .value(); diff --git a/resources/js/components/publish/Container.vue b/resources/js/components/publish/Container.vue index c073b8b026c..f0369608ac5 100644 --- a/resources/js/components/publish/Container.vue +++ b/resources/js/components/publish/Container.vue @@ -116,7 +116,10 @@ export default { state.values = values; }, setHiddenField(state, field) { - state.hiddenFields[field.dottedKey] = field.hidden; + state.hiddenFields[field.dottedKey] = { + hidden: field.hidden, + omitValue: field.omitValue, + }; }, setFieldSubmitsJson(state, dottedKey) { if (state.jsonSubmittingFields.indexOf(dottedKey) === -1) { From 534e35ad12f3cf672af027dca5bd57b5d0120b71 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Thu, 21 Apr 2022 00:18:26 -0400 Subject: [PATCH 4/5] Only omit values not hidden by revealer fieldtype. --- .../js/components/field-conditions/ValidatorMixin.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/resources/js/components/field-conditions/ValidatorMixin.js b/resources/js/components/field-conditions/ValidatorMixin.js index f7ec8fa0788..29170978883 100644 --- a/resources/js/components/field-conditions/ValidatorMixin.js +++ b/resources/js/components/field-conditions/ValidatorMixin.js @@ -9,11 +9,18 @@ export default { methods: { showField(field, dottedKey) { - let passes = new Validator(field, this.values, this.$store, this.storeName).passesConditions(); + let dottedPrefix = dottedKey + ? dottedKey.replace(new RegExp('\.'+field.handle+'$'), '') + : ''; + + let validator = new Validator(field, this.values, this.$store, this.storeName); + let passes = validator.passesConditions(); + let hiddenByRevealerField = validator.hasRevealerCondition(dottedPrefix); this.$store.commit(`publish/${this.storeName}/setHiddenField`, { dottedKey: dottedKey || field.handle, hidden: ! passes, + omitValue: ! hiddenByRevealerField, }); return passes; From b3ef2187d0519f16e191e2c5116657e67d99acea Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Thu, 21 Apr 2022 00:51:59 -0400 Subject: [PATCH 5/5] Fix when using `root.` in field condition from a nested field. --- .../components/field-conditions/Validator.js | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/resources/js/components/field-conditions/Validator.js b/resources/js/components/field-conditions/Validator.js index d0e7dbbb2d2..7850dec8ef8 100644 --- a/resources/js/components/field-conditions/Validator.js +++ b/resources/js/components/field-conditions/Validator.js @@ -261,15 +261,10 @@ export default class { return this.showOnPass ? passes : ! passes; } - hasRevealerCondition(dottedPrefix) { - if (! this.store || ! this.storeName) { - return false; - } - + getCheckedFieldPaths(dottedPrefix) { let conditions = this.getConditions(); - let revealerFields = data_get(this.store.state.publish[this.storeName], 'revealerFields', []); - if (conditions === undefined || isString(conditions) || ! revealerFields.length) { + if (conditions === undefined || isString(conditions)) { return false; } @@ -278,9 +273,27 @@ export default class { .map(field => field.field); if (dottedPrefix) { - checkedFields = checkedFields.map(field => dottedPrefix + '.' + field); + checkedFields = checkedFields.map(field => { + return field.startsWith('root.') + ? field.replace(/^root\./, '') + : dottedPrefix + '.' + field; + }); + } + + return checkedFields; + } + + hasRevealerCondition(dottedPrefix) { + if (! this.store || ! this.storeName) { + return false; + } + + let revealerFields = data_get(this.store.state.publish[this.storeName], 'revealerFields', []); + + if (! revealerFields.length) { + return false; } - return intersection(checkedFields, revealerFields).length; + return intersection(this.getCheckedFieldPaths(dottedPrefix), revealerFields).length; } }