Added Caire and pkg/errors as dependencies.

Made the initialisers and the task runner in main.go easier to debug.

Added form_button_row to a few forms.
Bumped up the attachment image size for Cosora.
Hid the formlabels for the setting editor for Cosora to make it cleaner.
Revamped the account manager with the same CSS as in the Control Panel for Nox.
Started adding the_form to more forms.
Removed the account_emails CSS class from the email editor.
Continued tweaking the Control Panel in Nox to make it look nicer.
Tweaked some of the headers in the Nox Theme.
Added the Create Topic and Moderate options to the topic list on the Nox Theme, although the bulk moderation tools aren't available yet.
Tweaked the padding and sticky shades on the topics on the topic list on the Nox Theme.
Closed topics are now somewhat styled on the topic list on the Nox Theme.
Continued work on the topic pages for Nox.

Renamed Admin Approval to Staff Approval in the English Language Pack.
Added more phrases for the Group Manager and Panel Menu in spots I overlooked.

Began work on the dyntmpl template function.
Be sure to run the patcher / update script to get the new setting.
This commit is contained in:
Azareal 2018-07-13 21:27:58 +10:00
parent 0f2503a20c
commit 2a5ab2969c
38 changed files with 437 additions and 89 deletions

View File

@ -128,12 +128,16 @@ go get -u gopkg.in/sourcemap.v1
go get -u github.com/robertkrimen/otto go get -u github.com/robertkrimen/otto
go get -u github.com/esimov/caire
go get -u github.com/lib/pq go get -u github.com/lib/pq
go get -u github.com/denisenkom/go-mssqldb go get -u github.com/denisenkom/go-mssqldb
go get -u github.com/fsnotify/fsnotify go get -u github.com/fsnotify/fsnotify
go get -u github.com/pkg/errors
rm -f template_*.go rm -f template_*.go
rm -f gen_*.go rm -f gen_*.go
@ -247,8 +251,12 @@ A few of these like Rez aren't currently in use, but are things we think we'll n
* github.com/bamiaux/rez An image resizer (e.g. for spitting out thumbnails) * github.com/bamiaux/rez An image resizer (e.g. for spitting out thumbnails)
* github.com/esimov/caire The other image resizer, slower but may be useful for covering cases Rez does not. A third faster one we might point to at some point is probably Discord's Lilliput, however it requires a C Compiler and we don't want to add that as a dependency at this time.
* github.com/fsnotify/fsnotify A library for watching events on the file system. * github.com/fsnotify/fsnotify A library for watching events on the file system.
* github.com/pkg/errors Some helpers to make it easier for us to track down bugs.
* More items to come here, our dependencies are going through a lot of changes, and I'll be documenting those soon ;) * More items to come here, our dependencies are going through a lot of changes, and I'll be documenting those soon ;)
# Bundled Plugins # Bundled Plugins

View File

