From c14a1e21006aeab2beb3642fb0c5a982dc590ba3 Mon Sep 17 00:00:00 2001 From: Azareal Date: Sat, 18 Mar 2017 07:23:02 +0000 Subject: [PATCH] Added the Group Editor. Revamped the dual column layout CSS. Improved the Control Panel Group List. Fixed the email verification system. Fixed some visual glitches in the Cosmo Conflux and Cosmo themes. Added the EditGroup, EditGroupLocalPerms, EditGroupGlobalPerms, EditGroupSuperMod and EditGroup Admin permissions. Added the group_exists function. Added the EditGroupPage struct. Swapped some log.Fatal calls out for InternalError calls to avoid whitescreens. --- data.sql | 9 +- group.go | 21 +++ images/group_editor_wip.png | Bin 0 -> 38414 bytes images/group_list_wip.png | Bin 0 -> 38541 bytes main.go | 4 +- mod_routes.go | 220 ++++++++++++++++++++++- mysql.go | 15 ++ pages.go | 13 ++ permissions.go | 10 ++ routes.go | 11 +- templates/account-menu.html | 22 ++- templates/account-own-edit-avatar.html | 38 ++-- templates/account-own-edit-email.html | 26 +-- templates/account-own-edit-username.html | 36 ++-- templates/account-own-edit.html | 44 ++--- templates/panel-dashboard.html | 12 +- templates/panel-forums.html | 100 ++++++----- templates/panel-group-edit.html | 46 +++++ templates/panel-groups.html | 24 ++- templates/panel-inner-menu.html | 12 ++ templates/panel-menu.html | 11 +- templates/panel-plugins.html | 30 ++-- templates/panel-setting.html | 62 +++---- templates/panel-settings.html | 20 ++- templates/panel-themes.html | 68 +++---- templates/panel-user-edit.html | 56 +++--- templates/panel-users.html | 30 ++-- themes/cosmo-conflux/public/main.css | 97 +++++----- themes/cosmo/public/main.css | 40 +++-- themes/tempra-conflux/public/main.css | 39 ++-- themes/tempra-cursive/public/main.css | 27 +++ themes/tempra-simple/public/main.css | 27 +++ 32 files changed, 823 insertions(+), 347 deletions(-) create mode 100644 images/group_editor_wip.png create mode 100644 images/group_list_wip.png create mode 100644 templates/panel-group-edit.html create mode 100644 templates/panel-inner-menu.html diff --git a/data.sql b/data.sql index 6bed1d25..c54754e9 100644 --- a/data.sql +++ b/data.sql @@ -189,6 +189,11 @@ EditUserPassword EditUserGroup EditUserGroupSuperMod EditUserGroupAdmin +EditGroup +EditGroupLocalPerms +EditGroupGlobalPerms +EditGroupSuperMod +EditGroupAdmin ManageForums EditSettings ManageThemes @@ -207,8 +212,8 @@ PinTopic CloseTopic */ -INSERT INTO users_groups(`name`,`permissions`,`is_mod`,`is_admin`,`tag`) VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewIPs":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true}',1,1,"Admin"); -INSERT INTO users_groups(`name`,`permissions`,`is_mod`,`tag`) VALUES ('Moderator','{"BanUsers":true,"ActivateUsers":false,"EditUser":true,"EditUserEmail":false,"EditUserPassword":false,"EditUserGroup":true,"EditUserGroupSuperMod":false,"EditUserGroupAdmin":false,"ManageForums":false,"EditSettings":false,"ManageThemes":false,"ManagePlugins":false,"ViewIPs":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true}',1,"Mod"); +INSERT INTO users_groups(`name`,`permissions`,`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,"ViewIPs":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true}',1,1,"Admin"); +INSERT INTO users_groups(`name`,`permissions`,`is_mod`,`tag`) VALUES ('Moderator','{"BanUsers":true,"ActivateUsers":false,"EditUser":true,"EditUserEmail":false,"EditUserGroup":true,"ViewIPs":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true}',1,"Mod"); INSERT INTO users_groups(`name`,`permissions`) VALUES ('Member','{"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"CreateReply":true}'); INSERT INTO users_groups(`name`,`permissions`,`is_banned`) VALUES ('Banned','{"ViewTopic":true}',1); INSERT INTO users_groups(`name`,`permissions`) VALUES ('Awaiting Activation','{"ViewTopic":true}'); diff --git a/group.go b/group.go index a0782461..9fdf0ca8 100644 --- a/group.go +++ b/group.go @@ -1,5 +1,19 @@ package main +import "sync" + +var group_update_mutex sync.Mutex + +type GroupAdmin struct +{ + ID int + Name string + Rank string + RankEmoji string + CanEdit bool + CanDelete bool +} + type Group struct { ID int @@ -13,3 +27,10 @@ type Group struct Forums []ForumPerms CanSee []int // The IDs of the forums this group can see } + +func group_exists(gid int) bool { + //fmt.Println(gid <= groupCapCount) + //fmt.Println(gid > 0) + //fmt.Println(groups[gid].Name!="") + return (gid <= groupCapCount) && (gid > 0) && groups[gid].Name!="" +} diff --git a/images/group_editor_wip.png b/images/group_editor_wip.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d4c781c3643d46b09ad1e9cfb78ee6e0984a93 GIT binary patch literal 38414 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 M#;3DRUj6-l0Tkf>a{vGU literal 0 HcmV?d00001 diff --git a/images/group_list_wip.png b/images/group_list_wip.png new file mode 100644 index 0000000000000000000000000000000000000000..18651a73dc3bb79cab839c472b9460bff720b03e GIT binary patch literal 38541 zcmdqJcT`hf*Di{JM3kZ^2+|cr>4Frg#zOB%?;uTj??eINC%yNg(t8gb1f+)E0t5(1 zCqQT+w2-^;{oZ@-IDee?8+Y7s$2ccrz~0#O?=bF#+%$08{O44Mv9^N7#ARv>K zd8bA|KtxGEaQ*R3V&F(?neY*?x#prK{f3}yh<+1zLu3h71QQTcM%}(JxdFT@dyC8r@4K+qx2UDw6z; zm9>`)az7REI7Hr`yxHW^*#SkPmCx41i#p!d2JaLp9^H{Hnfd-^nO#8TG`K#% zjoW!RmpaTLW@g^T4qjKhT#d*Y(^FsiedH&Zb$XsMDxDp3gxe}cW3j#$L+cyoaW7Lx z2dpe4%1;L@Z(RqPOF$5P5B#s4-U#Mve~+w4MgQFrI6s#8yR-Q45RE@lUX6mBCarqV zk)5*DEwHz_!?+f*FWdYL+gkh8qW3}|Cn5K5eSPyo<=MYB+*YR)cNhcT7yY(z(}oj=y1cF3e~d$rHPFlS4uR&A%w_m}SsjPDgo_QXEj@ zE{|OAvg*IphK77yb!tp*n`WD;JB%{-6xOD0GGhd8yCLW{iyFwfI4jrd3~+m2r@;Fk zuTMpV?;bKU+z~tdMR?F9iFY~8I`>24Td>X2nWs2p(u3B$8|52q7?(3XQ1viTK#%J&e8|3=#eEV+#$1A_4TTK-)&PJ8S4CCOeR-~BMv=)D0n zF4K2^_)_6=alxnMCw^*plNn6G^hl;YxWbm=Hf-7T1*B5B#9^HYw&z&E>E0tIM$dWM zcIzcP#jt_?1_@+hv$uM=@}iGTa`VP5lW5*^EquRC?p{Nb?{AJX2V6QidwF(R;c=LV1K@`Hur+o8h%AN+Wzxrt}e&!Ji=O*(KGD3=j z$8MxE*?VdAb zVl(;AWwfbSKe|CZ5Bylg@FimVBYw`!~0Byi?W|Jr64g2J*=C8aZk+$JCO!YCN&xM)Jo3=LwcxSo-r$SH z9atT8%D;*`wW%7Y7CkyUf9EVdA~@ge37t-SqMsm*jzpT_<}JB(o-8%(kxBOUHcgn`a-#p$iPa9jf@7#Z}15)}ZYC64wjThM6M!H1qSTBBn zE1MziNAxtd%noQCI(F{cHyU=A^{W@!IUI?4Zl?_3aCyt&Nf|idE`6m@_KF<|yRW5K zih7Hk#vw86QKvH+>(6`ZZpT481wQ_wTe-)>4sffIMqD;IrP6U3*|69n4{1pYy#`jT z4>yEopCyA7JtQ9rRP&1CPy9yr{HH6r+C3J?P8dFQ{!yG$KlruN?oucD{nB!O;H~p3 z8t#$_Js}mk9kH@*B-c&0N1J3b2_bQGvI3cogto=^^X;l^>qsawy;gQTLyS3+%6bWv zpXBprLS|OU1v`)=KR*fBc{DvCRT9*>Q= z_Z_8+;T(_MkIAtwVCauw$ZY5`UsYMB)Qw3-)&l4Cw+9M)z8iByB&s@E2{IP(q)L#L#`s3lFsv-c;A6}6v0xCufJ){x3Xd1vJE(k;KlL#;m1;Q_*4F6fIiPIkc2V7MSW$z!N^03nHu3pJ=E) zmC@$j#7UR^k4K8FvSoHi^N@Glv(A7Ap25p2FY;mDJ$=7Qp5gGTEuusbYi(m&2l-WN zo8-1u7zHU8c+Crg9M<701)gbZ`LDA<_-Mi$LYSAlFo@e6zeL2hd(D)MA|OY@l8==o zw)+`Iqqro5`8ayz>Flcc9@xFpWFWQBcHwow6o%wbF|vM5x-W+LJjX~{?dugdYP#gC zpHgA}eJb3i?;chf-NqvlFhW(lSj}S)O3sLeJo23J_0zZ=8n39?@0nk3+G*o$xI@$7 zl}*lG?#dXKU*4UDU(fPVV|0&T_&iGa#D@@~k?CDP<%cbp{EGSB^HI+z7UZ17gOaDQ zS0<7&kx%B(>iFDEZ|K+K=-03;;kBLO`O3iW;93K}Z(F5(Ni|OD5ei#@L-X0RNBxa()*V%?e83l3$dqIKiaO9Z_fjL#1P!?U<~CwBV_DDI@mqVBj7@1Eqb)WOEcm zC(TZ|PFJ!{n<;zWwi%)gofI43UtpM$=O?Xqok@_+^cHL|cu{Az)>qBY-QYeyP@P`V z7IOiem0V1P;zSPPeJ^}=mcTzRPG0-3_xKMyq%L89ivcn~J0{j-_%X7w@sST^^n_II zXqmq=U_y$6oHm^B*iF(lzdU`a}9> zn_W4N&}bdvWA5Av^Y7;StK??O8Lk?PEpXxbThxDM$(rq!TigTf^`PA@O!b@;5*r~x zNfG=W%I-%;g@N^;KdY7oLUXQ0)Jqj-7|bC@4d4LF*a{fhdEU3S1P)z&P%c^r!zt&i z$LCGmz$%p^!-XA1V5c@gG^G=(Z&@(sZPjjVVh1^@B#2LRah2OsFStv`5Zx!XsiV3* z7K6?P=X7&YQ^FoP((r-9)xc8$*y8bdS8J#Q`)K2{nkC&m}tGO7~bh%T3V1>%HRQ=gYCVW z>bwuL>_+uGX~4eF!)U4_hW1Fyo#rT&-$o*9F<9@r0Yr9P%}7U|#>umWt}~hl%W+&_ z7Z3${JnM{jBK+*S-B(jW^qli|16QpdAI~h+Rs6N%6r+a)!UF%<1~G*iaKQ)8+1w^i z48{AL#2Mk;PzLk^KaJq%@v-q*zi4CIAT5C#hqQE&1syi&ipuo&X_CZQ*$=uSnTwO@ zehrXy9y((RLD>-HD67516|fzwmWuX#5!#64Cg8Y)?xYy=a*i6}_vG z)8S7UzV`zoGj$PVSEbf1+C|ls4Br>in`eb*ugTXFlE3{qKz4DcwOR;T-u#Dpe3q)|nqU5} zIr-PTcKO?-p3I2Z)D{myhNV2IecOto78n%p=CV9vo}y{Zzqt^JZ9VF`QW63RdyN7z zR^rbn-Y319ryUGAq-3>)KU$*o+HT#$G8h&mLuR@TpBg#{&V(Q!<@?T6Xv;VyZ_%ng zv^B=*_ZBrtn*G&77=d9ePDZJSF~Yp7ew3~)&F=437_Kdpf~^2=8Bw7ex> zIGNW0fkRjzI-SnZKvntZm(5Fo2%kLx@)Nbeg%Y{~E_X)dIVK56+XlOI%?r}&3H7*R>@U_08iFoZ|wcYw0$l&EL{fH08~eNr>tz*a&Sv-G=l-jv^)W^V-2)^?~Ey zi2c)VZl5M={gQU0o6tVJ3xQt2fK_NgxlI?`gXj#6aE8-^s^Mhd#!r`PnU>G>?92u* zyxE+CO{;SGv&P-+HdF1BsYv-&vSjdPeTvUCoV z3bT$guUtj%2PMY%O}l{u&gfgh!~3%?^?_)~g>^;PRS))ZLNSg8-x9}(VM7NkLRXf! zxBfz=m)mL8?QmyP6J&x&XepPc!zPpi{);cIrLnI!ML+U}}6 zDRnqjp%LWtD@jSUl&(O3S!t+F_}NJN=h3B)^>O@yre`Y_@p){z_8);zCsx3`G)Cn$ zvfb*jLp-l-RAL!`WALL{*a$o+ZpUKC7b1p@7OcfNl*K&D=V<5M2RS*sC5%kY8DOEv zcqj}#cCo+_Hgm7RZpKnUkK2+L;xb$v54ilAcd{xcY?8uoP`-8G^@~&A4q$Z4kc-4r z1j_#!-GRe*A!ReDQ$bKrvF({pq;AR+5jg))bFRodtR+Kn`T*e=zHYYNTnMH@v1E+duGyZpYGcoU|TnrSW zEFb6%cGfP>o3zxF72{jy{crD|Rhr_$g8Me=eS2`-dFLQwgqxH@&vtve^Qkmm zgvN?+b8}WghL;^aBgtONFDK+j`Wr5eA}fy}=5Z^4wo9?rSP=U6_(g>}ooc*k1|Oz5 z@(6t4*A`NtrGq65tW8Equwy}xob;bNHS z#|Mjk9&}j#*2h!fZ)6mesMU$ILc#I?HqB41>w*NxSu&TDv~lnF<3gunWPnjaSw3 zbOX$O=CYa=e|EN?CJEY}`iT87|2U7QO-fA8Vkiw6MgJ*0@m@!W9`wFV4Aq?#JU4v1 zYhDlYw&LRQT9nNme-#DHV(Gm9VBt`CI_HbB(l)qVU{Kslr0s!^t{=UV>~6j9`(2+C z*=1qVrYpOxQ=^s-JfU@yV)~+2dBL)

