Skip to content

Commit b907581

Browse files
committed
Link list widget added, recent comments renamed to Comment list.
1 parent 04328df commit b907581

7 files changed

Lines changed: 352 additions & 2 deletions

File tree

BlogEngine/BlogEngine.NET/App_Data/datastore/widgets/be_WIDGET_ZONE.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@
66
<widget id="21108331-e283-4807-a4f6-f1db31163608" title="Category List" showTitle="True">CategoryList</widget>
77
<widget id="5bf32012-4aa3-4031-8346-4d36f0fda6d9" title="Post List" showTitle="True">PostList</widget>
88
<widget id="abde36cb-9ba6-4645-afc3-c0e4292ce72e" title="Newsletter" showTitle="True">Newsletter</widget>
9+
<widget id="4b7cb5e1-b090-4779-b7bc-24898a269477" title="Comment List" showTitle="True">CommentList</widget>
10+
<widget id="fb6b97ea-7d73-4821-a2a3-3aaf13e233d3" title="Link List" showTitle="True">LinkList</widget>
911
</widgets>

BlogEngine/BlogEngine.NET/BlogEngine.NET.csproj

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -714,14 +714,16 @@
714714
<Content Include="Custom\Widgets\TextBox\widget.cshtml" />
715715
<Content Include="Custom\Widgets\CategoryList\widget.cshtml" />
716716
<Content Include="Custom\Widgets\Search\widget.cshtml" />
717-
<Content Include="Custom\Widgets\RecentComments\edit.cshtml" />
718-
<Content Include="Custom\Widgets\RecentComments\widget.cshtml" />
719717
<Content Include="AppCode\Wlw\TagMini.cshtml" />
720718
<Content Include="Custom\Widgets\PageList\widget.cshtml" />
721719
<Content Include="Custom\Widgets\PostList\edit.cshtml" />
722720
<Content Include="Custom\Widgets\PostList\widget.cshtml" />
723721
<Content Include="Custom\Widgets\Newsletter\edit.cshtml" />
724722
<Content Include="Custom\Widgets\Newsletter\widget.cshtml" />
723+
<Content Include="Custom\Widgets\CommentList\edit.cshtml" />
724+
<Content Include="Custom\Widgets\CommentList\widget.cshtml" />
725+
<Content Include="Custom\Widgets\LinkList\edit.cshtml" />
726+
<Content Include="Custom\Widgets\LinkList\widget.cshtml" />
725727
<None Include="Scripts\jquery-2.1.4.intellisense.js" />
726728
<Content Include="Scripts\i18n\angular-locale_aa-dj.js" />
727729
<Content Include="Scripts\i18n\angular-locale_aa-er.js" />
@@ -2111,6 +2113,7 @@
21112113
</Compile>
21122114
<Compile Include="Custom\Widgets\CategoryList\CategoryList.cs" />
21132115
<Compile Include="Custom\Widgets\Common.cs" />
2116+
<Compile Include="Custom\Widgets\LinkList\LinkList.cs" />
21142117
<Compile Include="Custom\Widgets\Newsletter\Newsletter.cs" />
21152118
<Compile Include="default.aspx.cs">
21162119
<DependentUpon>default.aspx</DependentUpon>

BlogEngine/BlogEngine.NET/Custom/Widgets/RecentComments/edit.cshtml renamed to BlogEngine/BlogEngine.NET/Custom/Widgets/CommentList/edit.cshtml

File renamed without changes.

BlogEngine/BlogEngine.NET/Custom/Widgets/RecentComments/widget.cshtml renamed to BlogEngine/BlogEngine.NET/Custom/Widgets/CommentList/widget.cshtml

