New threads for homepage, and XENFORO theme

This commit is contained in:
Akif9748 2023-05-26 18:57:29 +03:00
parent 0311f363e2
commit 9c183eb05e
12 changed files with 33637 additions and 3 deletions

View File

@ -60,7 +60,10 @@ Akf-forum has got an API for AJAX (fetch), other clients etc. And, you can learn
- user.ejs for per theme
- categori search title like thread search
- edit template
- download theme
### front-end
- add newest threads to main page
- add category to threads
- working reset button
- better pagination
- text alling center body

View File

@ -5,7 +5,7 @@ const app = Router();
app.get("/", async (req, res) => {
const [
categories, users, threads, messages, newestMember, newestMessages, onlineUserCount, onlineUsers
categories, users, threads, messages, newestMember, newestMessages, newestThreads, onlineUserCount, onlineUsers
] = await Promise.all([
CategoryModel.count(),
UserModel.count({ deleted: false }),
@ -13,6 +13,7 @@ app.get("/", async (req, res) => {
MessageModel.count({ deleted: false }),
UserModel.findOne({ deleted: false }, "name id").sort({ time: -1 }),
MessageModel.find({ deleted: false }).sort({ time: -1 }).limit(10),
ThreadModel.find({ state: "OPEN" }).sort({ time: -1 }).limit(10),
UserModel.count({ deleted: false, lastSeen: { $gt: Date.now() - 1000 * 60 * 5 } }),
UserModel.find({ deleted: false, hideLastSeen: false, lastSeen: { $gt: Date.now() - 1000 * 60 * 5 } }, "name id")
])
@ -20,7 +21,8 @@ app.get("/", async (req, res) => {
res.reply("index", {
categories, users, threads, messages,
newestMember, newestMessages, onlineUserCount, onlineUsers
newestMember, newestMessages, newestThreads,
onlineUserCount, onlineUsers
});
});

View File

@ -6,6 +6,7 @@
<body>
<%- include("extra/navbar") %>
<link href='https://unpkg.com/boxicons@2.1.2/css/boxicons.min.css' rel='stylesheet'>
<div class="container my-3">
@ -14,12 +15,54 @@
<% if (user) { %>
Welcome, <%= user.name %>
<% } else { %>
Welcome, Guest! <a href="/register">You can press to register.</a>
Welcome, Guest! <a href="/register">You can press here to register.</a>
<% } %>
</span>
</nav>
<div class="row">
<div class="col-12 col-xl-9">
<div class="category">
<h2 class="h4 text-white bg-danger mb-0 p-4 rounded-top">New threads</h2>
<table class="table table-striped table-bordered table-responsive">
<thead class="thead-light">
<tr>
<th scope="col" class="topic-col">Topic</th>
<th scope="col" class="created-col">Created</th>
<th scope="col">Statistics</th>
<% if (user?.admin){ %> <th scope="col" class="last-post-col">Action</th> <% } %>
</tr>
</thead>
<tbody>
<% newestThreads.forEach(thread=>{ %>
<tr>
<td>
<h3 class="h6">
<% if (thread.deleted) { %> <span class="badge badge-primary">[DELETED]</span><% } %>
<a href="<%= thread.getLink() %>"><%= thread.title %></a>
</h3>
</td>
<td>
<div class="avatar">by <a href="<%= thread.getLink() %>"><%= thread.author.name %></a><img src="<%=thread.author.avatar %>"></div>
<div><%= new Date(thread.time).toLocaleString() %></div>
</td>
<td>
<div><%= thread.messages.length %> messages</div>
<div><%= thread.views %> views</div>
</td>
<% if (user?.admin){ %>
<td>
<% if (!thread.deleted){ %>
<a class="btn-danger" onclick="fetch('/api/threads/<%= thread.id %>/',{method:'DELETE'})"><i class="bx bx-trash bx-sm"></i></a>
<% } %>
</td>
<% } %>
</tr>
<% }); %>
</tbody>
</table>
</div>
<div class="category">
<h2 class="h4 text-white bg-danger mb-0 p-4 rounded-top">New messages</h2>
@ -51,6 +94,8 @@
</table>
</div>
</div>
<div class="col-12 col-xl-3">
<aside>
<div class="row">

View File

@ -0,0 +1,6 @@
module.exports = {
name: "Xenforo Black Theme",
codename: "xenforo",
description: "Xenforo theme by xenforo, and edited by Akif9748",
author: "Akif9748"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,47 @@
<!DOCTYPE html>
<html id="XF" lang="tr-TR" dir="LTR" data-app="public" data-template="forum_list" data-container-key data-content-key data-logged-in="true" data-cookie-prefix="xf_" data-csrf="1685091272,f052c88e4c4aa12fbe73a08e269625fa" class="has-no-js v_2_0 template-forum_list">
<%- include("extra/meta", {title: "Welcome to the "+dataset.forum_name+"-forum!" }) %>
<body data-template="forum_list">
<div class="p-pageWrapper" id="top">
<%- include(dataset.getFile(dataset.theme.codename +"/views/extra/navbar")) %>
<div class="p-body">
<div class="p-body-inner">
<div class="p-body-header">
<div class="p-title ">
<h1 class="p-title-value">Hay aksi! Bir sorun yaşıyoruz.</h1>
</div>
</div>
<div class="p-body-main ">
<div class="p-body-contentCol"></div>
<div class="p-body-content">
<div class="p-body-pageContent">
<div class="blockMessage">
İstenen sayfa bulunamadı.
</div>
</div>
</div>
</div>
<ul class="p-breadcrumbs p-breadcrumbs--bottom" itemscope="" itemtype="https://schema.org/BreadcrumbList">
<li itemprop="itemListElement" itemscope="" itemtype="https://schema.org/ListItem">
<a href="https://makale.silicone-forum.com" itemprop="item">
<span itemprop="name">Ana sayfa</span>
</a>
<meta itemprop="position" content="1">
</li>
</ul>
</div>
</div>
<%- include(dataset.getFile(dataset.theme.codename +"/views/extra/footer")) %>
</div>
<div class="u-scrollButtons js-scrollButtons" data-trigger-type="up">
<a href="#top" class="button--scroll button" data-xf-click="scroll-to"><span class="button-text"><i class="fa--xf far fa-arrow-up" aria-hidden="true"></i><span class="u-srOnly">Top</span></span></a>
</div>
</body>
</html>

View File

@ -0,0 +1,64 @@
<footer class="p-footer" id="footer">
<div class="p-footer-inner">
<div class="p-footer-row">
<div class="p-footer-row-main">
<ul class="p-footer-linkList">
<li>
<% if (user){ %>
<select id="theme_select">
<% for(const theme of dataset.themes){%>
<option value="<%= theme.codename %>"><%= theme.name %></option>
<% } %>
</select>
<script>
const theme_select = document.getElementById("theme_select");
theme_select.querySelector(`option[value=<%= user.theme.codename %>]`).selected = true;
theme_select.addEventListener("change", async e => {
const codename = e.target.value;
await fetch('/api/users/<%= user.id %>', {
method: 'PATCH',
body: JSON.stringify({
theme: {
codename
}
}),
headers: {
"Content-Type": "application/json"
}
});
const theme = await fetch("/api/themes/" + codename).then(res => res.json());
const txt = "Theme changed to:\n" +
"Name: " + theme.name + "\n" +
"Description: " + theme.description + "\n" +
"Author: " + theme.author + "\n";
alert(txt)
location.reload();
});
</script>
<% } %>
</li>
</ul>
</div>
<div class="p-footer-row-opposite">
<ul class="p-footer-linkList">
<li><a href="/">Ana sayfa</a></li>
</ul>
</div>
</div>
<div class="p-footer-copyright">
Xenforo theme created <a href="https://xenforo.com" class="u-concealed" dir="ltr" target="_blank" rel="sponsored noopener">by XenForo<sup>&reg;</sup> </a>
and <a href="https://github.com/Akif9748"> edited by Akif9748</a>
<br>This website is powered by <a class="text-white" href="https://github.com/Akif9748/akf-forum">akf-forum</a>
</div>
</div>
</footer>
<footer class="text-center text-white fixed-bottom">
<div class="text-center p-3">
</div>
</footer>

View File

@ -0,0 +1,20 @@
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title><%= title || dataset.forum_name +"-forum" %></title>
<meta name="theme-color" content="#1e1e1e" />
<meta name="apple-mobile-web-app-title" content="Silicone">
<link rel="alternate" type="application/rss+xml" title="RSS feed for <%= title || dataset.forum_name +"-forum" %>" href="/bolum/-/index.rss" />
<meta property="og:site_name" content="<%= title || dataset.forum_name +"-forum" %>" />
<meta property="og:type" content="website" />
<meta property="og:title" content="<%= title || dataset.forum_name +"-forum" %>" />
<meta property="twitter:title" content="<%= title || dataset.forum_name +"-forum" %>" />
<meta name="description" content="<%= dataset.description %>">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<meta property="og:description" content="<%= dataset.description %>" />
<meta property="twitter:description" content="<%= dataset.description %>" />
<link rel="stylesheet" href="/themes/xenforo/s1.css" />
<link rel="stylesheet" href="/themes/xenforo/s2.css" />
</head>

View File

@ -0,0 +1,95 @@
<header class="p-header" id="header">
<div class="p-header-inner">
<div class="p-header-content">
<a style="font-size: 40px;" href="/"><%= dataset.forum_name.toUpperCase() %><span>-FORUM</span></a>
</div>
</div>
</header>
<div class="p-navSticky p-navSticky--primary" data-xf-init="sticky-header">
<nav class="p-nav">
<div class="p-nav-inner">
<button type="button" class="button--plain p-nav-menuTrigger button" data-xf-click="off-canvas" data-menu=".js-headerOffCanvasMenu" tabindex="0" aria-label="Menü"><span class="button-text">
<i aria-hidden="true"></i>
</span></button>
<div class="p-nav-scroller hScroller" data-xf-init="h-scroller" data-auto-scroll=".p-navEl.is-selected">
<div class="hScroller-scroll">
<ul class="p-nav-list js-offCanvasNavSource">
<li>
<div class="p-navEl">
<a class="p-navEl-link p-navEl-link--splitMenu " href="/threads/create/">Create Thread</a>
</div>
</li>
<li>
<div class="p-navEl">
<a class="p-navEl-link p-navEl-link--splitMenu " href="/categories">Categories</a>
</div>
</li>
<li>
<div class="p-navEl">
<a class="p-navEl-link p-navEl-link--splitMenu " href="/threads">Threads</a>
</div>
</li>
<li>
<div class="p-navEl">
<a class="p-navEl-link p-navEl-link--splitMenu " href="/users">Users</a>
</div>
</li>
<li>
<div class="p-navEl">
<a class="p-navEl-link p-navEl-link--splitMenu " href="/search">Search</a>
</div>
</li>
<li>
<div class="p-navEl">
<a class="p-navEl-link p-navEl-link--splitMenu " href="/login">Logout</a>
</div>
</li>
<script>
const menuItems = document.getElementsByClassName("p-navEl");
for (let i = 0; i < menuItems.length; i++)
if (window.location.pathname.includes(menuItems[i].children[0].getAttribute("href"))) {
menuItems[i].classList.add("is-selected");
break;
}
</script>
</ul>
</div>
</div>
<div class="p-nav-opposite">
<div class="p-navgroup p-account p-navgroup--member">
<a href="<%=user.getLink()%>" class="p-navgroup-link p-navgroup-link--iconic p-navgroup-link--user" data-xf-click="menu" data-xf-key="m" data-menu-pos-ref="< .p-navgroup" title="Akif" aria-expanded="false" aria-haspopup="true">
<span class="avatar avatar--xxs" data-user-id="116">
<img src="<%=user.avatar %>" alt="Akif" class="avatar-u116-s" width="48" height="48" loading="lazy" />
</span>
<span class="p-navgroup-linkText"><%=user.name %></span>
</a>
</div>
<div class="p-navgroup p-discovery">
<a href="/search" class="p-navgroup-link p-navgroup-link--iconic p-navgroup-link--search" data-xf-click="menu" data-xf-key="/" aria-label="Ara" aria-expanded="false" aria-haspopup="true" title="Ara">
<i aria-hidden="true"></i>
<span class="p-navgroup-linkText">Ara</span>
</a>
</div>
</div>
</div>
</nav>
</div>
<% if (user?.admin){ %>
<div class="p-sectionLinks">
<div class="p-sectionLinks-inner hScroller" data-xf-init="h-scroller">
<div class="hScroller-scroll">
<ul class="p-sectionLinks-list">
<li>
<div class="p-navEl ">
<a href="/admin" class="p-navEl-link ">Admin Page</a>
</div>
</li>
</ul>
</div>
</div>
</div>
<% } %>

View File

@ -0,0 +1,146 @@
<!DOCTYPE html>
<html id="XF">
<%- include("extra/meta", {title: "Welcome to the "+dataset.forum_name+"-forum!" }) %>
<body data-template="forum_list">
<div class="p-pageWrapper" id="top">
<%- include(dataset.getFile(dataset.theme.codename +"/views/extra/navbar")) %>
<div class="p-body">
<div class="p-body-inner">
<div class="p-body-header">
<div class="p-title ">
<h1 class="p-title-value"><%=dataset.forum_name%>-forum</h1>
<div class="p-title-pageAction">
<a href="/threads/create" class="button--cta button button--icon button--icon--write" data-xf-click="overlay" rel="nofollow"><span class="button-text">
Create Thread
</span></a>
</div>
</div>
</div>
<div class="p-body-main p-body-main--withSidebar ">
<div class="p-body-contentCol"></div>
<div class="p-body-sidebarCol"></div>
<div class="p-body-content">
<div class="p-body-pageContent">
<div class="block" data-widget-id="24" data-widget-key="new_threads_ust" data-widget-definition="new_threads">
<div class="block-container">
<h3 class="block-header">
<a href="/threads" rel="nofollow">New Threads</a>
</h3>
<div class="block-body">
<div class="structItemContainer">
<% newestThreads.forEach(thread => { %>
<div class="structItem structItem--thread js-inlineModContainer js-threadListItem-14359" data-author="ercncavs">
<div class="structItem-cell structItem-cell--icon">
<div class="structItem-iconContainer">
<a href="" class="avatar avatar--s" data-xf-init="member-tooltip">
<img src="<%= thread.author.avatar %>" class="avatar-u1804-s" width="48" height="48" loading="lazy" />
</a>
</div>
</div>
<div class="structItem-cell structItem-cell--main" data-xf-init="touch-proxy">
<div class="structItem-title">
<a href="<%= thread.getLink() %>" data-tp-primary="on" data-xf-init="preview-tooltip"><%= thread.title %></a>
</div>
<div class="structItem-minor">
<ul class="structItem-parts">
<li>
<a href="/users/<%= thread.authorID %>" class="username " dir="auto" data-user-id="1804" data-xf-init="member-tooltip">
<%= thread.author.name %>
</a>
</li>
<li class="structItem-startDate">
<a>
<time class="u-dt"><%= new Date(thread.time).toLocaleString() %></time>
</a>
</li>
<li><a href="/categories/<%= thread.categoryID %>"><%= thread.categoryID %></a></li>
</ul>
</div>
</div>
<div class="structItem-cell structItem-cell--meta" title="İlk mesajın ifade puanı: 0">
<dl class="pairs pairs--justified">
<dt>Messages</dt>
<dd><%= thread.messages.length %></dd>
</dl>
<dl class="pairs pairs--justified structItem-minor">
<dt>Views</dt>
<dd><%= thread.views %></dd>
</dl>
</div>
</div>
<% }) %>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="p-body-sidebar">
<div class="block" data-widget-section="onlineNow" data-widget-id="6" data-widget-key="forum_overview_members_online" data-widget-definition="members_online">
<div class="block-container">
<h3 class="block-minorHeader"><a href="/">Online Members</a></h3>
<div class="block-body">
<div class="block-row block-row--minor">
<ul class="listInline listInline--comma">
<% onlineUsers.forEach(user => { %>
<li><a href="/users/<%=user.id %>" class="username " dir="auto" data-user-id="116" data-xf-init="member-tooltip"><%= user.name %></a></li>
<% }); %>
</ul>
</div>
</div>
<div class="block-footer">
<span class="block-footer-counter">Total: <%= onlineUserCount %>
</span>
</div>
</div>
</div>
<div class="block" data-widget-id="9" data-widget-key="forum_overview_forum_statistics" data-widget-definition="forum_statistics">
<div class="block-container">
<h3 class="block-minorHeader">Forum statistics</h3>
<div class="block-body block-row">
<dl class="pairs pairs--justified">
<dt>Total categories</dt>
<dd><%= categories %></dd>
</dl>
<dl class="pairs pairs--justified">
<dt>Total threads</dt>
<dd><%= threads %></dd>
</dl>
<dl class="pairs pairs--justified">
<dt>Total messages</dt>
<dd><%= messages %></dd>
</dl>
<dl class="pairs pairs--justified">
<dt>Total members</dt>
<dd><%= users %></dd>
</dl>
<dl class="pairs pairs--justified">
<dt>Newest member</dt>
<dd><a href="/users/<% newestMember.id %>" class="username " dir="auto" data-xf-init="member-tooltip"><%= newestMember.name %></a></dd>
</dl>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<%- include(dataset.getFile(dataset.theme.codename +"/views/extra/footer")) %>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff