Remove Old Configs, fix bugs and wire-up collapser

This commit is contained in:
Kevin Giszewski
2014-01-14 17:30:10 -05:00
parent b9c9e499e2
commit 7ba4cd8e17
7 changed files with 132 additions and 146 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
var newPropertyModel = '{alias: "", remove: false, label: "", helpText: "", view: "", value: "", config: {}}';
var newFieldsetModel = '{alias: "", remove: false, collapse: false, tooltip: "", icon: "", label: "", headerText: "", footerText: "", properties:[' + newPropertyModel + ']}';
var defaultFieldsetConfigModel = eval("({fieldsets: [" + newFieldsetModel + "]})");
var defaultFieldsetConfigModel = eval("({showAdvancedOptions: false, hideFieldsetToolbar: false, hideFieldsetControls: false, hideFieldsetLabels: false, hidePropertyLabel: false, maxFieldsets:1, fieldsets: [" + newFieldsetModel + "]})");
$scope.model.value = $scope.model.value || defaultFieldsetConfigModel;
+40 -19
View File
@@ -1,30 +1,24 @@
angular.module("umbraco").controller("Imulus.ArchetypeController", function ($scope, $http, assetsService) {
//$scope.model.value = "";
//set default value of the model
//this works by checking to see if there is a model; then cascades to the default model then to an empty fieldset
//validate the user configs
$scope.model.config.defaultModel = getValidJson("$scope.model.config.defaultModel", $scope.model.config.defaultModel);
$scope.model.config.fieldsetModels = $scope.model.config.archetypeConfig;
$scope.model.config = $scope.model.config.archetypeConfig;
console.log($scope.model.config.archetypeConfig);
$scope.model.value = $scope.model.value || ($scope.model.config.defaultModel || { fieldsets: [getEmptyRenderItem($scope.model.config.fieldsetModels[0])] });
$scope.model.value = $scope.model.value || { fieldsets: [getEmptyRenderItem($scope.model.config.fieldsets[0])] };
//ini
$scope.archetypeRenderModel = {};
initArchetypeRenderModel();
console.log($scope.archetypeRenderModel);
/* add/remove/sort */
//defines the options for the jquery sortable
//i used an ng-model="archetypeRenderModel" so the sort updates the right model
//configuration overrides the default
var configSortableOptions = getValidJson("$scope.model.config.sortableOptions", $scope.model.config.sortableOptions);
$scope.sortableOptions = configSortableOptions || {
$scope.sortableOptions = {
axis: 'y',
cursor: "move",
handle: ".handle",
@@ -40,7 +34,7 @@
$scope.addRow = function (fieldsetAlias, $index) {
if ($scope.canAdd())
{
if ($scope.model.config.fieldsetModels)
if ($scope.model.config.fieldsets)
{
var newRenderItem = getEmptyRenderItem($scope.getConfigFieldsetByAlias(fieldsetAlias));
@@ -68,9 +62,9 @@
//helpers for determining if a user can do something
$scope.canAdd = function ()
{
if ($scope.model.config.maxProperties)
if ($scope.model.config.maxFieldsets)
{
return countVisible() < $scope.model.config.maxProperties;
return countVisible() < $scope.model.config.maxFieldsets;
}
return true;
@@ -91,16 +85,42 @@
//helper, ini the render model from the server (model.value)
function initArchetypeRenderModel() {
$scope.archetypeRenderModel = $scope.model.value;
for(var i in $scope.archetypeRenderModel.fieldsets)
{
$scope.archetypeRenderModel.fieldsets[i].remove = false;
$scope.archetypeRenderModel.fieldsets[i].collapse = true;
}
}
//helper to get the correct fieldset from config
$scope.getConfigFieldsetByAlias = function(alias) {
for (var i in $scope.model.config.fieldsetModels) {
if ($scope.model.config.fieldsetModels[i].alias == alias) {
return $scope.model.config.fieldsetModels[i];
for (var i in $scope.model.config.fieldsets) {
if ($scope.model.config.fieldsets[i].alias == alias) {
return $scope.model.config.fieldsets[i];
}
}
}
//helper for collapsing
$scope.focusFieldset = function(fieldset){
var iniState;
if(fieldset)
{
iniState = fieldset.collapse;
}
for(var i in $scope.archetypeRenderModel.fieldsets)
{
$scope.archetypeRenderModel.fieldsets[i].collapse = true;
}
if(iniState)
{
fieldset.collapse = !iniState;
}
}
//helper returns valid JS or null
function getValidJson(variable, json)
@@ -157,9 +177,10 @@
for (var i in $scope.archetypeRenderModel.fieldsets) {
if (!$scope.archetypeRenderModel.fieldsets[i].remove) {
//remove the 'remove' property as this is only for sorting/internal use
delete $scope.archetypeRenderModel.fieldsets[i].remove;
$scope.model.value.fieldsets.push($scope.archetypeRenderModel.fieldsets[i]);
//clone
var tempFieldset = JSON.parse(JSON.stringify( $scope.archetypeRenderModel.fieldsets[i]));
delete tempFieldset.remove;
$scope.model.value.fieldsets.push(tempFieldset);
}
}
}
+5 -5
View File
@@ -1,12 +1,12 @@
angular.module("umbraco").directive('archetypeProperty', function ($compile, $http) {
function getFieldsetByAlias(fieldsetModels, alias)
function getFieldsetByAlias(fieldsets, alias)
{
for (var i in fieldsetModels)
for (var i in fieldsets)
{
if (fieldsetModels[i].alias == alias)
if (fieldsets[i].alias == alias)
{
return fieldsetModels[i];
return fieldsets[i];
}
}
}
@@ -23,7 +23,7 @@
var linker = function (scope, element, attrs) {
var configFieldsetModel = getFieldsetByAlias(scope.archetypeConfig.fieldsetModels, scope.fieldset.alias);
var configFieldsetModel = getFieldsetByAlias(scope.archetypeConfig.fieldsets, scope.fieldset.alias);
var view = configFieldsetModel.properties[scope.propertyConfigIndex].view;
var label = configFieldsetModel.properties[scope.propertyConfigIndex].label;
+24 -1
View File
@@ -105,7 +105,8 @@
}
.archetypeConfig .archetypeDeveloperModel {
width: 98%;
width: 88%;
margin-left: 30px;
height: 100px;
}
@@ -132,10 +133,32 @@
margin-bottom: 0;
}
.archetypeConfig .archetypeFieldsets {
margin-left: 0;
}
.archetypeConfig .archetypeFieldsetTitle {
overflow: hidden;
}
.archetypeConfig .arechetypeCollapser{
margin-top: 10px;
}
.archetypeConfig .archetypeOptions label{
width: 200px;
}
.archetypeConfig .archetypeAdvancedOptions label{
width: 400px;
}
.archetypeConfig .archetypeDeveloperModel {
margin-bottom: 10px;
}
.archetypeConfig .archetypeMaxFieldsets{
border: 1px solid #ddd;
width: 25px;
text-align: right;
}
-99
View File
@@ -19,105 +19,6 @@
type: "Required"
}
]
},
{
label: "Hide fieldset toolbar?",
description: "Hides the fieldset toolbar that appears when more than one fieldset model appears.",
key: "hideFieldsetToolbar",
view: "boolean",
validation: [
]
},
{
label: "Hide fieldset editor controls?",
description: "Hides the fieldset add/remove/sort controls.",
key: "hideFieldsetControls",
view: "boolean",
validation: [
]
},
{
label: "Hide fieldset labels?",
description: "Hides the fieldset labels.",
key: "hideFieldsetLabels",
view: "boolean",
validation: [
]
},
{
label: "Hide property labels?",
description: "Hides the property labels.",
key: "hidePropertyLabels",
view: "boolean",
validation: [
]
},
{
label: "Default Model",
description: "(Optional) What would you the default model to be? Otherwise the model will defer to the Empty Fieldset Model for new items.",
key: "defaultModel",
view: "textarea",
validation: [
]
},
{
label: "Max Fieldsets",
description: "(Optional) How many Fieldsets are allowed? Entering '1' will disable the controls. Default is unlimited.",
key: "maxProperties",
view: "number",
validation: [
]
},
{
label: "Custom Wrapper Class",
description: "(Optional) Enter a custom CSS class that will be applied to the wrapper div.",
key: "customCssClass",
view: "textstring",
validation: [
]
},
{
label: "CSS File",
description: "(Optional) Enter a path for a custom CSS file to be included on the page.",
key: "customCssPath",
view: "textstring",
validation: [
]
},
{
label: "JS File",
description: "(Optional) Enter a path for a custom JS file to be included on the page.",
key: "customJsPath",
view: "textstring",
validation: [
]
},
{
label: "Developer Mode",
description: "(Advanced) Turn on for developer options.",
key: "developerMode",
view: "boolean",
validation: [
]
},
{
label: "Sortable Options",
description: "(Advanced) Override the default sortable controls with a JSON object.",
key: "sortableOptions",
view: "textarea",
validation: [
]
}
]
}
+41 -2
View File
@@ -1,5 +1,5 @@
<div class="archetypeConfig" ng-controller="Imulus.ArchetypeConfigController">
<ul ui-sortable="sortableOptions" ng-model="archetypeConfigRenderModel.fieldsets">
<ul class="archetypeFieldsets" ui-sortable="sortableOptions" ng-model="archetypeConfigRenderModel.fieldsets">
<li ng-repeat="fieldset in archetypeConfigRenderModel.fieldsets" ng-hide="fieldset.remove">
<div class="archetypeFieldsetWrapper" >
<div class="archetypeEditorControls">
@@ -60,5 +60,44 @@
</div>
</li>
</ul>
<textarea class="archetypeDeveloperModel" ng-model="archetypeConfigRenderModel"></textarea>
<div class="archetypeOptions">
<div>
<label>Hide Fieldset Toolbar?<small>Hides the fieldset toolbar that appears when more than one fieldset model appears.</small></label><input type="checkbox" ng-model="archetypeConfigRenderModel.hideFieldsetToolbar"/>
</div>
<div>
<label>Hide fieldset editor controls?<small>Hides the fieldset add/remove/sort controls.</small></label><input type="checkbox" ng-model="archetypeConfigRenderModel.hideFieldsetControls"/>
</div>
<div>
<label>Hide fieldset labels?<small>Hides the fieldset labels.</small></label><input type="checkbox" ng-model="archetypeConfigRenderModel.hideFieldsetLabels"/>
</div>
<div>
<label>Hide property labels?<small>Hides the property labels.</small></label><input type="checkbox" ng-model="archetypeConfigRenderModel.hidePropertyLabels"/>
</div>
<div>
<label>Max fieldsets<small>How many Fieldsets are allowed? Entering '1' will disable the controls. Default is unlimited.</small></label><input type="text" class="archetypeMaxFieldsets" ng-model="archetypeConfigRenderModel.maxFieldsets"/>
</div>
<div>
<label>Toggle Advanced Options<small>Show advanced options.</small></label><input type="checkbox" ng-model="archetypeConfigRenderModel.showAdvancedOptions"/>
</div>
</div>
<div class="archetypeAdvancedOptions" ng-show="archetypeConfigRenderModel.showAdvancedOptions">
<div>
<label>Config Model<small>Be careful editing the text below, it controls the schema for this archetype.</small></label>
<textarea class="archetypeDeveloperModel" ng-model="archetypeConfigRenderModel"></textarea>
</div>
<div>
<label>Custom Wrapper Class<small>(Optional) Enter a custom CSS class that will be applied to the wrapper div.</small></label><input type="text" ng-model="archetypeConfigRenderModel.customCssClass"/>
</div>
<div>
<label>CSS File<small>(Optional) Enter a path for a custom CSS file to be included on the page.</small></label><input type="text" ng-model="archetypeConfigRenderModel.customCssPath"/>
</div>
<div>
<label>JS File<small>(Optional) Enter a path for a custom JS file to be included on the page.</small></label><input type="text" ng-model="archetypeConfigRenderModel.customJsPath"/>
</div>
<div>
<label>Toggle Developer Mode<small>Turn on for developer options.</small></label><input type="checkbox" ng-model="archetypeConfigRenderModel.developerMode"/>
</div>
</div>
</div>
+21 -19
View File
@@ -1,8 +1,8 @@
<div class="archetypeEditor ng-class:model.config.customCssClass" ng-controller="Imulus.ArchetypeController">
<textarea class="archetypeDeveloperModel" ng-show="model.config.developerMode" ng-model="archetypeRenderModel"></textarea>
<div class="archetypeFieldsetToolbar" ng-show="model.config.fieldsetModels.length > 1 && model.config.hideFieldsetToolbar != '1'">
<div class="archetypeFieldsetToolbar" ng-show="model.config.fieldsets.length > 1 && model.config.hideFieldsetToolbar != '1'">
<ul>
<li ng-repeat="fieldsetModel in model.config.fieldsetModels" ng-click="addRow(fieldsetModel.alias)">
<li ng-repeat="fieldsetModel in model.config.fieldsets" ng-click="addRow(fieldsetModel.alias)">
<img ng-src='{{fieldsetModel.icon}}' title="{{fieldsetModel.tooltip}}" />
<span>{{fieldsetModel.label}}</span>
</li>
@@ -10,32 +10,34 @@
</div>
<ul ui-sortable="sortableOptions" ng-model="archetypeRenderModel.fieldsets">
<li ng-repeat="fieldset in archetypeRenderModel.fieldsets" ng-hide="fieldset.remove">
<fieldset ng-class="fieldset.alias" ng-init="fieldsetConfigModel=getConfigFieldsetByAlias(fieldset.alias)">
<label ng-hide="model.config.hideFieldsetLabels == '1'">
<fieldset ng-class="fieldset.alias" ng-init="fieldsetConfigModel = getConfigFieldsetByAlias(fieldset.alias)">
<label ng-hide="model.config.hideFieldsetLabels == '1'" ng-click="focusFieldset(fieldset)">
<img ng-src='{{fieldsetConfigModel.icon}}' title="{{fieldsetConfigModel.tooltip}}"/>
<span>{{fieldsetConfigModel.label}}</span>
</label>
<div class="archetypeEditorControls" ng-hide="model.config.hideFieldsetControls || model.config.maxProperties == '1'">
<div class="archetypeEditorControls" ng-hide="model.config.hideFieldsetControls || model.config.maxFieldsets == '1'">
<i class="icon icon-add" ng-click="addRow(fieldset.alias, $index)" ng-show="canAdd()"></i>
<i class="icon icon-delete" ng-click="removeRow($index)" ng-show="canRemove()"></i>
<i class="icon icon-navigation handle" ng-show="canSort()"></i>
</div>
<div class="archetypeFieldsetHeaderText" ng-show="fieldsetConfigModel.headerText">
<em>{{fieldsetConfigModel.headerText}}</em>
</div>
<div class="archetypeProperty" ng-repeat="property in fieldsetConfigModel.properties">
<label ng-hide="archetypeConfig.hidePropertyLabels == '1'">
<span>{{property.label}}</span>
<div class="archetypeFieldsetHelpText" ng-show="property.helpText">
<em>{{property.helpText}}</em>
</div>
</label>
<div class="arechetypeCollapser" ng-hide="fieldset.collapse">
<div class="archetypeFieldsetHeaderText" ng-show="fieldsetConfigModel.headerText">
<em>{{fieldsetConfigModel.headerText}}</em>
</div>
<div class="archetypeProperty" ng-repeat="property in fieldsetConfigModel.properties">
<label ng-hide="archetypeConfig.hidePropertyLabels == '1'">
<span>{{property.label}}</span>
<div class="archetypeFieldsetHelpText" ng-show="property.helpText">
<em>{{property.helpText}}</em>
</div>
</label>
<archetype-property class="archetypeEditor ng-class:property.alias" property="property" fieldset-index="$parent.$index" fieldset="fieldset" archetype-config="model.config" property-config-index="$index" archetype-render-model="archetypeRenderModel"></archetype-property>
<archetype-property class="archetypeEditor ng-class:property.alias" property="property" fieldset-index="$parent.$index" fieldset="fieldset" archetype-config="model.config" property-config-index="$index" archetype-render-model="archetypeRenderModel"></archetype-property>
</div>
<div class="archetypeFieldsetFooterText" ng-show="fieldsetConfigModel.footerText">
<em>{{fieldsetConfigModel.footerText}}</em>
</div>
</div>
<div class="archetypeFieldsetFooterText" ng-show="fieldsetConfigModel.footerText">
<em>{{fieldsetConfigModel.footerText}}</em>
</div>
</fieldset>
</li>
</ul>