Merge branch 'v12.x'
commit
ba39ceabe0
@ -1,4 +1,10 @@
|
||||
{
|
||||
"mobile-menu-side": "Switch which side each mobile menu is on",
|
||||
"post-quick-reply": "Post quick reply"
|
||||
"settings.title": "Theme settings",
|
||||
"settings.intro": "You can customise your theme settings here. Settings are stored on a per-device basis, so you are able to have different settings on different devices (phone, tablet, desktop, etc.)",
|
||||
"settings.mobile-menu-side": "Switch which side each mobile menu is on",
|
||||
"settings.autoHidingNavbar": "Automatically hide the navbar on scroll",
|
||||
"settings.autoHidingNavbar-xs": "Very small screens (e.g. phones in portrait mode)",
|
||||
"settings.autoHidingNavbar-sm": "Smaller screens (e.g. phones, some tablets)",
|
||||
"settings.autoHidingNavbar-md": "Medium sized screens (e.g. tablets in landscape mode)",
|
||||
"settings.autoHidingNavbar-lg": "Larger screens (e.g. desktop computers)"
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
'use strict';
|
||||
|
||||
const accountHelpers = require.main.require('./src/controllers/accounts/helpers');
|
||||
const helpers = require.main.require('./src/controllers/helpers');
|
||||
|
||||
const Controllers = module.exports;
|
||||
|
||||
Controllers.renderAdminPage = (req, res) => {
|
||||
res.render('admin/plugins/persona', {});
|
||||
};
|
||||
|
||||
Controllers.renderThemeSettings = async (req, res, next) => {
|
||||
const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query);
|
||||
if (!userData) {
|
||||
return next();
|
||||
}
|
||||
|
||||
userData.title = '[[persona:settings.title]]';
|
||||
userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[persona:settings.title]]' }]);
|
||||
|
||||
res.render('account/theme', userData);
|
||||
};
|
@ -0,0 +1,3 @@
|
||||
{
|
||||
"extends": "nodebb/public"
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
'use strict';
|
||||
|
||||
define('forum/account/theme', ['forum/account/header', 'storage', 'settings', 'alerts'], function (header, Storage, settings, alerts) {
|
||||
const Theme = {};
|
||||
|
||||
Theme.init = () => {
|
||||
header.init();
|
||||
Theme.setupForm();
|
||||
};
|
||||
|
||||
Theme.setupForm = () => {
|
||||
const saveEl = document.getElementById('save');
|
||||
const formEl = document.getElementById('theme-settings');
|
||||
const [sidebarSwapped, autohideNavbarEnvs] = [
|
||||
!!Storage.getItem('persona:menus:legacy-layout'),
|
||||
Storage.getItem('persona:navbar:autohide'),
|
||||
];
|
||||
|
||||
document.getElementById('persona:menus:legacy-layout').checked = sidebarSwapped;
|
||||
try {
|
||||
const parsed = JSON.parse(autohideNavbarEnvs) || ['xs', 'sm'];
|
||||
parsed.forEach((env) => {
|
||||
const optionEl = document.getElementById('persona:navbar:autohide').querySelector(`option[value="${env}"]`);
|
||||
optionEl.selected = true;
|
||||
});
|
||||
} catch (e) {
|
||||
console.warn(e);
|
||||
}
|
||||
|
||||
if (saveEl) {
|
||||
saveEl.addEventListener('click', () => {
|
||||
const themeSettings = settings.helper.serializeForm($(formEl));
|
||||
Object.keys(themeSettings).forEach((key) => {
|
||||
if (key === 'persona:menus:legacy-layout') {
|
||||
if (themeSettings[key] === 'on') {
|
||||
Storage.setItem('persona:menus:legacy-layout', 'true');
|
||||
} else {
|
||||
Storage.removeItem('persona:menus:legacy-layout');
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Storage.setItem(key, themeSettings[key]);
|
||||
});
|
||||
|
||||
alerts.success('[[success:settings-saved]]');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return Theme;
|
||||
});
|
@ -0,0 +1 @@
|
||||
<!-- IMPORT account/posts.tpl -->
|
@ -1,30 +0,0 @@
|
||||
<div class="account">
|
||||
<!-- IMPORT partials/account/header.tpl -->
|
||||
|
||||
<form class="form-horizontal edit-form">
|
||||
<div class="control-group">
|
||||
<label class="control-label" for="inputNewEmail">[[user:email]]</label>
|
||||
<div class="controls">
|
||||
<input class="form-control" type="text" id="inputNewEmail" placeholder="[[user:email]]" value="{email}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- disables autocomplete on FF --><input type="password" style="display:none">
|
||||
|
||||
<!-- IF isSelf -->
|
||||
<div class="control-group">
|
||||
<label class="control-label" for="inputCurrentPassword">[[user:current_password]]</label>
|
||||
<div class="controls">
|
||||
<input autocomplete="off" class="form-control" type="password" id="inputCurrentPassword" placeholder="[[user:current_password]]" value=""<!-- IF !hasPassword --> disabled<!-- ENDIF !hasPassword -->>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF isSelf -->
|
||||
|
||||
<input type="hidden" name="uid" id="inputUID" value="{uid}" />
|
||||
|
||||
<br/>
|
||||
<div class="form-actions">
|
||||
<button id="submitBtn" class="btn btn-primary btn-block"><i class="hide fa fa-spinner fa-spin"></i> [[user:change_email]]</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
@ -0,0 +1,27 @@
|
||||
<div class="account">
|
||||
<!-- IMPORT partials/account/header.tpl -->
|
||||
|
||||
<p>[[persona:settings.intro]]</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<form id="theme-settings" role="form">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" id="persona:menus:legacy-layout" name="persona:menus:legacy-layout"> <strong>[[persona:settings.mobile-menu-side]]</strong>
|
||||
</label>
|
||||
</div><br />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="persona:navbar:autohide">[[persona:settings.autoHidingNavbar]]</label>
|
||||
<select multiple class="form-control" name="persona:navbar:autohide" id="persona:navbar:autohide">
|
||||
<option value="xs">[[persona:settings.autoHidingNavbar-xs]]</option>
|
||||
<option value="sm">[[persona:settings.autoHidingNavbar-sm]]</option>
|
||||
<option value="md">[[persona:settings.autoHidingNavbar-md]]</option>
|
||||
<option value="lg">[[persona:settings.autoHidingNavbar-lg]]</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<button id="save" type="button" class="btn btn-primary">[[global:save_changes]]</button>
|
||||
</form>
|
||||
</div>
|
@ -1,75 +1,93 @@
|
||||
<!-- IMPORT partials/breadcrumbs.tpl -->
|
||||
|
||||
<div class="row">
|
||||
<!-- IF allowLocalLogin -->
|
||||
<div class="<!-- IF alternate_logins -->col-md-6<!-- ELSE -->col-md-12<!-- ENDIF alternate_logins -->">
|
||||
<div class="login-block">
|
||||
<div class="alert alert-danger" id="login-error-notify" <!-- IF error -->style="display:block"<!-- ELSE -->style="display: none;"<!-- ENDIF error -->>
|
||||
<button type="button" class="close" data-dismiss="alert">×</button>
|
||||
<strong>[[login:failed_login_attempt]]</strong>
|
||||
<p>{error}</p>
|
||||
</div>
|
||||
|
||||
<form class="form-horizontal" role="form" method="post" id="login-form">
|
||||
<div class="form-group">
|
||||
<label for="username" class="col-lg-2 control-label">{allowLoginWith}</label>
|
||||
<div class="col-lg-10">
|
||||
<input class="form-control" type="text" placeholder="{allowLoginWith}" name="username" id="username" autocorrect="off" autocapitalize="off" value="{username}"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password" class="col-lg-2 control-label">[[user:password]]</label>
|
||||
<div class="col-lg-10">
|
||||
<input class="form-control" type="password" placeholder="[[user:password]]" name="password" id="password" <!-- IF username -->autocomplete="off"<!-- ENDIF username -->/>
|
||||
<p id="caps-lock-warning" class="text-danger hidden">
|
||||
<i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
|
||||
</p>
|
||||
<div data-widget-area="header">
|
||||
{{{each widgets.header}}}
|
||||
{{widgets.header.html}}
|
||||
{{{end}}}
|
||||
</div>
|
||||
<div class="row login">
|
||||
<div class="{{{ if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
|
||||
<div class="row">
|
||||
{{{ if allowLocalLogin }}}
|
||||
<div class="{{{ if alternate_logins }}}col-md-6{{{ else }}}col-md-12{{{ end }}}">
|
||||
<div class="login-block">
|
||||
<div class="alert alert-danger" id="login-error-notify" <!-- IF error -->style="display:block"<!-- ELSE -->style="display: none;"<!-- ENDIF error -->>
|
||||
<button type="button" class="close" data-dismiss="alert">×</button>
|
||||
<strong>[[login:failed_login_attempt]]</strong>
|
||||
<p>{error}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-lg-offset-2 col-lg-10">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="remember" id="remember" checked /> [[login:remember_me]]
|
||||
</label>
|
||||
|
||||
<form class="form-horizontal" role="form" method="post" id="login-form">
|
||||
<div class="form-group">
|
||||
<label for="username" class="col-lg-2 control-label">{allowLoginWith}</label>
|
||||
<div class="col-lg-10">
|
||||
<input class="form-control" type="text" placeholder="{allowLoginWith}" name="username" id="username" autocorrect="off" autocapitalize="off" value="{username}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{{each loginFormEntry}}}
|
||||
<div class="form-group loginFormEntry">
|
||||
<label for="login-{loginFormEntry.styleName}" class="col-lg-4 control-label">{loginFormEntry.label}</label>
|
||||
<div id="login-{loginFormEntry.styleName}" class="col-lg-8">{{loginFormEntry.html}}</div>
|
||||
</div>
|
||||
{{{end}}}
|
||||
<input type="hidden" name="_csrf" value="{config.csrf_token}" />
|
||||
<input type="hidden" name="noscript" id="noscript" value="true" />
|
||||
<div class="form-group">
|
||||
<div class="col-lg-offset-2 col-lg-10">
|
||||
<button class="btn btn-primary btn-lg btn-block" id="login" type="submit">[[global:login]]</button>
|
||||
<!-- IF allowRegistration -->
|
||||
<span>[[login:dont_have_account]] <a href="{config.relative_path}/register">[[register:register]]</a></span>
|
||||
<!-- ENDIF allowRegistration -->
|
||||
<!-- IF allowPasswordReset -->
|
||||
<a id="reset-link" href="{config.relative_path}/reset">[[login:forgot_password]]</a>
|
||||
<!-- ENDIF allowPasswordReset -->
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password" class="col-lg-2 control-label">[[user:password]]</label>
|
||||
<div class="col-lg-10">
|
||||
<input class="form-control" type="password" placeholder="[[user:password]]" name="password" id="password" <!-- IF username -->autocomplete="off"<!-- ENDIF username -->/>
|
||||
<p id="caps-lock-warning" class="text-danger hidden">
|
||||
<i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-lg-offset-2 col-lg-10">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="remember" id="remember" checked /> [[login:remember_me]]
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{{each loginFormEntry}}}
|
||||
<div class="form-group loginFormEntry">
|
||||
<label for="login-{loginFormEntry.styleName}" class="col-lg-4 control-label">{loginFormEntry.label}</label>
|
||||
<div id="login-{loginFormEntry.styleName}" class="col-lg-8">{{loginFormEntry.html}}</div>
|
||||
</div>
|
||||
{{{end}}}
|
||||
<input type="hidden" name="_csrf" value="{config.csrf_token}" />
|
||||
<input type="hidden" name="noscript" id="noscript" value="true" />
|
||||
<div class="form-group">
|
||||
<div class="col-lg-offset-2 col-lg-10">
|
||||
<button class="btn btn-primary btn-lg btn-block" id="login" type="submit">[[global:login]]</button>
|
||||
<!-- IF allowRegistration -->
|
||||
<span>[[login:dont_have_account]] <a href="{config.relative_path}/register">[[register:register]]</a></span>
|
||||
<!-- ENDIF allowRegistration -->
|
||||
<!-- IF allowPasswordReset -->
|
||||
<a id="reset-link" href="{config.relative_path}/reset">[[login:forgot_password]]</a>
|
||||
<!-- ENDIF allowPasswordReset -->
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{{{ end }}}
|
||||
|
||||
{{{ if alternate_logins }}}
|
||||
<div class="{{{ if allowLocalLogin }}}col-md-6{{{ else }}}col-md-12{{{ end }}}">
|
||||
<div class="alt-login-block">
|
||||
<h4>[[login:alternative_logins]]</h4>
|
||||
<ul class="alt-logins">
|
||||
{{{each authentication}}}
|
||||
<li class="{authentication.name}"><a rel="nofollow noopener noreferrer" target="_top" href="{config.relative_path}{authentication.url}"><i class="fa {authentication.icon} fa-3x"></i></a></li>
|
||||
{{{end}}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{{{ end }}}
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF allowLocalLogin -->
|
||||
|
||||
<!-- IF alternate_logins -->
|
||||
<div class="<!-- IF allowLocalLogin -->col-md-6<!-- ELSE -->col-md-12<!-- ENDIF allowLocalLogin -->">
|
||||
<div class="alt-login-block">
|
||||
<h4>[[login:alternative_logins]]</h4>
|
||||
<ul class="alt-logins">
|
||||
{{{each authentication}}}
|
||||
<li class="{authentication.name}"><a rel="nofollow noopener noreferrer" target="_top" href="{config.relative_path}{authentication.url}"><i class="fa {authentication.icon} fa-3x"></i></a></li>
|
||||
{{{end}}}
|
||||
</ul>
|
||||
</div>
|
||||
<div data-widget-area="sidebar" class="col-lg-3 col-sm-12 {{{ if !widgets.sidebar.length }}}hidden{{{ end }}}">
|
||||
{{{each widgets.sidebar}}}
|
||||
{{widgets.sidebar.html}}
|
||||
{{{end}}}
|
||||
</div>
|
||||
<!-- ENDIF alternate_logins -->
|
||||
</div>
|
||||
<div data-widget-area="footer">
|
||||
{{{each widgets.footer}}}
|
||||
{{widgets.footer.html}}
|
||||
{{{end}}}
|
||||
</div>
|
@ -1,3 +1,3 @@
|
||||
<div id="taskbar" class="taskbar navbar-fixed-bottom">
|
||||
<div class="navbar-inner"><ul class="nav navbar-nav pull-right"></ul></div>
|
||||
<div class="navbar-inner"><ul class="nav navbar-nav"></ul></div>
|
||||
</div>
|
@ -1,11 +1,41 @@
|
||||
<!-- IF config.loggedIn -->
|
||||
<section class="menu-section" data-section="chats">
|
||||
<h3 class="menu-section-title">
|
||||
[[global:header.chats]]
|
||||
<i class="counter unread-count" component="chat/icon" data-content="{unreadCount.chat}"></i>
|
||||
</h3>
|
||||
<ul class="menu-section-list chat-list" component="chat/list">
|
||||
<a class="navigation-link" href="{relative_path}/user/{user.userslug}/chats">[[modules:chat.see_all]]</a>
|
||||
</ul>
|
||||
</section>
|
||||
<!-- ENDIF config.loggedIn -->
|
||||
{{{ if config.loggedIn }}}
|
||||
<ul class="nav nav-pills">
|
||||
<li>
|
||||
<a href="#notifications" data-toggle="tab"><span class="counter unread-count" component="notifications/icon" data-content="{unreadCount.notification}"></span> <i class="fa fa-fw fa-bell"></i></a>
|
||||
</li>
|
||||
{{{ if !config.disableChat }}}
|
||||
<li>
|
||||
<a href="#chats" data-toggle="tab"><i class="counter unread-count" component="chat/icon" data-content="{unreadCount.chat}"></i> <i class="fa fa-fw fa-comment"></i></a>
|
||||
</li>
|
||||
{{{ end }}}
|
||||
<li class="active">
|
||||
<a href="#profile" data-toggle="tab">
|
||||
{buildAvatar(user, "sm", true, "user-icon")}
|
||||
<i component="user/status" class="fa fa-fw fa-circle status {user.status}"></i>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane fade active in" id="profile">
|
||||
<section class="menu-section" data-section="profile">
|
||||
<ul class="menu-section-list" component="header/usercontrol"></ul>
|
||||
</section>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="notifications">
|
||||
<section class="menu-section" data-section="notifications">
|
||||
<ul class="menu-section-list notification-list-mobile" component="notifications/list"></ul>
|
||||
<p class="menu-section-list"><a href="{relative_path}/notifications">[[notifications:see_all]]</a></p>
|
||||
</section>
|
||||
</div>
|
||||
{{{ if !config.disableChat }}}
|
||||
<div class="tab-pane fade" id="chats">
|
||||
<section class="menu-section" data-section="chats">
|
||||
<ul class="menu-section-list chat-list" component="chat/list">
|
||||
<a class="navigation-link" href="{relative_path}/user/{user.userslug}/chats">[[modules:chat.see_all]]</a>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
{{{ end }}}
|
||||
</div>
|
||||
{{{ end }}}
|
@ -0,0 +1,24 @@
|
||||
<div class="dropdown pull-right">
|
||||
<button class="close" data-toggle="dropdown" component="chat/controlsToggle"><i class="fa fa-gear"></i></button>
|
||||
<ul class="dropdown-menu dropdown-menu-right pull-right" component="chat/controls">
|
||||
<li class="dropdown-header">[[modules:chat.options]]</li>
|
||||
<li>
|
||||
<a href="#" data-action="members"><i class="fa fa-fw fa-cog"></i> [[modules:chat.manage-room]]</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" data-action="rename"><i class="fa fa-fw fa-edit"></i> [[modules:chat.rename-room]]</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" data-action="leave"><i class="fa fa-fw fa-sign-out"></i> [[modules:chat.leave]]</a>
|
||||
</li>
|
||||
<!-- IF users.length -->
|
||||
<li role="separator" class="divider"></li>
|
||||
<li class="dropdown-header">[[modules:chat.in-room]]</li>
|
||||
{{{each users}}}
|
||||
<li>
|
||||
<a href="{config.relative_path}/uid/{../uid}">{buildAvatar(users, "sm", true)} {../username}</a>
|
||||
</li>
|
||||
{{{end}}}
|
||||
<!-- END -->
|
||||
</ul>
|
||||
</div>
|
@ -0,0 +1,50 @@
|
||||
<div id="results" class="search-results col-md-12" data-search-query="{search_query}">
|
||||
<!-- IF matchCount -->
|
||||
<div class="alert alert-info">[[search:results_matching, {matchCount}, {search_query}, {time}]] </div>
|
||||
<!-- ELSE -->
|
||||
<!-- IF search_query -->
|
||||
<div class="alert alert-warning">[[search:no-matches]]</div>
|
||||
<!-- ENDIF search_query -->
|
||||
<!-- ENDIF matchCount -->
|
||||
|
||||
{{{each posts}}}
|
||||
<div class="topic-row panel panel-default clearfix">
|
||||
<div class="panel-body">
|
||||
<a href="{config.relative_path}/user/{posts.user.userslug}">{buildAvatar(posts.user, "sm", true)}</a>
|
||||
<span class="search-result-text search-result-title"><a href="{config.relative_path}/post/{posts.pid}">{posts.topic.title}</a></span>
|
||||
<br/>
|
||||
<!-- IF showAsPosts -->
|
||||
<div class="search-result-text">
|
||||
{posts.content}
|
||||
<p class="fade-out"></p>
|
||||
</div>
|
||||
<!-- ENDIF showAsPosts -->
|
||||
|
||||
<small class="post-info pull-right">
|
||||
<a href="{config.relative_path}/category/{posts.category.slug}"><span class="fa-stack" style="{function.generateCategoryBackground, posts.category}"><i style="color:{posts.category.color};" class="fa {posts.category.icon} fa-stack-1x"></i></span> {posts.category.name}</a> •
|
||||
<span class="timeago" title="{posts.timestampISO}"></span>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
{{{end}}}
|
||||
|
||||
<!-- IF users.length -->
|
||||
<ul id="users-container" class="users-container">
|
||||
<!-- IMPORT partials/users_list.tpl -->
|
||||
</ul>
|
||||
<!-- ENDIF users.length -->
|
||||
|
||||
<!-- IF tags.length -->
|
||||
<!-- IMPORT partials/tags_list.tpl -->
|
||||
<!-- ENDIF tags.length -->
|
||||
|
||||
{{{ if categories.length }}}
|
||||
<ul class="categories">
|
||||
{{{each categories}}}
|
||||
<!-- IMPORT partials/categories/item.tpl -->
|
||||
{{{end}}}
|
||||
</ul>
|
||||
{{{ end }}}
|
||||
|
||||
<!-- IMPORT partials/paginator.tpl -->
|
||||
</div>
|
@ -1,27 +1,4 @@
|
||||
<div class="menu-profile">
|
||||
<!-- IF user.uid -->
|
||||
{buildAvatar(user, "lg", true, "user-icon")}
|
||||
<i component="user/status" class="fa fa-fw fa-circle status {user.status}"></i>
|
||||
<!-- ENDIF user.uid -->
|
||||
</div>
|
||||
|
||||
<section class="menu-section" data-section="navigation">
|
||||
<h3 class="menu-section-title">[[global:header.navigation]]</h3>
|
||||
<ul class="menu-section-list"></ul>
|
||||
</section>
|
||||
|
||||
<!-- IF config.loggedIn -->
|
||||
<section class="menu-section" data-section="profile">
|
||||
<h3 class="menu-section-title">[[global:header.profile]]</h3>
|
||||
<ul class="menu-section-list" component="header/usercontrol"></ul>
|
||||
</section>
|
||||
|
||||
<section class="menu-section" data-section="notifications">
|
||||
<h3 class="menu-section-title">
|
||||
[[global:header.notifications]]
|
||||
<span class="counter unread-count" component="notifications/icon" data-content="{unreadCount.notification}"></span>
|
||||
</h3>
|
||||
<ul class="menu-section-list notification-list-mobile" component="notifications/list"></ul>
|
||||
<p class="menu-section-list"><a href="{relative_path}/notifications">[[notifications:see_all]]</a></p>
|
||||
</section>
|
||||
<!-- ENDIF config.loggedIn -->
|
@ -1,5 +1,5 @@
|
||||
{{{each tags}}}
|
||||
<h3 class="pull-left tag-container">
|
||||
<a href="{config.relative_path}/tags/{tags.valueEscaped}" data-value="{tags.valueEscaped}"><span class="tag-item" data-tag="{tags.valueEscaped}" style="<!-- IF tags.color -->color: {tags.color};<!-- ENDIF tags.color --><!-- IF tags.bgColor -->background-color: {tags.bgColor};<!-- ENDIF tags.bgColor -->">{tags.valueEscaped}</span><span class="tag-topic-count human-readable-number" title="{tags.score}">{tags.score}</span></a>
|
||||
<a href="{config.relative_path}/tags/{tags.valueEncoded}" data-value="{tags.valueEscaped}"><span class="tag-item tag-class-{tags.class}" data-tag="{tags.valueEscaped}">{tags.valueEscaped}</span><span class="tag-topic-count human-readable-number" title="{tags.score}">{tags.score}</span></a>
|
||||
</h3>
|
||||
{{{end}}}
|
@ -1,13 +1 @@
|
||||
<div component="topic/browsing-users" class="inline-block hidden-xs">
|
||||
{{{each browsingUsers}}}
|
||||
<div class="pull-left" data-uid="{browsingUsers.uid}">
|
||||
<a href="<!-- IF browsingUsers.userslug -->{config.relative_path}/user/{browsingUsers.userslug}<!-- ELSE -->#<!-- ENDIF browsingUsers.userslug -->">
|
||||
<!-- IF browsingUsers.picture -->
|
||||
<img class="avatar avatar-sm avatar-rounded" component="user/picture" src="{browsingUsers.picture}" align="left" itemprop="image" title="{browsingUsers.username}"/>
|
||||
<!-- ELSE -->
|
||||
<div class="avatar avatar-sm avatar-rounded" component="user/picture" title="{browsingUsers.username}" style="background-color: {browsingUsers.icon:bgColor};">{browsingUsers.icon:text}</div>
|
||||
<!-- ENDIF browsingUsers.picture -->
|
||||
</a>
|
||||
</div>
|
||||
{{{end}}}
|
||||
</div>
|
||||
<!-- This partial intentionally left blank; overwritten by nodebb-plugin-browsing-users -->
|
@ -1,25 +0,0 @@
|
||||
<li component="topic/event" class="timeline-event" data-topic-event-id="{id}">
|
||||
<div class="timeline-badge">
|
||||
<i class="fa {{{ if icon }}}{icon}{{{ else }}}fa-circle{{{ end }}}"></i>
|
||||
</div>
|
||||
<span class="timeline-text">
|
||||
{{{ if ../href }}}
|
||||
<a href="{config.relative_path}{../href}">{../text}</a>
|
||||
{{{ else }}}
|
||||
{text}
|
||||
{{{ end }}}
|
||||
</span>
|
||||
|
||||
{{{ if user }}}
|
||||
{{{ if !./user.system }}}<span><a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(user, "xs", true)} {./user.username}</a></span> {{{ end }}}
|
||||
{{{ if ./user.system }}}<span class="timeline-text">[[global:system-user]]</span> {{{ end }}}
|
||||
{{{ else }}}
|
||||
<span class="timeline-text">[[global:unknown-user]]</span>
|
||||
{{{ end }}}
|
||||
|
||||
<span class="timeago timeline-text" title="{timestampISO}"></span>
|
||||
|
||||
{{{ if isAdminOrMod}}}
|
||||
<span component="topic/event/delete" data-topic-event-id="{id}" class="timeline-text pointer" title="[[topic:delete-event]]"><i class="fa fa-trash"></i></span>
|
||||
{{{ end }}}
|
||||
</li>
|
@ -1,4 +1,4 @@
|
||||
<span component="post/tools" class="dropdown moderator-tools bottom-sheet <!-- IF !posts.display_post_menu -->hidden<!-- ENDIF !posts.display_post_menu -->">
|
||||
<a href="#" data-toggle="dropdown" data-ajaxify="false"><i class="fa fa-fw fa-ellipsis-v"></i></a>
|
||||
<ul class="dropdown-menu dropdown-menu-right" role="menu"></ul>
|
||||
<ul class="dropdown-menu dropdown-menu-right hidden" role="menu"></ul>
|
||||
</span>
|
||||
|
@ -0,0 +1 @@
|
||||
<!-- This partial intentionally left blank; overwritten by nodebb-plugin-reactions -->
|
@ -0,0 +1,3 @@
|
||||
<div component="selection/tooltip" class="selection-tooltip-container">
|
||||
<button component="selection/tooltip/quote" class="btn btn-sm btn-primary quote-tooltip-btn">[[topic:quote]]</button>
|
||||
</div>
|
@ -1,5 +1,5 @@
|
||||
{{{each tags}}}
|
||||
<a href="{config.relative_path}/tags/{tags.value}">
|
||||
<span class="tag tag-item tag-{tags.valueEscaped}" data-tag="{tags.value}" style="<!-- IF tags.color -->color: {tags.color};<!-- ENDIF tags.color --><!-- IF tags.bgColor -->background-color: {tags.bgColor};<!-- ENDIF tags.bgColor -->">{tags.valueEscaped}</span>
|
||||
<a href="{config.relative_path}/tags/{tags.valueEncoded}">
|
||||
<span class="tag tag-item tag-class-{tags.class}" data-tag="{tags.value}">{tags.valueEscaped}</span>
|
||||
</a>
|
||||
{{{end}}}
|
@ -1,71 +1,87 @@
|
||||
<!-- IMPORT partials/breadcrumbs.tpl -->
|
||||
|
||||
<div data-widget-area="header">
|
||||
{{{each widgets.header}}}
|
||||
{{widgets.header.html}}
|
||||
{{{end}}}
|
||||
</div>
|
||||
<div class="row register">
|
||||
<div class="{register_window:spansize}">
|
||||
<div class="register-block">
|
||||
<div class="alert alert-danger<!-- IF !error --> hidden<!-- ENDIF !error -->" id="register-error-notify" >
|
||||
<strong>[[error:registration-error]]</strong>
|
||||
<p>{error}</p>
|
||||
</div>
|
||||
<form component="register/local" class="form-horizontal" role="form" action="{config.relative_path}/register" method="post">
|
||||
<div class="form-group">
|
||||
<label for="username" class="col-lg-4 control-label">[[register:username]]</label>
|
||||
<div class="col-lg-8">
|
||||
<input class="form-control" type="text" placeholder="[[register:username_placeholder]]" name="username" id="username" autocorrect="off" autocapitalize="off" autocomplete="off" />
|
||||
<span class="register-feedback" id="username-notify"></span>
|
||||
<span class="help-block">[[register:help.username_restrictions, {minimumUsernameLength}, {maximumUsernameLength}]]</span>
|
||||
</div>
|
||||
<div class="row {{{ if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
|
||||
<div class="{register_window:spansize}">
|
||||
<div class="register-block">
|
||||
<div class="alert alert-danger<!-- IF !error --> hidden<!-- ENDIF !error -->" id="register-error-notify" >
|
||||
<strong>[[error:registration-error]]</strong>
|
||||
<p>{error}</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password" class="col-lg-4 control-label">[[register:password]]</label>
|
||||
<div class="col-lg-8">
|
||||
<input class="form-control" type="password" placeholder="[[register:password_placeholder]]" name="password" id="password" />
|
||||
<span class="register-feedback" id="password-notify"></span>
|
||||
<span class="help-block">[[register:help.minimum_password_length, {minimumPasswordLength}]]</span>
|
||||
<p id="caps-lock-warning" class="text-danger hidden">
|
||||
<i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
|
||||
</p>
|
||||
<form component="register/local" class="form-horizontal" role="form" action="{config.relative_path}/register" method="post">
|
||||
<div class="form-group">
|
||||
<label for="username" class="col-lg-4 control-label">[[register:username]]</label>
|
||||
<div class="col-lg-8">
|
||||
<input class="form-control" type="text" placeholder="[[register:username_placeholder]]" name="username" id="username" autocorrect="off" autocapitalize="off" autocomplete="off" />
|
||||
<span class="register-feedback" id="username-notify"></span>
|
||||
<span class="help-block">[[register:help.username_restrictions, {minimumUsernameLength}, {maximumUsernameLength}]]</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password-confirm" class="col-lg-4 control-label">[[register:confirm_password]]</label>
|
||||
<div class="col-lg-8">
|
||||
<input class="form-control" type="password" placeholder="[[register:confirm_password_placeholder]]" name="password-confirm" id="password-confirm" />
|
||||
<span class="register-feedback" id="password-confirm-notify"></span>
|
||||
<div class="form-group">
|
||||
<label for="password" class="col-lg-4 control-label">[[register:password]]</label>
|
||||
<div class="col-lg-8">
|
||||
<input class="form-control" type="password" placeholder="[[register:password_placeholder]]" name="password" id="password" />
|
||||
<span class="register-feedback" id="password-notify"></span>
|
||||
<span class="help-block">[[register:help.minimum_password_length, {minimumPasswordLength}]]</span>
|
||||
<p id="caps-lock-warning" class="text-danger hidden">
|
||||
<i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password-confirm" class="col-lg-4 control-label">[[register:confirm_password]]</label>
|
||||
<div class="col-lg-8">
|
||||
<input class="form-control" type="password" placeholder="[[register:confirm_password_placeholder]]" name="password-confirm" id="password-confirm" />
|
||||
<span class="register-feedback" id="password-confirm-notify"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{{each regFormEntry}}}
|
||||
<div class="form-group">
|
||||
<label for="register-{regFormEntry.styleName}" class="col-lg-4 control-label">{regFormEntry.label}</label>
|
||||
<div id="register-{regFormEntry.styleName}" class="col-lg-8">
|
||||
{{regFormEntry.html}}
|
||||
{{{each regFormEntry}}}
|
||||
<div class="form-group">
|
||||
<label for="register-{regFormEntry.styleName}" class="col-lg-4 control-label">{regFormEntry.label}</label>
|
||||
<div id="register-{regFormEntry.styleName}" class="col-lg-8">
|
||||
{{regFormEntry.html}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{{end}}}
|
||||
{{{end}}}
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-lg-offset-4 col-lg-8">
|
||||
<button class="btn btn-primary btn-lg btn-block" id="register" type="submit">[[register:register_now_button]]</button>
|
||||
<div class="form-group">
|
||||
<div class="col-lg-offset-4 col-lg-8">
|
||||
<button class="btn btn-primary btn-lg btn-block" id="register" type="submit">[[register:register_now_button]]</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input id="token" type="hidden" name="token" value="" />
|
||||
<input id="noscript" type="hidden" name="noscript" value="true" />
|
||||
<input type="hidden" name="_csrf" value="{config.csrf_token}" />
|
||||
</form>
|
||||
<input id="token" type="hidden" name="token" value="" />
|
||||
<input id="noscript" type="hidden" name="noscript" value="true" />
|
||||
<input type="hidden" name="_csrf" value="{config.csrf_token}" />
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF alternate_logins -->
|
||||
<div class="col-md-6">
|
||||
<div class="alt-register-block">
|
||||
<h4>[[register:alternative_registration]]</h4>
|
||||
<ul class="alt-logins">
|
||||
{{{each authentication}}}
|
||||
<li class="{authentication.name}"><a rel="nofollow noopener noreferrer" target="_top" href="{config.relative_path}{authentication.url}"><i class="fa {authentication.icon} fa-3x"></i></i></a></li>
|
||||
{{{end}}}
|
||||
</ul>
|
||||
{{{ if alternate_logins }}}
|
||||
<div class="col-md-6">
|
||||
<div class="alt-register-block">
|
||||
<h4>[[register:alternative_registration]]</h4>
|
||||
<ul class="alt-logins">
|
||||
{{{each authentication}}}
|
||||
<li class="{authentication.name}"><a rel="nofollow noopener noreferrer" target="_top" href="{config.relative_path}{authentication.url}"><i class="fa {authentication.icon} fa-3x"></i></i></a></li>
|
||||
{{{end}}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{{{ end }}}
|
||||
</div>
|
||||
<div data-widget-area="sidebar" class="col-lg-3 col-sm-12 {{{ if !widgets.sidebar.length }}}hidden{{{ end }}}">
|
||||
{{{each widgets.sidebar}}}
|
||||
{{widgets.sidebar.html}}
|
||||
{{{end}}}
|
||||
</div>
|
||||
<!-- ENDIF alternate_logins -->
|
||||
</div>
|
||||
<div data-widget-area="footer">
|
||||
{{{each widgets.footer}}}
|
||||
{{widgets.footer.html}}
|
||||
{{{end}}}
|
||||
</div>
|
@ -1,6 +1,14 @@
|
||||
{{{ if !error }}}
|
||||
<div class="alert alert-success">
|
||||
<strong>[[global:alert.success]]</strong>
|
||||
<p>[[email:unsub.success, {payload.template}]]</p>
|
||||
{{{ else }}}
|
||||
<div class="alert alert-warning">
|
||||
<strong>[[email:unsub.failure.title]]</strong>
|
||||
<p>[[email:unsub.failure.message, {error}, {config.relative_path}/me/settings]]</p>
|
||||
{{{ end }}}
|
||||
<hr />
|
||||
|
||||
<p>
|
||||
<a href="{config.relative_path}/">[[notifications:back_to_home, {config.siteTitle}]]</a>
|
||||
</p>
|
||||
|
Loading…
Reference in New Issue