Some more moves.

This commit is contained in:
flash 2016-03-10 19:54:36 +01:00
parent 3b2114cd10
commit f109a86c5b
10 changed files with 237 additions and 92 deletions

View file

@ -17,6 +17,7 @@
"jbbcode/jbbcode": "*", "jbbcode/jbbcode": "*",
"corneltek/cliframework": "*", "corneltek/cliframework": "*",
"phroute/phroute": "^2.1", "phroute/phroute": "^2.1",
"illuminate/database": "5.2.*" "illuminate/database": "5.2.*",
"doctrine/dbal": "~2.4"
} }
} }

View file

@ -8,8 +8,10 @@
namespace Sakura\Controllers; namespace Sakura\Controllers;
use Sakura\DB; use Sakura\DB;
use Sakura\Forum; use Sakura\Forum\Forum;
use Sakura\Forum\Thread;
use Sakura\Perms\Forum as ForumPerms; use Sakura\Perms\Forum as ForumPerms;
use Sakura\Router;
use Sakura\Template; use Sakura\Template;
use Sakura\User; use Sakura\User;
use Sakura\Users; use Sakura\Users;
@ -31,7 +33,7 @@ class ForumController extends Controller
{ {
// Merge index specific stuff with the global render data // Merge index specific stuff with the global render data
Template::vars([ Template::vars([
'forum' => (new Forum\Forum()), 'forum' => (new Forum()),
'stats' => [ 'stats' => [
'userCount' => DB::table('users')->where('password_algo', '!=', 'disabled')->whereNotIn('rank_main', [1, 10])->count(), 'userCount' => DB::table('users')->where('password_algo', '!=', 'disabled')->whereNotIn('rank_main', [1, 10])->count(),
'newestUser' => User::construct(Users::getNewestUserId()), 'newestUser' => User::construct(Users::getNewestUserId()),
@ -54,11 +56,11 @@ class ForumController extends Controller
global $currentUser; global $currentUser;
// Get the forum // Get the forum
$forum = new Forum\Forum($id); $forum = new Forum($id);
// Redirect forum id 0 to the main page // Redirect forum id 0 to the main page
if ($forum->id === 0) { if ($forum->id === 0) {
header('Location: ' . (new \Sakura\Urls)->format('FORUM_INDEX')); header('Location: ' . Router::route('forums.index'));
exit; exit;
} }
@ -68,6 +70,7 @@ class ForumController extends Controller
Template::vars([ Template::vars([
'page' => [ 'page' => [
'message' => 'The forum you tried to access does not exist.', 'message' => 'The forum you tried to access does not exist.',
'redirect' => Router::route('forums.index'),
], ],
]); ]);
@ -81,6 +84,7 @@ class ForumController extends Controller
Template::vars([ Template::vars([
'page' => [ 'page' => [
'message' => 'You do not have access to this forum.', 'message' => 'You do not have access to this forum.',
'redirect' => Router::route('forums.index'),
], ],
]); ]);
@ -95,24 +99,7 @@ class ForumController extends Controller
'page' => [ 'page' => [
'message' => 'The forum you tried to access is a link. You\'re being redirected.', 'message' => 'The forum you tried to access is a link. You\'re being redirected.',
'redirect' => $forum->link, 'redirect' => $forum->link,
] ],
]);
// Print page contents
return Template::render('global/information');
}
// Check if we're marking as read
if (isset($_GET['read']) && $_GET['read'] && isset($_GET['session']) && $_GET['session'] == session_id()) {
// Run the function
$forum->trackUpdateAll($currentUser->id);
// Set render data
Template::vars([
'page' => [
'message' => 'All threads have been marked as read.',
'redirect' => (new \Sakura\Urls)->format('FORUM_SUB', [$forum->id]),
]
]); ]);
// Print page contents // Print page contents
@ -127,4 +114,148 @@ class ForumController extends Controller
// Print page contents // Print page contents
return Template::render('forum/viewforum'); return Template::render('forum/viewforum');
} }
public function markForumRead($id = 0)
{
global $currentUser;
// Check if the session id was supplied
if (!isset($_GET['s']) || $_GET['s'] != session_id()) {
// Set render data
Template::vars([
'page' => [
'message' => 'Your session expired! Go back and try again.',
'redirect' => Router::route('forums.index'),
],
]);
// Print page contents
return Template::render('global/information');
}
// Get the forum
$forum = new Forum($id);
// Check if the forum exists
if ($forum->id < 1) {
// Set render data
Template::vars([
'page' => [
'message' => 'The forum you tried to access does not exist.',
'redirect' => Router::route('forums.index'),
],
]);
// Print page contents
return Template::render('global/information');
}
// Check if the user has access to the forum
if (!$forum->permission(ForumPerms::VIEW, $currentUser->id)) {
// Set render data
Template::vars([
'page' => [
'message' => 'You do not have access to this forum.',
'redirect' => Router::route('forums.index'),
],
]);
// Print page contents
return Template::render('global/information');
}
// Run the function
$forum->trackUpdateAll($currentUser->id);
// Set render data
Template::vars([
'page' => [
'message' => 'All threads have been marked as read.',
'redirect' => Router::route('forums.forum', $forum->id),
],
]);
// Print page contents
return Template::render('global/information');
}
public function thread($id = 0)
{
global $currentUser;
// Attempt to get the thread
$thread = new Thread($id);
// And attempt to get the forum
$forum = new Forum($thread->forum);
// Check if the forum exists
if ($thread->id == 0 || !$forum->permission(ForumPerms::VIEW, $currentUser->id)) {
// Set render data
Template::vars([
'page' => [
'message' => 'This thread doesn\'t exist or you don\'t have access to it!',
'redirect' => Router::route('forums.index'),
],
]);
// Print page contents
return Template::render('global/information');
}
// Update the tracking status
$thread->trackUpdate($currentUser->id);
// Update views
$thread->viewsUpdate();
// Set parse variables
Template::vars([
'thread' => $thread,
'forum' => $forum,
]);
// Print page contents
return Template::render('forum/viewtopic');
}
public function threadModerate($id = 0)
{
global $currentUser;
// Attempt to get the thread
$thread = new Thread($id);
// And attempt to get the forum
$forum = new Forum($thread->forum);
// Check if the forum exists
if ($thread->id == 0 || !$forum->permission(ForumPerms::VIEW, $currentUser->id)) {
// Set render data
Template::vars([
'page' => [
'message' => 'This thread doesn\'t exist or you don\'t have access to it!',
'redirect' => Router::route('forums.index'),
],
]);
} else {
// Take the action
$action = isset($_POST['action']) ? $_POST['action'] : null;
// Switch
switch ($action) {
default:
Template::vars([
'page' => [
'message' => 'Unknown moderation action.',
'redirect' => Router::route('forums.thread', $thread->id),
],
]);
break;
}
}
// Print page contents
return Template::render('global/information');
}
} }

