nodebb-theme-harmony 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/languages/en-GB/harmony.json +5 -0
- package/library.js +101 -26
- package/package.json +5 -2
- package/plugin.json +14 -2
- package/public/harmony.js +101 -0
- package/scss/account.scss +38 -0
- package/scss/chats.scss +72 -0
- package/scss/common.scss +65 -0
- package/scss/fonts.scss +17 -0
- package/scss/groups.scss +30 -0
- package/scss/harmony.scss +23 -3
- package/scss/header.scss +16 -0
- package/scss/mixins.scss +183 -0
- package/scss/modals.scss +4 -0
- package/scss/modules/bottom-sheet.scss +52 -0
- package/scss/modules/breadcrumbs.scss +16 -0
- package/scss/modules/composer.scss +21 -0
- package/scss/modules/cover.scss +115 -0
- package/scss/modules/tags.scss +6 -0
- package/scss/modules/topic-navigator.scss +61 -0
- package/scss/modules/topics-list.scss +20 -0
- package/scss/modules/user-menu.scss +5 -0
- package/scss/overrides.scss +65 -0
- package/scss/sidebar.scss +125 -0
- package/scss/skins.scss +13 -0
- package/scss/status.scss +25 -0
- package/scss/topic.scss +128 -0
- package/templates/account/best.tpl +0 -2
- package/templates/account/blocks.tpl +31 -26
- package/templates/account/bookmarks.tpl +0 -2
- package/templates/account/categories.tpl +1 -3
- package/templates/account/controversial.tpl +0 -2
- package/templates/account/downvoted.tpl +0 -2
- package/templates/account/followers.tpl +14 -10
- package/templates/account/following.tpl +14 -10
- package/templates/account/groups.tpl +13 -11
- package/templates/account/ignored.tpl +0 -2
- package/templates/account/posts.tpl +29 -10
- package/templates/account/profile.tpl +76 -159
- package/templates/account/topics.tpl +32 -21
- package/templates/account/uploads.tpl +38 -35
- package/templates/account/upvoted.tpl +0 -2
- package/templates/account/watched.tpl +0 -2
- package/templates/admin/plugins/harmony.tpl +17 -0
- package/templates/categories.tpl +5 -5
- package/templates/category.tpl +26 -26
- package/templates/chat.tpl +9 -9
- package/templates/chats.tpl +5 -7
- package/templates/footer.tpl +11 -7
- package/templates/groups/details.tpl +76 -62
- package/templates/groups/list.tpl +16 -11
- package/templates/header.tpl +34 -21
- package/templates/login.tpl +51 -45
- package/templates/partials/account/admin-menu.tpl +36 -0
- package/templates/partials/account/category-item.tpl +17 -17
- package/templates/partials/account/header.tpl +77 -35
- package/templates/partials/account/sidebar-left.tpl +82 -0
- package/templates/partials/breadcrumbs.tpl +4 -12
- package/templates/partials/categories/item.tpl +48 -44
- package/templates/partials/categories/lastpost.tpl +17 -19
- package/templates/partials/categories/link.tpl +5 -13
- package/templates/partials/category/sort.tpl +4 -7
- package/templates/partials/category/subcategory.tpl +4 -4
- package/templates/partials/category/tools.tpl +6 -9
- package/templates/partials/category/watch.tpl +7 -11
- package/templates/partials/category-filter-content.tpl +5 -6
- package/templates/partials/category-filter.tpl +0 -2
- package/templates/partials/category-selector-content.tpl +4 -5
- package/templates/partials/category-selector.tpl +0 -2
- package/templates/partials/chats/dropdown.tpl +24 -32
- package/templates/partials/chats/message-window.tpl +7 -7
- package/templates/partials/chats/message.tpl +34 -34
- package/templates/partials/chats/recent_room.tpl +16 -29
- package/templates/partials/chats/system-message.tpl +4 -4
- package/templates/partials/chats/user.tpl +1 -3
- package/templates/partials/groups/admin.tpl +82 -175
- package/templates/partials/groups/badge.tpl +1 -3
- package/templates/partials/groups/invited.tpl +31 -0
- package/templates/partials/groups/list.tpl +14 -21
- package/templates/partials/groups/memberlist.tpl +28 -24
- package/templates/partials/groups/pending.tpl +28 -0
- package/templates/partials/groups/sidebar-left.tpl +27 -0
- package/templates/partials/mobile-footer.tpl +70 -0
- package/templates/partials/notifications_list.tpl +19 -27
- package/templates/partials/paginator.tpl +22 -24
- package/templates/partials/post_bar.tpl +23 -18
- package/templates/partials/posts_list.tpl +0 -2
- package/templates/partials/posts_list_item.tpl +14 -29
- package/templates/partials/quick-search-results.tpl +36 -25
- package/templates/partials/search-results.tpl +4 -1
- package/templates/partials/sidebar/chats.tpl +53 -0
- package/templates/partials/sidebar/drafts.tpl +41 -0
- package/templates/partials/sidebar/logged-out-menu.tpl +38 -0
- package/templates/partials/sidebar/notifications.tpl +28 -0
- package/templates/partials/sidebar/search-mobile.tpl +29 -0
- package/templates/partials/sidebar/search.tpl +30 -0
- package/templates/partials/sidebar/user-menu.tpl +87 -0
- package/templates/partials/sidebar-left.tpl +40 -0
- package/templates/partials/sidebar-right.tpl +41 -0
- package/templates/partials/skin-switcher.tpl +35 -0
- package/templates/partials/tags_list.tpl +0 -2
- package/templates/partials/toast.tpl +6 -8
- package/templates/partials/topic/event.tpl +4 -20
- package/templates/partials/topic/navigator.tpl +20 -41
- package/templates/partials/topic/necro-post.tpl +5 -4
- package/templates/partials/topic/post-menu.tpl +23 -2
- package/templates/partials/topic/post-placeholder.tpl +15 -0
- package/templates/partials/topic/post.tpl +67 -64
- package/templates/partials/topic/quickreply.tpl +12 -14
- package/templates/partials/topic/reactions.tpl +0 -2
- package/templates/partials/topic/reply-button.tpl +16 -20
- package/templates/partials/topic/selection-tooltip.tpl +0 -2
- package/templates/partials/topic/sort.tpl +8 -6
- package/templates/partials/topic/stats.tpl +15 -14
- package/templates/partials/topic/tag.tpl +1 -3
- package/templates/partials/topic/tags.tpl +1 -5
- package/templates/partials/topic/tools.tpl +13 -0
- package/templates/partials/topic/watch.tpl +15 -13
- package/templates/partials/topic-filters.tpl +4 -5
- package/templates/partials/topic-list-bar.tpl +54 -0
- package/templates/partials/topic-terms.tpl +4 -5
- package/templates/partials/topics_list.tpl +109 -100
- package/templates/partials/users/item.tpl +7 -0
- package/templates/partials/users_list.tpl +11 -60
- package/templates/partials/users_list_menu.tpl +10 -18
- package/templates/popular.tpl +1 -18
- package/templates/recent.tpl +8 -24
- package/templates/register.tpl +74 -60
- package/templates/tag.tpl +3 -15
- package/templates/tags.tpl +3 -4
- package/templates/top.tpl +1 -18
- package/templates/topic.tpl +39 -43
- package/templates/unread.tpl +1 -22
- package/templates/users.tpl +17 -17
- package/templates/admin/plugins/persona.tpl +0 -29
- package/templates/partials/account/menu.tpl +0 -103
- package/templates/partials/header/user-menu.tpl +0 -87
- package/templates/partials/menu.tpl +0 -188
- package/templates/partials/thread_tools.tpl +0 -10
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
<!--
|
|
1
|
+
<li component="chat/message" class="chat-message mx-2 pe-2 fw-light clear<!-- IF ../deleted --> deleted<!-- END -->" data-index="{messages.index}" data-mid="{messages.messageId}" data-uid="{messages.fromuid}" data-self="{messages.self}" data-break="{messages.newSet}" data-timestamp="{messages.timestamp}">
|
|
2
|
+
<div class="message-header {{{ if !messages.newSet }}}hidden{{{ end }}} pb-2">
|
|
3
|
+
<a href="{config.relative_path}/user/{messages.fromUser.userslug}" class="text-decoration-none">{buildAvatar(messages.fromUser, "24px", false, "not-responsive rounded")}</a>
|
|
4
|
+
<span class="chat-user fw-bold"><a href="{config.relative_path}/user/{messages.fromUser.userslug}">{messages.fromUser.displayname}</a></span>
|
|
5
|
+
<!-- IF ../fromUser.banned -->
|
|
6
|
+
<span class="badge bg-danger">[[user:banned]]</span>
|
|
7
|
+
<!-- END -->
|
|
8
|
+
<!-- IF ../fromUser.deleted -->
|
|
9
|
+
<span class="badge bg-danger">[[user:deleted]]</span>
|
|
10
|
+
<!-- END -->
|
|
11
|
+
<small class="chat-timestamp text-muted ms-2 timeago" title="{messages.timestampISO}"></small>
|
|
12
|
+
<!-- IF messages.edited -->
|
|
13
|
+
<div class="text-muted float-end" title="[[global:edited]] {messages.editedISO}"><i class="fa fa-edit"></i></span></div>
|
|
14
|
+
<!-- ENDIF messages.edited -->
|
|
15
|
+
</div>
|
|
16
|
+
<div class="message-body-wrapper hover-parent">
|
|
17
|
+
<div component="chat/message/body" class="message-body ps-0 py-0 overflow-auto">
|
|
18
|
+
{messages.content}
|
|
19
|
+
</div>
|
|
2
20
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<!-- ENDIF
|
|
17
|
-
</div>
|
|
18
|
-
<div class="message-body-wrapper">
|
|
19
|
-
<div component="chat/message/body" class="message-body">
|
|
20
|
-
{messages.content}
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
<!-- IF !config.disableChatMessageEditing -->
|
|
24
|
-
<!-- IF messages.self -->
|
|
25
|
-
<div class="btn-group controls">
|
|
26
|
-
<button class="btn btn-sm btn-link" data-action="edit"><i class="fa fa-pencil"></i></button>
|
|
27
|
-
<button class="btn btn-sm btn-link" data-action="delete"><i class="fa fa-times"></i></button>
|
|
28
|
-
<button class="btn btn-sm btn-link" data-action="restore"><i class="fa fa-repeat"></i></button>
|
|
29
|
-
<!-- IF isAdminOrGlobalMod -->
|
|
30
|
-
<button class="btn btn-sm btn-link chat-ip" title="[[modules:chat.show-ip]]"><i class="fa fa-info-circle chat-ip-button"></i></button>
|
|
31
|
-
<!-- ENDIF isAdminOrGlobalMod -->
|
|
32
|
-
</div>
|
|
33
|
-
<!-- ENDIF messages.self -->
|
|
34
|
-
<!-- ENDIF !config.disableChatMessageEditing -->
|
|
35
|
-
</div>
|
|
21
|
+
<!-- IF !config.disableChatMessageEditing -->
|
|
22
|
+
<!-- IF messages.self -->
|
|
23
|
+
<div class="position-relative">
|
|
24
|
+
<div class="btn-group border shadow-sm controls position-absolute small hover-d-block" style="bottom:5px; right:30px; display:none;">
|
|
25
|
+
<button class="btn btn-sm btn-link" data-action="edit"><i class="fa fa-pencil"></i></button>
|
|
26
|
+
<button class="btn btn-sm btn-link" data-action="delete"><i class="fa fa-trash"></i></button>
|
|
27
|
+
<button class="btn btn-sm btn-link" data-action="restore"><i class="fa fa-repeat"></i></button>
|
|
28
|
+
<!-- IF isAdminOrGlobalMod -->
|
|
29
|
+
<button class="btn btn-sm btn-link chat-ip" title="[[modules:chat.show-ip]]"><i class="fa fa-info-circle chat-ip-button"></i></button>
|
|
30
|
+
<!-- ENDIF isAdminOrGlobalMod -->
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
<!-- ENDIF messages.self -->
|
|
34
|
+
<!-- ENDIF !config.disableChatMessageEditing -->
|
|
35
|
+
</div>
|
|
36
36
|
</li>
|
|
@@ -1,33 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
{{{
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
<li component="chat/recent/room" data-roomid="{rooms.roomId}" class="{{{ if rooms.unread }}}unread{{{ end }}} card card-body p-1 mb-1 border-0 pointer">
|
|
2
|
+
<div class="members">
|
|
3
|
+
{{{ each rooms.users}}}
|
|
4
|
+
{{{ if @first }}}
|
|
5
|
+
<div class="main-avatar">
|
|
6
|
+
<a href="{config.relative_path}/user/{rooms.users.userslug}" class="text-decoration-none">{buildAvatar(rooms.users, "24px", true)}</a>
|
|
7
|
+
<span component="chat/title">{{{ if rooms.roomName }}}{rooms.roomName}{{{ else }}}{rooms.usernames}{{{ end }}}</span>
|
|
8
8
|
</div>
|
|
9
|
-
|
|
10
|
-
{{{
|
|
11
|
-
|
|
12
|
-
{{{
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
{{{end}}}
|
|
19
|
-
</ul>
|
|
9
|
+
{{{ else }}}
|
|
10
|
+
<a href="{config.relative_path}/user/{rooms.users.userslug}" class="text-decoration-none">{buildAvatar(rooms.users, "24px", true)}</a>
|
|
11
|
+
{{{ end }}}
|
|
12
|
+
{{{ end }}}
|
|
13
|
+
{{{ if !./users.length}}}
|
|
14
|
+
<span class="avatar avatar-rounded text-bg-warning" component="avatar/icon" style="--avatar-size: 24px;">?</span>
|
|
15
|
+
{{{ if !rooms.lastUser.uid }}}
|
|
16
|
+
<span class="text-muted">[[modules:chat.no-users-in-room]]</span>
|
|
17
|
+
{{{ end }}}
|
|
20
18
|
{{{ end }}}
|
|
21
|
-
|
|
22
|
-
<div class="notification-chat-content flex-grow-1">
|
|
23
|
-
<!-- IF !rooms.lastUser.uid -->
|
|
24
|
-
<div class="p-3 text-center h-100">
|
|
25
|
-
<span>[[modules:chat.no-users-in-room]]</span>
|
|
26
|
-
</div>
|
|
27
|
-
<!-- ELSE -->
|
|
28
|
-
<strong class="room-name">
|
|
29
|
-
<span component="chat/title"><!-- IF rooms.roomName -->{rooms.roomName}<!-- ELSE -->{rooms.usernames}<!-- ENDIF rooms.roomName --></span>
|
|
30
|
-
</strong>
|
|
31
|
-
<!-- ENDIF !rooms.lastUser.uid -->
|
|
32
19
|
</div>
|
|
33
20
|
</li>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
<li component="chat/system-message" class="system-message text-muted small py-2 gap-3 d-flex align-items-center justify-content-center" data-index="{messages.index}" data-mid="{messages.messageId}" data-uid="{messages.fromuid}" data-self="{messages.self}" data-break="0" data-timestamp="{messages.timestamp}">
|
|
2
|
+
<hr class="d-inline-block my-1" style="width: 10%;"/>
|
|
3
|
+
[[modules:chat.system.{messages.content}, {messages.fromUser.username}]]
|
|
4
|
+
<hr class="d-inline-block my-1" style="width: 10%;"/>
|
|
5
5
|
</li>
|
|
@@ -1,3 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
<a href="{config.relative_path}/user/{rooms.users.userslug}">{buildAvatar(rooms.users, "28px", true)}</a>
|
|
1
|
+
<a href="{config.relative_path}/user/{rooms.users.userslug}" class="text-decoration-none">{buildAvatar(rooms.users, "32px", true)}</a>
|
|
@@ -1,197 +1,104 @@
|
|
|
1
|
-
|
|
1
|
+
<div class="options">
|
|
2
|
+
<form component="groups/settings" role="form">
|
|
3
|
+
<div class="mb-3">
|
|
4
|
+
<label class="form-label" for="name">[[groups:details.group_name]]</label>
|
|
5
|
+
<input <!-- IF group.system -->readonly<!-- ENDIF group.system --> class="form-control" name="name" id="name" type="text" value="{group.displayName}" />
|
|
6
|
+
</div>
|
|
7
|
+
<div class="mb-3">
|
|
8
|
+
<label class="form-label" for="name">[[groups:details.description]]</label>
|
|
9
|
+
<textarea class="form-control" name="description" id="description" type="text" maxlength="255">{group.description}</textarea>
|
|
10
|
+
</div>
|
|
2
11
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
<
|
|
7
|
-
<!-- IF
|
|
8
|
-
<
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
</ul>
|
|
16
|
-
</div>
|
|
17
|
-
<!-- ENDIF group.pending.length -->
|
|
12
|
+
|
|
13
|
+
<div class="form-check">
|
|
14
|
+
<label class="form-check-label">[[groups:details.private]]</label>
|
|
15
|
+
<input class="form-check-input" name="private" type="checkbox"<!-- IF group.private --> checked<!-- ENDIF group.private -->>
|
|
16
|
+
<!-- IF !allowPrivateGroups -->
|
|
17
|
+
<p class="form-text">
|
|
18
|
+
[[groups:details.private_system_help]]
|
|
19
|
+
</p>
|
|
20
|
+
<!-- ENDIF !allowPrivateGroups -->
|
|
21
|
+
<p class="form-text text-xs m-0">
|
|
22
|
+
[[groups:details.private_help]]
|
|
23
|
+
</p>
|
|
18
24
|
</div>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
{{{each group.pending}}}
|
|
26
|
-
<tr data-uid="{group.pending.uid}">
|
|
27
|
-
<td class="p-2">
|
|
28
|
-
<a href="{config.relative_path}/user/{group.pending.userslug}">{buildAvatar(group.pending, "24px", true)}</a>
|
|
29
|
-
</td>
|
|
30
|
-
<td class="member-name p-2">
|
|
31
|
-
<a href="{config.relative_path}/user/{group.pending.userslug}">{group.pending.username}</a>
|
|
32
|
-
</td>
|
|
33
|
-
<td class="p-2">
|
|
34
|
-
<div class="btn-group float-end">
|
|
35
|
-
<button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
|
|
36
|
-
[[global:more]] <span class="caret"></span>
|
|
37
|
-
</button>
|
|
38
|
-
<ul class="dropdown-menu" role="menu">
|
|
39
|
-
<li><a class="dropdown-item" href="#" data-ajaxify="false" data-action="accept">[[groups:pending.accept]]</a></li>
|
|
40
|
-
<li><a class="dropdown-item" href="#" data-ajaxify="false" data-action="reject">[[groups:pending.reject]]</a></li>
|
|
41
|
-
</ul>
|
|
42
|
-
</div>
|
|
43
|
-
</td>
|
|
44
|
-
</tr>
|
|
45
|
-
{{{end}}}
|
|
46
|
-
</table>
|
|
47
|
-
</div>
|
|
48
|
-
</div>
|
|
49
|
-
<div class="card mb-3">
|
|
50
|
-
<div class="card-header">
|
|
51
|
-
<span class="fs-5">
|
|
52
|
-
<i class="fa fa-gift"></i> [[groups:details.invited]]
|
|
53
|
-
</span>
|
|
54
|
-
</div>
|
|
55
|
-
<div class="card-body">
|
|
56
|
-
<div class="input-group mb-2">
|
|
57
|
-
<input class="form-control" type="text" component="groups/members/invite" placeholder="[[groups:invited.search]]"/>
|
|
58
|
-
<span class="input-group-text search-button"><i class="fa fa-search"></i></span>
|
|
25
|
+
<div class="form-check">
|
|
26
|
+
<label class="form-check-label">[[groups:details.hidden]]</label>
|
|
27
|
+
<input class="form-check-input" name="hidden" type="checkbox"<!-- IF group.hidden --> checked<!-- ENDIF group.hidden -->>
|
|
28
|
+
<p class="form-text text-xs m-0">
|
|
29
|
+
[[groups:details.hidden_help]]
|
|
30
|
+
</p>
|
|
59
31
|
</div>
|
|
60
32
|
|
|
61
|
-
<div class="
|
|
62
|
-
<
|
|
33
|
+
<div class="form-check">
|
|
34
|
+
<label class="form-check-label">[[groups:details.disableJoinRequests]]</label>
|
|
35
|
+
<input class="form-check-input" name="disableJoinRequests" type="checkbox"<!-- IF group.disableJoinRequests --> checked<!-- ENDIF group.disableJoinRequests -->>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="form-check">
|
|
38
|
+
<label class="form-check-label">[[groups:details.disableLeave]]</label>
|
|
39
|
+
<input class="form-check-input" name="disableLeave" type="checkbox"{{{if group.disableLeave}}} checked{{{end}}}>
|
|
63
40
|
</div>
|
|
64
41
|
|
|
65
|
-
<div class="
|
|
66
|
-
<
|
|
42
|
+
<div class="form-check">
|
|
43
|
+
<label class="form-check-label">[[groups:details.userTitleEnabled]]</label>
|
|
44
|
+
<input class="form-check-input" name="userTitleEnabled" type="checkbox"<!-- IF group.userTitleEnabled --> checked<!-- ENDIF group.userTitleEnabled -->>
|
|
67
45
|
</div>
|
|
68
46
|
|
|
69
|
-
<
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
</
|
|
78
|
-
<
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
[[global:more]] <span class="caret"></span>
|
|
85
|
-
</button>
|
|
86
|
-
<ul class="dropdown-menu" role="menu">
|
|
87
|
-
<li><a class="dropdown-item" href="#" data-ajaxify="false" data-action="rescindInvite">[[groups:invited.uninvite]]</a></li>
|
|
88
|
-
</ul>
|
|
89
|
-
</div>
|
|
90
|
-
</td>
|
|
91
|
-
</tr>
|
|
92
|
-
{{{end}}}
|
|
93
|
-
</table>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
47
|
+
<div class="row mb-3">
|
|
48
|
+
<div class="col-6">
|
|
49
|
+
<div class="user-title-option">
|
|
50
|
+
<label class="form-label" for="userTitle">[[groups:details.badge_text]]</label>
|
|
51
|
+
<input component="groups/userTitleOption" class="form-control" name="userTitle" id="userTitle" type="text" maxlength="40" value="{group.userTitleEscaped}"<!-- IF !group.userTitleEnabled --> disabled<!-- ENDIF !group.userTitleEnabled --> />
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
<div class="col-6 d-flex flex-column">
|
|
55
|
+
<label class="form-label">[[groups:details.badge_preview]]</label>
|
|
56
|
+
<span class="badge rounded-1 text-uppercase text-truncate rounded-1 {{{ if !group.userTitleEnabled }}} hide{{{ end }}}" style="max-width:150px; color: {group.textColor}; background-color: {group.labelColor}"><i class="fa{{{ if group.icon }}} {group.icon}{{{ if ./userTitle}}}me-1{{{ end }}}{{{ end }}}"></i><span class="badge-text">{{{ if group.userTitle }}}{group.userTitle}{{{ end }}}</span></span>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
96
62
|
|
|
97
|
-
<div class="card mb-3">
|
|
98
|
-
<div class="card-header pointer" data-bs-toggle="collapse" data-bs-target=".options">
|
|
99
|
-
<span class="fs-5">
|
|
100
|
-
<i class="fa fa-caret-down float-end"></i>
|
|
101
|
-
<i class="fa fa-cogs"></i> [[groups:details.owner_options]]
|
|
102
|
-
</span>
|
|
103
|
-
</div>
|
|
104
63
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
<label class="form-label" for="name">[[groups:details.group_name]]</label>
|
|
109
|
-
<input <!-- IF group.system -->readonly<!-- ENDIF group.system --> class="form-control" name="name" id="name" type="text" value="{group.displayName}" />
|
|
64
|
+
<div class="row mb-3 user-title-option">
|
|
65
|
+
<div class="col-4">
|
|
66
|
+
<button component="groups/userTitleOption" type="button" class="btn btn-outline-secondary btn-sm" data-action="icon-select"{{{ if !group.userTitleEnabled }}} disabled{{{ end }}}>[[groups:details.change_icon]]</button>
|
|
110
67
|
</div>
|
|
111
|
-
<div class="
|
|
112
|
-
<label class="form-label" for="
|
|
113
|
-
<
|
|
68
|
+
<div class="col-4">
|
|
69
|
+
<label class="form-label" for="labelColor" class="badge-color-label">[[groups:details.change_label_colour]]</label>
|
|
70
|
+
<input component="groups/userTitleOption" type="color" name="labelColor" value="{{{ if group.labelColor }}}{group.labelColor}{{{ end }}}" />
|
|
114
71
|
</div>
|
|
72
|
+
<div class="col-4">
|
|
73
|
+
<label class="form-label" for="color" class="badge-color-label">[[groups:details.change_text_colour]]</label>
|
|
74
|
+
<input component="groups/userTitleOption" type="color" name="textColor" value="{{{ if group.textColor }}}{group.textColor}{{{ end }}}" />
|
|
75
|
+
</div>
|
|
76
|
+
<input type="hidden" name="icon" value="{{{ if group.icon }}}{group.icon}{{{ end }}}" />
|
|
115
77
|
|
|
116
|
-
<
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
<div class="col-md-6">
|
|
121
|
-
<input id="memberPostCids" type="text" class="form-control" value="{group.memberPostCids}">
|
|
122
|
-
</div>
|
|
123
|
-
<div class="col-md-6 member-post-cids-selector">
|
|
124
|
-
<!-- IMPORT partials/category-selector.tpl -->
|
|
78
|
+
<div id="icons" class="hidden">
|
|
79
|
+
<div class="icon-container">
|
|
80
|
+
<div class="row nbb-fa-icons">
|
|
81
|
+
<!-- IMPORT partials/fontawesome.tpl -->
|
|
125
82
|
</div>
|
|
126
83
|
</div>
|
|
127
84
|
</div>
|
|
85
|
+
</div>
|
|
128
86
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
<div class="mb-3 user-title-option">
|
|
132
|
-
<label class="form-label" for="userTitle">[[groups:details.badge_text]]</label>
|
|
133
|
-
<input component="groups/userTitleOption" class="form-control" name="userTitle" id="userTitle" type="text" maxlength="40" value="{group.userTitleEscaped}"<!-- IF !group.userTitleEnabled --> disabled<!-- ENDIF !group.userTitleEnabled --> />
|
|
134
|
-
</div>
|
|
135
|
-
|
|
136
|
-
<div class="mb-3 user-title-option">
|
|
137
|
-
<label>[[groups:details.badge_preview]]</label><br />
|
|
138
|
-
<span class="badge rounded-1 text-uppercase text-truncate rounded-1 {{{ if !group.userTitleEnabled }}} hide{{{ end }}}" style="max-width:150px; color: {group.textColor}; background-color: {group.labelColor}"><i class="fa{{{ if group.icon }}} {group.icon}{{{ if ./userTitle}}}me-1{{{ end }}}{{{ end }}}"></i><span class="badge-text">{{{ if group.userTitle }}}{group.userTitle}{{{ end }}}</span></span>
|
|
87
|
+
<hr />
|
|
139
88
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
<input
|
|
89
|
+
<div class="mb-3">
|
|
90
|
+
<label class="form-label" for="memberPostCids">[[groups:details.member-post-cids]]</label>
|
|
91
|
+
<div class="row">
|
|
92
|
+
<div class="col-md-6">
|
|
93
|
+
<input id="memberPostCids" type="text" class="form-control" value="{group.memberPostCids}">
|
|
145
94
|
</div>
|
|
146
|
-
<div>
|
|
147
|
-
|
|
148
|
-
<input component="groups/userTitleOption" type="color" name="textColor" value="<!-- IF group.textColor -->{group.textColor}<!-- ENDIF group.textColor -->" />
|
|
95
|
+
<div class="col-md-6 member-post-cids-selector">
|
|
96
|
+
<!-- IMPORT partials/category-selector.tpl -->
|
|
149
97
|
</div>
|
|
150
|
-
<input type="hidden" name="icon" value="<!-- IF group.icon -->{group.icon}<!-- ENDIF group.icon -->" />
|
|
151
|
-
|
|
152
|
-
<div id="icons" class="hidden">
|
|
153
|
-
<div class="icon-container">
|
|
154
|
-
<div class="row nbb-fa-icons">
|
|
155
|
-
<!-- IMPORT partials/fontawesome.tpl -->
|
|
156
|
-
</div>
|
|
157
|
-
</div>
|
|
158
|
-
</div>
|
|
159
|
-
</div>
|
|
160
|
-
<hr />
|
|
161
|
-
<div class="form-check">
|
|
162
|
-
<label class="form-check-label">[[groups:details.userTitleEnabled]]</label>
|
|
163
|
-
<input class="form-check-input" name="userTitleEnabled" type="checkbox"<!-- IF group.userTitleEnabled --> checked<!-- ENDIF group.userTitleEnabled -->>
|
|
164
|
-
</div>
|
|
165
|
-
<div class="form-check">
|
|
166
|
-
<label class="form-check-label">[[groups:details.private]]</label>
|
|
167
|
-
<input class="form-check-input" name="private" type="checkbox"<!-- IF group.private --> checked<!-- ENDIF group.private -->>
|
|
168
|
-
<!-- IF !allowPrivateGroups -->
|
|
169
|
-
<p class="form-text">
|
|
170
|
-
[[groups:details.private_system_help]]
|
|
171
|
-
</p>
|
|
172
|
-
<!-- ENDIF !allowPrivateGroups -->
|
|
173
|
-
<p class="form-text">
|
|
174
|
-
[[groups:details.private_help]]
|
|
175
|
-
</p>
|
|
176
|
-
</div>
|
|
177
|
-
<div class="form-check">
|
|
178
|
-
<label class="form-check-label">[[groups:details.disableJoinRequests]]</label>
|
|
179
|
-
<input class="form-check-input" name="disableJoinRequests" type="checkbox"<!-- IF group.disableJoinRequests --> checked<!-- ENDIF group.disableJoinRequests -->>
|
|
180
|
-
</div>
|
|
181
|
-
<div class="form-check">
|
|
182
|
-
<label class="form-check-label">[[groups:details.disableLeave]]</label>
|
|
183
|
-
<input class="form-check-input" name="disableLeave" type="checkbox"{{{if group.disableLeave}}} checked{{{end}}}>
|
|
184
|
-
</div>
|
|
185
|
-
<div class="form-check">
|
|
186
|
-
<label class="form-check-label">[[groups:details.hidden]]</label>
|
|
187
|
-
<input class="form-check-input" name="hidden" type="checkbox"<!-- IF group.hidden --> checked<!-- ENDIF group.hidden -->>
|
|
188
|
-
<p class="form-text">
|
|
189
|
-
[[groups:details.hidden_help]]
|
|
190
|
-
</p>
|
|
191
98
|
</div>
|
|
99
|
+
</div>
|
|
192
100
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
</div>
|
|
101
|
+
<button class="btn btn-link text-danger float-end" type="button" data-action="delete">[[groups:details.delete_group]]</button>
|
|
102
|
+
<button class="btn btn-primary" type="button" data-action="update">[[global:save_changes]]</button>
|
|
103
|
+
</form>
|
|
104
|
+
</div>
|
|
@@ -1,3 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
<a href="{config.relative_path}/groups/{./slug}" class="badge rounded-1 text-uppercase text-truncate" style="max-width: 150px;color:{./textColor};background-color: {./labelColor};"><i class="fa {{{ if ./icon }}}{./icon}{{{ if ./userTitle}}} me-1{{{ end }}}{{{else}}}hidden{{{ end }}}"></i><span class="badge-text">{{{ if ./userTitle }}}{./userTitle}{{{ end }}}</span></a>
|
|
1
|
+
<a href="{config.relative_path}/groups/{./slug}" class="badge rounded-1 text-uppercase text-truncate text-decoration-none" style="max-width: 150px;color:{./textColor};background-color: {./labelColor};"><i class="fa {{{ if ./icon }}}{./icon}{{{ if ./userTitle}}} me-1{{{ end }}}{{{else}}}hidden{{{ end }}}"></i><span class="badge-text">{{{ if ./userTitle }}}{./userTitle}{{{ end }}}</span></a>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<div class="input-group mb-2">
|
|
2
|
+
<input class="form-control" type="text" component="groups/members/invite" placeholder="[[groups:invited.search]]"/>
|
|
3
|
+
<span class="input-group-text search-button"><i class="fa fa-search"></i></span>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<div class="mb-2">
|
|
7
|
+
<textarea class="form-control" component="groups/members/bulk-invite" placeholder="[[groups:bulk-invite-instructions]]"></textarea>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<div class="mb-2 clearfix">
|
|
11
|
+
<button class="btn btn-outline-secondary btn-sm float-end" component="groups/members/bulk-invite-button">[[groups:bulk-invite]]</button>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<table component="groups/invited" class="table table-hover">
|
|
15
|
+
{{{ if !group.invited.length }}}
|
|
16
|
+
<div class="alert alert-info">[[groups:invited.none]]</div>
|
|
17
|
+
{{{ end }}}
|
|
18
|
+
{{{each group.invited}}}
|
|
19
|
+
<tr data-uid="{group.invited.uid}">
|
|
20
|
+
<td class="p-2">
|
|
21
|
+
<a class="text-decoration-none" href="{config.relative_path}/user/{group.invited.userslug}">{buildAvatar(group.invited, "24px", true)}</a>
|
|
22
|
+
</td>
|
|
23
|
+
<td class="member-name p-2 w-100">
|
|
24
|
+
<a href="{config.relative_path}/user/{group.invited.userslug}">{group.invited.username}</a>
|
|
25
|
+
</td>
|
|
26
|
+
<td class="p-2">
|
|
27
|
+
<button class="btn btn-outline-secondary btn-sm text-nowrap" data-action="rescindInvite">[[groups:invited.uninvite]]</button>
|
|
28
|
+
</td>
|
|
29
|
+
</tr>
|
|
30
|
+
{{{end}}}
|
|
31
|
+
</table>
|
|
@@ -1,23 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<
|
|
6
|
-
<
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
<li>
|
|
13
|
-
<a href="{config.relative_path}/user/{groups.members.userslug}">{buildAvatar(groups.members, "24px", true)}</a>
|
|
14
|
-
</li>
|
|
15
|
-
{{{end}}}
|
|
16
|
-
<!-- IF groups.truncated -->
|
|
17
|
-
<li class="truncated"><i class="fa fa-ellipsis-h"></i></li>
|
|
18
|
-
<!-- ENDIF groups.truncated -->
|
|
19
|
-
</ul>
|
|
1
|
+
{{{ each groups }}}
|
|
2
|
+
<div class="col-xxl-4 col-lg-6 col-sm-12 mb-3" component="groups/summary" data-slug="{./slug}">
|
|
3
|
+
<div class="card h-100 group-hover-bg border-0">
|
|
4
|
+
<a href="{config.relative_path}/groups/{./slug}" class="card-header border-bottom-0 pointer d-block list-cover" style="{{{ if ./cover:thumb:url }}}background-image: url({./cover:thumb:url});background-size: cover; min-height: 125px; background-position: {./cover:position}{{{ end }}}"></a>
|
|
5
|
+
<a href="{config.relative_path}/groups/{./slug}" class="d-block h-100 text-reset text-decoration-none">
|
|
6
|
+
<div class="card-body d-flex flex-column gap-1 border border-top-0 rounded-bottom h-100">
|
|
7
|
+
<div class="d-flex">
|
|
8
|
+
<div class="flex-1 fs-6 fw-semibold">{./displayName}</div>
|
|
9
|
+
<div class="text-sm"><i class="text-muted fa-solid fa-user"></i> {./memberCount}</div>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="text-sm">{./description}</div>
|
|
20
12
|
</div>
|
|
21
|
-
</
|
|
13
|
+
</a>
|
|
22
14
|
</div>
|
|
23
|
-
|
|
15
|
+
</div>
|
|
16
|
+
{{{ end }}}
|
|
@@ -1,41 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
<div class="d-flex mb-3">
|
|
4
|
-
<!-- IF group.isOwner -->
|
|
1
|
+
<div class="d-flex {{{ if group.isOwner }}}justify-content-between{{{ else }}}justify-content-end{{{ end }}} mb-3">
|
|
2
|
+
{{{ if group.isOwner }}}
|
|
5
3
|
<div class="flex-shrink-0">
|
|
6
|
-
<button component="groups/members/add" type="button" class="btn btn-primary me-3" title="[[groups:details.add-member]]"><i class="fa fa-user-plus"></i
|
|
4
|
+
<button component="groups/members/add" type="button" class="btn btn-primary btn-sm me-3" title="[[groups:details.add-member]]"><i class="fa fa-user-plus"></i> [[groups:details.add-member]]</button>
|
|
7
5
|
</div>
|
|
8
|
-
|
|
9
|
-
<div class="
|
|
6
|
+
{{{ end }}}
|
|
7
|
+
<div class="">
|
|
10
8
|
<div class="input-group">
|
|
11
|
-
<input class="form-control" type="text" component="groups/members/search" placeholder="[[global:search]]"/>
|
|
12
|
-
<
|
|
9
|
+
<input class="form-control form-control-sm" type="text" component="groups/members/search" placeholder="[[global:search]]"/>
|
|
10
|
+
<button class="btn btn-primary btn-sm search-button" type="button">
|
|
11
|
+
<i class="fa fa-search"></i>
|
|
12
|
+
</button>
|
|
13
13
|
</div>
|
|
14
14
|
</div>
|
|
15
15
|
</div>
|
|
16
16
|
|
|
17
|
-
<table component="groups/members" class="table table-
|
|
17
|
+
<table component="groups/members" class="table table-hover" data-nextstart="{group.membersNextStart}">
|
|
18
18
|
<tbody>
|
|
19
19
|
{{{each group.members}}}
|
|
20
|
-
<tr data-uid="{group.members.uid}">
|
|
20
|
+
<tr data-uid="{group.members.uid}" data-isowner="{{{ if group.members.isOwner }}}1{{{ else }}}0{{{ end }}}">
|
|
21
21
|
<td class="p-2">
|
|
22
|
-
<a href="{config.relative_path}/user/{group.members.userslug}">{buildAvatar(group.members, "24px", true)}</a>
|
|
22
|
+
<a class="text-decoration-none" href="{config.relative_path}/user/{group.members.userslug}">{buildAvatar(group.members, "24px", true)}</a>
|
|
23
23
|
</td>
|
|
24
|
-
<td class="member-name p-2">
|
|
25
|
-
<
|
|
26
|
-
|
|
24
|
+
<td class="member-name p-2 w-100 ">
|
|
25
|
+
<div class="d-flex align-items-center justify-content-between">
|
|
26
|
+
<div class="d-flex align-items-center gap-2">
|
|
27
|
+
<a class="align-text-top" href="{config.relative_path}/user/{group.members.userslug}">{group.members.username}</a>
|
|
28
|
+
<i component="groups/owner/icon" title="[[groups:owner]]" class="user-owner-icon fa fa-star align-text-top text-warning <!-- IF !group.members.isOwner -->invisible<!-- ENDIF !group.members.isOwner -->"></i>
|
|
29
|
+
</div>
|
|
27
30
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
{{{ if group.isOwner }}}
|
|
32
|
+
<div class="owner-controls btn-group">
|
|
33
|
+
<a class="btn btn-sm" href="#" data-ajaxify="false" data-action="toggleOwnership" title="[[groups:details.grant]]">
|
|
34
|
+
<i class="fa fa-star"></i>
|
|
35
|
+
</a>
|
|
33
36
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
<a class="btn btn-sm" href="#" data-ajaxify="false" data-action="kick" title="[[groups:details.kick]]">
|
|
38
|
+
<i class="fa fa-ban"></i>
|
|
39
|
+
</a>
|
|
40
|
+
</div>
|
|
41
|
+
{{{ end }}}
|
|
37
42
|
</div>
|
|
38
|
-
<!-- ENDIF group.isOwner -->
|
|
39
43
|
</td>
|
|
40
44
|
</tr>
|
|
41
45
|
{{{end}}}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{{{ if group.pending.length }}}
|
|
2
|
+
<div class="d-flex justify-content-end gap-2 mb-3">
|
|
3
|
+
<button class="btn btn-outline-secondary btn-sm" data-action="acceptAll">[[groups:pending.accept_all]]</button>
|
|
4
|
+
<button class="btn btn-outline-secondary btn-sm" data-action="rejectAll">[[groups:pending.reject_all]]</button>
|
|
5
|
+
</div>
|
|
6
|
+
{{{ end }}}
|
|
7
|
+
|
|
8
|
+
<table component="groups/pending" class="table table-hover">
|
|
9
|
+
{{{ if !group.pending.length }}}
|
|
10
|
+
<div class="alert alert-info">[[groups:pending.none]]</div>
|
|
11
|
+
{{{ end }}}
|
|
12
|
+
{{{each group.pending}}}
|
|
13
|
+
<tr data-uid="{group.pending.uid}">
|
|
14
|
+
<td class="p-2">
|
|
15
|
+
<a class="text-decoration-none" href="{config.relative_path}/user/{group.pending.userslug}">{buildAvatar(group.pending, "24px", true)}</a>
|
|
16
|
+
</td>
|
|
17
|
+
<td class="member-name p-2 w-100">
|
|
18
|
+
<a href="{config.relative_path}/user/{group.pending.userslug}">{group.pending.username}</a>
|
|
19
|
+
</td>
|
|
20
|
+
<td class="p-2">
|
|
21
|
+
<div class="d-flex gap-2">
|
|
22
|
+
<button class="btn btn-outline-secondary btn-sm" data-action="accept">[[groups:pending.accept]]</a></li>
|
|
23
|
+
<button class="btn btn-outline-secondary btn-sm" data-action="reject">[[groups:pending.reject]]</a></li>
|
|
24
|
+
</div>
|
|
25
|
+
</td>
|
|
26
|
+
</tr>
|
|
27
|
+
{{{end}}}
|
|
28
|
+
</table>
|