@ -56,6 +56,7 @@ var GeneratePasswordFuncs = map[string]func(string) (string, string, error){
//"argon2": Argon2GeneratePassword, //"argon2": Argon2GeneratePassword,
} }
// TODO: Redirect 2b to bcrypt too?
var HashPrefixes = map[string]string{ var HashPrefixes = map[string]string{
"$2a$": "bcrypt", "$2a$": "bcrypt",
//"argon2$": "argon2", //"argon2$": "argon2",

View File

@ -67,17 +67,21 @@ func HandledRouteError() RouteError {
} }
// LogError logs internal handler errors which can't be handled with InternalError() as a wrapper for log.Fatal(), we might do more with it in the future. // LogError logs internal handler errors which can't be handled with InternalError() as a wrapper for log.Fatal(), we might do more with it in the future.
func LogError(err error) { // TODO: Clean-up extra as a way of passing additional context
LogWarning(err) func LogError(err error, extra ...string) {
LogWarning(err, extra...)
log.Fatal("") log.Fatal("")
} }
func LogWarning(err error) { func LogWarning(err error, extra ...string) {
var errmsg string var errmsg string
for _, extraBit := range extra {
errmsg += extraBit + "\n"
}
if err == nil { if err == nil {
errmsg = "Unknown error" errmsg += "Unknown error"
} else { } else {
errmsg = err.Error() errmsg += err.Error()
} }
stack := debug.Stack() stack := debug.Stack()
log.Print(errmsg+"\n", string(stack)) log.Print(errmsg+"\n", string(stack))

View File

@ -498,6 +498,15 @@ func InitTemplates() error {
return "" return ""
} }
fmap["dyntmpl"] = func(nameInt interface{}, pageInt interface{}, headerInt interface{}) interface{} {
header := headerInt.(*Header)
err := RunThemeTemplate(header.Theme.Name, nameInt.(string), pageInt, header.Writer)
if err != nil {
return err
}
return ""
}
// The interpreted templates... // The interpreted templates...
DebugLog("Loading the template files...") DebugLog("Loading the template files...")
Templates.Funcs(fmap) Templates.Funcs(fmap)

View File

@ -718,6 +718,9 @@ ArgLoop:
case "scope": case "scope":
literal = true literal = true
break ArgLoop break ArgLoop
case "dyntmpl":
literal = true
break ArgLoop
default: default:
c.detail("Variable!") c.detail("Variable!")
if len(node.Args) > (pos + 1) { if len(node.Args) > (pos + 1) {

View File

@ -28,6 +28,12 @@ go get -u github.com/robertkrimen/otto
echo "Updating the Rez Image Resizer" echo "Updating the Rez Image Resizer"
go get -u github.com/bamiaux/rez go get -u github.com/bamiaux/rez
echo "Updating Caire"
go get -u github.com/esimov/caire
echo "Updating some error helpers"
go get -u github.com/pkg/errors
echo "Updating fsnotify" echo "Updating fsnotify"
go get -u github.com/fsnotify/fsnotify go get -u github.com/fsnotify/fsnotify

View File

@ -85,6 +85,20 @@ if %errorlevel% neq 0 (
exit /b %errorlevel% exit /b %errorlevel%
) )
echo Updating Caire
go get -u github.com/esimov/caire
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%
)
echo Updating some error helpers
go get -u github.com/pkg/errors
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%
)
echo Updating fsnotify echo Updating fsnotify
go get -u github.com/fsnotify/fsnotify go get -u github.com/fsnotify/fsnotify
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (

View File

@ -1,7 +1,11 @@
# Templates # Templates
Gosora uses a subset of [Go Templates](https://golang.org/pkg/text/template/) which are run on both the server side and client side with custom transpiler to wring out the most performance. Some more obscure features may not be available, although I am adding them in here and there. Gosora uses a subset of [Go Templates](https://golang.org/pkg/text/template/) which are run on both the server side and client side with custom transpiler to wring out the most performance. Some more obscure features may not be available (e.g. local variables), but I am adding them in here and there.
The base templates are stored in `/templates/` and you can shadow them by placing modified duplicates in `/templates/overrides/`. The default themes all share the same set of templates present there. The base templates are stored in `/templates/` and you can shadow them by placing modified duplicates in `/templates/overrides/`. The default themes all share the same set of templates present there.
# Non-standard Extensions
We also have a few non-standard extensions only available on certain pages or areas, but these shouldn't be relied on in favour of more general mechanisms.
More to come soon. More to come soon.

View File

@ -85,6 +85,20 @@ if %errorlevel% neq 0 (
exit /b %errorlevel% exit /b %errorlevel%
) )
echo Updating Caire
go get -u github.com/esimov/caire
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%
)
echo Updating some error helpers
go get -u github.com/pkg/errors
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%
)
echo Updating fsnotify echo Updating fsnotify
go get -u github.com/fsnotify/fsnotify go get -u github.com/fsnotify/fsnotify
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (

View File

@ -1,4 +1,4 @@
// Code generated by. DO NOT EDIT. // Code generated by Gosora's Router Generator. DO NOT EDIT.
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */ /* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main package main

View File

@ -28,6 +28,12 @@ go get -u github.com/robertkrimen/otto
echo "Installing the Rez Image Resizer" echo "Installing the Rez Image Resizer"
go get -u github.com/bamiaux/rez go get -u github.com/bamiaux/rez
echo "Installing Caire"
go get -u github.com/esimov/caire
echo "Installing some error helpers"
go get -u github.com/pkg/errors
echo "Installing fsnotify" echo "Installing fsnotify"
go get -u github.com/fsnotify/fsnotify go get -u github.com/fsnotify/fsnotify

View File

@ -85,6 +85,20 @@ if %errorlevel% neq 0 (
exit /b %errorlevel% exit /b %errorlevel%
) )
echo Installing Caire
go get -u github.com/esimov/caire
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%
)
echo Installing some error helpers
go get -u github.com/pkg/errors
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%
)
echo Installing fsnotify echo Installing fsnotify
go get -u github.com/fsnotify/fsnotify go get -u github.com/fsnotify/fsnotify
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (

View File

@ -46,10 +46,11 @@
"SettingPhrases": { "SettingPhrases": {
"activation_type":"Activation Type", "activation_type":"Activation Type",
"activation_type_label": "Activate All,Email Activation,Admin Approval", "activation_type_label": "Activate All,Email Activation,Staff Approval",
"bigpost_min_words":"Big Post Minimum Words", "bigpost_min_words":"Big Post Minimum Words",
"megapost_min_words":"Mega Post Minimum Words", "megapost_min_words":"Mega Post Minimum Words",
"meta_desc":"Meta Description" "meta_desc":"Meta Description",
"rapid_loading":"Rapid Loaded?"
}, },
"PermPresets": { "PermPresets": {
@ -571,6 +572,8 @@
"panel_menu_settings":"Settings", "panel_menu_settings":"Settings",
"panel_menu_word_filters":"Word Filters", "panel_menu_word_filters":"Word Filters",
"panel_menu_themes":"Themes", "panel_menu_themes":"Themes",
"panel_menu_menus":"Menus",
"panel_menu_widgets":"Widgets",
"panel_menu_events":"Events", "panel_menu_events":"Events",
"panel_menu_statistics":"Statistics", "panel_menu_statistics":"Statistics",
"panel_menu_statistics_posts":"Posts", "panel_menu_statistics_posts":"Posts",
@ -658,6 +661,7 @@
"panel_group_tag":"Tag", "panel_group_tag":"Tag",
"panel_group_tag_placeholder":"VIP", "panel_group_tag_placeholder":"VIP",
"panel_group_update_button":"Update Group", "panel_group_update_button":"Update Group",
"panel_group_extended_permissions":"Extended Permissions",
"panel_word_filters_head":"Word Filters", "panel_word_filters_head":"Word Filters",
"panel_word_filters_edit_button_aria":"Edit Word Filter", "panel_word_filters_edit_button_aria":"Edit Word Filter",

75
main.go
View File

@ -24,6 +24,7 @@ import (
"./query_gen/lib" "./query_gen/lib"
"./routes" "./routes"
"github.com/fsnotify/fsnotify" "github.com/fsnotify/fsnotify"
"github.com/pkg/errors"
) )
var version = common.Version{Major: 0, Minor: 1, Patch: 0, Tag: "dev"} var version = common.Version{Major: 0, Minor: 1, Patch: 0, Tag: "dev"}
@ -37,55 +38,57 @@ type Globs struct {
stmts *Stmts stmts *Stmts
} }
// Experimenting with a new error package here to try to reduce the amount of debugging we have to do
// TODO: Dynamically register these items to avoid maintaining as much code here?
func afterDBInit() (err error) { func afterDBInit() (err error) {
acc := qgen.Builder.Accumulator() acc := qgen.Builder.Accumulator()
common.Rstore, err = common.NewSQLReplyStore(acc) common.Rstore, err = common.NewSQLReplyStore(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.Prstore, err = common.NewSQLProfileReplyStore(acc) common.Prstore, err = common.NewSQLProfileReplyStore(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
err = common.InitTemplates() err = common.InitTemplates()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
err = common.InitPhrases() err = common.InitPhrases()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
log.Print("Loading the static files.") log.Print("Loading the static files.")
err = common.Themes.LoadStaticFiles() err = common.Themes.LoadStaticFiles()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
err = common.StaticFiles.Init() err = common.StaticFiles.Init()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
err = common.StaticFiles.JSTmplInit() err = common.StaticFiles.JSTmplInit()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
log.Print("Initialising the widgets") log.Print("Initialising the widgets")
err = common.InitWidgets() err = common.InitWidgets()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
log.Print("Initialising the menu item list") log.Print("Initialising the menu item list")
common.Menus = common.NewDefaultMenuStore() common.Menus = common.NewDefaultMenuStore()
err = common.Menus.Load(1) // 1 = the default menu err = common.Menus.Load(1) // 1 = the default menu
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
menuHold, err := common.Menus.Get(1) menuHold, err := common.Menus.Get(1)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
fmt.Printf("menuHold: %+v\n", menuHold) fmt.Printf("menuHold: %+v\n", menuHold)
var b bytes.Buffer var b bytes.Buffer
@ -95,105 +98,105 @@ func afterDBInit() (err error) {
log.Print("Initialising the authentication system") log.Print("Initialising the authentication system")
common.Auth, err = common.NewDefaultAuth() common.Auth, err = common.NewDefaultAuth()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
log.Print("Loading the word filters") log.Print("Loading the word filters")
err = common.LoadWordFilters() err = common.LoadWordFilters()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
log.Print("Initialising the stores") log.Print("Initialising the stores")
common.MFAstore, err = common.NewSQLMFAStore(acc) common.MFAstore, err = common.NewSQLMFAStore(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.Pages, err = common.NewDefaultPageStore(acc) common.Pages, err = common.NewDefaultPageStore(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.Reports, err = common.NewDefaultReportStore(acc) common.Reports, err = common.NewDefaultReportStore(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.Emails, err = common.NewDefaultEmailStore(acc) common.Emails, err = common.NewDefaultEmailStore(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.RegLogs, err = common.NewRegLogStore(acc) common.RegLogs, err = common.NewRegLogStore(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.ModLogs, err = common.NewModLogStore(acc) common.ModLogs, err = common.NewModLogStore(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.AdminLogs, err = common.NewAdminLogStore(acc) common.AdminLogs, err = common.NewAdminLogStore(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.IPSearch, err = common.NewDefaultIPSearcher() common.IPSearch, err = common.NewDefaultIPSearcher()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.Subscriptions, err = common.NewDefaultSubscriptionStore() common.Subscriptions, err = common.NewDefaultSubscriptionStore()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.Attachments, err = common.NewDefaultAttachmentStore() common.Attachments, err = common.NewDefaultAttachmentStore()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.Polls, err = common.NewDefaultPollStore(common.NewMemoryPollCache(100)) // TODO: Max number of polls held in cache, make this a config item common.Polls, err = common.NewDefaultPollStore(common.NewMemoryPollCache(100)) // TODO: Max number of polls held in cache, make this a config item
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
common.TopicList, err = common.NewDefaultTopicList() common.TopicList, err = common.NewDefaultTopicList()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
log.Print("Initialising the view counters") log.Print("Initialising the view counters")
counters.GlobalViewCounter, err = counters.NewGlobalViewCounter(acc) counters.GlobalViewCounter, err = counters.NewGlobalViewCounter(acc)
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
counters.AgentViewCounter, err = counters.NewDefaultAgentViewCounter() counters.AgentViewCounter, err = counters.NewDefaultAgentViewCounter()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
counters.OSViewCounter, err = counters.NewDefaultOSViewCounter() counters.OSViewCounter, err = counters.NewDefaultOSViewCounter()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
counters.LangViewCounter, err = counters.NewDefaultLangViewCounter() counters.LangViewCounter, err = counters.NewDefaultLangViewCounter()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
counters.RouteViewCounter, err = counters.NewDefaultRouteViewCounter() counters.RouteViewCounter, err = counters.NewDefaultRouteViewCounter()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
counters.PostCounter, err = counters.NewPostCounter() counters.PostCounter, err = counters.NewPostCounter()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
counters.TopicCounter, err = counters.NewTopicCounter() counters.TopicCounter, err = counters.NewTopicCounter()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
counters.TopicViewCounter, err = counters.NewDefaultTopicViewCounter() counters.TopicViewCounter, err = counters.NewDefaultTopicViewCounter()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
counters.ForumViewCounter, err = counters.NewDefaultForumViewCounter() counters.ForumViewCounter, err = counters.NewDefaultForumViewCounter()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
counters.ReferrerTracker, err = counters.NewDefaultReferrerTracker() counters.ReferrerTracker, err = counters.NewDefaultReferrerTracker()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
return nil return nil
@ -267,7 +270,7 @@ func main() {
err = afterDBInit() err = afterDBInit()
if err != nil { if err != nil {
log.Fatal(err) log.Fatalf("%+v", err)
} }
err = common.VerifyConfig() err = common.VerifyConfig()
@ -361,7 +364,7 @@ func main() {
var runHook = func(name string) { var runHook = func(name string) {
err := common.RunTaskHook(name) err := common.RunTaskHook(name)
if err != nil { if err != nil {
common.LogError(err) common.LogError(err, "Failed at task '"+name+"'")
} }
} }
for { for {

View File

@ -14,6 +14,7 @@ func init() {
addPatch(3, patch3) addPatch(3, patch3)
addPatch(4, patch4) addPatch(4, patch4)
addPatch(5, patch5) addPatch(5, patch5)
addPatch(6, patch6)
} }
func patch0(scanner *bufio.Scanner) (err error) { func patch0(scanner *bufio.Scanner) (err error) {
@ -509,3 +510,12 @@ func patch5(scanner *bufio.Scanner) error {
return nil return nil
} }
func patch6(scanner *bufio.Scanner) error {
err := execStmt(qgen.Builder.SimpleInsert("settings", "name, content, type", "'rapid_loading','1','bool'"))
if err != nil {
return err
}
return nil
}

View File

@ -115,6 +115,7 @@ func seedTables(adapter qgen.Adapter) error {
qgen.Install.SimpleInsert("settings", "name, content, type", "'bigpost_min_words','250','int'") qgen.Install.SimpleInsert("settings", "name, content, type", "'bigpost_min_words','250','int'")
qgen.Install.SimpleInsert("settings", "name, content, type", "'megapost_min_words','1000','int'") qgen.Install.SimpleInsert("settings", "name, content, type", "'megapost_min_words','1000','int'")
qgen.Install.SimpleInsert("settings", "name, content, type", "'meta_desc','','html-attribute'") qgen.Install.SimpleInsert("settings", "name, content, type", "'meta_desc','','html-attribute'")
qgen.Install.SimpleInsert("settings", "name, content, type", "'rapid_loading','1','bool'")
qgen.Install.SimpleInsert("themes", "uname, default", "'cosora',1") qgen.Install.SimpleInsert("themes", "uname, default", "'cosora',1")
qgen.Install.SimpleInsert("emails", "email, uid, validated", "'admin@localhost',1,1") // ? - Use a different default email or let the admin input it during installation? qgen.Install.SimpleInsert("emails", "email, uid, validated", "'admin@localhost',1,1") // ? - Use a different default email or let the admin input it during installation?

View File

@ -216,7 +216,7 @@ func main() {
tmplVars.AllAgentMap[agent] = id tmplVars.AllAgentMap[agent] = id
} }
var fileData = `// Code generated by. DO NOT EDIT. var fileData = `// Code generated by Gosora's Router Generator. DO NOT EDIT.
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */ /* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main package main

View File

@ -3,6 +3,7 @@ INSERT INTO [settings] ([name],[content],[type],[constraints]) VALUES ('activati
INSERT INTO [settings] ([name],[content],[type]) VALUES ('bigpost_min_words','250','int'); INSERT INTO [settings] ([name],[content],[type]) VALUES ('bigpost_min_words','250','int');
INSERT INTO [settings] ([name],[content],[type]) VALUES ('megapost_min_words','1000','int'); INSERT INTO [settings] ([name],[content],[type]) VALUES ('megapost_min_words','1000','int');
INSERT INTO [settings] ([name],[content],[type]) VALUES ('meta_desc','','html-attribute'); INSERT INTO [settings] ([name],[content],[type]) VALUES ('meta_desc','','html-attribute');
INSERT INTO [settings] ([name],[content],[type]) VALUES ('rapid_loading','1','bool');
INSERT INTO [themes] ([uname],[default]) VALUES ('cosora',1); INSERT INTO [themes] ([uname],[default]) VALUES ('cosora',1);
INSERT INTO [emails] ([email],[uid],[validated]) VALUES ('admin@localhost',1,1); INSERT INTO [emails] ([email],[uid],[validated]) VALUES ('admin@localhost',1,1);
INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[is_admin],[tag]) VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,'Admin'); INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[is_admin],[tag]) VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,'Admin');

View File

@ -3,6 +3,7 @@ INSERT INTO `settings`(`name`,`content`,`type`,`constraints`) VALUES ('activatio
INSERT INTO `settings`(`name`,`content`,`type`) VALUES ('bigpost_min_words','250','int'); INSERT INTO `settings`(`name`,`content`,`type`) VALUES ('bigpost_min_words','250','int');
INSERT INTO `settings`(`name`,`content`,`type`) VALUES ('megapost_min_words','1000','int'); INSERT INTO `settings`(`name`,`content`,`type`) VALUES ('megapost_min_words','1000','int');
INSERT INTO `settings`(`name`,`content`,`type`) VALUES ('meta_desc','','html-attribute'); INSERT INTO `settings`(`name`,`content`,`type`) VALUES ('meta_desc','','html-attribute');
INSERT INTO `settings`(`name`,`content`,`type`) VALUES ('rapid_loading','1','bool');
INSERT INTO `themes`(`uname`,`default`) VALUES ('cosora',1); INSERT INTO `themes`(`uname`,`default`) VALUES ('cosora',1);
INSERT INTO `emails`(`email`,`uid`,`validated`) VALUES ('admin@localhost',1,1); INSERT INTO `emails`(`email`,`uid`,`validated`) VALUES ('admin@localhost',1,1);
INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`is_admin`,`tag`) VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,'Admin'); INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`is_admin`,`tag`) VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,'Admin');

View File

@ -3,6 +3,7 @@ INSERT INTO "settings"("name","content","type","constraints") VALUES ('activatio
INSERT INTO "settings"("name","content","type") VALUES ('bigpost_min_words','250','int'); INSERT INTO "settings"("name","content","type") VALUES ('bigpost_min_words','250','int');
INSERT INTO "settings"("name","content","type") VALUES ('megapost_min_words','1000','int'); INSERT INTO "settings"("name","content","type") VALUES ('megapost_min_words','1000','int');
INSERT INTO "settings"("name","content","type") VALUES ('meta_desc','','html-attribute'); INSERT INTO "settings"("name","content","type") VALUES ('meta_desc','','html-attribute');
INSERT INTO "settings"("name","content","type") VALUES ('rapid_loading','1','bool');
INSERT INTO "themes"("uname","default") VALUES ('cosora',1); INSERT INTO "themes"("uname","default") VALUES ('cosora',1);
INSERT INTO "emails"("email","uid","validated") VALUES ('admin@localhost',1,1); INSERT INTO "emails"("email","uid","validated") VALUES ('admin@localhost',1,1);
INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","is_admin","tag") VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,'Admin'); INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","is_admin","tag") VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,'Admin');

View File

@ -1,5 +1,5 @@
{ {
"DBVersion":"6", "DBVersion":"7",
"DynamicFileVersion":"0", "DynamicFileVersion":"0",
"MinGoVersion":"1.10", "MinGoVersion":"1.10",
"MinVersion":"" "MinVersion":""

View File

@ -1,5 +1,5 @@
{{template "header.html" . }} {{template "header.html" . }}
<div id="account_edit_emails" class="colstack account account_emails"> <div id="account_edit_emails" class="colstack account">
{{template "account_menu.html" . }} {{template "account_menu.html" . }}
<main class="colstack_right"> <main class="colstack_right">
<div class="colstack_item colstack_head rowhead"> <div class="colstack_item colstack_head rowhead">

View File

@ -0,0 +1,8 @@
{{template "header.html" . }}
<div id="account_{{.Name}}" class="colstack account">
{{template "account_menu.html" . }}
<main class="colstack_right">
{{dyntmpl .Name }}
</main>
</div>
{{template "footer.html" . }}

View File

@ -13,7 +13,7 @@
<div class="formitem formlabel"><a id="login_password_label">{{lang "login_account_password"}}</a></div> <div class="formitem formlabel"><a id="login_password_label">{{lang "login_account_password"}}</a></div>
<div class="formitem"><input name="password" type="password" autocomplete="current-password" placeholder="*****" aria-labelledby="login_password_label" required /></div> <div class="formitem"><input name="password" type="password" autocomplete="current-password" placeholder="*****" aria-labelledby="login_password_label" required /></div>
</div> </div>
<div class="formrow login_button_row"> <div class="formrow login_button_row form_button_row">
<div class="formitem"><button name="login-button" class="formbutton">{{lang "login_submit_button"}}</button></div> <div class="formitem"><button name="login-button" class="formbutton">{{lang "login_submit_button"}}</button></div>
<div class="formitem dont_have_account">{{lang "login_no_account"}}</div> <div class="formitem dont_have_account">{{lang "login_no_account"}}</div>
</div> </div>

View File

@ -12,7 +12,7 @@
<div class="formitem formlabel"><a id="login_mfa_verify_label">{{lang "login_mfa_token"}}</a></div> <div class="formitem formlabel"><a id="login_mfa_verify_label">{{lang "login_mfa_token"}}</a></div>
<div class="formitem"><input name="mfa_token" type="text" autocomplete="off" placeholder="*****" aria-labelledby="login_mfa_verify_label" required /></div> <div class="formitem"><input name="mfa_token" type="text" autocomplete="off" placeholder="*****" aria-labelledby="login_mfa_verify_label" required /></div>
</div> </div>
<div class="formrow login_button_row"> <div class="formrow login_button_row form_button_row">
<div class="formitem"><button name="login-button" class="formbutton">{{lang "login_mfa_verify_button"}}</button></div> <div class="formitem"><button name="login-button" class="formbutton">{{lang "login_mfa_verify_button"}}</button></div>
</div> </div>
</form> </form>

View File

@ -15,7 +15,7 @@
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><h1>{{.Name}}{{lang "panel_group_head_suffix"}}</h1></div> <div class="rowitem"><h1>{{.Name}}{{lang "panel_group_head_suffix"}}</h1></div>
</div> </div>
<div id="panel_group" class="colstack_item"> <div id="panel_group" class="colstack_item the_form">
<form action="/panel/groups/edit/submit/{{.ID}}?session={{.CurrentUser.Session}}" method="post"> <form action="/panel/groups/edit/submit/{{.ID}}?session={{.CurrentUser.Session}}" method="post">
<div class="formrow"> <div class="formrow">
<div class="formitem formlabel"><a>{{lang "panel_group_name"}}</a></div> <div class="formitem formlabel"><a>{{lang "panel_group_name"}}</a></div>
@ -38,7 +38,7 @@
<div class="formitem formlabel"><a>{{lang "panel_group_tag"}}</a></div> <div class="formitem formlabel"><a>{{lang "panel_group_tag"}}</a></div>
<div class="formitem"><input name="group-tag" type="text" value="{{.Tag}}" placeholder="{{lang "panel_group_tag_placeholder"}}" /></div> <div class="formitem"><input name="group-tag" type="text" value="{{.Tag}}" placeholder="{{lang "panel_group_tag_placeholder"}}" /></div>
</div> </div>
<div class="formrow"> <div class="formrow form_button_row">
<div class="formitem"><button name="panel-button" class="formbutton">{{lang "panel_group_update_button"}}</button></div> <div class="formitem"><button name="panel-button" class="formbutton">{{lang "panel_group_update_button"}}</button></div>
</div> </div>
</form> </form>

View File

@ -2,18 +2,18 @@
<div class="colstack panel_stack"> <div class="colstack panel_stack">
<nav class="colstack_left" aria-label="The control panel menu"> <nav class="colstack_left" aria-label="The control panel menu">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/groups/edit/{{.ID}}">Group Editor</a></div> <div class="rowitem"><a href="/panel/groups/edit/{{.ID}}">{{lang "panel_group_menu_head"}}</a></div>
</div> </div>
<div class="colstack_item rowmenu"> <div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="/panel/groups/edit/{{.ID}}">General</a></div> <div class="rowitem passive"><a href="/panel/groups/edit/{{.ID}}">{{lang "panel_group_menu_general"}}</a></div>
<div class="rowitem passive"><a>Promotions</a></div> <div class="rowitem passive"><a>{{lang "panel_group_menu_promotions"}}</a></div>
<div class="rowitem passive"><a href="/panel/groups/edit/perms/{{.ID}}">Permissions</a></div> <div class="rowitem passive"><a href="/panel/groups/edit/perms/{{.ID}}">{{lang "panel_group_menu_permissions"}}</a></div>
</div> </div>
{{template "panel_inner_menu.html" . }} {{template "panel_inner_menu.html" . }}
</nav> </nav>
<main class="colstack_right"> <main class="colstack_right">
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><h1>{{.Name}} Group</h1></div> <div class="rowitem"><h1>{{.Name}}{{lang "panel_group_head_suffix"}}</h1></div>
</div> </div>
<form action="/panel/groups/edit/perms/submit/{{.ID}}?session={{.CurrentUser.Session}}" method="post"> <form action="/panel/groups/edit/perms/submit/{{.ID}}?session={{.CurrentUser.Session}}" method="post">
{{if .CurrentUser.Perms.EditGroupLocalPerms}} {{if .CurrentUser.Perms.EditGroupLocalPerms}}
@ -24,21 +24,21 @@
<a>{{.LangStr}}</a> <a>{{.LangStr}}</a>
<div class="to_right"> <div class="to_right">
<select name="group-perm-{{.Name}}"> <select name="group-perm-{{.Name}}">
<option{{if .Toggle}} selected{{end}} value=1>Yes</option> <option{{if .Toggle}} selected{{end}} value=1>{{lang "option_yes"}}</option>
<option{{if not .Toggle}} selected{{end}} value=0>No</option> <option{{if not .Toggle}} selected{{end}} value=0>{{lang "option_no"}}</option>
</select> </select>
</div> </div>
</div> </div>
</div> </div>
{{end}} {{end}}
<div class="formrow"> <div class="formrow">
<div class="formitem"><button name="panel-button" class="formbutton form_middle_button">Update Group</button></div> <div class="formitem"><button name="panel-button" class="formbutton form_middle_button">{{lang "panel_group_update_button"}}</button></div>
</div> </div>
</div> </div>
{{end}} {{end}}
{{if .CurrentUser.Perms.EditGroupGlobalPerms}} {{if .CurrentUser.Perms.EditGroupGlobalPerms}}
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><h1>Extended Permissions</h1></div> <div class="rowitem"><h1>{{lang "panel_group_extended_permissions"}}</h1></div>
</div> </div>
<div class="colstack_item rowlist formlist panel_group_perms"> <div class="colstack_item rowlist formlist panel_group_perms">
{{range .GlobalPerms}} {{range .GlobalPerms}}
@ -47,15 +47,15 @@
<a>{{.LangStr}}</a> <a>{{.LangStr}}</a>
<div class="to_right"> <div class="to_right">
<select name="group-perm-{{.Name}}"> <select name="group-perm-{{.Name}}">
<option{{if .Toggle}} selected{{end}} value=1>Yes</option> <option{{if .Toggle}} selected{{end}} value=1>{{lang "option_yes"}}</option>
<option{{if not .Toggle}} selected{{end}} value=0>No</option> <option{{if not .Toggle}} selected{{end}} value=0>{{lang "option_no"}}</option>
</select> </select>
</div> </div>
</div> </div>
</div> </div>
{{end}} {{end}}
<div class="formrow"> <div class="formrow">
<div class="formitem"><button name="panel-button" class="formbutton form_middle_button">Update Group</button></div> <div class="formitem"><button name="panel-button" class="formbutton form_middle_button">{{lang "panel_group_update_button"}}</button></div>
</div> </div>
</div> </div>
{{end}} {{end}}

View File

@ -47,7 +47,7 @@
<div class="formitem formlabel"><a>{{lang "panel_groups_create_tag"}}</a></div> <div class="formitem formlabel"><a>{{lang "panel_groups_create_tag"}}</a></div>
<div class="formitem"><input name="group-tag" type="text" /></div> <div class="formitem"><input name="group-tag" type="text" /></div>
</div> </div>
<div class="formrow"> <div class="formrow form_button_row">
<div class="formitem"><button name="panel-button" class="formbutton">{{lang "panel_groups_create_create_group_button"}}</button></div> <div class="formitem"><button name="panel-button" class="formbutton">{{lang "panel_groups_create_create_group_button"}}</button></div>
</div> </div>
</form> </form>

View File

@ -25,8 +25,8 @@
<a href="/panel/themes/">{{lang "panel_menu_themes"}}</a> <a class="menu_stats" href="#">({{.Stats.Themes}})</a> <a href="/panel/themes/">{{lang "panel_menu_themes"}}</a> <a class="menu_stats" href="#">({{.Stats.Themes}})</a>
</div> </div>
{{if eq .Zone "themes"}} {{if eq .Zone "themes"}}
<div class="rowitem passive submenu"><a href="/panel/themes/menus/">Menus</a></div> <div class="rowitem passive submenu"><a href="/panel/themes/menus/">{{lang "panel_menu_menus"}}</a></div>
<div class="rowitem passive submenu"><a href="#">Widgets</a></div> <div class="rowitem passive submenu"><a href="#">{{lang "panel_menu_widgets"}}</a></div>
{{end}} {{end}}
{{end}} {{end}}
</div> </div>

View File

@ -6,7 +6,7 @@
<div class="colstack_item colstack_head"> <div class="colstack_item colstack_head">
<div class="rowitem"><h1>{{.Setting.FriendlyName}}</h1></div> <div class="rowitem"><h1>{{.Setting.FriendlyName}}</h1></div>
</div> </div>
<div id="panel_setting" class="colstack_item"> <div id="panel_setting" class="colstack_item the_form">
<form action="/panel/settings/edit/submit/{{.Setting.Name}}?session={{.CurrentUser.Session}}" method="post"> <form action="/panel/settings/edit/submit/{{.Setting.Name}}?session={{.CurrentUser.Session}}" method="post">
{{if eq .Setting.Type "list"}} {{if eq .Setting.Type "list"}}
<div class="formrow"> <div class="formrow">
@ -35,7 +35,7 @@
<div class="formitem formlabel"><a>{{lang "panel_setting_value"}}</a></div> <div class="formitem formlabel"><a>{{lang "panel_setting_value"}}</a></div>
<div class="formitem"><input name="setting-value" type="text" value="{{.Setting.Content}}" /></div> <div class="formitem"><input name="setting-value" type="text" value="{{.Setting.Content}}" /></div>
</div>{{end}} </div>{{end}}
<div class="formrow"> <div class="formrow form_button_row">
<div class="formitem"><button name="panel-button" class="formbutton">{{lang "panel_setting_update_button"}}</button></div> <div class="formitem"><button name="panel-button" class="formbutton">{{lang "panel_setting_update_button"}}</button></div>
</div> </div>
</form> </form>

View File

@ -28,7 +28,7 @@
<option value="0">{{lang "option_no"}}</option> <option value="0">{{lang "option_no"}}</option>
</select></div> </select></div>
</div> </div>
<div class="formrow register_button_row"> <div class="formrow register_button_row form_button_row">
<div class="formitem"><button name="register-button" class="formbutton">{{lang "register_submit_button"}}</button></div> <div class="formitem"><button name="register-button" class="formbutton">{{lang "register_submit_button"}}</button></div>
</div> </div>
<input id="golden-watch" name="golden-watch" value="$500" type="hidden" /> <input id="golden-watch" name="golden-watch" value="$500" type="hidden" />

View File

@ -948,7 +948,7 @@ textarea {
.postImage { .postImage {
width: 100%; width: 100%;
max-width: 150px; max-width: 240px;
} }
.post_item { .post_item {
display: flex; display: flex;

View File

@ -157,6 +157,9 @@
width: 100%; width: 100%;
height: 80px; height: 80px;
} }
#panel_setting .formlabel {
display: none;
}
#panel_page_list textarea, #panel_page_edit textarea { #panel_page_list textarea, #panel_page_edit textarea {
margin-top: 8px; margin-top: 8px;
} }

View File

@ -2,12 +2,105 @@
display: none; display: none;
} }
/* start panel css copy, try to de-dupe this */
#back {
padding: 0px;
}
.rowmenu {
margin-left: 12px;
}
.colstack_left {
width: 25%;
padding-top: 12px;
padding-right: 24px;
padding-bottom: 24px;
padding-left: 24px;
}
.colstack_left .colstack_head {
font-size: 19px;
margin-bottom: 4px;
}
.colstack_left .colstack_head:not(:first-child) {
margin-top: 8px;
}
.colstack_left .colstack_head a {
color: rgb(231, 231, 231);
}
.rowmenu {
margin-bottom: 2px;
font-size: 17px;
}
.rowmenu a {
color: rgb(170, 170, 170);
}
.colstack_right {
background-color: #444444;
width: 75%;
padding-top: 12px;
padding-right: 24px;
padding-bottom: 24px;
padding-left: 24px;
}
.colstack_right .colstack_head {
margin-bottom: 4px;
}
.colstack_right .colstack_head h1 {
font-size: 21px;
color: #BBBBBB;
}
.colstack_right .colstack_item.the_form {
background-color: #555555;
}
.colstack_right .colstack_item:not(.colstack_head):not(.rowhead) .rowitem {
background-color: #555555;
}
input, select, textarea {
background: rgb(107,107,107);
color: rgb(217,217,217);
}
input:focus, select:focus, textarea:focus {
outline: 1px solid rgb(137,137,137);
}
/* ? - The background properties need to be redeclared for the new image or it won't work properly */
input {
background-image: url(./fa-svg/pencil-alt-light.svg);
background-size: 12px;
background-repeat: no-repeat;
background-position: right 10px bottom 9px;
background-position-x: right 10px;
}
input::placeholder, textarea::placeholder {
color: rgb(167,167,167);
opacity: 1; /* Firefox fix */
}
button, .formbutton {
background: rgb(100,100,200);
}
#themeSelector select {
background: rgb(90,90,90);
color: rgb(200,200,200);
}
.footer .widget, #poweredByHolder {
background-color: #393939;
}
/* end panel css copy */
.account_soon, .dash_security {
font-size: 14px;
}
#account_dashboard .colstack_right .coldyn_block { #account_dashboard .colstack_right .coldyn_block {
display: flex; display: flex;
} }
#dash_left { #dash_left {
border-radius: 3px; border-radius: 3px;
background-color: #444444; background-color: #555555;
padding: 12px; padding: 12px;
height: 180px; height: 180px;
width: 240px; width: 240px;
@ -58,7 +151,7 @@
} }
#dash_right .rowitem { #dash_right .rowitem {
border-radius: 3px; border-radius: 3px;
background-color: #444444; background-color: #555555;
padding: 16px; padding: 16px;
} }
#dash_right .rowitem:not(:last-child) { #dash_right .rowitem:not(:last-child) {

