Skip to content

Commit 0f9c9bf

Browse files
committed
Widgets framework admin update functionality (3.2.0.5)
1 parent e0ebc29 commit 0f9c9bf

8 files changed

Lines changed: 136 additions & 44 deletions

File tree

BlogEngine/BlogEngine.Core/Data/Contracts/IWidgetsRepository.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using BlogEngine.Core.Data.ViewModels;
2+
using System.Collections.Generic;
23

34
namespace BlogEngine.Core.Data.Contracts
45
{
@@ -12,5 +13,11 @@ public interface IWidgetsRepository
1213
/// </summary>
1314
/// <returns>Widgets view model</returns>
1415
WidgetsVM Get();
16+
/// <summary>
17+
/// Update widget zones
18+
/// </summary>
19+
/// <param name="items">List of zones</param>
20+
/// <returns>True on success</returns>
21+
bool Update(List<WidgetZone> items);
1522
}
1623
}

BlogEngine/BlogEngine.Core/Data/ViewModels/WidgetsVM.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
1-
using BlogEngine.Core.Data.Models;
2-
using BlogEngine.Core.DataStore;
3-
using BlogEngine.Core.Providers;
4-
using BlogEngine.Core.Providers.CacheProvider;
1+
using BlogEngine.Core.DataStore;
52
using System;
63
using System.Collections.Generic;
7-
using System.Collections.Specialized;
8-
using System.Linq;
94
using System.Net;
10-
using System.Text;
11-
using System.Threading;
12-
using System.Threading.Tasks;
135
using System.Xml;
146

157
namespace BlogEngine.Core.Data.ViewModels
@@ -34,7 +26,6 @@ public WidgetsVM()
3426
AvailableWidgets.Add(new WidgetItem { Id = pk.Id, Title = pk.Title, ShowTitle = false });
3527
}
3628

37-
3829
WidgetZones = new List<WidgetZone>();
3930
WebClient client = new WebClient();
4031
var html = client.DownloadString(Utils.AbsoluteWebRoot);
@@ -52,10 +43,6 @@ public WidgetsVM()
5243
var zone = new WidgetZone();
5344
zone.Id = zoneId;
5445

55-
//var ws = new WidgetSettings(zoneId);
56-
//var abc = ws.GetSettings();
57-
// var x = (StringDictionary)ws.GetSettings();
58-
5946
var xml = RetrieveXml(zoneId);
6047
var wd = new WidgetData { Settings = xml.InnerXml };
6148

@@ -86,7 +73,9 @@ public WidgetsVM()
8673
}
8774
catch (Exception) { }
8875
}
89-
76+
/// <summary>
77+
/// Available widgets
78+
/// </summary>
9079
public List<WidgetItem> AvailableWidgets { get; set; }
9180
/// <summary>
9281
/// Widget zones
@@ -114,11 +103,22 @@ public class WidgetZone
114103
/// </summary>
115104
public List<WidgetItem> Widgets { get; set; }
116105
}
117-
106+
/// <summary>
107+
/// Widget item
108+
/// </summary>
118109
public class WidgetItem
119110
{
111+
/// <summary>
112+
/// Widget Id
113+
/// </summary>
120114
public string Id { get; set; }
115+
/// <summary>
116+
/// Widget Title
117+
/// </summary>
121118
public string Title { get; set; }
119+
/// <summary>
120+
/// Show title
121+
/// </summary>
122122
public bool ShowTitle { get; set; }
123123
}
124124
}

BlogEngine/BlogEngine.Core/Data/WidgetsRepository.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using BlogEngine.Core.Data.ViewModels;
22
using BlogEngine.Core.Data.Contracts;
3+
using System.Collections.Generic;
4+
using System.Xml;
5+
using BlogEngine.Core.DataStore;
36

47
namespace BlogEngine.Core.Data
58
{
@@ -19,5 +22,66 @@ public WidgetsVM Get()
1922

2023
return new WidgetsVM();
2124
}
25+
26+
/// <summary>
27+
/// Update widget zones
28+
/// </summary>
29+
/// <param name="items">List of zones</param>
30+
/// <returns>True on success</returns>
31+
public bool Update(List<WidgetZone> items)
32+
{
33+
if (!Security.IsAuthorizedTo(Rights.ManageWidgets))
34+
throw new System.UnauthorizedAccessException();
35+
36+
try
37+
{
38+
foreach (var zone in items)
39+
{
40+
XmlDocument doc = new XmlDocument();
41+
var widgets = doc.CreateElement("widgets");
42+
doc.AppendChild(widgets);
43+
44+
foreach (var widget in zone.Widgets)
45+
{
46+
XmlNode node = doc.CreateElement("widget");
47+
node.InnerText = widget.Title;
48+
49+
var id = doc.CreateAttribute("id");
50+
// in javascript, new id initiated as random number
51+
// replace with new GUID before saving to back-end
52+
if(widget.Id.Length < 30)
53+
{
54+
widget.Id = System.Guid.NewGuid().ToString();
55+
}
56+
id.InnerText = widget.Id;
57+
node.Attributes.Append(id);
58+
59+
var title = doc.CreateAttribute("title");
60+
title.InnerText = widget.Title;
61+
node.Attributes.Append(title);
62+
63+
var show = doc.CreateAttribute("showTitle");
64+
show.InnerText = "True";
65+
node.Attributes.Append(show);
66+
67+
widgets.AppendChild(node);
68+
}
69+
SaveXmlDocument(doc, zone.Id);
70+
}
71+
return true;
72+
}
73+
catch (System.Exception ex)
74+
{
75+
Utils.Log("WidgetsRepository.Update", ex);
76+
return false;
77+
}
78+
}
79+
80+
private void SaveXmlDocument(XmlDocument doc, string zone)
81+
{
82+
var ws = new WidgetSettings(zone) { SettingsBehavior = new XmlDocumentBehavior() };
83+
ws.SaveSettings(doc);
84+
Blog.CurrentInstance.Cache[zone] = doc;
85+
}
2286
}
2387
}

