More work on the Shadow theme.

Switched gopsutil with a temporary more stable fork.
Ping PostgreSQL upon connecting. We need a global solution for connection drops. A connection timeout, perhaps?
Added the rowmenu CSS class for styling sidebar menus.
Added the real_first_child CSS class, we might be able to get around using it by redoing the <form> nesting.
Added the rowlist CSS class.
Added the bgavatars CSS class.
Added avatars to the User Manager.
Added limited responsivity to the Shadow Theme, I might have broken some things in the other themes, I'll fix that soon!
A per-theme post-avatar-bg.jpg file is now used for the first topic layout rather than the global white-dot.jpg file.
This commit is contained in:
Azareal 2017-07-29 11:36:39 +01:00
parent d976a192fb
commit 02a0cbb6bb
49 changed files with 813 additions and 375 deletions

View File

@ -88,16 +88,18 @@ Several important features for saving memory in the templates system may have to
An example of running the commands directly on Windows.
Linux is similar, however you might need to use cd and mv a bit more like in the shell files due to the differences in go build across platforms.
Linux is similar, however you might need to use cd and mv a bit more like in the shell files due to the differences in go build across platforms. Additionally, Linux doesn't require `StackExchange/wmi` or ``/x/sys/windows`
```bash
git clone https://github.com/Azareal/Gosora
go get -u github.com/go-sql-driver/mysql
go get -u golang.org/x/crypto/bcrypt
go get -u github.com/StackExchange/wmi
go get -u github.com/shirou/gopsutil
go get -u github.com/Azareal/gopsutil
go get -u github.com/gorilla/websocket
@ -162,11 +164,11 @@ We're looking for ways to clean-up the plugin system so that all of them (except
* golang.org/x/crypto/bcrypt For hashing passwords.
* github.com/shirou/gopsutil For pulling information on CPU and memory usage.
* github.com/Azareal/gopsutil For pulling information on CPU and memory usage. I've temporarily forked this, as we were having stability issues with the latest build.
* github.com/StackExchange/wmi Dependency for gopsutil on Windows.
* golang.org/x/sys/windows Also a dependency for gopsutil on Windows.
* golang.org/x/sys/windows Also a dependency for gopsutil on Windows. This isn't needed at the moment, as I've rolled things back to an older more stable build.
* github.com/gorilla/websocket Needed for Gosora's Optional WebSockets Module.

View File

@ -5,7 +5,7 @@ go get -u github.com/lib/pq
echo "Installing bcrypt"
go get -u golang.org/x/crypto/bcrypt
echo "Installing gopsutil"
go get -u github.com/shirou/gopsutil
go get -u github.com/Azareal/gopsutil
echo "Installing Gorilla WebSockets"
go get -u github.com/gorilla/websocket

View File

@ -29,7 +29,7 @@ if %errorlevel% neq 0 (
exit /b %errorlevel%
)
echo Installing the gopsutil library
go get -u github.com/shirou/gopsutil
go get -u github.com/Azareal/gopsutil
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%

View File

@ -71,7 +71,9 @@ CREATE TABLE `replies`(
`createdAt` datetime not null,
`createdBy` int not null,
`lastEdit` int not null,
`lastEditBy` int not null,
`lastEditBy` int not null, /* Do we need this? */
/*`editIndex` int not null,*/ /* For append edits, e.g. auto-merges? Is this enough for this feature? */
`lastUpdated` datetime not null,
`ipaddress` varchar(200) DEFAULT '0.0.0.0.0' not null,
`likeCount` int DEFAULT 0 not null,
`words` int DEFAULT 1 not null,

View File

@ -29,6 +29,12 @@ func _init_database() (err error) {
return err
}
// Make sure that the connection is alive
err = db.Ping()
if err != nil {
return err
}
// Fetch the database version
db.QueryRow("SELECT VERSION()").Scan(&db_version)

BIN
public/rgb_105_105_105.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

BIN
public/rgb_71_71_71.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

BIN
public/rgb_95_95_95.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

View File

@ -37,6 +37,12 @@ var menu_1 []byte = []byte(`</a></li>
<li class="menu_left menu_forums"><a href="/forums/">Forums</a></li>
<li class="menu_left menu_topics"><a href="/">Topics</a></li>
<li class="menu_left menu_create_topic"><a href="/topics/create/">Create Topic</a></li>
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter"></div>
<div class="alert_aftercounter"></div>
<div class="alertList"></div>
</li>
`)
var menu_2 []byte = []byte(`
<li class="menu_left menu_account"><a href="/user/edit/critical/">Account</a></li>
@ -54,12 +60,6 @@ var menu_8 []byte = []byte(`
<li class="menu_left menu_login"><a href="/accounts/login/">Login</a></li>
`)
var menu_9 []byte = []byte(`
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter"></div>
<div class="alert_aftercounter"></div>
<div class="alertList"></div>
</li>
</ul>
</div>
</div>
@ -73,155 +73,158 @@ var header_11 []byte = []byte(`>
`)
var header_12 []byte = []byte(`<div class="alert">`)
var header_13 []byte = []byte(`</div>`)
var topic_0 []byte = []byte(`<div id="prevFloat" class="prev_button"><a class="prev_link" href="/topic/`)
var topic_1 []byte = []byte(`?page=`)
var topic_2 []byte = []byte(`">&lt;</a></div>`)
var topic_3 []byte = []byte(`<link rel="prerender" href="/topic/`)
var topic_4 []byte = []byte(`?page=`)
var topic_5 []byte = []byte(`" />
var topic_0 []byte = []byte(`
<form id="edit_topic_form" action='/topic/edit/submit/`)
var topic_1 []byte = []byte(`' method="post" />
`)
var topic_2 []byte = []byte(`<div id="prevFloat" class="prev_button"><a class="prev_link" href="/topic/`)
var topic_3 []byte = []byte(`?page=`)
var topic_4 []byte = []byte(`">&lt;</a></div>`)
var topic_5 []byte = []byte(`<link rel="prerender" href="/topic/`)
var topic_6 []byte = []byte(`?page=`)
var topic_7 []byte = []byte(`" />
<div id="nextFloat" class="next_button">
<a class="next_link" href="/topic/`)
var topic_6 []byte = []byte(`?page=`)
var topic_7 []byte = []byte(`">&gt;</a>
var topic_8 []byte = []byte(`?page=`)
var topic_9 []byte = []byte(`">&gt;</a>
</div>`)
var topic_8 []byte = []byte(`
var topic_10 []byte = []byte(`
<div class="rowblock rowhead topic_block">
<form action='/topic/edit/submit/`)
var topic_9 []byte = []byte(`' method="post">
<div class="rowitem topic_item`)
var topic_10 []byte = []byte(` topic_sticky_head`)
var topic_11 []byte = []byte(` topic_closed_head`)
var topic_12 []byte = []byte(`">
var topic_11 []byte = []byte(` topic_sticky_head`)
var topic_12 []byte = []byte(` topic_closed_head`)
var topic_13 []byte = []byte(`">
<a class='topic_name hide_on_edit'>`)
var topic_13 []byte = []byte(`</a>
var topic_14 []byte = []byte(`</a>
`)
var topic_14 []byte = []byte(`<span class='username hide_on_micro topic_status_e topic_status_closed hide_on_edit' title='Status: Closed' style="font-weight:normal;float: right;position:relative;top:-5px;">&#x1F512;&#xFE0E</span>`)
var topic_15 []byte = []byte(`
<input class='show_on_edit topic_name_input' name="topic_name" value='`)
var topic_16 []byte = []byte(`' type="text" />
var topic_15 []byte = []byte(`<span class='username hide_on_micro topic_status_e topic_status_closed hide_on_edit' title='Status: Closed' style="font-weight:normal;float: right;position:relative;top:-5px;">&#x1F512;&#xFE0E</span>`)
var topic_16 []byte = []byte(`
<input form='edit_topic_form' class='show_on_edit topic_name_input' name="topic_name" value='`)
var topic_17 []byte = []byte(`' type="text" />
`)
var topic_17 []byte = []byte(`<select name="topic_status" class='show_on_edit topic_status_input' style='float: right;'>
var topic_18 []byte = []byte(`<select form='edit_topic_form' name="topic_status" class='show_on_edit topic_status_input' style='float: right;'>
<option>open</option>
<option>closed</option>
</select>`)
var topic_18 []byte = []byte(`
<button name="topic-button" class="formbutton show_on_edit submit_edit">Update</button>
`)
var topic_19 []byte = []byte(`
<button form='edit_topic_form' name="topic-button" class="formbutton show_on_edit submit_edit">Update</button>
`)
var topic_20 []byte = []byte(`
</div>
</form>
</div>
<div class="rowblock post_container top_post">
<div class="rowitem passive editable_parent post_item `)
var topic_20 []byte = []byte(`" style="`)
var topic_21 []byte = []byte(`background-image:url(`)
var topic_22 []byte = []byte(`), url(/static/white-dot.jpg);background-position: 0px `)
var topic_23 []byte = []byte(`-1`)
var topic_24 []byte = []byte(`0px;background-repeat:no-repeat, repeat-y;`)
var topic_25 []byte = []byte(`">
var topic_21 []byte = []byte(`" style="`)
var topic_22 []byte = []byte(`background-image:url(`)
var topic_23 []byte = []byte(`), url(/static/post-avatar-bg.jpg);background-position: 0px `)
var topic_24 []byte = []byte(`-1`)
var topic_25 []byte = []byte(`0px;background-repeat:no-repeat, repeat-y;`)
var topic_26 []byte = []byte(`">
<p class="hide_on_edit topic_content user_content" style="margin:0;padding:0;">`)
var topic_26 []byte = []byte(`</p>
var topic_27 []byte = []byte(`</p>
<textarea name="topic_content" class="show_on_edit topic_content_input">`)
var topic_27 []byte = []byte(`</textarea>
var topic_28 []byte = []byte(`</textarea>
<span class="controls">
<a href="/user/`)
var topic_28 []byte = []byte(`.`)
var topic_29 []byte = []byte(`" class="username real_username">`)
var topic_30 []byte = []byte(`</a>&nbsp;&nbsp;
var topic_29 []byte = []byte(`.`)
var topic_30 []byte = []byte(`" class="username real_username">`)
var topic_31 []byte = []byte(`</a>&nbsp;&nbsp;
`)
var topic_31 []byte = []byte(`<a href="/topic/like/submit/`)
var topic_32 []byte = []byte(`" class="mod_button" title="Love it" style="color:#202020;">
var topic_32 []byte = []byte(`<a href="/topic/like/submit/`)
var topic_33 []byte = []byte(`" class="mod_button" title="Love it" style="color:#202020;">
<button class="username like_label" style="`)
var topic_33 []byte = []byte(`background-color:/*#eaffea*/#D6FFD6;`)
var topic_34 []byte = []byte(`"></button></a>`)
var topic_35 []byte = []byte(`<a href='/topic/edit/`)
var topic_36 []byte = []byte(`' class="mod_button open_edit" style="font-weight:normal;" title="Edit Topic"><button class="username edit_label"></button></a>`)
var topic_37 []byte = []byte(`<a href='/topic/delete/submit/`)
var topic_38 []byte = []byte(`' class="mod_button" style="font-weight:normal;" title="Delete Topic"><button class="username trash_label"></button></a>`)
var topic_39 []byte = []byte(`<a class="mod_button" href='/topic/unstick/submit/`)
var topic_40 []byte = []byte(`' style="font-weight:normal;" title="Unpin Topic"><button class="username unpin_label"></button></a>`)
var topic_41 []byte = []byte(`<a href='/topic/stick/submit/`)
var topic_42 []byte = []byte(`' class="mod_button" style="font-weight:normal;" title="Pin Topic"><button class="username pin_label"></button></a>`)
var topic_43 []byte = []byte(`
var topic_34 []byte = []byte(`background-color:/*#eaffea*/#D6FFD6;`)
var topic_35 []byte = []byte(`"></button></a>`)
var topic_36 []byte = []byte(`<a href='/topic/edit/`)
var topic_37 []byte = []byte(`' class="mod_button open_edit" style="font-weight:normal;" title="Edit Topic"><button class="username edit_label"></button></a>`)
var topic_38 []byte = []byte(`<a href='/topic/delete/submit/`)
var topic_39 []byte = []byte(`' class="mod_button" style="font-weight:normal;" title="Delete Topic"><button class="username trash_label"></button></a>`)
var topic_40 []byte = []byte(`<a class="mod_button" href='/topic/unstick/submit/`)
var topic_41 []byte = []byte(`' style="font-weight:normal;" title="Unpin Topic"><button class="username unpin_label"></button></a>`)
var topic_42 []byte = []byte(`<a href='/topic/stick/submit/`)
var topic_43 []byte = []byte(`' class="mod_button" style="font-weight:normal;" title="Pin Topic"><button class="username pin_label"></button></a>`)
var topic_44 []byte = []byte(`
<a class="mod_button" href="/report/submit/`)
var topic_44 []byte = []byte(`?session=`)
var topic_45 []byte = []byte(`&type=topic" class="mod_button report_item" style="font-weight:normal;" title="Flag Topic"><button class="username flag_label"></button></a>
var topic_45 []byte = []byte(`?session=`)
var topic_46 []byte = []byte(`&type=topic" class="mod_button report_item" style="font-weight:normal;" title="Flag Topic"><button class="username flag_label"></button></a>
`)
var topic_46 []byte = []byte(`<a class="username hide_on_micro like_count">`)
var topic_47 []byte = []byte(`</a><a class="username hide_on_micro like_count_label" title="Like Count"></a>`)
var topic_48 []byte = []byte(`<a class="username hide_on_micro user_tag">`)
var topic_49 []byte = []byte(`</a>`)
var topic_50 []byte = []byte(`<a class="username hide_on_micro level">`)
var topic_51 []byte = []byte(`</a><a class="username hide_on_micro level_label" style="float:right;" title="Level"></a>`)
var topic_52 []byte = []byte(`
var topic_47 []byte = []byte(`<a class="username hide_on_micro like_count">`)
var topic_48 []byte = []byte(`</a><a class="username hide_on_micro like_count_label" title="Like Count"></a>`)
var topic_49 []byte = []byte(`<a class="username hide_on_micro user_tag">`)
var topic_50 []byte = []byte(`</a>`)
var topic_51 []byte = []byte(`<a class="username hide_on_micro level">`)
var topic_52 []byte = []byte(`</a><a class="username hide_on_micro level_label" style="float:right;" title="Level"></a>`)
var topic_53 []byte = []byte(`
</span>
</div>
</div>
<div class="rowblock post_container" style="overflow: hidden;">`)
var topic_53 []byte = []byte(`
var topic_54 []byte = []byte(`
<div class="rowitem passive deletable_block editable_parent post_item action_item">
<span class="action_icon" style="font-size: 18px;padding-right: 5px;">`)
var topic_54 []byte = []byte(`</span>
<span>`)
var topic_55 []byte = []byte(`</span>
<span>`)
var topic_56 []byte = []byte(`</span>
</div>
`)
var topic_56 []byte = []byte(`
var topic_57 []byte = []byte(`
<div class="rowitem passive deletable_block editable_parent post_item `)
var topic_57 []byte = []byte(`" style="`)
var topic_58 []byte = []byte(`background-image:url(`)
var topic_59 []byte = []byte(`), url(/static/white-dot.jpg);background-position: 0px `)
var topic_60 []byte = []byte(`-1`)
var topic_61 []byte = []byte(`0px;background-repeat:no-repeat, repeat-y;`)
var topic_62 []byte = []byte(`">
var topic_58 []byte = []byte(`" style="`)
var topic_59 []byte = []byte(`background-image:url(`)
var topic_60 []byte = []byte(`), url(/static/post-avatar-bg.jpg);background-position: 0px `)
var topic_61 []byte = []byte(`-1`)
var topic_62 []byte = []byte(`0px;background-repeat:no-repeat, repeat-y;`)
var topic_63 []byte = []byte(`">
<p class="editable_block user_content" style="margin:0;padding:0;">`)
var topic_63 []byte = []byte(`</p>
var topic_64 []byte = []byte(`</p>
<span class="controls">
<a href="/user/`)
var topic_64 []byte = []byte(`.`)
var topic_65 []byte = []byte(`" class="username real_username">`)
var topic_66 []byte = []byte(`</a>&nbsp;&nbsp;
var topic_65 []byte = []byte(`.`)
var topic_66 []byte = []byte(`" class="username real_username">`)
var topic_67 []byte = []byte(`</a>&nbsp;&nbsp;
`)
var topic_67 []byte = []byte(`<a href="/reply/like/submit/`)
var topic_68 []byte = []byte(`" class="mod_button" title="Love it" style="color:#202020;"><button class="username like_label" style="`)
var topic_69 []byte = []byte(`background-color:/*#eaffea*/#D6FFD6;`)
var topic_70 []byte = []byte(`"></button></a>`)
var topic_71 []byte = []byte(`<a href="/reply/edit/submit/`)
var topic_72 []byte = []byte(`" class="mod_button" title="Edit Reply"><button class="username edit_item edit_label"></button></a>`)
var topic_73 []byte = []byte(`<a href="/reply/delete/submit/`)
var topic_74 []byte = []byte(`" class="mod_button" title="Delete Reply"><button class="username delete_item trash_label"></button></a>`)
var topic_75 []byte = []byte(`
var topic_68 []byte = []byte(`<a href="/reply/like/submit/`)
var topic_69 []byte = []byte(`" class="mod_button" title="Love it" style="color:#202020;"><button class="username like_label" style="`)
var topic_70 []byte = []byte(`background-color:/*#eaffea*/#D6FFD6;`)
var topic_71 []byte = []byte(`"></button></a>`)
var topic_72 []byte = []byte(`<a href="/reply/edit/submit/`)
var topic_73 []byte = []byte(`" class="mod_button" title="Edit Reply"><button class="username edit_item edit_label"></button></a>`)
var topic_74 []byte = []byte(`<a href="/reply/delete/submit/`)
var topic_75 []byte = []byte(`" class="mod_button" title="Delete Reply"><button class="username delete_item trash_label"></button></a>`)
var topic_76 []byte = []byte(`
<a class="mod_button" href="/report/submit/`)
var topic_76 []byte = []byte(`?session=`)
var topic_77 []byte = []byte(`&type=reply" class="mod_button report_item" title="Flag Reply"><button class="username report_item flag_label"></button></a>
var topic_77 []byte = []byte(`?session=`)
var topic_78 []byte = []byte(`&type=reply" class="mod_button report_item" title="Flag Reply"><button class="username report_item flag_label"></button></a>
`)
var topic_78 []byte = []byte(`<a class="username hide_on_micro like_count">`)
var topic_79 []byte = []byte(`</a><a class="username hide_on_micro like_count_label" title="Like Count"></a>`)
var topic_80 []byte = []byte(`<a class="username hide_on_micro user_tag">`)
var topic_81 []byte = []byte(`</a>`)
var topic_82 []byte = []byte(`<a class="username hide_on_micro level">`)
var topic_83 []byte = []byte(`</a><a class="username hide_on_micro level_label" style="float:right;" title="Level">`)
var topic_84 []byte = []byte(`</a>
var topic_79 []byte = []byte(`<a class="username hide_on_micro like_count">`)
var topic_80 []byte = []byte(`</a><a class="username hide_on_micro like_count_label" title="Like Count"></a>`)
var topic_81 []byte = []byte(`<a class="username hide_on_micro user_tag">`)
var topic_82 []byte = []byte(`</a>`)
var topic_83 []byte = []byte(`<a class="username hide_on_micro level">`)
var topic_84 []byte = []byte(`</a><a class="username hide_on_micro level_label" style="float:right;" title="Level">`)
var topic_85 []byte = []byte(`</a>
</span>
</div>
`)
var topic_85 []byte = []byte(`</div>
var topic_86 []byte = []byte(`</div>
`)
var topic_86 []byte = []byte(`
var topic_87 []byte = []byte(`
<div class="rowblock topic_reply_form">
<form action="/reply/create/" method="post">
<input name="tid" value='`)
var topic_87 []byte = []byte(`' type="hidden" />
var topic_88 []byte = []byte(`' type="hidden" />
<div class="formrow real_first_child">
<div class="formitem"><textarea name="reply-content" placeholder="Insert reply here"></textarea></div>
</div>
@ -410,13 +413,17 @@ var topic_alt_89 []byte = []byte(`' type="hidden" />
`)
var profile_0 []byte = []byte(`
<div id="profile_left_pane" class="colblock_left" style="max-width: 220px;">
<div class="rowitem" style="padding: 0;">
<div id="profile_left_lane" class="colstack_left">
<!--<div class="colstack_item colstack_head rowhead">
<div class="rowitem"><a>Profile</a></div>
</div>-->
<div id="profile_left_pane" class="rowmenu">
<div class="rowitem avatarRow" style="padding: 0;">
<img src="`)
var profile_1 []byte = []byte(`" style="max-width: 100%;margin: 0;display: block;" />
var profile_1 []byte = []byte(`" class="avatar" />
</div>
<div class="rowitem">
<span style="font-size: 18px;">`)
<span class="profileName">`)
var profile_2 []byte = []byte(`</span>`)
var profile_3 []byte = []byte(`<span class="username" style="float: right;font-weight: normal;">`)
var profile_4 []byte = []byte(`</span>`)
@ -444,11 +451,13 @@ var profile_15 []byte = []byte(`?session=`)
var profile_16 []byte = []byte(`&type=user" class="profile_menu_item report_item">Report</a>
</div>
</div>
</div>
<div class="colblock_right rowhead" style="width: calc(95% - 210px);">
<div id="profile_right_lane" class="colstack_right">
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Comments</a></div>
</div>
<div id="profile_comments" class="colblock_right" style="overflow: hidden;border-top: none;width:calc(95% - 210px);">`)
<div id="profile_comments" class="colstack_item" style="overflow: hidden;border-top: none;">`)
var profile_17 []byte = []byte(`
<div class="rowitem passive deletable_block editable_parent simple `)
var profile_18 []byte = []byte(`" style="`)
@ -477,25 +486,26 @@ var profile_32 []byte = []byte(`?session=`)
var profile_33 []byte = []byte(`&type=user-reply"><button class="username report_item flag_label"></button></a>
`)
var profile_34 []byte = []byte(`<a class="username hide_on_mobile" style="float: right;">`)
var profile_34 []byte = []byte(`<a class="username hide_on_mobile user_tag" style="float: right;">`)
var profile_35 []byte = []byte(`</a>`)
var profile_36 []byte = []byte(`
</div>
`)
var profile_37 []byte = []byte(`</div>
<div class="colblock_right" style="border-top: none;width: calc(95% - 210px);">
`)
var profile_38 []byte = []byte(`
<form action="/profile/reply/create/" method="post">
<input name="uid" value='`)
var profile_39 []byte = []byte(`' type="hidden" />
<div class="colstack_item topic_reply_form" style="border-top: none;">
<div class="formrow">
<div class="formitem"><textarea name="reply-content" placeholder="Insert reply here"></textarea></div>
</div>
<div class="formrow">
<div class="formitem"><button name="reply-button" class="formbutton">Create Reply</button></div>
</div>
</div>
</form>
`)
var profile_40 []byte = []byte(`
@ -607,9 +617,9 @@ var forum_11 []byte = []byte(`</a>
`)
var forum_12 []byte = []byte(`
<div class="opt create_topic_opt" title="Create Topic"><a href="/topics/create/`)
var forum_13 []byte = []byte(`">&#x1F58A;&#xFE0E</a></div>
var forum_13 []byte = []byte(`"></a></div>
`)
var forum_14 []byte = []byte(`<div class="opt locked_opt" title="You don't have the permissions needed to create a topic">&#x1F512;&#xFE0E</div>`)
var forum_14 []byte = []byte(`<div class="opt locked_opt" title="You don't have the permissions needed to create a topic"><a></a></div>`)
var forum_15 []byte = []byte(`
<div style="clear: both;"></div>
`)

View File

@ -66,199 +66,200 @@ w.Write([]byte(item))
w.Write(header_13)
}
}
if tmpl_topic_vars.Page > 1 {
w.Write(topic_0)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_1)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Page - 1)))
if tmpl_topic_vars.Page > 1 {
w.Write(topic_2)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_3)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Page - 1)))
w.Write(topic_4)
}
if tmpl_topic_vars.LastPage != tmpl_topic_vars.Page {
w.Write(topic_3)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_4)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Page + 1)))
w.Write(topic_5)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_6)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Page + 1)))
w.Write(topic_7)
}
w.Write(topic_8)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_8)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Page + 1)))
w.Write(topic_9)
if tmpl_topic_vars.Topic.Sticky {
}
w.Write(topic_10)
if tmpl_topic_vars.Topic.Sticky {
w.Write(topic_11)
} else {
if tmpl_topic_vars.Topic.Is_Closed {
w.Write(topic_11)
}
}
w.Write(topic_12)
w.Write([]byte(tmpl_topic_vars.Topic.Title))
}
}
w.Write(topic_13)
if tmpl_topic_vars.Topic.Is_Closed {
w.Write([]byte(tmpl_topic_vars.Topic.Title))
w.Write(topic_14)
if tmpl_topic_vars.Topic.Is_Closed {
w.Write(topic_15)
}
if tmpl_topic_vars.CurrentUser.Perms.EditTopic {
w.Write(topic_15)
w.Write([]byte(tmpl_topic_vars.Topic.Title))
w.Write(topic_16)
if tmpl_topic_vars.CurrentUser.Perms.CloseTopic {
w.Write([]byte(tmpl_topic_vars.Topic.Title))
w.Write(topic_17)
}
if tmpl_topic_vars.CurrentUser.Perms.CloseTopic {
w.Write(topic_18)
}
w.Write(topic_19)
w.Write([]byte(tmpl_topic_vars.Topic.ClassName))
w.Write(topic_20)
if tmpl_topic_vars.Topic.Avatar != "" {
w.Write(topic_21)
w.Write([]byte(tmpl_topic_vars.Topic.Avatar))
w.Write(topic_22)
if tmpl_topic_vars.Topic.ContentLines <= 5 {
w.Write(topic_23)
}
w.Write(topic_20)
w.Write([]byte(tmpl_topic_vars.Topic.ClassName))
w.Write(topic_21)
if tmpl_topic_vars.Topic.Avatar != "" {
w.Write(topic_22)
w.Write([]byte(tmpl_topic_vars.Topic.Avatar))
w.Write(topic_23)
if tmpl_topic_vars.Topic.ContentLines <= 5 {
w.Write(topic_24)
}
w.Write(topic_25)
w.Write([]byte(tmpl_topic_vars.Topic.Content))
}
w.Write(topic_26)
w.Write([]byte(tmpl_topic_vars.Topic.Content))
w.Write(topic_27)
w.Write([]byte(tmpl_topic_vars.Topic.UserSlug))
w.Write([]byte(tmpl_topic_vars.Topic.Content))
w.Write(topic_28)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.CreatedBy)))
w.Write([]byte(tmpl_topic_vars.Topic.UserSlug))
w.Write(topic_29)
w.Write([]byte(tmpl_topic_vars.Topic.CreatedByName))
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.CreatedBy)))
w.Write(topic_30)
if tmpl_topic_vars.CurrentUser.Perms.LikeItem {
w.Write([]byte(tmpl_topic_vars.Topic.CreatedByName))
w.Write(topic_31)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
if tmpl_topic_vars.CurrentUser.Perms.LikeItem {
w.Write(topic_32)
if tmpl_topic_vars.Topic.Liked {
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_33)
}
if tmpl_topic_vars.Topic.Liked {
w.Write(topic_34)
}
if tmpl_topic_vars.CurrentUser.Perms.EditTopic {
w.Write(topic_35)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
}
if tmpl_topic_vars.CurrentUser.Perms.EditTopic {
w.Write(topic_36)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_37)
}
if tmpl_topic_vars.CurrentUser.Perms.DeleteTopic {
w.Write(topic_37)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_38)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_39)
}
if tmpl_topic_vars.CurrentUser.Perms.PinTopic {
if tmpl_topic_vars.Topic.Sticky {
w.Write(topic_39)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_40)
} else {
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_41)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
} else {
w.Write(topic_42)
}
}
w.Write(topic_43)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_43)
}
}
w.Write(topic_44)
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_45)
if tmpl_topic_vars.Topic.LikeCount > 0 {
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_46)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.LikeCount)))
if tmpl_topic_vars.Topic.LikeCount > 0 {
w.Write(topic_47)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.LikeCount)))
w.Write(topic_48)
}
if tmpl_topic_vars.Topic.Tag != "" {
w.Write(topic_48)
w.Write([]byte(tmpl_topic_vars.Topic.Tag))
w.Write(topic_49)
} else {
w.Write([]byte(tmpl_topic_vars.Topic.Tag))
w.Write(topic_50)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.Level)))
} else {
w.Write(topic_51)
}
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.Level)))
w.Write(topic_52)
}
w.Write(topic_53)
if len(tmpl_topic_vars.ItemList) != 0 {
for _, item := range tmpl_topic_vars.ItemList {
if item.ActionType != "" {
w.Write(topic_53)
w.Write([]byte(item.ActionIcon))
w.Write(topic_54)
w.Write([]byte(item.ActionType))
w.Write([]byte(item.ActionIcon))
w.Write(topic_55)
} else {
w.Write([]byte(item.ActionType))
w.Write(topic_56)
w.Write([]byte(item.ClassName))
} else {
w.Write(topic_57)
if item.Avatar != "" {
w.Write([]byte(item.ClassName))
w.Write(topic_58)
w.Write([]byte(item.Avatar))
if item.Avatar != "" {
w.Write(topic_59)
if item.ContentLines <= 5 {
w.Write([]byte(item.Avatar))
w.Write(topic_60)
}
if item.ContentLines <= 5 {
w.Write(topic_61)
}
w.Write(topic_62)
w.Write([]byte(item.ContentHtml))
w.Write(topic_63)
w.Write([]byte(item.UserSlug))
w.Write(topic_64)
w.Write([]byte(strconv.Itoa(item.CreatedBy)))
w.Write(topic_65)
w.Write([]byte(item.CreatedByName))
w.Write(topic_66)
if tmpl_topic_vars.CurrentUser.Perms.LikeItem {
w.Write(topic_67)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_68)
if item.Liked {
w.Write(topic_69)
}
w.Write(topic_63)
w.Write([]byte(item.ContentHtml))
w.Write(topic_64)
w.Write([]byte(item.UserSlug))
w.Write(topic_65)
w.Write([]byte(strconv.Itoa(item.CreatedBy)))
w.Write(topic_66)
w.Write([]byte(item.CreatedByName))
w.Write(topic_67)
if tmpl_topic_vars.CurrentUser.Perms.LikeItem {
w.Write(topic_68)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_69)
if item.Liked {
w.Write(topic_70)
}
if tmpl_topic_vars.CurrentUser.Perms.EditReply {
w.Write(topic_71)
w.Write([]byte(strconv.Itoa(item.ID)))
}
if tmpl_topic_vars.CurrentUser.Perms.EditReply {
w.Write(topic_72)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_73)
}
if tmpl_topic_vars.CurrentUser.Perms.DeleteReply {
w.Write(topic_73)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_74)
}
w.Write(topic_75)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_75)
}
w.Write(topic_76)
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_77)
if item.LikeCount > 0 {
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_78)
w.Write([]byte(strconv.Itoa(item.LikeCount)))
if item.LikeCount > 0 {
w.Write(topic_79)
w.Write([]byte(strconv.Itoa(item.LikeCount)))
w.Write(topic_80)
}
if item.Tag != "" {
w.Write(topic_80)
w.Write([]byte(item.Tag))
w.Write(topic_81)
} else {
w.Write([]byte(item.Tag))
w.Write(topic_82)
w.Write([]byte(strconv.Itoa(item.Level)))
} else {
w.Write(topic_83)
}
w.Write([]byte(strconv.Itoa(item.Level)))
w.Write(topic_84)
}
}
}
w.Write(topic_85)
if tmpl_topic_vars.CurrentUser.Perms.CreateReply {
}
}
}
w.Write(topic_86)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
if tmpl_topic_vars.CurrentUser.Perms.CreateReply {
w.Write(topic_87)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_88)
}
w.Write(footer_0)
if tmpl_topic_vars.Header.Widgets.RightSidebar != "" {

View File

@ -985,6 +985,7 @@ func (c *CTemplateSet) compile_command(*parse.CommandNode) (out string) {
return ""
}
// TO-DO: Write unit tests for this
func minify(data string) string {
data = strings.Replace(data,"\t","",-1)
data = strings.Replace(data,"\v","",-1)
@ -993,3 +994,40 @@ func minify(data string) string {
data = strings.Replace(data," "," ",-1)
return data
}
// TO-DO: Strip comments
// TO-DO: Handle CSS nested in <style> tags?
// TO-DO: Write unit tests for this
func minify_html(data string) string {
return minify(data)
}
// TO-DO: Have static files use this
// TO-DO: Strip comments
// TO-DO: Convert the rgb()s to hex codes?
// TO-DO: Write unit tests for this
func minify_css(data string) string {
return minify(data)
}
// TO-DO: Convert this to three character hex strings whenever possible?
// TO-DO: Write unit tests for this
func rgb_to_hexstr(red int, green int, blue int) string {
return strconv.FormatInt(int64(red), 16) + strconv.FormatInt(int64(green), 16) + strconv.FormatInt(int64(blue), 16)
}
/*
// TO-DO: Write unit tests for this
func hexstr_to_rgb(hexstr string) (red int, blue int, green int, err error) {
// Strip the # at the start
if hexstr[0] == '#' {
hexstr = strings.TrimPrefix(hexstr,"#")
}
if len(hexstr) != 3 && len(hexstr) != 6 {
return 0, 0, 0, errors.New("Hex colour codes may only be three or six characters long")
}
if len(hexstr) == 3 {
hexstr = hexstr[0] + hexstr[0] + hexstr[1] + hexstr[1] + hexstr[2] + hexstr[2]
}
}*/

View File

@ -2,7 +2,7 @@
<div class="colstack_item colstack_head rowhead">
<div class="rowitem"><a>My Account</a></div>
</div>
<div class="colstack_item">
<div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="/user/edit/avatar/">Change Avatar</a></div>
<div class="rowitem passive"><a href="/user/edit/username/">Change Username</a></div>
<div class="rowitem passive"><a href="/user/edit/critical/">Change Password</a></div>

View File

@ -11,7 +11,7 @@
{{end}}
<div class="colstack_item">
<form action="/user/edit/avatar/submit/" method="post" enctype="multipart/form-data">
<div class="formrow">
<div class="formrow real_first_child">
<div class="formitem formlabel"><a>Upload Avatar</a></div>
<div class="formitem"><input name="account-avatar" type="file" /></div>
</div>

View File

@ -5,6 +5,7 @@
<div class="rowitem"><a>Emails</a></div>
</div>
<div class="colstack_item">
<!-- TO-DO: Do we need this inline CSS? -->
{{range .ItemList}}
<div class="rowitem" style="font-weight: normal;">
<a style="text-transform: none;">{{.Email}}</a>

View File

@ -6,7 +6,7 @@
</div>
<div class="colstack_item">
<form action="/user/edit/username/submit/" method="post">
<div class="formrow">
<div class="formrow real_first_child">
<div class="formitem formlabel"><a>Current Username</a></div>
<div class="formitem formlabel">{{.CurrentUser.Name}}</div>
</div>
@ -15,7 +15,7 @@
<div class="formitem"><input name="account-new-username" type="text" /></div>
</div>
<div class="formrow">
<div class="formitem"><button name="account-button" class="formbutton">Update</button></div>
<div class="formitem"><button name="account-button" class="formbutton form_middle_button">Update</button></div>
</div>
</form>
</div>

View File

@ -6,7 +6,7 @@
</div>
<div class="colstack_item">
<form action="/user/edit/critical/submit/" method="post">
<div class="formrow">
<div class="formrow real_first_child">
<div class="formitem formlabel"><a>Current Password</a></div>
<div class="formitem"><input name="account-current-password" type="password" placeholder="*****" /></div>
</div>
@ -19,7 +19,7 @@
<div class="formitem"><input name="account-confirm-password" type="password" placeholder="*****" /></div>
</div>
<div class="formrow">
<div class="formitem"><button name="account-button" class="formbutton">Update</button></div>
<div class="formitem"><button name="account-button" class="formbutton form_middle_button">Update</button></div>
</div>
</form>
</div>

View File

@ -4,7 +4,7 @@
</div>
<div class="rowblock">
<form action="/topic/create/submit/" method="post">
<div class="formrow">
<div class="formrow real_first_child">
<div class="formitem formlabel"><a>Board</a></div>
<div class="formitem"><select name="topic-board">
{{range .ItemList}}<option {{if eq .ID $.FID}}selected{{end}} value="{{.ID}}">{{.Name}}</option>{{end}}
@ -15,10 +15,11 @@
<div class="formitem"><input name="topic-name" type="text" placeholder="Topic Name" /></div>
</div>
<div class="formrow">
<div class="formitem"><textarea name="topic-content" placeholder="Insert content here"></textarea></div>
<div class="formitem formlabel"><a>Content</a></div>
<div class="formitem"><textarea class="large" name="topic-content" placeholder="Insert content here"></textarea></div>
</div>
<div class="formrow">
<div class="formitem"><button name="topic-button" class="formbutton">Create Topic</button></div>
<div class="formitem"><button name="topic-button" class="formbutton form_middle_button">Create Topic</button></div>
</div>
</form>
</div>

View File

@ -9,8 +9,8 @@
</div>
{{if ne .CurrentUser.ID 0}}
{{if .CurrentUser.Perms.CreateTopic}}
<div class="opt create_topic_opt" title="Create Topic"><a href="/topics/create/{{.Forum.ID}}">&#x1F58A;&#xFE0E</a></div>
{{else}}<div class="opt locked_opt" title="You don't have the permissions needed to create a topic">&#x1F512;&#xFE0E</div>{{end}}
<div class="opt create_topic_opt" title="Create Topic"><a href="/topics/create/{{.Forum.ID}}"></a></div>
{{else}}<div class="opt locked_opt" title="You don't have the permissions needed to create a topic"><a></a></div>{{end}}
<div style="clear: both;"></div>
{{end}}
</div>

View File

@ -6,6 +6,12 @@
<li class="menu_left menu_forums"><a href="/forums/">Forums</a></li>
<li class="menu_left menu_topics"><a href="/">Topics</a></li>
<li class="menu_left menu_create_topic"><a href="/topics/create/">Create Topic</a></li>
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter"></div>
<div class="alert_aftercounter"></div>
<div class="alertList"></div>
</li>
{{if .CurrentUser.Loggedin}}
<li class="menu_left menu_account"><a href="/user/edit/critical/">Account</a></li>
<li class="menu_left menu_profile"><a href="/user/{{.CurrentUser.Slug}}.{{.CurrentUser.ID}}">Profile</a></li>
@ -15,12 +21,6 @@
<li class="menu_left menu_register"><a href="/accounts/create/">Register</a></li>
<li class="menu_left menu_login"><a href="/accounts/login/">Login</a></li>
{{end}}
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter"></div>
<div class="alert_aftercounter"></div>
<div class="alertList"></div>
</li>
</ul>
</div>
</div>

View File

@ -3,7 +3,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/logs/mod/">Logs</a></div>
</div>
<div class="colstack_item">
<div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="/panel/logs/mod/">Moderation Logs</a></div>
{{if .CurrentUser.Perms.ViewAdminLogs}}<div class="rowitem passive"><a>Administration Logs</a></div>{{end}}
{{if .CurrentUser.Perms.ViewAdminLogs}}<div class="rowitem passive"><a>System Logs</a></div>{{end}}
@ -14,7 +14,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Administration Logs</a></div>
</div>
<div id="panel_adminlogs" class="colstack_item">
<div id="panel_adminlogs" class="colstack_item rowlist">
{{range .Logs}}
<div class="rowitem" style="font-weight: normal;text-transform: none;">
<a style="font-size: 17px;">{{.Action}}</a><br />

View File

@ -4,7 +4,6 @@
var form_vars = {'perm_preset': ['can_moderate','can_post','read_only','no_access','default','custom']};
</script>
</div>
<div class="colstack_right">
<div class="colstack_item colstack_head">
<div class="rowitem"><a>{{.Name}} Forum</a></div>
@ -41,14 +40,14 @@ var form_vars = {'perm_preset': ['can_moderate','can_post','read_only','no_acces
</div>
</div>
<div class="formrow">
<div class="formitem"><button name="panel-button" class="formbutton">Update Forum</button></div>
<div class="formitem"><button name="panel-button" class="formbutton form_middle_button">Update Forum</button></div>
</div>
</form>
</div>
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Forum Permissions</a></div>
</div>
<div id="forum_quick_perms" class="colstack_item">
<div id="forum_quick_perms" class="colstack_item rowlist">
{{range .Groups}}
<div class="formrow">
<div class="formitem editable_parent">

View File

@ -9,7 +9,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Forums</a></div>
</div>
<div id="panel_forums" class="colstack_item">
<div id="panel_forums" class="colstack_item rowlist">
{{range .ItemList}}
<div class="rowitem editable_parent" style="{{if eq .ID 1}}border-bottom-style:solid;{{end}}">
<span class="panel_floater">

View File

@ -3,7 +3,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/groups/edit/{{.ID}}">Group Editor</a></div>
</div>
<div class="colstack_item">
<div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="/panel/groups/edit/{{.ID}}">General</a></div>
<div class="rowitem passive"><a>Promotions</a></div>
<div class="rowitem passive"><a href="/panel/groups/edit/perms/{{.ID}}">Permissions</a></div>
@ -15,7 +15,7 @@
<div class="rowitem"><a>{{.Name}} Group</a></div>
</div>
<form action="/panel/groups/edit/perms/submit/{{.ID}}?session={{.CurrentUser.Session}}" method="post">
<div id="panel_group" class="colstack_item">
<div id="panel_group" class="colstack_item rowlist">
{{if .CurrentUser.Perms.EditGroupLocalPerms}}
{{range .LocalPerms}}
<div class="formrow">
@ -32,13 +32,13 @@
{{end}}
{{end}}
<div class="formrow">
<div class="formitem"><button name="panel-button" class="formbutton">Update Group</button></div>
<div class="formitem"><button name="panel-button" class="formbutton form_middle_button">Update Group</button></div>
</div>
</div>
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Extended Permissions</a></div>
</div>
<div class="colstack_item">
<div class="colstack_item rowlist">
{{if .CurrentUser.Perms.EditGroupGlobalPerms}}
{{range .GlobalPerms}}
<div class="formrow">
@ -55,7 +55,7 @@
{{end}}
{{end}}
<div class="formrow">
<div class="formitem"><button name="panel-button" class="formbutton">Update Group</button></div>
<div class="formitem"><button name="panel-button" class="formbutton form_middle_button">Update Group</button></div>
</div>
</div>
</form>

View File

@ -3,7 +3,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/groups/edit/{{.ID}}">Group Editor</a></div>
</div>
<div class="colstack_item">
<div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="/panel/groups/edit/{{.ID}}">General</a></div>
<div class="rowitem passive"><a>Promotions</a></div>
<div class="rowitem passive"><a href="/panel/groups/edit/perms/{{.ID}}">Permissions</a></div>

View File

@ -5,7 +5,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Groups</a></div>
</div>
<div id="panel_groups" class="colstack_item">
<div id="panel_groups" class="colstack_item rowlist">
{{range .ItemList}}
<div class="rowitem panel_compactrow editable_parent">
<a href="/panel/groups/edit/{{.ID}}" class="panel_upshift">{{.Name}}</a>

View File

@ -1,7 +1,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/">Control Panel</a></div>
</div>
<div class="colstack_item">
<div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="/panel/users/">Users</a></div>
<div class="rowitem passive"><a href="/panel/groups/">Groups</a></div>
{{if .CurrentUser.Perms.ManageForums}}<div class="rowitem passive"><a href="/panel/forums/">Forums</a></div>{{end}}

View File

@ -3,7 +3,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/logs/mod/">Logs</a></div>
</div>
<div class="colstack_item">
<div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="/panel/logs/mod/">Moderation Logs</a></div>
{{if .CurrentUser.Perms.ViewAdminLogs}}<div class="rowitem passive"><a>Administration Logs</a></div>{{end}}
{{if .CurrentUser.Perms.ViewAdminLogs}}<div class="rowitem passive"><a>System Logs</a></div>{{end}}
@ -14,7 +14,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Moderation Logs</a></div>
</div>
<div id="panel_modlogs" class="colstack_item">
<div id="panel_modlogs" class="colstack_item rowlist">
{{range .Logs}}
<div class="rowitem panel_compactrow" style="font-weight: normal;text-transform: none;">
<span style="float: left;">

View File

@ -4,7 +4,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Settings</a></div>
</div>
<div id="panel_settings" class="colstack_item">
<div id="panel_settings" class="colstack_item rowlist">
{{range $key, $value := .Something}}
<div class="rowitem panel_compactrow editable_parent">
<a href="/panel/settings/edit/{{$key}}" class="editable_block panel_upshift">{{$key}}</a>

View File

@ -3,7 +3,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/themes/">Theme Manager</a></div>
</div>
<div class="colstack_item">
<div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="#">Widgets</a></div>
</div>
{{template "panel-inner-menu.html" . }}

View File

@ -5,15 +5,15 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Users</a></div>
</div>
<div id="panel_users" class="colstack_item">
<div id="panel_users" class="colstack_item rowlist bgavatars">
{{range .ItemList}}
<div class="rowitem editable_parent" style="font-weight: normal;text-transform: none;">
<div class="rowitem editable_parent" style="{{if .Avatar}}background-image: url('{{.Avatar}}');{{end}}">
<a {{if $.CurrentUser.Perms.EditUser}}href="/panel/users/edit/{{.ID}}?session={{$.CurrentUser.Session}} "{{end}}class="editable_block">{{.Name}}</a>
<a href="/user/{{.ID}}" class="tag-mini">Profile</a>
{{if (.Tag) and (.Is_Super_Mod)}}<span style="float: right;"><span class="panel_tag" style="margin-left 4px;">{{.Tag}}</span></span>{{end}}
<span class="panel_floater">
{{if .Is_Banned}}<a href="/users/unban/{{.ID}}?session={{$.CurrentUser.Session}}" class="panel_tag panel_right_button">Unban</a>{{else if not .Is_Super_Mod}}<a href="/users/ban/{{.ID}}?session={{$.CurrentUser.Session}}" class="panel_tag panel_right_button">Ban</a>{{end}}
{{if .Is_Banned}}<a href="/users/unban/{{.ID}}?session={{$.CurrentUser.Session}}" class="panel_tag panel_right_button ban_button">Unban</a>{{else if not .Is_Super_Mod}}<a href="/users/ban/{{.ID}}?session={{$.CurrentUser.Session}}" class="panel_tag panel_right_button ban_button">Ban</a>{{end}}
{{if not .Active}}<a href="/users/activate/{{.ID}}?session={{$.CurrentUser.Session}}" class="panel_tag panel_right_button">Activate</a>{{end}}
</span>
</div>

View File

@ -1,11 +1,15 @@
{{template "header.html" . }}
<div id="profile_left_pane" class="colblock_left" style="max-width: 220px;">
<div class="rowitem" style="padding: 0;">
<img src="{{.ProfileOwner.Avatar}}" style="max-width: 100%;margin: 0;display: block;" />
<div id="profile_left_lane" class="colstack_left">
<!--<div class="colstack_item colstack_head rowhead">
<div class="rowitem"><a>Profile</a></div>
</div>-->
<div id="profile_left_pane" class="rowmenu">
<div class="rowitem avatarRow" style="padding: 0;">
<img src="{{.ProfileOwner.Avatar}}" class="avatar" />
</div>
<div class="rowitem">
<span style="font-size: 18px;">{{.ProfileOwner.Name}}</span>{{if .ProfileOwner.Tag}}<span class="username" style="float: right;font-weight: normal;">{{.ProfileOwner.Tag}}</span>{{end}}
<span class="profileName">{{.ProfileOwner.Name}}</span>{{if .ProfileOwner.Tag}}<span class="username" style="float: right;font-weight: normal;">{{.ProfileOwner.Tag}}</span>{{end}}
</div>
<div class="rowitem passive">
<a class="profile_menu_item">Add Friend</a>
@ -18,11 +22,13 @@
<a href="/report/submit/{{.ProfileOwner.ID}}?session={{.CurrentUser.Session}}&type=user" class="profile_menu_item report_item">Report</a>
</div>
</div>
</div>
<div class="colblock_right rowhead" style="width: calc(95% - 210px);">
<div id="profile_right_lane" class="colstack_right">
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Comments</a></div>
</div>
<div id="profile_comments" class="colblock_right" style="overflow: hidden;border-top: none;width:calc(95% - 210px);">{{range .ItemList}}
<div id="profile_comments" class="colstack_item" style="overflow: hidden;border-top: none;">{{range .ItemList}}
<div class="rowitem passive deletable_block editable_parent simple {{.ClassName}}" style="{{if .Avatar}}background-image: url({{.Avatar}}), url(/static/white-dot.jpg);background-position: 0px {{if le .ContentLines 5}}-1{{end}}0px;background-repeat: no-repeat, repeat-y;background-size: 128px;padding-left: 136px;{{end}}">
<span class="editable_block user_content simple">{{.ContentHtml}}</span><br /><br />
<a href="/user/{{.UserSlug}}.{{.CreatedBy}}" class="real_username username">{{.CreatedByName}}</a>&nbsp;&nbsp;
@ -33,20 +39,21 @@
<a class="mod_button" href="/report/submit/{{.ID}}?session={{$.CurrentUser.Session}}&type=user-reply"><button class="username report_item flag_label"></button></a>
{{if .Tag}}<a class="username hide_on_mobile" style="float: right;">{{.Tag}}</a>{{end}}
{{if .Tag}}<a class="username hide_on_mobile user_tag" style="float: right;">{{.Tag}}</a>{{end}}
</div>
{{end}}</div>
<div class="colblock_right" style="border-top: none;width: calc(95% - 210px);">
{{if not .CurrentUser.Is_Banned}}
<form action="/profile/reply/create/" method="post">
<input name="uid" value='{{.ProfileOwner.ID}}' type="hidden" />
<div class="colstack_item topic_reply_form" style="border-top: none;">
<div class="formrow">
<div class="formitem"><textarea name="reply-content" placeholder="Insert reply here"></textarea></div>
</div>
<div class="formrow">
<div class="formitem"><button name="reply-button" class="formbutton">Create Reply</button></div>
</div>
</div>
</form>
{{end}}
</div>

View File

@ -1,5 +1,6 @@
{{template "header.html" . }}
<form id="edit_topic_form" action='/topic/edit/submit/{{.Topic.ID}}' method="post" />
{{if gt .Page 1}}<div id="prevFloat" class="prev_button"><a class="prev_link" href="/topic/{{.Topic.ID}}?page={{subtract .Page 1}}">&lt;</a></div>{{end}}
{{if ne .LastPage .Page}}<link rel="prerender" href="/topic/{{.Topic.ID}}?page={{add .Page 1}}" />
@ -8,23 +9,22 @@
</div>{{end}}
<div class="rowblock rowhead topic_block">
<form action='/topic/edit/submit/{{.Topic.ID}}' method="post">
<div class="rowitem topic_item{{if .Topic.Sticky}} topic_sticky_head{{else if .Topic.Is_Closed}} topic_closed_head{{end}}">
<a class='topic_name hide_on_edit'>{{.Topic.Title}}</a>
{{if .Topic.Is_Closed}}<span class='username hide_on_micro topic_status_e topic_status_closed hide_on_edit' title='Status: Closed' style="font-weight:normal;float: right;position:relative;top:-5px;">&#x1F512;&#xFE0E</span>{{end}}
{{if .CurrentUser.Perms.EditTopic}}
<input class='show_on_edit topic_name_input' name="topic_name" value='{{.Topic.Title}}' type="text" />
{{if .CurrentUser.Perms.CloseTopic}}<select name="topic_status" class='show_on_edit topic_status_input' style='float: right;'>
<input form='edit_topic_form' class='show_on_edit topic_name_input' name="topic_name" value='{{.Topic.Title}}' type="text" />
{{if .CurrentUser.Perms.CloseTopic}}<select form='edit_topic_form' name="topic_status" class='show_on_edit topic_status_input' style='float: right;'>
<option>open</option>
<option>closed</option>
</select>{{end}}
<button name="topic-button" class="formbutton show_on_edit submit_edit">Update</button>
<button form='edit_topic_form' name="topic-button" class="formbutton show_on_edit submit_edit">Update</button>
{{end}}
</div>
</form>
</div>
<div class="rowblock post_container top_post">
<div class="rowitem passive editable_parent post_item {{.Topic.ClassName}}" style="{{if .Topic.Avatar}}background-image:url({{.Topic.Avatar}}), url(/static/white-dot.jpg);background-position: 0px {{if le .Topic.ContentLines 5}}-1{{end}}0px;background-repeat:no-repeat, repeat-y;{{end}}">
<div class="rowitem passive editable_parent post_item {{.Topic.ClassName}}" style="{{if .Topic.Avatar}}background-image:url({{.Topic.Avatar}}), url(/static/post-avatar-bg.jpg);background-position: 0px {{if le .Topic.ContentLines 5}}-1{{end}}0px;background-repeat:no-repeat, repeat-y;{{end}}">
<p class="hide_on_edit topic_content user_content" style="margin:0;padding:0;">{{.Topic.Content}}</p>
<textarea name="topic_content" class="show_on_edit topic_content_input">{{.Topic.Content}}</textarea>
@ -54,7 +54,7 @@
<span>{{.ActionType}}</span>
</div>
{{else}}
<div class="rowitem passive deletable_block editable_parent post_item {{.ClassName}}" style="{{if .Avatar}}background-image:url({{.Avatar}}), url(/static/white-dot.jpg);background-position: 0px {{if le .ContentLines 5}}-1{{end}}0px;background-repeat:no-repeat, repeat-y;{{end}}">
<div class="rowitem passive deletable_block editable_parent post_item {{.ClassName}}" style="{{if .Avatar}}background-image:url({{.Avatar}}), url(/static/post-avatar-bg.jpg);background-position: 0px {{if le .ContentLines 5}}-1{{end}}0px;background-repeat:no-repeat, repeat-y;{{end}}">
<p class="editable_block user_content" style="margin:0;padding:0;">{{.ContentHtml}}</p>
<span class="controls">

View File

@ -35,6 +35,7 @@ type Theme struct
Tag string
URL string
Sidebars string // Allowed Values: left, right, both, false
//DisableMinifier // Is this really a good idea? I don't think themes should be fighting against the minifier
Settings map[string]ThemeSetting
Templates []TemplateMapping
TemplatesMap map[string]string
@ -154,6 +155,7 @@ func init_themes() {
}
func add_theme_static_files(theme Theme) {
// TO-DO: Use a function instead of a closure to make this more testable? What about a function call inside the closure to take the theme variable into account?
err := filepath.Walk("./themes/" + theme.Name + "/public", func(path string, f os.FileInfo, err error) error {
if dev.DebugMode {
log.Print("Attempting to add static file '" + path + "' for default theme '" + theme.Name + "'")

View File

@ -188,7 +188,7 @@ hr { color: silver; border: 1px solid silver; }
.rowitem:not(:last-child) { border-bottom: 1px dotted #ccc; }
.rowblock:first-of-type { margin-top: 8px; }
.datarow {
.datarow, .rowlist .rowitem {
padding-top: 10px;
padding-bottom: 10px;
}
@ -196,6 +196,12 @@ hr { color: silver; border: 1px solid silver; }
font-size:12px;
}
.rowlist.bgavatars .rowitem {
background-repeat: no-repeat;
background-size: 40px;
padding-left: 47px;
}
.rowhead .rowitem, .colhead, .opthead .rowitem, .colstack_head .rowitem {
background: #ce2424;
background: -webkit-gradient(linear, 0 0, 0 bottom, from(#f97779), to(#ce2424));

View File

@ -175,7 +175,7 @@ hr { color: silver; border: 1px solid silver; }
.rowblock:first-of-type { margin-top: 8px; }
.rowitem:not(:last-child) { border-bottom: 1px dotted #ccc; }
.datarow {
.datarow, .rowlist .rowitem {
padding-top: 10px;
padding-bottom: 10px;
}
@ -183,6 +183,12 @@ hr { color: silver; border: 1px solid silver; }
font-size:12px;
}
.rowlist.bgavatars .rowitem {
background-repeat: no-repeat;
background-size: 40px;
padding-left: 47px;
}
.rowhead .rowitem, .opthead .rowitem, .colstack_head .rowitem, .colhead {
background: #ce2424;
background: -webkit-gradient(linear, 0 0, 0 bottom, from(#f97779), to(#ce2424));

View File

@ -0,0 +1,4 @@
# Theme Notes
/public/post-avatar-bg.jpg is a solid rgb(71,71,71)

View File

@ -45,6 +45,7 @@ li {
.menu_overview {
margin-right: 13px;
margin-left: 10px;
font-size: 16px;
}
.menu_left:not(.menu_overview) {
@ -57,7 +58,7 @@ li {
}
.menu_alerts {
float: none;
float: right;
padding-top: 14px;
}
@ -94,6 +95,13 @@ a {
color: white;
}
.alert {
padding-bottom: 12px;
background-color: rgb(61,61,61);
padding: 12px;
display: block;
}
.rowblock {
margin-left: 8px;
margin-right: 8px;
@ -108,7 +116,7 @@ a {
font-size: 15px;
}
.rowblock:last-child {
.rowblock:last-child, .colstack_item:last-child {
padding-bottom: 10px;
}
@ -228,17 +236,11 @@ a {
margin-left: 3px;
}
.topic_reply_form {
.formrow.real_first_child, .formrow:first-child {
margin-top: 8px;
}
.formitem {
margin-top: 0px;
padding-bottom: 2px;
padding-top: 3px;
}
.formrow.real_first_child .formitem {
.formrow.real_first_child .formitem, .formrow:first-child .formitem {
padding-top: 12px;
}
@ -249,6 +251,19 @@ a {
textarea {
background-color: #444444;
border-color: #555555;
width: calc(100% - 15px);
min-height: 80px;
}
textarea:focus, input:focus, select:focus {
outline-color: rgb(95,95,95);
}
textarea.large {
min-height: 120px;
margin-top: 1px;
padding: 5px;
display: block;
}
.topic_reply_form textarea {
@ -264,3 +279,271 @@ textarea {
padding-bottom: 6px;
font-size: 13px;
}
.formrow {
flex-direction: row;
display: flex;
}
.formitem {
margin-top: 0px;
padding-bottom: 2px;
padding-top: 3px;
flex-grow: 2;
}
.formlabel {
flex-grow: 0;
width: 20%;
padding-top: 9px;
}
/* If the form label is on the right */
.formlabel:not(:first-child) {
font-size: 15px;
flex-grow: 2;
}
.formrow.real_first_child .formlabel, .formrow:first-child .formlabel {
padding-top: 17px;
}
/* Too big compared to the other items in the Control Panel and Account Panel */
/*.colstack_item .formrow.real_first_child, .colstack_item .formrow:first-child {
margin-top: 8px;
}*/
.colstack_item .formrow.real_first_child, .colstack_item .formrow:first-child {
margin-top: 3px;
}
.thin_margins .formrow.real_first_child, .thin_margins .formrow:first-child {
margin-top: 5px;
}
.formitem a {
font-size: 14px;
}
.rowmenu .rowitem, .rowlist .rowitem, .rowlist .formitem {
margin-top: 3px;
font-size: 13px;
padding: 10px;
}
.rowlist.bgavatars .rowitem {
background-repeat: no-repeat;
background-size: 40px;
padding-left: 46px;
}
.rowlist .formrow, .rowlist .formrow:first-child {
margin-top: 0px;
}
.formitem input {
background-color: #444444;
border: 1px solid #555555;
color: #999999;
padding-bottom: 6px;
font-size: 13px;
padding: 5px;
width: calc(100% - 16px);
}
.formitem select {
background-color: #444444;
border: 1px solid #555555;
color: #999999;
font-size: 13px;
padding: 4px;
}
.rowlist .formitem select {
padding: 2px;
font-size: 11px;
margin-top: -5px;
}
input, select, textarea {
caret-color: rgb(95,95,95);
}
.form_middle_button {
margin-left: auto;
margin-right: auto;
display: block;
margin-top: 5px;
}
/* Forum View */
.rowhead {
display: flex;
flex-direction: row;
}
.has_opt {
margin-right: 0px;
display: inline-block;
float: left;
padding-right: 0px;
}
.rowhead .rowitem:not(.has_opt) {
width: 100%;
}
.opt {
float: left;
margin-top: 8px;
height: 30.4px;
padding-left: 5px;
width: 100%;
background-color: rgb(61,61,61);
padding-top: 11px;
}
.opt a {
font-size: 11px;
}
.create_topic_opt a:before {
content: "New Topic";
}
.locked_opt a:before {
content: "Locked";
}
/* Profiles */
#profile_left_lane {
width: 220px;
margin-top: 5px;
}
#profile_left_lane .avatarRow {
overflow: hidden;
max-height: 220px;
}
#profile_left_lane .avatar {
width: 100%;
margin: 0;
display: block;
}
#profile_left_lane .username {
font-size: 14px;
display: block;
margin-top: 3px;
}
#profile_left_lane .profileName {
font-size: 18px;
}
#profile_right_lane {
width: calc(100% - 245px);
}
#profile_right_lane .rowitem {
margin-top: 5px;
}
#profile_right_lane .colstack_item .formrow.real_first_child, #profile_right_lane .colstack_item .formrow:first-child {
margin-top: 5px;
}
.simple .user_tag {
font-size: 14px;
}
@media(max-width: 935px) {
.simple .user_tag {
display: none;
}
#profile_left_lane {
width: 160px;
}
#profile_left_lane .avatarRow {
max-height: 160px;
}
#profile_left_lane .profileName {
font-size: 16px;
}
#profile_right_lane {
width: calc(100% - 185px);
}
}
@media(max-width: 830px) {
ul {
padding-left: 10px;
padding-right: 0px;
height: 35px;
}
li {
height: 26px;
}
.menu_overview {
margin-right: 9px;
margin-left: 0px;
font-size: 15px;
width: 32px;
text-align: center;
}
.menu_left {
margin-right: 7px;
}
.menu_left:not(.menu_overview) {
font-size: 13px;
padding-top: 10px;
}
.menu_alerts {
padding-top: 9px;
float: left;
margin-right: 6px;
}
.alert_counter {
border-radius: 8px;
font-size: 0px;
color: #c80000;
left: 2px;
}
.alert_aftercounter {
float: none;
margin-right: 0px;
font-size: 13px;
padding-top: 1.5px;
}
.has_alerts .alert_aftercounter {
position: relative;
top: -5px;
}
.menu_alerts:not(.has_alerts) .alert_counter {
display: none;
}
#back {
width: calc(100% - 20px);
}
.opthead, .rowhead, .colstack_head {
padding-top: 0px !important;
font-size 15px;
}
.rowblock:not(.opthead):not(.colstack_head):not(.rowhead) .rowitem {
font-size: 14px;
}
.rowsmall {
font-size: 11px;
}
}
@media(max-width: 470px) {
.menu_create_topic {
display: none;
}
}
@media(max-width: 370px) {
.menu_profile {
display: none;
}
}
@media(max-width: 324px) {
ul {
padding-left: 5px;
}
}

View File

@ -0,0 +1,24 @@
.rowlist .tag-mini {
font-size: 10px;
margin-left: 2px;
}
.panel_right_button {
float: right;
margin-left: 5px;
}
#panel_users .ban_button {
font-size: 10px;
float: none;
margin-left: 0px;
}
#panel_users .ban_button:before {
content: "|";
margin-right: 4px;
}
#forum_quick_perms .edit_fields {
float: right;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

View File

@ -149,6 +149,19 @@ li a {
font-size:12px;
}
.rowlist {
font-size: 14px;
}
.rowlist .rowitem {
padding-top: 10px;
padding-bottom: 10px;
}
.rowlist.bgavatars .rowitem {
background-repeat: no-repeat;
background-size: 40px;
padding-left: 48px;
}
.colblock_left {
border: 1px solid #ccc;
padding: 0px;

View File

@ -0,0 +1,4 @@
# Theme Notes
/public/post-avatar-bg.jpg is a solid rgb(255,255,255) white.

View File

@ -77,13 +77,17 @@ li a {
text-align: center;
border: white solid 1px;
}
.menu_alerts .alert_counter:empty { display: none; }
.menu_alerts .alert_counter:empty {
display: none;
}
.selectedAlert, .selectedAlert:hover {
background: white;
color: black;
}
.menu_alerts .alertList { display: none; }
.menu_alerts .alertList {
display: none;
}
.selectedAlert .alertList {
position: absolute;
@ -94,10 +98,7 @@ li a {
line-height: 16px;
width: 300px;
right: calc(5% + 7px);
border-top: 1px solid #ccc;
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
border-bottom: 1px solid #ccc;
border: 1px solid #ccc;
margin-bottom: 10px;
}
.alertItem {
@ -144,8 +145,18 @@ li a {
padding: 0px;
padding-top: 0px;
}
.rowblock:empty { display: none; }
.rowsmall { font-size:12px; }
.rowblock:empty {
display: none;
}
.rowsmall {
font-size: 12px;
}
.rowlist.bgavatars .rowitem {
background-repeat: no-repeat;
background-size: 50px;
padding-left: 58px;
}
.colblock_left {
border: 1px solid #ccc;

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

View File

@ -0,0 +1,4 @@
# Theme Notes
/public/post-avatar-bg.jpg is a solid rgb(255,255,255) white.

View File

@ -277,6 +277,9 @@ li a {
width: 50px;
text-align: center;
}
.create_topic_opt a:before {
content '🖊︎';
}
.create_topic_opt, .create_topic_opt a {
color: rgb(120,120,120);
text-decoration: none;
@ -284,11 +287,22 @@ li a {
.locked_opt {
color: rgb(80,80,80);
}
.locked_opt:before {
content: '🔒︎';
}
.datarow {
.rowlist {
font-size: 15px;
}
.datarow, .rowlist .rowitem {
padding-top: 10px;
padding-bottom: 10px;
}
.rowlist.bgavatars .rowitem {
background-repeat: no-repeat;
background-size: 40px;
padding-left: 46px;
}
.formrow {
width: 100%;

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

View File

@ -5,6 +5,6 @@ go get -u github.com/lib/pq
echo "Updating bcrypt"
go get -u golang.org/x/crypto/bcrypt
echo "Updating gopsutil"
go get -u github.com/shirou/gopsutil
go get -u github.com/Azareal/gopsutil
echo "Updating Gorilla WebSockets"
go get -u github.com/gorilla/websocket

View File

@ -34,7 +34,7 @@ if %errorlevel% neq 0 (
)
echo Updating gopsutil
go get -u github.com/shirou/gopsutil
go get -u github.com/Azareal/gopsutil
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%