View File

@ -15,7 +15,7 @@ body {
font-family: "Segoe UI"; font-family: "Segoe UI";
} }
a { a {
color: white; color: #eeeeee;
text-decoration: none; text-decoration: none;
} }
@ -157,7 +157,7 @@ h1, h2, h3, h4, h5 {
margin-bottom: 8px; margin-bottom: 8px;
} }
.rowhead h1, .opthead h1, .colstack_head h1 { .rowhead h1, .opthead h1, .colstack_head h1 {
font-size: 23px; font-size: 22px;
} }
.sidebar .rowhead { .sidebar .rowhead {
margin-left: 18px; margin-left: 18px;
@ -176,7 +176,7 @@ h2 {
} }
.topic_create_form { .topic_create_form {
display: flex !important; display: flex;
} }
.quick_reply_form, .topic_reply_form, .topic_create_form { .quick_reply_form, .topic_reply_form, .topic_create_form {
background-color: #444444; background-color: #444444;
@ -232,6 +232,32 @@ h2 {
display: none; display: none;
} }
.topic_list_title_block {
display: flex;
margin-left: 8px;
}
.topic_list_title {
margin-left: 2px;
}
.topic_list_title_block .optbox {
display: flex;
margin-left: auto;
font-size: 17px;
margin-top: 3.5px;
margin-right: 16px;
margin-right: 18px;
}
.topic_list_title_block .opt a {
color: #afafaf;
margin-left: 8px;
}
.topic_list_title_block .create_topic_opt a:before {
content: "Create Topic";
}
.topic_list_title_block .mod_opt a:before {
content: "Moderate";
}
.topic_row:not(:last-child) { .topic_row:not(:last-child) {
margin-bottom: 8px; margin-bottom: 8px;
} }
@ -242,8 +268,8 @@ h2 {
} }
.topic_left, .topic_right, .topic_middle { .topic_left, .topic_right, .topic_middle {
padding: 16px; padding: 16px;
padding-bottom: 12px; padding-bottom: 10px;
padding-top: 15px; padding-top: 16px;
display: flex; display: flex;
width: 33%; width: 33%;
} }
@ -254,7 +280,11 @@ h2 {
margin-right: auto; margin-right: auto;
} }
.topic_left.topic_sticky { .topic_left.topic_sticky {
border-left: 3px solid gold; border-left: 3px solid rgb(215, 155, 0);
border-radius: 3px;
}
.topic_left.topic_closed {
border-left: 3px solid grey;
border-radius: 3px; border-radius: 3px;
} }
.new_item .topic_left { .new_item .topic_left {
@ -265,8 +295,7 @@ h2 {
border-radius: 24px; border-radius: 24px;
height: 38px; height: 38px;
width: 38px; width: 38px;
margin-right: 8px; margin-right: 10px;
margin-top: 1px;
} }
.topic_inner_left { .topic_inner_left {
display: flex; display: flex;
@ -289,6 +318,7 @@ h2 {
.topic_right_inside .lastName, .topic_left .rowtopic { .topic_right_inside .lastName, .topic_left .rowtopic {
font-size: 15px !important; font-size: 15px !important;
line-height: 22px; line-height: 22px;
margin-top: -2px;
} }
.topic_right_inside .lastReplyAt, .topic_left .starter { .topic_right_inside .lastReplyAt, .topic_left .starter {
font-size: 14px; font-size: 14px;
@ -312,6 +342,7 @@ h2 {
.topic_middle_inside { .topic_middle_inside {
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
margin-top: -3px;
width: 80px; width: 80px;
} }
.topic_status_e { .topic_status_e {
@ -354,6 +385,18 @@ button, .formbutton {
text-align: center; text-align: center;
padding: 6px; padding: 6px;
} }
.formlabel {
margin-bottom: 4px;
}
/*.formlabel + .formitem {
margin-left: 4px;
}*/
.formrow {
margin-bottom: 6px;
}
.form_button_row {
margin-top: 10px;
}
.pageset { .pageset {
display: flex; display: flex;
@ -405,24 +448,29 @@ button, .formbutton {
display: flex; display: flex;
} }
.postImage {
width: 100%;
max-width: 320px;
}
.post_item { .post_item {
display: flex; display: flex;
margin-bottom: 12px; margin-bottom: 12px;
} }
.userinfo { .userinfo {
margin-right: 12px; margin-right: 12px;
padding: 16px; padding: 24px;
padding-bottom: 16px;
background-color: #444444; background-color: #444444;
border-radius: 3px; border-radius: 3px;
width: 120px; width: 150px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
.avatar_item { .avatar_item {
border-radius: 24px; border-radius: 36px;
height: 48px; height: 58px;
width: 48px; width: 58px;
background-size: 56px; background-size: 78px;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
@ -431,7 +479,7 @@ button, .formbutton {
margin-right: auto; margin-right: auto;
white-space: nowrap; white-space: nowrap;
display: block; display: block;
font-size: 17px; font-size: 18px;
margin-top: 8px; margin-top: 8px;
line-height: 16px; line-height: 16px;
} }
@ -449,6 +497,50 @@ button, .formbutton {
background-color: #444444; background-color: #444444;
border-radius: 3px; border-radius: 3px;
width: 100%; width: 100%;
display: flex;
flex-direction: column;
color: #bbbbbb;
}
.post_item .button_container {
display: flex;
margin-top: auto;
}
.post_item .action_button {
margin-right: 5px;
font-size: 15px;
color: #dddddd;
}
.post_item .action_button_right {
margin-left: auto;
display: flex;
}
.add_like:before, .remove_like:before {
content: "{{index .Phrases "topic.plus_one"}}";
}
.button_container .open_edit:after, .edit_item:after{
content: "{{index .Phrases "topic.edit_button_text"}}";
}
.delete_item:after {
content: "{{index .Phrases "topic.delete_button_text"}}";
}
.ip_item_button:after {
content: "{{index .Phrases "topic.ip_button_text"}}";
}
.lock_item:after {
content: "{{index .Phrases "topic.lock_button_text"}}";
}
.unlock_item:after {
content: "{{index .Phrases "topic.unlock_button_text"}}";
}
.pin_item:after {
content: "{{index .Phrases "topic.pin_button_text"}}";
}
.unpin_item:after {
content: "{{index .Phrases "topic.unpin_button_text"}}";
}
.report_item:after {
content: "{{index .Phrases "topic.report_button_text"}}";
} }
.topic_reply_container { .topic_reply_container {

View File

@ -10,6 +10,13 @@
.footer .widget, #poweredByHolder { .footer .widget, #poweredByHolder {
background-color: #393939; background-color: #393939;
} }
.rowmenu {
margin-left: 12px;
}
.submenu a:before {
content: "-";
margin-right: 8px;
}
.colstack_left { .colstack_left {
width: 25%; width: 25%;
@ -35,6 +42,9 @@
.rowmenu a { .rowmenu a {
color: rgb(170, 170, 170); color: rgb(170, 170, 170);
} }
.menu_stats {
margin-left: 4px;
}
.colstack_right { .colstack_right {
background-color: #444444; background-color: #444444;
@ -57,6 +67,9 @@
.colstack_right .colstack_item:not(.colstack_head):not(.rowhead) .rowitem { .colstack_right .colstack_item:not(.colstack_head):not(.rowhead) .rowitem {
background-color: #555555; background-color: #555555;
} }
.rowitem {
display: flex;
}
.colstack_grid { .colstack_grid {
display: grid; display: grid;
@ -70,6 +83,10 @@
padding: 12px; padding: 12px;
} }
.to_right {
margin-left: auto;
}
.rowlist.bgavatars .rowitem { .rowlist.bgavatars .rowitem {
background-image: none !important; background-image: none !important;
} }
@ -78,7 +95,7 @@
height: 48px; height: 48px;
} }
input, select, button, .formbutton, textarea { input, select, textarea {
background: rgb(107,107,107); background: rgb(107,107,107);
color: rgb(217,217,217); color: rgb(217,217,217);
} }
@ -101,6 +118,9 @@ button, .formbutton {
/*background: rgb(110,110,210); /*background: rgb(110,110,210);
color: rgb(250,250,250);*/ color: rgb(250,250,250);*/
} }
button, .formbutton {
background: rgb(100,100,200);
}
#themeSelector select { #themeSelector select {
background: rgb(90,90,90); background: rgb(90,90,90);
color: rgb(200,200,200); color: rgb(200,200,200);
@ -124,3 +144,11 @@ button, .formbutton {
.colstack_graph_holder .ct-grid { .colstack_graph_holder .ct-grid {
stroke: rgb(125,125,125); stroke: rgb(125,125,125);
} }
#panel_setting .formlabel {
display: none;
}
#panel_setting textarea {
width: 100%;
height: 80px;
}

View File

@ -28,5 +28,11 @@ go get -u github.com/robertkrimen/otto
echo "Updating the Rez Image Resizer" echo "Updating the Rez Image Resizer"
go get -u github.com/bamiaux/rez go get -u github.com/bamiaux/rez
echo "Updating Caire"
go get -u github.com/esimov/caire
echo "Updating some error helpers"
go get -u github.com/pkg/errors
echo "Updating fsnotify" echo "Updating fsnotify"
go get -u github.com/fsnotify/fsnotify go get -u github.com/fsnotify/fsnotify

View File

@ -82,6 +82,20 @@ if %errorlevel% neq 0 (
exit /b %errorlevel% exit /b %errorlevel%
) )
echo Updating Caire
go get -u github.com/esimov/caire
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%
)
echo Updating some error helpers
go get -u github.com/pkg/errors
if %errorlevel% neq 0 (
pause
exit /b %errorlevel%
)
echo Updating fsnotify echo Updating fsnotify
go get -u github.com/fsnotify/fsnotify go get -u github.com/fsnotify/fsnotify
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (