diff --git a/Gruntfile.js b/Gruntfile.js index df05808..c2bb320 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -104,8 +104,8 @@ module.exports = function(grunt) { build: { files: [ {expand: true, cwd: 'app/', src: ['package.manifest'], dest: '<%= dest %>', flatten: true}, - {expand: true, cwd: 'app/config/', src: ['config.views.js'], dest: '<%= dest %>/js', flatten: true}, {expand: true, cwd: 'app/views/', src: ['archetype.html', 'archetype.config.html'], dest: '<%= dest %>/views', flatten: true}, + {expand: true, cwd: 'app/config/', src: ['propertyEditors.views.js'], dest: '<%= dest %>/js', flatten: true}, {expand: true, cwd: 'app/Umbraco/Umbraco.Archetype/bin/Debug/', src: ['Archetype.dll'], dest: '<%= dest %>/bin', flatten: true} ] }, diff --git a/app/config/config.views.js b/app/config/config.views.js deleted file mode 100644 index 4818a39..0000000 --- a/app/config/config.views.js +++ /dev/null @@ -1,38 +0,0 @@ -[ - { - "name": "Textstring", - "path": "/umbraco/views/propertyeditors/textbox/textbox.html" - }, - { - "name": "Content Picker", - "path": "/umbraco/views/propertyeditors/contentpicker/contentpicker.html" - }, - { - "name": "Boolean", - "path": "/umbraco/views/propertyeditors/boolean/boolean.html" - }, - { - "name": "Checkbox List", - "path": "/umbraco/views/propertyeditors/checkboxlist/checkboxlist.html" - }, - { - "name": "Radio Buttons", - "path": "/umbraco/views/propertyeditors/radiobuttons/radiobuttons.html" - }, - { - "name": "Date Picker", - "path": "/umbraco/views/propertyeditors/datepicker/datepicker.html" - }, - { - "name": "Dropdown", - "path": "/umbraco/views/propertyeditors/dropdown/dropdown.html" - }, - { - "name": "Textarea", - "path": "/umbraco/views/propertyeditors/textarea/textarea.html" - }, - { - "name": "RTE", - "path": "/umbraco/views/propertyeditors/rte/rte.html" - } -] diff --git a/app/config/propertyEditors.views.js b/app/config/propertyEditors.views.js new file mode 100644 index 0000000..ba99e59 --- /dev/null +++ b/app/config/propertyEditors.views.js @@ -0,0 +1,148 @@ +[ + { + "propertyEditorAlias": "Umbraco.CheckBoxList", + "view": "checkboxlist" + }, + { + "propertyEditorAlias": "Umbraco.ColorPickerAlias", + "view": "colorpicker" + }, + { + "propertyEditorAlias": "Umbraco.ContentPickerAlias", + "view": "contentpicker" + }, + { + "propertyEditorAlias": "Umbraco.Date", + "view": "datepicker", + "defaultPreValues": [{ "format": "yyyy-MM-dd", "pickTime": false }] + }, + { + "propertyEditorAlias": "Umbraco.DateTime", + "view": "datepicker", + "format": "yyyy-MM-dd hh:mm:ss" + }, + { + "propertyEditorAlias": "Umbraco.DropDown", + "view": "dropdown" + }, + { + "propertyEditorAlias": "Umbraco.DropDownMultiple", + "view": "dropdown" + }, + { + "propertyEditorAlias": "Umbraco.DropDownMultiplePublishKeys", + "view": "dropdown" + }, + { + "propertyEditorAlias": "Umbraco.DropdownlistPublishingKeys", + "view": "dropdown" + }, + { + "propertyEditorAlias": "Umbraco.EmailAddress", + "view": "email" + }, + { + "propertyEditorAlias": "Umbraco.UploadField", + "view": "fileupload" + }, + { + "propertyEditorAlias": "Umbraco.FolderBrowser", + "view": "folderbrowser" + }, + { + "propertyEditorAlias": "Umbraco.Integer", + "view": "integer" + }, + { + "propertyEditorAlias": "Umbraco.NoEdit", + "view": "readonlyvalue" + }, + { + "propertyEditorAlias": "Umbraco.ListView", + "view": "listview" + }, + { + "propertyEditorAlias": "Umbraco.MacroContainer", + "view": "macrocontainer" + }, + { + "propertyEditorAlias": "Umbraco.MarkdownEditor", + "view": "markdowneditor" + }, + { + "propertyEditorAlias": "Umbraco.MediaPicker", + "view": "mediapicker", + "defaultPreValues": [{ "multiPicker": "0" }] + }, + { + "propertyEditorAlias": "Umbraco.MemberGroupPicker", + "view": "membergrouppicker" + }, + { + "propertyEditorAlias": "Umbraco.MemberPicker", + "view": "memberpicker" + }, + { + "propertyEditorAlias": "Umbraco.MultiNodeTreePicker", + "view": "contentpicker", + "defaultPreValues": [{ "multiPicker": "1" }] + }, + { + "propertyEditorAlias": "Umbraco.MultipleMediaPicker", + "view": "mediapicker" + }, + { + "propertyEditorAlias": "Umbraco.MultipleTextstring", + "view": "multipletextbox" + }, + { + "propertyEditorAlias": "Umbraco.RadioButtonList", + "view": "radiobuttons" + }, + { + "propertyEditorAlias": "Umbraco.RelatedLinks", + "view": "relatedlinks" + }, + { + "propertyEditorAlias": "Umbraco.TinyMCEv3", + "view": "rte" + }, + { + "propertyEditorAlias": "Umbraco.Slider", + "view": "slider" + }, + { + "propertyEditorAlias": "Umbraco.Tags", + "view": "tags", + "defaultPreValues": [{ "group": "default" }] + }, + { + "propertyEditorAlias": "Umbraco.TextboxMultiple", + "view": "textarea" + }, + { + "propertyEditorAlias": "Umbraco.Textbox", + "view": "textbox" + }, + { + "propertyEditorAlias": "Umbraco.TrueFalse", + "view": "boolean" + }, + { + "propertyEditorAlias": "Umbraco.UserPicker", + "view": "entitypicker", + "defaultPreValues": [{ "entityType": "User" }] + }, + { + "propertyEditorAlias": "Umbraco.NoEdit", + "view": "readonlyvalue" + }, + { + "propertyEditorAlias": "Umbraco.Textbox", + "view": "textbox" + }, + { + "propertyEditorAlias": "Imulus.Archetype", + "view": "/App_Plugins/Archetype/views/archetype.html" + } +] \ No newline at end of file diff --git a/app/controllers/config.controller.js b/app/controllers/config.controller.js index 8bd5bd9..462fc1d 100644 --- a/app/controllers/config.controller.js +++ b/app/controllers/config.controller.js @@ -4,19 +4,19 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio //console.log($scope.model.value); //define empty items - var newPropertyModel = '{"alias": "", "remove": false, "collapse": false, "label": "", "helpText": "", "view": "", "value": "", "config": ""}'; + var newPropertyModel = '{"alias": "", "remove": false, "collapse": false, "label": "", "helpText": "", "dataTypeId": "-88", "value": ""}'; var newFieldsetModel = '{"alias": "", "remove": false, "collapse": false, "labelTemplate": "", "tooltip": "", "icon": "", "label": "", "headerText": "", "footerText": "", "properties": [' + newPropertyModel + ']}'; - var defaultFieldsetConfigModel = JSON.parse('{"showAdvancedOptions": false, "hideFieldsetToolbar": false, "enableMultipleFieldsets": false, "hideFieldsetControls": false, "hideFieldsetLabels": false, "hidePropertyLabel": false, "maxFieldsets": null, "fieldsets": [' + newFieldsetModel + ']}'); - + var defaultFieldsetConfigModel = JSON.parse('{"showAdvancedOptions": false, "hideFieldsetToolbar": false, "enableMultipleFieldsets": false, "hideFieldsetControls": false, "hidePropertyLabel": false, "maxFieldsets": null, "fieldsets": [' + newFieldsetModel + ']}'); + //ini the model $scope.model.value = $scope.model.value || defaultFieldsetConfigModel; //ini the render model initConfigRenderModel(); - //get the available views - propertyEditorResource.getViews().then(function(data){ - $scope.availableViews = data; + //get the available datatypes + propertyEditorResource.getAllDataTypes().then(function(data) { + $scope.availableDataTypes = data; }); //config for the sorting @@ -92,6 +92,11 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio property.collapse = !iniState; } } + + //ini the properties + _.each($scope.archetypeConfigRenderModel.fieldsets, function(fieldset){ + $scope.focusProperty(fieldset.properties); + }); //setup JSON.stringify helpers $scope.archetypeConfigRenderModel.toString = stringify; diff --git a/app/controllers/controller.js b/app/controllers/controller.js index e185504..9389104 100644 --- a/app/controllers/controller.js +++ b/app/controllers/controller.js @@ -214,7 +214,7 @@ //helper to add an empty fieldset to the render model function getEmptyRenderFieldset (fieldsetModel) { - return JSON.parse('{"alias": "' + fieldsetModel.alias + '", "remove": false, "properties": []}'); + return JSON.parse('{"alias": "' + fieldsetModel.alias + '", "remove": false, "isValid": true, "properties": []}'); } //helper for validation diff --git a/app/directives/archetypeproperty.js b/app/directives/archetypeproperty.js index 3202746..17dbef2 100644 --- a/app/directives/archetypeproperty.js +++ b/app/directives/archetypeproperty.js @@ -1,4 +1,4 @@ -angular.module("umbraco").directive('archetypeProperty', function ($compile, $http) { +angular.module("umbraco").directive('archetypeProperty', function ($compile, $http, propertyEditorResource, umbPropEditorHelper) { function getFieldsetByAlias(fieldsets, alias) { @@ -43,21 +43,46 @@ } var linker = function (scope, element, attrs) { - var configFieldsetModel = getFieldsetByAlias(scope.archetypeConfig.fieldsets, scope.fieldset.alias); - - var view = configFieldsetModel.properties[scope.propertyConfigIndex].view; + var view = ""; var label = configFieldsetModel.properties[scope.propertyConfigIndex].label; - var config = configFieldsetModel.properties[scope.propertyConfigIndex].config; + var dataTypeId = configFieldsetModel.properties[scope.propertyConfigIndex].dataTypeId; + var config = null; var alias = configFieldsetModel.properties[scope.propertyConfigIndex].alias; var defaultValue = configFieldsetModel.properties[scope.propertyConfigIndex].value; - - //try to convert the config to a JS object - config = jsonOrString(config, scope.archetypeConfig.developerMode, "config"); //try to convert the defaultValue to a JS object defaultValue = jsonOrString(defaultValue, scope.archetypeConfig.developerMode, "defaultValue"); + //grab info for the selected datatype, prepare for view + propertyEditorResource.getDataType(dataTypeId).then(function (data) { + //transform preValues array into object expected by propertyeditor views + var configObj = {}; + _.each(data.preValues, function(p) { + configObj[p.key] = p.value; + }); + config = configObj; + + //determine the view to use [...] and load it + propertyEditorResource.getPropertyEditorMapping(data.selectedEditor).then(function(propertyEditor) { + var pathToView = umbPropEditorHelper.getViewPath(propertyEditor.view); + + //load in the DefaultPreValues for the PropertyEditor, if any + var defaultConfigObj = {}; + if (propertyEditor.hasOwnProperty('defaultPreValues')) { + _.each(propertyEditor.defaultPreValues, function(p) { + _.extend(defaultConfigObj, p) + }); + } + var mergedConfig = _.extend(defaultConfigObj, config); + + loadView(pathToView, mergedConfig, defaultValue, alias, scope, element); + }); + }); + + } + + function loadView(view, config, defaultValue, alias, scope, element) { if (view) { $http.get(view).success(function (data) { @@ -67,8 +92,6 @@ console.log(scope); } - var rawTemplate = data; - //define the initial model and config scope.model = {}; scope.model.config = {}; @@ -94,7 +117,7 @@ scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex].properties[renderModelPropertyIndex].value = newValue; }); - element.html(rawTemplate).show(); + element.html(data).show(); $compile(element.contents())(scope); } }); diff --git a/app/less/archetype.less b/app/less/archetype.less index eb06cfc..eadedb7 100644 --- a/app/less/archetype.less +++ b/app/less/archetype.less @@ -1,4 +1,8 @@ -.archetypeEditor fieldset{ +.archetypeEditor { + width: 98%; +} + +.archetypeEditor fieldset{ border: 1px solid #dddddd; padding: 0; margin-bottom: 5px; @@ -38,8 +42,10 @@ } label{ - width: 75px; float: left; + width: 80%; + margin-bottom: 0; + padding: 0; } } @@ -53,13 +59,6 @@ border-radius: 0 0 0 5px; } -.archetypeEditor fieldset .archetypeFieldsetLabel label{ - float: left; - width: auto; - margin-bottom: 0; - padding: 0; -} - .archetypeEditor .multiPropertyTextbox{ margin-bottom: 3px; } @@ -243,4 +242,8 @@ .ui-sortable-placeholder { visibility: visible !important; background-color: #d0e7f1 !important; +} + +.archetypeConfig .archetypeFieldsetCollapser{ + margin-top: 5px; } \ No newline at end of file diff --git a/app/resources/propertyeditor.js b/app/resources/propertyeditor.js index d24a34c..07a1289 100644 --- a/app/resources/propertyeditor.js +++ b/app/resources/propertyeditor.js @@ -1,9 +1,33 @@ angular.module('umbraco').factory('propertyEditorResource', function($q, $http, umbRequestHelper){ return { - getViews: function() { + getAllDataTypes: function() { + // Hack - grab DataTypes from Tree API, as `dataTypeService.getAll()` isn't implemented yet return umbRequestHelper.resourcePromise( - $http.get("/App_Plugins/Archetype/js/config.views.js"), 'Failed to retreive config for views.' - ); + $http.get("/umbraco/backoffice/UmbracoTrees/DataTypeTree/GetNodes?id=-1&application=developer&tree=&isDialog=false"), 'Failed to retrieve datatypes from tree service' + ).then(function (data) { + return data.map(function(d) { + return { "id": d.id, "name": d.name } + }); + }); + }, + getDataType: function(id) { + return umbRequestHelper.resourcePromise( + $http.get("/umbraco/backoffice/UmbracoApi/DataType/GetById?id=" + id), 'Failed to retrieve datatype' + ); + }, + getPropertyEditorMapping: function(alias) { + return umbRequestHelper.resourcePromise( + $http.get("/App_plugins/Archetype/js/propertyEditors.views.js"), 'Failed to retrieve datatype mappings' + ).then(function (data) { + var result = _.find(data, function(d) { + return d.propertyEditorAlias === alias; + }); + + if (result != null) + return result; + + return ""; + }); } }; }); \ No newline at end of file diff --git a/app/views/archetype.config.html b/app/views/archetype.config.html index c8695f8..f0550c6 100644 --- a/app/views/archetype.config.html +++ b/app/views/archetype.config.html @@ -53,14 +53,11 @@
- +
-
- -
@@ -84,9 +81,6 @@
-
- -
diff --git a/app/views/archetype.html b/app/views/archetype.html index 1cba82e..4b3617d 100644 --- a/app/views/archetype.html +++ b/app/views/archetype.html @@ -12,11 +12,11 @@