Skip to content
This repository was archived by the owner on Apr 21, 2026. It is now read-only.

Commit ddd4302

Browse files
authored
Merge pull request #31 from paiindustries/fix/blog
fixed blog filtering issues on list and details page
2 parents 70e1e96 + dd9dedd commit ddd4302

7 files changed

Lines changed: 63 additions & 60 deletions

File tree

app/config/routes.cfm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@
6262
.get(name = "loadStatuses", pattern = "blog/loadStatuses", to = "web.BlogController##loadStatuses")
6363
.get(name = "loadPostTypes", pattern = "blog/loadPostTypes", to = "web.BlogController##loadPostTypes")
6464
.get(name = "Categories", pattern = "blog/Categories", to = "web.BlogController##Categories")
65-
.get(name = "blogArchive", pattern = "blog/[year]/[month]", to = "web.BlogController##Index")
66-
.get(name = "blogs", pattern = "blog/list/[filterType]/[filterValue]", to = "web.BlogController##Index")
65+
// .get(name = "blogsCategory", pattern = "blog/[category]/[slug]", to = "web.BlogController##Index")
66+
.get(name = "blogsFilter", pattern = "blog/[filterType]/[filterValue]", to = "web.BlogController##Index")
67+
.get(name = "blogs", pattern = "blog/list/[filterType]/[filterValue]", to = "web.BlogController##blogs")
6768
.get(name = "blogFeed", pattern = "blog/feed", to = "web.BlogController##feed")
6869
.get(name = "allblogs", pattern = "blog/list", to = "web.BlogController##blogs")
6970

app/controllers/web/BlogController.cfc

Lines changed: 33 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,58 +9,46 @@ component extends="app.Controllers.Controller" {
99
}
1010