View file

@ -226,7 +226,7 @@ class Thread
->update([ ->update([
'topic_hidden' => $this->hidden, 'topic_hidden' => $this->hidden,
'topic_title' => $this->title, 'topic_title' => $this->title,
'topic_limit' => $this->timeLimit, 'topic_time_limit' => $this->timeLimit,
'topic_status' => $this->status, 'topic_status' => $this->status,
'topic_status_change' => $this->statusChange, 'topic_status_change' => $this->statusChange,
'topic_type' => $this->type, 'topic_type' => $this->type,

View file

@ -26,7 +26,7 @@ if (!$thread) {
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'The topic you tried to access does not exist.', 'message' => 'The topic you tried to access does not exist.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
// Set parse variables // Set parse variables
@ -42,7 +42,7 @@ if (!$forum->permission(ForumPerms::VIEW, $currentUser->id)) {
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'You do not have access to this thread.', 'message' => 'You do not have access to this thread.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
// Set parse variables // Set parse variables
@ -68,7 +68,7 @@ if (isset($_GET['sticky']) && $_GET['sticky'] == session_id() && $forum->permiss
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'Changed the thread type.', 'message' => 'Changed the thread type.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
// Set parse variables // Set parse variables
@ -93,7 +93,7 @@ if (isset($_GET['announce']) && $_GET['announce'] == session_id() && $forum->per
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'Changed the thread type.', 'message' => 'Changed the thread type.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
// Set parse variables // Set parse variables
@ -118,7 +118,7 @@ if (isset($_GET['lock']) && $_GET['lock'] == session_id() && $forum->permission(
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'Changed the thread status.', 'message' => 'Changed the thread status.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
// Set parse variables // Set parse variables
@ -138,13 +138,13 @@ if (isset($_GET['trash']) && $_GET['trash'] == session_id() && $forum->permissio
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'Moved thread to the trash.', 'message' => 'Moved thread to the trash.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
} else { } else {
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'This thread is already trashed.', 'message' => 'This thread is already trashed.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
} }
@ -166,13 +166,13 @@ if (isset($_GET['restore']) && $_GET['restore'] == session_id() && $forum->permi
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'Restored the thread to its previous location.', 'message' => 'Restored the thread to its previous location.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
} else { } else {
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'This thread has never been moved.', 'message' => 'This thread has never been moved.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
} }
@ -193,13 +193,13 @@ if (isset($_GET['prune']) && $_GET['prune'] == session_id() && $forum->permissio
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'The thread has been pruned.', 'message' => 'The thread has been pruned.',
'redirect' => $urls->format('FORUM_SUB', [$thread->forum]), 'redirect' => Router::route('forums.forum', $thread->forum),
]; ];
} else { } else {
// Set render data // Set render data
$renderData['page'] = [ $renderData['page'] = [
'message' => 'You can only prune trashed threads.', 'message' => 'You can only prune trashed threads.',
'redirect' => $urls->format('FORUM_THREAD', [$thread->id]), 'redirect' => Router::route('forums.thread', $thread->id),
]; ];
} }
@ -211,20 +211,4 @@ if (isset($_GET['prune']) && $_GET['prune'] == session_id() && $forum->permissio
exit; exit;
} }
// Update the tracking status header('Location: ' . Router::route('forums.thread', $thread->id));
$thread->trackUpdate($currentUser->id);
// Update views
$thread->viewsUpdate();
// Set additional render data
$renderData = array_merge($renderData, [
'thread' => $thread,
'forum' => $forum,
]);
// Set parse variables
Template::vars($renderData);
// Print page contents
echo Template::render('forum/viewtopic');

View file

@ -33,8 +33,16 @@ Router::group(['prefix' => 'news'], function () {
// Forum // Forum
Router::group(['prefix' => 'forum'], function () { Router::group(['prefix' => 'forum'], function () {
// Thread
Router::group(['prefix' => 'thread'], function () {
Router::get('/{id}', 'ForumController@thread', 'forums.thread');
Router::post('/{id}/mod', 'ForumController@threadModerate', 'forums.mod');
});
// Forum
Router::get('/', 'ForumController@index', 'forums.index'); Router::get('/', 'ForumController@index', 'forums.index');
Router::get('/{id}', 'ForumController@forum', 'forums.forum'); Router::get('/{id}', 'ForumController@forum', 'forums.forum');
Router::get('/{id}/mark', 'ForumController@markForumRead', 'forums.mark');
}); });
// Members // Members

View file

@ -8,7 +8,7 @@
namespace Sakura; namespace Sakura;
// Define Sakura version // Define Sakura version
define('SAKURA_VERSION', '20160228'); define('SAKURA_VERSION', '20160310');
// Define Sakura Path // Define Sakura Path
define('ROOT', __DIR__ . '/'); define('ROOT', __DIR__ . '/');

View file

@ -3,11 +3,11 @@
<div class="fa fa-2x fa-{% if thread.type == 1 %}thumb-tack{% elseif thread.type == 2 %}bullhorn{% elseif thread.status == 1 %}lock{% else %}navicon{% endif %}"></div> <div class="fa fa-2x fa-{% if thread.type == 1 %}thumb-tack{% elseif thread.type == 2 %}bullhorn{% elseif thread.status == 1 %}lock{% else %}navicon{% endif %}"></div>
</td> </td>
<td class="topicTitle{% if thread.type == 2 %} topicAnnouncement{% endif %}"> <td class="topicTitle{% if thread.type == 2 %} topicAnnouncement{% endif %}">
<a href="{{ urls.format('FORUM_THREAD', [thread.id]) }}" class="default">{{ thread.title }}</a> <a href="{{ route('forums.thread', thread.id) }}" class="default">{{ thread.title }}</a>
</td> </td>
<td class="topicAuthor{% if thread.type == 2 %} topicAnnouncement{% endif %}"> <td class="topicAuthor{% if thread.type == 2 %} topicAnnouncement{% endif %}">
{% if thread.firstPost.poster.id %} {% if thread.firstPost.poster.id %}
<a href="{{ urls.format('USER_PROFILE', [thread.firstPost.poster.id]) }}" class="default" style="color: {{ thread.firstPost.poster.colour }}; text-shadow: 0 0 5px {% if thread.firstPost.poster.colour != 'inherit' %}{{ thread.firstPost.poster.colour }}{% else %}#222{% endif %};">{{ thread.firstPost.poster.username }}</a> <a href="{{ route('user.profile', thread.firstPost.poster.id) }}" class="default" style="color: {{ thread.firstPost.poster.colour }}; text-shadow: 0 0 5px {% if thread.firstPost.poster.colour != 'inherit' %}{{ thread.firstPost.poster.colour }}{% else %}#222{% endif %};">{{ thread.firstPost.poster.username }}</a>
{% else %} {% else %}
[deleted user] [deleted user]
{% endif %} {% endif %}
@ -18,7 +18,7 @@
</td> </td>
<td class="topicLast{% if thread.type == 2 %} topicAnnouncement{% endif %}"> <td class="topicLast{% if thread.type == 2 %} topicAnnouncement{% endif %}">
{% if thread.lastPost.poster.id %} {% if thread.lastPost.poster.id %}
<a href="{{ urls.format('USER_PROFILE', [thread.lastPost.poster.id]) }}" class="default" style="color: {{ thread.lastPost.poster.colour }}; text-shadow: 0 0 5px {% if thread.lastPost.poster.colour != 'inherit' %}{{ thread.lastPost.poster.colour }}{% else %}#222{% endif %};">{{ thread.lastPost.poster.username }}</a> <a href="{{ route('user.profile', thread.lastPost.poster.id) }}" class="default" style="color: {{ thread.lastPost.poster.colour }}; text-shadow: 0 0 5px {% if thread.lastPost.poster.colour != 'inherit' %}{{ thread.lastPost.poster.colour }}{% else %}#222{% endif %};">{{ thread.lastPost.poster.username }}</a>
{% else %} {% else %}
[deleted user] [deleted user]
{% endif %} <a href="{{ urls.format('FORUM_POST', [thread.lastPost.id]) }}#p{{ thread.lastPost.id }}" class="default fa fa-tag"></a><br /> {% endif %} <a href="{{ urls.format('FORUM_POST', [thread.lastPost.id]) }}#p{{ thread.lastPost.id }}" class="default fa fa-tag"></a><br />

View file

@ -2,9 +2,9 @@
{% set title %}Forums / {{ forum.name }}{% endset %} {% set title %}Forums / {{ forum.name }}{% endset %}
{% set forumBackLink %}{{ urls.format('FORUM_INDEX') }}{% endset %} {% set forumBackLink %}{{ route('forums.index') }}{% endset %}
{% set forumNewLink %}{{ urls.format('FORUM_NEW_THREAD', [forum.id]) }}{% endset %} {% set forumNewLink %}{{ urls.format('FORUM_NEW_THREAD', [forum.id]) }}{% endset %}
{% set forumMarkRead %}{{ urls.format('FORUM_MARK_READ', [forum.id, php.sessionid]) }}{% endset %} {% set forumMarkRead %}{{ route('forums.mark', forum.id) }}?s={{ php.sessionid }}{% endset %}
{% block title %}{{ title }}{% endblock %} {% block title %}{{ title }}{% endblock %}

View file

@ -84,8 +84,8 @@
{% for post in posts[get.page|default(1) - 1] %} {% for post in posts[get.page|default(1) - 1] %}
<tr class="post" id="p{{ post.id }}"> <tr class="post" id="p{{ post.id }}">
<td class="userpanel"> <td class="userpanel">
{% if not post.poster.permission(constant('Sakura\\Perms\\Site::DEACTIVATED')) or post.poster.permission(constant('Sakura\\Perms\\Site::RESTRICTED')) %}<a href="{{ urls.format('USER_PROFILE', [post.poster.id]) }}" class="default username" style="color: {{ post.poster.colour }}; text-shadow: 0 0 5px {% if post.poster.colour != 'inherit' %}{{ post.poster.colour }}{% else %}#222{% endif %};" title="Go to {{ post.poster.username }}'s profile">{{ post.poster.username }}</a> {% if not post.poster.permission(constant('Sakura\\Perms\\Site::DEACTIVATED')) or post.poster.permission(constant('Sakura\\Perms\\Site::RESTRICTED')) %}<a href="{{ route('user.profile', post.poster.id) }}" class="default username" style="color: {{ post.poster.colour }}; text-shadow: 0 0 5px {% if post.poster.colour != 'inherit' %}{{ post.poster.colour }}{% else %}#222{% endif %};" title="Go to {{ post.poster.username }}'s profile">{{ post.poster.username }}</a>
<img src="{{ urls.format('IMAGE_AVATAR', [post.poster.id]) }}" alt="{{ post.poster.username }}" class="avatar" style="box-shadow: 0 3px 7px #{% if post.poster.isOnline %}484{% else %}844{% endif %};" /> <img src="{{ route('file.avatar', post.poster.id) }}" alt="{{ post.poster.username }}" class="avatar" style="box-shadow: 0 3px 7px #{% if post.poster.isOnline %}484{% else %}844{% endif %};" />
{% else %} {% else %}
<a class="username">[deleted user]</a> <a class="username">[deleted user]</a>
{% endif %} {% endif %}

View file

@ -200,7 +200,7 @@
<script type="text/javascript"> <script type="text/javascript">
// Parse time elements // Parse time elements
var timeElems = document.getElementsByTagName('time'); var timeElems = document.getElementsByTagName('time');
// Iterate over them // Iterate over them
for (var timeElem in timeElems) { for (var timeElem in timeElems) {
// Attempt to parse it // Attempt to parse it
@ -213,8 +213,8 @@
} }
} }
</script> </script>
{% if sakura.dev.showChangelog and php.self == '/index.php' and stats %} {% if sakura.dev.showChangelog and stats %}
<script type="text/javascript" src="https://sakura.flash.moe/?get={{ sakura.versionInfo.version|slice(0, 4) }}-{{ sakura.versionInfo.version|slice(4, 2) }}-{{ sakura.versionInfo.version|slice(6, 2) }}&amp;variable=true"></script> <script type="text/javascript" src="https://sakura.flash.moe/?get=all&amp;limit=5&amp;variable=true"></script>
<script type="text/javascript"> <script type="text/javascript">
// Column colours for actions // Column colours for actions
var changelogColours = [ var changelogColours = [
@ -227,55 +227,76 @@
'#C44' // Revert '#C44' // Revert
]; ];
window.addEventListener("load", function() { window.addEventListener("load", function () {
// Check if the changelog variable is an object // Check if the changelog variable is an object
if(typeof changelog === 'object') { if(typeof changelog === 'object') {
// Grab the index panel // Grab the index panel
var indexPanel = document.getElementById('indexPanel'); var _panel = document.getElementById('indexPanel');
// Create the head container // Create the head container
var changelogTitle = document.createElement('div'); var _cltitle = document.createElement('div');
changelogTitle.className = 'head'; _cltitle.className = 'head';
changelogTitle.style.marginBottom = '1px'; _cltitle.style.marginBottom = '1px';
// Create a link // Create a link
var changelogLink = document.createElement('a'); var _cllink = document.createElement('a');
changelogLink.className = 'underline'; _cllink.className = 'underline';
changelogLink.target = '_blank'; _cllink.target = '_blank';
changelogLink.href = 'https://sakura.flash.moe/#r{{ sakura.versionInfo.version }}'; _cllink.href = 'https://sakura.flash.moe/#r{{ sakura.versionInfo.version }}';
// Create the text container
var changelogTitleText = document.createTextNode('Changelog ({{ sakura.versionInfo.version|slice(0, 4) }}-{{ sakura.versionInfo.version|slice(4, 2) }}-{{ sakura.versionInfo.version|slice(6, 2) }})');
// Append everything // Append everything
changelogLink.appendChild(changelogTitleText); _cllink.appendChild(document.createTextNode('Changelog'));
changelogTitle.appendChild(changelogLink); _cltitle.appendChild(_cllink);
indexPanel.appendChild(changelogTitle); _panel.appendChild(_cltitle);
// Create changelog table // Create changelog table
var changelogTable = document.createElement('table'); var _cltable = document.createElement('table');
changelogTable.className = 'panelTable'; _cltable.className = 'panelTable';
_cltable.style.borderSpacing = '0 1px';
// Create and append all changelog entries // Create and append all changelog entries
for (var i in changelog) { for (var _s in changelog) {
// Create elements // Create header
var changelogRow = document.createElement('tr'); var _hr = document.createElement('tr');
var changelogColumnAction = document.createElement('td'); var _hri = document.createElement('td');
var changelogColumnMessage = document.createElement('td');
// Set data // Set data
changelogColumnAction.appendChild(document.createTextNode(changelog[i]['change_action']['action_name'])); _hri.appendChild(document.createTextNode(_s));
changelogColumnAction.style.background = changelogColours[changelog[i]['change_action']['action_id']]; _hri.style.background = '#9475b2';
changelogColumnMessage.appendChild(document.createTextNode(changelog[i]['change_message'])); _hri.style.color = '#306';
_hri.style.fontWeight = '700';
_hri.style.fontSize = '1.2em';
_hri.setAttribute('colspan', '2');
// Append // Append
changelogRow.appendChild(changelogColumnAction); _hr.appendChild(_hri);
changelogRow.appendChild(changelogColumnMessage); _cltable.appendChild(_hr);
changelogTable.appendChild(changelogRow);
for (var _e in changelog[_s]) {
// Reassign _e
_e = changelog[_s][_e];
// Create elements
var _clr = document.createElement('tr');
var _clca = document.createElement('td');
var _clcm = document.createElement('td');
// Set data
_clca.appendChild(document.createTextNode(_e['change_action']['action_name']));
_clca.style.background = changelogColours[_e['change_action']['action_id']];
_clca.style.borderBottom = '1px solid ' + changelogColours[_e['change_action']['action_id']];
_clcm.style.borderBottom = '1px solid ' + changelogColours[_e['change_action']['action_id']];
_clcm.appendChild(document.createTextNode(_e['change_message']));
// Append
_clr.appendChild(_clca);
_clr.appendChild(_clcm);
_cltable.appendChild(_clr);
}
} }
// Append it to indexPanel // Append it to indexPanel
indexPanel.appendChild(changelogTable); indexPanel.appendChild(_cltable);
} }
}); });
</script> </script>