nodebb-theme-harmony 0.0.1

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.
Files changed (135) hide show
  1. package/.eslintrc +3 -0
  2. package/README.md +8 -0
  3. package/lib/controllers.js +7 -0
  4. package/library.js +51 -0
  5. package/package.json +45 -0
  6. package/plugin.json +11 -0
  7. package/public/.eslintrc +3 -0
  8. package/public/admin.js +15 -0
  9. package/renovate.json +6 -0
  10. package/scss/harmony.scss +3 -0
  11. package/scss/overrides.scss +1 -0
  12. package/templates/account/best.tpl +3 -0
  13. package/templates/account/blocks.tpl +35 -0
  14. package/templates/account/bookmarks.tpl +3 -0
  15. package/templates/account/categories.tpl +30 -0
  16. package/templates/account/consent.tpl +71 -0
  17. package/templates/account/controversial.tpl +3 -0
  18. package/templates/account/downvoted.tpl +3 -0
  19. package/templates/account/edit/password.tpl +32 -0
  20. package/templates/account/edit/username.tpl +28 -0
  21. package/templates/account/edit.tpl +137 -0
  22. package/templates/account/followers.tpl +19 -0
  23. package/templates/account/following.tpl +19 -0
  24. package/templates/account/groups.tpl +19 -0
  25. package/templates/account/ignored.tpl +3 -0
  26. package/templates/account/info.tpl +228 -0
  27. package/templates/account/posts.tpl +21 -0
  28. package/templates/account/profile.tpl +168 -0
  29. package/templates/account/sessions.tpl +34 -0
  30. package/templates/account/settings.tpl +231 -0
  31. package/templates/account/theme.tpl +29 -0
  32. package/templates/account/topics.tpl +32 -0
  33. package/templates/account/uploads.tpl +45 -0
  34. package/templates/account/upvoted.tpl +3 -0
  35. package/templates/account/watched.tpl +3 -0
  36. package/templates/admin/plugins/persona.tpl +29 -0
  37. package/templates/categories.tpl +33 -0
  38. package/templates/category.tpl +65 -0
  39. package/templates/chat.tpl +41 -0
  40. package/templates/chats.tpl +21 -0
  41. package/templates/flags/detail.tpl +211 -0
  42. package/templates/flags/list.tpl +73 -0
  43. package/templates/footer.tpl +16 -0
  44. package/templates/groups/details.tpl +79 -0
  45. package/templates/groups/list.tpl +50 -0
  46. package/templates/groups/members.tpl +8 -0
  47. package/templates/header.tpl +49 -0
  48. package/templates/login.tpl +98 -0
  49. package/templates/modules/taskbar.tpl +5 -0
  50. package/templates/modules/usercard.tpl +39 -0
  51. package/templates/notifications.tpl +68 -0
  52. package/templates/partials/acceptTos.tpl +11 -0
  53. package/templates/partials/account/category-item.tpl +25 -0
  54. package/templates/partials/account/header.tpl +48 -0
  55. package/templates/partials/account/menu.tpl +103 -0
  56. package/templates/partials/breadcrumbs.tpl +20 -0
  57. package/templates/partials/buttons/newTopic.tpl +24 -0
  58. package/templates/partials/categories/item.tpl +62 -0
  59. package/templates/partials/categories/lastpost.tpl +28 -0
  60. package/templates/partials/categories/link.tpl +13 -0
  61. package/templates/partials/category/sort.tpl +17 -0
  62. package/templates/partials/category/subcategory.tpl +20 -0
  63. package/templates/partials/category/tags.tpl +5 -0
  64. package/templates/partials/category/tools.tpl +83 -0
  65. package/templates/partials/category/watch.tpl +23 -0
  66. package/templates/partials/category-filter-content.tpl +31 -0
  67. package/templates/partials/category-filter-right.tpl +5 -0
  68. package/templates/partials/category-filter.tpl +5 -0
  69. package/templates/partials/category-selector-content.tpl +35 -0
  70. package/templates/partials/category-selector-right.tpl +5 -0
  71. package/templates/partials/category-selector.tpl +5 -0
  72. package/templates/partials/chats/dropdown.tpl +40 -0
  73. package/templates/partials/chats/message-window.tpl +36 -0
  74. package/templates/partials/chats/message.tpl +36 -0
  75. package/templates/partials/chats/messages.tpl +9 -0
  76. package/templates/partials/chats/options.tpl +26 -0
  77. package/templates/partials/chats/recent_room.tpl +33 -0
  78. package/templates/partials/chats/system-message.tpl +5 -0
  79. package/templates/partials/chats/user.tpl +3 -0
  80. package/templates/partials/chats-menu.tpl +43 -0
  81. package/templates/partials/cookie-consent.tpl +6 -0
  82. package/templates/partials/flags/filters.tpl +99 -0
  83. package/templates/partials/groups/admin.tpl +197 -0
  84. package/templates/partials/groups/badge.tpl +3 -0
  85. package/templates/partials/groups/list.tpl +23 -0
  86. package/templates/partials/groups/memberlist.tpl +43 -0
  87. package/templates/partials/header/user-menu.tpl +87 -0
  88. package/templates/partials/menu.tpl +188 -0
  89. package/templates/partials/notifications_list.tpl +32 -0
  90. package/templates/partials/paginator.tpl +47 -0
  91. package/templates/partials/post_bar.tpl +22 -0
  92. package/templates/partials/posts_list.tpl +10 -0
  93. package/templates/partials/posts_list_item.tpl +34 -0
  94. package/templates/partials/quick-search-results.tpl +36 -0
  95. package/templates/partials/search-results.tpl +57 -0
  96. package/templates/partials/slideout-menu.tpl +6 -0
  97. package/templates/partials/tags_list.tpl +7 -0
  98. package/templates/partials/thread_tools.tpl +10 -0
  99. package/templates/partials/toast.tpl +16 -0
  100. package/templates/partials/topic/browsing-users.tpl +3 -0
  101. package/templates/partials/topic/event.tpl +28 -0
  102. package/templates/partials/topic/navigation-post.tpl +14 -0
  103. package/templates/partials/topic/navigator.tpl +41 -0
  104. package/templates/partials/topic/necro-post.tpl +5 -0
  105. package/templates/partials/topic/post-editor.tpl +3 -0
  106. package/templates/partials/topic/post-menu-list.tpl +134 -0
  107. package/templates/partials/topic/post-menu.tpl +6 -0
  108. package/templates/partials/topic/post.tpl +116 -0
  109. package/templates/partials/topic/quickreply.tpl +30 -0
  110. package/templates/partials/topic/reactions.tpl +3 -0
  111. package/templates/partials/topic/reply-button.tpl +29 -0
  112. package/templates/partials/topic/selection-tooltip.tpl +5 -0
  113. package/templates/partials/topic/sort.tpl +11 -0
  114. package/templates/partials/topic/stats.tpl +14 -0
  115. package/templates/partials/topic/tag.tpl +3 -0
  116. package/templates/partials/topic/tags.tpl +5 -0
  117. package/templates/partials/topic/topic-menu-list.tpl +34 -0
  118. package/templates/partials/topic/watch.tpl +24 -0
  119. package/templates/partials/topic-filters.tpl +14 -0
  120. package/templates/partials/topic-terms.tpl +14 -0
  121. package/templates/partials/topics_list.tpl +118 -0
  122. package/templates/partials/users_list.tpl +60 -0
  123. package/templates/partials/users_list_menu.tpl +23 -0
  124. package/templates/popular.tpl +37 -0
  125. package/templates/recent.tpl +39 -0
  126. package/templates/register.tpl +89 -0
  127. package/templates/search.tpl +185 -0
  128. package/templates/tag.tpl +35 -0
  129. package/templates/tags.tpl +34 -0
  130. package/templates/top.tpl +37 -0
  131. package/templates/topic.tpl +108 -0
  132. package/templates/unread.tpl +39 -0
  133. package/templates/users.tpl +36 -0
  134. package/theme.json +7 -0
  135. package/theme.scss +1 -0
