Merge branch 'v12.x'
commit
ba39ceabe0
@ -1,4 +1,10 @@
|
|||||||
{
|
{
|
||||||
"mobile-menu-side": "Switch which side each mobile menu is on",
|
"settings.title": "Theme settings",
|
||||||
"post-quick-reply": "Post quick reply"
|
"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"
|
||||||
|
}
|
@ -1,24 +1,15 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
/* globals $, app */
|
|
||||||
|
|
||||||
define('admin/plugins/persona', ['settings'], function(Settings) {
|
|
||||||
|
|
||||||
|
define('admin/plugins/persona', ['settings'], function (Settings) {
|
||||||
var ACP = {};
|
var ACP = {};
|
||||||
|
|
||||||
ACP.init = function() {
|
ACP.init = function () {
|
||||||
Settings.load('persona', $('.persona-settings'));
|
Settings.load('persona', $('.persona-settings'));
|
||||||
|
|
||||||
$('#save').on('click', function() {
|
$('#save').on('click', function () {
|
||||||
Settings.save('persona', $('.persona-settings'), function() {
|
Settings.save('persona', $('.persona-settings'));
|
||||||
app.alert({
|
|
||||||
type: 'success',
|
|
||||||
alert_id: 'persona-saved',
|
|
||||||
title: 'Settings Saved',
|
|
||||||
message: 'Persona settings saved'
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
return ACP;
|
return ACP;
|
||||||
});
|
});
|
||||||
|
@ -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 -->
|
<!-- IMPORT partials/breadcrumbs.tpl -->
|
||||||
|
<div data-widget-area="header">
|
||||||
<div class="row">
|
{{{each widgets.header}}}
|
||||||
<!-- IF allowLocalLogin -->
|
{{widgets.header.html}}
|
||||||
<div class="<!-- IF alternate_logins -->col-md-6<!-- ELSE -->col-md-12<!-- ENDIF alternate_logins -->">
|
{{{end}}}
|
||||||
<div class="login-block">
|
</div>
|
||||||
<div class="alert alert-danger" id="login-error-notify" <!-- IF error -->style="display:block"<!-- ELSE -->style="display: none;"<!-- ENDIF error -->>
|
<div class="row login">
|
||||||
<button type="button" class="close" data-dismiss="alert">×</button>
|
<div class="{{{ if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
|
||||||
<strong>[[login:failed_login_attempt]]</strong>
|
<div class="row">
|
||||||
<p>{error}</p>
|
{{{ if allowLocalLogin }}}
|
||||||
</div>
|
<div class="{{{ if alternate_logins }}}col-md-6{{{ else }}}col-md-12{{{ end }}}">
|
||||||
|
<div class="login-block">
|
||||||
<form class="form-horizontal" role="form" method="post" id="login-form">
|
<div class="alert alert-danger" id="login-error-notify" <!-- IF error -->style="display:block"<!-- ELSE -->style="display: none;"<!-- ENDIF error -->>
|
||||||
<div class="form-group">
|
<button type="button" class="close" data-dismiss="alert">×</button>
|
||||||
<label for="username" class="col-lg-2 control-label">{allowLoginWith}</label>
|
<strong>[[login:failed_login_attempt]]</strong>
|
||||||
<div class="col-lg-10">
|
<p>{error}</p>
|
||||||
<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>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
<form class="form-horizontal" role="form" method="post" id="login-form">
|
||||||
<div class="col-lg-offset-2 col-lg-10">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<label for="username" class="col-lg-2 control-label">{allowLoginWith}</label>
|
||||||
<label>
|
<div class="col-lg-10">
|
||||||
<input type="checkbox" name="remember" id="remember" checked /> [[login:remember_me]]
|
<input class="form-control" type="text" placeholder="{allowLoginWith}" name="username" id="username" autocorrect="off" autocapitalize="off" value="{username}"/>
|
||||||
</label>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="form-group">
|
||||||
</div>
|
<label for="password" class="col-lg-2 control-label">[[user:password]]</label>
|
||||||
{{{each loginFormEntry}}}
|
<div class="col-lg-10">
|
||||||
<div class="form-group loginFormEntry">
|
<input class="form-control" type="password" placeholder="[[user:password]]" name="password" id="password" <!-- IF username -->autocomplete="off"<!-- ENDIF username -->/>
|
||||||
<label for="login-{loginFormEntry.styleName}" class="col-lg-4 control-label">{loginFormEntry.label}</label>
|
<p id="caps-lock-warning" class="text-danger hidden">
|
||||||
<div id="login-{loginFormEntry.styleName}" class="col-lg-8">{{loginFormEntry.html}}</div>
|
<i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
|
||||||
</div>
|
</p>
|
||||||
{{{end}}}
|
</div>
|
||||||
<input type="hidden" name="_csrf" value="{config.csrf_token}" />
|
</div>
|
||||||
<input type="hidden" name="noscript" id="noscript" value="true" />
|
<div class="form-group">
|
||||||
<div class="form-group">
|
<div class="col-lg-offset-2 col-lg-10">
|
||||||
<div class="col-lg-offset-2 col-lg-10">
|
<div class="checkbox">
|
||||||
<button class="btn btn-primary btn-lg btn-block" id="login" type="submit">[[global:login]]</button>
|
<label>
|
||||||
<!-- IF allowRegistration -->
|
<input type="checkbox" name="remember" id="remember" checked /> [[login:remember_me]]
|
||||||
<span>[[login:dont_have_account]] <a href="{config.relative_path}/register">[[register:register]]</a></span>
|
</label>
|
||||||
<!-- ENDIF allowRegistration -->
|
</div>
|
||||||
<!-- IF allowPasswordReset -->
|
</div>
|
||||||
<a id="reset-link" href="{config.relative_path}/reset">[[login:forgot_password]]</a>
|
</div>
|
||||||
<!-- ENDIF allowPasswordReset -->
|
{{{each loginFormEntry}}}
|
||||||
</div>
|
<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>
|
</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>
|
||||||
</div>
|
</div>
|
||||||
<!-- ENDIF allowLocalLogin -->
|
<div data-widget-area="sidebar" class="col-lg-3 col-sm-12 {{{ if !widgets.sidebar.length }}}hidden{{{ end }}}">
|
||||||
|
{{{each widgets.sidebar}}}
|
||||||
<!-- IF alternate_logins -->
|
{{widgets.sidebar.html}}
|
||||||
<div class="<!-- IF allowLocalLogin -->col-md-6<!-- ELSE -->col-md-12<!-- ENDIF allowLocalLogin -->">
|
{{{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>
|
</div>
|
||||||
<!-- ENDIF alternate_logins -->
|
|
||||||
</div>
|
</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 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>
|
</div>
|
@ -1,11 +1,41 @@
|
|||||||
<!-- IF config.loggedIn -->
|
{{{ if config.loggedIn }}}
|
||||||
<section class="menu-section" data-section="chats">
|
<ul class="nav nav-pills">
|
||||||
<h3 class="menu-section-title">
|
<li>
|
||||||
[[global:header.chats]]
|
<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>
|
||||||
<i class="counter unread-count" component="chat/icon" data-content="{unreadCount.chat}"></i>
|
</li>
|
||||||
</h3>
|
{{{ if !config.disableChat }}}
|
||||||
<ul class="menu-section-list chat-list" component="chat/list">
|
<li>
|
||||||
<a class="navigation-link" href="{relative_path}/user/{user.userslug}/chats">[[modules:chat.see_all]]</a>
|
<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>
|
||||||
</ul>
|
</li>
|
||||||
</section>
|
{{{ end }}}
|
||||||
<!-- ENDIF config.loggedIn -->
|
<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">
|
<section class="menu-section" data-section="navigation">
|
||||||
<h3 class="menu-section-title">[[global:header.navigation]]</h3>
|
|
||||||
<ul class="menu-section-list"></ul>
|
<ul class="menu-section-list"></ul>
|
||||||
</section>
|
</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}}}
|
{{{each tags}}}
|
||||||
<h3 class="pull-left tag-container">
|
<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>
|
</h3>
|
||||||
{{{end}}}
|
{{{end}}}
|
@ -1,13 +1 @@
|
|||||||
<div component="topic/browsing-users" class="inline-block hidden-xs">
|
<!-- This partial intentionally left blank; overwritten by nodebb-plugin-browsing-users -->
|
||||||
{{{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>
|
|
@ -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 -->">
|
<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>
|
<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>
|
</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}}}
|
{{{each tags}}}
|
||||||
<a href="{config.relative_path}/tags/{tags.value}">
|
<a href="{config.relative_path}/tags/{tags.valueEncoded}">
|
||||||
<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>
|
<span class="tag tag-item tag-class-{tags.class}" data-tag="{tags.value}">{tags.valueEscaped}</span>
|
||||||
</a>
|
</a>
|
||||||
{{{end}}}
|
{{{end}}}
|
@ -1,71 +1,87 @@
|
|||||||
<!-- IMPORT partials/breadcrumbs.tpl -->
|
<!-- IMPORT partials/breadcrumbs.tpl -->
|
||||||
|
<div data-widget-area="header">
|
||||||
|
{{{each widgets.header}}}
|
||||||
|
{{widgets.header.html}}
|
||||||
|
{{{end}}}
|
||||||
|
</div>
|
||||||
<div class="row register">
|
<div class="row register">
|
||||||
<div class="{register_window:spansize}">
|
<div class="row {{{ if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
|
||||||
<div class="register-block">
|
<div class="{register_window:spansize}">
|
||||||
<div class="alert alert-danger<!-- IF !error --> hidden<!-- ENDIF !error -->" id="register-error-notify" >
|
<div class="register-block">
|
||||||
<strong>[[error:registration-error]]</strong>
|
<div class="alert alert-danger<!-- IF !error --> hidden<!-- ENDIF !error -->" id="register-error-notify" >
|
||||||
<p>{error}</p>
|
<strong>[[error:registration-error]]</strong>
|
||||||
</div>
|
<p>{error}</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">
|
<form component="register/local" class="form-horizontal" role="form" action="{config.relative_path}/register" method="post">
|
||||||
<label for="password" class="col-lg-4 control-label">[[register:password]]</label>
|
<div class="form-group">
|
||||||
<div class="col-lg-8">
|
<label for="username" class="col-lg-4 control-label">[[register:username]]</label>
|
||||||
<input class="form-control" type="password" placeholder="[[register:password_placeholder]]" name="password" id="password" />
|
<div class="col-lg-8">
|
||||||
<span class="register-feedback" id="password-notify"></span>
|
<input class="form-control" type="text" placeholder="[[register:username_placeholder]]" name="username" id="username" autocorrect="off" autocapitalize="off" autocomplete="off" />
|
||||||
<span class="help-block">[[register:help.minimum_password_length, {minimumPasswordLength}]]</span>
|
<span class="register-feedback" id="username-notify"></span>
|
||||||
<p id="caps-lock-warning" class="text-danger hidden">
|
<span class="help-block">[[register:help.username_restrictions, {minimumUsernameLength}, {maximumUsernameLength}]]</span>
|
||||||
<i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
|
</div>
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="form-group">
|
||||||
<div class="form-group">
|
<label for="password" class="col-lg-4 control-label">[[register:password]]</label>
|
||||||
<label for="password-confirm" class="col-lg-4 control-label">[[register:confirm_password]]</label>
|
<div class="col-lg-8">
|
||||||
<div class="col-lg-8">
|
<input class="form-control" type="password" placeholder="[[register:password_placeholder]]" name="password" id="password" />
|
||||||
<input class="form-control" type="password" placeholder="[[register:confirm_password_placeholder]]" name="password-confirm" id="password-confirm" />
|
<span class="register-feedback" id="password-notify"></span>
|
||||||
<span class="register-feedback" id="password-confirm-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>
|
||||||
</div>
|
|
||||||
|
|
||||||
{{{each regFormEntry}}}
|
{{{each regFormEntry}}}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="register-{regFormEntry.styleName}" class="col-lg-4 control-label">{regFormEntry.label}</label>
|
<label for="register-{regFormEntry.styleName}" class="col-lg-4 control-label">{regFormEntry.label}</label>
|
||||||
<div id="register-{regFormEntry.styleName}" class="col-lg-8">
|
<div id="register-{regFormEntry.styleName}" class="col-lg-8">
|
||||||
{{regFormEntry.html}}
|
{{regFormEntry.html}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{{{end}}}
|
||||||
{{{end}}}
|
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-lg-offset-4 col-lg-8">
|
<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>
|
<button class="btn btn-primary btn-lg btn-block" id="register" type="submit">[[register:register_now_button]]</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<input id="token" type="hidden" name="token" value="" />
|
||||||
<input id="token" type="hidden" name="token" value="" />
|
<input id="noscript" type="hidden" name="noscript" value="true" />
|
||||||
<input id="noscript" type="hidden" name="noscript" value="true" />
|
<input type="hidden" name="_csrf" value="{config.csrf_token}" />
|
||||||
<input type="hidden" name="_csrf" value="{config.csrf_token}" />
|
</form>
|
||||||
</form>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- IF alternate_logins -->
|
{{{ if alternate_logins }}}
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="alt-register-block">
|
<div class="alt-register-block">
|
||||||
<h4>[[register:alternative_registration]]</h4>
|
<h4>[[register:alternative_registration]]</h4>
|
||||||
<ul class="alt-logins">
|
<ul class="alt-logins">
|
||||||
{{{each authentication}}}
|
{{{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>
|
<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}}}
|
{{{end}}}
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
</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>
|
</div>
|
||||||
<!-- ENDIF alternate_logins -->
|
|
||||||
</div>
|
</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">
|
<div class="alert alert-success">
|
||||||
<strong>[[global:alert.success]]</strong>
|
<strong>[[global:alert.success]]</strong>
|
||||||
<p>[[email:unsub.success, {payload.template}]]</p>
|
<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>
|
<p>
|
||||||
<a href="{config.relative_path}/">[[notifications:back_to_home, {config.siteTitle}]]</a>
|
<a href="{config.relative_path}/">[[notifications:back_to_home, {config.siteTitle}]]</a>
|
||||||
</p>
|
</p>
|
||||||
|
Loading…
Reference in New Issue