File renamed without changes.
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Xml;
4+
5+
namespace BlogEngine.NET.Custom.Widgets
6+
{
7+
public class LinkList
8+
{
9+
private string _id;
10+
public LinkList(string id)
11+
{
12+
_id = id;
13+
}
14+
15+
public void SaveLink(string id, string title, string url, string target)
16+
{
17+
var doc = Doc();
18+
var links = doc.SelectSingleNode("links");
19+
if (links == null)
20+
{
21+
links = doc.CreateElement("links");
22+
doc.AppendChild(links);
23+
}
24+
25+
var node = doc.SelectSingleNode(string.Format("links/link[@id='{0}']", id));
26+
if (node == null)
27+
{
28+
node = doc.CreateElement("link");
29+
30+
var atId = doc.CreateAttribute("id");
31+
var atUrl = doc.CreateAttribute("url");
32+
var atTarget = doc.CreateAttribute("target");
33+
34+
atId.Value = Guid.NewGuid().ToString();
35+
atUrl.Value = url;
36+
atTarget.Value = target;
37+
38+
node.Attributes.Append(atId);
39+
node.Attributes.Append(atUrl);
40+
node.Attributes.Append(atTarget);
41+
node.InnerText = title;
42+
43+
links.AppendChild(node);
44+
}
45+
else
46+
{
47+
node.Attributes["url"].Value = url;
48+
node.Attributes["target"].Value = target;
49+
node.InnerText = title;
50+
}
51+
SaveDoc(doc);
52+
}
53+
54+
public void RemoveLink(string id)
55+
{
56+
var doc = Doc();
57+
var links = doc.SelectSingleNode("links");
58+
if (links == null)
59+
{
60+
return;
61+
}
62+
var node = doc.SelectSingleNode(string.Format("links/link[@id='{0}']", id));
63+
if (node != null)
64+
{
65+
links.RemoveChild(node);
66+
SaveDoc(doc);
67+
}
68+
}
69+
70+
public List<LinkItem> GetLinks()
71+
{
72+
var items = new List<LinkItem>();
73+
var doc = Doc();
74+
var links = doc.SelectSingleNode("links");
75+
if (links != null)
76+
{
77+
if(links.ChildNodes != null && links.ChildNodes.Count > 0)
78+
{
79+
foreach (var node in links.ChildNodes)
80+
{
81+
var item = new LinkItem();
82+
var x = (XmlNode)node;
83+
item.Id = x.Attributes["id"].Value;
84+
item.Url = x.Attributes["url"].Value;
85+
item.Target = x.Attributes["target"].Value;
86+
item.Title = x.InnerText;
87+
items.Add(item);
88+
}
89+
}
90+
}
91+
return items;
92+
}
93+
94+
public LinkItem GetLinkById(string id)
95+
{
96+
var item = new LinkItem();
97+
var doc = Doc();
98+
var links = doc.SelectSingleNode("links");
99+
if (links == null)
100+
{
101+
return item;
102+
}
103+
var node = doc.SelectSingleNode(string.Format("links/link[@id='{0}']", id));
104+
if (node != null)
105+
{
106+
item.Id = node.Attributes["id"].Value;
107+
item.Url = node.Attributes["url"].Value;
108+
item.Target = node.Attributes["target"].Value;
109+
item.Title = node.InnerText;
110+
}
111+
return item;
112+
}
113+
114+
#region Private methods
115+
116+
private XmlDocument Doc()
117+
{
118+
var settings = Common.GetSettings(_id);
119+
var doc = new XmlDocument();
120+
if (settings["content"] != null)
121+
{
122+
doc.InnerXml = settings["content"];
123+
}
124+
return doc;
125+
}
126+
127+
private void SaveDoc(XmlDocument doc)
128+
{
129+
var settings = Common.GetSettings(_id);
130+
if(settings != null)
131+
{
132+
settings["content"] = doc.InnerXml;
133+
}
134+
Common.SaveSettings(settings, _id);
135+
}
136+
137+
#endregion
138+
}
139+
140+
public class LinkItem
141+
{
142+
public string Id { get; set; }
143+
public string Url { get; set; }
144+
public string Target { get; set; }
145+
public string Title { get; set; }
146+
}
147+
}
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
@using BlogEngine.NET.Custom.Widgets
2+
@{
3+
// check if edit exists, no need to process
4+
if (Request.HttpMethod == "HEAD") { return; }
5+
6+
var NumberOfLinks = 10;
7+
var TitleAdd = "";
8+
var LinkAdd = "";
9+
var targetNew = false;
10+
var hdnId = "";
11+
12+
var widgetId = Request.QueryString["id"];
13+
var updateLink = BlogEngine.Core.Utils.RelativeOrAbsoluteWebRoot +
14+
"Custom/Widgets/LinkList/edit.cshtml?id=" + widgetId;
15+
var settings = Common.GetSettings(widgetId);
16+
var linkList = new LinkList(widgetId);
17+
18+
Validation.Add("txtNumberOfLinks",
19+
Validator.Required("Field is required"),
20+
Validator.Integer("Field is numeric")
21+
);
22+
23+
if (Request.Form["btnAdd"] != null || Request.Form["btnUpdate"] != null)
24+
{
25+
Validation.Add("txtTitle", Validator.Required("Field is required"));
26+
Validation.Add("txtUrl", Validator.Required("Field is required"));
27+
}
28+
29+
var delId = Request.QueryString["delid"];
30+
if (!string.IsNullOrEmpty(delId))
31+
{
32+
linkList.RemoveLink(delId);
33+
}
34+
var editId = Request.QueryString["editid"];
35+
if (!string.IsNullOrEmpty(editId))
36+
{
37+
var item = linkList.GetLinkById(editId);
38+
TitleAdd = item.Title;
39+
LinkAdd = item.Url;
40+
targetNew = item.Target == "on" ? true : false;
41+
hdnId = item.Id;
42+
}
43+
44+
if (IsPost)
45+
{
46+
if (Validation.IsValid())
47+
{
48+
if (settings["numberoflinks"] != Request.Form["txtNumberOfLinks"])
49+
{
50+
settings["numberoflinks"] = Request.Form["txtNumberOfLinks"];
51+
Common.SaveSettings(settings, widgetId);
52+
}
53+
if (Request.Form["btnAdd"] != null)
54+
{
55+
linkList.SaveLink("", Request.Form["txtTitle"], Request.Form["txtUrl"], Request.Form["cbTarget"]);
56+
}
57+
if (!string.IsNullOrEmpty(Request.Form["hdnId"]))
58+
{
59+
linkList.SaveLink(Request.Form["hdnId"], Request.Form["txtTitle"], Request.Form["txtUrl"], Request.Form["cbTarget"]);
60+
}
61+
@:<script type="text/javascript">window.parent.toastr.success("Completed");</script>
62+
}
63+
}
64+
if (settings != null && settings.Count > 0)
65+
{
66+
NumberOfLinks = int.Parse(settings["numberoflinks"]);
67+
}
68+
var links = linkList.GetLinks();
69+
}
70+
<!DOCTYPE html>
71+
<html>
72+
<head>
73+
<link rel="stylesheet" href="~/Content/bootstrap.min.css">
74+
<link rel="stylesheet" href="~/Content/font-awesome.min.css">
75+
<link rel="stylesheet" href="~/admin/themes/standard/css/styles.css">
76+
<style>
77+
body { background-color: #fff; }
78+
.fa-times { color: #e45252; }
79+
.fa-pencil { color: #25811a;}
80+
.links-row { margin: 20px 0 10px -15px; padding-top: 10px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; }
81+
.field-validation-error { background-color: #d9534f; border-color: #d9534f; color: #fff; padding: 5px 15px; display: block; }
82+
</style>
83+
</head>
84+
<body>
85+
<form id="frmTitle" method="post" onsubmit="window.parent.updateTitle()">
86+
<div class="form-group">
87+
<label>@Resources.labels.numberOfDisplayedItems</label>
88+
<input type="text" class="form-control" id="txtNumberOfLinks" name="txtNumberOfLinks" value="@NumberOfLinks" />
89+
@Html.ValidationMessage("txtNumberOfLinks")
90+
</div>
91+
<div>
92+
<button type="submit" id="btnSave" name="btnSave" class="btn btn-success btn-sm pull-left">
93+
@Resources.labels.save
94+
</button>
95+
</div>
96+
<div class="clearfix">&nbsp;</div>
97+
<div class="row links-row">
98+
<div class="col-xs-6 col-md-6">
99+
<div class="form-content">
100+
<div class="form-group">
101+
<label>@Resources.labels.title</label>
102+
<input type="text" class="form-control" id="txtTitle" name="txtTitle" value="@TitleAdd" />
103+
@Html.ValidationMessage("txtTitle")
104+
</div>
105+
<div class="form-group">
106+
@if (!string.IsNullOrEmpty(editId))
107+
{
108+
<button type="submit" id="btnUpdate" name="btnUpdate" formaction="@updateLink" class="btn btn-success btn-sm pull-left">
109+
@Resources.labels.update
110+
</button>
111+
}
112+
else
113+
{
114+
<button type="submit" id="btnAdd" name="btnAdd" class="btn btn-success btn-sm pull-left">
115+
@Resources.labels.addLink
116+
</button>
117+
}
118+
</div>
119+
</div>
120+
</div>
121+
<div class="col-xs-6 col-md-6">
122+
<div class="form-content">
123+
<div class="form-group">
124+
<label>@Resources.labels.websiteUrl</label>
125+
<input type="text" class="form-control" id="txtUrl" name="txtUrl" value="@LinkAdd" />
126+
@Html.ValidationMessage("txtUrl")
127+
</div>
128+
<div class="form-group">
129+
@Html.CheckBox("cbTarget", targetNew) Open in new window
130+
</div>
131+
</div>
132+
</div>
133+
</div>
134+
135+
<table class="table table-striped">
136+
<thead>
137+
<tr>
138+
<th width="10%">&nbsp;</th>
139+
<th width="35%">@Resources.labels.title</th>
140+
<th width="35%">@Resources.labels.url</th>
141+
<th width="20%">@Resources.labels.newWindow</th>
142+
</tr>
143+
</thead>
144+
<tbody>
145+
@foreach (var link in links)
146+
{
147+
<tr>
148+
<td>
149+
<a href="?id=@widgetId&editid=@link.Id" title="@Resources.labels.edit"><i class="fa fa-pencil"></i></a> &nbsp;
150+
<a href="?id=@widgetId&delid=@link.Id" title="@Resources.labels.delete"><i class="fa fa-times"></i></a>
151+
</td>
152+
<td>@link.Title</td>
153+
<td>@link.Url</td>
154+
<td>
155+
@if (link.Target == "on")
156+
{
157+
<i class="fa fa-check"></i>
158+
}
159+
</td>
160+
</tr>
161+
}
162+
@if(links.Count == 0)
163+
{
164+
<tr><td colspan="4">@Resources.labels.empty</td></tr>
165+
}
166+
</tbody>
167+
</table>
168+
<input type="hidden" id="hdnId" name="hdnId" value="@hdnId" />
169+
</form>
170+
</body>
171+
</html>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
@using BlogEngine.NET.Custom.Widgets
2+
@{
3+
var linkList = new LinkList(Model.Id);
4+
var links = linkList.GetLinks();
5+
}
6+
<div class="widget linklist">
7+
<h4 class="widget-header">@Model.Title</h4>
8+
<div class="widget-content">
9+
<ul id="recentComments" class="recentcomments">
10+
@foreach (var link in links)
11+
{
12+
if (link.Target == "on")
13+
{
14+
<li><a href="@link.Url" title="@link.Title" target="_blank">@link.Title</a></li>
15+
}
16+
else
17+
{
18+
<li><a href="@link.Url" title="@link.Title">@link.Title</a></li>
19+
}
20+
}
21+
@if(links.Count == 0)
22+
{
23+
<li>@Resources.labels.empty</li>
24+
}
25+
</ul>
26+
</div>
27+
</div>

0 commit comments

Comments
 (0)