Skip to content

Commit 384f04a

Browse files
committed
Added widgets gallery page (3.2.2.0)
1 parent 9744f99 commit 384f04a

File tree

8 files changed

+244
-5
lines changed

8 files changed

+244
-5
lines changed

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.1.9")]
22+
[assembly: AssemblyVersion("3.2.2.0")]
2323
[assembly: SecurityRules(SecurityRuleSet.Level1)]

BlogEngine/BlogEngine.NET/AppCode/App_Start/BlogEngineConfig.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ static void RegisterBundles(BundleCollection bundles)
137137
.Include("~/admin/app/custom/plugins/pluginController.js")
138138
.Include("~/admin/app/custom/themes/themeController.js")
139139
.Include("~/admin/app/custom/widgets/widgetController.js")
140+
.Include("~/admin/app/custom/widgets/widgetGalleryController.js")
140141

141142
.Include("~/admin/app/security/users/userController.js")
142143
.Include("~/admin/app/security/roles/roleController.js")

BlogEngine/BlogEngine.NET/BlogEngine.NET.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@
137137
<Content Include="admin\app\custom\themes\themeGallery.html" />
138138
<Content Include="admin\app\custom\themes\themeView.html" />
139139
<Content Include="admin\app\custom\widgets\widgetController.js" />
140+
<Content Include="admin\app\custom\widgets\widgetGallery.html" />
141+
<Content Include="admin\app\custom\widgets\widgetGalleryController.js" />
140142
<Content Include="admin\app\custom\widgets\widgetView.html" />
141143
<Content Include="admin\themes\standard\css\styles.css" />
142144
<Content Include="admin\themes\standard\img\logo-sidebar.png" />

BlogEngine/BlogEngine.NET/admin/app/app.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
.when("/custom/themes", { templateUrl: "app/custom/themes/themeView.html" })
1919
.when("/custom/themes/gallery", { templateUrl: "app/custom/themes/themeGallery.html" })
2020
.when("/custom/widgets", { templateUrl: "app/custom/widgets/widgetView.html" })
21+
.when("/custom/widgets/gallery", { templateUrl: "app/custom/widgets/widgetGallery.html" })
2122

2223
.when("/security/profile", { templateUrl: "app/security/profile/profileView.html" })
2324
.when("/security/roles", { templateUrl: "app/security/roles/roleView.html" })

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
$scope.editId = {};
66
$scope.editTitle = {};
77
$scope.editZone = {};
8+
$scope.IsPrimary = $rootScope.SiteVars.IsPrimary == "True";
89