@@ -0,0 +1,35 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <button type="button" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown">
4
+ <span component="category-selector-selected">
5
+ {{{ if (selectedCategory && !showCategorySelectLabel) }}}
6
+ <span class="category-item">
7
+ {buildCategoryIcon(selectedCategory, "24px", "rounded-circle")}
8
+ {selectedCategory.name}
9
+ </span>
10
+ {{{ else }}}
11
+ <span class="visible-sm-inline visible-md-inline visible-lg-inline">{{{ if selectCategoryLabel }}}{selectCategoryLabel}{{{ else }}}[[topic:thread_tools.select_category]]{{{ end }}}</span><span class="visible-xs-inline"><i class="fa fa-fw {{{ if selectCategoryIcon }}}{selectCategoryIcon}{{{ else }}}fa-list{{{ end }}}"></i></span>
12
+ {{{ end }}}</span> <span class="caret"></span>
13
+ </button>
14
+ <div component="category-selector-search" class="hidden position-absolute">
15
+ <input type="text" class="form-control" autocomplete="off">
16
+ </div>
17
+ <ul component="category/list" class="dropdown-menu category-dropdown-menu" role="menu">
18
+ <li component="category/no-matches" role="presentation" class="category hidden">
19
+ <a class="dropdown-item" role="menu-item">[[search:no-matches]]</a>
20
+ </li>
21
+ {{{each categoryItems}}}
22
+ <li role="presentation" class="category {{{ if ../disabledClass }}}disabled {{{ end }}}" data-cid="{../cid}" data-name="{../name}" data-parent-cid="{../parentCid}">
23
+ <a class="dropdown-item" role="menu-item">{../level}
24
+ <span component="category-markup" style="{{{ if ../match }}}font-weight: bold;{{{end}}}">
25
+ <div class="category-item d-inline-block">
26
+ {{{ if ./icon }}}
27
+ {buildCategoryIcon(@value, "24px", "rounded-circle")}
28
+ {{{ end }}}
29
+ {./name}
30
+ </div>
31
+ </span>
32
+ </a>
33
+ </li>
34
+ {{{ end }}}
35
+ </ul>
@@ -0,0 +1,5 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <div component="category-selector" class="btn-group right category-dropdown-container bottom-sheet">
4
+ <!-- IMPORT partials/category-selector-content.tpl -->
5
+ </div>
@@ -0,0 +1,5 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <div component="category-selector" class="btn-group bottom-sheet">
4
+ <!-- IMPORT partials/category-selector-content.tpl -->
5
+ </div>
@@ -0,0 +1,40 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <!-- IF rooms.length -->
4
+ {{{each rooms}}}
5
+ <li class="<!-- IF ../unread -->unread<!-- ENDIF ../unread -->" data-roomid="{rooms.roomId}">
6
+ {{{each rooms.users}}}
7
+ <!-- IF @first -->
8
+ <div class="main-avatar">
9
+ <!-- IMPORT partials/chats/user.tpl -->
10
+ </div>
11
+ <!-- ENDIF @first -->
12
+ {{{end}}}
13
+
14
+ <ul class="members">
15
+ {{{each rooms.users}}}
16
+ <li>
17
+ <!-- IMPORT partials/chats/user.tpl -->
18
+ </li>
19
+ {{{end}}}
20
+ </ul>
21
+
22
+ <div class="notification-chat-content">
23
+ <strong class="room-name">
24
+ <!-- IF !rooms.lastUser.uid -->
25
+ <span>[[modules:chat.no-users-in-room]]</span>
26
+ <!-- ELSE -->
27
+ <!-- IF rooms.roomName -->{rooms.roomName}<!-- ELSE -->{rooms.usernames}<!-- ENDIF rooms.roomName -->
28
+ <!-- ENDIF !rooms.lastUser.uid -->
29
+ </strong>
30
+ <span class="teaser-content">
31
+ <strong class="teaser-username">{rooms.teaser.user.username}:</strong>
32
+ {rooms.teaser.content}
33
+ </span>
34
+ </div>
35
+ <div class="teaser-timestamp notification-chat-controls">{rooms.teaser.timeago}</div>
36
+ </li>
37
+ {{{end}}}
38
+ <!-- ELSE -->
39
+ <li class="no_active"><a href="#">[[modules:chat.no_active]]</a></li>
40
+ <!-- ENDIF rooms.length -->
@@ -0,0 +1,36 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <!-- IF roomId -->
4
+ <div component="chat/messages" class="expanded-chat" data-roomid="{roomId}">
5
+ <div component="chat/header" class="d-flex align-items-center px-3">
6
+ <span class="members flex-grow-1">
7
+ [[modules:chat.chatting_with]]:
8
+ {{{each users}}}
9
+ <a href="{config.relative_path}/uid/{../uid}">{../username}</a><!-- IF !@last -->,<!-- END -->
10
+ {{{end}}}
11
+ </span>
12
+
13
+ <button type="button" class="btn btn-link d-none d-md-block p-2 text-muted" data-action="pop-out" aria-hidden="true" aria-label="Pop Out"><i class="fa fa-compress"></i></button>
14
+ <!-- IMPORT partials/chats/options.tpl -->
15
+ <button type="button" class="btn-close" aria-hidden="true" aria-label="Close" data-action="close"></button>
16
+ </div>
17
+ <div class="position-relative">
18
+ <div component="chat/messages/scroll-up-alert" class="position-absolute scroll-up-alert alert alert-info hidden w-100" role="button" style="z-index: 1;">[[modules:chat.scroll-up-alert]]</div>
19
+ </div>
20
+ <ul class="chat-content">
21
+ <!-- IMPORT partials/chats/messages.tpl -->
22
+ </ul>
23
+ <div component="chat/composer">
24
+ <textarea component="chat/input" placeholder="[[modules:chat.placeholder]]" class="form-control chat-input mousetrap" rows="2"></textarea>
25
+ <button class="btn btn-primary" type="button" data-action="send"><i class="fa fa-fw fa-2x fa-paper-plane"></i></button>
26
+ <span component="chat/message/remaining">{maximumChatMessageLength}</span>
27
+ <form component="chat/upload" method="post" enctype="multipart/form-data">
28
+ <input type="file" name="files[]" multiple class="hidden"/>
29
+ </form>
30
+ </div>
31
+ </div>
32
+ <!-- ELSE -->
33
+ <div class="alert alert-info me-3">
34
+ [[modules:chat.no-messages]]
35
+ </div>
36
+ <!-- ENDIF roomId -->
@@ -0,0 +1,36 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <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}">
4
+ <div class="message-header">
5
+ <a href="{config.relative_path}/user/{messages.fromUser.userslug}">{buildAvatar(messages.fromUser, "32px", true, "not-responsive")}</a>
6
+ <span class="chat-user fw-bold"><a href="{config.relative_path}/user/{messages.fromUser.userslug}">{messages.fromUser.displayname}</a></span>
7
+ <!-- IF ../fromUser.banned -->
8
+ <span class="badge bg-danger">[[user:banned]]</span>
9
+ <!-- END -->
10
+ <!-- IF ../fromUser.deleted -->
11
+ <span class="badge bg-danger">[[user:deleted]]</span>
12
+ <!-- END -->
13
+ <small class="chat-timestamp text-muted ms-2 timeago" title="{messages.timestampISO}"></small>
14
+ <!-- IF messages.edited -->
15
+ <div class="text-muted float-end" title="[[global:edited]] {messages.editedISO}"><i class="fa fa-edit"></i></span></div>
16
+ <!-- ENDIF messages.edited -->
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>
36
+ </li>
@@ -0,0 +1,9 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ {{{each messages}}}
4
+ {{{ if !./system }}}
5
+ <!-- IMPORT partials/chats/message.tpl -->
6
+ {{{ else }}}
7
+ <!-- IMPORT partials/chats/system-message.tpl -->
8
+ {{{ end }}}
9
+ {{{end}}}
@@ -0,0 +1,26 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <div class="dropdown">
4
+ <button class="btn btn-link p-2 text-muted align-text-top" data-bs-toggle="dropdown" component="chat/controlsToggle"><i class="fa fa-gear"></i></button>
5
+ <ul class="dropdown-menu dropdown-menu-end" component="chat/controls">
6
+ <li class="dropdown-header">[[modules:chat.options]]</li>
7
+ <li>
8
+ <a class="dropdown-item" href="#" data-action="members"><i class="fa fa-fw fa-cog"></i> [[modules:chat.manage-room]]</a>
9
+ </li>
10
+ <li>
11
+ <a class="dropdown-item" href="#" data-action="rename"><i class="fa fa-fw fa-edit"></i> [[modules:chat.rename-room]]</a>
12
+ </li>
13
+ <li>
14
+ <a class="dropdown-item" href="#" data-action="leave"><i class="fa fa-fw fa-sign-out"></i> [[modules:chat.leave]]</a>
15
+ </li>
16
+ <!-- IF users.length -->
17
+ <li role="separator" class="dropdown-divider"></li>
18
+ <li class="dropdown-header">[[modules:chat.in-room]]</li>
19
+ {{{each users}}}
20
+ <li>
21
+ <a class="dropdown-item" href="{config.relative_path}/uid/{../uid}">{buildAvatar(users, "24px", true)} {../username}</a>
22
+ </li>
23
+ {{{end}}}
24
+ <!-- END -->
25
+ </ul>
26
+ </div>
@@ -0,0 +1,33 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <li component="chat/recent/room" data-roomid="{rooms.roomId}" class="<!-- IF rooms.unread -->unread<!-- ENDIF rooms.unread -->">
4
+ {{{each rooms.users}}}
5
+ <!-- IF @first -->
6
+ <div class="main-avatar me-2">
7
+ <!-- IMPORT partials/chats/user.tpl -->
8
+ </div>
9
+ <!-- ENDIF @first -->
10
+ {{{end}}}
11
+
12
+ {{{ if rooms.users.length }}}
13
+ <ul class="members">
14
+ {{{each rooms.users}}}
15
+ <li>
16
+ <!-- IMPORT partials/chats/user.tpl -->
17
+ </li>
18
+ {{{end}}}
19
+ </ul>
20
+ {{{ 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
+ </div>
33
+ </li>
@@ -0,0 +1,5 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <li component="chat/system-message" class="system-message fs-6 py-3 clear" data-index="{messages.index}" data-mid="{messages.messageId}" data-uid="{messages.fromuid}" data-self="{messages.self}" data-break="0" data-timestamp="{messages.timestamp}">
4
+ [[modules:chat.system.{messages.content}, {messages.fromUser.username}]]
5
+ </li>
@@ -0,0 +1,3 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <a href="{config.relative_path}/user/{rooms.users.userslug}">{buildAvatar(rooms.users, "28px", true)}</a>
@@ -0,0 +1,43 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ {{{ if config.loggedIn }}}
4
+ <ul class="nav nav-pills">
5
+ <li class="nav-item">
6
+ <a class="nav-link" href="#" data-bs-target="#notifications" data-bs-toggle="tab"><span class="counter unread-count" component="notifications/icon" data-content="{unreadCount.notification}"></span> <i class="fa fa-fw fa-bell"></i></a>
7
+ </li>
8
+ {{{ if !config.disableChat }}}
9
+ <li class="nav-item">
10
+ <a class="nav-link" href="#" data-bs-target="#chats" data-bs-toggle="tab"><i class="counter unread-count" component="chat/icon" data-content="{unreadCount.chat}"></i> <i class="fa fa-fw fa-comment"></i></a>
11
+ </li>
12
+ {{{ end }}}
13
+ <li class="nav-item">
14
+ <a class="nav-link active" href="#" data-bs-target="#profile" data-bs-toggle="tab">
15
+ {buildAvatar(user, "24px", true, "user-icon")}
16
+ <i component="user/status" class="fa fa-fw fa-circle status {user.status}"></i>
17
+ </a>
18
+ </li>
19
+ </ul>
20
+
21
+ <div class="tab-content">
22
+ <div class="tab-pane fade show active" id="profile">
23
+ <section class="menu-section" data-section="profile">
24
+ <ul class="menu-section-list dropdown-menu show text-bg-dark w-100 border-0" component="header/usercontrol"></ul>
25
+ </section>
26
+ </div>
27
+ <div class="tab-pane fade" id="notifications">
28
+ <section class="menu-section text-bg-dark" data-section="notifications">
29
+ <ul class="menu-section-list notification-list-mobile" component="notifications/list"></ul>
30
+ <p class="menu-section-list"><a href="{relative_path}/notifications">[[notifications:see_all]]</a></p>
31
+ </section>
32
+ </div>
33
+ {{{ if !config.disableChat }}}
34
+ <div class="tab-pane fade" id="chats">
35
+ <section class="menu-section text-bg-dark" data-section="chats">
36
+ <ul class="menu-section-list chat-list" component="chat/list">
37
+ <a class="navigation-link" href="{relative_path}/user/{user.userslug}/chats">[[modules:chat.see_all]]</a>
38
+ </ul>
39
+ </section>
40
+ </div>
41
+ {{{ end }}}
42
+ </div>
43
+ {{{ end }}}
@@ -0,0 +1,6 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <div class="cookie-consent">
4
+ <button class="float-end btn btn-primary">{dismiss}</button>
5
+ {message} <a target="_blank" rel="noopener" href="{link_url}">{link}</a>
6
+ </div>
@@ -0,0 +1,99 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <div class="text-center">
4
+ <div class="card mb-3">
5
+ <div class="card-body collapse" id="flags-daily-wrapper" aria-expanded="false">
6
+ <div><canvas id="flags:daily" height="150"></canvas></div>
7
+ </div>
8
+ <div class="card-footer" data-bs-toggle="collapse" data-bs-target="#flags-daily-wrapper" aria-controls="#flags-daily-wrapper"><small>[[flags:graph-label]]</small>&nbsp;<i class="fa fa-sort"></i></div>
9
+ </div>
10
+ </div>
11
+
12
+ <div class="card mb-3">
13
+ <div class="card-header">
14
+ [[flags:quick-filters]]
15
+ </div>
16
+ <div class="card-body">
17
+ <ul>
18
+ <li><a href="{config.relative_path}/flags?quick=mine">[[flags:filter-quick-mine]]</a></li>
19
+ </ul>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="card mb-3">
24
+ <div class="card-header">
25
+ [[flags:filters]]
26
+ </div>
27
+ <div class="card-body">
28
+ <form role="form" component="flags/filters">
29
+ <fieldset>
30
+ <div class="mb-3">
31
+ <label class="form-label" for="filter-cid">[[flags:filter-cid]]</label>
32
+ <div class="input-group">
33
+ <!-- IMPORT partials/category-filter.tpl -->
34
+ </div>
35
+ </div>
36
+ <div class="mb-3">
37
+ <label class="form-label" for="sort">[[flags:sort]]</label>
38
+ <select class="form-control" id="sort" name="sort">
39
+ <optgroup label="[[flags:sort-all]]">
40
+ <option value="newest">[[flags:sort-newest]]</option>
41
+ <option value="oldest">[[flags:sort-oldest]]</option>
42
+ <option value="reports">[[flags:sort-reports]]</option>
43
+ </optgroup>
44
+ <optgroup label="[[flags:sort-posts-only]]">
45
+ <option value="downvotes">[[flags:sort-downvotes]]</option>
46
+ <option value="upvotes">[[flags:sort-upvotes]]</option>
47
+ <option value="replies">[[flags:sort-replies]]</option>
48
+ </optgroup>
49
+ </select>
50
+ </div>
51
+ <div class="mb-3">
52
+ <label class="form-label" for="filter-state">[[flags:filter-state]]</label>
53
+ <select class="form-control" id="filter-state" name="state">
54
+ <option value="">[[flags:state-all]]</option>
55
+ <option value="open">[[flags:state-open]]</option>
56
+ <option value="wip">[[flags:state-wip]]</option>
57
+ <option value="resolved">[[flags:state-resolved]]</option>
58
+ <option value="rejected">[[flags:state-rejected]]</option>
59
+ </select>
60
+ </div>
61
+
62
+ <div class="mb-3">
63
+ <label class="form-label" for="filter-type">[[flags:filter-type]]</label>
64
+ <select class="form-control" id="filter-type" name="type">
65
+ <option value="">[[flags:filter-type-all]]</option>
66
+ <option value="post">[[flags:filter-type-post]]</option>
67
+ <option value="user">[[flags:filter-type-user]]</option>
68
+ </select>
69
+ </div>
70
+ </fieldset>
71
+
72
+ <fieldset class="collapse{{{ if expanded }}} show{{{ end }}}" id="more-filters" aria-expanded="{expanded}">
73
+ <div class="mb-3">
74
+ <label class="form-label" for="filter-assignee">[[flags:filter-assignee]]</label>
75
+ <input type="text" class="form-control" id="filter-assignee" name="assignee" />
76
+ </div>
77
+
78
+ <div class="mb-3">
79
+ <label class="form-label" for="filter-targetUid">[[flags:filter-targetUid]]</label>
80
+ <input type="text" class="form-control" id="filter-targetUid" name="targetUid" />
81
+ </div>
82
+
83
+ <div class="mb-3">
84
+ <label class="form-label" for="filter-reporterId">[[flags:filter-reporterId]]</label>
85
+ <input type="text" class="form-control" id="filter-reporterId" name="reporterId" />
86
+ </div>
87
+ </fieldset>
88
+
89
+ <div class="d-grid gap-2">
90
+ {{{ if expanded }}}
91
+ <button type="button" class="btn btn-link" data-bs-toggle="collapse" data-bs-target="#more-filters" aria-controls="#more-filters" data-text-variant="[[flags:more-filters]] ">[[flags:fewer-filters]]&nbsp;<i class="fa fa-sort"></i></button>
92
+ {{{ else }}}
93
+ <button type="button" class="btn btn-link" data-bs-toggle="collapse" data-bs-target="#more-filters" aria-controls="#more-filters" data-text-variant="[[flags:fewer-filters]] ">[[flags:more-filters]]&nbsp;<i class="fa fa-sort"></i></button>
94
+ {{{ end }}}
95
+ <button type="button" id="apply-filters" class="btn btn-primary">[[flags:apply-filters]]</button>
96
+ </div>
97
+ </form>
98
+ </div>
99
+ </div>
@@ -0,0 +1,197 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <div class="card mb-3">
4
+ <div class="card-header">
5
+ <div class="fs-5">
6
+ <i class="fa fa-clock-o"></i> [[groups:details.pending]]
7
+ <!-- IF group.pending.length -->
8
+ <div class="btn-group float-end">
9
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
10
+ [[global:more]] <span class="caret"></span>
11
+ </button>
12
+ <ul class="dropdown-menu" role="menu">
13
+ <li><a class="dropdown-item" href="#" data-ajaxify="false" data-action="acceptAll">[[groups:pending.accept_all]]</a></li>
14
+ <li><a class="dropdown-item" href="#" data-ajaxify="false" data-action="rejectAll">[[groups:pending.reject_all]]</a></li>
15
+ </ul>
16
+ </div>
17
+ <!-- ENDIF group.pending.length -->
18
+ </div>
19
+ </div>
20
+ <div class="card-body">
21
+ <table component="groups/pending" class="table table-striped table-hover">
22
+ <!-- IF !group.pending.length -->
23
+ <div class="alert alert-info">[[groups:pending.none]]</div>
24
+ <!-- ENDIF !group.pending.length -->
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>
59
+ </div>
60
+
61
+ <div class="mb-2">
62
+ <textarea class="form-control" component="groups/members/bulk-invite" placeholder="[[groups:bulk-invite-instructions]]"></textarea>
63
+ </div>
64
+
65
+ <div class="mb-2 clearfix">
66
+ <button class="btn btn-outline-secondary btn-sm float-end" component="groups/members/bulk-invite-button">[[groups:bulk-invite]]</button>
67
+ </div>
68
+
69
+ <table component="groups/invited" class="table table-striped table-hover">
70
+ <!-- IF !group.invited.length -->
71
+ <div class="alert alert-info">[[groups:invited.none]]</div>
72
+ <!-- ENDIF !group.invited.length -->
73
+ {{{each group.invited}}}
74
+ <tr data-uid="{group.invited.uid}">
75
+ <td class="p-2">
76
+ <a href="{config.relative_path}/user/{group.invited.userslug}">{buildAvatar(group.invited, "24px", true)}</a>
77
+ </td>
78
+ <td class="member-name p-2">
79
+ <a href="{config.relative_path}/user/{group.invited.userslug}">{group.invited.username}</a>
80
+ </td>
81
+ <td class="p-2">
82
+ <div class="btn-group float-end">
83
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
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>
96
+
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
+
105
+ <div class="card-body options collapse">
106
+ <form component="groups/settings" role="form">
107
+ <div class="mb-3">
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}" />
110
+ </div>
111
+ <div class="mb-3">
112
+ <label class="form-label" for="name">[[groups:details.description]]</label>
113
+ <textarea class="form-control" name="description" id="description" type="text" maxlength="255">{group.description}</textarea>
114
+ </div>
115
+
116
+ <hr />
117
+ <div class="mb-3">
118
+ <label class="form-label" for="memberPostCids">[[groups:details.member-post-cids]]</label>
119
+ <div class="row">
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 -->
125
+ </div>
126
+ </div>
127
+ </div>
128
+
129
+ <hr />
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>
139
+
140
+ <hr/>
141
+ <button component="groups/userTitleOption" type="button" class="btn btn-outline-secondary btn-sm" data-action="icon-select"<!-- IF !group.userTitleEnabled --> disabled<!-- ENDIF !group.userTitleEnabled -->>[[groups:details.change_icon]]</button>
142
+ <div>
143
+ <label class="form-label" for="labelColor" class="badge-color-label">[[groups:details.change_label_colour]]</label>
144
+ <input component="groups/userTitleOption" type="color" name="labelColor" value="<!-- IF group.labelColor -->{group.labelColor}<!-- ENDIF group.labelColor -->" />
145
+ </div>
146
+ <div>
147
+ <label class="form-label" for="color" class="badge-color-label">[[groups:details.change_text_colour]]</label>
148
+ <input component="groups/userTitleOption" type="color" name="textColor" value="<!-- IF group.textColor -->{group.textColor}<!-- ENDIF group.textColor -->" />
149
+ </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
+ </div>
192
+
193
+ <button class="btn btn-link text-danger float-end" type="button" data-action="delete">[[groups:details.delete_group]]</button>
194
+ <button class="btn btn-primary" type="button" data-action="update">[[global:save_changes]]</button>
195
+ </form>
196
+ </div>
197
+ </div>
@@ -0,0 +1,3 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
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>
@@ -0,0 +1,23 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ {{{each groups}}}
4
+ <div class="col-lg-4 col-md-6 col-sm-12 mb-3" component="groups/summary" data-slug="{groups.slug}">
5
+ <div class="card h-100">
6
+ <a href="{config.relative_path}/groups/{groups.slug}" class="card-header list-cover" style="<!-- IF groups.cover:thumb:url -->background-image: url({groups.cover:thumb:url});<!-- ENDIF groups.cover:thumb:url -->">
7
+ <h5 class="card-title">{groups.displayName} <small>{groups.memberCount}</small></h5>
8
+ </a>
9
+ <div class="card-body">
10
+ <ul class="members">
11
+ {{{each groups.members}}}
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>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ {{{end}}}