diff --git a/system/Controllers/MetaApiController.php b/system/Controllers/MetaApiController.php index 7f5bf22..7d04342 100644 --- a/system/Controllers/MetaApiController.php +++ b/system/Controllers/MetaApiController.php @@ -29,8 +29,7 @@ class MetaApiController extends ContentController # the fields for user or role based access if(!isset($this->settings['pageaccess']) || $this->settings['pageaccess'] === NULL ) { - unset($metatabs['meta']['fields']['alloweduser']); - unset($metatabs['meta']['fields']['allowedrole']); + unset($metatabs['meta']['fields']['fieldsetrights']); } # add radio buttons to choose posts or pages for folder. @@ -124,11 +123,12 @@ class MetaApiController extends ContentController { $metadata[$tabname] = []; - foreach($tab['fields'] as $fieldname => $fielddefinitions) + $tab = $this->flattenTabFields($tab['fields'],[]); + + foreach($tab as $fieldname => $fielddefinitions) { $metascheme[$tabname][$fieldname] = true; $metadata[$tabname][$fieldname] = isset($pagemeta[$tabname][$fieldname]) ? $pagemeta[$tabname][$fieldname] : null; - # check if there is a selectfield for userroles if(isset($fielddefinitions['type']) && ($fielddefinitions['type'] == 'select' ) && isset($fielddefinitions['dataset']) && ($fielddefinitions['dataset'] == 'userroles' ) ) @@ -214,6 +214,8 @@ class MetaApiController extends ContentController $metaDefinitions = $this->aggregateMetaDefinitions(); } + $tabFieldDefinitions = $this->flattenTabFields($metaDefinitions[$tab]['fields'], []); + # create validation object $validate = $this->getValidator(); @@ -221,7 +223,7 @@ class MetaApiController extends ContentController foreach($metaInput as $fieldName => $fieldValue) { # get the corresponding field definition from original plugin settings */ - $fieldDefinition = isset($metaDefinitions[$tab]['fields'][$fieldName]) ? $metaDefinitions[$tab]['fields'][$fieldName] : false; + $fieldDefinition = isset($tabFieldDefinitions[$fieldName]) ? $tabFieldDefinitions[$fieldName] : false; if(!$fieldDefinition) { @@ -379,6 +381,24 @@ class MetaApiController extends ContentController return $response->withJson(array('metadata' => $metaInput, 'structure' => $structure, 'item' => $this->item, 'errors' => false)); } + # we have to flatten field definitions for tabs if there are fieldsets in it + public function flattenTabFields($tabfields, $flattab) + { + foreach($tabfields as $name => $field) + { + if($field['type'] == 'fieldset') + { + $flattab = $this->flattenTabFields($field['fields'], $flattab); + } + else + { + $flattab[$name] = $field; + } + } + return $flattab; + } + + # can be deleted ?? private function customfieldsPrepareForEdit($customfields) { diff --git a/system/author/css/style.css b/system/author/css/style.css index cd0d725..dddf3f4 100644 --- a/system/author/css/style.css +++ b/system/author/css/style.css @@ -1021,6 +1021,17 @@ fieldset{ border: none; padding: 0; } +fieldset.fs-formbuilder{ + padding: 20px; + border: 1px solid #ddd; + margin: 20px; + width: auto; +} +fieldset.fs-formbuilder legend{ + float: none; + font-weight: bold; + font-size: 1.2em; +} label,.label{ display: inline-block; width: 100%; diff --git a/system/author/js/vue-meta.js b/system/author/js/vue-meta.js index 1b929aa..6f63fa3 100644 --- a/system/author/js/vue-meta.js +++ b/system/author/js/vue-meta.js @@ -11,9 +11,9 @@ Vue.filter('translate', function (value) { } }) -Vue.component('tab-meta', { +Vue.component('tab-metaoriginal', { props: ['saved', 'errors', 'formdata', 'schema', 'userroles'], - template: '
' + + template: '
original' + '' + + '
' + + '
{{field.legend}}' + + '' + + '' + + '
' + + '' + + '' + + '
' + + '
{{ \'Saved successfully\'|translate }}
' + + '
{{ \'Please correct the errors above\'|translate }}
' + + '
' + + '
', + methods: { + selectComponent: function(field) + { + return 'component-'+field.type; + }, + saveInput: function() + { + this.$emit('saveform'); + }, + getFieldClass: function(field) + { + if(field.type == 'fieldset') + { + return; + } + else if(field.class === undefined ) + { + return 'large'; + } + else + { + var fieldclass = field.class; + delete field.class; + return fieldclass; + } + }, + } +}) + let meta = new Vue({ delimiters: ['${', '}'], el: '#metanav', @@ -75,18 +134,18 @@ let meta = new Vue({ var self = this; - myaxios.get('/api/v1/article/metaobject',{ - params: { + myaxios.get('/api/v1/article/metaobject',{ + params: { 'url': document.getElementById("path").value, 'csrf_name': document.getElementById("csrf_name").value, 'csrf_value': document.getElementById("csrf_value").value, - } + } }) - .then(function (response) { + .then(function (response) { - var formdefinitions = response.data.metadefinitions; + var formdefinitions = response.data.metadefinitions; - for (var key in formdefinitions) { + for (var key in formdefinitions) { if (formdefinitions.hasOwnProperty(key)) { self.tabs.push(key); self.formErrors[key] = false; @@ -96,36 +155,37 @@ let meta = new Vue({ self.formErrorsReset = self.formErrors; self.formDefinitions = formdefinitions; - self.formData = response.data.metadata; + self.formData = response.data.metadata; - self.userroles = response.data.userroles; + self.userroles = response.data.userroles; - self.item = response.data.item; - if(self.item.elementType == "folder" && self.item.contains == "posts") - { - posts.posts = self.item.folderContent; - posts.folderid = self.item.keyPath; - } - else - { - posts.posts = false; - } - }) - .catch(function (error) - { - if(error.response) - { - } - }); + self.item = response.data.item; + + if(self.item.elementType == "folder" && self.item.contains == "posts") + { + posts.posts = self.item.folderContent; + posts.folderid = self.item.keyPath; + } + else + { + posts.posts = false; + } + }) + .catch(function (error) + { + if(error.response) + { + } + }); - /* update single value or array - this.$set(this.someObject, 'b', 2) */ + /* update single value or array + this.$set(this.someObject, 'b', 2) */ FormBus.$on('forminput', formdata => { this.$set(this.formData[this.currentTab], formdata.name, formdata.value); }); /* update values that are objects - this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 }) */ + this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 }) */ FormBus.$on('forminputobject', formdata => { this.formData[this.currentTab][formdata.name] = Object.assign({}, this.formData[this.currentTab][formdata.name], formdata.value); @@ -138,43 +198,43 @@ let meta = new Vue({ self = this; - myaxios.post('/api/v1/article/metadata',{ - 'url': document.getElementById("path").value, - 'csrf_name': document.getElementById("csrf_name").value, - 'csrf_value': document.getElementById("csrf_value").value, - 'tab': self.currentTab, - 'data': self.formData[self.currentTab] + myaxios.post('/api/v1/article/metadata',{ + 'url': document.getElementById("path").value, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + 'tab': self.currentTab, + 'data': self.formData[self.currentTab] }) - .then(function (response) { - self.saved = true; - self.formErrors = self.formErrorsReset; - if(response.data.structure) - { - navi.items = response.data.structure; - } + .then(function (response) { + self.saved = true; + self.formErrors = self.formErrorsReset; + if(response.data.structure) + { + navi.items = response.data.structure; + } - var item = response.data.item; - if(item.elementType == "folder" && item.contains == "posts") - { - posts.posts = item.folderContent; - posts.folderid = item.keyPath; - } - else - { - posts.posts = false; - } - }) - .catch(function (error) - { - if(error.response) - { - self.formErrors = error.response.data.errors; - } - if(error.response.data.errors.message) - { - publishController.errors.message = error.response.data.errors.message; - } - }); + var item = response.data.item; + if(item.elementType == "folder" && item.contains == "posts") + { + posts.posts = item.folderContent; + posts.folderid = item.keyPath; + } + else + { + posts.posts = false; + } + }) + .catch(function (error) + { + if(error.response) + { + self.formErrors = error.response.data.errors; + } + if(error.response.data.errors.message) + { + publishController.errors.message = error.response.data.errors.message; + } + }); }, } }); \ No newline at end of file diff --git a/system/author/js/vue-shared.js b/system/author/js/vue-shared.js index 790f8cd..6bd1be1 100644 --- a/system/author/js/vue-shared.js +++ b/system/author/js/vue-shared.js @@ -1,6 +1,6 @@ Vue.component('component-text', { - props: ['class', 'id', 'description', 'maxlength', 'hidden', 'readonly', 'required', 'disabled', 'placeholder', 'label', 'name', 'type', 'value', 'errors'], - template: '
' + + props: ['id', 'description', 'maxlength', 'hidden', 'readonly', 'required', 'disabled', 'placeholder', 'label', 'name', 'type', 'value', 'errors'], + template: '
' + '' + '' + '' + + template: '
' + '' + '