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/field-conditions/Validator.js b/resources/js/components/field-conditions/Validator.js index f227b89d471..7850dec8ef8 100644 --- a/resources/js/components/field-conditions/Validator.js +++ b/resources/js/components/field-conditions/Validator.js @@ -260,4 +260,40 @@ export default class { return this.showOnPass ? passes : ! passes; } + + getCheckedFieldPaths(dottedPrefix) { + let conditions = this.getConditions(); + + if (conditions === undefined || isString(conditions)) { + return false; + } + + let checkedFields = this.converter + .fromBlueprint(conditions, this.field.prefix) + .map(field => field.field); + + if (dottedPrefix) { + 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(this.getCheckedFieldPaths(dottedPrefix), revealerFields).length; + } } 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; 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..f0369608ac5 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, @@ -115,13 +116,21 @@ 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) { state.jsonSubmittingFields.push(dottedKey); } }, + setRevealerFields(state, dottedKey) { + if (state.revealerFields.indexOf(dottedKey) === -1) { + state.revealerFields.push(dottedKey); + } + }, setMeta(state, meta) { state.meta = meta; },