1111
// Function to list all blogs
12-
public void function index() {
13-
// Detect HTMX request
14-
// var isHtmx = structKeyExists(getHttpRequestData().headers, "HX-Request");
12+
public void function index() {}
1513

16-
// Detect filters via category/tag or year/month
17-
var isFiltered = (
18-
structKeyExists(params, "year") && structKeyExists(params, "month")
19-
);
2014

21-
// If filtered or HTMX, just call the blogs partial and return
22-
if (isFiltered) {
23-
blogs();
24-
return;
25-
}
26-
27-
// Otherwise, allow default layout-wrapped view to render (index.cfm)
28-
}
15+
public void function blogs() {
16+
try {
17+
var blogModel = model("Blog"); // Load model
2918

19+
// --- Filter by category or tag ---
20+
if (structKeyExists(params, "filterType") && structKeyExists(params, "filterValue")) {
21+
// Normalize value (e.g., convert "design-ui" to "design.ui")
22+
params.filterValue = replace(params.filterValue, "-", ".", "all");
3023

31-
public void function blogs() {
32-
var blogModel = model("Blog"); // Load model
33-
34-
// --- Filter by category or tag ---
35-
if (structKeyExists(params, "filterType") && structKeyExists(params, "filterValue")) {
36-
// Normalize value (e.g. convert "design-ui" to "design.ui")
37-
params.filterValue = replace(params.filterValue, "-", ".", "all");
38-
39-
switch (lcase(params.filterType)) {
40-
case "category":
41-
blogs = getBlogsByCategory(params.filterValue);
42-
break;
43-
case "tag":
44-
blogs = getAllByTag(params.filterValue);
45-
break;
46-
default:
47-
blogs = getAllBlogs(); // fallback in case of unknown filterType
48-
}
24+
// If filterType is a year and filterValue is a month (numeric), handle as archive
25+
if (isNumeric(params.filterType) && isNumeric(params.filterValue)) {
26+
blogs = getBlogsByMonthYear(params.filterType, params.filterValue);
27+
} else {
28+
switch (lcase(params.filterType)) {
29+
case "category":
30+
blogs = getBlogsByCategory(params.filterValue);
31+
break;
32+
case "tag":
33+
blogs = getAllByTag(params.filterValue);
34+
break;
35+
default:
36+
blogs = getAllBlogs(); // fallback in case of unknown filterType
37+
}
38+
}
39+
} else {
40+
blogs = getAllBlogs(); // default listing
41+
}
4942

50-
// --- Filter by archive year/month ---
51-
} else if (structKeyExists(params, "year") && structKeyExists(params, "month")) {
52-
if (isNumeric(params.year) && isNumeric(params.month)) {
53-
blogs = getBlogsByMonthYear(params.year, params.month);
54-
} else {
55-
blogs = getAllBlogs(); // fallback in case of invalid input
56-
}
43+
renderPartial(partial="partials/blogList");
44+
} catch (any e) {
45+
// Log or handle error gracefully
46+
// logError("Error in blogs(): #e.message# | #e.detail#");
5747

58-
// --- Default blog listing ---
59-
} else {
60-
blogs = getAllBlogs();
48+
// Optionally show fallback
49+
blogs = getAllBlogs(); // fallback content
50+
renderPartial(partial="partials/blogList");
6151
}
62-
63-
renderPartial(partial="partials/blogList");
6452
}
6553

6654
// Function to load categories for the blog list

app/controllers/web/HomeController.cfc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ component extends="app.Controllers.Controller" {
2525
function loadBlogs() {
2626
var blogModel = model("Blog"); // Get Blog model instance
2727
try {
28-
blogs = blogModel.getAll(); // Get blog list
28+
blogs = blogModel.getTenLatest(); // Get blog list
2929
renderPartial(partial="partials/blogs"); // Return a partial view for HTMX
3030
} catch (any e) {
3131
// Handle error

app/models/Blog.cfc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ component extends="app.Models.Model" {
4141
var blogs = findAll(where='statusid <> 1', include="User", order = "COALESCE(post_created_date, blog_posts.createdAt) DESC");
4242
return blogs;
4343
}
44+
45+
public function getTenLatest() {
46+
var blogs = findAll(where='statusid <> 1', include="User",maxRows=10, order = "COALESCE(post_created_date, blog_posts.createdAt) DESC");
47+
return blogs;
48+
}
4449

4550
/**
4651
* Computed property to get the correct post date.

app/views/layout.cfm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@
242242
</li>
243243
</cfif>
244244

245-
<li class="mt-3"><a href="#"
245+
<li class="mt-3"><a href="/blog/feed"
246246
class="text--secondary fs-14 text-decoration-none">Entries
247247
feed</a>
248248
</li>

app/views/web/BlogController/index.cfm

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,19 @@
5454
<div class="row justify-content-center justify-content-lg-between">
5555
<cfoutput>
5656
<!-- Detect if filtering via route (e.g. blog/year/month or blog/category/tag) -->
57-
<cfset isFiltered = structKeyExists(params, "year") or structKeyExists(params, "filterType")>
58-
57+
<cfif isDefined("params.filterType") and isDefined("params.filterValue")>
58+
<cfset blogUrl = "/blog/list/#params.filterType#/#params.filterValue#">
59+
<cfelse>
60+
<cfset blogUrl = "/blog/list">
61+
</cfif>
5962
<!-- wrapper that triggers the HTMX call -->
60-
<cfif NOT isFiltered>
6163
<div
6264
id="hxLoader"
63-
hx-get="/blog/list"
65+
hx-get="#blogUrl#"
6466
hx-trigger="load"
6567
hx-target="##blogsContainer"
6668
hx-swap="innerHTML">
6769
</div>
68-
</cfif>
69-
7070
<!-- blog list container -->
7171
<div
7272
id="blogsContainer"
@@ -91,7 +91,7 @@
9191

9292
<cfloop index="month" from="#monthLimit#" to="#startLimit#" step="-1">
9393
<p
94-
hx-get="/blog/#year#/#NumberFormat(month, '00')#"
94+
hx-get="/blog/list/#year#/#NumberFormat(month, '00')#"
9595
hx-target="##blogsContainer"
9696
hx-swap="innerHTML"
9797
class="fs-14 border-bottom mb-0 py-2 cursor-pointer fw-normal text--primary">
@@ -114,7 +114,16 @@
114114
</div>
115115
</main>
116116
<script>
117-
window.addEventListener('load', function () {
118-
document.getElementById('loader-wrapper').style.display = 'none';
117+
document.addEventListener("htmx:beforeRequest", function(evt) {
118+
document.getElementById("loader-wrapper").style.display = "block";
119+
});
120+
121+
document.addEventListener("htmx:afterSwap", function(evt) {
122+
document.getElementById("loader-wrapper").style.display = "none";
123+
});
124+
125+
// Also hide it if request fails
126+
document.addEventListener("htmx:responseError", function(evt) {
127+
document.getElementById("loader-wrapper").style.display = "none";
119128
});
120129
</script>

app/views/web/BlogController/show.cfm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
<strong
4646
class="text--primary"
4747
style="cursor: pointer;"
48-
hx-get="/blog/list/category/#REReplace(name, '\.', '-', 'all')#"
48+
hx-get="#urlFor(route="blogsFilter", filterType="category", filterValue="#REReplace(name, '\.', '-', 'all')#")#"
4949
hx-target="body"
5050
hx-swap="outerHTML"
5151
hx-push-url="true"
@@ -62,7 +62,7 @@
6262
<strong
6363
class="text--primary"
6464
style="cursor: pointer;"
65-
hx-get="/blog/list/tag/#REReplace(name, '\.', '-', 'all')#"
65+
hx-get="#urlFor(route="blogsFilter", filterType="tag", filterValue="#REReplace(name, '\.', '-', 'all')#")#"
6666
hx-target="body"
6767
hx-push-url="true"
6868
hx-swap="outerHTML"

0 commit comments

Comments
 (0)