mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-15 10:16:12 +01:00
Split up customJS into customHTML and customJS for better organisation (#5981)
* WIP * fixed customJS not actually working in footer * Moving scripts to footer, #5980 * Added upgrade scripts for #5980
This commit is contained in:
@@ -3,8 +3,12 @@
|
|||||||
"custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.",
|
"custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.",
|
||||||
"custom-css.enable": "Enable Custom CSS",
|
"custom-css.enable": "Enable Custom CSS",
|
||||||
|
|
||||||
|
"custom-js": "Custom Javascript",
|
||||||
|
"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
|
||||||
|
"custom-js.enable": "Enable Custom Javascript",
|
||||||
|
|
||||||
"custom-header": "Custom Header",
|
"custom-header": "Custom Header",
|
||||||
"custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup.",
|
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
||||||
"custom-header.enable": "Enable Custom Header",
|
"custom-header.enable": "Enable Custom Header",
|
||||||
|
|
||||||
"custom-css.livereload": "Enable Live Reload",
|
"custom-css.livereload": "Enable Live Reload",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#customCSS, #customHTML, #email-editor {
|
#customCSS, #customJS, #customHTML, #email-editor {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 450px;
|
height: 450px;
|
||||||
display: block;
|
display: block;
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ define('admin/appearance/customise', ['admin/settings', 'ace/ace'], function (Se
|
|||||||
Customise.init = function () {
|
Customise.init = function () {
|
||||||
Settings.prepare(function () {
|
Settings.prepare(function () {
|
||||||
$('#customCSS').text($('#customCSS-holder').val());
|
$('#customCSS').text($('#customCSS-holder').val());
|
||||||
|
$('#customJS').text($('#customJS-holder').val());
|
||||||
$('#customHTML').text($('#customHTML-holder').val());
|
$('#customHTML').text($('#customHTML-holder').val());
|
||||||
|
|
||||||
var customCSS = ace.edit('customCSS');
|
var customCSS = ace.edit('customCSS');
|
||||||
|
var customJS = ace.edit('customJS');
|
||||||
var customHTML = ace.edit('customHTML');
|
var customHTML = ace.edit('customHTML');
|
||||||
|
|
||||||
customCSS.setTheme('ace/theme/twilight');
|
customCSS.setTheme('ace/theme/twilight');
|
||||||
@@ -20,6 +22,15 @@ define('admin/appearance/customise', ['admin/settings', 'ace/ace'], function (Se
|
|||||||
$('#customCSS-holder').val(customCSS.getValue());
|
$('#customCSS-holder').val(customCSS.getValue());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
customJS.setTheme('ace/theme/twilight');
|
||||||
|
customJS.getSession().setMode('ace/mode/js');
|
||||||
|
|
||||||
|
customJS.on('change', function () {
|
||||||
|
app.flags = app.flags || {};
|
||||||
|
app.flags._unsaved = true;
|
||||||
|
$('#customJS-holder').val(customJS.getValue());
|
||||||
|
});
|
||||||
|
|
||||||
customHTML.setTheme('ace/theme/twilight');
|
customHTML.setTheme('ace/theme/twilight');
|
||||||
customHTML.getSession().setMode('ace/mode/html');
|
customHTML.getSession().setMode('ace/mode/html');
|
||||||
|
|
||||||
|
|||||||
@@ -65,9 +65,6 @@ module.exports = function (middleware) {
|
|||||||
async.waterfall([
|
async.waterfall([
|
||||||
function (next) {
|
function (next) {
|
||||||
async.parallel({
|
async.parallel({
|
||||||
scripts: function (next) {
|
|
||||||
plugins.fireHook('filter:scripts.get', [], next);
|
|
||||||
},
|
|
||||||
isAdmin: function (next) {
|
isAdmin: function (next) {
|
||||||
user.isAdministrator(req.uid, next);
|
user.isAdministrator(req.uid, next);
|
||||||
},
|
},
|
||||||
@@ -143,8 +140,8 @@ module.exports = function (middleware) {
|
|||||||
templateValues.userJSON = JSON.stringify(results.user);
|
templateValues.userJSON = JSON.stringify(results.user);
|
||||||
templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1 && meta.config.customCSS;
|
templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1 && meta.config.customCSS;
|
||||||
templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : '';
|
templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : '';
|
||||||
templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1;
|
templateValues.useCustomHTML = parseInt(meta.config.useCustomHTML, 10) === 1;
|
||||||
templateValues.customJS = templateValues.useCustomJS ? meta.config.customJS : '';
|
templateValues.customHTML = templateValues.useCustomHTML ? meta.config.customHTML : '';
|
||||||
templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin;
|
templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin;
|
||||||
templateValues.defaultLang = meta.config.defaultLang || 'en-GB';
|
templateValues.defaultLang = meta.config.defaultLang || 'en-GB';
|
||||||
templateValues.userLang = res.locals.config.userLang;
|
templateValues.userLang = res.locals.config.userLang;
|
||||||
@@ -155,12 +152,6 @@ module.exports = function (middleware) {
|
|||||||
templateValues.template = { name: res.locals.template };
|
templateValues.template = { name: res.locals.template };
|
||||||
templateValues.template[res.locals.template] = true;
|
templateValues.template[res.locals.template] = true;
|
||||||
|
|
||||||
templateValues.scripts = results.scripts.map(function (script) {
|
|
||||||
return { src: script };
|
|
||||||
});
|
|
||||||
|
|
||||||
addTimeagoLocaleScript(templateValues.scripts, res.locals.config.userLang);
|
|
||||||
|
|
||||||
if (req.route && req.route.path === '/') {
|
if (req.route && req.route.path === '/') {
|
||||||
modifyTitle(templateValues);
|
modifyTitle(templateValues);
|
||||||
}
|
}
|
||||||
@@ -192,6 +183,21 @@ module.exports = function (middleware) {
|
|||||||
}, next);
|
}, next);
|
||||||
},
|
},
|
||||||
function (data, next) {
|
function (data, next) {
|
||||||
|
async.parallel({
|
||||||
|
scripts: async.apply(plugins.fireHook, 'filter:scripts.get', []),
|
||||||
|
}, function (err, results) {
|
||||||
|
next(err, data, results);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
function (data, results, next) {
|
||||||
|
data.templateValues.scripts = results.scripts.map(function (script) {
|
||||||
|
return { src: script };
|
||||||
|
});
|
||||||
|
addTimeagoLocaleScript(data.templateValues.scripts, res.locals.config.userLang);
|
||||||
|
|
||||||
|
data.templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1;
|
||||||
|
data.templateValues.customJS = data.templateValues.useCustomJS ? meta.config.customJS : '';
|
||||||
|
|
||||||
req.app.render('footer', data.templateValues, next);
|
req.app.render('footer', data.templateValues, next);
|
||||||
},
|
},
|
||||||
], callback);
|
], callback);
|
||||||
|
|||||||
37
src/upgrades/1.7.0/generate-custom-html.js
Normal file
37
src/upgrades/1.7.0/generate-custom-html.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var meta = require('../../meta');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: 'Generate customHTML block from old customJS setting',
|
||||||
|
timestamp: Date.UTC(2017, 9, 12),
|
||||||
|
method: function (callback) {
|
||||||
|
var newHTML = meta.config.customJS;
|
||||||
|
var newJS = [];
|
||||||
|
|
||||||
|
// Forgive me for parsing HTML with regex...
|
||||||
|
var scriptMatch = /^<script\s?(?!async|deferred)?>([\s\S]+?)<\/script>/m;
|
||||||
|
var match = scriptMatch.exec(newHTML);
|
||||||
|
|
||||||
|
while (match) {
|
||||||
|
if (match[1]) {
|
||||||
|
// Append to newJS array
|
||||||
|
newJS.push(match[1].trim());
|
||||||
|
|
||||||
|
// Remove the match from the existing value
|
||||||
|
newHTML = ((match.index > 0 ? newHTML.slice(0, match.index) : '') + newHTML.slice(match.index + match[0].length)).trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
match = scriptMatch.exec(newHTML);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Combine newJS array
|
||||||
|
newJS = newJS.join('\n\n');
|
||||||
|
|
||||||
|
// Write both values to config
|
||||||
|
meta.configs.setMultiple({
|
||||||
|
customHTML: newHTML,
|
||||||
|
customJS: newJS,
|
||||||
|
}, callback);
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
<div id="customise" class="customise">
|
<div id="customise" class="customise">
|
||||||
<ul class="nav nav-pills">
|
<ul class="nav nav-pills">
|
||||||
<li class="active"><a href="#custom-css" data-toggle="tab">[[admin/appearance/customise:custom-css]]</a></li>
|
<li class="active"><a href="#custom-css" data-toggle="tab">[[admin/appearance/customise:custom-css]]</a></li>
|
||||||
|
<li><a href="#custom-js" data-toggle="tab">[[admin/appearance/customise:custom-js]]</a></li>
|
||||||
<li><a href="#custom-header" data-toggle="tab">[[admin/appearance/customise:custom-header]]</a></li>
|
<li><a href="#custom-header" data-toggle="tab">[[admin/appearance/customise:custom-header]]</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<br />
|
<br />
|
||||||
@@ -23,19 +24,37 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane fade" id="custom-header">
|
<div class="tab-pane fade" id="custom-js">
|
||||||
<p>
|
<p>
|
||||||
[[admin/appearance/customise:custom-header.description]]
|
[[admin/appearance/customise:custom-js.description]]
|
||||||
</p>
|
</p>
|
||||||
|
<div id="customJS"></div>
|
||||||
<div id="customHTML"></div>
|
<input type="hidden" id="customJS-holder" value="" data-field="customJS" />
|
||||||
<input type="hidden" id="customHTML-holder" value="" data-field="customJS" />
|
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
<form class="form">
|
<form class="form">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="useCustomJS">
|
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="useCustomJS">
|
||||||
<input class="mdl-switch__input" id="useCustomJS" type="checkbox" data-field="useCustomJS" />
|
<input class="mdl-switch__input" id="useCustomJS" type="checkbox" data-field="useCustomJS" />
|
||||||
|
<span class="mdl-switch__label">[[admin/appearance/customise:custom-js.enable]]</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane fade" id="custom-header">
|
||||||
|
<p>
|
||||||
|
[[admin/appearance/customise:custom-header.description]]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div id="customHTML"></div>
|
||||||
|
<input type="hidden" id="customHTML-holder" value="" data-field="customHTML" />
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<form class="form">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="useCustomHTML">
|
||||||
|
<input class="mdl-switch__input" id="useCustomHTML" type="checkbox" data-field="useCustomHTML" />
|
||||||
<span class="mdl-switch__label">[[admin/appearance/customise:custom-header.enable]]</span>
|
<span class="mdl-switch__label">[[admin/appearance/customise:custom-header.enable]]</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user