910
$scope.load = function () {
1011
spinOn();
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<div class="custom-plugins-gallery-view" data-ng-controller="CustomWidgetGalleryController">
2+
<div id="modal-info" class="modal fade">
3+
<div class="modal-dialog">
4+
<div class="modal-content">
5+
<div class="modal-header">
6+
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="focusInput=false"><i class="fa fa-times"></i></button>
7+
<h4 class="modal-title">{{package.Title}}</h4>
8+
</div>
9+
<div class="modal-body modal-package">
10+
<div class="modal-plugin-info">
11+
<div class="row">
12+
<div class="col-md-3">
13+
<div class="item-image">
14+
<img ng-if="!package.PackageUrl" ng-src="{{package.IconUrl}}" alt="Package image" />
15+
<a ng-if="package.PackageUrl" href="{{package.PackageUrl}}" target="_blank"><img class="pkg-img" ng-src="{{package.IconUrl}}" alt="Package image" /></a>
16+
</div>
17+
</div>
18+
<div class="col-md-9">
19+
<p class="item-desc" ng-bind-html="package.Description"></p>
20+
<div class="form-horizontal">
21+
<div class="form-group"><span class="col-md-3">{{lbl.author}}</span> <div class="col-md-9"><span ng-bind-html="package.Authors"></span></div></div>
22+
<div class="form-group" ng-if="package.Website"><span class="col-md-3">{{lbl.website}}</span> <div class="col-md-9"><a href="{{package.Website}}" class="text-ellipsis" title="Author website" target="_blank">{{package.Website}}</a></div></div>
23+
<div class="form-group" ng-if="package.Tags"><span class="col-md-3">{{lbl.tags}}</span> <div class="col-md-9"><span ng-bind-html="package.Tags"></span></div></div>
24+
<div class="form-group" ng-if="package.LastUpdated"><span class="col-md-3">{{lbl.date}}</span> <div class="col-md-9"> <span ng-bind-html="package.LastUpdated"></span> </div></div>
25+
<div class="form-group" ng-if="package.DownloadCount"> <span class="col-md-3">{{lbl.downloads}}</span> <div class="col-md-9">{{package.DownloadCount}}</div></div>
26+
</div>
27+
</div>
28+
</div>
29+
</div>
30+
<div class="modal-package-review" ng-if="package.Extra.Reviews != null && package.Extra.Reviews.length > 0">
31+
<div class="panel panel-default">
32+
<div class="panel-heading">
33+
<div class="panel-title">{{lbl.reviews}}</div>
34+
</div>
35+
<ul class="list-group">
36+
<li ng-repeat="review in package.Extra.Reviews" class="list-group-item">
37+
<span class="badge">{{review.Rating}}</span>
38+
<b>{{review.Name}}:</b> {{review.Body}}
39+
</li>
40+
</ul>
41+
</div>
42+
</div>
43+
</div>
44+
</div>
45+
</div>
46+
</div>
47+
<div class="main-header clearfix">
48+
<h2 class="page-title pull-left">{{lbl.gallery}}</h2>
49+
<button type="button" class="btn btn-default btn-sm btn-hasicon pull-left" onclick="window.history.back()"><i class="fa fa-angle-left"></i>Back</button>
50+
<button class="right-side-toggle pull-right"><span></span><span></span><span></span></button>
51+
<div class="right-side pull-right">
52+
<div class="search pull-right">
53+
<i class="fa fa-search"></i>
54+
<input type="text" ng-model="query" ng-change="search()" placeholder="{{lbl.search}}..." />
55+
</div>
56+
<div class="dropdown pull-right">
57+
<button class="btn btn-default btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">Most downloaded<i class="fa fa-angle-down"></i></button>
58+
<ul class="dropdown-menu dropdown-menu-filter">
59+
<li><a id="fltr-new" data-value="New" ng-click="sortBy('LastUpdated')">Latest</a></li>
60+
<li><a id="fltr-dwn" data-value="Downloads" ng-click="sortBy('DownloadCount')">Most downloaded</a></li>
61+
<li><a id="fltr-pop" data-value="Popular" ng-click="sortBy('Rating')">Highest rated</a></li>
62+
</ul>
63+
</div>
64+
</div>
65+
</div>
66+
<div class="content-inner">
67+
<div class="row">
68+
<div data-ng-repeat="item in pagedItems[currentPage] | orderBy:sortingOrder:reverse" class="col-xs-6 col-md-6 col-lg-4">
69+
<div class="gallery-item">
70+
<div class="item-details-left">
71+
<div class="item-img-box"><span><img ng-if="item.IconUrl === ''" src="../Content/images/blog/pkg.png" /> <img ng-if="item.IconUrl != ''" ng-src="{{item.IconUrl}}" /></span></div>
72+
<div class="item-buttons">
73+
<a ng-click="installPackage(item.Id)" class="btn btn-sm btn-default btn-left" angular-tooltip tooltip="lbl.download"><i class="fa fa-download"></i></a>
74+
<a href="" ng-click="showInfo(item.Id)" class="btn btn-sm btn-default btn-right" angular-tooltip tooltip="lbl.view"><i class="fa fa-info-circle"></i></a>
75+
</div>
76+
</div>
77+
<div class="item-details-right">
78+
<ul>
79+
<li>{{item.Title}}</li>
80+
<li>{{item.Authors}}</li>
81+
<li>{{item.DownloadCount}} Downloads</li>
82+
<li>
83+
<span class="star-rating">
84+
<input disabled="disabled" type="radio" name="{{item.Id}}" value="1" ng-checked="checkStar(1, item.Rating)"><i></i>
85+
<input disabled="disabled" type="radio" name="{{item.Id}}" value="2" ng-checked="checkStar(2, item.Rating)"><i></i>
86+
<input disabled="disabled" type="radio" name="{{item.Id}}" value="3" ng-checked="checkStar(3, item.Rating)"><i></i>
87+
<input disabled="disabled" type="radio" name="{{item.Id}}" value="4" ng-checked="checkStar(4, item.Rating)"><i></i>
88+
<input disabled="disabled" type="radio" name="{{item.Id}}" value="5" ng-checked="checkStar(5, item.Rating)"><i></i>
89+
</span>
90+
</li>
91+
</ul>
92+
</div>
93+
</div>
94+
</div>
95+
</div>
96+
<ul class="pagination" ng-if="items.length > itemsPerPage">
97+
<li data-ng-class="{disabled: currentPage == 0}"><a data-ng-click="prevPage()" title="{{lbl.prev}}"><i class="fa fa-angle-left"></i></a></li>
98+
<li data-ng-repeat="n in range(pagedItems.length)" data-ng-class="{active: n == currentPage}" data-ng-click="setPage()"><a data-ng-bind="n + 1">1</a></li>
99+
<li data-ng-class="{disabled: currentPage == pagedItems.length - 1}"><a data-ng-click="nextPage()" title="{{lbl.next}}"><i class="fa fa-angle-right"></i></a></li>
100+
</ul>
101+
</div>
102+
</div>
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
angular.module('blogAdmin').controller('CustomWidgetGalleryController', ["$rootScope", "$scope", "$location", "$filter", "dataService", function ($rootScope, $scope, $location, $filter, dataService) {
2+
$scope.items = [];
3+
$scope.customFields = [];
4+
$scope.editId = "";
5+
$scope.package = {};
6+
$scope.activeTheme = ActiveTheme;
7+
$scope.IsPrimary = $rootScope.SiteVars.IsPrimary == "True";
8+
$scope.fltr = 'all';
9+
$scope.order = 'DownloadCount desc';
10+
$scope.sortingOrder = 'DownloadCount';
11+
$scope.reverse = true;
12+
$scope.selectedRating = 0;
13+
$scope.author = UserVars.Name;
14+
15+
$scope.load = function () {
16+
spinOn();
17+
dataService.getItems('/api/packages', { take: 0, skip: 0, filter: $scope.fltr, order: 'LastUpdated desc' })
18+
.success(function (data) {
19+
angular.copy(data, $scope.items);
20+
gridInit($scope, $filter);
21+
$scope.gridFilter('PackageType', 'Widget', 'pub');
22+
var pkgId = getFromQueryString('pkgId');
23+
if (pkgId != null) {
24+
$scope.query = pkgId;
25+
$scope.search();
26+
}
27+
spinOff();
28+
})
29+
.error(function () {
30+
toastr.error($rootScope.lbl.errorLoadingPackages);
31+
spinOff();
32+
});
33+
}
34+
35+
$scope.showInfo = function (id) {
36+
dataService.getItems('/api/packages/' + id)
37+
.success(function (data) {
38+
angular.copy(data, $scope.package);
39+
$scope.selectedRating = $scope.package.Rating;
40+
$scope.removeEmptyReviews();
41+
})
42+
.error(function () {
43+
toastr.error($rootScope.lbl.errorLoadingPackages);
44+
});
45+
$("#modal-info").modal();
46+
}
47+
48+
$scope.removeEmptyReviews = function () {
49+
if ($scope.package.Extra != null && $scope.package.Extra.Reviews != null) {
50+
var reviews = [];
51+
for (var i = 0; i < $scope.package.Extra.Reviews.length; i++) {
52+
var review = $scope.package.Extra.Reviews[i];
53+
if (review.Body.length > 0) {
54+
reviews.push(review);
55+
}
56+
}
57+
$scope.package.Extra.Reviews = reviews;
58+
}
59+
}
60+
61+
$scope.installPackage = function (pkgId) {
62+
spinOn();
63+
dataService.updateItem("/api/packages/install/" + pkgId, pkgId)
64+
.success(function (data) {
65+
toastr.success($rootScope.lbl.completed);
66+
$scope.load();
67+
})
68+
.error(function () {
69+
toastr.error($rootScope.lbl.failed);
70+
spinOff();
71+
});
72+
}
73+
74+
$scope.uninstallPackage = function (pkgId) {
75+
spinOn();
76+
dataService.updateItem("/api/packages/uninstall/" + pkgId, pkgId)
77+
.success(function (data) {
78+
toastr.success($rootScope.lbl.completed);
79+
$scope.load();
80+
})
81+
.error(function () {
82+
toastr.error($rootScope.lbl.failed);
83+
spinOff();
84+
});
85+
}
86+
87+
$scope.upgradePackage = function (pkgId) {
88+
spinOn();
89+
dataService.updateItem("/api/packages/uninstall/" + pkgId, pkgId)
90+
.success(function (data) {
91+
$scope.installPackage(pkgId);
92+
})
93+
.error(function () {
94+
toastr.error($rootScope.lbl.failed);
95+
spinOff();
96+
});
97+
}
98+
99+
$scope.load();
100+
101+
$(document).ready(function () {
102+
bindCommon();
103+
});
104+
}]);

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

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,25 @@
44
<div class="modal-content">
55
<div class="modal-header">
66
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="closeEditForm()"><i class="fa fa-times"></i></button>
7+
<h4 class="modal-title">{{lbl.edit}} {{lbl.widgets}}</h4>
8+
</div>
9+
<div class="modal-body">
710
<div class="form-group">
811
<div class="input-group">
9-
<input type="text" placeholder="{{lbl.name}}" class="form-control" id="txtWidgetTitle" name="txtWidgetTitle" value="xxx" />
12+
<input type="text" class="form-control" id="txtWidgetTitle" name="txtWidgetTitle" value="" />
1013
<div class="input-group-btn">
11-
<button type="button" class="btn btn-default" ng-click="updateTitle()">Change Name</button>
14+
<button type="button" class="btn btn-success" ng-click="updateTitle()">Change Name</button>
1215
</div>
1316
</div>
1417
</div>
15-
</div>
16-
<div class="modal-body">
1718
<iframe id="settingsFrame" ng-src="{{editSrc}}"></iframe>
1819
</div>
1920
</div>
2021
</div>
2122
</div>
2223
<div class="main-header clearfix">
2324
<h2 class="page-title pull-left">{{lbl.widgets}}</h2>
25+
<a ng-if="IsPrimary" href="{{SiteVars.RelativeWebRoot}}admin/#/custom/widgets/gallery" class="btn btn-success btn-sm btn-hasicon pull-left"><i class="fa fa-plus"></i>{{lbl.theNew}}</a>
2426
<button type="button" ng-click="save()" class="btn btn-success btn-sm btn-hasicon pull-left"><i class="fa fa-check"></i>{{lbl.save}}</button>
2527
</div>
2628
<div class="content-inner">
@@ -72,6 +74,32 @@ <h4>Widget Zone <span>({{widgetZones.titles[2]}})</span></h4>
7274
</li>
7375
</ul>
7476
</div>
77+
<div class="col-sm-4" ng-if="widgetZones.titles && widgetZones.titles.length > 3">
78+
<h4>Widget Zone <span>({{widgetZones.titles[3]}})</span></h4>
79+
<ul class="sortable widgets-list widgets-list-active" droppable="widgetZones.list4" ng-move="moveObject(from, to, fromList, toList)" ng-create="createObject(object, to, list)" id="list4">
80+
<li ng-if="widgetZones.list4.length < 1" class="sortable-empty">Drag widget here</li>
81+
<li class="ui-state-default" ng-repeat="item in widgetZones.list4 track by item.Id">
82+
{{ item.Title }}
83+
<div class="item-buttons">
84+
<button ng-click="loadEditForm(item.Id, item.Name, item.Title, widgetZones.titles[3])" title="{{lbl.edit}}"><i class="fa fa-pencil"></i></button>
85+
<button ng-click="deleteItem(item.Id, widgetZones.list4, widgetZones.titles[3])" title="{{lbl.remove}}"><i class="fa fa-trash"></i></button>
86+
</div>
87+
</li>
88+
</ul>
89+
</div>
90+
<div class="col-sm-4" ng-if="widgetZones.titles && widgetZones.titles.length > 4">
91+
<h4>Widget Zone <span>({{widgetZones.titles[4]}})</span></h4>
92+
<ul class="sortable widgets-list widgets-list-active" droppable="widgetZones.list5" ng-move="moveObject(from, to, fromList, toList)" ng-create="createObject(object, to, list)" id="list5">
93+
<li ng-if="widgetZones.list5.length < 1" class="sortable-empty">Drag widget here</li>
94+
<li class="ui-state-default" ng-repeat="item in widgetZones.list5 track by item.Id">
95+
{{ item.Title }}
96+
<div class="item-buttons">
97+
<button ng-click="loadEditForm(item.Id, item.Name, item.Title, widgetZones.titles[4])" title="{{lbl.edit}}"><i class="fa fa-pencil"></i></button>
98+
<button ng-click="deleteItem(item.Id, widgetZones.list5, widgetZones.titles[4])" title="{{lbl.remove}}"><i class="fa fa-trash"></i></button>
99+
</div>
100+
</li>
101+
</ul>
102+
</div>
75103
</div>
76104
</div>
77105
</div>

0 commit comments

Comments
 (0)