BlogEngine/BlogEngine.Core/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@
1919
[assembly: CLSCompliant(false)]
2020
[assembly: ComVisible(false)]
2121
[assembly: AllowPartiallyTrustedCallers]
22-
[assembly: AssemblyVersion("3.2.0.4")]
22+
[assembly: AssemblyVersion("3.2.0.5")]
2323
[assembly: SecurityRules(SecurityRuleSet.Level1)]

BlogEngine/BlogEngine.NET/AppCode/Api/WidgetsController.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,17 @@ public WidgetsVM Get()
2121
return new WidgetsVM();
2222
}
2323

24+
[HttpPut]
25+
public HttpResponseMessage Update([FromBody]List<WidgetZone> items)
26+
{
27+
if (repository.Update(items))
28+
{
29+
return Request.CreateResponse(HttpStatusCode.OK);
30+
}
31+
else
32+
{
33+
return Request.CreateResponse(HttpStatusCode.InternalServerError);
34+
}
35+
}
36+
2437
}

BlogEngine/BlogEngine.NET/admin/app/custom/widgets/widgetController.js

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
angular.module('blogAdmin').controller('CustomWidgetsController', ["$rootScope", "$scope", "$location", "$filter", "DragDropHandler", "dataService", function ($rootScope, $scope, $location, $filter, DragDropHandler, dataService) {
2-
$scope.widgetZones = {
3-
titles: [],
4-
list1: [],
5-
list2: [],
6-
list3: []
7-
};
2+
$scope.widgetZones = {};
3+
$scope.widgetZone = {};
84
$scope.vm = {};
9-
$scope.fltr = 'widgets';
105

116
$scope.load = function () {
127
spinOn();
8+
$scope.widgetZones = {
9+
titles: [],
10+
list1: [], list2: [], list3: []
11+
};
12+
$scope.widgetZone = {
13+
Id: {}, Widgets: []
14+
};
15+
$scope.widgetZone = {};
16+
$scope.vm = {};
17+
1318
dataService.getItems('/api/widgets', { })
1419
.success(function (data) {
1520
angular.copy(data, $scope.vm);
@@ -19,7 +24,8 @@
1924
}
2025
if (zones.length > 0) { $scope.widgetZones.list1 = zones[0].Widgets; }
2126
if (zones.length > 1) { $scope.widgetZones.list2 = zones[1].Widgets; }
22-
if (zones.length > 2) { $scope.widgetZones.list3 = zones[2].Widgets; }
27+
if (zones.length > 2) { $scope.widgetZones.list3 = zones[2].Widgets; }
28+
2329
spinOff();
2430
})
2531
.error(function () {
@@ -40,13 +46,12 @@
4046
DragDropHandler.addObject(newItem, $scope.widgetZones[list], to);
4147
};
4248

43-
$scope.deleteItem = function (itemId, zones) {
49+
$scope.deleteItem = function (itemId, zones, zoneId) {
4450
for (var i = zones.length - 1; i >= 0; i--) {
4551
if (zones[i].Id === itemId) {
4652
zones.splice(i, 1);
4753
}
4854
}
49-
$scope.save();
5055
};
5156

5257
$('#myModal').on('show.bs.modal', function (e) {
@@ -55,15 +60,22 @@
5560
});
5661

5762
$scope.save = function () {
58-
var zones = $scope.vm.WidgetZones;
59-
if (zones.length > 0) { zones[0].Widgets = $scope.widgetZones.list1; }
60-
if (zones.length > 1) { zones[1].Widgets = $scope.widgetZones.list2; }
61-
if (zones.length > 2) { zones[2].Widgets = $scope.widgetZones.list3; }
63+
dataService.updateItem("/api/widgets/update/item", $scope.vm.WidgetZones)
64+
.success(function (data) {
65+
toastr.success($rootScope.lbl.completed);
66+
$scope.load();
67+
spinOff();
68+
})
69+
.error(function () {
70+
toastr.error($rootScope.lbl.updateFailed);
71+
spinOff();
72+
});
6273
}
6374

6475
$scope.load();
6576

6677
$(document).ready(function () {
6778
bindCommon();
6879
});
80+
6981
}]);

BlogEngine/BlogEngine.NET/admin/app/custom/widgets/widgetView.html

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,8 @@
66
}
77
</style>
88
<div class="main-header clearfix">
9-
<h2 class="page-title pull-left">
10-
{{lbl.widgets}}
11-
</h2>
12-
<div class="search pull-right">
13-
<i class="fa fa-search"></i>
14-
<input type="text" ng-model="query" ng-change="search()" placeholder="{{lbl.search}}..." />
15-
</div>
9+
<h2 class="page-title pull-left">{{lbl.widgets}}</h2>
10+
<button type="button" ng-click='save()' class="btn btn-success btn-sm btn-hasicon pull-left"><i class="fa fa-save"></i>{{lbl.save}}</button>
1611
</div>
1712
<div class="content-inner">
1813
<div class="row">
@@ -38,7 +33,7 @@ <h4 class="modal-title">Edit widget</h4>
3833
<div class="col-lg-8">
3934

4035
<div class="col-lg-6">
41-
<h3>Widgets</h3>
36+
<h3>Available Widgets</h3>
4237
<div class='unstyled-list'>
4338
<div class="draggable" ng-repeat='iw in vm.AvailableWidgets' draggable="iw" draggable-target='.sortable'>
4439
<div class="panel panel-primary">
@@ -59,7 +54,7 @@ <h3>{{widgetZones.titles[0]}}</h3>
5954
{{item.Title}}
6055
<div class="btn-group pull-right">
6156
<button type="button" data-toggle="modal" data-target="#myModal" data-id="{{item.Id}}" class="btn btn-default btn-sm">Edit</button>
62-
<button type="button" ng-click='deleteItem(item.Id, widgetZones.list1)' class="btn btn-danger btn-sm">X</button>
57+
<button type="button" ng-click='deleteItem(item.Id, widgetZones.list1, widgetZones.titles[0])' class="btn btn-danger btn-sm">X</button>
6358
</div>
6459
</div>
6560
</div>
@@ -77,7 +72,7 @@ <h3>{{widgetZones.titles[1]}}</h3>
7772
{{ item.Title }}
7873
<div class="btn-group pull-right">
7974
<button type="button" data-toggle="modal" data-target="#myModal" data-id="{{item.Id}}" class="btn btn-default btn-sm">Edit</button>
80-
<button type="button" ng-click='deleteItem(item.Id, widgetZones.list2)' class="btn btn-danger btn-sm">X</button>
75+
<button type="button" ng-click='deleteItem(item.Id, widgetZones.list2, widgetZones.titles[1])' class="btn btn-danger btn-sm">X</button>
8176
</div>
8277
</div>
8378
</div>
@@ -95,7 +90,7 @@ <h3>{{widgetZones.titles[2]}}</h3>
9590
{{ item.Title }}
9691
<div class="btn-group pull-right">
9792
<button type="button" data-toggle="modal" data-target="#myModal" data-id="{{item.Id}}" class="btn btn-default btn-sm">Edit</button>
98-
<button type="button" ng-click='deleteItem(item.Id, widgetZones.list3)' class="btn btn-danger btn-sm">X</button>
93+
<button type="button" ng-click='deleteItem(item.Id, widgetZones.list3, widgetZones.titles[2])' class="btn btn-danger btn-sm">X</button>
9994
</div>
10095
</div>
10196
</div>
@@ -107,8 +102,8 @@ <h3>{{widgetZones.titles[2]}}</h3>
107102
</div>
108103

109104
<div class="col-lg-4">
110-
<h3>vm.WidgetZones</h3>
111-
<pre>{{ vm.WidgetZones | json }}</pre>
105+
<!--<h3>vm.WidgetZones</h3>
106+
<pre>{{ vm.WidgetZones | json }}</pre>-->
112107
</div>
113108

114109
</div>

BlogEngine/BlogEngine.NET/admin/themes/standard/sidebar.cshtml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
<ul class="sub-nav-sidebar">
5858
<li data-ng-class="{ active: isActive('/custom/themes')}"><a class="ng-binding" href="{{SiteVars.RelativeWebRoot}}admin/#/custom/themes">@Resources.labels.themes</a></li>
5959
<li data-ng-class="{ active: isActive('/custom/plugins')}"><a class="ng-binding" href="{{SiteVars.RelativeWebRoot}}admin/#/custom/plugins">Plugins</a></li>
60+
<li data-ng-class="{ active: isActive('/custom/widgets')}"><a class="ng-binding" href="{{SiteVars.RelativeWebRoot}}admin/#/custom/widgets">@Resources.labels.widgets</a></li>
6061
</ul>
6162
</li>
6263
}

0 commit comments

Comments
 (0)