Skip to content

Commit 52fc593

Browse files
committed
Post and page custom fields
1 parent cffd854 commit 52fc593

5 files changed

Lines changed: 162 additions & 89 deletions

File tree

BlogEngine/BlogEngine.Core/Data/ViewModels/DashboardVM.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,15 @@ private void LoadTrash()
189189
}
190190
}
191191

192-
var comms = _comments.Where(c => c.IsDeleted);
192+
var comms = new List<Comment>();
193+
foreach (var p in Post.Posts)
194+
{
195+
if (!Security.IsAuthorizedTo(Rights.EditOtherUsersPosts))
196+
if (p.Author.ToLower() != Security.CurrentUser.Identity.Name.ToLower())
197+
continue;
198+
199+
comms.AddRange(p.DeletedComments);
200+
}
193201
if (comms.Count() > 0)
194202
{
195203
foreach (var c in comms)

BlogEngine/BlogEngine.NET/admin/app/controllers/pageEditor.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@
5555
});
5656
}
5757

58+
$scope.publish = function (doPublish) {
59+
$scope.page.IsPublished = doPublish;
60+
$scope.save();
61+
}
62+
5863
$scope.save = function () {
5964
if (!$('#form').valid()) {
6065
return false;
@@ -124,6 +129,17 @@
124129
.error(function () { toastr.error("Import failed"); });
125130
}
126131

132+
$scope.status = function () {
133+
// 0 - unpublished; 1 - saved; 2 - published;
134+
if ($scope.page && $scope.page.Id && $scope.page.IsPublished) {
135+
return 2;
136+
}
137+
if ($scope.page && $scope.page.Id && !$scope.page.IsPublished) {
138+
return 1;
139+
}
140+
return 0;
141+
};
142+
127143
$scope.load();
128144

129145
$(document).ready(function () {
@@ -245,5 +261,5 @@ var newPage = {
245261
"DateCreated": moment().format("YYYY-MM-DD HH:mm"),
246262
"Slug": "",
247263
"ShowInList": true,
248-
"IsPublished": true
264+
"IsPublished": false
249265
}

BlogEngine/BlogEngine.NET/admin/editpage.cshtml

Lines changed: 107 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -7,98 +7,129 @@
77
Security.RedirectForUnauthorizedRequest();
88
}
99
}
10-
<style>
11-
.input-page-title { font-size: 18px; height: 30px; margin: 0; margin-top: 7px; line-height: 30px; border: 0; font-weight: 500; font-family: "Helvetica"; }
12-
</style>
1310
<div class="content" ng-controller="PageEditorController">
14-
<form id="form" action="">
15-
<div class="page-header clearfix">
16-
<div style="margin: 0 18px !important">
17-
<input type="text" id="txtTitle" name="txtTitle" placeholder="{{lbl.titleOfPage}}..." class="pull-left input-page-title" data-ng-model="page.Title" />
18-
<span ng-if="page.Id"><a href="{{page.RelativeLink}}" class="btn btn-default btn-tabkey pull-right" target="_blank"><i class="fa fa-eye"></i> {{lbl.goToPage}}</a></span>
19-
<a href="#" data-ng-click="save()" class="btn btn-success btn-tabkey pull-right"><i class="fa fa-save"></i>{{lbl.save}}</a>
20-
<a href="" onclick="window.history.back()" class="btn btn-default btn-tabkey pull-right"><i class="fa fa-ban"></i>{{lbl.cancel}}</a>
21-
<span id="spinner" class="loaded btn-tabkey pull-right"><i class='fa fa-spinner fa-spin fa-large'></i></span>
22-
</div>
23-
</div>
24-
25-
<div class="content-inner">
26-
<div class="col col-md-9">
27-
<div id="overlay-editor">
28-
@RenderPage(BlogConfig.DefaultEditor)
29-
</div>
30-
31-
<div style="border-bottom: 1px solid #e5e5e5; display: inline-block; width: 100%; margin: 8px 0">
32-
<h4 class="page-title pull-left">{{lbl.customFields}}</h4>
33-
<a href="" ng-disabled="page.Id === null || page.Id === ''" class="btn btn-default btn-header pull-right" type="button" id="btnCustomFields" ng-click="showCustom()" toggle="modal"><i class="fa fa-plus"></i>{{lbl.add}}</a>
34-
</div>
35-
<div id="frm-custom-edit" ng-if="customFields && customFields.length > 0" class="form-horizontal clearfix">
36-
<div style="display: inline-block; width: 100%; padding: 0 0 15px 0" data-ng-repeat="item in customFields">
37-
<label class="control-label col-md-4">{{item.Key}}</label>
38-
<div class="col col-md-7">
39-
<input type="text" class="form-control" data-ng-model="item.Value" />
11+
<div class="page-header clearfix">
12+
<span ng-if="page.Id"><a href="{{page.RelativeLink}}" class="btn btn-success pull-left" target="_blank"><i class="fa fa-eye"></i> {{lbl.goToPage}}</a></span>
13+
<a ng-if="status() == 2" href="#" data-ng-click="save()" class="btn btn-primary pull-left"><i class="fa fa-save"></i>{{lbl.save}}</a>
14+
<a ng-if="status() < 2" href="#" data-ng-click="publish(true)" class="btn btn-success pull-left"><i class="fa fa-check"></i>{{lbl.publish}}</a>
15+
<span ng-if="status() < 2"><a href="#" ng-click="save()" class="btn btn-primary pull-left"><i class="fa fa-save"></i> {{lbl.save}}</a></span>
16+
<span ng-if="page.Id && page.IsPublished"><a href="#" class="btn btn-warning pull-left" ng-click="publish(false)"><i class="fa fa-undo"></i> {{lbl.unpublish}}</a></span>
17+
<a href="" onclick="window.history.back()" class="btn btn-default pull-left"><i class="fa fa-ban"></i>{{lbl.cancel}}</a>
18+
<span id="spinner" class="loaded btn-tabkey"><i class='fa fa-spinner fa-spin fa-lg'></i></span>
19+
<span id="spinner" class="loaded pull-left"><i class='fa fa-spinner fa-spin fa-large'></i></span>
20+
</div>
21+
<div class="content-inner newpost">
22+
<form id="form" action="">
23+
<div id="modal-custom-fields" class="modal fade">
24+
<div class="modal-dialog">
25+
<div class="modal-content">
26+
<div class="modal-header">
27+
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="focusInput=false"><i class="fa fa-times"></i></button>
28+
<h4 class="modal-title">{{lbl.add}}</h4>
29+
</div>
30+
<div class="modal-body modal-roles">
31+
<div class="form-group">
32+
<label class="control-label" for="txtKey">Key</label>
33+
<input type="text" id="txtKey" name="txtKey" class="form-control" data-ng-model="editItem.Key" focus-me="focusInput" />
34+
<label class="control-label" for="txtValue">Value</label>
35+
<input type="text" id="txtValue" name="txtValue" class="form-control" data-ng-model="editItem.Value" />
36+
</div>
4037
</div>
41-
<div class="col col-md-1">
42-
<a href="" ng-click="deleteCustom(item.Key, item.ObjectId)" title="{{lbl.doDelete}}" style="position: relative; top: 10px; color: red"><i class="fa fa-times"></i></a>
38+
<div class="modal-footer">
39+
<button type="button" data-ng-click="saveCustom()" class="btn btn-success btn-tabkey pull-right"><i class="fa fa-save"></i>{{lbl.save}}</button>
40+
<button type="button" class="btn btn-default" data-dismiss="modal" ng-click="focusInput=false"><i class="fa fa-ban"></i>{{lbl.cancel}}</button>
4341
</div>
4442
</div>
4543
</div>
46-
4744
</div>
45+
<div class="row">
46+
<div class="col col-md-9">
47+
<div class="form-group">
48+
<input type="text" id="txtTitle" name="txtTitle" title="Please enter title" placeholder="{{lbl.titleOfPage}}..." class="form-control newpost-title" data-ng-model="page.Title" />
49+
</div>
50+
@RenderPage(BlogConfig.DefaultEditor)
4851

49-
<div class="col col-md-3">
50-
<div class="panel panel-default">
51-
<div class="panel-heading">
52-
<i class="fa fa-file"></i> {{lbl.pageMeta}}
53-
</div>
54-
<div class="panel-body">
55-
<div class="form-group">
56-
<label class="control-label" for="txtSlug">{{lbl.slug}}</label>
57-
<input type="text" class="form-control" id="txtSlug" data-ng-model="page.Slug" />
58-
</div>
59-
<div class="form-group">
60-
<label class="control-label" for="txtDate">{{lbl.datePublished}}</label>
61-
<input type="text" class="form-control dateFormatted" id="txtDate" name="txtDate" data-ng-model="page.DateCreated" />
62-
</div>
63-
<div class="form-group">
64-
<label class="control-label" for="txtExcerpt">{{lbl.description}}</label>
65-
<textarea class="form-control" rows="2" id="txtExcerpt" data-ng-model="page.Description"> </textarea>
66-
</div>
67-
<div class="form-group">
68-
<label class="control-label" for="txtKeywords">{{lbl.keywords}}</label>
69-
<textarea class="form-control" rows="2" id="txtKeywords" data-ng-model="page.Keywords"> </textarea>
70-
</div>
71-
<div class="form-group">
72-
<label class="control-label" for="selParents">{{lbl.parent}}</label>
73-
<select id="selParents" class="form-control" data-ng-options="o.OptionName for o in lookups.PageList" data-ng-model="selectedParent"></select>
74-
</div>
75-
<div class="form-group">
76-
<label class="control-label" for="txtSortOrder">{{lbl.sortOrder}}</label>
77-
<input type="text" class="form-control" id="txtSortOrder" data-ng-model="page.SortOrder" />
52+
</div>
53+
54+
<div class="col col-md-3">
55+
<div class="panel panel-default">
56+
<div class="panel-heading">
57+
<a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#pagemeta" aria-expanded="false" aria-controls="pagemeta">
58+
<i class="fa fa-file"></i> {{lbl.pageMeta}}
59+
</a>
7860
</div>
79-
<div class="clearfix">
80-
<div class="col-sm-6">
81-
<div class="checkbox">
82-
<label>
83-
<input type="checkbox" data-ng-model="page.IsFrontPage" name="cbFrontPage" />
84-
{{lbl.isFrontPage}}
85-
</label>
61+
<div id="pagemeta" class="panel-collapse collapse" role="tabpanel" aria-labelledby="pagemeta">
62+
<div class="panel-body">
63+
<div class="form-group">
64+
<label class="control-label" for="txtSlug">{{lbl.slug}}</label>
65+
<input type="text" class="form-control" id="txtSlug" data-ng-model="page.Slug" />
66+
</div>
67+
<div class="form-group">
68+
<label class="control-label" for="txtDate">{{lbl.datePublished}}</label>
69+
<input type="text" class="form-control dateFormatted" id="txtDate" name="txtDate" data-ng-model="page.DateCreated" />
70+
</div>
71+
<div class="form-group">
72+
<label class="control-label" for="txtExcerpt">{{lbl.description}}</label>
73+
<textarea class="form-control" rows="2" id="txtExcerpt" data-ng-model="page.Description"> </textarea>
74+
</div>
75+
<div class="form-group">
76+
<label class="control-label" for="txtKeywords">{{lbl.keywords}}</label>
77+
<textarea class="form-control" rows="2" id="txtKeywords" data-ng-model="page.Keywords"> </textarea>
78+
</div>
79+
<div class="form-group">
80+
<label class="control-label" for="selParents">{{lbl.parent}}</label>
81+
<select id="selParents" class="form-control" data-ng-options="o.OptionName for o in lookups.PageList" data-ng-model="selectedParent"></select>
82+
</div>
83+
<div class="form-group">
84+
<label class="control-label" for="txtSortOrder">{{lbl.sortOrder}}</label>
85+
<input type="text" class="form-control" id="txtSortOrder" data-ng-model="page.SortOrder" />
86+
</div>
87+
<div class="clearfix">
88+
<div class="col-sm-6">
89+
<div class="checkbox">
90+
<label>
91+
<input type="checkbox" data-ng-model="page.IsFrontPage" name="cbFrontPage" />
92+
{{lbl.isFrontPage}}
93+
</label>
94+
</div>
95+
</div>
96+
<div class="col-sm-6">
97+
<div class="checkbox">
98+
<label>
99+
<input type="checkbox" data-ng-model="page.ShowInList" name="cbShowInList" />
100+
{{lbl.showInList}}
101+
</label>
102+
</div>
103+
</div>
86104
</div>
87105
</div>
88-
<div class="col-sm-6">
89-
<div class="checkbox">
90-
<label>
91-
<input type="checkbox" data-ng-model="page.ShowInList" name="cbShowInList" />
92-
{{lbl.showInList}}
93-
</label>
106+
</div>
107+
108+
</div>
109+
110+
<div class="panel panel-default">
111+
<div class="panel-heading">
112+
<a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#customfil" aria-expanded="false" aria-controls="pagemeta">
113+
<i class="fa fa-cog"></i> {{lbl.customFields}}
114+
</a>
115+
</div>
116+
<div id="customfil" class="panel-collapse collapse" role="tabpanel" aria-labelledby="customfil">
117+
<div class="panel-body">
118+
<a ng-disabled="page.Id === null || page.Id === ''" class="btn btn-success btn-block" id="btnCustomFields" ng-click="showCustom()" data-toggle="modal"><i class="fa fa-plus"></i>{{lbl.add}}</a>
119+
<div id="frm-custom-edit" ng-if="customFields && customFields.length > 0" class="form-horizontal clearfix" style="margin: 5px 0">
120+
<div data-ng-repeat="item in customFields">
121+
<label class="control-label">{{item.Key}}</label>
122+
<a href="" ng-click="deleteCustom(item.Key, item.ObjectId)" title="{{lbl.doDelete}}" class="pull-right" style="position: relative; top: 10px; color: red"><i class="fa fa-times"></i></a>
123+
<input type="text" class="form-control" data-ng-model="item.Value" />
124+
</div>
94125
</div>
95126
</div>
96127
</div>
97128
</div>
98129
</div>
99130
</div>
100-
</div>
101-
</form>
131+
</form>
132+
</div>
102133
</div>
103134

104135
@Scripts.Render("~/scripts/wysiwyg")

BlogEngine/BlogEngine.NET/admin/editpost.cshtml

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,28 @@
6161
</form>
6262

6363
<form id="form" action="">
64+
<div id="modal-custom-fields" class="modal fade">
65+
<div class="modal-dialog">
66+
<div class="modal-content">
67+
<div class="modal-header">
68+
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="focusInput=false"><i class="fa fa-times"></i></button>
69+
<h4 class="modal-title">{{lbl.add}}</h4>
70+
</div>
71+
<div class="modal-body modal-roles">
72+
<div class="form-group">
73+
<label class="control-label" for="txtKey">Key</label>
74+
<input type="text" id="txtKey" name="txtKey" class="form-control" data-ng-model="editItem.Key" focus-me="focusInput" />
75+
<label class="control-label" for="txtValue">Value</label>
76+
<input type="text" id="txtValue" name="txtValue" class="form-control" data-ng-model="editItem.Value" />
77+
</div>
78+
</div>
79+
<div class="modal-footer">
80+
<button type="button" data-ng-click="saveCustom()" class="btn btn-success btn-tabkey pull-right"><i class="fa fa-save"></i>{{lbl.save}}</button>
81+
<button type="button" class="btn btn-default" data-dismiss="modal" ng-click="focusInput=false"><i class="fa fa-ban"></i>{{lbl.cancel}}</button>
82+
</div>
83+
</div>
84+
</div>
85+
</div>
6486
<div class="row">
6587
<div class="col col-md-9">
6688
<div class="form-group">
@@ -142,15 +164,11 @@
142164

143165
<div class="panel-body">
144166
<a ng-disabled="post.Id === null || post.Id === ''" class="btn btn-success btn-block" id="btnCustomFields" ng-click="showCustom()" data-toggle="modal"><i class="fa fa-plus"></i>{{lbl.add}}</a>
145-
<div id="frm-custom-edit" ng-if="customFields && customFields.length > 0" class="form-horizontal clearfix">
146-
<div style="display: inline-block; width: 100%; padding: 0 0 15px 0" data-ng-repeat="item in customFields">
147-
<label class="control-label col-md-4">{{item.Key}}</label>
148-
<div class="col col-md-7">
149-
<input type="text" class="form-control" data-ng-model="item.Value" />
150-
</div>
151-
<div class="col col-md-1">
152-
<a href="" ng-click="deleteCustom(item.Key, item.ObjectId)" title="{{lbl.doDelete}}" style="position: relative; top: 10px; color: red"><i class="fa fa-times"></i></a>
153-
</div>
167+
<div id="frm-custom-edit" ng-if="customFields && customFields.length > 0" class="form-horizontal clearfix" style="padding: 5px 0">
168+
<div data-ng-repeat="item in customFields">
169+
<label class="control-label">{{item.Key}}</label>
170+
<a href="" ng-click="deleteCustom(item.Key, item.ObjectId)" title="{{lbl.doDelete}}" class="pull-right" style="position: relative; top: 10px; color: red"><i class="fa fa-times"></i></a>
171+
<input type="text" class="form-control" data-ng-model="item.Value" />
154172
</div>
155173
</div>
156174
</div>

0 commit comments

Comments
 (0)