Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions BUILD.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Building DNN Blog

This document describes how to build the DNN Blog module on Windows.

## Tested environment
- DNN Platform 10.3.2
- .NET Framework 4.8
- Visual Studio 2022 or Visual Studio Build Tools
- MSBuild
- SQL Server
- GitHub Desktop

## Required Visual Studio components
- .NET desktop build tools
- MSBuild
- Visual Basic compiler
- C# compiler
- NuGet targets and build tasks
- .NET Framework 4.8 SDK
- .NET Framework 4.8 Targeting Pack

## DNN references
Use the matching assemblies from the target DNN site's `bin` folder.

## Build steps
1. Clone the repository.
2. Open Developer PowerShell for Visual Studio.
3. Run:

```powershell
msbuild ".\\Server\\Blog\\DotNetNuke.Modules.Blog.vbproj" `
/t:Restore,Rebuild `
/p:Configuration=Release `
/p:Platform=AnyCPU
```

## Output
Primary assemblies:
- `DotNetNuke.Modules.Blog.dll`
- `DotNetNuke.Modules.Blog.Core.dll`
- `CookComputing.XmlRpcV2.dll`

## Testing
Back up the database, `/bin`, `/DesktopModules/Blog` and `web.config` before deployment.
41 changes: 41 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Changelog

All notable changes to the DNN Blog DNN10 Maintenance Branch are documented in this file.

The format is based on Keep a Changelog.

---

## [06.07.01-DNN10] - 2026-07-14

### Fixed

- Fixed ASP.NET ViewState exception when editing Blog settings after changing Blog permissions.
- Prevented `BlogPermissionsGrid` from restoring dynamically generated child-control ViewState.
- Continued to persist:
- Blog ID
- Current User ID
- Blog permission collection.

### Validation

Successfully tested on:

- DNN Platform 10.3.2
- .NET Framework 4.8
- SQL Server

Verified by:

- Editing existing Blogs
- Creating a second Blog
- Editing Blog permissions repeatedly
- Changing Blog settings
- Creating posts
- Editing posts
- Uploading images
- Production deployment using the stock Blog 6.7.1 release

### Contributors

- Trevor Forrest (Forro-54)
32 changes: 32 additions & 0 deletions PROJECT_STATUS.md

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this file should be comited

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Project Status

## Current Branch

`docs-dnn10-maintenance`

## Completed

- Identified the DNN Blog ViewState bug in `BlogPermissionsGrid`.
- Implemented and tested the fix.
- Verified the fix on DNN Platform 10.3.2 and .NET Framework 4.8.
- Verified the fix on both test and production sites.
- Submitted a pull request to `DNNCommunity/DNN.Blog`.
- Created `BUILD.md`.
- Created `CHANGELOG.md`.
- Created `RELEASES.md`.

## Waiting

- Review of the submitted pull request by the DNN Blog maintainers.

## Next Tasks

- Review and improve the project documentation.
- Decide when to merge the documentation branch into `development`.
- Create a long-term `dnn10-maintenance` branch.
- Document and review existing CSS fixes.
- Review other DNN 10 compatibility issues.

## Notes

This file is a working project journal. Update it whenever a significant task is completed or a new task is started.
33 changes: 33 additions & 0 deletions RELEASES.md

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same for this file, I don't think we should commit this file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, I will add those files to .gitignore/
Regards
Trevor

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Releases

## 06.07.01-DNN10

Maintained compatibility build of DNN Blog 6.7.1 for DNN Platform 10.

### Target environment
- DNN Platform 10.3.2
- .NET Framework 4.8
- SQL Server

### Changes
- Fixed the ViewState exception after Blog permission changes.
- Updated `BlogPermissionsGrid` to avoid restoring dynamically generated child-control ViewState.
- Preserved Blog ID, current user ID and Blog permission collection.

### Validation
- Existing Blogs
- New Blogs
- Permission changes
- Settings updates
- Post creation and editing
- Image uploads
- Production validation on the stock Blog 6.7.1 release

### Deployment note
The fix is contained in:

```text
DotNetNuke.Modules.Blog.Core.dll
```

Always back up the database and Blog assemblies before deployment.
4 changes: 2 additions & 2 deletions Server/Blog/Templates/_default/BlogBanner.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<div class="selectbanner">
<span class="removeselection"><a href="[urls:module|false]" title="[resx:Allposts]"><i class="fa fa-times-circle icon16"></i><span class="sr-only">[resx:Allposts]</span></a></span>
<div class="selectbanner blog-selectbanner">
<span class="removeselection"><a href="[urls:module|false]" title="[resx:Allposts]"><i class="fa fa-times-circle icon16"></i><span class="sr-only">[resx:Allposts]</span></a></span>
Blog: [blog:localizedtitle]
</div>
133 changes: 132 additions & 1 deletion Server/Blog/Templates/_default/template.css
Original file line number Diff line number Diff line change
@@ -1 +1,132 @@
.ModBlogC .bbs-comments .comment .author .profile,.ModBlogC .bbs-comments .totals{font-size:.9em;color:#aaa}.ModBlogC .bbs-article .content .metadata>div:not(:last-child),.ModBlogC .bbs-listarticle{border-bottom:1px solid #eee}.ModBlogC .bbs-comments{margin-top:30px;padding-top:10px;border-top:1px solid #eee}.ModBlogC .bbs-comments .comment{padding:10px 0}.ModBlogC .bbs-comments .comment .author{padding:6px 0}.ModBlogC .bbs-comments .comment .author>div{display:inline}.ModBlogC .bbs-comments .comment .author .pic img{width:32px;height:32px;border-radius:6px}.ModBlogC .bbs-comments .comment .author .pic{padding-right:10px}.ModBlogC .bbs-comments .comment .content{font-size:1.1em}.ModBlogC .bbs-comments .comment .actions{padding:10px 0;color:#aaa;font-size:.9em}.ModBlogC .bbs-comments .comment .subcomments{padding-left:30px}.ModBlogC .bbs-article .content{height:auto;overflow:hidden}@media only screen and (min-width:600px){.ModBlogC .bbs-article .content .metadata{float:left;width:240px}.ModBlogC .bbs-article .content .body{width:auto;overflow:hidden}}@media only screen and (max-width:599px){.ModBlogC .bbs-article .content .metadata{display:block}}.ModBlogC .bbs-article .content .metadata{line-height:21px}.ModBlogC .bbs-article .content .metadata>div{padding-bottom:20px;margin:0 20px 20px 0}.ModBlogC .bbs-article .content .metadata>div h5{color:#aaa;text-transform:uppercase;font-weight:700}.ModBlogC .bbs-article .content .metadata .sharrre{padding-top:6px}.ModBlogC .bbs-article .content .metadata .sharrre a{padding-right:14px}.ModBlogC .bbs-article .content .metadata .sharrre a i{font-size:1.2em}.ModBlogC .bbs-article .content .metadata .tags a{display:block}.ModBlogC .bbs-article .content .body{padding-top:20px}.ModBlogC .bbs-listarticle{overflow:hidden;padding:20px 0}.ModBlogC .bbs-listarticle h2 a,.ModBlogC .bbs-listarticle h2 a:hover,.ModBlogC .bbs-listarticle h2 a:visited{text-decoration:none}.ModBlogC .bbs-listarticle figure{float:left;margin:8px 40px 0 0;width:264px}.ModBlogC .bbs-listarticle .content{overflow:hidden}.ModBlogC .bbs-listarticle .content .summary,.ModBlogC .bbs-listarticle .content .summary p{font-size:1.1em;line-height:1.5;margin-bottom:12px}.ModBlogC .bbs-listarticle .content .metadata{line-height:18px;margin-left:-8px}.ModBlogC .bbs-listarticle .content .metadata div{display:inline;padding:0 8px;font-size:.9em;color:#aaa}.ModBlogC .bbs-listarticle .content .metadata div:not(:last-child){border-right:1px solid #aaa}.ModBlogC .bbs-listarticle .content .metadata div:empty{display:none}.ModBlogC .bbs-pager{text-align:center}.ModBlogC .bbs-pager .bbs-pagination{width:90%;max-width:768px;margin:2em auto 4em;text-align:center}.ModBlogC .bbs-pager .bbs-pagination li{display:none;margin:0 .2em}.ModBlogC .bbs-pager .bbs-pagination li.button{display:inline-block}.ModBlogC .bbs-pager .bbs-pagination a,.ModBlogC .bbs-pager .bbs-pagination span{display:inline-block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:.6em .8em;font-size:1.6rem}.ModBlogC .bbs-pager .bbs-pagination a{border:1px solid #e6e6e6;border-radius:.25em}.ModBlogC .bbs-pager .bbs-pagination .no-touch a:hover{background-color:#f2f2f2}.ModBlogC .bbs-pager .bbs-pagination a:active{-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}.ModBlogC .bbs-pager .bbs-pagination a.disabled{color:rgba(46,64,87,.4);pointer-events:none}.ModBlogC .bbs-pager .bbs-pagination a.disabled::after,.ModBlogC .bbs-pager .bbs-pagination a.disabled::before{opacity:.4}.ModBlogC .bbs-pager .bbs-pagination .button:first-of-type a::before{content:'\00ab '}.ModBlogC .bbs-pager .bbs-pagination .button:last-of-type a::after{content:' \00bb'}.ModBlogC .bbs-pager .bbs-pagination .current{background-color:#777;border-color:#777;color:#fff;pointer-events:none}@media only screen and (min-width:768px){.ModBlogC .bbs-pager .bbs-pagination li{display:inline-block}}@media only screen and (min-width:1170px){.ModBlogC .bbs-pager .bbs-pagination{margin:4em auto 8em}}.ModBlogC .supertitle{text-transform:uppercase}.ModBlogC .supertitle span{font-weight:700}.ModBlogC .supertitle:empty{display:none}.ModBlogC .comma:not(:first-child):before{content:", "}.ModBlogC .commands{padding-top:20px}
.ModBlogC .bbs-comments .comment .author .profile,.ModBlogC .bbs-comments .totals{font-size:.9em;color:#aaa}.ModBlogC .bbs-article .content .metadata>div:not(:last-child),.ModBlogC .bbs-listarticle{border-bottom:1px solid #eee}.ModBlogC .bbs-comments{margin-top:30px;padding-top:10px;border-top:1px solid #eee}.ModBlogC .bbs-comments .comment{padding:10px 0}.ModBlogC .bbs-comments .comment .author{padding:6px 0}.ModBlogC .bbs-comments .comment .author>div{display:inline}.ModBlogC .bbs-comments .comment .author .pic img{width:32px;height:32px;border-radius:6px}.ModBlogC .bbs-comments .comment .author .pic{padding-right:10px}.ModBlogC .bbs-comments .comment .content{font-size:1.1em}.ModBlogC .bbs-comments .comment .actions{padding:10px 0;color:#aaa;font-size:.9em}.ModBlogC .bbs-comments .comment .subcomments{padding-left:30px}.ModBlogC .bbs-article .content{height:auto;overflow:hidden}@media only screen and (min-width:600px){.ModBlogC .bbs-article .content .metadata{float:left;width:240px}.ModBlogC .bbs-article .content .body{width:auto;overflow:hidden}}@media only screen and (max-width:599px){.ModBlogC .bbs-article .content .metadata{display:block}}.ModBlogC .bbs-article .content .metadata{line-height:21px}.ModBlogC .bbs-article .content .metadata>div{padding-bottom:20px;margin:0 20px 20px 0}.ModBlogC .bbs-article .content .metadata>div h5{color:#aaa;text-transform:uppercase;font-weight:700}.ModBlogC .bbs-article .content .metadata .sharrre{padding-top:6px}.ModBlogC .bbs-article .content .metadata .sharrre a{padding-right:14px}.ModBlogC .bbs-article .content .metadata .sharrre a i{font-size:1.2em}.ModBlogC .bbs-article .content .metadata .tags a{display:block}.ModBlogC .bbs-article .content .body{padding-top:20px}.ModBlogC .bbs-listarticle{overflow:hidden;padding:20px 0}.ModBlogC .bbs-listarticle h2 a,.ModBlogC .bbs-listarticle h2 a:hover,.ModBlogC .bbs-listarticle h2 a:visited{text-decoration:none}.ModBlogC .bbs-listarticle figure{float:left;margin:8px 40px 0 0;width:264px}.ModBlogC .bbs-listarticle .content{overflow:hidden}.ModBlogC .bbs-listarticle .content .summary,.ModBlogC .bbs-listarticle .content .summary p{font-size:1.1em;line-height:1.5;margin-bottom:12px}.ModBlogC .bbs-listarticle .content .metadata{line-height:18px;margin-left:-8px}.ModBlogC .bbs-listarticle .content .metadata div{display:inline;padding:0 8px;font-size:.9em;color:#aaa}.ModBlogC .bbs-listarticle .content .metadata div:not(:last-child){border-right:1px solid #aaa}.ModBlogC .bbs-listarticle .content .metadata div:empty{display:none}.ModBlogC .bbs-pager{text-align:center}.ModBlogC .bbs-pager .bbs-pagination{width:90%;max-width:768px;margin:2em auto 4em;text-align:center}.ModBlogC .bbs-pager .bbs-pagination li{display:none;margin:0 .2em}.ModBlogC .bbs-pager .bbs-pagination li.button{display:inline-block}.ModBlogC .bbs-pager .bbs-pagination a,.ModBlogC .bbs-pager .bbs-pagination span{display:inline-block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:.6em .8em;font-size:1.6rem}.ModBlogC .bbs-pager .bbs-pagination a{border:1px solid #e6e6e6;border-radius:.25em}.ModBlogC .bbs-pager .bbs-pagination .no-touch a:hover{background-color:#f2f2f2}.ModBlogC .bbs-pager .bbs-pagination a:active{-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}.ModBlogC .bbs-pager .bbs-pagination a.disabled{color:rgba(46,64,87,.4);pointer-events:none}.ModBlogC .bbs-pager .bbs-pagination a.disabled::after,.ModBlogC .bbs-pager .bbs-pagination a.disabled::before{opacity:.4}.ModBlogC .bbs-pager .bbs-pagination .button:first-of-type a::before{content:'\00ab '}.ModBlogC .bbs-pager .bbs-pagination .button:last-of-type a::after{content:' \00bb'}.ModBlogC .bbs-pager .bbs-pagination .current{background-color:#777;border-color:#777;color:#fff;pointer-events:none}@media only screen and (min-width:768px){.ModBlogC .bbs-pager .bbs-pagination li{display:inline-block}}@media only screen and (min-width:1170px){.ModBlogC .bbs-pager .bbs-pagination{margin:4em auto 8em}}.ModBlogC .supertitle{text-transform:uppercase}.ModBlogC .supertitle span{font-weight:700}.ModBlogC .supertitle:empty{display:none}.ModBlogC .comma:not(:first-child):before{content:", "}.ModBlogC .commands{padding-top:20px}

/* ==========================================================
DNN 10 Maintenance Improvements

2026
- Blog List mobile layout
- Blog Article banner spacing
- Mobile pager
========================================================== */

/* Blog List: prevent the Chrome narrow-text-column layout */
@media (max-width: 600px) {
.ModBlogC .bbs-listarticle figure {
float: none !important;
width: auto !important;
max-width: 100% !important;
margin: 8px 12px 12px 0 !important;
}

.ModBlogC .bbs-listarticle figure img {
display: block;
max-width: 100%;
height: auto;
}

.ModBlogC .bbs-listarticle,
.ModBlogC .bbs-listarticle .content {
overflow: visible !important;
}
}

/* Blog List: preserve the original desktop/tablet layout */
@media (min-width: 601px) {
.ModBlogC .bbs-listarticle {
display: block !important;
}

.ModBlogC .bbs-listarticle figure {
float: left !important;
margin: 8px 40px 0 0 !important;
width: 264px !important;
}

.ModBlogC .bbs-listarticle .content {
overflow: hidden !important;
min-width: 0;
}
}

/* Blog List: clear the floated image safely */
.ModBlogC .bbs-listarticle::after {
content: "";
display: table;
clear: both;
}

/* Blog Article: keep the optional banner inside the mobile viewport */
@media (max-width: 599px) {
.ModBlogC .bbs-article > figure {
width: auto;
max-width: calc(100% - 12px);
margin-right: 12px;
}

.ModBlogC .bbs-article > figure img {
display: block;
width: 100%;
max-width: 100%;
height: auto;
}
}

/* Blog List: show and wrap page numbers on mobile */
@media (max-width: 767.98px) {
.ModBlogC .bbs-pager .bbs-pagination li {
display: inline-block !important;
}

.ModBlogC .bbs-pager .bbs-pagination {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.4em;
width: 100%;
margin: 2em auto 5em;
}
}
/* Logged-in mobile view: keep Blog and author banners below module controls */
@media (max-width: 767.98px) {
.ModBlogC .selectbanner,
.ModBlogC .blog-main-content {
clear: both;
width: 100%;
}

.ModBlogC .selectbanner {
display: block;
box-sizing: border-box;
margin: 16px 0 14px;
padding-top: 50px;
overflow-wrap: anywhere;
}

.ModBlogC .commands {
clear: both;
float: none;
width: 100%;
margin-bottom: 18px;
}
}
/* Mobile: reduce the gap between the selected Blog and Author banners */
@media (max-width: 767.98px) {
.ModBlogC .blog-selectbanner + .selectbanner {
margin-top: 2px !important;
padding-top: 0 !important;
}
}

/* Mobile: give the selected Blog title extra clearance below admin controls */
@media (max-width: 767.98px) {
.ModBlogC .blog-selectbanner {
clear: both !important;
display: block !important;
width: 100%;
box-sizing: border-box;
margin-top: 28px;
margin-bottom: 0px;
padding-top: 18px;
position: relative;
}
}