WI*T9F#kdKH%H?7Oe2bwkYu{arI6jwwD@ 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

n1e%pGVqr`)85 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 literal 0 HcmV?d00001 diff --git a/main.go b/main.go index 8bfb6cae..7e518e1e 100644 --- a/main.go +++ b/main.go @@ -228,7 +228,7 @@ func main(){ router.HandleFunc("/user/edit/username/", route_account_own_edit_username) router.HandleFunc("/user/edit/username/submit/", route_account_own_edit_username_submit) router.HandleFunc("/user/edit/email/", route_account_own_edit_email) - router.HandleFunc("/user/edit/email/token/", route_account_own_edit_email_token_submit) + router.HandleFunc("/user/edit/token/", route_account_own_edit_email_token_submit) router.HandleFunc("/user/", route_profile) router.HandleFunc("/profile/reply/create/", route_profile_reply_create) router.HandleFunc("/profile/reply/edit/submit/", route_profile_reply_edit_submit) @@ -259,6 +259,8 @@ func main(){ router.HandleFunc("/panel/users/edit/", route_panel_users_edit) router.HandleFunc("/panel/users/edit/submit/", route_panel_users_edit_submit) router.HandleFunc("/panel/groups/", route_panel_groups) + router.HandleFunc("/panel/groups/edit/", route_panel_groups_edit) + router.HandleFunc("/panel/groups/edit/submit/", route_panel_groups_edit_submit) router.HandleFunc("/api/", route_api) //router.HandleFunc("/exit/", route_exit) diff --git a/mod_routes.go b/mod_routes.go index eb0c6104..c07036e7 100644 --- a/mod_routes.go +++ b/mod_routes.go @@ -1393,13 +1393,231 @@ func route_panel_groups(w http.ResponseWriter, r *http.Request){ var groupList []interface{} for _, group := range groups[1:] { - groupList = append(groupList, group) + var rank string + var rank_emoji string + var can_edit bool + var can_delete bool = false + + if group.Is_Admin { + rank = "Admin" + rank_emoji = "👑" + } else if group.Is_Mod { + rank = "Mod" + rank_emoji = "👮" + } else if group.Is_Banned { + rank = "Banned" + rank_emoji = "⛓️" + } else if group.ID == 6 { + rank = "Guest" + rank_emoji = "👽" + } else { + rank = "Member" + rank_emoji = "👪" + } + + if user.Perms.EditGroup && (!group.Is_Admin || user.Perms.EditGroupAdmin) && (!group.Is_Mod || user.Perms.EditGroupSuperMod) { + can_edit = true + } else { + can_edit = false + } + + groupList = append(groupList, GroupAdmin{group.ID,group.Name,rank,rank_emoji,can_edit,can_delete}) } + //fmt.Printf("%+v\n", groupList) pi := Page{"Group Manager",user,noticeList,groupList,nil} templates.ExecuteTemplate(w,"panel-groups.html",pi) } +func route_panel_groups_edit(w http.ResponseWriter, r *http.Request){ + user, noticeList, ok := SessionCheck(w,r) + if !ok { + return + } + if !user.Is_Super_Mod || !user.Perms.EditGroup { + NoPermissions(w,r,user) + return + } + + gid, err := strconv.Atoi(r.URL.Path[len("/panel/groups/edit/"):]) + if err != nil { + LocalError("The Group ID is not a valid integer.",w,r,user) + return + } + + if !group_exists(gid) { + //fmt.Println("aaaaa monsters") + NotFound(w,r) + return + } + + group := groups[gid] + if group.Is_Admin && !user.Perms.EditGroupAdmin { + LocalError("You need the EditGroupAdmin permission to edit an admin group.",w,r,user) + return + } + if group.Is_Mod && !user.Perms.EditGroupSuperMod { + LocalError("You need the EditGroupSuperMod permission to edit an super-mod group.",w,r,user) + return + } + + var rank string + if group.Is_Admin { + rank = "Admin" + } else if group.Is_Mod { + rank = "Mod" + } else if group.Is_Banned { + rank = "Banned" + } else if group.ID == 6 { + rank = "Guest" + } else { + rank = "Member" + } + + var disable_rank bool + if !user.Perms.EditGroupGlobalPerms || (group.ID == 6) { + disable_rank = true + } + + pi := EditGroupPage{"Group Editor",user,noticeList,group.ID,group.Name,group.Tag,rank,disable_rank,nil} + err = templates.ExecuteTemplate(w,"panel-group-edit.html",pi) + if err != nil { + InternalError(err,w,r) + } +} + +func route_panel_groups_edit_submit(w http.ResponseWriter, r *http.Request){ + user, ok := SimpleSessionCheck(w,r) + if !ok { + return + } + if !user.Is_Super_Mod || !user.Perms.EditGroup { + NoPermissions(w,r,user) + return + } + if r.FormValue("session") != user.Session { + SecurityError(w,r,user) + return + } + + gid, err := strconv.Atoi(r.URL.Path[len("/panel/groups/edit/submit/"):]) + if err != nil { + LocalError("The Group ID is not a valid integer.",w,r,user) + return + } + + if !group_exists(gid) { + //fmt.Println("aaaaa monsters") + NotFound(w,r) + return + } + + group := groups[gid] + if group.Is_Admin && !user.Perms.EditGroupAdmin { + LocalError("You need the EditGroupAdmin permission to edit an admin group.",w,r,user) + return + } + if group.Is_Mod && !user.Perms.EditGroupSuperMod { + LocalError("You need the EditGroupSuperMod permission to edit an super-mod group.",w,r,user) + return + } + + gname := r.FormValue("group-name") + if gname == "" { + LocalError("The group name can't be left blank.",w,r,user) + return + } + gtag := r.FormValue("group-tag") + rank := r.FormValue("group-type") + + var original_rank string + if group.Is_Admin { + original_rank = "Admin" + } else if group.Is_Mod { + original_rank = "Mod" + } else if group.Is_Banned { + original_rank = "Banned" + } else if group.ID == 6 { + original_rank = "Guest" + } else { + original_rank = "Member" + } + + group_update_mutex.Lock() + defer group_update_mutex.Unlock() + if rank != original_rank { + if !user.Perms.EditGroupGlobalPerms { + LocalError("You need the EditGroupGlobalPerms permission to change the group type.",w,r,user) + return + } + + switch(rank) { + case "Admin": + if !user.Perms.EditGroupAdmin { + LocalError("You need the EditGroupAdmin permission to designate this group as an admin group.",w,r,user) + return + } + + _, err = update_group_rank_stmt.Exec(1,1,0,gid) + if err != nil { + InternalError(err,w,r) + return + } + groups[gid].Is_Admin = true + groups[gid].Is_Mod = true + groups[gid].Is_Banned = false + case "Mod": + if !user.Perms.EditGroupSuperMod { + LocalError("You need the EditGroupSuperMod permission to designate this group as an admin group.",w,r,user) + return + } + + _, err = update_group_rank_stmt.Exec(0,1,0,gid) + if err != nil { + InternalError(err,w,r) + return + } + groups[gid].Is_Admin = false + groups[gid].Is_Mod = true + groups[gid].Is_Banned = false + case "Banned": + _, err = update_group_rank_stmt.Exec(0,0,1,gid) + if err != nil { + InternalError(err,w,r) + return + } + groups[gid].Is_Admin = false + groups[gid].Is_Mod = false + groups[gid].Is_Banned = true + case "Guest": + LocalError("You can't designate a group as a guest group.",w,r,user) + return + case "Member": + _, err = update_group_rank_stmt.Exec(0,0,0,gid) + if err != nil { + InternalError(err,w,r) + return + } + groups[gid].Is_Admin = false + groups[gid].Is_Mod = false + groups[gid].Is_Banned = false + default: + LocalError("Invalid group type.",w,r,user) + return + } + } + + _, err = update_group_stmt.Exec(gname,gtag,gid) + if err != nil { + InternalError(err,w,r) + return + } + groups[gid].Name = gname + groups[gid].Tag = gtag + + http.Redirect(w,r,"/panel/groups/edit/" + strconv.Itoa(gid),http.StatusSeeOther) +} + func route_panel_themes(w http.ResponseWriter, r *http.Request){ user, noticeList, ok := SessionCheck(w,r) if !ok { diff --git a/mysql.go b/mysql.go index c04f31ec..4cf87e34 100644 --- a/mysql.go +++ b/mysql.go @@ -83,6 +83,8 @@ var update_setting_stmt *sql.Stmt var add_plugin_stmt *sql.Stmt var update_plugin_stmt *sql.Stmt var update_user_stmt *sql.Stmt +var update_group_rank_stmt *sql.Stmt +var update_group_stmt *sql.Stmt var add_theme_stmt *sql.Stmt var update_theme_stmt *sql.Stmt @@ -552,6 +554,18 @@ func init_database(err error) { log.Fatal(err) } + log.Print("Preparing update_group_rank statement.") + update_group_rank_stmt, err = db.Prepare("update `users_groups` set `is_admin` = ?, `is_mod` = ?, `is_banned` = ? where `gid` = ?") + if err != nil { + log.Fatal(err) + } + + log.Print("Preparing update_group statement.") + update_group_stmt, err = db.Prepare("update `users_groups` set `name` = ?, `tag` = ? where `gid` = ?") + if err != nil { + log.Fatal(err) + } + log.Print("Loading the usergroups.") groups = append(groups, Group{ID:0,Name:"System"}) @@ -591,6 +605,7 @@ func init_database(err error) { if err != nil { log.Fatal(err) } + groupCapCount = i log.Print("Binding the Not Loggedin Group") GuestPerms = groups[6].Perms diff --git a/pages.go b/pages.go index c5b0227f..5b380658 100644 --- a/pages.go +++ b/pages.go @@ -86,6 +86,19 @@ type ThemesPage struct ExtData interface{} } +type EditGroupPage struct +{ + Title string + CurrentUser User + NoticeList []string + ID int + Name string + Tag string + Rank string + DisableRank bool + ExtData interface{} +} + type PageSimple struct { Title string diff --git a/permissions.go b/permissions.go index eb17e3ef..e5513e8b 100644 --- a/permissions.go +++ b/permissions.go @@ -26,6 +26,11 @@ type Perms struct EditUserGroup bool EditUserGroupSuperMod bool EditUserGroupAdmin bool + EditGroup bool + EditGroupLocalPerms bool + EditGroupGlobalPerms bool + EditGroupSuperMod bool + EditGroupAdmin bool ManageForums bool // This could be local, albeit limited for per-forum managers EditSettings bool ManageThemes bool @@ -94,6 +99,11 @@ func init() { EditUserGroup: true, EditUserGroupSuperMod: true, EditUserGroupAdmin: true, + EditGroup: true, + EditGroupLocalPerms: true, + EditGroupGlobalPerms: true, + EditGroupSuperMod: true, + EditGroupAdmin: true, ManageForums: true, EditSettings: true, ManageThemes: true, diff --git a/routes.go b/routes.go index 7bc9e5e7..490f23fc 100644 --- a/routes.go +++ b/routes.go @@ -1403,21 +1403,23 @@ func route_account_own_edit_email_token_submit(w http.ResponseWriter, r *http.Re LocalError("You need to login to edit your account.",w,r,user) return } - token := r.URL.Path[len("/user/edit/email/token/"):] + token := r.URL.Path[len("/user/edit/token/"):] email := Email{UserID: user.ID} targetEmail := Email{UserID: user.ID} var emailList []interface{} rows, err := db.Query("select email, validated, token from emails where uid = ?", user.ID) if err != nil { - log.Fatal(err) + InternalError(err,w,r) + return } defer rows.Close() for rows.Next() { err := rows.Scan(&email.Email, &email.Validated, &email.Token) if err != nil { - log.Fatal(err) + InternalError(err,w,r) + return } if email.Email == user.Email { @@ -1430,7 +1432,8 @@ func route_account_own_edit_email_token_submit(w http.ResponseWriter, r *http.Re } err = rows.Err() if err != nil { - log.Fatal(err) + InternalError(err,w,r) + return } if len(emailList) == 0 { diff --git a/templates/account-menu.html b/templates/account-menu.html index 0a8e88dc..0595ca9f 100644 --- a/templates/account-menu.html +++ b/templates/account-menu.html @@ -1,10 +1,14 @@ -

- - - - - - - - + \ No newline at end of file diff --git a/templates/account-own-edit-avatar.html b/templates/account-own-edit-avatar.html index be2a049c..b7c8539f 100644 --- a/templates/account-own-edit-avatar.html +++ b/templates/account-own-edit-avatar.html @@ -1,22 +1,24 @@ {{template "header.html" . }} {{template "account-menu.html" . }} - -{{ if .CurrentUser.Avatar }} -
-
-
-{{end}} -
-
- -
-
-
-
+
+ + {{if .CurrentUser.Avatar}} +
+
+
+ {{end}} +
+
+ +
+
+
+
+
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/account-own-edit-email.html b/templates/account-own-edit-email.html index 6d522d72..19050656 100644 --- a/templates/account-own-edit-email.html +++ b/templates/account-own-edit-email.html @@ -1,17 +1,19 @@ {{template "header.html" . }} {{template "account-menu.html" . }} -
- -
-
- {{range .ItemList}} -
- {{.Email}} - - {{if .Primary}}Primary{{else}}Secondary{{end}} - {{if .Validated}}Verified{{else}}Resend Verification Email{{end}} - +
+
+ +
+
+ {{range .ItemList}} +
+ {{.Email}} + + {{if .Primary}}Primary{{else}}Secondary{{end}} + {{if .Validated}}Verified{{else}}Resend Verification Email{{end}} + +
+ {{end}}
- {{end}}
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/account-own-edit-username.html b/templates/account-own-edit-username.html index 878190b6..a98d3b8b 100644 --- a/templates/account-own-edit-username.html +++ b/templates/account-own-edit-username.html @@ -1,21 +1,23 @@ {{template "header.html" . }} {{template "account-menu.html" . }} - -
-
-
- -
{{.CurrentUser.Name}}
-
-
- -
-
-
-
-
-
+
+ +
+
+
+ +
{{.CurrentUser.Name}}
+
+
+ +
+
+
+
+
+
+
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/account-own-edit.html b/templates/account-own-edit.html index 1d2894ce..7f84170b 100644 --- a/templates/account-own-edit.html +++ b/templates/account-own-edit.html @@ -1,25 +1,27 @@ {{template "header.html" . }} {{template "account-menu.html" . }} - -
-
- -
- -
-
- -
-
-
-
+
+ +
+
+ +
+ +
+
+ +
+
+
+
+
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-dashboard.html b/templates/panel-dashboard.html index b769447b..89c6bc22 100644 --- a/templates/panel-dashboard.html +++ b/templates/panel-dashboard.html @@ -1,9 +1,11 @@ {{template "header.html" . }} {{template "panel-menu.html" . }} - -
-
Coming Soon...
+
+
+ +
+
+
Coming Soon...
+
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-forums.html b/templates/panel-forums.html index 191cb770..e22e56e8 100644 --- a/templates/panel-forums.html +++ b/templates/panel-forums.html @@ -4,55 +4,59 @@ 'forum-active': ['Hide','Show'], 'forum-preset': ['all','announce','members','staff','admins','archive','custom']}; -
- -
-
- {{range .ItemList}} -
- {{.Name}} - - 🕵️ - {{if .PresetEmoji}}{{.PresetEmoji}} - {{else if .PresetLang}}{{.PresetLang}}{{else}}{{end}} - {{if gt .ID 0}}Edit - {{end}} - {{if gt .ID 1}}Delete{{end}} - +
+
+
- {{end}} -

- -
-
-
- -
+
+ {{range .ItemList}} +
+ {{.Name}} + + 🕵️ + + {{if .PresetEmoji}}{{.PresetEmoji}} + {{else if .PresetLang}}{{.PresetLang}}{{else}}{{end}} + + {{if gt .ID 0}}Edit + {{end}} + {{if gt .ID 1}}Delete{{end}} +
-
- -
-
-
- -
-
-
-
-
- + {{end}} +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-group-edit.html b/templates/panel-group-edit.html new file mode 100644 index 00000000..6d63b8a1 --- /dev/null +++ b/templates/panel-group-edit.html @@ -0,0 +1,46 @@ +{{template "header.html" . }} +
+ + +{{template "panel-inner-menu.html" . }} +
+
+ +
+
+
+ +
+
+ {{if .CurrentUser.Perms.EditUserGroup}} +
+ +
+ +
+
{{end}} +
+ +
+
+
+
+
+
+
+
+{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-groups.html b/templates/panel-groups.html index a75dae36..48304b48 100644 --- a/templates/panel-groups.html +++ b/templates/panel-groups.html @@ -1,13 +1,21 @@ {{template "header.html" . }} {{template "panel-menu.html" . }} -
- -
-
- {{range .ItemList}} -
- {{.Name}} +
+
+ +
+
+ {{range .ItemList}} +
+ {{.Name}} + + {{if .RankEmoji}}{{.RankEmoji}} + {{else}}{{.Rank}}{{end}} + + {{if .CanEdit}}Edit{{end}} + +
+ {{end}}
- {{end}}
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-inner-menu.html b/templates/panel-inner-menu.html new file mode 100644 index 00000000..50264dfc --- /dev/null +++ b/templates/panel-inner-menu.html @@ -0,0 +1,12 @@ + +
+ + + {{if .CurrentUser.Perms.ManageForums}}{{end}} + {{if .CurrentUser.Perms.EditSettings}}{{end}} + {{if .CurrentUser.Perms.ManageThemes}}{{end}} + {{if .CurrentUser.Perms.ManagePlugins}}{{end}} + +
\ No newline at end of file diff --git a/templates/panel-menu.html b/templates/panel-menu.html index 27e7a294..75b274e8 100644 --- a/templates/panel-menu.html +++ b/templates/panel-menu.html @@ -1,10 +1 @@ -
- - - - {{if .CurrentUser.Perms.ManageForums}}{{end}} - {{if .CurrentUser.Perms.EditSettings}}{{end}} - {{if .CurrentUser.Perms.ManageThemes}}{{end}} - {{if .CurrentUser.Perms.ManagePlugins}}{{end}} - -
\ No newline at end of file +
{{template "panel-inner-menu.html" . }}
\ No newline at end of file diff --git a/templates/panel-plugins.html b/templates/panel-plugins.html index c38e021a..7cfa3a72 100644 --- a/templates/panel-plugins.html +++ b/templates/panel-plugins.html @@ -1,19 +1,21 @@ {{template "header.html" . }} {{template "panel-menu.html" . }} -
- -
-
- {{range .ItemList}} -
- {{.Name}}
- Author: {{.Author}} - - {{if .Settings}}Settings{{end}} - {{if .Active}}Deactivate - {{else}}Activate{{end}} - +
+
+ +
+
+ {{range .ItemList}} +
+ {{.Name}}
+ Author: {{.Author}} + + {{if .Settings}}Settings{{end}} + {{if .Active}}Deactivate + {{else}}Activate{{end}} + +
+ {{end}}
- {{end}}
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-setting.html b/templates/panel-setting.html index 75f7404c..e0581cc3 100644 --- a/templates/panel-setting.html +++ b/templates/panel-setting.html @@ -1,35 +1,37 @@ {{template "header.html" . }} {{template "panel-menu.html" . }} - -
-
-
- -
{{.Something.Name}}
-
- {{if eq .Something.Type "list"}} -
- -
- +
+ +
+ +
+ +
{{.Something.Name}}
-
- {{else if eq .Something.Type "bool"}} - - {{else}}{{end}} -
-
-
- + {{if eq .Something.Type "list"}} +
+ +
+ +
+
+ {{else if eq .Something.Type "bool"}} + + {{else}}{{end}} +
+
+
+ +
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-settings.html b/templates/panel-settings.html index fa35f7c3..19d9373a 100644 --- a/templates/panel-settings.html +++ b/templates/panel-settings.html @@ -1,14 +1,16 @@ {{template "header.html" . }} {{template "panel-menu.html" . }} - -
- {{ range $key, $value := .Something }} -
- {{$key}} - {{$value}} +
+
+ +
+
+ {{range $key, $value := .Something}} + + {{end}}
- {{end}}
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-themes.html b/templates/panel-themes.html index 7e0c1a6a..1ec079a7 100644 --- a/templates/panel-themes.html +++ b/templates/panel-themes.html @@ -1,40 +1,42 @@ {{template "header.html" . }} {{template "panel-menu.html" . }} - -
- {{range .PrimaryThemes}} -
- - {{.FriendlyName}}
- Author: {{.Creator}} -
- - {{if .MobileFriendly}}📱{{end}} - {{if .Tag}}{{.Tag}}{{end}} - {{if .Active}}Default{{else}}Make Default{{end}} - +
+ - {{end}} -
- -
- {{range .VariantThemes}} -
- - {{.FriendlyName}}
- Author: {{.Creator}} -
- - {{if .MobileFriendly}}📱{{end}} - {{if .Tag}}{{.Tag}}{{end}} - {{if .Active}}Default{{else}}Make Default{{end}} - +
+ {{range .PrimaryThemes}} +
+ + {{.FriendlyName}}
+ Author: {{.Creator}} +
+ + {{if .MobileFriendly}}📱{{end}} + {{if .Tag}}{{.Tag}}{{end}} + {{if .Active}}Default{{else}}Make Default{{end}} + +
+ {{end}} +
+ +
+ {{range .VariantThemes}} +
+ + {{.FriendlyName}}
+ Author: {{.Creator}} +
+ + {{if .MobileFriendly}}📱{{end}} + {{if .Tag}}{{.Tag}}{{end}} + {{if .Active}}Default{{else}}Make Default{{end}} + +
+ {{end}}
- {{end}}
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-user-edit.html b/templates/panel-user-edit.html index 938d6f0b..88c27b5c 100644 --- a/templates/panel-user-edit.html +++ b/templates/panel-user-edit.html @@ -1,34 +1,36 @@ {{template "header.html" . }} {{template "panel-menu.html" . }} - -
-
-
- -
+
+ - {{if .CurrentUser.Perms.EditUserPassword}}
- -
-
{{end}} - {{if .CurrentUser.Perms.EditUserEmail}}
- -
-
{{end}} - {{if .CurrentUser.Perms.EditUserGroup}} -
- -
- +
+ +
+ +
-
{{end}} -
-
+ {{if .CurrentUser.Perms.EditUserPassword}}
+ +
+
{{end}} + {{if .CurrentUser.Perms.EditUserEmail}}
+ +
+
{{end}} + {{if .CurrentUser.Perms.EditUserGroup}} +
+ +
+ +
+
{{end}} +
+
+
+
-
{{template "footer.html" . }} \ No newline at end of file diff --git a/templates/panel-users.html b/templates/panel-users.html index e9814bd6..8f43a405 100644 --- a/templates/panel-users.html +++ b/templates/panel-users.html @@ -1,19 +1,21 @@ {{template "header.html" . }} {{template "panel-menu.html" . }} -
- -
-
- {{range .ItemList}} -
- {{.Name}} - Profile - {{if .Tag}}{{.Tag}}{{end}} - - {{if .Is_Banned}}Unban{{else if not .Is_Super_Mod}}Ban{{end}} - {{if not .Active}}Activate{{end}} - +
+
+ +
+
+ {{range .ItemList}} +
+ {{.Name}} + Profile + {{if .Tag}}{{.Tag}}{{end}} + + {{if .Is_Banned}}Unban{{else if not .Is_Super_Mod}}Ban{{end}} + {{if not .Active}}Activate{{end}} + +
+ {{end}}
- {{end}}
{{template "footer.html" . }} \ No newline at end of file diff --git a/themes/cosmo-conflux/public/main.css b/themes/cosmo-conflux/public/main.css index 32ac803f..c5f26670 100644 --- a/themes/cosmo-conflux/public/main.css +++ b/themes/cosmo-conflux/public/main.css @@ -191,7 +191,7 @@ hr { color: silver; border: 1px solid silver; } -o-transition: color 1s; } -.rowblock, .colblock_left, .colblock_right { +.rowblock, .colblock_left, .colblock_right, .colstack_item { background: rgba(240,240,240,1); border-spacing: 0; border-collapse: collapse; @@ -208,13 +208,8 @@ hr { color: silver; border: 1px solid silver; } border-left: 1px solid black; border-right: 1px solid black; } -.rowitem:not(:last-child) -{ - border-bottom: 1px dotted #ccc; -} -.rowblock:first-of-type { - margin-top: 8px; -} +.rowitem:not(:last-child) { border-bottom: 1px dotted #ccc; } +.rowblock:first-of-type { margin-top: 8px; } .rowhead, .colhead { background: #ce2424; @@ -261,20 +256,39 @@ hr { color: silver; border: 1px solid silver; } overflow: hidden; word-wrap: break-word; } -.colblock_left:empty +.colblock_left:empty { display: none; } +.colblock_right:empty { display: none; } +.colblock_left:first-of-type { margin-top: 8px; } +.colblock_right:first-of-type { margin-top: 8px; } + +/* The new method of doing columns layouts, colblock is now deprecated */ +.colstack_left { - display: none; + float: left; + width: 30%; + margin-right: 8px; + margin-top: 12px; } -.colblock_right:empty +.colstack_right { - display: none; + float: left; + width: 65%; + width: calc(70% - 15px); + margin-top: 12px; } -.colblock_left:first-of-type { - margin-top: 8px; -} -.colblock_right:first-of-type { - margin-top: 8px; +.colstack_item +{ + padding: 0px; + padding-top: 0px; + width: 100%; + margin-bottom: 8px; + overflow: hidden; + word-wrap: break-word; } +.colstack_head { margin-bottom: 0px; } +.colstack_left:empty { display: none; } +.colstack_right:empty { display: none; } + .colitem { padding-left: 8px; @@ -294,10 +308,7 @@ hr { color: silver; border: 1px solid silver; } text-decoration: none; color: black; } -.colitem a:hover -{ - color: silver; -} +.colitem a:hover { color: silver; } .col_left { width: 30%; @@ -317,16 +328,11 @@ hr { color: silver; border: 1px solid silver; } /*Clearfix*/ .formrow:before, .formrow:after { - content: " "; - display: table; -} -.formrow:after { - clear: both; -} -.formrow:not(:last-child) -{ - border-bottom: 1px dotted #ccc; + content: " "; + display: table; } +.formrow:after { clear: both; } +.formrow:not(:last-child) { border-bottom: 1px dotted #ccc; } .formitem { @@ -337,18 +343,9 @@ hr { color: silver; border: 1px solid silver; } padding-bottom: 8px; font-weight: bold; } -.formitem:first-child -{ - font-weight: bold; -} -.formitem:not(:last-child) -{ - border-right: 1px dotted #ccc; -} -.formitem.invisible_border -{ - border: none; -} +.formitem:first-child { font-weight: bold; } +.formitem:not(:last-child) { border-right: 1px dotted #ccc; } +.formitem.invisible_border { border: none; } /* Mostly for textareas */ .formitem:only-child { width: 100%; } @@ -583,6 +580,22 @@ blockquote p height: 20px; } +.tag-mini +{ + text-transform: none; + margin-left: 0px; + padding-left: 3px; + padding-right: 3px; + padding-top: 1.5px; + padding-bottom: 0px; + color: #505050; /* 80,80,80 */ + background-color: #FFFFFF; + border-style: dotted; + border-color: #505050; /* 232,232,232. All three RGB colours being the same seems to create a shade of gray */ + border-width: 1px; + font-size: 10px; +} + .action_button { display: block; float: left; diff --git a/themes/cosmo/public/main.css b/themes/cosmo/public/main.css index 4e849991..57b715ed 100644 --- a/themes/cosmo/public/main.css +++ b/themes/cosmo/public/main.css @@ -180,7 +180,7 @@ hr { color: silver; border: 1px solid silver; } -o-transition: color 1s; } -.rowblock, .colblock_left, .colblock_right { +.rowblock, .colblock_left, .colblock_right, .colstack_item { background: rgba(240,240,240,1); border-spacing: 0; border-collapse: collapse; @@ -249,20 +249,40 @@ hr { color: silver; border: 1px solid silver; } overflow: hidden; word-wrap: break-word; } -.colblock_left:empty -{ - display: none; -} +.colblock_left:empty { display: none; } .colblock_right:empty +{ display: none; } +.colblock_left:first-of-type { margin-top: 8px; } +.colblock_right:first-of-type { margin-top: 8px; } + +/* The new method of doing columns layouts, colblock is now deprecated */ +.colstack_left { - display: none; + float: left; + width: 30%; + margin-right: 8px; + margin-top: 12px; } -.colblock_left:first-of-type { - margin-top: 8px; +.colstack_right +{ + float: left; + width: 65%; + width: calc(70% - 15px); + margin-top: 12px; } -.colblock_right:first-of-type { - margin-top: 8px; +.colstack_item +{ + padding: 0px; + padding-top: 0px; + width: 100%; + margin-bottom: 8px; + overflow: hidden; + word-wrap: break-word; } +.colstack_head { margin-bottom: 0px; } +.colstack_left:empty { display: none; } +.colstack_right:empty { display: none; } + .colitem { padding-left: 8px; diff --git a/themes/tempra-conflux/public/main.css b/themes/tempra-conflux/public/main.css index 84058ea4..80db6346 100644 --- a/themes/tempra-conflux/public/main.css +++ b/themes/tempra-conflux/public/main.css @@ -155,10 +155,7 @@ li a padding: 0px; padding-top: 0px; } -.rowblock:empty -{ - display: none; -} +.rowblock:empty { display: none; } .colblock_left { @@ -178,14 +175,35 @@ li a overflow: hidden; word-wrap: break-word; } -.colblock_left:empty +.colblock_left:empty { display: none; } +.colblock_right:empty { display: none; } + +/* The new method of doing columns layouts, colblock is now deprecated */ +.colstack_left { - display: none; + float: left; + width: 30%; + margin-right: 8px; } -.colblock_right:empty +.colstack_right { - display: none; + float: left; + width: 65%; + width: calc(70% - 15px); } +.colstack_item +{ + border: 1px solid #ccc; + padding: 0px; + padding-top: 0px; + width: 100%; + margin-bottom: 8px; + overflow: hidden; + word-wrap: break-word; +} +.colstack_head { margin-bottom: 0px; } +.colstack_left:empty { display: none; } +.colstack_right:empty { display: none; } .rowitem { @@ -244,10 +262,7 @@ li a text-decoration: none; color: black; } -.colitem a:hover -{ - color: silver; -} +.colitem a:hover { color: silver; } .formrow { diff --git a/themes/tempra-cursive/public/main.css b/themes/tempra-cursive/public/main.css index e2b64348..eae4c190 100644 --- a/themes/tempra-cursive/public/main.css +++ b/themes/tempra-cursive/public/main.css @@ -167,6 +167,33 @@ li a .colblock_left:empty { display: none; } .colblock_right:empty { display: none; } +/* The new method of doing columns layouts, colblock is now deprecated */ +.colstack_left +{ + float: left; + width: 30%; + margin-right: 8px; +} +.colstack_right +{ + float: left; + width: 65%; + width: calc(70% - 15px); +} +.colstack_item +{ + border: 1px solid #ccc; + padding: 0px; + padding-top: 0px; + width: 100%; + margin-bottom: 8px; + overflow: hidden; + word-wrap: break-word; +} +.colstack_head { margin-bottom: 0px; } +.colstack_left:empty { display: none; } +.colstack_right:empty { display: none; } + .rowhead { font-family: cursive; } .rowitem { diff --git a/themes/tempra-simple/public/main.css b/themes/tempra-simple/public/main.css index 9085d15e..b20191ee 100644 --- a/themes/tempra-simple/public/main.css +++ b/themes/tempra-simple/public/main.css @@ -167,6 +167,33 @@ li a .colblock_left:empty { display: none; } .colblock_right:empty { display: none; } +/* The new method of doing columns layouts, colblock is now deprecated */ +.colstack_left +{ + float: left; + width: 30%; + margin-right: 8px; +} +.colstack_right +{ + float: left; + width: 65%; + width: calc(70% - 15px); +} +.colstack_item +{ + border: 1px solid #ccc; + padding: 0px; + padding-top: 0px; + width: 100%; + margin-bottom: 8px; + overflow: hidden; + word-wrap: break-word; +} +.colstack_head { margin-bottom: 0px; } +.colstack_left:empty { display: none; } +.colstack_right:empty { display: none; } + .rowitem { width: 100%;