From 68cb1350f24e5348f86b482fabb56eb6205b8b98 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 5 Mar 2015 15:41:35 -0500 Subject: [PATCH 001/102] added instructions to grabbing theme versions --- CONTRIBUTING.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c602661541..5223929285 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,6 +50,15 @@ $ git rev-parse HEAD If you have downloaded the `.zip` or `.tar.gz` packages from GitHub (or elsewhere), please let us know. +## Provide theme versions if issue is related to the theme/display + +``` bash +$ npm ls nodebb-theme-vanilla nodebb-theme-lavender +nodebb@0.7.0-dev /home/julian/Projects/nodebb/forum +├── nodebb-theme-lavender@0.2.13 +└── nodebb-theme-vanilla@0.2.35 +``` + ## Attempt to use `git bisect` If you have installed NodeBB via GitHub clone, are familiar with utilising git, and are willing to help us narrow down the specific commit that causes a bug, consider running `git bisect`. From e5343b7efc51f7a7e767135016b0da48fa84686a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 5 Mar 2015 16:21:52 -0500 Subject: [PATCH 002/102] dont display cluster warning if not running as cluster --- src/socket.io/index.js | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index aed324d520..d2f97f8186 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -163,34 +163,32 @@ function requireModules() { }); } -function authorize(socket, next) { +function authorize(socket, callback) { var handshake = socket.request, sessionID; if (!handshake) { - return next(new Error('[[error:not-authorized]]')); + return callback(new Error('[[error:not-authorized]]')); } - - cookieParser(handshake, {}, function(err) { - if (err) { - return next(err); - } - - var sessionID = handshake.signedCookies['express.sid']; - - db.sessionStore.get(sessionID, function(err, sessionData) { - if (err) { - return next(err); - } - + + async.waterfall([ + function(next) { + cookieParser(handshake, {}, next); + }, + function(next) { + var sessionID = handshake.signedCookies['express.sid']; + console.log(next, sessionID) + db.sessionStore.get(sessionID, next); + }, + function(sessionData, next) { if (sessionData && sessionData.passport && sessionData.passport.user) { socket.uid = parseInt(sessionData.passport.user, 10); } else { socket.uid = 0; } next(); - }); - }); + } + ], callback); } function addRedisAdapter(io) { @@ -201,7 +199,7 @@ function addRedisAdapter(io) { var sub = redis.connect({return_buffers: true}); io.adapter(redisAdapter({pubClient: pub, subClient: sub})); - } else { + } else if (nconf.get('isCluster') === 'true') { winston.warn('[socket.io] Clustering detected, you are advised to configure Redis as a websocket store.'); } } From 558e708576a5fcb148fec69453b40d3625481a53 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 5 Mar 2015 17:32:40 -0500 Subject: [PATCH 003/102] remove console.log --- src/socket.io/index.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index d2f97f8186..ba4f324d7c 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -70,7 +70,7 @@ function onConnect(socket) { if (err || !userData) { return; } - + socket.emit('event:connect'); if (userData.status !== 'offline') { socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: userData.status || 'online'}); @@ -164,21 +164,18 @@ function requireModules() { } function authorize(socket, callback) { - var handshake = socket.request, - sessionID; + var handshake = socket.request; if (!handshake) { return callback(new Error('[[error:not-authorized]]')); } - + async.waterfall([ function(next) { cookieParser(handshake, {}, next); }, function(next) { - var sessionID = handshake.signedCookies['express.sid']; - console.log(next, sessionID) - db.sessionStore.get(sessionID, next); + db.sessionStore.get(handshake.signedCookies['express.sid'], next); }, function(sessionData, next) { if (sessionData && sessionData.passport && sessionData.passport.user) { From daaf61bc68348bd0f027ef4d6b1e679fef318244 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 6 Mar 2015 12:02:07 -0500 Subject: [PATCH 004/102] fixed issue where accessing a category's access control caused a client-side error --- src/socket.io/admin/categories.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js index 55d8300819..5659b8aca9 100644 --- a/src/socket.io/admin/categories.js +++ b/src/socket.io/admin/categories.js @@ -68,7 +68,7 @@ Categories.getPrivilegeSettings = function(socket, cid, callback) { async.reduce(privileges, [], function(members, privilege, next) { groups.get('cid:' + cid + ':privileges:' + privilege, { expand: true }, function(err, groupObj) { if (err || !groupObj) { - return next(err, members); + return next(null, members); } members = members.concat(groupObj.members); From 607535b37ed27158e2afd2b89fb9ed1e70d1f219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 6 Mar 2015 12:28:57 -0500 Subject: [PATCH 005/102] closes #2823 --- public/src/client/search.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/public/src/client/search.js b/public/src/client/search.js index 56bdaf6dca..44477cd06d 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -116,7 +116,7 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco if (!searchQuery) { return; } - var searchTerms = searchQuery.split(' '); + var searchTerms = searchQuery.trim().split(' '); var regexes = []; for (var i=0; i Date: Fri, 6 Mar 2015 13:00:56 -0500 Subject: [PATCH 006/102] closes #2808 --- public/src/admin/extend/plugins.js | 14 +++++++++++++- src/plugins/install.js | 11 ++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/public/src/admin/extend/plugins.js b/public/src/admin/extend/plugins.js index 220c4e1980..e2484b1f07 100644 --- a/public/src/admin/extend/plugins.js +++ b/public/src/admin/extend/plugins.js @@ -144,7 +144,7 @@ define('admin/extend/plugins', function() { socket.emit('admin.plugins.upgrade', { id: pluginID, version: version - }, function(err) { + }, function(err, isActive) { if (err) { return app.alertError(err.message); } @@ -152,6 +152,18 @@ define('admin/extend/plugins', function() { parent.find('.fa-exclamation-triangle').remove(); parent.find('.currentVersion').text(version); btn.remove(); + if (isActive) { + app.alert({ + alert_id: 'plugin_upgraded', + title: 'Plugin Upgraded', + message: 'Please reload your NodeBB to fully upgrade this plugin', + type: 'warning', + timeout: 5000, + clickfn: function() { + socket.emit('admin.reload'); + } + }); + } }); } diff --git a/src/plugins/install.js b/src/plugins/install.js index 6d6865301a..5185d38a70 100644 --- a/src/plugins/install.js +++ b/src/plugins/install.js @@ -113,7 +113,16 @@ module.exports = function(Plugins) { require('npm').load({}, next); }, function(res, next) { - require('npm').commands.install([id + '@' + (version || 'latest')], next); + require('npm').commands.install([id + '@' + (version || 'latest')], function(err, a, b) { + next(err); + }); + }, + function(next) { + Plugins.isActive(id, next); + }, + function(isActive, next) { + meta.reloadRequired = isActive; + next(null, isActive); } ], callback); } From 9915e31bc5144aac7177ce54d5ee8f66544b68f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 6 Mar 2015 13:05:22 -0500 Subject: [PATCH 007/102] closes #2826 --- src/controllers/admin/uploads.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 81a98ed151..193b20b6d5 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -31,7 +31,7 @@ uploadsController.uploadFavicon = function(req, res, next) { var allowedTypes = ['image/x-icon', 'image/vnd.microsoft.icon']; if (validateUpload(req, res, next, uploadedFile, allowedTypes)) { - file.saveFileToLocal('favicon.ico', 'files', uploadedFile.path, function(err, image) { + file.saveFileToLocal('favicon.ico', 'system', uploadedFile.path, function(err, image) { fs.unlink(uploadedFile.path); if (err) { return next(err); @@ -55,7 +55,7 @@ function upload(name, req, res, next) { var allowedTypes = ['image/png', 'image/jpeg', 'image/pjpeg', 'image/jpg', 'image/gif']; if (validateUpload(req, res, next, uploadedFile, allowedTypes)) { var filename = name + path.extname(uploadedFile.name); - uploadImage(filename, 'files', uploadedFile, req, res, next); + uploadImage(filename, 'system', uploadedFile, req, res, next); } } From f14c5f7e1ced024ebe45ed2795173fba03a5e08f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 6 Mar 2015 13:40:35 -0500 Subject: [PATCH 008/102] added new hook 'action:meta.override404' so plugins can override the regular handling of pages that are not found --- src/controllers/helpers.js | 9 ++++++- src/routes/index.js | 52 ++++++++++++++++++++++---------------- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index 7958ace2df..dd5961839b 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -6,12 +6,19 @@ var nconf = require('nconf'), translator = require('../../public/src/translator'), categories = require('../categories'), + plugins = require('../plugins'), meta = require('../meta'); var helpers = {}; helpers.notFound = function(req, res, error) { - if (res.locals.isAPI) { + if (plugins.hasListeners('action:meta.override404')) { + plugins.fireHook('action:meta.override404', { + req: req, + res: res, + error: error + }); + } else if (res.locals.isAPI) { res.status(404).json({path: req.path.replace(/^\/api/, ''), error: error}); } else { res.status(404).render('404', {path: req.path, error: error}); diff --git a/src/routes/index.js b/src/routes/index.js index 0b951197c5..a6c51b17c9 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -173,30 +173,38 @@ module.exports = function(app, middleware) { function handle404(app, middleware) { app.use(function(req, res, next) { - var relativePath = nconf.get('relative_path'); - var isLanguage = new RegExp('^' + relativePath + '/language/[\\w]{2,}/.*.json'), - isClientScript = new RegExp('^' + relativePath + '\\/src\\/.+\\.js'); - - if (isClientScript.test(req.url)) { - res.type('text/javascript').status(200).send(''); - } else if (isLanguage.test(req.url)) { - res.status(200).json({}); - } else if (req.accepts('html')) { - if (process.env.NODE_ENV === 'development') { - winston.warn('Route requested but not found: ' + req.url); + if (!plugins.hasListeners('action:meta.override404')) { + var relativePath = nconf.get('relative_path'); + var isLanguage = new RegExp('^' + relativePath + '/language/[\\w]{2,}/.*.json'), + isClientScript = new RegExp('^' + relativePath + '\\/src\\/.+\\.js'); + + if (isClientScript.test(req.url)) { + res.type('text/javascript').status(200).send(''); + } else if (isLanguage.test(req.url)) { + res.status(200).json({}); + } else if (req.accepts('html')) { + if (process.env.NODE_ENV === 'development') { + winston.warn('Route requested but not found: ' + req.url); + } + + res.status(404); + + if (res.locals.isAPI) { + return res.json({path: req.path, error: 'not-found'}); + } + + middleware.buildHeader(req, res, function() { + res.render('404', {path: req.path}); + }); + } else { + res.status(404).type('txt').send('Not found'); } - - res.status(404); - - if (res.locals.isAPI) { - return res.json({path: req.path, error: 'not-found'}); - } - - middleware.buildHeader(req, res, function() { - res.render('404', {path: req.path}); - }); } else { - res.status(404).type('txt').send('Not found'); + plugins.fireHook('action:meta.override404', { + req: req, + res: res, + error: {} + }); } }); } From 07572b188b6d4e493de1ee12369ae551aca7a5d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 6 Mar 2015 14:54:02 -0500 Subject: [PATCH 009/102] fix crash --- src/socket.io/index.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index ba4f324d7c..337320e226 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -175,15 +175,17 @@ function authorize(socket, callback) { cookieParser(handshake, {}, next); }, function(next) { - db.sessionStore.get(handshake.signedCookies['express.sid'], next); - }, - function(sessionData, next) { - if (sessionData && sessionData.passport && sessionData.passport.user) { - socket.uid = parseInt(sessionData.passport.user, 10); - } else { - socket.uid = 0; - } - next(); + db.sessionStore.get(handshake.signedCookies['express.sid'], function(err, sessionData) { + if (err) { + return next(err); + } + if (sessionData && sessionData.passport && sessionData.passport.user) { + socket.uid = parseInt(sessionData.passport.user, 10); + } else { + socket.uid = 0; + } + next(); + }); } ], callback); } From ea9fccbf2afe97b395bab580e0a58f4fd805be99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 6 Mar 2015 15:12:55 -0500 Subject: [PATCH 010/102] fix -inf +inf added test for -inf +inf --- src/database/mongo/sorted.js | 11 +++++++---- tests/database/sorted.js | 7 +++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 565189dd8f..5b06e22cfb 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -204,14 +204,17 @@ module.exports = function(db, module) { if (!key) { return callback(); } - var scoreQuery = {}; + + var query = {_key: key}; if (min !== '-inf') { - scoreQuery.$gte = min; + query.score = {$gte: min}; } if (max !== '+inf') { - scoreQuery.$lte = max; + query.score = query.score || {}; + query.score.$lte = max; } - db.collection('objects').count({_key: key, score: scoreQuery}, function(err, count) { + + db.collection('objects').count(query, function(err, count) { callback(err, count ? count : 0); }); }; diff --git a/tests/database/sorted.js b/tests/database/sorted.js index 68e6f587da..9e92a4c388 100644 --- a/tests/database/sorted.js +++ b/tests/database/sorted.js @@ -172,6 +172,13 @@ describe('Sorted Set methods', function() { assert.equal(count, 2); done(); }); + + db.sortedSetCount('sortedSetTest1', '-inf', '+inf', function(err, count) { + assert.equal(err, null); + assert.equal(arguments.length, 2); + assert.equal(count, 3); + done(); + }); }); }); From 00be1e07e369cbe70dace06b2d4852aa3a4f0a68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 6 Mar 2015 15:21:00 -0500 Subject: [PATCH 011/102] fix test --- tests/database/sorted.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/database/sorted.js b/tests/database/sorted.js index 9e92a4c388..6680ee8716 100644 --- a/tests/database/sorted.js +++ b/tests/database/sorted.js @@ -172,13 +172,15 @@ describe('Sorted Set methods', function() { assert.equal(count, 2); done(); }); + }); + it('should return number of elements between scores -inf +inf inclusive', function(done) { db.sortedSetCount('sortedSetTest1', '-inf', '+inf', function(err, count) { assert.equal(err, null); assert.equal(arguments.length, 2); assert.equal(count, 3); done(); - }); + }); }); }); From 5821a0758f9f18d58d5134425e6c09146234276a Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 6 Mar 2015 17:41:38 -0500 Subject: [PATCH 012/102] return template name as well --- src/middleware/middleware.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 3a50e2fbf0..cd52157ec4 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -339,7 +339,7 @@ middleware.renderHeader = function(req, res, callback) { results.user.isAdmin = results.isAdmin || false; results.user.uid = parseInt(results.user.uid, 10); results.user['email:confirmed'] = parseInt(results.user['email:confirmed'], 10) === 1; - + templateValues.browserTitle = results.title; templateValues.isAdmin = results.user.isAdmin; templateValues.user = results.user; @@ -376,7 +376,7 @@ middleware.processRender = function(req, res, next) { } options.loggedIn = req.user ? parseInt(req.user.uid, 10) !== 0 : false; - options.template = {}; + options.template = {name: template}; options.template[template] = true; if ('function' !== typeof fn) { From 2a8437f08f20508072297cec4c6eca6007736f3f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 6 Mar 2015 19:02:18 -0500 Subject: [PATCH 013/102] removed templates config and mapping :sheep: --- public/src/ajaxify.js | 443 ++++++++++++++------------------ public/src/app.js | 11 +- public/src/client/categories.js | 2 +- public/src/client/category.js | 2 +- public/src/client/recent.js | 2 +- public/src/client/topic.js | 2 +- public/src/client/unread.js | 4 +- public/src/modules/templates.js | 20 -- src/controllers/templates.js | 90 ------- src/middleware/middleware.js | 5 +- src/routes/api.js | 4 +- src/views/config.json | 27 -- 12 files changed, 208 insertions(+), 404 deletions(-) delete mode 100644 public/src/modules/templates.js delete mode 100644 src/controllers/templates.js delete mode 100644 src/views/config.json diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 22a85224b6..cf6c67a7a9 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -3,321 +3,266 @@ var ajaxify = ajaxify || {}; $(document).ready(function() { - require(['templates'], function (templatesModule) { - /*global app, templates, utils, socket, translator, config, RELATIVE_PATH*/ - var location = document.location || window.location, - rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''), - apiXHR = null; + /*global app, templates, utils, socket, translator, config, RELATIVE_PATH*/ + var location = document.location || window.location, + rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''), + apiXHR = null; - window.onpopstate = function (event) { - if (event !== null && event.state && event.state.url !== undefined && !ajaxify.initialLoad) { - ajaxify.go(event.state.url, function() { - $(window).trigger('action:popstate', {url: event.state.url}); - }, true); - } - }; - - ajaxify.currentPage = null; - ajaxify.initialLoad = false; - - - function onAjaxError(err, url, callback, quiet) { - var data = err.data, - textStatus = err.textStatus; - - if (data) { - var status = parseInt(data.status, 10); - - if (status === 403 || status === 404 || status === 500) { - $('#footer, #content').removeClass('hide').addClass('ajaxifying'); - return renderTemplate(url, status.toString(), data.responseJSON, (new Date()).getTime(), callback); - } else if (status === 401) { - app.alertError('[[global:please_log_in]]'); - app.previousUrl = url; - return ajaxify.go('login'); - } else if (status === 302) { - if (data.responseJSON.path) { - if (!ajaxify.go(data.responseJSON.path, callback, quiet)) { - window.location.href = data.responseJSON.path; - } - } else if (data.responseJSON) { - ajaxify.go(data.responseJSON.slice(1), callback, quiet); - } - } - } else if (textStatus !== 'abort') { - app.alertError(data.responseJSON.error); - } + window.onpopstate = function (event) { + if (event !== null && event.state && event.state.url !== undefined && !ajaxify.initialLoad) { + ajaxify.go(event.state.url, function() { + $(window).trigger('action:popstate', {url: event.state.url}); + }, true); } + }; - ajaxify.go = function (url, callback, quiet) { - // "quiet": If set to true, will not call pushState - app.enterRoom(''); + ajaxify.currentPage = null; + ajaxify.initialLoad = false; - $(window).off('scroll'); + ajaxify.go = function (url, callback, quiet) { + // "quiet": If set to true, will not call pushState + app.enterRoom(''); - if ($('#content').hasClass('ajaxifying') && apiXHR) { - apiXHR.abort(); - } - - // Remove relative path and trailing slash - url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); - - var tpl_url = ajaxify.getTemplateMapping(url); - - $(window).trigger('action:ajaxify.start', {url: url, tpl_url: tpl_url}); - - var hash = ''; - if(ajaxify.initialLoad) { - hash = window.location.hash ? window.location.hash : ''; - } + $(window).off('scroll'); - if (ajaxify.isTemplateAvailable(tpl_url) && !!!templatesModule.config.force_refresh[tpl_url]) { - ajaxify.currentPage = url; + if ($('#content').hasClass('ajaxifying') && apiXHR) { + apiXHR.abort(); + } - if (window.history && window.history.pushState) { - window.history[!quiet ? 'pushState' : 'replaceState']({ - url: url + hash - }, url, RELATIVE_PATH + '/' + url + hash); - } + // Remove relative path and trailing slash + url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); - translator.load(config.defaultLang, tpl_url); + $(window).trigger('action:ajaxify.start', {url: url}); - $('#footer, #content').removeClass('hide').addClass('ajaxifying'); + var hash = ''; + if(ajaxify.initialLoad) { + hash = window.location.hash ? window.location.hash : ''; + } - var startTime = (new Date()).getTime(); + ajaxify.currentPage = url; - ajaxify.variables.flush(); - ajaxify.loadData(url, function(err, data) { - if (err) { - return onAjaxError(err, url, callback, quiet); - } + if (window.history && window.history.pushState) { + window.history[!quiet ? 'pushState' : 'replaceState']({ + url: url + hash + }, url, RELATIVE_PATH + '/' + url + hash); + } - renderTemplate(url, tpl_url, data, startTime, callback); + $('#footer, #content').removeClass('hide').addClass('ajaxifying'); - require(['search'], function(search) { - search.topicDOM.end(); - }); - }); + var startTime = (new Date()).getTime(); - return true; + ajaxify.variables.flush(); + ajaxify.loadData(url, function(err, data) { + if (err) { + return onAjaxError(err, url, callback, quiet); } - return false; - }; + app.template = data.template.name; - function renderTemplate(url, tpl_url, data, startTime, callback) { - var animationDuration = parseFloat($('#content').css('transition-duration')) || 0.2; - $(window).trigger('action:ajaxify.loadingTemplates', {}); + translator.load(config.defaultLang, data.template.name); - templates.parse(tpl_url, data, function(template) { - translator.translate(template, function(translatedTemplate) { - setTimeout(function() { - $('#content').html(translatedTemplate); + renderTemplate(url, data.template.name, data, startTime, callback); - ajaxify.variables.parse(); + require(['search'], function(search) { + search.topicDOM.end(); + }); + }); - ajaxify.widgets.render(tpl_url, url, function() { - $(window).trigger('action:ajaxify.end', {url: url, tpl_url: tpl_url}); - }); + return true; + }; - $(window).trigger('action:ajaxify.contentLoaded', {url: url}); + function onAjaxError(err, url, callback, quiet) { + var data = err.data, + textStatus = err.textStatus; - ajaxify.loadScript(tpl_url); + if (data) { + var status = parseInt(data.status, 10); - if (typeof callback === 'function') { - callback(); - } + if (status === 403 || status === 404 || status === 500) { + $('#footer, #content').removeClass('hide').addClass('ajaxifying'); + return renderTemplate(url, status.toString(), data.responseJSON, (new Date()).getTime(), callback); + } else if (status === 401) { + app.alertError('[[global:please_log_in]]'); + app.previousUrl = url; + return ajaxify.go('login'); + } else if (status === 302) { + if (data.responseJSON.path) { + if (!ajaxify.go(data.responseJSON.path, callback, quiet)) { + window.location.href = data.responseJSON.path; + } + } else if (data.responseJSON) { + ajaxify.go(data.responseJSON.slice(1), callback, quiet); + } + } + } else if (textStatus !== 'abort') { + app.alertError(data.responseJSON.error); + } + } - app.processPage(); + function renderTemplate(url, tpl_url, data, startTime, callback) { + var animationDuration = parseFloat($('#content').css('transition-duration')) || 0.2; + $(window).trigger('action:ajaxify.loadingTemplates', {}); - $('#content, #footer').removeClass('ajaxifying'); - ajaxify.initialLoad = false; + templates.parse(tpl_url, data, function(template) { + translator.translate(template, function(translatedTemplate) { + setTimeout(function() { + $('#content').html(translatedTemplate); - app.refreshTitle(url); - }, animationDuration * 1000 - ((new Date()).getTime() - startTime)); + ajaxify.variables.parse(); - }); - }); + ajaxify.widgets.render(tpl_url, url, function() { + $(window).trigger('action:ajaxify.end', {url: url}); + }); - } + $(window).trigger('action:ajaxify.contentLoaded', {url: url}); - ajaxify.removeRelativePath = function(url) { - if (url.indexOf(RELATIVE_PATH.slice(1)) === 0) { - url = url.slice(RELATIVE_PATH.length); - } - return url; - }; + ajaxify.loadScript(tpl_url); - ajaxify.refresh = function() { - ajaxify.go(ajaxify.currentPage); - }; + if (typeof callback === 'function') { + callback(); + } - ajaxify.loadScript = function(tpl_url, callback) { - var location = !app.inAdmin ? 'forum/' : ''; + app.processPage(); - require([location + tpl_url], function(script) { - if (script && script.init) { - script.init(); - } + $('#content, #footer').removeClass('ajaxifying'); + ajaxify.initialLoad = false; + + app.refreshTitle(url); + }, animationDuration * 1000 - ((new Date()).getTime() - startTime)); - if (callback) { - callback(); - } }); - }; + }); - ajaxify.isTemplateAvailable = function(tpl) { - return $.inArray(tpl + '.tpl', templatesModule.available) !== -1; - }; + } - ajaxify.getTemplateMapping = function(url) { - var tpl_url = ajaxify.getCustomTemplateMapping(url.split('?')[0]); + ajaxify.removeRelativePath = function(url) { + if (url.indexOf(RELATIVE_PATH.slice(1)) === 0) { + url = url.slice(RELATIVE_PATH.length); + } + return url; + }; - if (tpl_url === false && !templates[url]) { - tpl_url = url.split('/'); + ajaxify.refresh = function() { + ajaxify.go(ajaxify.currentPage); + }; - while(tpl_url.length) { - if (ajaxify.isTemplateAvailable(tpl_url.join('/'))) { - tpl_url = tpl_url.join('/'); - break; - } - tpl_url.pop(); - } + ajaxify.loadScript = function(tpl_url, callback) { + var location = !app.inAdmin ? 'forum/' : ''; - if (!tpl_url.length) { - tpl_url = url.split('/')[0].split('?')[0]; - } - } else if (templates[url]) { - tpl_url = url; + require([location + tpl_url], function(script) { + if (script && script.init) { + script.init(); } - return tpl_url; - }; - - ajaxify.getCustomTemplateMapping = function(tpl) { - if (templatesModule.config && templatesModule.config.custom_mapping && tpl !== undefined) { - for (var pattern in templatesModule.config.custom_mapping) { - if (templatesModule.config.custom_mapping.hasOwnProperty(pattern)) { - var match = tpl.match(pattern); - if (match && match[0] === tpl) { - return (templatesModule.config.custom_mapping[pattern]); - } - } - } + if (callback) { + callback(); } + }); + }; - return false; - }; + ajaxify.loadData = function(url, callback) { + url = ajaxify.removeRelativePath(url); - ajaxify.loadData = function(url, callback) { - url = ajaxify.removeRelativePath(url); + $(window).trigger('action:ajaxify.loadingData', {url: url}); - $(window).trigger('action:ajaxify.loadingData', {url: url}); + var location = document.location || window.location; - var location = document.location || window.location, - tpl_url = ajaxify.getCustomTemplateMapping(url.split('?')[0]); + apiXHR = $.ajax({ + url: RELATIVE_PATH + '/api/' + url, + cache: false, + success: function(data) { + if (!data) { + return; + } - if (!tpl_url) { - tpl_url = ajaxify.getTemplateMapping(url); - } + data.relative_path = RELATIVE_PATH; - apiXHR = $.ajax({ - url: RELATIVE_PATH + '/api/' + url, - cache: false, + if (callback) { + callback(null, data); + } + }, + error: function(data, textStatus) { + callback({ + data: data, + textStatus: textStatus + }); + } + }); + }; + + ajaxify.loadTemplate = function(template, callback) { + if (templates.cache[template]) { + callback(templates.cache[template]); + } else { + $.ajax({ + url: RELATIVE_PATH + '/templates/' + template + '.tpl' + (config['cache-buster'] ? '?v=' + config['cache-buster'] : ''), + type: 'GET', success: function(data) { - if (!data) { - return; - } - - data.relative_path = RELATIVE_PATH; - - if (callback) { - callback(null, data); - } + callback(data.toString()); }, - error: function(data, textStatus) { - callback({ - data: data, - textStatus: textStatus - }); + error: function(error) { + throw new Error("Unable to load template: " + template + " (" + error.statusText + ")"); } }); - }; - - ajaxify.loadTemplate = function(template, callback) { - if (templates.cache[template]) { - callback(templates.cache[template]); - } else { - $.ajax({ - url: RELATIVE_PATH + '/templates/' + template + '.tpl' + (config['cache-buster'] ? '?v=' + config['cache-buster'] : ''), - type: 'GET', - success: function(data) { - callback(data.toString()); - }, - error: function(error) { - throw new Error("Unable to load template: " + template + " (" + error.statusText + ")"); - } - }); - } - }; + } + }; - $('document').ready(function () { - templates.registerLoader(ajaxify.loadTemplate); - templatesModule.refresh(app.load); + function ajaxifyAnchors() { + templates.registerLoader(ajaxify.loadTemplate); - if (!window.history || !window.history.pushState) { - return; // no ajaxification for old browsers - } - - function hrefEmpty(href) { - return href === undefined || href === '' || href === 'javascript:;' || href === window.location.href + "#" || href.slice(0, 1) === "#"; - } + if (!window.history || !window.history.pushState) { + return; // no ajaxification for old browsers + } - // Enhancing all anchors to ajaxify... - $(document.body).on('click', 'a', function (e) { - if (this.target !== '') { - return; - } else if (hrefEmpty(this.href) || this.protocol === 'javascript:' || $(this).attr('data-ajaxify') === 'false') { - return e.preventDefault(); - } + function hrefEmpty(href) { + return href === undefined || href === '' || href === 'javascript:;' || href === window.location.href + "#" || href.slice(0, 1) === "#"; + } - if (!window.location.pathname.match(/\/(403|404)$/g)) { - app.previousUrl = window.location.href; - } + // Enhancing all anchors to ajaxify... + $(document.body).on('click', 'a', function (e) { + if (this.target !== '') { + return; + } else if (hrefEmpty(this.href) || this.protocol === 'javascript:' || $(this).attr('data-ajaxify') === 'false') { + return e.preventDefault(); + } - if (!e.ctrlKey && !e.shiftKey && !e.metaKey && e.which === 1) { - if (this.host === '' || this.host === window.location.host) { - // Internal link - var url = this.href.replace(rootUrl + '/', ''); + if (!window.location.pathname.match(/\/(403|404)$/g)) { + app.previousUrl = window.location.href; + } - if(window.location.pathname === this.pathname && this.hash) { - if (this.hash !== window.location.hash) { - window.location.hash = this.hash; - } + if (!e.ctrlKey && !e.shiftKey && !e.metaKey && e.which === 1) { + if (this.host === '' || this.host === window.location.host) { + // Internal link + var url = this.href.replace(rootUrl + '/', ''); - ajaxify.loadScript(ajaxify.getTemplateMapping(url)); - e.preventDefault(); - } else { - if (ajaxify.go(url)) { - e.preventDefault(); - } + if(window.location.pathname === this.pathname && this.hash) { + if (this.hash !== window.location.hash) { + window.location.hash = this.hash; } - } else if (window.location.pathname !== '/outgoing') { - // External Link - if (config.openOutgoingLinksInNewTab) { - window.open(this.href, '_blank'); - e.preventDefault(); - } else if (config.useOutgoingLinksPage) { - ajaxify.go('outgoing?url=' + encodeURIComponent(this.href)); + + e.preventDefault(); + } else { + if (ajaxify.go(url)) { e.preventDefault(); } } + } else if (window.location.pathname !== '/outgoing') { + // External Link + if (config.openOutgoingLinksInNewTab) { + window.open(this.href, '_blank'); + e.preventDefault(); + } else if (config.useOutgoingLinksPage) { + ajaxify.go('outgoing?url=' + encodeURIComponent(this.href)); + e.preventDefault(); + } } - }); - + } }); + } + + ajaxifyAnchors(); + app.load(); - }); }); \ No newline at end of file diff --git a/public/src/app.js b/public/src/app.js index 530ff81732..8c5c0201a3 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -482,16 +482,12 @@ app.cacheBuster = null; app.load = function() { $('document').ready(function () { var url = ajaxify.removeRelativePath(window.location.pathname.slice(1).replace(/\/$/, "")), - tpl_url = ajaxify.getTemplateMapping(url), + tpl_url = app.template, search = window.location.search, hash = window.location.hash, $window = $(window); - - $window.trigger('action:ajaxify.start', { - url: url, - tpl_url: tpl_url - }); + $window.trigger('action:ajaxify.start', {url: url}); collapseNavigationOnClick(); @@ -532,8 +528,7 @@ app.cacheBuster = null; ajaxify.widgets.render(tpl_url, url, function() { app.processPage(); $window.trigger('action:ajaxify.end', { - url: url, - tpl_url: tpl_url + url: url }); }); }); diff --git a/public/src/client/categories.js b/public/src/client/categories.js index 6840f69e89..d3cf1cae43 100644 --- a/public/src/client/categories.js +++ b/public/src/client/categories.js @@ -6,7 +6,7 @@ define('forum/categories', function() { var categories = {}; $(window).on('action:ajaxify.start', function(ev, data) { - if (data.tpl_url !== 'categories') { + if (ajaxify.currentPage !== data.url) { socket.removeListener('event:new_post', categories.onNewPost); } }); diff --git a/public/src/client/category.js b/public/src/client/category.js index ec3992283d..3b6a0e69b9 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -13,7 +13,7 @@ define('forum/category', [ var Category = {}; $(window).on('action:ajaxify.start', function(ev, data) { - if(data && data.tpl_url !== 'category') { + if (ajaxify.currentPage !== data.url) { navigator.hide(); removeListeners(); diff --git a/public/src/client/recent.js b/public/src/client/recent.js index 9bc840d125..bdf8897151 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -9,7 +9,7 @@ define('forum/recent', ['forum/infinitescroll'], function(infinitescroll) { newPostCount = 0; $(window).on('action:ajaxify.start', function(ev, data) { - if (data.tpl_url !== 'recent') { + if (ajaxify.currentPage !== data.url) { Recent.removeListeners(); } }); diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 480c2d8aab..75f0cc6879 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -18,7 +18,7 @@ define('forum/topic', [ currentUrl = ''; $(window).on('action:ajaxify.start', function(ev, data) { - if(data.tpl_url !== 'topic') { + if (ajaxify.currentPage !=== data.url) { navigator.hide(); $('.header-topic-title').find('span').text('').hide(); app.removeAlert('bookmark'); diff --git a/public/src/client/unread.js b/public/src/client/unread.js index 994d4e1ddb..7e08037f5a 100644 --- a/public/src/client/unread.js +++ b/public/src/client/unread.js @@ -6,7 +6,7 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll'], var Unread = {}; $(window).on('action:ajaxify.start', function(ev, data) { - if (data.tpl_url !== 'unread') { + if (ajaxify.currentPage !== data.url) { recent.removeListeners(); } }); @@ -130,7 +130,7 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll'], function createCategoryLink(category) { var link = $(''); - + if (category.icon) { link.append(' ' + category.name); } else { diff --git a/public/src/modules/templates.js b/public/src/modules/templates.js deleted file mode 100644 index 12b7cf7006..0000000000 --- a/public/src/modules/templates.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; - -/*globals define, RELATIVE_PATH*/ - -define('templates', function() { - var Templates = {}; - - Templates.refresh = function(callback) { - $.getJSON(RELATIVE_PATH + '/api/get_templates_listing', function (data) { - Templates.config = data.templatesConfig; - Templates.available = data.availableTemplates; - - if (callback) { - callback(); - } - }); - }; - - return Templates; -}); \ No newline at end of file diff --git a/src/controllers/templates.js b/src/controllers/templates.js deleted file mode 100644 index dbf0be4870..0000000000 --- a/src/controllers/templates.js +++ /dev/null @@ -1,90 +0,0 @@ -"use strict"; - -var async = require('async'), - nconf = require('nconf'), - fs = require('fs'), - path = require('path'), - meta = require('../meta'), - plugins = require('../plugins'), - utils = require('../../public/src/utils'), - templatesController = {}; - - -var availableTemplatesCache = null; -var configCache = null; - -templatesController.getTemplatesListing = function(req, res, next) { - async.parallel({ - availableTemplates: function(next) { - getAvailableTemplates(next); - }, - templatesConfig: function(next) { - async.waterfall([ - function(next) { - readConfigFile(next); - }, - function(config, next) { - config.custom_mapping['^/?$'] = meta.config.homePageRoute || 'categories'; - - plugins.fireHook('filter:templates.get_config', config, next); - } - ], next); - }, - }, function(err, results) { - if (err) { - return next(err); - } - - res.json(results); - }); -}; - -function readConfigFile(callback) { - if (configCache) { - return callback(null, configCache); - } - fs.readFile(path.join(nconf.get('views_dir'), 'config.json'), function(err, config) { - if (err) { - return callback(err); - } - try { - config = JSON.parse(config.toString()); - } catch (err) { - return callback(err); - } - configCache = config; - callback(null, config); - }); -} - -function getAvailableTemplates(callback) { - if (availableTemplatesCache) { - return callback(null, availableTemplatesCache); - } - - async.parallel({ - views: function(next) { - utils.walk(nconf.get('views_dir'), next); - }, - extended: function(next) { - plugins.fireHook('filter:templates.get_virtual', [], next); - } - }, function(err, results) { - if (err) { - return callback(err); - } - var availableTemplates = results.views.filter(function(value, index, self) { - return value && self.indexOf(value) === index; - }).map(function(el) { - return el && el.replace(nconf.get('views_dir') + '/', ''); - }); - - availableTemplatesCache = availableTemplates.concat(results.extended); - callback(null, availableTemplatesCache); - }); - -} - - - -module.exports = templatesController; diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index cd52157ec4..00087e84a9 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -348,6 +348,9 @@ middleware.renderHeader = function(req, res, callback) { templateValues.customJS = results.customJS; templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; + templateValues.template = {name: res.locals.template}; + templateValues.template[res.locals.template] = true; + app.render('header', templateValues, callback); }); }); @@ -378,6 +381,7 @@ middleware.processRender = function(req, res, next) { options.loggedIn = req.user ? parseInt(req.user.uid, 10) !== 0 : false; options.template = {name: template}; options.template[template] = true; + res.locals.template = template; if ('function' !== typeof fn) { fn = defaultFn; @@ -453,7 +457,6 @@ middleware.maintenanceMode = function(req, res, next) { '/nodebb.min.js', '/vendor/fontawesome/fonts/fontawesome-webfont.woff', '/src/modules/[\\w]+\.js', - '/api/get_templates_listing', '/api/login', '/api/?', '/language/.+' diff --git a/src/routes/api.js b/src/routes/api.js index ef1c297e49..88c3686850 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -4,8 +4,7 @@ var express = require('express'), posts = require('../posts'), categories = require('../categories'), - uploadsController = require('../controllers/uploads'), - templatesController = require('../controllers/templates'); + uploadsController = require('../controllers/uploads'); module.exports = function(app, middleware, controllers) { @@ -17,7 +16,6 @@ module.exports = function(app, middleware, controllers) { router.get('/user/uid/:uid', middleware.checkGlobalPrivacySettings, controllers.accounts.getUserByUID); router.get('/post/:pid', controllers.posts.getPost); - router.get('/get_templates_listing', templatesController.getTemplatesListing); router.get('/categories/:cid/moderators', getModerators); router.get('/recent/posts/:term?', getRecentPosts); diff --git a/src/views/config.json b/src/views/config.json deleted file mode 100644 index f8a04fa620..0000000000 --- a/src/views/config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "custom_mapping": { - "^\/?$": "categories", - "^admin?$": "admin/general/dashboard", - "^users/sort-posts": "users", - "^users/latest": "users", - "^users/sort-reputation": "users", - "^users/search": "users", - "^user/.*/edit": "account/edit", - "^user/.*/following": "account/following", - "^user/.*/followers": "account/followers", - "^user/.*/settings": "account/settings", - "^user/.*/favourites": "account/favourites", - "^user/.*/watched": "account/watched", - "^user/.*/posts": "account/posts", - "^user/.*/topics": "account/topics", - "^user/.*/groups": "account/groups", - "^user/[^\/]+": "account/profile", - "^reset/.*": "reset_code", - "^tags/.*": "tag", - "^groups/?$": "groups/list", - "^groups/.*": "groups/details" - }, - "force_refresh": { - "logout": true - } -} From c15a289d2a7065365eac54af71bef4bcfa06e602 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 6 Mar 2015 19:05:51 -0500 Subject: [PATCH 014/102] fix check --- public/src/client/topic.js | 2 +- src/views/admin/header.tpl | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 75f0cc6879..9acd1a4d73 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -18,7 +18,7 @@ define('forum/topic', [ currentUrl = ''; $(window).on('action:ajaxify.start', function(ev, data) { - if (ajaxify.currentPage !=== data.url) { + if (ajaxify.currentPage !== data.url) { navigator.hide(); $('.header-topic-title').find('span').text('').hide(); app.removeAlert('bookmark'); diff --git a/src/views/admin/header.tpl b/src/views/admin/header.tpl index 4193857410..a2b3a4c8e7 100644 --- a/src/views/admin/header.tpl +++ b/src/views/admin/header.tpl @@ -11,7 +11,9 @@ From 3809b331bc30d3562b4feb90999ca7b862cf664e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 6 Mar 2015 19:38:10 -0500 Subject: [PATCH 015/102] acp shenans --- src/middleware/admin.js | 137 +++++++++++++++++++---------------- src/middleware/middleware.js | 15 ++-- 2 files changed, 79 insertions(+), 73 deletions(-) diff --git a/src/middleware/admin.js b/src/middleware/admin.js index a23781fdef..1d6c0dae6a 100644 --- a/src/middleware/admin.js +++ b/src/middleware/admin.js @@ -32,77 +32,86 @@ middleware.isAdmin = function(req, res, next) { }; middleware.buildHeader = function(req, res, next) { + res.locals.renderAdminHeader = true; + + async.parallel({ + config: function(next) { + controllers.api.getConfig(req, res, next); + }, + footer: function(next) { + app.render('admin/footer', {}, next); + } + }, function(err, results) { + if (err) { + return next(err); + } + + res.locals.config = results.config; + res.locals.adminFooter = results.footer; + next(); + }); +}; + +middleware.renderHeader = function(req, res, next) { var uid = req.user ? req.user.uid : 0; - async.parallel([ - function(next) { - var custom_header = { - 'plugins': [], - 'authentication': [] - }; - user.getUserFields(uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed'], function(err, userData) { - if (err) { - return next(err); - } - - userData.uid = uid; - userData['email:confirmed'] = parseInt(userData['email:confirmed'], 10) === 1; - - async.parallel({ - scripts: function(next) { - plugins.fireHook('filter:admin.scripts.get', [], function(err, scripts) { - if (err) { - return next(err); - } - var arr = []; - scripts.forEach(function(script) { - arr.push({src: nconf.get('url') + script}); - }); - - next(null, arr); - }); - }, - custom_header: function(next) { - plugins.fireHook('filter:admin.header.build', custom_header, next); - }, - config: function(next) { - controllers.api.getConfig(req, res, next); - } - }, function(err, results) { + var custom_header = { + 'plugins': [], + 'authentication': [] + }; + + user.getUserFields(uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed'], function(err, userData) { + if (err) { + return next(err); + } + + userData.uid = uid; + userData['email:confirmed'] = parseInt(userData['email:confirmed'], 10) === 1; + + async.parallel({ + scripts: function(next) { + plugins.fireHook('filter:admin.scripts.get', [], function(err, scripts) { if (err) { return next(err); } - res.locals.config = results.config; - - var data = { - relative_path: nconf.get('relative_path'), - configJSON: JSON.stringify(results.config), - user: userData, - userJSON: JSON.stringify(userData), - plugins: results.custom_header.plugins, - authentication: results.custom_header.authentication, - scripts: results.scripts, - 'cache-buster': meta.config['cache-buster'] ? 'v=' + meta.config['cache-buster'] : '', - env: process.env.NODE_ENV ? true : false - }; - - app.render('admin/header', data, function(err, template) { - if (err) { - return next(err); - } - res.locals.adminHeader = template; - next(); + var arr = []; + scripts.forEach(function(script) { + arr.push({src: nconf.get('url') + script}); }); + + next(null, arr); }); - }); - }, - function(next) { - app.render('admin/footer', {}, function(err, template) { - res.locals.adminFooter = template; - next(err); - }); - } - ], next); + }, + custom_header: function(next) { + plugins.fireHook('filter:admin.header.build', custom_header, next); + }, + config: function(next) { + controllers.api.getConfig(req, res, next); + } + }, function(err, results) { + if (err) { + return next(err); + } + res.locals.config = results.config; + + var data = { + relative_path: nconf.get('relative_path'), + configJSON: JSON.stringify(results.config), + user: userData, + userJSON: JSON.stringify(userData), + plugins: results.custom_header.plugins, + authentication: results.custom_header.authentication, + scripts: results.scripts, + 'cache-buster': meta.config['cache-buster'] ? 'v=' + meta.config['cache-buster'] : '', + env: process.env.NODE_ENV ? true : false, + }; + + data.template = {name: res.locals.template}; + data.template[res.locals.template] = true; + + app.render('admin/header', data, next); + }); + }); }; module.exports = function(webserver) { diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 00087e84a9..85cc10c908 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -284,7 +284,6 @@ middleware.renderHeader = function(req, res, callback) { href: nconf.get('relative_path') + '/favicon.ico' }); - async.parallel({ customCSS: function(next) { templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1; @@ -401,20 +400,18 @@ middleware.processRender = function(req, res, next) { str = str + res.locals.adminFooter; } - if (res.locals.renderHeader) { - middleware.renderHeader(req, res, function(err, template) { + if (res.locals.renderHeader || res.locals.renderAdminHeader) { + var method = res.locals.renderHeader ? middleware.renderHeader : middleware.admin.renderHeader; + method(req, res, function(err, template) { + if (err) { + return fn(err); + } str = template + str; var language = res.locals.config ? res.locals.config.userLang || 'en_GB' : 'en_GB'; translator.translate(str, language, function(translated) { fn(err, translated); }); }); - } else if (res.locals.adminHeader) { - str = res.locals.adminHeader + str; - var language = res.locals.config ? res.locals.config.userLang || 'en_GB' : 'en_GB'; - translator.translate(str, language, function(translated) { - fn(err, translated); - }); } else { fn(err, str); } From 23a6b33f6411b818e718ee2e9814d1201df51abe Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 6 Mar 2015 19:45:27 -0500 Subject: [PATCH 016/102] not used --- public/src/ajaxify.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index cf6c67a7a9..e5c7bdec53 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -167,8 +167,6 @@ $(document).ready(function() { $(window).trigger('action:ajaxify.loadingData', {url: url}); - var location = document.location || window.location; - apiXHR = $.ajax({ url: RELATIVE_PATH + '/api/' + url, cache: false, From 63a6702285e7789fff144fdafb2d17224806177c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 6 Mar 2015 19:48:12 -0500 Subject: [PATCH 017/102] removed whitespace --- public/src/ajaxify.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index e5c7bdec53..e60d80e83d 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -131,10 +131,8 @@ $(document).ready(function() { app.refreshTitle(url); }, animationDuration * 1000 - ((new Date()).getTime() - startTime)); - }); }); - } ajaxify.removeRelativePath = function(url) { From 289474edf7c3cb2abea7c61e52af567ff7276942 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Mar 2015 00:25:55 -0500 Subject: [PATCH 018/102] closes #2827 --- public/src/ajaxify.js | 66 ++++++++++++++++++++++--------------------- public/src/app.js | 31 ++------------------ 2 files changed, 36 insertions(+), 61 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index e60d80e83d..b63e2dbadf 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -11,7 +11,7 @@ $(document).ready(function() { apiXHR = null; window.onpopstate = function (event) { - if (event !== null && event.state && event.state.url !== undefined && !ajaxify.initialLoad) { + if (event !== null && event.state && event.state.url !== undefined) { ajaxify.go(event.state.url, function() { $(window).trigger('action:popstate', {url: event.state.url}); }, true); @@ -19,10 +19,8 @@ $(document).ready(function() { }; ajaxify.currentPage = null; - ajaxify.initialLoad = false; ajaxify.go = function (url, callback, quiet) { - // "quiet": If set to true, will not call pushState app.enterRoom(''); $(window).off('scroll'); @@ -31,23 +29,7 @@ $(document).ready(function() { apiXHR.abort(); } - // Remove relative path and trailing slash - url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); - - $(window).trigger('action:ajaxify.start', {url: url}); - - var hash = ''; - if(ajaxify.initialLoad) { - hash = window.location.hash ? window.location.hash : ''; - } - - ajaxify.currentPage = url; - - if (window.history && window.history.pushState) { - window.history[!quiet ? 'pushState' : 'replaceState']({ - url: url + hash - }, url, RELATIVE_PATH + '/' + url + hash); - } + url = ajaxify.start(url, quiet); $('#footer, #content').removeClass('hide').addClass('ajaxifying'); @@ -73,6 +55,23 @@ $(document).ready(function() { return true; }; + ajaxify.start = function(url, quiet) { + url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); + var hash = window.location.hash; + var search = window.location.search; + + ajaxify.currentPage = url; + + $(window).trigger('action:ajaxify.start', {url: url}); + + if (window.history && window.history.pushState) { + window.history[!quiet ? 'pushState' : 'replaceState']({ + url: url + search + hash + }, url, RELATIVE_PATH + '/' + url + search + hash); + } + return url; + }; + function onAjaxError(err, url, callback, quiet) { var data = err.data, textStatus = err.textStatus; @@ -110,24 +109,13 @@ $(document).ready(function() { setTimeout(function() { $('#content').html(translatedTemplate); - ajaxify.variables.parse(); - - ajaxify.widgets.render(tpl_url, url, function() { - $(window).trigger('action:ajaxify.end', {url: url}); - }); - - $(window).trigger('action:ajaxify.contentLoaded', {url: url}); - - ajaxify.loadScript(tpl_url); + ajaxify.end(url, tpl_url); if (typeof callback === 'function') { callback(); } - app.processPage(); - $('#content, #footer').removeClass('ajaxifying'); - ajaxify.initialLoad = false; app.refreshTitle(url); }, animationDuration * 1000 - ((new Date()).getTime() - startTime)); @@ -135,6 +123,20 @@ $(document).ready(function() { }); } + ajaxify.end = function(url, tpl_url) { + ajaxify.variables.parse(); + + ajaxify.loadScript(tpl_url); + + ajaxify.widgets.render(tpl_url, url, function() { + $(window).trigger('action:ajaxify.end', {url: url}); + }); + + $(window).trigger('action:ajaxify.contentLoaded', {url: url}); + + app.processPage(); + }; + ajaxify.removeRelativePath = function(url) { if (url.indexOf(RELATIVE_PATH.slice(1)) === 0) { url = url.slice(RELATIVE_PATH.length); diff --git a/public/src/app.js b/public/src/app.js index 8c5c0201a3..bd914e1e54 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -481,13 +481,8 @@ app.cacheBuster = null; app.load = function() { $('document').ready(function () { - var url = ajaxify.removeRelativePath(window.location.pathname.slice(1).replace(/\/$/, "")), - tpl_url = app.template, - search = window.location.search, - hash = window.location.hash, - $window = $(window); - - $window.trigger('action:ajaxify.start', {url: url}); + var url = ajaxify.start(window.location.pathname.slice(1), true); + ajaxify.end(url, app.template); collapseNavigationOnClick(); @@ -511,28 +506,6 @@ app.cacheBuster = null; createHeaderTooltips(); showEmailConfirmWarning(); - ajaxify.variables.parse(); - ajaxify.currentPage = url; - - $window.trigger('action:ajaxify.contentLoaded', { - url: url - }); - - if (window.history && window.history.replaceState) { - window.history.replaceState({ - url: url + search + hash - }, url, RELATIVE_PATH + '/' + url + search + hash); - } - - ajaxify.loadScript(tpl_url, function() { - ajaxify.widgets.render(tpl_url, url, function() { - app.processPage(); - $window.trigger('action:ajaxify.end', { - url: url - }); - }); - }); - socket.removeAllListeners('event:nodebb.ready'); socket.on('event:nodebb.ready', function(cacheBusters) { if ( From 3dd337bd341237682b2aaced0823227105ffb7a8 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Mar 2015 00:59:03 -0500 Subject: [PATCH 019/102] closes #2829 --- src/plugins/load.js | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/plugins/load.js b/src/plugins/load.js index 4bd432f582..89b38fdc64 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -22,15 +22,7 @@ module.exports = function(Plugins) { return callback(); } - if (pluginData.compatibility && semver.validRange(pluginData.compatibility)) { - if (!semver.gtr(pkg.version, pluginData.compatibility)) { - // NodeBB may not be new enough to run this plugin - process.stdout.write('\n'); - winston.warn('[plugins/' + pluginData.id + '] This plugin may not be compatible with your version of NodeBB. This may cause unintended behaviour or crashing.'); - winston.warn('[plugins/' + pluginData.id + '] In the event of an unresponsive NodeBB caused by this plugin, run ./nodebb reset plugin="' + pluginData.id + '".'); - process.stdout.write('\n'); - } - } + versionWarning(pluginData); async.parallel([ function(next) { @@ -63,6 +55,23 @@ module.exports = function(Plugins) { }); }; + function versionWarning(pluginData) { + function display() { + process.stdout.write('\n'); + winston.warn('[plugins/' + pluginData.id + '] This plugin may not be compatible with your version of NodeBB. This may cause unintended behaviour or crashing.'); + winston.warn('[plugins/' + pluginData.id + '] In the event of an unresponsive NodeBB caused by this plugin, run ./nodebb reset plugin="' + pluginData.id + '".'); + process.stdout.write('\n'); + } + + if (pluginData.nbbpm && pluginData.nbbpm.compatibility && semver.validRange(pluginData.nbbpm.compatibility)) { + if (!semver.gtr(pkg.version, pluginData.nbbpm.compatibility)) { + display(); + } + } else { + display(); + } + } + function registerHooks(pluginData, pluginPath, callback) { function libraryNotFound() { winston.warn('[plugins.reload] Library not found for plugin: ' + pluginData.id); From 42eadc72a405d68c4b9d285888406d7be891344b Mon Sep 17 00:00:00 2001 From: Mega Date: Sat, 7 Mar 2015 13:17:07 +0300 Subject: [PATCH 020/102] Click on "Delete" btn in ACP > General > Navigation causes redirect. --- public/src/admin/general/navigation.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/admin/general/navigation.js b/public/src/admin/general/navigation.js index 95f41b3510..9bd684ec80 100644 --- a/public/src/admin/general/navigation.js +++ b/public/src/admin/general/navigation.js @@ -18,7 +18,7 @@ define('admin/general/navigation', function() { stop: drop }); }); - + $('#enabled') .on('click', '.delete', remove) .on('click', '.toggle', toggle) @@ -75,6 +75,7 @@ define('admin/general/navigation', function() { function remove() { $(this).parents('li').remove(); + return false; } function toggle() { From f87f797bed6fd55136a7254461236eacee251f8f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Mar 2015 13:52:02 -0500 Subject: [PATCH 021/102] dont keep window.location.search on regular ajaxify --- public/src/ajaxify.js | 5 ++--- public/src/app.js | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index b63e2dbadf..16b0c5bbf2 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -55,11 +55,10 @@ $(document).ready(function() { return true; }; - ajaxify.start = function(url, quiet) { + ajaxify.start = function(url, quiet, search) { url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); var hash = window.location.hash; - var search = window.location.search; - + search = search || ''; ajaxify.currentPage = url; $(window).trigger('action:ajaxify.start', {url: url}); diff --git a/public/src/app.js b/public/src/app.js index bd914e1e54..53e43e86fc 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -481,7 +481,7 @@ app.cacheBuster = null; app.load = function() { $('document').ready(function () { - var url = ajaxify.start(window.location.pathname.slice(1), true); + var url = ajaxify.start(window.location.pathname.slice(1), true, window.location.search); ajaxify.end(url, app.template); collapseNavigationOnClick(); From dc94fe2b6c478ab340264ac5e3df99bfb5ff7875 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Mar 2015 20:19:00 -0500 Subject: [PATCH 022/102] move admin upload routes to api namespace move usrrs/csv to api namespace --- public/src/admin/manage/categories.js | 4 ++-- src/file.js | 5 +---- src/routes/admin.js | 17 ++++++++--------- src/views/admin/manage/users.tpl | 2 +- src/views/admin/settings/general.tpl | 4 ++-- src/views/admin/settings/user.tpl | 2 +- 6 files changed, 15 insertions(+), 19 deletions(-) diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index 63105b73f1..a9cf3b60e8 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -207,7 +207,7 @@ define('admin/manage/categories', [ case 'name': data[name] = $(this).val() + ' (copy)'; break; - default: + default: data[name] = $(this).val(); } }); @@ -226,7 +226,7 @@ define('admin/manage/categories', [ var inputEl = $(this), cid = inputEl.parents('li[data-cid]').attr('data-cid'); - uploader.open(RELATIVE_PATH + '/admin/category/uploadpicture', { cid: cid }, 0, function(imageUrlOnServer) { + uploader.open(RELATIVE_PATH + '/api/admin/category/uploadpicture', { cid: cid }, 0, function(imageUrlOnServer) { inputEl.val(imageUrlOnServer); var previewBox = inputEl.parents('li[data-cid]').find('.preview-box'); previewBox.css('background', 'url(' + imageUrlOnServer + '?' + new Date().getTime() + ')') diff --git a/src/file.js b/src/file.js index a3b594f326..543c5011fa 100644 --- a/src/file.js +++ b/src/file.js @@ -27,10 +27,7 @@ file.saveFileToLocal = function(filename, folder, tempPath, callback) { }); }); - os.on('error', function (err) { - winston.error(err.message); - callback(err); - }); + os.on('error', callback); is.pipe(os); }; diff --git a/src/routes/admin.js b/src/routes/admin.js index 85a3a8ddc5..4a7e7ef460 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -3,19 +3,18 @@ var express = require('express'); -function apiRoutes(app, middleware, controllers) { - // todo, needs to be in api namespace - app.get('/users/csv', middleware.authenticate, controllers.admin.users.getCSV); +function apiRoutes(router, middleware, controllers) { + router.get('/users/csv', middleware.authenticate, controllers.admin.users.getCSV); var multipart = require('connect-multiparty'); var multipartMiddleware = multipart(); var middlewares = [multipartMiddleware, middleware.validateFiles, middleware.applyCSRF, middleware.authenticate]; - app.post('/category/uploadpicture', middlewares, controllers.admin.uploads.uploadCategoryPicture); - app.post('/uploadfavicon', middlewares, controllers.admin.uploads.uploadFavicon); - app.post('/uploadlogo', middlewares, controllers.admin.uploads.uploadLogo); - app.post('/uploadgravatardefault', middlewares, controllers.admin.uploads.uploadGravatarDefault); + router.post('/category/uploadpicture', middlewares, controllers.admin.uploads.uploadCategoryPicture); + router.post('/uploadfavicon', middlewares, controllers.admin.uploads.uploadFavicon); + router.post('/uploadlogo', middlewares, controllers.admin.uploads.uploadLogo); + router.post('/uploadgravatardefault', middlewares, controllers.admin.uploads.uploadGravatarDefault); } function adminRouter(middleware, controllers) { @@ -25,8 +24,6 @@ function adminRouter(middleware, controllers) { addRoutes(router, middleware, controllers); - apiRoutes(router, middleware, controllers); - return router; } @@ -35,6 +32,8 @@ function apiRouter(middleware, controllers) { addRoutes(router, middleware, controllers); + apiRoutes(router, middleware, controllers); + return router; } diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index a4997c49e0..37b993dba7 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -129,7 +129,7 @@
Users Control Panel
- Download CSV + Download CSV
diff --git a/src/views/admin/settings/general.tpl b/src/views/admin/settings/general.tpl index 063d7c34e7..65039333ee 100644 --- a/src/views/admin/settings/general.tpl +++ b/src/views/admin/settings/general.tpl @@ -34,7 +34,7 @@

- +
@@ -45,7 +45,7 @@


- +
diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index cc11b93727..c0c1ca8ab3 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -67,7 +67,7 @@

- +
From d00f8a3d27a3a32f9f6b38318e646da068581826 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Mar 2015 20:27:23 -0500 Subject: [PATCH 023/102] added uploads/system --- .gitignore | 2 +- public/uploads/system/.gitignore | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/uploads/system/.gitignore diff --git a/.gitignore b/.gitignore index 2f966c4535..73c0c4170a 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,7 @@ pidfile /public/templates /public/sounds -/public/uploads + # compiled files /public/stylesheet.css diff --git a/public/uploads/system/.gitignore b/public/uploads/system/.gitignore new file mode 100644 index 0000000000..e69de29bb2 From a5bf991cf06ad900543391a9d940ebbf852042d0 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Mar 2015 20:27:46 -0500 Subject: [PATCH 024/102] ignored public/uploads again --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 73c0c4170a..2f966c4535 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,7 @@ pidfile /public/templates /public/sounds - +/public/uploads # compiled files /public/stylesheet.css From e5dc408ef517a49fc45af1abf6f9563be986667d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Mar 2015 21:59:21 -0500 Subject: [PATCH 025/102] change current page after ajaxify:start event --- public/src/ajaxify.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 16b0c5bbf2..74c588a1ed 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -59,10 +59,11 @@ $(document).ready(function() { url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); var hash = window.location.hash; search = search || ''; - ajaxify.currentPage = url; $(window).trigger('action:ajaxify.start', {url: url}); + ajaxify.currentPage = url; + if (window.history && window.history.pushState) { window.history[!quiet ? 'pushState' : 'replaceState']({ url: url + search + hash From e71ef216f2a015328fc0034cd128adacdf89924e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 9 Mar 2015 10:50:03 -0400 Subject: [PATCH 026/102] hiding the right sidebar in ACP dash temporarily --- src/views/admin/general/dashboard.tpl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/views/admin/general/dashboard.tpl b/src/views/admin/general/dashboard.tpl index d5334fffb1..759144152d 100644 --- a/src/views/admin/general/dashboard.tpl +++ b/src/views/admin/general/dashboard.tpl @@ -1,5 +1,6 @@
-
+ +
Forum Traffic
@@ -87,7 +88,8 @@
-
+ +
Anonymous vs Registered Users
From 43600698590a85754936d5cdebd29b11e762b38f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 9 Mar 2015 12:17:33 -0400 Subject: [PATCH 027/102] fixing buttons on mobile composer, and updating format so tags button only appears on mobile --- public/src/modules/composer.js | 1 + public/src/modules/composer/formatting.js | 8 ++++---- src/socket.io/modules.js | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 50a729bb54..568dae805c 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -240,6 +240,7 @@ define('composer', [ var template = (composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm') ? 'composer-mobile' : 'composer'; var data = { + mobile: template === 'composer-mobile', allowTopicsThumbnail: allowTopicsThumbnail, showTags: isTopic || isMain, minimumTagLength: config.minimumTagLength, diff --git a/public/src/modules/composer/formatting.js b/public/src/modules/composer/formatting.js index 071c0ca2e7..05315a7edf 100644 --- a/public/src/modules/composer/formatting.js +++ b/public/src/modules/composer/formatting.js @@ -20,11 +20,11 @@ define('composer/formatting', ['composer/controls', 'composer/preview'], functio } }; - var customButtons = []; + var buttons = []; formatting.addComposerButtons = function() { - for(var x=0,numButtons=customButtons.length;x'); + for(var x=0,numButtons=buttons.length;x'); } }; @@ -32,7 +32,7 @@ define('composer/formatting', ['composer/controls', 'composer/preview'], functio var name = iconClass.replace('fa fa-', ''); formattingDispatchTable[name] = onClick; - customButtons.push({ + buttons.push({ name: name, iconClass: iconClass }); diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 306d26d579..2825b28656 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -117,7 +117,7 @@ SocketModules.composer.stopNotifyTyping = function(socket, data) { SocketModules.composer.getFormattingOptions = function(socket, data, callback) { plugins.fireHook('filter:composer.formatting', { options: [ - // { className: 'fa fa-bold' } Just an example of what needs to be set via plugins + { name: 'tags', className: 'fa fa-tags', mobile: true } ] }, function(err, payload) { callback(err, payload.options); From e47c375e6913b1961d00f807ed5f20c5994166ce Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 12:30:16 -0400 Subject: [PATCH 028/102] closes #1642 --- public/src/ajaxify.js | 12 +++++++----- public/src/modules/composer.js | 7 ++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 74c588a1ed..865626635c 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -10,13 +10,15 @@ $(document).ready(function() { rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''), apiXHR = null; - window.onpopstate = function (event) { - if (event !== null && event.state && event.state.url !== undefined) { - ajaxify.go(event.state.url, function() { - $(window).trigger('action:popstate', {url: event.state.url}); + $(window).on('popstate', function (ev) { + ev = ev.originalEvent; + + if (ev !== null && ev.state && ev.state.url !== undefined) { + ajaxify.go(ev.state.url, function() { + $(window).trigger('action:popstate', {url: ev.state.url}); }, true); } - }; + }); ajaxify.currentPage = null; diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 568dae805c..461681ed58 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -22,7 +22,7 @@ define('composer', [ $(window).off('resize', onWindowResize).on('resize', onWindowResize); - $(window).on('action:popstate', function(ev, data) { + $(window).on('popstate', function(ev, data) { var env = utils.findBootstrapEnvironment(); if (composer.active && (env === 'xs' || env ==='sm')) { @@ -95,6 +95,11 @@ define('composer', [ composer.posts[uuid] = post; composer.load(uuid); + + var env = utils.findBootstrapEnvironment(); + if (env === 'xs' || env ==='sm') { + history.pushState({}, '', '#compose'); + } } function composerAlert(message) { From fcc8093fa63dca2443c1d2f12d5fbb7fa4f34dd2 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 12:44:15 -0400 Subject: [PATCH 029/102] #1642 show discard prompt --- public/src/modules/composer.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 461681ed58..98ab0407a5 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -26,7 +26,20 @@ define('composer', [ var env = utils.findBootstrapEnvironment(); if (composer.active && (env === 'xs' || env ==='sm')) { - discard(composer.active); + if (!composer.posts[composer.active].modified) { + discard(composer.active); + return; + } + + translator.translate('[[modules:composer.discard]]', function(translated) { + bootbox.confirm(translated, function(confirm) { + if (confirm) { + discard(composer.active); + } else { + history.pushState({}, '', '#compose'); + } + }); + }); } }); From cda38d6ed63cdcd963afc300807ed68054ba850d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Mar 2015 13:16:14 -0400 Subject: [PATCH 030/102] closes #2515 --- src/posts.js | 26 +----------------- src/posts/topics.js | 44 ++++++++++++++++++++++++++++++ src/socket.io/posts.js | 60 +++++++++++++++++++++++++++++++++-------- src/socket.io/topics.js | 18 ++++++------- 4 files changed, 103 insertions(+), 45 deletions(-) create mode 100644 src/posts/topics.js diff --git a/src/posts.js b/src/posts.js index c8cfb8f085..2c7ca82737 100644 --- a/src/posts.js +++ b/src/posts.js @@ -16,6 +16,7 @@ var async = require('async'), require('./posts/create')(Posts); require('./posts/delete')(Posts); require('./posts/user')(Posts); + require('./posts/topics')(Posts); require('./posts/category')(Posts); require('./posts/summary')(Posts); require('./posts/recent')(Posts); @@ -25,20 +26,6 @@ var async = require('async'), db.isSortedSetMember('posts:pid', pid, callback); }; - Posts.getPostsByTid = function(tid, set, start, end, uid, reverse, callback) { - Posts.getPidsFromSet(set, start, end, reverse, function(err, pids) { - if(err) { - return callback(err); - } - - if(!Array.isArray(pids) || !pids.length) { - return callback(null, []); - } - - Posts.getPostsByPids(pids, uid, callback); - }); - }; - Posts.getPidsFromSet = function(set, start, end, reverse, callback) { if (isNaN(start) || isNaN(end)) { return callback(null, []); @@ -243,17 +230,6 @@ var async = require('async'), }); }; - Posts.isMain = function(pid, callback) { - Posts.getPostField(pid, 'tid', function(err, tid) { - if (err) { - return callback(err); - } - topics.getTopicField(tid, 'mainPid', function(err, mainPid) { - callback(err, parseInt(pid, 10) === parseInt(mainPid, 10)); - }); - }); - }; - Posts.updatePostVoteCount = function(pid, voteCount, callback) { async.parallel([ function(next) { diff --git a/src/posts/topics.js b/src/posts/topics.js new file mode 100644 index 0000000000..75577d2925 --- /dev/null +++ b/src/posts/topics.js @@ -0,0 +1,44 @@ + +'use strict'; + +var async = require('async'), + topics = require('../topics'); + +module.exports = function(Posts) { + + Posts.getPostsByTid = function(tid, set, start, end, uid, reverse, callback) { + Posts.getPidsFromSet(set, start, end, reverse, function(err, pids) { + if (err) { + return callback(err); + } + + if (!Array.isArray(pids) || !pids.length) { + return callback(null, []); + } + + Posts.getPostsByPids(pids, uid, callback); + }); + }; + + Posts.isMain = function(pid, callback) { + Posts.getPostField(pid, 'tid', function(err, tid) { + if (err) { + return callback(err); + } + topics.getTopicField(tid, 'mainPid', function(err, mainPid) { + callback(err, parseInt(pid, 10) === parseInt(mainPid, 10)); + }); + }); + }; + + Posts.getTopicFields = function(pid, fields, callback) { + Posts.getPostField(pid, 'tid', function(err, tid) { + if (err) { + return callback(err); + } + + topics.getTopicFields(tid, fields, callback); + }); + }; + +}; \ No newline at end of file diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 0b5ab9b418..e8f5ef9a63 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -16,6 +16,7 @@ var async = require('async'), groups = require('../groups'), user = require('../user'), websockets = require('./index'), + socketTopics = require('./topics'), events = require('../events'), utils = require('../../public/src/utils'), @@ -345,27 +346,64 @@ function deleteOrRestore(command, socket, data, callback) { } SocketPosts.purge = function(socket, data, callback) { - if(!data || !parseInt(data.pid, 10)) { + function purgePost() { + postTools.purge(socket.uid, data.pid, function(err) { + if (err) { + return callback(err); + } + + websockets.in('topic_' + data.tid).emit('event:post_purged', data.pid); + + events.log({ + type: 'post-purge', + uid: socket.uid, + pid: data.pid, + ip: socket.ip + }); + + callback(); + }); + } + + if (!data || !parseInt(data.pid, 10)) { return callback(new Error('[[error:invalid-data]]')); } - postTools.purge(socket.uid, data.pid, function(err) { - if(err) { + + isMainAndLastPost(data.pid, function(err, results) { + if (err) { return callback(err); } - websockets.in('topic_' + data.tid).emit('event:post_purged', data.pid); + if (!results.isMain) { + return purgePost(); + } - events.log({ - type: 'post-purge', - uid: socket.uid, - pid: data.pid, - ip: socket.ip - }); + if (!results.isLast) { + return callback(new Error('[[error:cant-purge-main-post]]')); + } - callback(); + posts.getTopicFields(data.pid, ['tid', 'cid'], function(err, topic) { + if (err) { + return callback(err); + } + socketTopics.doTopicAction('delete', 'event:topic_deleted', socket, {tids: [topic.tid], cid: topic.cid}, callback); + }); }); }; +function isMainAndLastPost(pid, callback) { + async.parallel({ + isMain: function(next) { + posts.isMain(pid, next); + }, + isLast: function(next) { + posts.getTopicFields(pid, ['postcount'], function(err, topic) { + next(err, topic ? parseInt(topic.postcount, 10) === 1 : false); + }); + } + }, callback); +} + SocketPosts.getPrivileges = function(socket, pids, callback) { privileges.posts.get(pids, socket.uid, function(err, privileges) { if (err) { diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index a4ee937429..cd42d1fde4 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -205,34 +205,34 @@ SocketTopics.markAsUnreadForAll = function(socket, tids, callback) { }; SocketTopics.delete = function(socket, data, callback) { - doTopicAction('delete', 'event:topic_deleted', socket, data, callback); + SocketTopics.doTopicAction('delete', 'event:topic_deleted', socket, data, callback); }; SocketTopics.restore = function(socket, data, callback) { - doTopicAction('restore', 'event:topic_restored', socket, data, callback); + SocketTopics.doTopicAction('restore', 'event:topic_restored', socket, data, callback); }; SocketTopics.purge = function(socket, data, callback) { - doTopicAction('purge', 'event:topic_purged', socket, data, callback); + SocketTopics.doTopicAction('purge', 'event:topic_purged', socket, data, callback); }; SocketTopics.lock = function(socket, data, callback) { - doTopicAction('lock', 'event:topic_locked', socket, data, callback); + SocketTopics.doTopicAction('lock', 'event:topic_locked', socket, data, callback); }; SocketTopics.unlock = function(socket, data, callback) { - doTopicAction('unlock', 'event:topic_unlocked', socket, data, callback); + SocketTopics.doTopicAction('unlock', 'event:topic_unlocked', socket, data, callback); }; SocketTopics.pin = function(socket, data, callback) { - doTopicAction('pin', 'event:topic_pinned', socket, data, callback); + SocketTopics.doTopicAction('pin', 'event:topic_pinned', socket, data, callback); }; SocketTopics.unpin = function(socket, data, callback) { - doTopicAction('unpin', 'event:topic_unpinned', socket, data, callback); + SocketTopics.doTopicAction('unpin', 'event:topic_unpinned', socket, data, callback); }; -function doTopicAction(action, event, socket, data, callback) { +SocketTopics.doTopicAction = function(action, event, socket, data, callback) { if (!socket.uid) { return; } @@ -274,7 +274,7 @@ function doTopicAction(action, event, socket, data, callback) { }); }); }, callback); -} +}; function emitToTopicAndCategory(event, data) { websockets.in('topic_' + data.tid).emit(event, data); From 33723f8b1be5591c6ef6c6a31590e388cfe42591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Mar 2015 13:54:35 -0400 Subject: [PATCH 031/102] closes #2835 --- src/controllers/categories.js | 2 +- src/routes/feeds.js | 109 ++++++++++++++++++++++++---------- src/topics.js | 10 +++- 3 files changed, 88 insertions(+), 33 deletions(-) diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 1ec014240b..5264e0e5f4 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -55,7 +55,7 @@ categoriesController.popular = function(req, res, next) { var data = { topics: topics, 'feeds:disableRSS': parseInt(meta.config['feeds:disableRSS'], 10) === 1, - rssFeedUrl: nconf.get('relative_path') + '/popular.rss', + rssFeedUrl: nconf.get('relative_path') + '/popular/' + (req.params.term || 'daily') + '.rss', breadcrumbs: helpers.buildBreadcrumbs([{text: '[[global:header.popular]]'}]) }; diff --git a/src/routes/feeds.js b/src/routes/feeds.js index 12b0f6a0e1..0f2f6082b6 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -135,14 +135,17 @@ function generateForCategory(req, res, next) { return next(err); } - var feed = generateTopicsFeed({ + generateTopicsFeed({ title: categoryData.name, description: categoryData.description, feed_url: '/category/' + cid + '.rss', site_url: '/category/' + categoryData.cid, - }, categoryData.topics); - - sendFeed(feed, res); + }, categoryData.topics, function(err, feed) { + if (err) { + return next(err); + } + sendFeed(feed, res); + }); }); } @@ -156,12 +159,32 @@ function generateForRecent(req, res, next) { } function generateForPopular(req, res, next) { - generateForTopics({ - title: 'Popular Topics', - description: 'A list of topics that are sorted by post count', - feed_url: '/popular.rss', - site_url: '/popular' - }, 'topics:posts', req, res, next); + var uid = req.user ? req.user.uid : 0; + var terms = { + daily: 'day', + weekly: 'week', + monthly: 'month', + alltime: 'alltime' + }; + var term = terms[req.params.term] || 'day'; + + topics.getPopular(term, uid, 19, function(err, topics) { + if (err) { + return next(err); + } + + generateTopicsFeed({ + title: 'Popular Topics', + description: 'A list of topics that are sorted by post count', + feed_url: '/popular/' + (req.params.term || 'daily') + '.rss', + site_url: '/popular/' + (req.params.term || 'daily') + }, topics, function(err, feed) { + if (err) { + return next(err); + } + sendFeed(feed, res); + }); + }); } function disabledRSS(req, res, next) { @@ -178,35 +201,58 @@ function generateForTopics(options, set, req, res, next) { if (err) { return next(err); } - - var feed = generateTopicsFeed(options, data.topics); - - sendFeed(feed, res); + + generateTopicsFeed(options, data.topics, function(err, feed) { + if (err) { + return next(err); + } + sendFeed(feed, res); + }); }); } -function generateTopicsFeed(feedOptions, topics) { +function generateTopicsFeed(feedOptions, feedTopics, callback) { + var tids = feedTopics.map(function(topic) { + return topic ? topic.tid : null; + }); + + topics.getMainPids(tids, function(err, pids) { + if (err) { + return callback(err); + } + posts.getPostsFields(pids, ['content'], function(err, posts) { + if (err) { + return callback(err); + } - feedOptions.ttl = 60; - feedOptions.feed_url = nconf.get('url') + feedOptions.feed_url; - feedOptions.site_url = nconf.get('url') + feedOptions.site_url; + feedTopics.forEach(function(topic, index) { + if (topic && posts[index]) { + topic.mainPost = posts[index].content; + } + }); - var feed = new rss(feedOptions); + feedOptions.ttl = 60; + feedOptions.feed_url = nconf.get('url') + feedOptions.feed_url; + feedOptions.site_url = nconf.get('url') + feedOptions.site_url; - if (topics.length > 0) { - feed.pubDate = new Date(parseInt(topics[0].lastposttime, 10)).toUTCString(); - } + var feed = new rss(feedOptions); - topics.forEach(function(topicData) { - feed.item({ - title: topicData.title, - url: nconf.get('url') + '/topic/' + topicData.slug, - author: topicData.username, - date: new Date(parseInt(topicData.lastposttime, 10)).toUTCString() - }); - }); + if (feedTopics.length > 0) { + feed.pubDate = new Date(parseInt(feedTopics[0].lastposttime, 10)).toUTCString(); + } - return feed; + feedTopics.forEach(function(topicData) { + feed.item({ + title: topicData.title, + description: topicData.mainPost, + url: nconf.get('url') + '/topic/' + topicData.slug, + author: topicData.username, + date: new Date(parseInt(topicData.lastposttime, 10)).toUTCString() + }); + }); + callback(null, feed); + }); + }); } function generateForRecentPosts(req, res, next) { @@ -291,6 +337,7 @@ module.exports = function(app, middleware, controllers){ app.get('/category/:category_id.rss', hasCategoryPrivileges, disabledRSS, generateForCategory); app.get('/recent.rss', disabledRSS, generateForRecent); app.get('/popular.rss', disabledRSS, generateForPopular); + app.get('/popular/:term.rss', disabledRSS, generateForPopular); app.get('/recentposts.rss', disabledRSS, generateForRecentPosts); app.get('/category/:category_id/recentposts.rss', hasCategoryPrivileges, disabledRSS, generateForCategoryRecentPosts); app.get('/user/:userslug/topics.rss', disabledRSS, generateForUserTopics); diff --git a/src/topics.js b/src/topics.js index 274ffbcf70..3c22bcf30c 100644 --- a/src/topics.js +++ b/src/topics.js @@ -255,7 +255,7 @@ var async = require('async'), }); }; - Topics.getMainPosts = function(tids, uid, callback) { + Topics.getMainPids = function(tids, callback) { Topics.getTopicsFields(tids, ['mainPid'], function(err, topicData) { if (err) { return callback(err); @@ -264,7 +264,15 @@ var async = require('async'), var mainPids = topicData.map(function(topic) { return topic ? topic.mainPid : null; }); + callback(null, mainPids); + }); + }; + Topics.getMainPosts = function(tids, uid, callback) { + Topics.getMainPids(tids, function(err, mainPids) { + if (err) { + return callback(err); + } getMainPosts(mainPids, uid, callback); }); }; From 1ec1c5a366ffbac25b9a201e2e01e9429cf57cae Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 15:05:48 -0400 Subject: [PATCH 032/102] fixes composer maximizing --- public/src/modules/composer/resize.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 9d5d303df9..491da42dca 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -21,7 +21,7 @@ define('composer/resize', function() { if (percentage) { if (env === 'md' || env === 'lg') { - postContainer.css('height', Math.floor($(window).height() * percentage) + 'px'); + postContainer.height(Math.floor($(window).height() * percentage) + 'px'); } } From 4d45a81fdb0686bfcb21c9849b2da4bf2248a5a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Mar 2015 15:30:52 -0400 Subject: [PATCH 033/102] closes #2383 --- public/src/ajaxify.js | 12 +++++++----- src/views/500.tpl | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 865626635c..5e26619253 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -89,11 +89,9 @@ $(document).ready(function() { app.previousUrl = url; return ajaxify.go('login'); } else if (status === 302) { - if (data.responseJSON.path) { - if (!ajaxify.go(data.responseJSON.path, callback, quiet)) { - window.location.href = data.responseJSON.path; - } - } else if (data.responseJSON) { + if (data.responseJSON.external && data.responseJSON.path) { + window.location.href = data.responseJSON.path; + } else if (typeof data.responseJSON === 'string') { ajaxify.go(data.responseJSON.slice(1), callback, quiet); } } @@ -184,6 +182,9 @@ $(document).ready(function() { } }, error: function(data, textStatus) { + if (data.status === 0 && textStatus === 'error') { + data.status = 500; + } callback({ data: data, textStatus: textStatus @@ -264,5 +265,6 @@ $(document).ready(function() { ajaxifyAnchors(); app.load(); + templates.cache['500'] = $('.tpl-500').html(); }); \ No newline at end of file diff --git a/src/views/500.tpl b/src/views/500.tpl index 13b0e9de89..6408fbb79d 100644 --- a/src/views/500.tpl +++ b/src/views/500.tpl @@ -1,7 +1,7 @@
[[global:500.title]]

[[global:500.message]]

-

{path}

+

{path}

{error}

-
\ No newline at end of file +
From 53e0615df79afb951107b23a08eb24261312c9ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Mar 2015 15:33:20 -0400 Subject: [PATCH 034/102] removed path use external --- public/src/ajaxify.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 5e26619253..2392511386 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -89,8 +89,8 @@ $(document).ready(function() { app.previousUrl = url; return ajaxify.go('login'); } else if (status === 302) { - if (data.responseJSON.external && data.responseJSON.path) { - window.location.href = data.responseJSON.path; + if (data.responseJSON.external) { + window.location.href = data.responseJSON.external; } else if (typeof data.responseJSON === 'string') { ajaxify.go(data.responseJSON.slice(1), callback, quiet); } From 4f2ac340b2cfb9e0db7f8b2a0a12d19eb1ecbd4f Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 15:52:01 -0400 Subject: [PATCH 035/102] latest tjs --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f38b87f0d..bab3c6bcb4 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "socket.io-redis": "^0.1.3", "socketio-wildcard": "~0.1.1", "string": "^3.0.0", - "templates.js": "^0.1.23", + "templates.js": "^0.1.28", "uglify-js": "git+https://github.com/julianlam/UglifyJS2.git", "underscore": "~1.7.0", "validator": "^3.30.0", From b56e862838d9432b87c2b789e9996b417f2d0f2f Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 16:00:46 -0400 Subject: [PATCH 036/102] removed hardcoded fa-chevron icons from client js --- public/src/modules/composer/resize.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 491da42dca..616c8f2a5a 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -72,20 +72,20 @@ define('composer/resize', function() { } function toggleHeight(e) { - var triggerIconEl = $('.resizer i'); + var resizer = $('.resizer'); if (e.clientY - resizeDown === 0){ var newPercentage = ($(window).height() - $('#header-menu').height() - 20) / $(window).height(); - if (triggerIconEl.hasClass('fa-chevron-up')) { + if (!resizer.hasClass('maximized')) { oldPercentage = getPercentage(postContainer); doResize(postContainer, newPercentage); - triggerIconEl.addClass('fa-chevron-down').removeClass('fa-chevron-up'); + resizer.addClass('maximized'); } else { doResize(postContainer, oldPercentage); - triggerIconEl.addClass('fa-chevron-up').removeClass('fa-chevron-down'); + resizer.removeClass('maximized'); } } else { - triggerIconEl.addClass('fa-chevron-up').removeClass('fa-chevron-down'); + resizer.removeClass('maximized'); } } From 706527fa80ff4694057c27a94a258236e290bbef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Mar 2015 16:01:04 -0400 Subject: [PATCH 037/102] fix group titles clone groups for each user --- src/posts/user.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/posts/user.js b/src/posts/user.js index de563d86b5..8fb2d039e0 100644 --- a/src/posts/user.js +++ b/src/posts/user.js @@ -33,9 +33,9 @@ module.exports = function(Posts) { var userData = results.userData; userData.forEach(function(userData, i) { - userData.groups = results.groups[i]; - - results.groups[i].forEach(function(group, index) { + userData.groups = results.groups[i].slice(); + + userData.groups.forEach(function(group) { group.selected = group.name === results.userSettings[i].groupTitle; }); userData.status = user.getStatus(userData.status, results.online[i]); From d2e8d4d86ed3fa41ed31b482f655c7223fd64026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Mar 2015 16:08:48 -0400 Subject: [PATCH 038/102] slice doesnt deep clone derp --- src/groups.js | 7 ++++++- src/posts/user.js | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/groups.js b/src/groups.js index 452b47d56c..e94e9d46f9 100644 --- a/src/groups.js +++ b/src/groups.js @@ -16,6 +16,7 @@ var async = require('async'), posts = require('./posts'), privileges = require('./privileges'), utils = require('../public/src/utils'), + util = require('util'), uploadsController = require('./controllers/uploads'); @@ -952,7 +953,11 @@ var async = require('async'), var memberOf = []; isMembers.forEach(function(isMember, index) { if (isMember) { - memberOf.push(groupData[index]); + if (uids.length > 1) { + memberOf.push(util._extend({}, groupData[index])); + } else { + memberOf.push(groupData[index]); + } } }); diff --git a/src/posts/user.js b/src/posts/user.js index 8fb2d039e0..494b1dbc6f 100644 --- a/src/posts/user.js +++ b/src/posts/user.js @@ -33,7 +33,7 @@ module.exports = function(Posts) { var userData = results.userData; userData.forEach(function(userData, i) { - userData.groups = results.groups[i].slice(); + userData.groups = results.groups[i]; userData.groups.forEach(function(group) { group.selected = group.name === results.userSettings[i].groupTitle; From bbbb36212598a0394dcc80dda91a2cc78d1e6d99 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 9 Mar 2015 16:15:00 -0400 Subject: [PATCH 039/102] not referencing parent scope when inside BEGIN in widgets tpl --- public/src/admin/extend/widgets.js | 2 +- src/views/admin/extend/widgets.tpl | 8 ++++---- src/widgets.js | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/public/src/admin/extend/widgets.js b/public/src/admin/extend/widgets.js index 239d5bd809..b57453ffab 100644 --- a/public/src/admin/extend/widgets.js +++ b/public/src/admin/extend/widgets.js @@ -3,7 +3,7 @@ define('admin/extend/widgets', function() { var Widgets = {}; - + Widgets.init = function() { $('#widgets .nav-pills a').on('click', function(ev) { var $this = $(this); diff --git a/src/views/admin/extend/widgets.tpl b/src/views/admin/extend/widgets.tpl index d2aca20177..91fc127d89 100644 --- a/src/views/admin/extend/widgets.tpl +++ b/src/views/admin/extend/widgets.tpl @@ -6,7 +6,7 @@ @@ -14,10 +14,10 @@
-
+
-
-

{templates.areas.name} {templates.template} / {templates.areas.location}

+
+

{areas.name} {template} / {areas.location}

diff --git a/src/widgets.js b/src/widgets.js index c0234b2a28..ffe2ad2629 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -9,7 +9,6 @@ var async = require('async'), (function(Widgets) { - Widgets.render = function(uid, area, callback) { if (!area.locations || !area.template) { return callback(new Error('[[error:invalid-data]]')); From da758c429aaf4a7daf6e4b092426891aaf9fd7e1 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 16:19:20 -0400 Subject: [PATCH 040/102] remove hardcoded z-index; give composer a "maximized" class if maximized --- public/src/modules/composer/resize.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 616c8f2a5a..0f4f1528c6 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -21,7 +21,7 @@ define('composer/resize', function() { if (percentage) { if (env === 'md' || env === 'lg') { - postContainer.height(Math.floor($(window).height() * percentage) + 'px'); + postContainer.height(Math.floor($(window).height() * percentage) - 1 + 'px'); } } @@ -40,7 +40,7 @@ define('composer/resize', function() { postContainer.find('#files.lt-ie9').removeClass('hide'); } - postContainer.css('visibility', 'visible').css('z-index', 2); + postContainer.css('visibility', 'visible'); // Add some extra space at the bottom of the body so that the user can still scroll to the last post w/ composer open $('body').css({'margin-bottom': postContainer.css('height')}); @@ -72,20 +72,20 @@ define('composer/resize', function() { } function toggleHeight(e) { - var resizer = $('.resizer'); + var composer = $('.composer'); if (e.clientY - resizeDown === 0){ var newPercentage = ($(window).height() - $('#header-menu').height() - 20) / $(window).height(); - if (!resizer.hasClass('maximized')) { + if (!composer.hasClass('maximized')) { oldPercentage = getPercentage(postContainer); doResize(postContainer, newPercentage); - resizer.addClass('maximized'); + composer.addClass('maximized'); } else { doResize(postContainer, oldPercentage); - resizer.removeClass('maximized'); + composer.removeClass('maximized'); } } else { - resizer.removeClass('maximized'); + composer.removeClass('maximized'); } } From c0e6c306d0f3e60d769c7ba61b6dc0b996a0c761 Mon Sep 17 00:00:00 2001 From: Mega Date: Mon, 9 Mar 2015 23:48:53 +0300 Subject: [PATCH 041/102] Update nodebb-plugin-mentions version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f38b87f0d..5fe1a334c4 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "nodebb-plugin-dbsearch": "^0.1.0", "nodebb-plugin-emoji-extended": "^0.4.1-4", "nodebb-plugin-markdown": "^1.0.0", - "nodebb-plugin-mentions": "^0.9.0", + "nodebb-plugin-mentions": "^0.10.0", "nodebb-plugin-soundpack-default": "~0.1.1", "nodebb-plugin-spam-be-gone": "^0.4.0", "nodebb-theme-lavender": "^1.0.6", From bd99124fb998c4c8b39fe28c83963cf5a82e3e17 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 16:49:53 -0400 Subject: [PATCH 042/102] refactored write preview code --- public/src/modules/composer/resize.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 0f4f1528c6..f2da4f90ca 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -143,12 +143,17 @@ define('composer/resize', function() { function resizeWritePreview(postContainer) { - var h1 = postContainer.find('.title-container').outerHeight(true); - var h2 = postContainer.find('.category-tag-row').outerHeight(true); - var h3 = postContainer.find('.formatting-bar').outerHeight(true); - var h4 = postContainer.find('.topic-thumb-container').outerHeight(true); - var h5 = $('.taskbar').height(); - var total = h1 + h2 + h3 + h4 + h5; + var rows = [ + postContainer.find('.title-container').outerHeight(true), + postContainer.find('.formatting-bar').outerHeight(true), + postContainer.find('.topic-thumb-container').outerHeight(true), + $('.taskbar').height() + ]; + + var total = rows.reduce(function(a, b) { + return a + b; + }); + postContainer.find('.write-preview-container').css('height', postContainer.height() - total); } From 09e0d660cd38d6f57defe6a027501b3803a27bcf Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 16:56:40 -0400 Subject: [PATCH 043/102] tags:enter_tags_here better messaging --- public/language/ar/tags.json | 2 +- public/language/bn/tags.json | 2 +- public/language/cs/tags.json | 2 +- public/language/de/tags.json | 2 +- public/language/el/tags.json | 2 +- public/language/en@pirate/tags.json | 2 +- public/language/en_GB/tags.json | 2 +- public/language/en_US/tags.json | 2 +- public/language/es/tags.json | 2 +- public/language/et/tags.json | 2 +- public/language/fa_IR/tags.json | 2 +- public/language/fi/tags.json | 2 +- public/language/fr/tags.json | 2 +- public/language/he/tags.json | 2 +- public/language/hu/tags.json | 2 +- public/language/id/tags.json | 2 +- public/language/it/tags.json | 2 +- public/language/ja/tags.json | 2 +- public/language/ko/tags.json | 2 +- public/language/lt/tags.json | 2 +- public/language/ms/tags.json | 2 +- public/language/nb/tags.json | 2 +- public/language/nl/tags.json | 2 +- public/language/pl/tags.json | 2 +- public/language/pt_BR/tags.json | 2 +- public/language/ro/tags.json | 2 +- public/language/ru/tags.json | 2 +- public/language/sc/tags.json | 2 +- public/language/sk/tags.json | 2 +- public/language/sv/tags.json | 2 +- public/language/th/tags.json | 2 +- public/language/tr/tags.json | 2 +- public/language/vi/tags.json | 2 +- public/language/zh_CN/tags.json | 2 +- public/language/zh_TW/tags.json | 2 +- 35 files changed, 35 insertions(+), 35 deletions(-) diff --git a/public/language/ar/tags.json b/public/language/ar/tags.json index 004681a32a..f2eccbd1c0 100644 --- a/public/language/ar/tags.json +++ b/public/language/ar/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "لاوجود لمواضيع تحمل هذا الوسم.", "tags": "بطاقات", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "أدخل البطاقات...", "no_tags": "لاتوجد هناك بطاقات بعد." } \ No newline at end of file diff --git a/public/language/bn/tags.json b/public/language/bn/tags.json index e99c0f835d..86bbe70e75 100644 --- a/public/language/bn/tags.json +++ b/public/language/bn/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "এই ট্যাগ সম্বলিত কোন টপিক নেই", "tags": "ট্যাগসমূহ", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "ট্যাগ বসান", "no_tags": "এখন পর্যন্ত কোন ট্যাগ নেই" } \ No newline at end of file diff --git a/public/language/cs/tags.json b/public/language/cs/tags.json index f2003f978a..8fc07c7da2 100644 --- a/public/language/cs/tags.json +++ b/public/language/cs/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Není zde žádné téma s tímto tagem.", "tags": "Tagy", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Vložte tagy ...", "no_tags": "Zatím tu není žádný tag." } \ No newline at end of file diff --git a/public/language/de/tags.json b/public/language/de/tags.json index 7e7e548c8f..898759f0b5 100644 --- a/public/language/de/tags.json +++ b/public/language/de/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Es gibt keine Themen mit diesem Tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Gib Tags ein...", "no_tags": "Es gibt bisher keine Tags." } \ No newline at end of file diff --git a/public/language/el/tags.json b/public/language/el/tags.json index 4264ed78aa..e3776579ed 100644 --- a/public/language/el/tags.json +++ b/public/language/el/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Δεν υπάρχουν θέματα με αυτή την ετικέτα.", "tags": "Ετικέτες", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Εισαγωγή ετικετών...", "no_tags": "Δεν υπάρχουν ακόμα ετικέτες." } \ No newline at end of file diff --git a/public/language/en@pirate/tags.json b/public/language/en@pirate/tags.json index aa9f14c70c..c416d8d4ec 100644 --- a/public/language/en@pirate/tags.json +++ b/public/language/en@pirate/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/en_GB/tags.json b/public/language/en_GB/tags.json index a3f75bb2e6..c74b9759cf 100644 --- a/public/language/en_GB/tags.json +++ b/public/language/en_GB/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/en_US/tags.json b/public/language/en_US/tags.json index aa9f14c70c..c416d8d4ec 100644 --- a/public/language/en_US/tags.json +++ b/public/language/en_US/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/es/tags.json b/public/language/es/tags.json index 3a86bb7da7..260ff42eef 100644 --- a/public/language/es/tags.json +++ b/public/language/es/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "No hay temas con esta etiqueta.", "tags": "Etiquetas", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Introduzca las etiquetas...", "no_tags": "Aún no hay etiquetas." } \ No newline at end of file diff --git a/public/language/et/tags.json b/public/language/et/tags.json index 5f63e2b3e7..87b8332fad 100644 --- a/public/language/et/tags.json +++ b/public/language/et/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Teemasid, mis sisaldaksid seda märksõna, ei eksisteeri.", "tags": "Märksõnad", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Sisesta märksõnu...", "no_tags": "Siin ei ole veel ühtegi märksõna." } \ No newline at end of file diff --git a/public/language/fa_IR/tags.json b/public/language/fa_IR/tags.json index 82e477f4cc..26a393396b 100644 --- a/public/language/fa_IR/tags.json +++ b/public/language/fa_IR/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "جُستاری با این برچسب وجود ندارد.", "tags": "برچسب‌ها", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Enter tags...", "no_tags": "هنوز برچسبی وجود ندارد." } \ No newline at end of file diff --git a/public/language/fi/tags.json b/public/language/fi/tags.json index 3d1cf1271b..35903730b2 100644 --- a/public/language/fi/tags.json +++ b/public/language/fi/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Ei viimeisimpiä aiheita tällä tagilla.", "tags": "Tagit", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Syötä tagit...", "no_tags": "Ei vielä yhtään tagia." } \ No newline at end of file diff --git a/public/language/fr/tags.json b/public/language/fr/tags.json index 8c533e76ca..477f1a0b56 100644 --- a/public/language/fr/tags.json +++ b/public/language/fr/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Il n'y a aucun sujet ayant ce mot-clé", "tags": "Mots-clés", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Entrez des mots-clés...", "no_tags": "Il n'y a pas encore de mots-clés." } \ No newline at end of file diff --git a/public/language/he/tags.json b/public/language/he/tags.json index 54ead310ad..3061057672 100644 --- a/public/language/he/tags.json +++ b/public/language/he/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "אין פוסטים עם תגית זו.", "tags": "תגיות", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "הכנס תגיות", "no_tags": "אין עדיין תגיות." } \ No newline at end of file diff --git a/public/language/hu/tags.json b/public/language/hu/tags.json index aa7a02a772..baddf9f8d6 100644 --- a/public/language/hu/tags.json +++ b/public/language/hu/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Nem létezik témakör ezzel a címkével.", "tags": "Címkék", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Címke megadása...", "no_tags": "Nincs címke." } \ No newline at end of file diff --git a/public/language/id/tags.json b/public/language/id/tags.json index 647542884e..8485344416 100644 --- a/public/language/id/tags.json +++ b/public/language/id/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Tidak ada topik dengan tag ini.", "tags": "Tag", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Masukkan tag...", "no_tags": "Belum ada tag." } \ No newline at end of file diff --git a/public/language/it/tags.json b/public/language/it/tags.json index c3364a0bbf..5fcdf9ff47 100644 --- a/public/language/it/tags.json +++ b/public/language/it/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Non ci sono discussioni con questo tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Inserisci i tags...", "no_tags": "Non ci sono ancora tags." } \ No newline at end of file diff --git a/public/language/ja/tags.json b/public/language/ja/tags.json index aa9f14c70c..c416d8d4ec 100644 --- a/public/language/ja/tags.json +++ b/public/language/ja/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/ko/tags.json b/public/language/ko/tags.json index a50fc5e9e1..8e1011bd29 100644 --- a/public/language/ko/tags.json +++ b/public/language/ko/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "이 태그에 해당하는 주제가 없습니다.", "tags": "태그", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "태그 입력...", "no_tags": "아직 아무런 태그도 없습니다." } \ No newline at end of file diff --git a/public/language/lt/tags.json b/public/language/lt/tags.json index 2f2b9e11d2..2151f58d36 100644 --- a/public/language/lt/tags.json +++ b/public/language/lt/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Temų su šią žyma nėra.", "tags": "Žymos", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Enter tags...", "no_tags": "Žymų kolkas nėra." } \ No newline at end of file diff --git a/public/language/ms/tags.json b/public/language/ms/tags.json index aa9f14c70c..c416d8d4ec 100644 --- a/public/language/ms/tags.json +++ b/public/language/ms/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/nb/tags.json b/public/language/nb/tags.json index d38e00a025..5287b6125a 100644 --- a/public/language/nb/tags.json +++ b/public/language/nb/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Det er ingen emnet med denne taggen.", "tags": "Tagger", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Skriv tagger...", "no_tags": "Det finnes ingen tagger enda." } \ No newline at end of file diff --git a/public/language/nl/tags.json b/public/language/nl/tags.json index 85c11b0476..281fd4a0a5 100644 --- a/public/language/nl/tags.json +++ b/public/language/nl/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Er zijn geen onderwerpen met deze tag", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Voer uw tags in...", "no_tags": "Er zijn nog geen tags te vinden" } \ No newline at end of file diff --git a/public/language/pl/tags.json b/public/language/pl/tags.json index c4d9498474..a2247f39e7 100644 --- a/public/language/pl/tags.json +++ b/public/language/pl/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Nie ma tematów z tym tagiem", "tags": "Tagi", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Wpisz tagi...", "no_tags": "Jeszcze nie ma tagów." } \ No newline at end of file diff --git a/public/language/pt_BR/tags.json b/public/language/pt_BR/tags.json index 267888cbfa..1150d12f7f 100644 --- a/public/language/pt_BR/tags.json +++ b/public/language/pt_BR/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Não há tópicos com esta tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Digite tags...", "no_tags": "Ainda não há tags." } \ No newline at end of file diff --git a/public/language/ro/tags.json b/public/language/ro/tags.json index 483efa66f6..59edbb0063 100644 --- a/public/language/ro/tags.json +++ b/public/language/ro/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Nu există nici un subiect cu acest tag.", "tags": "Taguri", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Introdu taguri...", "no_tags": "În acest moment nu există nici un tag." } \ No newline at end of file diff --git a/public/language/ru/tags.json b/public/language/ru/tags.json index fa5fa0b9b2..e923cccf2c 100644 --- a/public/language/ru/tags.json +++ b/public/language/ru/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Нет топиков с таким тегом.", "tags": "Теги", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Введите теги...", "no_tags": "Здесь еще нет тегов." } \ No newline at end of file diff --git a/public/language/sc/tags.json b/public/language/sc/tags.json index aa9f14c70c..c416d8d4ec 100644 --- a/public/language/sc/tags.json +++ b/public/language/sc/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/sk/tags.json b/public/language/sk/tags.json index aa9f14c70c..c416d8d4ec 100644 --- a/public/language/sk/tags.json +++ b/public/language/sk/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/sv/tags.json b/public/language/sv/tags.json index fffe39ea0a..d846962ea4 100644 --- a/public/language/sv/tags.json +++ b/public/language/sv/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Det finns inga ämnen med detta märkord.", "tags": "Märkord", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Ange taggar...", "no_tags": "Det finns inga märkord ännu." } \ No newline at end of file diff --git a/public/language/th/tags.json b/public/language/th/tags.json index d2d0ff6fe0..e8bf52df2e 100644 --- a/public/language/th/tags.json +++ b/public/language/th/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "ไม่มีหัวข้อสนทนาที่เกี่ยวข้องกับป้ายคำศัพท์นี้", "tags": "ป้ายคำศัพท์", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "ใส่ป้ายคำศัพท์ ...", "no_tags": "ยังไม่มีป้ายคำศัพท์" } \ No newline at end of file diff --git a/public/language/tr/tags.json b/public/language/tr/tags.json index c0ffd63eb1..9f614ce38c 100644 --- a/public/language/tr/tags.json +++ b/public/language/tr/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Bu etiketli başlık yok.", "tags": "Etiketler", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Etiketleri gir...", "no_tags": "Henüz etiket yok." } \ No newline at end of file diff --git a/public/language/vi/tags.json b/public/language/vi/tags.json index 68f5639c02..7b8931883f 100644 --- a/public/language/vi/tags.json +++ b/public/language/vi/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Không có bài viết nào với thẻ này.", "tags": "Thẻ", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "Tên thẻ...", "no_tags": "Chưa có thẻ nào." } \ No newline at end of file diff --git a/public/language/zh_CN/tags.json b/public/language/zh_CN/tags.json index a50705d3d6..9802f9c79a 100644 --- a/public/language/zh_CN/tags.json +++ b/public/language/zh_CN/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "此话题还没有主题帖。", "tags": "话题", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "输入话题...", "no_tags": "尚无话题。" } \ No newline at end of file diff --git a/public/language/zh_TW/tags.json b/public/language/zh_TW/tags.json index dc5c1601ba..ce9de5c88b 100644 --- a/public/language/zh_TW/tags.json +++ b/public/language/zh_TW/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "沒有此標籤的主題。", "tags": "標籤", - "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here_short": "輸入標籤...", "no_tags": "還沒有標籤呢。" } \ No newline at end of file From f0ad2020dfdeef90f65d98e245bc0e488c6b1807 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 9 Mar 2015 17:18:18 -0400 Subject: [PATCH 044/102] updated sorting logic (syntax error) --- src/groups.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/groups.js b/src/groups.js index e94e9d46f9..0645fc55ac 100644 --- a/src/groups.js +++ b/src/groups.js @@ -1089,7 +1089,7 @@ var async = require('async'), case 'alpha': // intentional fall-through default: groups = groups.sort(function(a, b) { - return a.slug > b.slug; + return a.slug > b.slug ? 1 : -1; }); } From 5b5615740324eee39da8e48412d16f225dfc1006 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 18:05:18 -0400 Subject: [PATCH 045/102] composer refactor part 1 removed lots of hardcoded values; used translate 3d instead of height for smoother dragging; various optimizations; snap to top functionality --- public/src/modules/composer/resize.js | 82 ++++++++++++++++----------- 1 file changed, 48 insertions(+), 34 deletions(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index f2da4f90ca..6ba01f944c 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -19,15 +19,23 @@ define('composer/resize', function() { env = utils.findBootstrapEnvironment(); } + postContainer.percentage = percentage; + if (percentage) { + if (percentage < 0.35) { + // write snap to taskbar code + } + if (env === 'md' || env === 'lg') { - postContainer.height(Math.floor($(window).height() * percentage) - 1 + 'px'); + postContainer.css('transform', 'translate(0, ' + (Math.abs(1-percentage) * 100) + '%)'); } } + // todo, lump in browsers that don't support transform (ie8) here + // at this point we should use modernizr if (env === 'sm' || env === 'xs' || window.innerHeight < 480) { app.toggleNavbar(false); - postContainer.css('height', $(window).height()); + //postContainer.css('height', $(window).height()); } if (config.hasImageUploadPlugin) { @@ -50,8 +58,9 @@ define('composer/resize', function() { resize.handleResize = function(postContainer) { function resizeStart(e) { - var resizeRect = resizeEl[0].getBoundingClientRect(); - var resizeCenterY = resizeRect.top + (resizeRect.height/2); + var resizeRect = resizeEl[0].getBoundingClientRect(), + resizeCenterY = resizeRect.top + (resizeRect.height/2); + resizeOffset = resizeCenterY - e.clientY; resizeActive = true; resizeDown = e.clientY; @@ -63,29 +72,37 @@ define('composer/resize', function() { function resizeStop(e) { resizeActive = false; - toggleHeight(e); postContainer.find('textarea').focus(); $(window).off('mousemove', resizeAction); $(window).off('mouseup', resizeStop); $('body').off('touchmove', resizeTouchAction); + + var position = (e.clientY + resizeOffset), + newHeight = $(window).height() - position, + windowHeight = $(window).height(); + + if (newHeight > windowHeight - $('#header-menu').height() - (windowHeight / 15)) { + snapToTop = true; + } else { + snapToTop = false; + } + + toggleMaximize(e); } - function toggleHeight(e) { - var composer = $('.composer'); - if (e.clientY - resizeDown === 0){ - var newPercentage = ($(window).height() - $('#header-menu').height() - 20) / $(window).height(); + function toggleMaximize(e) { + if (e.clientY - resizeDown === 0 || snapToTop) { + var newPercentage = ($(window).height() - $('#header-menu').height()) / $(window).height(); - if (!composer.hasClass('maximized')) { - oldPercentage = getPercentage(postContainer); + if (!postContainer.hasClass('maximized') || !snapToTop) { + oldPercentage = postContainer.percentage; doResize(postContainer, newPercentage); - composer.addClass('maximized'); + postContainer.addClass('maximized'); } else { doResize(postContainer, oldPercentage); - composer.removeClass('maximized'); + postContainer.removeClass('maximized'); } - } else { - composer.removeClass('maximized'); } } @@ -96,20 +113,19 @@ define('composer/resize', function() { function resizeAction(e) { if (resizeActive) { - var position = (e.clientY + resizeOffset); - var newHeight = $(window).height() - position; + var position = (e.clientY + resizeOffset), + newHeight = $(window).height() - position; - if(newHeight > $(window).height() - $('#header-menu').height() - 20) { - newHeight = $(window).height() - $('#header-menu').height() - 20; - } else if (newHeight < 100) { - newHeight = 100; - } + doResize(postContainer, newHeight / $(window).height()); - postContainer.css('height', newHeight); - $('body').css({'margin-bottom': newHeight}); resizeWritePreview(postContainer); resizeSavePosition(newHeight); + + if (Math.abs(e.clientY - resizeDown) > 0) { + postContainer.removeClass('maximized'); + } } + e.preventDefault(); return false; } @@ -119,13 +135,10 @@ define('composer/resize', function() { localStorage.setItem('composer:resizePercentage', percentage); } - function getPercentage(postContainer) { - return postContainer.height() / $(window).height(); - } - var resizeActive = false, resizeOffset = 0, resizeDown = 0, + snapToTop = false, resizeEl = postContainer.find('.resizer'); resizeEl.on('mousedown', resizeStart); @@ -143,18 +156,19 @@ define('composer/resize', function() { function resizeWritePreview(postContainer) { - var rows = [ + var total = getFormattingHeight(postContainer); + postContainer.find('.write-preview-container').css('height', postContainer.percentage * $(window).height() - $('#header-menu').height() - total); + } + + function getFormattingHeight(postContainer) { + return [ postContainer.find('.title-container').outerHeight(true), postContainer.find('.formatting-bar').outerHeight(true), postContainer.find('.topic-thumb-container').outerHeight(true), $('.taskbar').height() - ]; - - var total = rows.reduce(function(a, b) { + ].reduce(function(a, b) { return a + b; }); - - postContainer.find('.write-preview-container').css('height', postContainer.height() - total); } From bc9d7f2922a567a2fede76093b39f1701b6e7993 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 18:19:58 -0400 Subject: [PATCH 046/102] fix so that mouse is always on the handle --- public/src/modules/composer/resize.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 6ba01f944c..6267228761 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -59,9 +59,9 @@ define('composer/resize', function() { resize.handleResize = function(postContainer) { function resizeStart(e) { var resizeRect = resizeEl[0].getBoundingClientRect(), - resizeCenterY = resizeRect.top + (resizeRect.height/2); - - resizeOffset = resizeCenterY - e.clientY; + resizeCenterY = resizeRect.top + resizeRect.height; + + resizeOffset = (resizeCenterY - e.clientY) / 2; resizeActive = true; resizeDown = e.clientY; @@ -78,7 +78,7 @@ define('composer/resize', function() { $(window).off('mouseup', resizeStop); $('body').off('touchmove', resizeTouchAction); - var position = (e.clientY + resizeOffset), + var position = (e.clientY - resizeOffset), newHeight = $(window).height() - position, windowHeight = $(window).height(); @@ -113,7 +113,7 @@ define('composer/resize', function() { function resizeAction(e) { if (resizeActive) { - var position = (e.clientY + resizeOffset), + var position = (e.clientY - resizeOffset), newHeight = $(window).height() - position; doResize(postContainer, newHeight / $(window).height()); From ddd4680ea7d4c6d893c37b026bba18dcfdf96f60 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 9 Mar 2015 18:22:44 -0400 Subject: [PATCH 047/102] added helpers.redirect --- src/controllers/categories.js | 3 +-- src/controllers/groups.js | 50 +++++++++++++++++++---------------- src/controllers/helpers.js | 8 ++++++ src/controllers/topics.js | 10 +++---- src/middleware/middleware.js | 15 ++--------- src/routes/index.js | 2 +- 6 files changed, 42 insertions(+), 46 deletions(-) diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 5264e0e5f4..18bbd57f8b 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -200,8 +200,7 @@ categoriesController.get = function(req, res, next) { var topicCount = parseInt(results.categoryData.topic_count, 10); if (topicIndex < 0 || topicIndex > Math.max(topicCount - 1, 0)) { - var url = '/category/' + cid + '/' + req.params.slug + (topicIndex > topicCount ? '/' + topicCount : ''); - return res.locals.isAPI ? res.status(302).json(url) : res.redirect(url); + return helpers.redirect(res, '/category/' + cid + '/' + req.params.slug + (topicIndex > topicCount ? '/' + topicCount : '')); } userPrivileges = results.privileges; diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 51200d0a40..7371c924e7 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -51,31 +51,35 @@ groupsController.details = function(req, res, next) { } } ], function(err, ok) { - if (ok) { - async.parallel({ - group: function(next) { - groups.get(res.locals.groupName, { - expand: true, - uid: uid - }, next); - }, - posts: function(next) { - groups.getLatestMemberPosts(res.locals.groupName, 10, uid, next); - } - }, function(err, results) { - if (err) { - return next(err); - } - - if (!results.group) { - return helpers.notFound(req, res); - } + if (err) { + return next(err); + } - res.render('groups/details', results); - }); - } else { - return res.locals.isAPI ? res.status(302).json('/groups') : res.redirect('/groups'); + if (!ok) { + return helpers.redirect(res, '/groups'); } + + async.parallel({ + group: function(next) { + groups.get(res.locals.groupName, { + expand: true, + uid: uid + }, next); + }, + posts: function(next) { + groups.getLatestMemberPosts(res.locals.groupName, 10, uid, next); + } + }, function(err, results) { + if (err) { + return next(err); + } + + if (!results.group) { + return helpers.notFound(req, res); + } + + res.render('groups/details', results); + }); }); }; diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index dd5961839b..12a3327c55 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -45,6 +45,14 @@ helpers.notAllowed = function(req, res, error) { } }; +helpers.redirect = function(res, url) { + if (res.locals.isAPI) { + res.status(302).json(url); + } else { + res.redirect(url); + } +}; + helpers.buildCategoryBreadcrumbs = function(cid, callback) { var breadcrumbs = []; diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 1d756b4189..8429e19396 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -56,12 +56,8 @@ topicsController.get = function(req, res, next) { var postCount = parseInt(results.topic.postcount, 10); var pageCount = Math.max(1, Math.ceil((postCount - 1) / settings.postsPerPage)); - if (utils.isNumber(req.params.post_index)) { - var url = ''; - if (req.params.post_index < 1 || req.params.post_index > postCount) { - url = '/topic/' + req.params.topic_id + '/' + req.params.slug + (req.params.post_index > postCount ? '/' + postCount : ''); - return res.locals.isAPI ? res.status(302).json(url) : res.redirect(url); - } + if (utils.isNumber(req.params.post_index) && (req.params.post_index < 1 || req.params.post_index > postCount)) { + return helpers.redirect(res, '/topic/' + req.params.topic_id + '/' + req.params.slug + (req.params.post_index > postCount ? '/' + postCount : '')); } if (settings.usePagination && (req.query.page < 1 || req.query.page > pageCount)) { @@ -266,7 +262,7 @@ topicsController.get = function(req, res, next) { }); topics.increaseViewCount(tid); - + plugins.fireHook('filter:topic.build', {req: req, res: res, templateData: data}, function(err, data) { if (err) { return next(err); diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 85cc10c908..62575d066b 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -60,12 +60,7 @@ middleware.redirectToAccountIfLoggedIn = function(req, res, next) { if (err) { return next(err); } - - if (res.locals.isAPI) { - res.status(302).json(nconf.get('relative_path') + '/user/' + userslug); - } else { - res.redirect(nconf.get('relative_path') + '/user/' + userslug); - } + helpers.redirect(res, '/user/' + userslug); }); }; @@ -85,13 +80,7 @@ middleware.addSlug = function(req, res, next) { return next(err); } - var url = nconf.get('relative_path') + name + encodeURI(slug); - - if (res.locals.isAPI) { - res.status(302).json(url); - } else { - res.redirect(url); - } + helpers.redirect(res, name + encodeURI(slug)); }); } diff --git a/src/routes/index.js b/src/routes/index.js index a6c51b17c9..37ce391e54 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -218,7 +218,7 @@ function handleErrors(app, middleware) { } if (parseInt(err.status, 10) === 302 && err.path) { - return res.locals.isAPI ? res.status(302).json(err) : res.redirect(err.path); + return res.locals.isAPI ? res.status(302).json(err.path) : res.redirect(err.path); } res.status(err.status || 500); From 49a173bdf0af6dec0e508ce3474d4b767d157590 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 18:33:42 -0400 Subject: [PATCH 048/102] last bit of fixes to composer --- public/src/modules/composer/resize.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 6267228761..88ba15acd1 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -22,10 +22,6 @@ define('composer/resize', function() { postContainer.percentage = percentage; if (percentage) { - if (percentage < 0.35) { - // write snap to taskbar code - } - if (env === 'md' || env === 'lg') { postContainer.css('transform', 'translate(0, ' + (Math.abs(1-percentage) * 100) + '%)'); } @@ -35,7 +31,7 @@ define('composer/resize', function() { // at this point we should use modernizr if (env === 'sm' || env === 'xs' || window.innerHeight < 480) { app.toggleNavbar(false); - //postContainer.css('height', $(window).height()); + postContainer.find('textarea').css('height', $(window).height()); } if (config.hasImageUploadPlugin) { @@ -59,7 +55,7 @@ define('composer/resize', function() { resize.handleResize = function(postContainer) { function resizeStart(e) { var resizeRect = resizeEl[0].getBoundingClientRect(), - resizeCenterY = resizeRect.top + resizeRect.height; + resizeCenterY = resizeRect.top + (resizeRect.height / 2); resizeOffset = (resizeCenterY - e.clientY) / 2; resizeActive = true; From 0913dbbade05651b237a2ff8a4adbda71ac63676 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 18:39:41 -0400 Subject: [PATCH 049/102] added a border effect on max'd composer --- public/src/modules/composer/resize.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 88ba15acd1..770f087b3c 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -89,7 +89,7 @@ define('composer/resize', function() { function toggleMaximize(e) { if (e.clientY - resizeDown === 0 || snapToTop) { - var newPercentage = ($(window).height() - $('#header-menu').height()) / $(window).height(); + var newPercentage = ($(window).height() - $('#header-menu').height() - 1) / $(window).height(); if (!postContainer.hasClass('maximized') || !snapToTop) { oldPercentage = postContainer.percentage; From 6059165a54040f8b22b9439744b907de998c3122 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 9 Mar 2015 18:52:53 -0400 Subject: [PATCH 050/102] if composer:resizePercentage hasn't been set, default to half the page --- public/src/modules/composer/resize.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 770f087b3c..f21c0027b3 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -9,7 +9,7 @@ define('composer/resize', function() { env; resize.reposition = function(postContainer) { - var percentage = localStorage.getItem('composer:resizePercentage'); + var percentage = localStorage.getItem('composer:resizePercentage') || 0.5; doResize(postContainer, percentage); }; From 5d7b46935d1ffc59286f3c1bbfc3920356e4c9f4 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 4 Mar 2015 17:17:54 -0500 Subject: [PATCH 051/102] fixing issue where grunt wouldn't read js from file properly if nodebb wasn't run in production mode at least once --- src/meta/js.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/meta/js.js b/src/meta/js.js index b8fa903c12..26e8f497ae 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -209,17 +209,24 @@ module.exports = function(Meta) { Meta.js.getFromFile = function(minify, callback) { var scriptPath = path.join(__dirname, '../../public/nodebb.min.js'), - mapPath = path.join(__dirname, '../../public/nodebb.min.js.map'); + mapPath = path.join(__dirname, '../../public/nodebb.min.js.map'), + paths = [scriptPath]; fs.exists(scriptPath, function(exists) { if (exists) { if (nconf.get('isPrimary') === 'true') { - winston.verbose('[meta/js] Reading client-side scripts from file'); - async.map([scriptPath, mapPath], fs.readFile, function(err, files) { - Meta.js.cache = files[0]; - Meta.js.map = files[1]; + fs.exists(mapPath, function(exists) { + if (exists) { + paths.push(mapPath); + } - emitter.emit('meta:js.compiled'); - callback(); + winston.verbose('[meta/js] Reading client-side scripts from file'); + async.map(paths, fs.readFile, function(err, files) { + Meta.js.cache = files[0]; + Meta.js.map = files[1] || ''; + + emitter.emit('meta:js.compiled'); + callback(); + }); }); } else { callback(); From 25a2e9b8120292190eb0f16d39b79a88858a5116 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 9 Mar 2015 19:29:51 -0400 Subject: [PATCH 052/102] we just need the group members :trollface: --- src/notifications.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/notifications.js b/src/notifications.js index 5beed15f9c..3aafdb346d 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -207,12 +207,12 @@ var async = require('async'), Notifications.pushGroup = function(notification, groupName, callback) { callback = callback || function() {}; - groups.get(groupName, {}, function(err, groupObj) { - if (err || !groupObj || !Array.isArray(groupObj.members) || !groupObj.members.length) { + groups.getMembers(groupName, 0, -1, function(err, members) { + if (err || !Array.isArray(members) || !members.length) { return callback(err); } - Notifications.push(notification, groupObj.members, callback); + Notifications.push(notification, members, callback); }); }; From 724df69561651a1dae63714863043fe33a548658 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 9 Mar 2015 21:00:07 -0400 Subject: [PATCH 053/102] fix redirects --- src/controllers/helpers.js | 2 +- src/middleware/middleware.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index 12a3327c55..3b3faa0622 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -49,7 +49,7 @@ helpers.redirect = function(res, url) { if (res.locals.isAPI) { res.status(302).json(url); } else { - res.redirect(url); + res.redirect(nconf.get('relative_path') + url); } }; diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 62575d066b..34d2a79870 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -60,14 +60,14 @@ middleware.redirectToAccountIfLoggedIn = function(req, res, next) { if (err) { return next(err); } - helpers.redirect(res, '/user/' + userslug); + controllers.helpers.redirect(res, '/user/' + userslug); }); }; middleware.redirectToLoginIfGuest = function(req, res, next) { if (!req.user || parseInt(req.user.uid, 10) === 0) { req.session.returnTo = nconf.get('relative_path') + req.url.replace(/^\/api/, ''); - return res.redirect(nconf.get('relative_path') + '/login'); + return controllers.helpers.redirect(res, '/login'); } else { next(); } @@ -80,7 +80,7 @@ middleware.addSlug = function(req, res, next) { return next(err); } - helpers.redirect(res, name + encodeURI(slug)); + controllers.helpers.redirect(res, name + encodeURI(slug)); }); } From 6454e89bac0ba6215cea686c4669dcdf045cd9d3 Mon Sep 17 00:00:00 2001 From: Trevor Date: Tue, 10 Mar 2015 09:40:36 -0400 Subject: [PATCH 054/102] Update FontAwesome 4.3.0 --- .../vendor/fontawesome/fonts/FontAwesome.otf | Bin 85908 -> 93888 bytes .../fontawesome/fonts/fontawesome-webfont.eot | Bin 56006 -> 60767 bytes .../fontawesome/fonts/fontawesome-webfont.svg | 61 +++++++++++++++--- .../fontawesome/fonts/fontawesome-webfont.ttf | Bin 112160 -> 122092 bytes .../fonts/fontawesome-webfont.woff | Bin 65452 -> 71508 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 56780 bytes .../less/{spinning.less => animated.less} | 7 +- public/vendor/fontawesome/less/core.less | 4 +- public/vendor/fontawesome/less/extras.less | 2 - .../vendor/fontawesome/less/font-awesome.less | 4 +- public/vendor/fontawesome/less/icons.less | 46 ++++++++++++- public/vendor/fontawesome/less/mixins.less | 4 +- public/vendor/fontawesome/less/path.less | 1 + public/vendor/fontawesome/less/variables.less | 51 ++++++++++++++- 14 files changed, 161 insertions(+), 19 deletions(-) create mode 100644 public/vendor/fontawesome/fonts/fontawesome-webfont.woff2 rename public/vendor/fontawesome/less/{spinning.less => animated.less} (79%) delete mode 100644 public/vendor/fontawesome/less/extras.less diff --git a/public/vendor/fontawesome/fonts/FontAwesome.otf b/public/vendor/fontawesome/fonts/FontAwesome.otf index 81c9ad949b47f64afeca5642ee2494b6e3147f44..f7936cc1e789eea5438d576d6b12de20191da09d 100644 GIT binary patch delta 36186 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 D;duUM delta 28309 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%0DKehr}RFC`2XTB_?==0w^)u1m5PYii@6f)6_5Ydu zv+NIZ_(Rt}Q++LT5!n8!J4x!>sE&v_3*cXat{Zq5;17w;B6$epw}$Rg`0nFJg5D-L zYvw@(goc5TeJjM($AJAZxZHZN}RzBcP0=_>ZI6WVGU zO#Nk-YqZTa3{!84P0K~GsI#32<+_AsXU43wILwZS(8n%S9)lP!Dg$$e2$$9$E?^Nj zql4do#+a8qEP(bD2)DpP|$dp<`TZ#bY6^~7Xv_Lle)77^OsVhMOm(@ z??8O8kA%}ZWpR&2v!7qFSw@TF6d*=9YT^Rtk(n8p=CQWvt1Om=n&5uP;GiT6 zMRvbm39kbp*KB`qoVg12w52Z)T}`X41P>D|q_%K#zuhwb+BpEogY0E)KnSy#@+(m5 z20@LG@LUEvk`I|OIUV^^0_YtG9AElBS!Dsh%k^P9r0moJ25Lkm-gh#igwBDhAOj0!EF&8MxV^-m1U1MEd?H7} zL;r;tfFIT|ei3-Z@gyM=!%Ba7Pa626JRAA`V<2D<{RLRT@0o=bE)XF)nFtUL67`2L z{?_Qz_`Yy2t+I)?9&z#z__Q%L3pnhN}U z_rN#WU)kD59D4whbSYERHY01jM7id50EuI1ctl?<_IT=Y5vP>(sNNkB&U5&F&^kBhm5y{o!y!F+4wdxXoy;!4$W`?_nL(+bK_QDAMUV1O0AwZ| z6j)s}9YEZbY-C^Y)9Ej`aS&~{sXCG2SS3ce$EY;Yv-c8TlrD$C85ATlLZpGP_YWfi z`RQ?z1@zIfa{yqfsUDMEPpwuX%XHdO+ASb3EPi1fBPocvfgsC0xa^CG2SWBPWQ&GS zpCXPti8b>WkYbf#Vg%A?&_UwUsUQE_t4GX?7QqUpKJ2Iw#%)Q4Ft(`9Ja&Yk{C@38 z@%T`)#wWy(kKfEH;ZBQ(m*Iq&L=<)4D7tNO{SsA4Fp4D?(Ex6nQS&f3TK|atgj`fE z2|OX0(&(ZqxJd~IANX&dvX?U14_<~h2(lP6k^H8ep;2HW6oPo?U%v{M>|{sU~;p zLTv$OTx3H^4zNUn4wUfo>j{CEvTC@C+cw+cW*ABH6u@!M2EdBL?1GbL_#e;7YDBas zic?MTazk(khXSyPeDom_I~wkLv?Wr8<%egEfM!*M9^kl$>zsVzaP}S!gcD3;Czy#58RTm?`p)RTS8I<-sC3+*n{A)P*rU!@Npj`e{x9xsif2v zTW`{q3p^?A!Mk60Q{(FLt(&TVe9z z0-!PiOV02JcNeq?AbJaI+B9xC;LB=}Ho0vH(@;Qe0zq~-8ckOa!(u@Wou`p_TR|QT z38H`lJE$G{q1egUX@&v$x7wNLWD#j*!D58GLv^bT+jpdKBrK#SsQsWK(+RO40VA^w z0nA7MN1Y1Fc#5JkwD5TtHG1t;lo=i)U+kFG?1Jh11h9382!marrRE2eZh;JGh`wNO zQA_~n?%97HOKLA^#oG(5*bgSllS%rOc(S%Yj00cYR;!D9G_90{pfq7D4I*$k?byOV zR|epi%oIJ{ou`5zS!-_dnxOa{uNv)(luMo^5TCOItq}2}sxCztLEzBGS)Mf6dzaw< z!GweAgvFYJu&mH(Vl9HJBV%=Jz~~i%nDGIF9ncTET-AQ=fv{L11&K_;ei!iht(!De;ym|y7ksL|^5Ko~B-vSh80++s?unD}bZaYa@ zPH4M$&fw;xEGN3_H1vHW><%-+dg7dfW)F8$bB+h7sThoOtteO(v{&-+iK}r$%G))# z*Nhx^!ZMj1VeG?EkWg+0CYQSX1t96fV9^3c+9C393LU&CHsFCa1q99$`zTMsEWwLc zxsw1|A?k8-m8HCrk6;K7dhNDJN3R9iws%6vTq_}PtR2CZ8TG;ltZ4I}sU+^s8`P3F5QxrypG1-{ zGlr^7$Wsy(lo=xfC~BpKfg<2z4OEeEF@~x{Pi7O#CvqMJy+f+}=CB_$&IuEslB@s# J000000038FvZ??8 literal 56006 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�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 - + @@ -147,14 +147,14 @@ - + - + @@ -275,7 +275,7 @@ - + @@ -411,7 +411,7 @@ - + @@ -438,7 +438,7 @@ - + @@ -513,8 +513,53 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/vendor/fontawesome/fonts/fontawesome-webfont.ttf b/public/vendor/fontawesome/fonts/fontawesome-webfont.ttf index 96a3639cdde5e8ab459c6380e3b9524ee81641dc..ed9372f8ea0fbaa04f42630a48887e4b38945345 100644 GIT binary patch delta 13268 zcmbVz30#y_*Z4ipG7G}&3yTa4+Ylnlz|4RNjJV~JDDH@e3yK?}xR9AMDlVy+fr(pa znoDGsQITeeW~HX4rY)9*edU{dW@TmyGtYeIJ_9bjz3>0``#-~7o_p^(_ug~QJ?Gr> zT((`8Tt6Un5g>#ph?}saxL2E6RO7#6-CMSTCD2?TLweQtxDZA3|XN_0p2D6XaL* zwFKUFV!gezw8S-5aW^0y3o5Z7rgZx3$}Z!yUGaSj!q-omF@9|DnW|$14nKxS3a5{) zEN9j;9SMB!61I;l8#}$kI=AWqz8@omb(hbmn0>jh+oJ?N?m>vYZeGc_iMFyKM+kiL z1Gbl7pwlI1PX-OA=_i98`z}Q+xccKSVpSl%889&T223KxocKl?v62K>OL)R@t2v|z zS>{if3dFjy<_goXW*lgN)Xarg;~}I1?W!Z;U>l|rh!Y`WYTkfC?xyKxc8!7=$K6!j zG}n|f#WLlu%3p%8vzoE�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 diff --git a/public/vendor/fontawesome/fonts/fontawesome-webfont.woff b/public/vendor/fontawesome/fonts/fontawesome-webfont.woff index 628b6a52a87e62c6f22426e17c01f6a303aa194e..8b280b98fa2fa261aa4b0f8fd061f772073ef83e 100644 GIT binary patch delta 71000 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ɲSD;H&r=zK(C;_wfh#L;Ml`7=MC4#h>BN@lAXS-^O?FUHk?965qr3@dNx2 ze}%us-{431F@A!d;%ABTv!QK{jV&DGzB)F4HtZ{LUyb`(+}Gp25%pXg}(4o zUDF!m0zuO~1tvMif^fKET-iGedAvdbK2pqO?}_D&cioo+Ydn>|~#lDgAN2cGJG z8!5vXh#c)E6x9k+fjJN<&rv(2jx%XnB=B@@ILL%9cWKksoT;K~snd#Xdb%Y@rz_MT z>xr%>d?UxE$PFz=@29$!+AGjuIcS3$SBwT8FE2;(lF$##?sSUJQZ(%jt&4E6EZ2^7Rb8;xlnJvV zoUCi=LFkE$D{S4g3Io+u*jC|X)DCY*9ws|Q#|+ZGp?V^%8-hH<7gqKI;VPPcs`n>V zuT$=-WhS@Xq|Zm9!x#;jD&>=NyS z+NBurL{3Z-(dahvEa;ZwixPRoHtn8Vo+f|VBB!gCusf=k@l?Cx46?d27|qRwvZl4Ao=Fz6a%c1w}jmX%WIMlVzn;e-w>~+9$?29`Ol73muCxhG+IgV9Hj=1g7-K&%lDd!a|HbNm#u3F;y?sO7V*!FAbt)*1VZ~7bhS}CQ-4F@te{qi{%-@ z<+9JohFFgFNa{vJ+f*rt}UasJPnr!$-@4IWuvBnmxq{YW7$r zC?gnHjg;>DwG45SQf48_sxgTvGf{P1f%tB^zUj{@NTV}z!=jZ^YGbv$eERYJ8JZ+} zN0z^T9AvqUQofwbS%QL|X&4ETvC((=jF4$vhJ;e9R0~nbmlc7+p2C_dTSSoMOd;y> z>Q+*OUb3gT$r?XKWiL?_#{1Zok>4SVd^<%CryD7PLY|W#d&4g+UbtRqEU{xM4(v5fw&MV%v5ci+jdZ8CPXom2p+ZRT)=h zT$OQE)>LCnHAd7JQDa0cHg8e9;i5|1%M}c*#VQvy;=UR8ym_7XsI%5OYpt_?*1G(_ z(0UBri4`|kaf7#QFsQ+x27?+5YA~q5paz@TWJHq@O-3{s(Tq)9EWa_R*&=^;%!@knqRzaiGcW4njA%2W c%?Kt%z0HVr{l7^Jpz#0z00C14{Ijh90H1zNjsO4v diff --git a/public/vendor/fontawesome/fonts/fontawesome-webfont.woff2 b/public/vendor/fontawesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3311d585145b1cc1b9581e914acbb32d8542b4f5 GIT binary patch literal 56780 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 literal 0 HcmV?d00001 diff --git a/public/vendor/fontawesome/less/spinning.less b/public/vendor/fontawesome/less/animated.less similarity index 79% rename from public/vendor/fontawesome/less/spinning.less rename to public/vendor/fontawesome/less/animated.less index 6e1564e05e..66ad52a5ba 100644 --- a/public/vendor/fontawesome/less/spinning.less +++ b/public/vendor/fontawesome/less/animated.less @@ -1,4 +1,4 @@ -// Spinning Icons +// Animated Icons // -------------------------- .@{fa-css-prefix}-spin { @@ -6,6 +6,11 @@ animation: fa-spin 2s infinite linear; } +.@{fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); diff --git a/public/vendor/fontawesome/less/core.less b/public/vendor/fontawesome/less/core.less index 01d1910f72..f814f1e17e 100644 --- a/public/vendor/fontawesome/less/core.less +++ b/public/vendor/fontawesome/less/core.less @@ -3,9 +3,11 @@ .@{fa-css-prefix} { display: inline-block; - font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font: normal normal normal @fa-font-size-base/1 FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + transform: translate(0, 0); // ensures no half-pixel rendering in firefox + } diff --git a/public/vendor/fontawesome/less/extras.less b/public/vendor/fontawesome/less/extras.less deleted file mode 100644 index 89faf70fc9..0000000000 --- a/public/vendor/fontawesome/less/extras.less +++ /dev/null @@ -1,2 +0,0 @@ -// Extras -// -------------------------- diff --git a/public/vendor/fontawesome/less/font-awesome.less b/public/vendor/fontawesome/less/font-awesome.less index 195fd46c66..1f45c63d15 100644 --- a/public/vendor/fontawesome/less/font-awesome.less +++ b/public/vendor/fontawesome/less/font-awesome.less @@ -1,5 +1,5 @@ /*! - * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ @@ -11,7 +11,7 @@ @import "fixed-width.less"; @import "list.less"; @import "bordered-pulled.less"; -@import "spinning.less"; +@import "animated.less"; @import "rotated-flipped.less"; @import "stacked.less"; @import "icons.less"; diff --git a/public/vendor/fontawesome/less/icons.less b/public/vendor/fontawesome/less/icons.less index b5c26c701b..c265de5a68 100644 --- a/public/vendor/fontawesome/less/icons.less +++ b/public/vendor/fontawesome/less/icons.less @@ -158,6 +158,7 @@ .@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } .@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } .@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, .@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } .@{fa-css-prefix}-github:before { content: @fa-var-github; } .@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } @@ -397,7 +398,8 @@ .@{fa-css-prefix}-trello:before { content: @fa-var-trello; } .@{fa-css-prefix}-female:before { content: @fa-var-female; } .@{fa-css-prefix}-male:before { content: @fa-var-male; } -.@{fa-css-prefix}-gittip:before { content: @fa-var-gittip; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } .@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } .@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } .@{fa-css-prefix}-archive:before { content: @fa-var-archive; } @@ -500,6 +502,7 @@ .@{fa-css-prefix}-send-o:before, .@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } .@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-genderless:before, .@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } .@{fa-css-prefix}-header:before { content: @fa-var-header; } .@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } @@ -550,3 +553,44 @@ .@{fa-css-prefix}-sheqel:before, .@{fa-css-prefix}-ils:before { content: @fa-var-ils; } .@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } diff --git a/public/vendor/fontawesome/less/mixins.less b/public/vendor/fontawesome/less/mixins.less index b7bfadc797..c97f4604ca 100644 --- a/public/vendor/fontawesome/less/mixins.less +++ b/public/vendor/fontawesome/less/mixins.less @@ -3,11 +3,13 @@ .fa-icon() { display: inline-block; - font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font: normal normal normal @fa-font-size-base/1 FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + transform: translate(0, 0); // ensures no half-pixel rendering in firefox + } .fa-icon-rotate(@degrees, @rotation) { diff --git a/public/vendor/fontawesome/less/path.less b/public/vendor/fontawesome/less/path.less index c5a691246d..9211e66597 100644 --- a/public/vendor/fontawesome/less/path.less +++ b/public/vendor/fontawesome/less/path.less @@ -5,6 +5,7 @@ font-family: 'FontAwesome'; src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); diff --git a/public/vendor/fontawesome/less/variables.less b/public/vendor/fontawesome/less/variables.less index 56a699851f..d526064c84 100644 --- a/public/vendor/fontawesome/less/variables.less +++ b/public/vendor/fontawesome/less/variables.less @@ -1,10 +1,11 @@ // Variables // -------------------------- -@fa-font-path: "./vendor/fontawesome/fonts"; -//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.3.0/fonts"; // for referencing Bootstrap CDN font files directly @fa-css-prefix: fa; -@fa-version: "4.2.0"; +@fa-version: "4.3.0"; @fa-border-color: #eee; @fa-inverse: #fff; @fa-li-width: (30em / 14); @@ -56,6 +57,7 @@ @fa-var-bar-chart-o: "\f080"; @fa-var-barcode: "\f02a"; @fa-var-bars: "\f0c9"; +@fa-var-bed: "\f236"; @fa-var-beer: "\f0fc"; @fa-var-behance: "\f1b4"; @fa-var-behance-square: "\f1b5"; @@ -83,6 +85,7 @@ @fa-var-bullhorn: "\f0a1"; @fa-var-bullseye: "\f140"; @fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; @fa-var-cab: "\f1ba"; @fa-var-calculator: "\f1ec"; @fa-var-calendar: "\f073"; @@ -98,6 +101,8 @@ @fa-var-caret-square-o-right: "\f152"; @fa-var-caret-square-o-up: "\f151"; @fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; @fa-var-cc: "\f20a"; @fa-var-cc-amex: "\f1f3"; @fa-var-cc-discover: "\f1f2"; @@ -146,6 +151,7 @@ @fa-var-comments-o: "\f0e6"; @fa-var-compass: "\f14e"; @fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; @fa-var-copy: "\f0c5"; @fa-var-copyright: "\f1f9"; @fa-var-credit-card: "\f09d"; @@ -157,11 +163,13 @@ @fa-var-cut: "\f0c4"; @fa-var-cutlery: "\f0f5"; @fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; @fa-var-database: "\f1c0"; @fa-var-dedent: "\f03b"; @fa-var-delicious: "\f1a5"; @fa-var-desktop: "\f108"; @fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; @fa-var-digg: "\f1a6"; @fa-var-dollar: "\f155"; @fa-var-dot-circle-o: "\f192"; @@ -191,6 +199,8 @@ @fa-var-eye-slash: "\f070"; @fa-var-eyedropper: "\f1fb"; @fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; @fa-var-facebook-square: "\f082"; @fa-var-fast-backward: "\f049"; @fa-var-fast-forward: "\f050"; @@ -232,6 +242,7 @@ @fa-var-folder-open: "\f07c"; @fa-var-folder-open-o: "\f115"; @fa-var-font: "\f031"; +@fa-var-forumbee: "\f211"; @fa-var-forward: "\f04e"; @fa-var-foursquare: "\f180"; @fa-var-frown-o: "\f119"; @@ -242,6 +253,7 @@ @fa-var-ge: "\f1d1"; @fa-var-gear: "\f013"; @fa-var-gears: "\f085"; +@fa-var-genderless: "\f1db"; @fa-var-gift: "\f06b"; @fa-var-git: "\f1d3"; @fa-var-git-square: "\f1d2"; @@ -256,6 +268,7 @@ @fa-var-google-plus-square: "\f0d4"; @fa-var-google-wallet: "\f1ee"; @fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; @fa-var-group: "\f0c0"; @fa-var-h-square: "\f0fd"; @fa-var-hacker-news: "\f1d4"; @@ -268,9 +281,11 @@ @fa-var-headphones: "\f025"; @fa-var-heart: "\f004"; @fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; @fa-var-history: "\f1da"; @fa-var-home: "\f015"; @fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; @fa-var-html5: "\f13b"; @fa-var-ils: "\f20b"; @fa-var-image: "\f03e"; @@ -294,6 +309,7 @@ @fa-var-lastfm: "\f202"; @fa-var-lastfm-square: "\f203"; @fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; @fa-var-legal: "\f0e3"; @fa-var-lemon-o: "\f094"; @fa-var-level-down: "\f149"; @@ -325,10 +341,17 @@ @fa-var-mail-reply-all: "\f122"; @fa-var-male: "\f183"; @fa-var-map-marker: "\f041"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; @fa-var-maxcdn: "\f136"; @fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; @fa-var-medkit: "\f0fa"; @fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; @fa-var-microphone: "\f130"; @fa-var-microphone-slash: "\f131"; @fa-var-minus: "\f068"; @@ -340,8 +363,10 @@ @fa-var-money: "\f0d6"; @fa-var-moon-o: "\f186"; @fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; @fa-var-music: "\f001"; @fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; @fa-var-newspaper-o: "\f1ea"; @fa-var-openid: "\f19b"; @fa-var-outdent: "\f03b"; @@ -366,6 +391,7 @@ @fa-var-pied-piper: "\f1a7"; @fa-var-pied-piper-alt: "\f1a8"; @fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; @fa-var-pinterest-square: "\f0d3"; @fa-var-plane: "\f072"; @fa-var-play: "\f04b"; @@ -415,8 +441,10 @@ @fa-var-search: "\f002"; @fa-var-search-minus: "\f010"; @fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; @fa-var-send: "\f1d8"; @fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; @fa-var-share: "\f064"; @fa-var-share-alt: "\f1e0"; @fa-var-share-alt-square: "\f1e1"; @@ -425,11 +453,15 @@ @fa-var-shekel: "\f20b"; @fa-var-sheqel: "\f20b"; @fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; @fa-var-shopping-cart: "\f07a"; @fa-var-sign-in: "\f090"; @fa-var-sign-out: "\f08b"; @fa-var-signal: "\f012"; +@fa-var-simplybuilt: "\f215"; @fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; @fa-var-skype: "\f17e"; @fa-var-slack: "\f198"; @fa-var-sliders: "\f1de"; @@ -468,10 +500,12 @@ @fa-var-step-forward: "\f051"; @fa-var-stethoscope: "\f0f1"; @fa-var-stop: "\f04d"; +@fa-var-street-view: "\f21d"; @fa-var-strikethrough: "\f0cc"; @fa-var-stumbleupon: "\f1a4"; @fa-var-stumbleupon-circle: "\f1a3"; @fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; @fa-var-suitcase: "\f0f2"; @fa-var-sun-o: "\f185"; @fa-var-superscript: "\f12b"; @@ -506,6 +540,9 @@ @fa-var-toggle-on: "\f205"; @fa-var-toggle-right: "\f152"; @fa-var-toggle-up: "\f151"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; @fa-var-trash: "\f1f8"; @fa-var-trash-o: "\f014"; @fa-var-tree: "\f1bb"; @@ -532,7 +569,14 @@ @fa-var-usd: "\f155"; @fa-var-user: "\f007"; @fa-var-user-md: "\f0f0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; @fa-var-users: "\f0c0"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; @fa-var-video-camera: "\f03d"; @fa-var-vimeo-square: "\f194"; @fa-var-vine: "\f1ca"; @@ -544,6 +588,7 @@ @fa-var-wechat: "\f1d7"; @fa-var-weibo: "\f18a"; @fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; @fa-var-wheelchair: "\f193"; @fa-var-wifi: "\f1eb"; @fa-var-windows: "\f17a"; From 8d2f89a5e2a9d656b8fb0df1858d61eb31b85cc4 Mon Sep 17 00:00:00 2001 From: Trevor Date: Tue, 10 Mar 2015 09:50:32 -0400 Subject: [PATCH 055/102] Update FontAwesome 4.3.0 Fixed incorrect variables path. --- public/vendor/fontawesome/less/variables.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/vendor/fontawesome/less/variables.less b/public/vendor/fontawesome/less/variables.less index d526064c84..775708b735 100644 --- a/public/vendor/fontawesome/less/variables.less +++ b/public/vendor/fontawesome/less/variables.less @@ -1,7 +1,7 @@ // Variables // -------------------------- -@fa-font-path: "../fonts"; +@fa-font-path: "./vendor/fontawesome/fonts"; @fa-font-size-base: 14px; //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.3.0/fonts"; // for referencing Bootstrap CDN font files directly @fa-css-prefix: fa; From 2a80140e704b35c694640ba5f59edab69a4a4e60 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 10 Mar 2015 11:52:32 -0400 Subject: [PATCH 056/102] fixed issue where socket.io would no longer reconnect perpetually, new behaviour waits 10x the reconnect delay, and then starts over. Also upped the reconnection delay default to 1.5s. --- public/src/app.js | 14 +++++++------- src/controllers/api.js | 2 +- src/views/admin/settings/sockets.tpl | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index 53e43e86fc..d1f6ab93bc 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -17,12 +17,12 @@ app.cacheBuster = null; function socketIOConnect() { var ioParams = { reconnectionAttempts: config.maxReconnectionAttempts, - reconnectionDelay : config.reconnectionDelay, + reconnectionDelay: config.reconnectionDelay, transports: config.socketioTransports, path: config.relative_path + '/socket.io' }; - socket = io.connect(config.websocketAddress, ioParams); + socket = io(config.websocketAddress, ioParams); reconnecting = false; socket.on('event:connect', function () { @@ -41,11 +41,6 @@ app.cacheBuster = null; }); socket.on('reconnecting', function (attempt) { - if(attempt === parseInt(config.maxReconnectionAttempts, 10)) { - socket.io.attempts = 0; - return; - } - reconnecting = true; var reconnectEl = $('#reconnect'); @@ -74,6 +69,11 @@ app.cacheBuster = null; socket.on('event:alert', function(data) { app.alert(data); }); + + socket.on('reconnect_failed', function() { + // Wait ten times the reconnection delay and then start over + setTimeout(socket.connect.bind(socket), parseInt(config.reconnectionDelay, 10) * 10); + }); } function onSocketConnect(data) { diff --git a/src/controllers/api.js b/src/controllers/api.js index c98fd79e0c..8be2211ca1 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -51,7 +51,7 @@ apiController.getConfig = function(req, res, next) { config.disableSocialButtons = parseInt(meta.config.disableSocialButtons, 10) === 1; config.disableChat = parseInt(meta.config.disableChat, 10) === 1; config.maxReconnectionAttempts = meta.config.maxReconnectionAttempts || 5; - config.reconnectionDelay = meta.config.reconnectionDelay || 200; + config.reconnectionDelay = meta.config.reconnectionDelay || 1500; config.tagsPerTopic = meta.config.tagsPerTopic || 5; config.minimumTagLength = meta.config.minimumTagLength || 3; config.maximumTagLength = meta.config.maximumTagLength || 15; diff --git a/src/views/admin/settings/sockets.tpl b/src/views/admin/settings/sockets.tpl index ab24ab2970..94ef41bf56 100644 --- a/src/views/admin/settings/sockets.tpl +++ b/src/views/admin/settings/sockets.tpl @@ -6,11 +6,11 @@
    - +
    - +
From daf9999a298b645902f5fec0d59cfade8415ee6a Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 10 Mar 2015 13:53:44 -0400 Subject: [PATCH 057/102] prevent composer from going too low --- public/src/modules/composer/resize.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index f21c0027b3..608efed945 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -22,6 +22,10 @@ define('composer/resize', function() { postContainer.percentage = percentage; if (percentage) { + if (percentage < 0.25) { + percentage = 0.25; + } + if (env === 'md' || env === 'lg') { postContainer.css('transform', 'translate(0, ' + (Math.abs(1-percentage) * 100) + '%)'); } From d342e01ef15945b694dc94a7dc902ff4dc0508f8 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 10 Mar 2015 14:09:24 -0400 Subject: [PATCH 058/102] search group members --- src/groups.js | 63 +++++++++++++++++++++++++++++++++++++++++ src/socket.io/groups.js | 9 ++++++ src/user/search.js | 43 +++++++++++++++++----------- 3 files changed, 98 insertions(+), 17 deletions(-) diff --git a/src/groups.js b/src/groups.js index 0645fc55ac..dddd0aafcf 100644 --- a/src/groups.js +++ b/src/groups.js @@ -1096,4 +1096,67 @@ var async = require('async'), next(null, groups); }; + Groups.searchMembers = function(data, callback) { + + function userInGroup(userGroups) { + for(var i=0; i Date: Tue, 10 Mar 2015 14:55:20 -0400 Subject: [PATCH 059/102] if bgColor and color are not sent in the category creation call, automatic colours are supplied --- public/src/admin/manage/categories.js | 2 -- src/categories/create.js | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index a9cf3b60e8..52d13874ab 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -75,8 +75,6 @@ define('admin/manage/categories', [ name: $('#inputName').val(), description: $('#inputDescription').val(), icon: $('#new-category-modal i').attr('value'), - bgColor: '#0059b2', - color: '#fff', order: $('.admin-categories #entry-container').children().length + 1 }; diff --git a/src/categories/create.js b/src/categories/create.js index a8bfaeb6fc..ce293d1c42 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -14,15 +14,16 @@ module.exports = function(Categories) { } var slug = cid + '/' + utils.slugify(data.name), - order = data.order || cid; // If no order provided, place it at the end + order = data.order || cid, // If no order provided, place it at the end + colours = Categories.assignColours(); var category = { cid: cid, name: data.name, description: data.description, icon: data.icon, - bgColor: data.bgColor, - color: data.color, + bgColor: data.bgColor || colours[0], + color: data.color || colours[1], slug: slug, parentCid: 0, topic_count: 0, @@ -52,4 +53,12 @@ module.exports = function(Categories) { }); }); }; + + Categories.assignColours = function() { + var backgrounds = ['#AB4642', '#DC9656', '#F7CA88', '#A1B56C', '#86C1B9', '#7CAFC2', '#BA8BAF', '#A16946'], + text = ['#fff', '#fff', '#333', '#fff', '#333', '#fff', '#fff', '#fff'], + index = Math.floor(Math.random() * backgrounds.length); + + return [backgrounds[index], text[index]]; + }; }; From 201c4b35da7179e529a296c163c2d91ad07a5396 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 10 Mar 2015 15:04:17 -0400 Subject: [PATCH 060/102] pagination data if query is empty get all uids --- src/controllers/users.js | 7 +++++-- src/user/search.js | 20 ++++++++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/controllers/users.js b/src/controllers/users.js index 81001d0f3a..a4cb36259b 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -5,6 +5,7 @@ var usersController = {}; var async = require('async'), user = require('../user'), meta = require('../meta'), + pagination = require('../pagination'), plugins = require('../plugins'), db = require('../database'); @@ -67,11 +68,13 @@ usersController.getUsers = function(set, count, req, res, next) { if (err) { return next(err); } + var pageCount = Math.ceil(data.count / (parseInt(meta.config.userSearchResultsPerPage, 10) || 20)); var userData = { search_display: 'hidden', loadmore_display: data.count > count ? 'block' : 'hide', users: data.users, - show_anon: 'hide' + show_anon: 'hide', + pagination: pagination.create(1, pageCount) }; res.render('users', userData); @@ -94,7 +97,7 @@ function getUsersAndCount(set, uid, count, callback) { return user && parseInt(user.uid, 10); }); - callback(null, {users: results.users, count: results.count}); + callback(null, results); }); } diff --git a/src/user/search.js b/src/user/search.js index bc5efa7f77..fc5b11681e 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -22,19 +22,14 @@ module.exports = function(User) { } var startTime = process.hrtime(); - var keys = searchBy.map(function(searchBy) { - return searchBy + ':uid'; - }); - - var filterBy = Array.isArray(data.filterBy) ? data.filterBy : []; var searchResult = {}; async.waterfall([ function(next) { - findUids(query, keys, startsWith, next); + findUids(query, searchBy, startsWith, next); }, function(uids, next) { - + var filterBy = Array.isArray(data.filterBy) ? data.filterBy : []; filterAndSortUids(uids, filterBy, data.sortBy, next); }, function(uids, next) { @@ -61,6 +56,7 @@ module.exports = function(User) { var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20; var start = Math.max(0, page - 1) * resultsPerPage; var end = start + resultsPerPage; + var pageCount = Math.ceil(data.length / resultsPerPage); var currentPage = Math.max(1, Math.ceil((start + 1) / resultsPerPage)); @@ -70,7 +66,15 @@ module.exports = function(User) { }; }; - function findUids(query, keys, startsWith, callback) { + function findUids(query, searchBy, startsWith, callback) { + if (!query) { + return db.getSortedSetRevRange('users:joindate', 0, -1, callback); + } + + var keys = searchBy.map(function(searchBy) { + return searchBy + ':uid'; + }); + db.getObjects(keys, function(err, hashes) { if (err || !hashes) { return callback(err, []); From 9f4f858ff985300fa5d03ad2a111071e3fcfbf34 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 10 Mar 2015 15:50:40 -0400 Subject: [PATCH 061/102] group member search only look in uids that are member of the group, added custom findUids function to user.search --- src/groups.js | 73 ++++++++++++++++------------------------------ src/user/search.js | 6 +++- 2 files changed, 30 insertions(+), 49 deletions(-) diff --git a/src/groups.js b/src/groups.js index dddd0aafcf..3f1ba0ddf7 100644 --- a/src/groups.js +++ b/src/groups.js @@ -1098,65 +1098,42 @@ var async = require('async'), Groups.searchMembers = function(data, callback) { - function userInGroup(userGroups) { - for(var i=0; i 1) { + uids = uids.filter(function(uid, index, array) { + return array.indexOf(uid) === index; + }); + } - if (!uids.length) { - return callback(null, searchResult); + next(null, uids); } - Groups.getUserGroups(uids, next); - }, - function(groups, next) { - searchResult.users = searchResult.users.filter(function(user, index) { - return user && userInGroup(groups[index]); - }); + ], callback); + } - pagination = user.paginate(data.page, searchResult.users); - searchResult.pagination = pagination.pagination; - searchResult.users = pagination.data; - next(null, searchResult); - } - ], callback); + data.findUids = findUids; + user.search(data, callback); }; }(module.exports)); diff --git a/src/user/search.js b/src/user/search.js index fc5b11681e..7545a6d3f3 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -26,7 +26,11 @@ module.exports = function(User) { var searchResult = {}; async.waterfall([ function(next) { - findUids(query, searchBy, startsWith, next); + if (data.findUids) { + data.findUids(query, searchBy, startsWith, next); + } else { + findUids(query, searchBy, startsWith, next); + } }, function(uids, next) { var filterBy = Array.isArray(data.filterBy) ? data.filterBy : []; From 8e2483b2e6a60d0423fcf48aff158c453686c375 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 11 Mar 2015 10:32:49 -0400 Subject: [PATCH 062/102] fixed #2849 --- src/middleware/middleware.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 34d2a79870..c4c4e6d792 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -154,17 +154,9 @@ middleware.checkAccountPermissions = function(req, res, next) { }; middleware.isAdmin = function(req, res, next) { - function render() { - if (res.locals.isAPI) { - return controllers.helpers.notAllowed(req, res); - } - - middleware.buildHeader(req, res, function() { - controllers.helpers.notAllowed(req, res); - }); - } if (!req.user) { - return render(); + req.session.returnTo = nconf.get('relative_path') + req.url.replace(/^\/api/, ''); + return controllers.helpers.redirect(res, '/login'); } user.isAdministrator((req.user && req.user.uid) ? req.user.uid : 0, function (err, isAdmin) { @@ -172,7 +164,13 @@ middleware.isAdmin = function(req, res, next) { return next(err); } - render(); + if (res.locals.isAPI) { + return controllers.helpers.notAllowed(req, res); + } + + middleware.buildHeader(req, res, function() { + controllers.helpers.notAllowed(req, res); + }); }); }; From 57a64870fd579e6cefcdd3c2a99fd688aeefe16c Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 11 Mar 2015 10:44:34 -0400 Subject: [PATCH 063/102] actually fixing #2849 --- public/src/ajaxify.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 2392511386..fdfdc34a10 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -23,6 +23,11 @@ $(document).ready(function() { ajaxify.currentPage = null; ajaxify.go = function (url, callback, quiet) { + // If ajaxifying into an admin route from regular site, do a cold load. + if (url.indexOf('admin') === 0 && window.location.pathname.indexOf('/admin') !== 0) { + return window.open(RELATIVE_PATH + '/' + url, '_blank'); + } + app.enterRoom(''); $(window).off('scroll'); From 40763d2ae7b2ea3a816a311d2cf7f14c0cd68a9b Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 11 Mar 2015 11:24:46 -0400 Subject: [PATCH 064/102] #2849 again --- public/src/ajaxify.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index fdfdc34a10..ee317d9133 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -23,9 +23,8 @@ $(document).ready(function() { ajaxify.currentPage = null; ajaxify.go = function (url, callback, quiet) { - // If ajaxifying into an admin route from regular site, do a cold load. - if (url.indexOf('admin') === 0 && window.location.pathname.indexOf('/admin') !== 0) { - return window.open(RELATIVE_PATH + '/' + url, '_blank'); + if (ajaxify.handleACPRedirect(url)) { + return; } app.enterRoom(''); @@ -62,6 +61,14 @@ $(document).ready(function() { return true; }; + ajaxify.handleACPRedirect = function(url) { + // If ajaxifying into an admin route from regular site, do a cold load. + url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); + if (url.indexOf('admin') === 0 && window.location.pathname.indexOf('/admin') !== 0) { + return window.open(RELATIVE_PATH + '/' + url, '_blank'); + } + } + ajaxify.start = function(url, quiet, search) { url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); var hash = window.location.hash; From 8484c7c51a8ee976227c17547fd3fcf3399ccac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Mar 2015 12:07:40 -0400 Subject: [PATCH 065/102] closes #2850 --- public/src/client/recent.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/public/src/client/recent.js b/public/src/client/recent.js index bdf8897151..05e936a577 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -2,7 +2,7 @@ /* globals define, app, socket, utils */ -define('forum/recent', ['forum/infinitescroll'], function(infinitescroll) { +define('forum/recent', ['forum/infinitescroll', 'composer'], function(infinitescroll, composer) { var Recent = {}; var newTopicCount = 0, @@ -23,6 +23,17 @@ define('forum/recent', ['forum/infinitescroll'], function(infinitescroll) { $(this).addClass('hide'); }); + $('#new_topic').on('click', function() { + socket.emit('categories.getCategoriesByPrivilege', 'topics:create', function(err, categories) { + if (err) { + return app.alertError(err.message); + } + if (categories.length) { + composer.newTopic(categories[0].cid); + } + }); + }); + infinitescroll.init(Recent.loadMoreTopics); }; From eb733fdb6f9ab7420d7cc9bb61d56a857e26095d Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 12:54:35 -0400 Subject: [PATCH 066/102] toggle preview button on composer --- public/src/modules/composer.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 98ab0407a5..3bfb17b31a 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -348,6 +348,7 @@ define('composer', [ resize.handleResize(postContainer); handleHelp(postContainer); + handleToggle(postContainer); $(window).trigger('action:composer.loaded', { post_uuid: post_uuid @@ -376,6 +377,23 @@ define('composer', [ }); } + function handleToggle(postContainer) { + var showBtn = postContainer.find('.write-container .toggle-preview'), + hideBtn = postContainer.find('.preview-container .toggle-preview'); + + hideBtn.on('click', function() { + $('.preview-container').addClass('hide'); + $('.write-container').addClass('maximized'); + showBtn.removeClass('hide'); + }); + + showBtn.on('click', function() { + $('.preview-container').removeClass('hide'); + $('.write-container').removeClass('maximized'); + showBtn.addClass('hide'); + }); + } + function updateTitle(postData, postContainer) { var titleEl = postContainer.find('.title'); From abd3979fb31e96d98cbebf5e9c2ae7f1b6be9560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Mar 2015 13:25:48 -0400 Subject: [PATCH 067/102] closes #2465 --- public/language/en_GB/error.json | 2 +- public/src/client/chats.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/public/language/en_GB/error.json b/public/language/en_GB/error.json index 8bb83071fc..a8d4c042b5 100644 --- a/public/language/en_GB/error.json +++ b/public/language/en_GB/error.json @@ -23,7 +23,7 @@ "username-taken": "Username taken", "email-taken": "Email taken", "email-not-confirmed": "Your email has not been confirmed yet, please click here to confirm your email.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed", + "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 020b0915ef..0b0f80ff8c 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -206,6 +206,9 @@ define('forum/chats', ['string', 'sounds', 'forum/infinitescroll'], function(S, message:msg }, function(err) { if (err) { + if (err.message === '[[error:email-not-confirmed-chat]]') { + return showEmailConfirmAlert(err); + } return app.alertError(err.message); } From 940c33c42612b68478d8bfc01ce6dc4ca232d09e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Mar 2015 13:32:28 -0400 Subject: [PATCH 068/102] fix js error removed dupe code --- public/src/app.js | 4 ++-- public/src/client/chats.js | 2 +- public/src/modules/composer.js | 23 ++--------------------- 3 files changed, 5 insertions(+), 24 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index d1f6ab93bc..3c47aebf9c 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -537,7 +537,7 @@ app.cacheBuster = null; }); }; - function showEmailConfirmWarning() { + function showEmailConfirmWarning(err) { if (!config.requireEmailConfirmation || !app.user.uid) { return; } @@ -555,7 +555,7 @@ app.cacheBuster = null; } else if (!app.user['email:confirmed']) { app.alert({ alert_id: 'email_confirm', - message: '[[error:email-not-confirmed]]', + message: err ? err.message : '[[error:email-not-confirmed]]', type: 'warning', timeout: 0, clickfn: function() { diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 0b0f80ff8c..fe491b49c3 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -207,7 +207,7 @@ define('forum/chats', ['string', 'sounds', 'forum/infinitescroll'], function(S, }, function(err) { if (err) { if (err.message === '[[error:email-not-confirmed-chat]]') { - return showEmailConfirmAlert(err); + return app.showEmailConfirmWarning(err); } return app.alertError(err.message); } diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 3bfb17b31a..d8107e0e33 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -30,7 +30,7 @@ define('composer', [ discard(composer.active); return; } - + translator.translate('[[modules:composer.discard]]', function(translated) { bootbox.confirm(translated, function(confirm) { if (confirm) { @@ -506,7 +506,7 @@ define('composer', [ $('.action-bar button').removeAttr('disabled'); if (err) { if (err.message === '[[error:email-not-confirmed]]') { - return showEmailConfirmAlert(err); + return app.showEmailConfirmWarning(err); } return app.alertError(err.message); @@ -519,25 +519,6 @@ define('composer', [ } } - function showEmailConfirmAlert(err) { - app.alert({ - alert_id: 'email_confirm', - title: '[[global:alert.error]]', - message: err.message, - type: 'danger', - timeout: 0, - clickfn: function() { - app.removeAlert('email_confirm'); - socket.emit('user.emailConfirm', {}, function(err) { - if (err) { - return app.alertError(err.message); - } - app.alertSuccess('[[notifications:email-confirm-sent]]'); - }); - } - }); - } - function discard(post_uuid) { if (composer.posts[post_uuid]) { $('#cmp-uuid-' + post_uuid).remove(); From 9d0b4f58413a30bc59e3ad96ecae26130126bc5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Mar 2015 13:34:57 -0400 Subject: [PATCH 069/102] app.showEmailConfirmWarning :dull: --- public/src/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index 3c47aebf9c..f663a3dba9 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -504,7 +504,7 @@ app.cacheBuster = null; }); createHeaderTooltips(); - showEmailConfirmWarning(); + app.showEmailConfirmWarning(); socket.removeAllListeners('event:nodebb.ready'); socket.on('event:nodebb.ready', function(cacheBusters) { @@ -537,7 +537,7 @@ app.cacheBuster = null; }); }; - function showEmailConfirmWarning(err) { + app.showEmailConfirmWarning = function(err) { if (!config.requireEmailConfirmation || !app.user.uid) { return; } @@ -569,7 +569,7 @@ app.cacheBuster = null; } }); } - } + }; showWelcomeMessage = window.location.href.indexOf('loggedin') !== -1; From 8234e4cc075854cad436338ade8761a218f8fcae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Mar 2015 15:57:17 -0400 Subject: [PATCH 070/102] new hook action:topic.reply only fires on normal replies --- src/topics/create.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/topics/create.js b/src/topics/create.js index 1e9336fedc..36a73948d7 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -166,6 +166,7 @@ module.exports = function(Topics) { data.topicData = data.topicData[0]; data.topicData.unreplied = 1; + data.topicData.mainPost = data.postData; plugins.fireHook('action:topic.post', data.topicData); @@ -280,6 +281,10 @@ module.exports = function(Topics) { Topics.notifyFollowers(postData, uid); } + if (postData.index > 0) { + plugins.fireHook('action:topic.reply', postData); + } + postData.topic.title = validator.escape(postData.topic.title); next(null, postData); } From 7282bbafb204ab2177e4c6ed5bf7b69138968868 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 13:17:25 -0400 Subject: [PATCH 071/102] removing composer-mobile.tpl was totally a bad idea. --- public/src/modules/composer.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index d8107e0e33..c57c094250 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -254,11 +254,9 @@ define('composer', [ isGuestPost = composer.posts[post_uuid] ? parseInt(composer.posts[post_uuid].uid, 10) === 0 : null; composer.bsEnvironment = utils.findBootstrapEnvironment(); - - var template = (composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm') ? 'composer-mobile' : 'composer'; - + var data = { - mobile: template === 'composer-mobile', + mobile: template === (composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm'), allowTopicsThumbnail: allowTopicsThumbnail, showTags: isTopic || isMain, minimumTagLength: config.minimumTagLength, @@ -269,7 +267,7 @@ define('composer', [ formatting: composer.formatting }; - parseAndTranslate(template, data, function(composerTemplate) { + parseAndTranslate('composer', data, function(composerTemplate) { if ($('#cmp-uuid-' + post_uuid).length) { return; } From 7227dfd704095d38db833f04a1dfec17160131f1 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 13:22:41 -0400 Subject: [PATCH 072/102] add composing mobile classes if composing on mobile --- public/src/modules/composer.js | 4 ++-- public/src/modules/composer/resize.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index c57c094250..ca3b0fd78a 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -254,9 +254,9 @@ define('composer', [ isGuestPost = composer.posts[post_uuid] ? parseInt(composer.posts[post_uuid].uid, 10) === 0 : null; composer.bsEnvironment = utils.findBootstrapEnvironment(); - + var data = { - mobile: template === (composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm'), + mobile: composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm', allowTopicsThumbnail: allowTopicsThumbnail, showTags: isTopic || isMain, minimumTagLength: config.minimumTagLength, diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 608efed945..da3e4b0ed6 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -34,8 +34,7 @@ define('composer/resize', function() { // todo, lump in browsers that don't support transform (ie8) here // at this point we should use modernizr if (env === 'sm' || env === 'xs' || window.innerHeight < 480) { - app.toggleNavbar(false); - postContainer.find('textarea').css('height', $(window).height()); + $('html').addClass('composing mobile'); } if (config.hasImageUploadPlugin) { From 5e3a990f2db03021b8cf7e625d4d9c04cdbcde40 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 13:43:14 -0400 Subject: [PATCH 073/102] added vendor/autosize --- public/vendor/autosize/autosize.min.js | 6 ++++++ src/meta/js.js | 1 + 2 files changed, 7 insertions(+) create mode 100644 public/vendor/autosize/autosize.min.js diff --git a/public/vendor/autosize/autosize.min.js b/public/vendor/autosize/autosize.min.js new file mode 100644 index 0000000000..217ff6eff4 --- /dev/null +++ b/public/vendor/autosize/autosize.min.js @@ -0,0 +1,6 @@ +/*! + Autosize 2.0.0 + license: MIT + http://www.jacklmoore.com/autosize +*/ +!function(e,t){"use strict";"function"==typeof define&&define.amd?define('autosize',t):"object"==typeof exports?module.exports=t():e.autosize=t()}(this,function(){function e(e){function t(){var t=window.getComputedStyle(e,null);"vertical"===t.resize?e.style.resize="none":"both"===t.resize&&(e.style.resize="horizontal"),e.style.wordWrap="break-word";var i=e.style.width;e.style.width="0px",e.offsetWidth,e.style.width=i,n="none"!==t.maxHeight?parseFloat(t.maxHeight):!1,r="content-box"===t.boxSizing?-(parseFloat(t.paddingTop)+parseFloat(t.paddingBottom)):parseFloat(t.borderTopWidth)+parseFloat(t.borderBottomWidth),o()}function o(){var t=e.style.height,o=document.documentElement.scrollTop,i=document.body.scrollTop;e.style.height="auto";var s=e.scrollHeight+r;if(n!==!1&&s>n?(s=n,"scroll"!==e.style.overflowY&&(e.style.overflowY="scroll")):"hidden"!==e.style.overflowY&&(e.style.overflowY="hidden"),e.style.height=s+"px",document.documentElement.scrollTop=o,document.body.scrollTop=i,t!==e.style.height){var d=document.createEvent("Event");d.initEvent("autosize.resized",!0,!1),e.dispatchEvent(d)}}if(e&&e.nodeName&&"TEXTAREA"===e.nodeName&&!e.hasAttribute("data-autosize-on")){var n,r;"onpropertychange"in e&&"oninput"in e&&e.addEventListener("keyup",o),window.addEventListener("resize",o),e.addEventListener("input",o),e.addEventListener("autosize.update",o),e.addEventListener("autosize.destroy",function(t){window.removeEventListener("resize",o),e.removeEventListener("input",o),e.removeEventListener("keyup",o),e.removeEventListener("autosize.destroy"),Object.keys(t).forEach(function(o){e.style[o]=t[o]}),e.removeAttribute("data-autosize-on")}.bind(e,{height:e.style.height,overflow:e.style.overflow,overflowY:e.style.overflowY,wordWrap:e.style.wordWrap,resize:e.style.resize})),e.setAttribute("data-autosize-on",!0),e.style.overflow="hidden",e.style.overflowY="hidden",t()}}return"function"!=typeof window.getComputedStyle?function(e){return e}:function(t){return t&&t.length?Array.prototype.forEach.call(t,e):t&&t.nodeName&&e(t),t}}); \ No newline at end of file diff --git a/src/meta/js.js b/src/meta/js.js index 26e8f497ae..bb28642d7f 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -38,6 +38,7 @@ module.exports = function(Meta) { 'public/vendor/xregexp/unicode/unicode-base.js', 'public/vendor/buzz/buzz.min.js', 'public/vendor/mousetrap/mousetrap.js', + 'public/vendor/autosize/autosize.min.js', './node_modules/templates.js/lib/templates.js', 'public/src/utils.js', 'public/src/app.js', From 31368ac97476d3e1038604e0565195bb75a8deff Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 13:43:46 -0400 Subject: [PATCH 074/102] on mobile, resize composer textarea as you type so it doesn't constrain the editable view --- public/src/modules/composer/resize.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index da3e4b0ed6..8f37b0f76e 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -3,7 +3,7 @@ /* globals app, define, config, utils*/ -define('composer/resize', function() { +define('composer/resize', ['autosize'], function(autosize) { var resize = {}, oldPercentage = 0, env; @@ -35,6 +35,8 @@ define('composer/resize', function() { // at this point we should use modernizr if (env === 'sm' || env === 'xs' || window.innerHeight < 480) { $('html').addClass('composing mobile'); + postContainer.percentage = 1; + autosize(postContainer.find('textarea')[0]); } if (config.hasImageUploadPlugin) { From 83f89e95374913dfb2b11657b0956330570824b8 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 15:12:01 -0400 Subject: [PATCH 075/102] made action bar button less restrictive --- public/src/modules/composer.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index ca3b0fd78a..c9f42655c5 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -116,7 +116,7 @@ define('composer', [ } function composerAlert(message) { - $('.action-bar button').removeAttr('disabled'); + $('[data-action="post"]').removeAttr('disabled'); app.alert({ type: 'danger', timeout: 3000, @@ -284,6 +284,7 @@ define('composer', [ tags.init(postContainer, composer.posts[post_uuid]); categoryList.init(postContainer, composer.posts[post_uuid]); + updateTitle(postData, postContainer); activate(post_uuid); @@ -303,12 +304,12 @@ define('composer', [ composer.posts[post_uuid].modified = true; }); - postContainer.on('click', '.action-bar button[data-action="post"]', function() { + postContainer.on('click', '[data-action="post"]', function() { $(this).attr('disabled', true); post(post_uuid); }); - postContainer.on('click', '.action-bar button[data-action="discard"]', function() { + postContainer.on('click', '[data-action="discard"]', function() { if (!composer.posts[post_uuid].modified) { discard(post_uuid); return; @@ -501,7 +502,7 @@ define('composer', [ } function done(err, data) { - $('.action-bar button').removeAttr('disabled'); + $('[data-action="post"]').removeAttr('disabled'); if (err) { if (err.message === '[[error:email-not-confirmed]]') { return app.showEmailConfirmWarning(err); @@ -528,7 +529,7 @@ define('composer', [ composer.active = undefined; taskbar.discard('composer', post_uuid); $('body').css({'margin-bottom': 0}); - $('.action-bar button').removeAttr('disabled'); + $('[data-action="post"]').removeAttr('disabled'); app.toggleNavbar(true); } From 9262c8b9f68b6a05230d954b15ad5410985183bd Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 15:12:16 -0400 Subject: [PATCH 076/102] after selecting a category in composer, auto-select the next field --- public/src/modules/composer/categoryList.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/src/modules/composer/categoryList.js b/public/src/modules/composer/categoryList.js index f246b9ac50..1eb86051bf 100644 --- a/public/src/modules/composer/categoryList.js +++ b/public/src/modules/composer/categoryList.js @@ -35,6 +35,8 @@ define('composer/categoryList', function() { if (postData.cid) { postData.cid = this.value; } + + $('[tabindex=' + (parseInt($(this).attr('tabindex'), 10) + 1) + ']').trigger('focus'); }); }; From 6d4b658579f43b7952cafadf5db5d1d1e56c4bfa Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 16:16:22 -0400 Subject: [PATCH 077/102] using unminified version of autosize --- public/vendor/autosize.js | 146 +++++++++++++++++++++++++ public/vendor/autosize/autosize.min.js | 6 - src/meta/js.js | 2 +- 3 files changed, 147 insertions(+), 7 deletions(-) create mode 100644 public/vendor/autosize.js delete mode 100644 public/vendor/autosize/autosize.min.js diff --git a/public/vendor/autosize.js b/public/vendor/autosize.js new file mode 100644 index 0000000000..54fe82bb56 --- /dev/null +++ b/public/vendor/autosize.js @@ -0,0 +1,146 @@ +/*! + Autosize 2.0.0 + license: MIT + http://www.jacklmoore.com/autosize +*/ +(function (root, factory) { + 'use strict'; + + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], factory); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals (root is window) + root.autosize = factory(); + } +}(this, function () { + function main(ta) { + if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || ta.hasAttribute('data-autosize-on')) { return; } + + var maxHeight; + var heightOffset; + + function init() { + var style = window.getComputedStyle(ta, null); + + if (style.resize === 'vertical') { + ta.style.resize = 'none'; + } else if (style.resize === 'both') { + ta.style.resize = 'horizontal'; + } + + // horizontal overflow is hidden, so break-word is necessary for handling words longer than the textarea width + ta.style.wordWrap = 'break-word'; + + // Chrome/Safari-specific fix: + // When the textarea y-overflow is hidden, Chrome/Safari doesn't reflow the text to account for the space + // made available by removing the scrollbar. This workaround will cause the text to reflow. + var width = ta.style.width; + ta.style.width = '0px'; + // Force reflow: + /* jshint ignore:start */ + ta.offsetWidth; + /* jshint ignore:end */ + ta.style.width = width; + + maxHeight = style.maxHeight !== 'none' ? parseFloat(style.maxHeight) : false; + + if (style.boxSizing === 'content-box') { + heightOffset = -(parseFloat(style.paddingTop)+parseFloat(style.paddingBottom)); + } else { + heightOffset = parseFloat(style.borderTopWidth)+parseFloat(style.borderBottomWidth); + } + + adjust(); + } + + function adjust() { + var startHeight = ta.style.height; + var htmlTop = document.documentElement.scrollTop; + var bodyTop = document.body.scrollTop; + + ta.style.height = 'auto'; + + var endHeight = ta.scrollHeight+heightOffset; + + if (maxHeight !== false && maxHeight < endHeight) { + endHeight = maxHeight; + if (ta.style.overflowY !== 'scroll') { + ta.style.overflowY = 'scroll'; + } + } else if (ta.style.overflowY !== 'hidden') { + ta.style.overflowY = 'hidden'; + } + + ta.style.height = endHeight+'px'; + + // prevents scroll-position jumping + document.documentElement.scrollTop = htmlTop; + document.body.scrollTop = bodyTop; + + if (startHeight !== ta.style.height) { + var evt = document.createEvent('Event'); + evt.initEvent('autosize.resized', true, false); + ta.dispatchEvent(evt); + } + } + + // IE9 does not fire onpropertychange or oninput for deletions, + // so binding to onkeyup to catch most of those events. + // There is no way that I know of to detect something like 'cut' in IE9. + if ('onpropertychange' in ta && 'oninput' in ta) { + ta.addEventListener('keyup', adjust); + } + + window.addEventListener('resize', adjust); + ta.addEventListener('input', adjust); + + ta.addEventListener('autosize.update', adjust); + + ta.addEventListener('autosize.destroy', function(style){ + window.removeEventListener('resize', adjust); + ta.removeEventListener('input', adjust); + ta.removeEventListener('keyup', adjust); + ta.removeEventListener('autosize.destroy'); + + Object.keys(style).forEach(function(key){ + ta.style[key] = style[key]; + }); + + ta.removeAttribute('data-autosize-on'); + }.bind(ta, { + height: ta.style.height, + overflow: ta.style.overflow, + overflowY: ta.style.overflowY, + wordWrap: ta.style.wordWrap, + resize: ta.style.resize + })); + + ta.setAttribute('data-autosize-on', true); + ta.style.overflow = 'hidden'; + ta.style.overflowY = 'hidden'; + + init(); + } + + // Do nothing in IE8 or lower + if (typeof window.getComputedStyle !== 'function') { + return function(elements) { + return elements; + }; + } else { + return function(elements) { + if (elements && elements.length) { + Array.prototype.forEach.call(elements, main); + } else if (elements && elements.nodeName) { + main(elements); + } + return elements; + }; + } +})); diff --git a/public/vendor/autosize/autosize.min.js b/public/vendor/autosize/autosize.min.js deleted file mode 100644 index 217ff6eff4..0000000000 --- a/public/vendor/autosize/autosize.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - Autosize 2.0.0 - license: MIT - http://www.jacklmoore.com/autosize -*/ -!function(e,t){"use strict";"function"==typeof define&&define.amd?define('autosize',t):"object"==typeof exports?module.exports=t():e.autosize=t()}(this,function(){function e(e){function t(){var t=window.getComputedStyle(e,null);"vertical"===t.resize?e.style.resize="none":"both"===t.resize&&(e.style.resize="horizontal"),e.style.wordWrap="break-word";var i=e.style.width;e.style.width="0px",e.offsetWidth,e.style.width=i,n="none"!==t.maxHeight?parseFloat(t.maxHeight):!1,r="content-box"===t.boxSizing?-(parseFloat(t.paddingTop)+parseFloat(t.paddingBottom)):parseFloat(t.borderTopWidth)+parseFloat(t.borderBottomWidth),o()}function o(){var t=e.style.height,o=document.documentElement.scrollTop,i=document.body.scrollTop;e.style.height="auto";var s=e.scrollHeight+r;if(n!==!1&&s>n?(s=n,"scroll"!==e.style.overflowY&&(e.style.overflowY="scroll")):"hidden"!==e.style.overflowY&&(e.style.overflowY="hidden"),e.style.height=s+"px",document.documentElement.scrollTop=o,document.body.scrollTop=i,t!==e.style.height){var d=document.createEvent("Event");d.initEvent("autosize.resized",!0,!1),e.dispatchEvent(d)}}if(e&&e.nodeName&&"TEXTAREA"===e.nodeName&&!e.hasAttribute("data-autosize-on")){var n,r;"onpropertychange"in e&&"oninput"in e&&e.addEventListener("keyup",o),window.addEventListener("resize",o),e.addEventListener("input",o),e.addEventListener("autosize.update",o),e.addEventListener("autosize.destroy",function(t){window.removeEventListener("resize",o),e.removeEventListener("input",o),e.removeEventListener("keyup",o),e.removeEventListener("autosize.destroy"),Object.keys(t).forEach(function(o){e.style[o]=t[o]}),e.removeAttribute("data-autosize-on")}.bind(e,{height:e.style.height,overflow:e.style.overflow,overflowY:e.style.overflowY,wordWrap:e.style.wordWrap,resize:e.style.resize})),e.setAttribute("data-autosize-on",!0),e.style.overflow="hidden",e.style.overflowY="hidden",t()}}return"function"!=typeof window.getComputedStyle?function(e){return e}:function(t){return t&&t.length?Array.prototype.forEach.call(t,e):t&&t.nodeName&&e(t),t}}); \ No newline at end of file diff --git a/src/meta/js.js b/src/meta/js.js index bb28642d7f..177d8b03c8 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -38,7 +38,7 @@ module.exports = function(Meta) { 'public/vendor/xregexp/unicode/unicode-base.js', 'public/vendor/buzz/buzz.min.js', 'public/vendor/mousetrap/mousetrap.js', - 'public/vendor/autosize/autosize.min.js', + 'public/vendor/autosize.js', './node_modules/templates.js/lib/templates.js', 'public/src/utils.js', 'public/src/app.js', From 7b604c0895ba6b318663e8d1ec0931e7d3d6142f Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 16:18:40 -0400 Subject: [PATCH 078/102] this prevents autosize from causing the screen from jumping up and down as you type, on android at least @jackmoore this might not the best solution but its working well so far. let me know if you'd like a PR :) --- public/vendor/autosize.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/public/vendor/autosize.js b/public/vendor/autosize.js index 54fe82bb56..645826fcb6 100644 --- a/public/vendor/autosize.js +++ b/public/vendor/autosize.js @@ -8,7 +8,7 @@ if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. - define([], factory); + define('autosize', factory); } else if (typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, @@ -24,6 +24,7 @@ var maxHeight; var heightOffset; + var amountOfCR; function init() { var style = window.getComputedStyle(ta, null); @@ -56,6 +57,7 @@ heightOffset = parseFloat(style.borderTopWidth)+parseFloat(style.borderBottomWidth); } + amountOfCR = (ta.value.match(/\n/g) || []).length; adjust(); } @@ -63,6 +65,13 @@ var startHeight = ta.style.height; var htmlTop = document.documentElement.scrollTop; var bodyTop = document.body.scrollTop; + + var newAmountOfCR = (ta.value.match(/\n/g) || []).length; + if (newAmountOfCR === amountOfCR) { + return; + } + + amountOfCR = newAmountOfCR; ta.style.height = 'auto'; @@ -143,4 +152,4 @@ return elements; }; } -})); +})); \ No newline at end of file From 8d313d2f16cdf1cf182089dbd8a489255ad3f502 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 11 Mar 2015 16:34:40 -0400 Subject: [PATCH 079/102] return composing state to normal after discard/posting --- public/src/modules/composer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index c9f42655c5..8a85846b0b 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -531,7 +531,8 @@ define('composer', [ $('body').css({'margin-bottom': 0}); $('[data-action="post"]').removeAttr('disabled'); - app.toggleNavbar(true); + + $('html').removeClass('composing mobile'); } } From a626005570e74bb0fec3ac647c93e80b65249b8b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 11 Mar 2015 18:04:27 -0400 Subject: [PATCH 080/102] closes #2851 --- src/plugins.js | 32 +++++++------------------------- src/plugins/load.js | 12 +++++------- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/src/plugins.js b/src/plugins.js index 4d384f3714..c63039be67 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -168,7 +168,7 @@ var fs = require('fs'), Plugins.getAll = function(callback) { var url = (nconf.get('registry') || 'https://packages.nodebb.org') + '/api/v1/plugins?version=' + require('../package.json').version; - + require('request')(url, function(err, res, body) { var plugins = []; @@ -262,9 +262,9 @@ var fs = require('fs'), function(dirs, next) { dirs = dirs.filter(function(dir){ - return dir.startsWith('nodebb-plugin-') || - dir.startsWith('nodebb-widget-') || - dir.startsWith('nodebb-rewards-') || + return dir.startsWith('nodebb-plugin-') || + dir.startsWith('nodebb-widget-') || + dir.startsWith('nodebb-rewards-') || dir.startsWith('nodebb-theme-'); }).map(function(dir){ return path.join(npmPluginPath, dir); @@ -272,11 +272,7 @@ var fs = require('fs'), async.filter(dirs, function(dir, callback){ fs.stat(dir, function(err, stats){ - if (err) { - return callback(false); - } - - callback(stats.isDirectory()); + callback(!err && stats.isDirectory()); }); }, function(plugins){ next(null, plugins); @@ -287,25 +283,11 @@ var fs = require('fs'), var plugins = []; async.each(files, function(file, next) { - var configPath; - async.waterfall([ function(next) { Plugins.loadPluginInfo(file, next); }, function(pluginData, next) { - var packageName = path.basename(file); - - if (!pluginData) { - winston.warn("Plugin `" + packageName + "` is corrupted or invalid. Please check either package.json or plugin.json for errors."); - return next(null, { - id: packageName, - installed: true, - error: true, - active: null - }); - } - Plugins.isActive(pluginData.name, function(err, active) { if (err) { return next(new Error('no-active-state')); @@ -319,12 +301,12 @@ var fs = require('fs'), next(null, pluginData); }); } - ], function(err, config) { + ], function(err, pluginData) { if (err) { return next(); // Silently fail } - plugins.push(config); + plugins.push(pluginData); next(); }); }, function(err) { diff --git a/src/plugins/load.js b/src/plugins/load.js index 89b38fdc64..0637427a12 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -14,14 +14,12 @@ module.exports = function(Plugins) { Plugins.loadPlugin = function(pluginPath, callback) { Plugins.loadPluginInfo(pluginPath, function(err, pluginData) { if (err) { + if (err.message === '[[error:parse-error]]') { + return callback(); + } return callback(pluginPath.match('nodebb-theme') ? null : err); } - var staticDir; - if (!pluginData) { - return callback(); - } - versionWarning(pluginData); async.parallel([ @@ -229,9 +227,9 @@ module.exports = function(Plugins) { var pluginDir = pluginPath.split(path.sep); pluginDir = pluginDir[pluginDir.length -1]; - winston.error('[plugins/' + pluginDir + '] Error in plugin.json/package.json! ' + err.message); + winston.error('[plugins/' + pluginDir + '] Error in plugin.json or package.json! ' + err.message); - callback(); + callback(new Error('[[error:parse-error]]')); } }); }; From 076931d5b53ef7effad4af328827f47558661af0 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 11 Mar 2015 18:21:40 -0400 Subject: [PATCH 081/102] fix search tooltip --- public/src/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/app.js b/public/src/app.js index f663a3dba9..fdfe7856b3 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -372,7 +372,7 @@ app.cacheBuster = null; if (utils.findBootstrapEnvironment() === 'xs') { return; } - $('#header-menu li [title]').each(function() { + $('#header-menu li a[title]').each(function() { $(this).tooltip({ placement: 'bottom', title: $(this).attr('title') From 5269c2eb9e1e7458c2ab329bbbc850817de12628 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 11 Mar 2015 18:34:26 -0400 Subject: [PATCH 082/102] latest language translations --- public/language/ar/category.json | 2 +- public/language/ar/email.json | 10 +++--- public/language/ar/error.json | 10 +++--- public/language/ar/groups.json | 52 +++++++++++++-------------- public/language/ar/login.json | 6 ++-- public/language/ar/notifications.json | 2 +- public/language/ar/tags.json | 2 +- public/language/bn/tags.json | 2 +- public/language/cs/tags.json | 2 +- public/language/de/error.json | 24 ++++++------- public/language/de/groups.json | 38 ++++++++++---------- public/language/de/login.json | 8 ++--- public/language/de/notifications.json | 2 +- public/language/de/recent.json | 4 +-- public/language/de/search.json | 24 ++++++------- public/language/de/tags.json | 10 +++--- public/language/el/tags.json | 2 +- public/language/en@pirate/tags.json | 2 +- public/language/en_US/tags.json | 2 +- public/language/es/category.json | 2 +- public/language/es/error.json | 16 ++++----- public/language/es/groups.json | 30 ++++++++-------- public/language/es/login.json | 6 ++-- public/language/es/notifications.json | 2 +- public/language/es/recent.json | 2 +- public/language/es/search.json | 10 +++--- public/language/es/tags.json | 2 +- public/language/es/topic.json | 2 +- public/language/et/tags.json | 2 +- public/language/fa_IR/tags.json | 2 +- public/language/fi/tags.json | 2 +- public/language/fr/error.json | 16 ++++----- public/language/fr/groups.json | 24 ++++++------- public/language/fr/login.json | 4 +-- public/language/fr/notifications.json | 2 +- public/language/fr/recent.json | 2 +- public/language/fr/search.json | 10 +++--- public/language/fr/tags.json | 2 +- public/language/he/tags.json | 2 +- public/language/hu/tags.json | 2 +- public/language/id/tags.json | 2 +- public/language/it/tags.json | 2 +- public/language/ja/tags.json | 2 +- public/language/ko/tags.json | 2 +- public/language/lt/tags.json | 2 +- public/language/ms/tags.json | 2 +- public/language/nb/tags.json | 2 +- public/language/nl/tags.json | 2 +- public/language/pl/category.json | 2 +- public/language/pl/error.json | 16 ++++----- public/language/pl/groups.json | 26 +++++++------- public/language/pl/login.json | 6 ++-- public/language/pl/notifications.json | 2 +- public/language/pl/recent.json | 2 +- public/language/pl/search.json | 10 +++--- public/language/pl/tags.json | 2 +- public/language/pl/topic.json | 2 +- public/language/pt_BR/tags.json | 2 +- public/language/ro/tags.json | 2 +- public/language/ru/category.json | 2 +- public/language/ru/error.json | 16 ++++----- public/language/ru/groups.json | 26 +++++++------- public/language/ru/login.json | 4 +-- public/language/ru/notifications.json | 2 +- public/language/ru/recent.json | 2 +- public/language/ru/search.json | 8 ++--- public/language/ru/tags.json | 2 +- public/language/sc/tags.json | 2 +- public/language/sk/tags.json | 2 +- public/language/sv/tags.json | 2 +- public/language/th/tags.json | 2 +- public/language/tr/category.json | 2 +- public/language/tr/error.json | 14 ++++---- public/language/tr/groups.json | 28 +++++++-------- public/language/tr/login.json | 6 ++-- public/language/tr/notifications.json | 2 +- public/language/tr/recent.json | 2 +- public/language/tr/search.json | 10 +++--- public/language/tr/tags.json | 2 +- public/language/tr/topic.json | 2 +- public/language/tr/users.json | 2 +- public/language/vi/category.json | 2 +- public/language/vi/email.json | 10 +++--- public/language/vi/error.json | 2 +- public/language/vi/notifications.json | 2 +- public/language/vi/tags.json | 2 +- public/language/zh_CN/category.json | 2 +- public/language/zh_CN/error.json | 16 ++++----- public/language/zh_CN/tags.json | 2 +- public/language/zh_TW/tags.json | 2 +- 90 files changed, 307 insertions(+), 307 deletions(-) diff --git a/public/language/ar/category.json b/public/language/ar/category.json index b4f3a40f7a..456ba908c2 100644 --- a/public/language/ar/category.json +++ b/public/language/ar/category.json @@ -1,6 +1,6 @@ { "new_topic_button": "موضوع جديد", - "guest-login-post": "Log in to post", + "guest-login-post": "المرجو تسجيل الدخول أوَّلا", "no_topics": "لا توجد مواضيع في هذه الفئةلم لا تحاول إنشاء موضوع؟
", "browsing": "تصفح", "no_replies": "لم يرد أحد", diff --git a/public/language/ar/email.json b/public/language/ar/email.json index 98cb9c0b0d..d295a3a70f 100644 --- a/public/language/ar/email.json +++ b/public/language/ar/email.json @@ -9,9 +9,9 @@ "reset.text1": "لقد توصلنا بطلب إعادة تعيين كلمة السرالخاصة بك، ربما لكونك قد نسيتها, إن لم يكن الأمر كذلك، المرجو تجاهل هذه الرسالة.", "reset.text2": "لمواصلة طلب إعاة تعيين كلمة السر، المرجو تتبع هذا الرابط.", "reset.cta": "انقر هنا لإعادة تعيين كلمة السر الخاصة بك.", - "reset.notify.subject": "Password successfully changed", - "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", - "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", + "reset.notify.subject": "تم تغيير كلمة المرور بنجاح", + "reset.notify.text1": "نحيطك علما أن كلمة مرورك قد تم تغييرها في %1", + "reset.notify.text2": "إن لم يكن لديك علم بهذا، المرجو إشعار مدبر النظام بأسرع مايمكن.", "digest.notifications": "لديك تنبيهات غير مقروءة من طرف %1:", "digest.latest_topics": "آخر المستجدات من %1", "digest.cta": "انقر هنا لمشاهدة %1", @@ -20,8 +20,8 @@ "notif.chat.subject": "هناك محادثة جديدة من %1", "notif.chat.cta": "انقر هنا لمتابعة المحادثة", "notif.chat.unsub.info": "تم إرسال هذا الإشعار بوجودة محادثة جديدة وفقا لخيارات تسجيلك.", - "notif.post.cta": "Click here to read the full topic", - "notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.", + "notif.post.cta": "انقر هنا لقراءة الموضوع بأكمله", + "notif.post.unsub.info": "تم إشعارك بهذه المشاركة بناءً على الخيارات التي سبق وأن حددتها.", "test.text1": "هذه رسالة تجريبية للتأكد من صحة إعدادت الرسائل الإلكترونية في منتدى NodeBB خاصتك.", "unsub.cta": "انقر هنا لتغيير تلك الإعدادات", "closing": "شكرًا لك!" diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 51993e5f98..e5d2f8c856 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -18,9 +18,9 @@ "username-taken": "اسم المستخدم مأخوذ", "email-taken": "البريد الالكتروني مأخوذ", "email-not-confirmed": "عنوان بريدك الإلكتروني غير مفعل بعد. انقر هنا لتفعيله من فضلك.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "email-not-confirmed-chat": "لايمكنك الدردشة إلا بعد تفعيل بريدك الإلكتروني", + "no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.", + "email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.", "username-too-short": "اسم المستخدم قصير.", "username-too-long": "اسم المستخدم طويل", "user-banned": "المستخدم محظور", @@ -35,10 +35,10 @@ "no-emailers-configured": "لا يمكن إرسال رسالة إلكترونية تجريبية لعدم وجود قوالب خاصة بالرسائل الإلكترونية،", "category-disabled": "قائمة معطلة", "topic-locked": "الموضوع مقفول", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "لايمكنك تعديل مشاركتك بعد مرور أكثر من %1 ثانية على كتابتها.", "still-uploading": "الرجاء انتظار الرفع", "content-too-short": "المرجو إدخال موضوع أطول من هذا. يجب أن تتوفر المواضيع على %1 حروف على الأقل.", - "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", + "content-too-long": "لا يمكن للمشاركات أن تتجاوز %1 حرفًا/أحرف.", "title-too-short": "المرجو إدخال عنوان أطول من هذا. يجب أن تتوفر العناوين على %1 حروف على الأقل.", "title-too-long": "المرجو إدخال عنوان أقصر من هذا. يجب ألا تتجاوز العناوين %1 حرفًا.", "too-many-posts": "يمكنك إنشاء المواضيع بمعدل موضوع واحد كل %1 ثانية - المرجو الانتظار قليلا.", diff --git a/public/language/ar/groups.json b/public/language/ar/groups.json index 0975ca84ca..1c6a8f90e5 100644 --- a/public/language/ar/groups.json +++ b/public/language/ar/groups.json @@ -1,34 +1,34 @@ { "groups": "المجموعات", "view_group": "معاينة المجموعة", - "owner": "Group Owner", - "new_group": "Create New Group", - "no_groups_found": "There are no groups to see", - "pending.accept": "Accept", - "pending.reject": "Reject", - "cover-instructions": "Drag and Drop a photo, drag to position, and hit Save", - "cover-change": "Change", - "cover-save": "Save", - "cover-saving": "Saving", + "owner": "مالك المجموعة", + "new_group": "أنشئ مجموعة جديدة", + "no_groups_found": "لاوجدود لمجموعات يمكن معاينتها", + "pending.accept": "موافق", + "pending.reject": "رفض", + "cover-instructions": "اسحب وأسقِط صورة، اسحبها للموضع المرغوب، وانقر على حفظ", + "cover-change": "تغيير", + "cover-save": "حفظ", + "cover-saving": "جاري الحفظ", "details.title": "تفاصيل المجموعة", "details.members": "لائحة الأعضاء", - "details.pending": "Pending Members", + "details.pending": "المستخدمون في الانتظار", "details.has_no_posts": "أعضاء هذه المجموعة لم يضيفوا أية مشاركة", "details.latest_posts": "آخر المشاركات", - "details.private": "Private", - "details.grant": "Grant/Rescind Ownership", - "details.kick": "Kick", - "details.owner_options": "Group Administration", - "details.group_name": "Group Name", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "event.updated": "Group details have been updated", - "event.deleted": "The group \"%1\" has been deleted" + "details.private": "خاص", + "details.grant": "منح/سحب المِلكية", + "details.kick": "طرد", + "details.owner_options": "تدبير المجموعة", + "details.group_name": "اسم المجموعة", + "details.description": "الوصف", + "details.badge_preview": "معاينة الوسام", + "details.change_icon": "تغيير الأيقونة", + "details.change_colour": "تغيير اللون", + "details.badge_text": "نص الوسام", + "details.userTitleEnabled": "إظهار الوسام", + "details.private_help": "في حالة تفعيل الخيار، الانضمام إلى المجموعة يستلزم قبول مالكها", + "details.hidden": "مخفي", + "details.hidden_help": "في حالة تفعيل الخيار، لن تظهر المجموعة للعموم والإنضمام إليها سيتلزم دعوة يدوية.", + "event.updated": "تم تحديث بيانات المجموعة", + "event.deleted": "تم حذف المجموعة %1" } \ No newline at end of file diff --git a/public/language/ar/login.json b/public/language/ar/login.json index f6575cf40a..878a32533c 100644 --- a/public/language/ar/login.json +++ b/public/language/ar/login.json @@ -1,7 +1,7 @@ { - "username-email": "Username / Email", - "username": "Username", - "email": "Email", + "username-email": "اسم المستخدم / البريد الإلكتروني", + "username": "اسم المستخدم", + "email": "البريد الإلكتروني", "remember_me": "تذكرني؟", "forgot_password": "نسيت كلمة المرور؟", "alternative_logins": "تسجيلات الدخول البديلة", diff --git a/public/language/ar/notifications.json b/public/language/ar/notifications.json index 711a1a4450..98890331a5 100644 --- a/public/language/ar/notifications.json +++ b/public/language/ar/notifications.json @@ -2,7 +2,7 @@ "title": "تنبيهات", "no_notifs": "ليس لديك أية تنبيهات جديدة", "see_all": "معاينة كل التنبيهات", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "اجعل كل التنبيهات مقروءة", "back_to_home": "عودة إلى %1", "outgoing_link": "رابط خارجي", "outgoing_link_message": "أنت تغادر %1 حاليا.", diff --git a/public/language/ar/tags.json b/public/language/ar/tags.json index f2eccbd1c0..004681a32a 100644 --- a/public/language/ar/tags.json +++ b/public/language/ar/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "لاوجود لمواضيع تحمل هذا الوسم.", "tags": "بطاقات", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "أدخل البطاقات...", "no_tags": "لاتوجد هناك بطاقات بعد." } \ No newline at end of file diff --git a/public/language/bn/tags.json b/public/language/bn/tags.json index 86bbe70e75..e99c0f835d 100644 --- a/public/language/bn/tags.json +++ b/public/language/bn/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "এই ট্যাগ সম্বলিত কোন টপিক নেই", "tags": "ট্যাগসমূহ", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "ট্যাগ বসান", "no_tags": "এখন পর্যন্ত কোন ট্যাগ নেই" } \ No newline at end of file diff --git a/public/language/cs/tags.json b/public/language/cs/tags.json index 8fc07c7da2..f2003f978a 100644 --- a/public/language/cs/tags.json +++ b/public/language/cs/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Není zde žádné téma s tímto tagem.", "tags": "Tagy", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Vložte tagy ...", "no_tags": "Zatím tu není žádný tag." } \ No newline at end of file diff --git a/public/language/de/error.json b/public/language/de/error.json index a05417d878..f5c852c661 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -19,12 +19,12 @@ "email-taken": "Die E-Mail-Adresse ist bereits vergeben", "email-not-confirmed": "Deine E-Mail wurde noch nicht bestätigt. Bitte klicke hier, um deine E-Mail zu bestätigen.", "email-not-confirmed-chat": "Der Chat ist deaktiviert bis Du deine E-Mail bestätigt hast", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "no-email-to-confirm": "Dieses Forum setzt E-Mail-Bestätigung voraus, bitte klick hier um eine E-Mail-Adresse einzugeben", + "email-confirm-failed": "Wir konnten deine E-Mail-Adresse nicht bestätigen, bitte versuch es später noch einmal", "username-too-short": "Benutzername ist zu kurz", "username-too-long": "Der Benutzername ist zu lang", "user-banned": "Der Benutzer ist gesperrt", - "user-too-new": "Entschuldigung, du musst %1 Sekunden warten, bevor du deinen ersten Beitrag verfassen kannst!", + "user-too-new": "Tut uns leid, du musst %1 Sekunden warten, bevor du deinen ersten Beitrag verfassen kannst!", "no-category": "Die Kategorie existiert nicht", "no-topic": "Das Thema existiert nicht", "no-post": "Der Beitrag existiert nicht", @@ -35,7 +35,7 @@ "no-emailers-configured": "Es wurde keine E-Mail-Plugins geladen, weshalb eine Test-E-Mail nicht gesendet werden konnte.", "category-disabled": "Kategorie ist deaktiviert", "topic-locked": "Thema ist gesperrt", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "Du darfst Beiträge lediglich innerhalb von %1 Sekunden nach dem erstellen editieren", "still-uploading": "Bitte warte bis der Vorgang abgeschlossen ist.", "content-too-short": "Bitte gib einen längeren Beitrag ein. Beiträge sollten mindestens %1 Zeichen enthalten.", "content-too-long": "Bitte schreibe einen kürzeren Beitrag. Beiträge können nicht mehr als %1 Zeichen enthalten.", @@ -43,16 +43,16 @@ "title-too-long": "Der Titel darf maximal %1 Zeichen enthalten.", "too-many-posts": "Du kannst maximal alle %1 Sekunden einen Beitrag erstellen - bitte warte, bevor du einen neuen Beitrag erstellst", "too-many-posts-newbie": "Als neuer Benutzer kannst du nur alle %1 Sekunden einen Beitrag verfassen, bis du %2 Reputationspunkte hast - Bitte warte etwas, bevor du erneut einen Beitrag verfasst", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Die maximale Dateigröße beträgt %1 kbs - bitte lade eine kleinere Datei hoch", - "cant-vote-self-post": "Du kannst deinen eigenen Beitrag nicht bewerten.", + "tag-too-short": "Bitte gib ein längeres Stichwort an. Stichwörter sollten aus mindestens %1 Zeichen bestehen.", + "tag-too-long": "Bitte gib ein kürzeres Stichwort ein. Stichwörter können nicht länger als %1 Zeichen sein.", + "file-too-big": "Die maximale Dateigröße beträgt %1 kB - bitte lade eine kleinere Datei hoch", + "cant-vote-self-post": "Du kannst deinen eigenen Beitrag nicht bewerten", "already-favourited": "Dieser Beitrag ist bereits in deinen Favoriten enthalten", "already-unfavourited": "Du hast diesen Beitrag bereits aus deinen Favoriten entfernt", "cant-ban-other-admins": "Du kannst andere Administratoren nicht sperren!", "invalid-image-type": "Falsche Bildart. Erlaubte Arten sind: %1", "invalid-image-extension": "Ungültige Dateinamenerweiterung", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-file-type": "Ungültiger Dateityp. Erlaubte Typen sind: %1", "group-name-too-short": "Gruppenname zu kurz", "group-already-exists": "Gruppe existiert bereits", "group-name-change-not-allowed": "Du kannst den Namen der Gruppe nicht ändern", @@ -75,7 +75,7 @@ "not-enough-reputation-to-flag": "Deine Reputation ist nicht gut genug, um diesen Beitrag zu melden", "reload-failed": "Es ist ein Problem während des Reloads von NodeBB aufgetreten: \"%1\". NodeBB wird weiterhin clientseitige Assets bereitstellen, allerdings solltest du das, was du vor dem Reload gemacht hast, rückgängig machen.", "registration-error": "Registrierungsfehler", - "parse-error": "Ein Fehler ist beim Parsen der Server-Antwort aufgetreten", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "parse-error": "Beim auswerten der Serverantwort ist etwas schiefgegangen", + "wrong-login-type-email": "Bitte nutze deine E-Mail-Adresse zum einloggen", + "wrong-login-type-username": "Bitte nutze deinen Benutzernamen zum einloggen" } \ No newline at end of file diff --git a/public/language/de/groups.json b/public/language/de/groups.json index 3f81c9bfea..52fa359f53 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -4,31 +4,31 @@ "owner": "Gruppenbesitzer", "new_group": "Neue Gruppe erstellen", "no_groups_found": "Es sind keine Gruppen vorhanden", - "pending.accept": "Accept", - "pending.reject": "Reject", - "cover-instructions": "Drag and Drop ein Foto, bewege es in Position, dann drücke Speichern", + "pending.accept": "Annehmen", + "pending.reject": "Abweisen", + "cover-instructions": "Foto auf eine Position bewegen, und Speichern drücken", "cover-change": "Ändern", "cover-save": "Speichern", - "cover-saving": "Am speichern", + "cover-saving": "Speicherung läuft", "details.title": "Gruppendetails", "details.members": "Mitgliederliste", - "details.pending": "Ausstehende Mitglieder", + "details.pending": "Mitglieder in Schwebe", "details.has_no_posts": "Die Mitglieder dieser Gruppe haben keine Beiträge verfasst.", - "details.latest_posts": "Aktuelle Beiträge", - "details.private": "Private", - "details.grant": "Gewähre/Widerrufe Besitz", + "details.latest_posts": "Neueste Beiträge", + "details.private": "Privat", + "details.grant": "Gewähre/widerrufe Besitz", "details.kick": "Kick", "details.owner_options": "Gruppenadministration", - "details.group_name": "Group Name", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.group_name": "Gruppenname", + "details.description": "Beschreibung", + "details.badge_preview": "Abzeichenvorschau", + "details.change_icon": "Symbol ändern", + "details.change_colour": "Farbe ändern", + "details.badge_text": "Text für das Abzeichen", + "details.userTitleEnabled": "Abzeichen anzeigen", + "details.private_help": "Wenn aktiviert, setzt ein Gruppenbeitritt die Zustimmung eines Gruppenbesitzers voraus", + "details.hidden": "Versteckt", + "details.hidden_help": "Wenn aktiviert, wird diese Gruppe in der Gruppenliste nicht zu finden sein, und Benutzer werden manuell eingeladen werden müssen.", "event.updated": "Gruppendetails wurden aktualisiert", - "event.deleted": "Die Gruppe \"% 1\" wurde gelöscht" + "event.deleted": "Die Gruppe \"%1\" wurde gelöscht." } \ No newline at end of file diff --git a/public/language/de/login.json b/public/language/de/login.json index 4099772d0d..33d68113ca 100644 --- a/public/language/de/login.json +++ b/public/language/de/login.json @@ -1,10 +1,10 @@ { - "username-email": "Username / Email", - "username": "Username", - "email": "Email", + "username-email": "Benutzername / E-Mail-Adresse", + "username": "Benutzername", + "email": "E-Mail", "remember_me": "Eingeloggt bleiben?", "forgot_password": "Passwort vergessen?", - "alternative_logins": "Login Alternativen", + "alternative_logins": "Alternative Logins", "failed_login_attempt": " Anmeldeversuch fehlgeschlagen, versuche es erneut.", "login_successful": "Du hast dich erfolgreich eingeloggt!", "dont_have_account": "Sie haben noch kein Konto?" diff --git a/public/language/de/notifications.json b/public/language/de/notifications.json index f032f7151e..f500eefe5b 100644 --- a/public/language/de/notifications.json +++ b/public/language/de/notifications.json @@ -2,7 +2,7 @@ "title": "Benachrichtigungen", "no_notifs": "Du hast keine neuen Benachrichtigungen", "see_all": "Alle Benachrichtigungen ansehen", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "Alle Benachrichtigungen als gelesen markieren", "back_to_home": "Zurück zu %1", "outgoing_link": "Externer Link", "outgoing_link_message": "Du verlässt nun %1.", diff --git a/public/language/de/recent.json b/public/language/de/recent.json index 3fb6fc7ea7..e64846b674 100644 --- a/public/language/de/recent.json +++ b/public/language/de/recent.json @@ -6,7 +6,7 @@ "year": "Jahr", "alltime": "Gesamter Zeitraum", "no_recent_topics": "Es gibt keine aktuellen Themen.", - "no_popular_topics": "There are no popular topics.", + "no_popular_topics": "Es gibt keine beliebten Themen.", "there-is-a-new-topic": "Es gibt ein neues Thema.", "there-is-a-new-topic-and-a-new-post": "Es gibt ein neues Thema und einen neuen Beitrag.", "there-is-a-new-topic-and-new-posts": "Es gibt ein neues Thema und %1 neue Beiträge.", @@ -15,5 +15,5 @@ "there-are-new-topics-and-new-posts": "Es gibt %1 neue Themen und %2 neue Beiträge.", "there-is-a-new-post": "Es gibt einen neuen Beitrag.", "there-are-new-posts": "Es gibt %1 neue Beiträge.", - "click-here-to-reload": "Hier klicken um neu zu laden." + "click-here-to-reload": "Hier klicken um zu aktualisieren." } \ No newline at end of file diff --git a/public/language/de/search.json b/public/language/de/search.json index 29a51edbe3..b803315a9d 100644 --- a/public/language/de/search.json +++ b/public/language/de/search.json @@ -1,5 +1,5 @@ { - "results_matching": "%1 Ergebniss(e) stimmen mit \"%2\" überein, (%3 Sekunden)", + "results_matching": "%1 Ergebnis(se) stimmen mit \"%2\" überein, (%3 Sekunden)", "no-matches": "Keine Ergebnisse gefunden", "in": "In", "by": "Bei", @@ -8,13 +8,13 @@ "posted-by": "Geschrieben von", "in-categories": "In Kategorien", "search-child-categories": "Suche in Unterkategorien", - "reply-count": "Antwort Anzahl", + "reply-count": "Anzahl Antworten", "at-least": "Mindestens", "at-most": "Höchstens", - "post-time": "Beitrags Zeit", + "post-time": "Verfaßt am", "newer-than": "Neuer als", "older-than": "Älter als", - "any-date": "Jeder Zeitpunkt", + "any-date": "Beliebiger Zeitpunkt", "yesterday": "Gestern", "one-week": "Eine Woche", "two-weeks": "Zwei Wochen", @@ -23,18 +23,18 @@ "six-months": "Sechs Monate", "one-year": "Ein Jahr", "sort-by": "Sortieren nach", - "last-reply-time": "Letzter Antwort Zeitpunkt", + "last-reply-time": "Zeitpunkt der letzten Antwort", "topic-title": "Thementitel", - "number-of-replies": "Anzahl von Antworten", + "number-of-replies": "Anzahl an Antworten", "number-of-views": "Anzahl der Aufrufe", - "topic-start-date": "Thema Startdatum", + "topic-start-date": "Erstelldatum des Themas", "username": "Benutzername", "category": "Kategorie", "descending": "In absteigender Reihenfolge", "ascending": "In aufsteigender Reihenfolge", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "save-preferences": "Einstellungen speichern", + "clear-preferences": "Einstellungen löschen", + "search-preferences-saved": "Sucheinstellungen gespeichert", + "search-preferences-cleared": "Sucheinstellungen gelöscht", + "show-results-as": "Ergebnisse anzeigen als" } \ No newline at end of file diff --git a/public/language/de/tags.json b/public/language/de/tags.json index 898759f0b5..9c40b9cc9e 100644 --- a/public/language/de/tags.json +++ b/public/language/de/tags.json @@ -1,7 +1,7 @@ { - "no_tag_topics": "Es gibt keine Themen mit diesem Tag.", - "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", - "enter_tags_here_short": "Gib Tags ein...", - "no_tags": "Es gibt bisher keine Tags." + "no_tag_topics": "Es gibt keine Themen mit diesem Stichwort.", + "tags": "Stichwörter", + "enter_tags_here": "Gib hier Stichwörter ein. %1-%2 Zeichen. Drücke Enter nach jedem Stichwort.", + "enter_tags_here_short": "Gib Stichwörter ein...", + "no_tags": "Es gibt bisher keine Stichwörter." } \ No newline at end of file diff --git a/public/language/el/tags.json b/public/language/el/tags.json index e3776579ed..4264ed78aa 100644 --- a/public/language/el/tags.json +++ b/public/language/el/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Δεν υπάρχουν θέματα με αυτή την ετικέτα.", "tags": "Ετικέτες", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Εισαγωγή ετικετών...", "no_tags": "Δεν υπάρχουν ακόμα ετικέτες." } \ No newline at end of file diff --git a/public/language/en@pirate/tags.json b/public/language/en@pirate/tags.json index c416d8d4ec..aa9f14c70c 100644 --- a/public/language/en@pirate/tags.json +++ b/public/language/en@pirate/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/en_US/tags.json b/public/language/en_US/tags.json index c416d8d4ec..aa9f14c70c 100644 --- a/public/language/en_US/tags.json +++ b/public/language/en_US/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/es/category.json b/public/language/es/category.json index ec2fdadcdc..8c6b0fd5ca 100644 --- a/public/language/es/category.json +++ b/public/language/es/category.json @@ -1,6 +1,6 @@ { "new_topic_button": "Nuevo tema", - "guest-login-post": "Log in to post", + "guest-login-post": "Acceder para poder escribir un mensaje", "no_topics": "No hay temas en esta categoría.
¿Por que no te animas y publicas uno?", "browsing": "viendo ahora", "no_replies": "Nadie ha respondido aún", diff --git a/public/language/es/error.json b/public/language/es/error.json index 1fd31a5b00..8be673f77d 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -19,8 +19,8 @@ "email-taken": "Correo electrónico ocupado", "email-not-confirmed": "Su cuenta de correo electrónico no ha sido confirmada aún, por favor haga click aquí para confirmarla.", "email-not-confirmed-chat": "No puedes hacer uso del chat hasta que confirmes tu email", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "no-email-to-confirm": "Este foro requiere confirmación de su email, por favor pulse aquí para introducir un email", + "email-confirm-failed": "No se ha podido confirmar su email, por favor inténtelo de nuevo más tarde.", "username-too-short": "Nombre de usuario es demasiado corto", "username-too-long": "Nombre de usuario demasiado largo", "user-banned": "Usuario baneado", @@ -35,7 +35,7 @@ "no-emailers-configured": "No se ha cargado ningún plugin de email, así que no se pudo enviar el email de prueba.", "category-disabled": "Categoría deshabilitada", "topic-locked": "Tema bloqueado", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "Sólo puedes editar mensajes durante %1 segundos después de haberlo escrito", "still-uploading": "Por favor, espera a que terminen las subidas.", "content-too-short": "Por favor introduzca una publicación más larga. Las publicaciones deben contener al menos %1 caracteres.", "content-too-long": "Por favor introduzca un mensaje más corto. Los mensajes no pueden exceder los %1 caracteres.", @@ -43,8 +43,8 @@ "title-too-long": "Por favor, introduce un título más corto, que no sobrepase los %1 caracteres.", "too-many-posts": "Solo puedes publicar una vez cada %1 segundos - por favor espere antes de volver a publicar", "too-many-posts-newbie": "Como nuevo usuario, solo puedes publicar una vez cada %1 segundos hasta hayas ganado una reputación de %2 - por favor espere antes de volver a publicar", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", + "tag-too-short": "Por favor introduce una etiqueta más larga. Las etiquetas deben contener por lo menos %1 caracteres", + "tag-too-long": "Por favor introduce una etiqueta más pequeña. Las etiquetas no pueden exceder los %1 caracteres", "file-too-big": "El tamaño de fichero máximo es de %1 kbs - por favor, suba un fichero más pequeño", "cant-vote-self-post": "No puedes votar tus propios posts", "already-favourited": "Ya ha marcado esta publicación como favorita", @@ -52,7 +52,7 @@ "cant-ban-other-admins": "¡No puedes expulsar a otros administradores!", "invalid-image-type": "Tipo de imagen inválido. Los tipos permitidos son: %1", "invalid-image-extension": "Extensión de imagen inválida", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-file-type": "Tipo de fichero inválido. Los tipos permitidos son: %1", "group-name-too-short": "Nombre del grupo es demasiado corto.", "group-already-exists": "El grupo ya existe.", "group-name-change-not-allowed": "El nombre del grupo deseado no está permitido.", @@ -76,6 +76,6 @@ "reload-failed": "NodeBB encontró un problema al refrescar: \"%1\". NodeBB intentará cargar el resto de contenido, aunque deberías deshacer lo que hiciste justo antes.", "registration-error": "Error de registro", "parse-error": "Algo ha ido mal mientras se parseaba la respuesta del servidor", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "wrong-login-type-email": "Por favor emplea tu email para acceder", + "wrong-login-type-username": "Por favor introduce tu nombre de usuario para acceder" } \ No newline at end of file diff --git a/public/language/es/groups.json b/public/language/es/groups.json index 112cce2994..22a80ba19a 100644 --- a/public/language/es/groups.json +++ b/public/language/es/groups.json @@ -4,8 +4,8 @@ "owner": "Propietario del Grupo", "new_group": "Crear Nuevo Grupo", "no_groups_found": "No hay grupos que ver", - "pending.accept": "Accept", - "pending.reject": "Reject", + "pending.accept": "Aceptar", + "pending.reject": "Rechazar", "cover-instructions": "Arrastra y suelta una foto, arrastra a la posición, y pulsa Guardar ", "cover-change": "Cambiar", "cover-save": "Guardar", @@ -15,20 +15,20 @@ "details.pending": "Miembros Pendientes", "details.has_no_posts": "Los miembros de este grupo no han hecho ninguna publicación.", "details.latest_posts": "Últimas Publicaciones", - "details.private": "Private", - "details.grant": "Grant/Rescind Ownership", - "details.kick": "Kick", + "details.private": "Privado", + "details.grant": "Conceder/Rescindir Propiedad", + "details.kick": "Expulsar", "details.owner_options": "Administración De Grupo", - "details.group_name": "Group Name", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.group_name": "Nombre de Grupo", + "details.description": "Descripción", + "details.badge_preview": "Previsualización de Insignia", + "details.change_icon": "Cambiar Icono", + "details.change_colour": "Cambiar Color", + "details.badge_text": "Texto de Insignia", + "details.userTitleEnabled": "Mostrar Insignia", + "details.private_help": "Si está habilitado, entrar en los grupos requiere aprobación de sus propietarios", + "details.hidden": "Oculto", + "details.hidden_help": "Si está habilitado, este grupo no aparecerá en los listados de grupos, y los usuarios tendrán que ser invitados manualmente", "event.updated": "Los detalles del grupo han sido actualizados", "event.deleted": "El grupo \"%1\" ha sido eliminado" } \ No newline at end of file diff --git a/public/language/es/login.json b/public/language/es/login.json index e30f15dff4..448ce31f43 100644 --- a/public/language/es/login.json +++ b/public/language/es/login.json @@ -1,7 +1,7 @@ { - "username-email": "Username / Email", - "username": "Username", - "email": "Email", + "username-email": "Usuario / Email", + "username": "Usuario", + "email": "Correo Electrónico", "remember_me": "¿Recordarme?", "forgot_password": "¿Olvidaste tu contraseña?", "alternative_logins": "Métodos alternativos", diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index 630e9376fe..3a9e36bccb 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -2,7 +2,7 @@ "title": "Notificaciones", "no_notifs": "No tiene nuevas notificaciones", "see_all": "Ver todas las notificaciones", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "Marcar todas las notificaciones cómo leídas", "back_to_home": "Volver a %1", "outgoing_link": "Enlace externo", "outgoing_link_message": "Ahora estás saliendo de %1.", diff --git a/public/language/es/recent.json b/public/language/es/recent.json index 1ff9669e51..fbfb6238c0 100644 --- a/public/language/es/recent.json +++ b/public/language/es/recent.json @@ -6,7 +6,7 @@ "year": "Año", "alltime": "Siempre", "no_recent_topics": "No hay publicaciones recientes.", - "no_popular_topics": "There are no popular topics.", + "no_popular_topics": "No hay tópicos populares", "there-is-a-new-topic": "Hay una nueva publicación.", "there-is-a-new-topic-and-a-new-post": "hay una nueva publicación y un nuevo mensaje.", "there-is-a-new-topic-and-new-posts": "Hay una nueva publicación y %1 nuevos mensajes.", diff --git a/public/language/es/search.json b/public/language/es/search.json index 2378430561..135144c2b3 100644 --- a/public/language/es/search.json +++ b/public/language/es/search.json @@ -32,9 +32,9 @@ "category": "Categoría", "descending": "En orden descendente", "ascending": "En orden ascendente", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "save-preferences": "Guardar preferencias", + "clear-preferences": "Descartar preferencias", + "search-preferences-saved": "Preferencias de búsqueda guardadas", + "search-preferences-cleared": "Preferencias de búsqueda descartadas", + "show-results-as": "Mostrar resultados como" } \ No newline at end of file diff --git a/public/language/es/tags.json b/public/language/es/tags.json index 260ff42eef..dc1f26a0ba 100644 --- a/public/language/es/tags.json +++ b/public/language/es/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "No hay temas con esta etiqueta.", "tags": "Etiquetas", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Introduce las etiquetas aquí. %1-%2 caracteres. Presiona enter después de cada etiqueta.", "enter_tags_here_short": "Introduzca las etiquetas...", "no_tags": "Aún no hay etiquetas." } \ No newline at end of file diff --git a/public/language/es/topic.json b/public/language/es/topic.json index 576220f99d..1938b05c7d 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -12,7 +12,7 @@ "notify_me": "Serás notificado cuando haya nuevas respuestas en este tema", "quote": "Citar", "reply": "Responder", - "guest-login-reply": "Log in to reply", + "guest-login-reply": "Accede para responder", "edit": "Editar", "delete": "Borrar", "purge": "Purgar", diff --git a/public/language/et/tags.json b/public/language/et/tags.json index 87b8332fad..5f63e2b3e7 100644 --- a/public/language/et/tags.json +++ b/public/language/et/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Teemasid, mis sisaldaksid seda märksõna, ei eksisteeri.", "tags": "Märksõnad", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Sisesta märksõnu...", "no_tags": "Siin ei ole veel ühtegi märksõna." } \ No newline at end of file diff --git a/public/language/fa_IR/tags.json b/public/language/fa_IR/tags.json index 26a393396b..82e477f4cc 100644 --- a/public/language/fa_IR/tags.json +++ b/public/language/fa_IR/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "جُستاری با این برچسب وجود ندارد.", "tags": "برچسب‌ها", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Enter tags...", "no_tags": "هنوز برچسبی وجود ندارد." } \ No newline at end of file diff --git a/public/language/fi/tags.json b/public/language/fi/tags.json index 35903730b2..3d1cf1271b 100644 --- a/public/language/fi/tags.json +++ b/public/language/fi/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Ei viimeisimpiä aiheita tällä tagilla.", "tags": "Tagit", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Syötä tagit...", "no_tags": "Ei vielä yhtään tagia." } \ No newline at end of file diff --git a/public/language/fr/error.json b/public/language/fr/error.json index f6354486ff..51f03aa33f 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -19,8 +19,8 @@ "email-taken": "Email déjà utilisé", "email-not-confirmed": "Votre adresse email n'est pas confirmée, cliquez ici pour la valider.", "email-not-confirmed-chat": "Vous ne pouver discuter tant que votre email n'est pas confirmé", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "no-email-to-confirm": "Ce forum requiert une vérification de votre adresse email. Veuillez cliquer ici pour entrer une adresse.", + "email-confirm-failed": "Votre adresse email n'a pas pu être vérifiée. Veuillez ré-essayer plus tard.", "username-too-short": "Nom d'utilisateur trop court", "username-too-long": "Nom d'utilisateur trop long", "user-banned": "Utilisateur banni", @@ -35,7 +35,7 @@ "no-emailers-configured": "Un email de test n'a pas pu être envoyé car aucun plugin de gestion des emails n'était chargé", "category-disabled": "Catégorie désactivée", "topic-locked": "Sujet verrouillé", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "Vous ne pouvez modifier un post que %1 secondes après l'avoir posté.", "still-uploading": "Veuillez patienter pendant le téléchargement.", "content-too-short": "Veuillez entrer un message plus long. %1 caractères minimum.", "content-too-long": "Veuillez poster un message plus cours. Les messages ne peuvent être plus long que %1 caractères.", @@ -43,8 +43,8 @@ "title-too-long": "Veuillez entrer un titre plus court. Les titres ne peuvent excéder %1 caractères.", "too-many-posts": "Vous ne pouvez poster que toutes les %1 secondes.", "too-many-posts-newbie": "En tant que nouvel utilisateur, vous ne pouvez poster que toutes les %1 secondes jusqu'à ce que vous obteniez une réputation de %2 - patientez avant de publier de nouveau. ", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", + "tag-too-short": "Veuillez entrer un mot-clé plus long. Les mots-clés devraient contenir au moins %1 caractères.", + "tag-too-long": "Veuillez entrer un mot-clé plus court. Les mot-clés ne peuvent faire plus de %1 caractères.", "file-too-big": "La taille maximum des fichiers est de %1 kbs.", "cant-vote-self-post": "Vous ne pouvez pas voter pour vos propres messages", "already-favourited": "Vous avez déjà mis ce message en favoris", @@ -52,7 +52,7 @@ "cant-ban-other-admins": "Vous ne pouvez pas bannir les autres administrateurs !", "invalid-image-type": "Type d'image invalide. Les types autorisés sont: %1", "invalid-image-extension": "Extension d'image invalide", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-file-type": "Type de fichier non valide. Les types autorisés sont : %1", "group-name-too-short": "Nom de groupe trop court", "group-already-exists": "Ce groupe existe déjà", "group-name-change-not-allowed": "Modification du nom de groupe non permise", @@ -76,6 +76,6 @@ "reload-failed": "NodeBB a rencontré un problème lors du rechargement : \"% 1\" . NodeBB continuera de fonctionner côté client, même si vous devez annuler ce que vous avez fait juste avant de recharger .", "registration-error": "Erreur d'enregistrement", "parse-error": "Une erreur est survenue en analysant la réponse du serveur", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "wrong-login-type-email": "Veuillez utiliser votre adresse email pour vous connecter", + "wrong-login-type-username": "Veuillez utiliser votre identifiant pour vous connecter" } \ No newline at end of file diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index 03b25aebc8..ce980d472e 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -4,8 +4,8 @@ "owner": "Propriétaire du groupe", "new_group": "Créer un nouveau groupe", "no_groups_found": "Il n'y a aucun groupe", - "pending.accept": "Accept", - "pending.reject": "Reject", + "pending.accept": "Accepter", + "pending.reject": "Refuser", "cover-instructions": "Glissez-déposez une image, ajustez la position, et cliquez sur Enregistrer", "cover-change": "Modifier", "cover-save": "Enregistrer", @@ -15,20 +15,20 @@ "details.pending": "Membres en attente", "details.has_no_posts": "Les membres de ce groupe n'ont envoyé aucun message.", "details.latest_posts": "Derniers messages", - "details.private": "Private", + "details.private": "Privé", "details.grant": "Promouvoir/rétrograder comme propriétaire", "details.kick": "Exclure", "details.owner_options": "Administration du groupe", - "details.group_name": "Group Name", + "details.group_name": "Nom du groupe", "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.badge_preview": "Aperçu du badge", + "details.change_icon": "Modifier l'icône", + "details.change_colour": "Modifier la couleur", + "details.badge_text": "Texte du badge", + "details.userTitleEnabled": "Afficher le badge", + "details.private_help": "Si cette case est cochée, rejoindre un groupe nécessite l'accord d'un propriétaire du groupe.", + "details.hidden": "Masqué", + "details.hidden_help": "Si cette case est cochée, ce groupe n'est pas affiché dans la liste des groupes, et les utilisateurs devront être invités manuellement.", "event.updated": "Les détails du groupe ont été mis à jour", "event.deleted": "Le groupe é%1\" a été supprimé" } \ No newline at end of file diff --git a/public/language/fr/login.json b/public/language/fr/login.json index b34dda64b5..6470717691 100644 --- a/public/language/fr/login.json +++ b/public/language/fr/login.json @@ -1,6 +1,6 @@ { - "username-email": "Username / Email", - "username": "Username", + "username-email": "Identifiant ou email", + "username": "Identifiant", "email": "Email", "remember_me": "Se souvenir de moi ?", "forgot_password": "Mot de passe oublié ?", diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index 139b0a30da..e6c533a20e 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -2,7 +2,7 @@ "title": "Notifications", "no_notifs": "Vous n'avez aucune notification", "see_all": "Voir toutes les notifications.", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "Marquer toutes les notifications comme lues", "back_to_home": "Revenir à %1", "outgoing_link": "Lien sortant", "outgoing_link_message": "Vous quittez %1.", diff --git a/public/language/fr/recent.json b/public/language/fr/recent.json index bd3b216df0..6103856ee0 100644 --- a/public/language/fr/recent.json +++ b/public/language/fr/recent.json @@ -6,7 +6,7 @@ "year": "An", "alltime": "Toujours", "no_recent_topics": "Il n'y a aucun sujet récent.", - "no_popular_topics": "There are no popular topics.", + "no_popular_topics": "Il n'y a pas de sujet populaire.", "there-is-a-new-topic": "Il y a un nouveau sujet.", "there-is-a-new-topic-and-a-new-post": "Il y a un nouveau sujet et un nouveau message.", "there-is-a-new-topic-and-new-posts": "Il y a un nouveau sujet et %1 nouveaux messages.", diff --git a/public/language/fr/search.json b/public/language/fr/search.json index cd5f207136..f05eec953d 100644 --- a/public/language/fr/search.json +++ b/public/language/fr/search.json @@ -32,9 +32,9 @@ "category": "Catégorie", "descending": "Par ordre décroissant", "ascending": "Par ordre croissant", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "save-preferences": "Enregistrer les préférences", + "clear-preferences": "Réinitialiser les préférences", + "search-preferences-saved": "Préférences de recherche enregistrées", + "search-preferences-cleared": "Préférences de recherche réinitialisées", + "show-results-as": "Affichez les résultats comme" } \ No newline at end of file diff --git a/public/language/fr/tags.json b/public/language/fr/tags.json index 477f1a0b56..ef226f2efe 100644 --- a/public/language/fr/tags.json +++ b/public/language/fr/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Il n'y a aucun sujet ayant ce mot-clé", "tags": "Mots-clés", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Entrez les mots-clés ici. %1-%2 caractères. Tapez sur \"Entrée\" après chaque mot-clé.", "enter_tags_here_short": "Entrez des mots-clés...", "no_tags": "Il n'y a pas encore de mots-clés." } \ No newline at end of file diff --git a/public/language/he/tags.json b/public/language/he/tags.json index 3061057672..54ead310ad 100644 --- a/public/language/he/tags.json +++ b/public/language/he/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "אין פוסטים עם תגית זו.", "tags": "תגיות", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "הכנס תגיות", "no_tags": "אין עדיין תגיות." } \ No newline at end of file diff --git a/public/language/hu/tags.json b/public/language/hu/tags.json index baddf9f8d6..aa7a02a772 100644 --- a/public/language/hu/tags.json +++ b/public/language/hu/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Nem létezik témakör ezzel a címkével.", "tags": "Címkék", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Címke megadása...", "no_tags": "Nincs címke." } \ No newline at end of file diff --git a/public/language/id/tags.json b/public/language/id/tags.json index 8485344416..647542884e 100644 --- a/public/language/id/tags.json +++ b/public/language/id/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Tidak ada topik dengan tag ini.", "tags": "Tag", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Masukkan tag...", "no_tags": "Belum ada tag." } \ No newline at end of file diff --git a/public/language/it/tags.json b/public/language/it/tags.json index 5fcdf9ff47..c3364a0bbf 100644 --- a/public/language/it/tags.json +++ b/public/language/it/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Non ci sono discussioni con questo tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Inserisci i tags...", "no_tags": "Non ci sono ancora tags." } \ No newline at end of file diff --git a/public/language/ja/tags.json b/public/language/ja/tags.json index c416d8d4ec..aa9f14c70c 100644 --- a/public/language/ja/tags.json +++ b/public/language/ja/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/ko/tags.json b/public/language/ko/tags.json index 8e1011bd29..a50fc5e9e1 100644 --- a/public/language/ko/tags.json +++ b/public/language/ko/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "이 태그에 해당하는 주제가 없습니다.", "tags": "태그", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "태그 입력...", "no_tags": "아직 아무런 태그도 없습니다." } \ No newline at end of file diff --git a/public/language/lt/tags.json b/public/language/lt/tags.json index 2151f58d36..2f2b9e11d2 100644 --- a/public/language/lt/tags.json +++ b/public/language/lt/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Temų su šią žyma nėra.", "tags": "Žymos", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Enter tags...", "no_tags": "Žymų kolkas nėra." } \ No newline at end of file diff --git a/public/language/ms/tags.json b/public/language/ms/tags.json index c416d8d4ec..aa9f14c70c 100644 --- a/public/language/ms/tags.json +++ b/public/language/ms/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/nb/tags.json b/public/language/nb/tags.json index 5287b6125a..d38e00a025 100644 --- a/public/language/nb/tags.json +++ b/public/language/nb/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Det er ingen emnet med denne taggen.", "tags": "Tagger", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Skriv tagger...", "no_tags": "Det finnes ingen tagger enda." } \ No newline at end of file diff --git a/public/language/nl/tags.json b/public/language/nl/tags.json index 281fd4a0a5..85c11b0476 100644 --- a/public/language/nl/tags.json +++ b/public/language/nl/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Er zijn geen onderwerpen met deze tag", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Voer uw tags in...", "no_tags": "Er zijn nog geen tags te vinden" } \ No newline at end of file diff --git a/public/language/pl/category.json b/public/language/pl/category.json index 09164c69bb..a6e6ec1b0f 100644 --- a/public/language/pl/category.json +++ b/public/language/pl/category.json @@ -1,6 +1,6 @@ { "new_topic_button": "Nowy wątek", - "guest-login-post": "Log in to post", + "guest-login-post": "Zaloguj się, aby napisać.", "no_topics": "W tej kategorii nie ma jeszcze żadnych wątków.
Dlaczego ty nie utworzysz jakiegoś?", "browsing": "przegląda", "no_replies": "Nikt jeszcze nie odpowiedział", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index c09640123e..c967749eeb 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -19,8 +19,8 @@ "email-taken": "E-mail zajęty.", "email-not-confirmed": "Twój email nie został jeszcze potwierdzony. Proszę kliknąć tutaj by go potwierdzić.", "email-not-confirmed-chat": "Nie możesz rozmawiać do czasu, gdy twój email zostanie potwierdzony.", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "no-email-to-confirm": "To forum wymaga weryfikacji przez email. Proszę kliknąć tutaj, aby wprowadzić adres.", + "email-confirm-failed": "Nie byliśmy w stanie potwierdzić twojego email-a. Proszę spróbować później.", "username-too-short": "Nazwa użytkownika za krótka.", "username-too-long": "Zbyt długa nazwa użytkownika", "user-banned": "Użytkownik zbanowany", @@ -35,7 +35,7 @@ "no-emailers-configured": "Nie zainstalowano żadnego dodatku obsługującego e-mail, więc nie można wysłać testowej wiadomości.", "category-disabled": "Kategoria wyłączona.", "topic-locked": "Temat zamknięty", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "Możesz edytować posty przez %1 sekund po napisaniu.", "still-uploading": "Poczekaj na pełne załadowanie", "content-too-short": "Proszę wpisać dłuższy post. Posty powinny zawierać co najmniej %1 znaków.", "content-too-long": "Proszę wpisać krótszy post. Posty nie mogą zawierać więcej niż %1 znaków.", @@ -43,8 +43,8 @@ "title-too-long": "Wpisz krótszy tytuł, nie może być dłuższy niż %1 znaków.", "too-many-posts": "Możesz wysyłać posty co %1 sekund - proszę poczekać", "too-many-posts-newbie": "Jako nowy użytkownik, możesz wysyłać posty co %1 sekund, do chwili aż zbierzesz %2 reputacji - proszę poczekać przed ponownym wysłaniem posta", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", + "tag-too-short": "Proszę podać dłuższy tag. Tagi powinny zawierać co najmniej %1 znaków.", + "tag-too-long": "Proszę podać krótszy tag. Tagi nie mogą być dłuższe niż %1 znaków.", "file-too-big": "Maksymalny dozwolony rozmiar pliku to %1 kb - proszę wybrać mniejszy plik", "cant-vote-self-post": "Nie możesz głosować na własny post", "already-favourited": "Już polubiłeś ten post", @@ -52,7 +52,7 @@ "cant-ban-other-admins": "Nie możesz zbanować innych adminów!", "invalid-image-type": "Błędny typ pliku. Dozwolone typy to: %1", "invalid-image-extension": "Błędne rozszerzenie pliku", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-file-type": "Błędny typ pliku. Dozwolone typy to: %1", "group-name-too-short": "Nazwa grupy za krótka", "group-already-exists": "Grupa już istnieje", "group-name-change-not-allowed": "Nie można zmieniać nazwy tej grupy.", @@ -76,6 +76,6 @@ "reload-failed": "NodeBB napotkał problem w czasie ładowania \"%1\". Forum będzie nadal dostarczać zasoby dostępne w kliencie, jednak powinieneś cofnąć ostatnią akcję.", "registration-error": "Błąd rejestracji", "parse-error": "Coś poszło nie tak podczas parsingu odpowiedzi serwera", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "wrong-login-type-email": "Zaloguj się używając adresu email", + "wrong-login-type-username": "Zaloguj się używając nazwy użytkownika" } \ No newline at end of file diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json index 19f43e2d89..b9c32948b9 100644 --- a/public/language/pl/groups.json +++ b/public/language/pl/groups.json @@ -4,8 +4,8 @@ "owner": "Właściciel grupy", "new_group": "Stwórz nową grupę", "no_groups_found": "Brak grup do wyświetlenia", - "pending.accept": "Accept", - "pending.reject": "Reject", + "pending.accept": "Przyjmij", + "pending.reject": "Odrzuć", "cover-instructions": "Przeciągnij i upuść zdjęcie, ustaw w odpowiedniej pozycji i kliknij Zapisz", "cover-change": "Zmień", "cover-save": "Zapisz", @@ -15,20 +15,20 @@ "details.pending": "Członkowie oczekujący", "details.has_no_posts": "Członkowie tej grupy nie napisali żadnych postów.", "details.latest_posts": "Ostatnie posty", - "details.private": "Private", + "details.private": "Prywatna", "details.grant": "Nadaj/Cofnij prawa Właściciela", "details.kick": "Wykop", "details.owner_options": "Administracja grupy", - "details.group_name": "Group Name", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.group_name": "Nazwa grupy", + "details.description": "Opis", + "details.badge_preview": "Podgląd plakietki", + "details.change_icon": "Zmień ikonę", + "details.change_colour": "Zmień kolor", + "details.badge_text": "Treść plakietki", + "details.userTitleEnabled": "Pokaż plakietkę", + "details.private_help": "Jeśli aktywowane, przystępowanie do grup wymaga zatwierdzenia przez właściciela grupy", + "details.hidden": "Ukryty", + "details.hidden_help": "Jeśli aktywowane, ta grupa nie będzie widoczna w wykazie grup, a użytkownicy będą musieli być zapraszani manualnie.", "event.updated": "Dane grupy zostały zaktualizowane", "event.deleted": "Grupa \"%1\" została skasowana" } \ No newline at end of file diff --git a/public/language/pl/login.json b/public/language/pl/login.json index 4a95c6d26e..1133f6afba 100644 --- a/public/language/pl/login.json +++ b/public/language/pl/login.json @@ -1,7 +1,7 @@ { - "username-email": "Username / Email", - "username": "Username", - "email": "Email", + "username-email": "Nazwa użytkownika lub adres e-mail", + "username": "Nazwa użytkownika", + "email": "Adres e-mail", "remember_me": "Zapamiętaj mnie", "forgot_password": "Zapomniałeś hasło?", "alternative_logins": "Alternatywne logowanie", diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index 5e84128ee9..2a24b7c122 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -2,7 +2,7 @@ "title": "Powiadomienia", "no_notifs": "Nie masz nowych powiadomień", "see_all": "Zobacz wszystkie powiadomienia", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "Oznacz wszystkie powiadomienia jako przeczytane", "back_to_home": "Wróć do %1", "outgoing_link": "Łącze wychodzące", "outgoing_link_message": "Opuszczasz %1.", diff --git a/public/language/pl/recent.json b/public/language/pl/recent.json index d395ee5722..563533001f 100644 --- a/public/language/pl/recent.json +++ b/public/language/pl/recent.json @@ -6,7 +6,7 @@ "year": "Rok", "alltime": "Od początku", "no_recent_topics": "Brak ostatnich wątków.", - "no_popular_topics": "There are no popular topics.", + "no_popular_topics": "Brak popularnych wątków.", "there-is-a-new-topic": "Masz nowy wątek.", "there-is-a-new-topic-and-a-new-post": "Masz nowy wątek i nowy post.", "there-is-a-new-topic-and-new-posts": "Masz nowy wątek i %1 nowych postów.", diff --git a/public/language/pl/search.json b/public/language/pl/search.json index 7a055eb66c..52b4e5a137 100644 --- a/public/language/pl/search.json +++ b/public/language/pl/search.json @@ -32,9 +32,9 @@ "category": "Kategoria", "descending": "W kolejności malejącej", "ascending": "W kolejności rosnącej", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "save-preferences": "Zapisz ustawienia", + "clear-preferences": "Wyczyść ustawienia", + "search-preferences-saved": "Ustawienia wyszukiwania zapisane", + "search-preferences-cleared": "Ustawienia wyszukiwania wyczyszczone", + "show-results-as": "Pokaż wyniki jako" } \ No newline at end of file diff --git a/public/language/pl/tags.json b/public/language/pl/tags.json index a2247f39e7..3036b34e62 100644 --- a/public/language/pl/tags.json +++ b/public/language/pl/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Nie ma tematów z tym tagiem", "tags": "Tagi", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Tutaj wpisz tagi. %1-%2 znaków. Naciśnij enter po każdym.", "enter_tags_here_short": "Wpisz tagi...", "no_tags": "Jeszcze nie ma tagów." } \ No newline at end of file diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index e9941d4abf..f27171c5fa 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -12,7 +12,7 @@ "notify_me": "Powiadamiaj mnie o nowych odpowiedziach w tym wątku", "quote": "Cytuj", "reply": "Odpowiedz", - "guest-login-reply": "Log in to reply", + "guest-login-reply": "Zaloguj się, aby odpowiedzieć.", "edit": "Edytuj", "delete": "Usuń", "purge": "Wymaż", diff --git a/public/language/pt_BR/tags.json b/public/language/pt_BR/tags.json index 1150d12f7f..267888cbfa 100644 --- a/public/language/pt_BR/tags.json +++ b/public/language/pt_BR/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Não há tópicos com esta tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Digite tags...", "no_tags": "Ainda não há tags." } \ No newline at end of file diff --git a/public/language/ro/tags.json b/public/language/ro/tags.json index 59edbb0063..483efa66f6 100644 --- a/public/language/ro/tags.json +++ b/public/language/ro/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Nu există nici un subiect cu acest tag.", "tags": "Taguri", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Introdu taguri...", "no_tags": "În acest moment nu există nici un tag." } \ No newline at end of file diff --git a/public/language/ru/category.json b/public/language/ru/category.json index 8a97af5a0d..4d70a82236 100644 --- a/public/language/ru/category.json +++ b/public/language/ru/category.json @@ -1,6 +1,6 @@ { "new_topic_button": "Создать тему", - "guest-login-post": "Log in to post", + "guest-login-post": "Войдите чтобы создавать сообщения", "no_topics": "В этой категории еще нет тем.
Почему бы вам не создать первую?", "browsing": "просматривают", "no_replies": "Нет ответов", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index cb43902332..bca2535d19 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -19,8 +19,8 @@ "email-taken": "Email занят", "email-not-confirmed": "Ваш email не подтвержден, нажмите для подтверждения.", "email-not-confirmed-chat": "Вы не можете оставлять сообщения, пока Ваш email не подтверждён", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "no-email-to-confirm": "Этот форум требует подтверждения по E-mail. Нажмите здесь для ввода E-mail.", + "email-confirm-failed": "Мы не можем подтвердить Ваш E-mail, попробуйте позже.", "username-too-short": "Слишком короткое имя пользователя", "username-too-long": "Имя пользователя слишком длинное", "user-banned": "Пользователь заблокирован", @@ -35,7 +35,7 @@ "no-emailers-configured": "Не подключен ни один плагин для отправки почты, поэтому тестовый email не может быть отправлен", "category-disabled": "Категория отключена", "topic-locked": "Тема закрыта", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "Вы можете редактировать сообщение в течении %1 секунд(ы) после написания.", "still-uploading": "Пожалуйста, подождите завершения загрузки.", "content-too-short": "Пост должен содержать минимум %1 симв.", "content-too-long": "Размер поста не должен превышать %1 символов. Пожалуйста, сделайте его короче.", @@ -43,8 +43,8 @@ "title-too-long": "Заголовок не может быть длиннее %1 символов.", "too-many-posts": "Вы можете делать пост один раз в %1 сек.", "too-many-posts-newbie": "Вы новый пользователь, поэтому можете делать пост раз в %1 сек., пока не заработаете %2 п. репутации.", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", + "tag-too-short": "Введите более длинный тэг. Тэги должны содержать как минимум %1 символа(ов).", + "tag-too-long": "Введите тэг покороче. Тэги должны быть короче %1 символов.", "file-too-big": "Максимальный разрешенный размер файла - %1 Кбайт. Пожалуйста, загрузите файл меньшего размера.", "cant-vote-self-post": "Вы не можете проголосовать за Ваш пост", "already-favourited": "Вы уже добавили этот пост в избранное", @@ -52,7 +52,7 @@ "cant-ban-other-admins": "Вы не можете забанить других администраторов!", "invalid-image-type": "Неверный формат изображения. Поддерживаемые форматы: %1", "invalid-image-extension": "Недопустимое расширение файла", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-file-type": "Неверный формат фаила. Поддерживаемые форматы : %1", "group-name-too-short": "Название группы слишком короткое", "group-already-exists": "Группа уже существует", "group-name-change-not-allowed": "Изменение названия группы запрещено", @@ -76,6 +76,6 @@ "reload-failed": "NodeBB обнаружил проблему при перезагрузке: \"%1\". NodeBB продолжит работать с существующими ресурсами клиента, но Вы должны отменить то, что сделали перед перезагрузкой.", "registration-error": "Ошибка при регистрации", "parse-error": "Похоже, что-то пошло не так в процессе обработки ответа сервера.", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "wrong-login-type-email": "Пожалуйста, используйте свой E-mail для входа.", + "wrong-login-type-username": "Пожалуйста, используйте своё имя пользователя для входа." } \ No newline at end of file diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index c46e857368..8ef4e59089 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -4,8 +4,8 @@ "owner": "Администратор группы", "new_group": "Создать группу", "no_groups_found": "Нет групп для отображения", - "pending.accept": "Accept", - "pending.reject": "Reject", + "pending.accept": "Принять", + "pending.reject": "Отклонить", "cover-instructions": "Перетяните сюда изображение, переместите на нужную позицию и нажмите Сохранить", "cover-change": "Изменить", "cover-save": "Сохранить", @@ -15,20 +15,20 @@ "details.pending": "Заявки в группу", "details.has_no_posts": "Пользователями этой группы не публиковали никаких записей", "details.latest_posts": "Последние записи", - "details.private": "Private", + "details.private": "Частный (ая)", "details.grant": "Выдать/забрать администратора", "details.kick": "Исключить", "details.owner_options": "Настройки группы", - "details.group_name": "Group Name", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.group_name": "Имя группы", + "details.description": "Описание", + "details.badge_preview": "Предпросмотр Бейджа", + "details.change_icon": "Сменить иконку", + "details.change_colour": "Изменить цвет", + "details.badge_text": "Текст на Бейдже", + "details.userTitleEnabled": "Показать Бейдж", + "details.private_help": "Если включено, вступление в группы будет подтверждаться владельцем группы", + "details.hidden": "Скрыто", + "details.hidden_help": "Если включено, группа не будет показываться в списках, а пользователи должны приглашаться вручную", "event.updated": "Настройки группы обновлены", "event.deleted": "Группа \"%1\" удалена" } \ No newline at end of file diff --git a/public/language/ru/login.json b/public/language/ru/login.json index b371df159e..b0a5793412 100644 --- a/public/language/ru/login.json +++ b/public/language/ru/login.json @@ -1,6 +1,6 @@ { - "username-email": "Username / Email", - "username": "Username", + "username-email": "Имя пользователя / E-mail", + "username": "Имя пользователя", "email": "Email", "remember_me": "Запомнить меня", "forgot_password": "Забыли пароль?", diff --git a/public/language/ru/notifications.json b/public/language/ru/notifications.json index 0618e808db..c3d1fa2bfc 100644 --- a/public/language/ru/notifications.json +++ b/public/language/ru/notifications.json @@ -2,7 +2,7 @@ "title": "Уведомления", "no_notifs": "Для Вас нет новых уведомлений", "see_all": "Просмотреть все уведомления", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "Отметить все уведомления как прочитанные", "back_to_home": "Назад к %1", "outgoing_link": "Внешняя ссылка", "outgoing_link_message": "Вы покидаете %1.", diff --git a/public/language/ru/recent.json b/public/language/ru/recent.json index 83c1e01b53..bddea6644e 100644 --- a/public/language/ru/recent.json +++ b/public/language/ru/recent.json @@ -6,7 +6,7 @@ "year": "Год", "alltime": "За всё время", "no_recent_topics": "Нет свежих тем.", - "no_popular_topics": "There are no popular topics.", + "no_popular_topics": "Популярные темы отсутствуют.", "there-is-a-new-topic": "Опубликована новая тема.", "there-is-a-new-topic-and-a-new-post": "Опубликована новая тема и новое сообщение.", "there-is-a-new-topic-and-new-posts": "Опубликована новая тема и %1 новых сообщений.", diff --git a/public/language/ru/search.json b/public/language/ru/search.json index a3929d303b..8fa2f31ebd 100644 --- a/public/language/ru/search.json +++ b/public/language/ru/search.json @@ -32,9 +32,9 @@ "category": "Категория", "descending": "В порядке возрастания", "ascending": "В порядке убывания", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", + "save-preferences": "Сохранить настройки", + "clear-preferences": "Очистить настройки", + "search-preferences-saved": "Искать сохраненные настройки", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Показать результаты как" } \ No newline at end of file diff --git a/public/language/ru/tags.json b/public/language/ru/tags.json index e923cccf2c..8b78464be4 100644 --- a/public/language/ru/tags.json +++ b/public/language/ru/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Нет топиков с таким тегом.", "tags": "Теги", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Укажите тэги здесь. %1-%2 символов(а). Нажимайте Enter после каждого тэга.", "enter_tags_here_short": "Введите теги...", "no_tags": "Здесь еще нет тегов." } \ No newline at end of file diff --git a/public/language/sc/tags.json b/public/language/sc/tags.json index c416d8d4ec..aa9f14c70c 100644 --- a/public/language/sc/tags.json +++ b/public/language/sc/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/sk/tags.json b/public/language/sk/tags.json index c416d8d4ec..aa9f14c70c 100644 --- a/public/language/sk/tags.json +++ b/public/language/sk/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/sv/tags.json b/public/language/sv/tags.json index d846962ea4..fffe39ea0a 100644 --- a/public/language/sv/tags.json +++ b/public/language/sv/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Det finns inga ämnen med detta märkord.", "tags": "Märkord", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Ange taggar...", "no_tags": "Det finns inga märkord ännu." } \ No newline at end of file diff --git a/public/language/th/tags.json b/public/language/th/tags.json index e8bf52df2e..d2d0ff6fe0 100644 --- a/public/language/th/tags.json +++ b/public/language/th/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "ไม่มีหัวข้อสนทนาที่เกี่ยวข้องกับป้ายคำศัพท์นี้", "tags": "ป้ายคำศัพท์", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "ใส่ป้ายคำศัพท์ ...", "no_tags": "ยังไม่มีป้ายคำศัพท์" } \ No newline at end of file diff --git a/public/language/tr/category.json b/public/language/tr/category.json index 34ac645f32..518bd9dcb0 100644 --- a/public/language/tr/category.json +++ b/public/language/tr/category.json @@ -1,6 +1,6 @@ { "new_topic_button": "Yeni Başlık", - "guest-login-post": "Log in to post", + "guest-login-post": "Göndermek için giriş yapın", "no_topics": " Bu kategoride hiç konu yok.
Yeni bir konu açmak istemez misiniz?", "browsing": "gözden geçiriliyor", "no_replies": "Kimse yanıtlamadı", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 69cd323a2f..d54bbce50a 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -19,8 +19,8 @@ "email-taken": "E-posta Alınmış", "email-not-confirmed": "E-postanız onaylanmamış, onaylamak için lütfen buraya tıklayın.", "email-not-confirmed-chat": "Email adresiniz doğrulanmadan sohbet edemezsiniz.", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "no-email-to-confirm": "Bu forum e-posta doğrulaması gerektirir, lütfen buraya bir e-posta adresi girin", + "email-confirm-failed": "E-posta adresinizi doğrulayamıyoruz. Lütfen daha sonra tekrar deneyin.", "username-too-short": "Kullanıcı ismi çok kısa", "username-too-long": "Kullanıcı ismi çok uzun.", "user-banned": "Kullanıcı Yasaklı", @@ -43,8 +43,8 @@ "title-too-long": "Lütfen daha kısa bir başlık girin. Başlıklar %1 karakterden uzun olamaz.", "too-many-posts": "Sadece %1 saniyede bir ileti gönderebilirsiniz.", "too-many-posts-newbie": "Yeni bir kullanıcı olarak, %2 saygınlığınız olana kadar sadece %1 saniyede bir mesaj gönderebilirsiniz. Lütfen tekrar ileti göndermeden önce bekleyin.", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", + "tag-too-short": "Lütfen daha uzun bir etiket giriniz. Etiketler en az %1 karakter uzunluğunda olmalı", + "tag-too-long": "Lütfen daha kısa bir etiket girin. Etiketler %1 karakterden daha uzun olamaz", "file-too-big": "İzin verilen en büyük dosya boyutu %1 kbs.", "cant-vote-self-post": "Kendi iletinize oy veremezsiniz", "already-favourited": "Bu iletiyi zaten favorilerinize eklediniz", @@ -52,7 +52,7 @@ "cant-ban-other-admins": "Başka yöneticileri yasaklayamazsınız!", "invalid-image-type": "Geçersiz resim uzantısı. Izin verilen uzantılar: %1", "invalid-image-extension": "Geçersiz resim uzantısı", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-file-type": "Geçersiz dosya türü. İzin verilenler şunlar : %1", "group-name-too-short": "Grup ismi çok kısa", "group-already-exists": "Grup zaten var", "group-name-change-not-allowed": "Grup ismini değiştiremezsiniz", @@ -76,6 +76,6 @@ "reload-failed": "NodeBB tekrar yüklenirken bir sorunla karşılaştı: “%1“. NodeBB varolan dosyaları servis etmeye devam edecek.", "registration-error": "Kayıt Hatası", "parse-error": "Sunucu yanıtı çözümlemesi sırasında bir şeyler ters gitti", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "wrong-login-type-email": "Lütfen giriş için e-posta adresinizi kullanın", + "wrong-login-type-username": "Lütfen giriş için kullanıcı adınızı kullanın" } \ No newline at end of file diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index 7191d93c86..536921e7e5 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -4,8 +4,8 @@ "owner": "Grup Kurucusu", "new_group": "Yeni Grup Oluştur", "no_groups_found": "Henüz hiç grup yok", - "pending.accept": "Accept", - "pending.reject": "Reject", + "pending.accept": "Onayla", + "pending.reject": "Reddet", "cover-instructions": "Bir fotoğrafı Sürükleyin ve Bırakın, uygun yere sürükleyip Kaydet'e tıklayın.", "cover-change": "Değiştir", "cover-save": "Kaydet", @@ -15,20 +15,20 @@ "details.pending": "Üyeler bekleniyor", "details.has_no_posts": "Bu grubun üyeleri henüz bir ileti göndermedi.", "details.latest_posts": "En son iletiler", - "details.private": "Private", + "details.private": "Özel", "details.grant": "Grant/Rescind Ownership", - "details.kick": "Kick", + "details.kick": "Dışarı at", "details.owner_options": "Grup Yöneticisi", - "details.group_name": "Group Name", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.group_name": "Grup ismi", + "details.description": "Tanımlama", + "details.badge_preview": "Rozet Önizlemesi", + "details.change_icon": "İkonu Değiştir", + "details.change_colour": "Rengi Değiştir", + "details.badge_text": "Rozet Yazısı", + "details.userTitleEnabled": "Rozeti Göster", + "details.private_help": "Gruba katılmak için eğer etkinse grup sahibini onayı gerekir, ", + "details.hidden": "Gizli", + "details.hidden_help": "Bu grup eğer etkinse grup listelerinde bulunmaz, ve kullanıcılar bizzat davet eder", "event.updated": "Grup detayları güncellenmiştir", "event.deleted": "\"%1\" grubu silinmiş" } \ No newline at end of file diff --git a/public/language/tr/login.json b/public/language/tr/login.json index e18bc769ca..bd13e81d46 100644 --- a/public/language/tr/login.json +++ b/public/language/tr/login.json @@ -1,7 +1,7 @@ { - "username-email": "Username / Email", - "username": "Username", - "email": "Email", + "username-email": "Kullancı Adı / E posta adresi", + "username": "Kullanıcı Adı", + "email": "E posta Adresi", "remember_me": "Beni Hatırla!", "forgot_password": "Şifrenizi mi unuttunuz?", "alternative_logins": "Alternatif Girişler", diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index c87b3ec4ee..64ca790352 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -2,7 +2,7 @@ "title": "Bildirimler", "no_notifs": "Yeni bildirimleriniz yok", "see_all": "Bütün bildirimleri gör", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "Okunmuş bütün bildirimleri işaretle", "back_to_home": "Geri dön %1", "outgoing_link": "Harici Link", "outgoing_link_message": "Bu forumdan ayrılıyorsunuz", diff --git a/public/language/tr/recent.json b/public/language/tr/recent.json index 817a69b2f8..f91231966c 100644 --- a/public/language/tr/recent.json +++ b/public/language/tr/recent.json @@ -6,7 +6,7 @@ "year": "Yıl", "alltime": "Hepsi", "no_recent_topics": "Güncel konular yok.", - "no_popular_topics": "There are no popular topics.", + "no_popular_topics": "Popüler konu yok", "there-is-a-new-topic": "Yeni bir konu mevcut.", "there-is-a-new-topic-and-a-new-post": "Yeni bir konu ve yayın mevcut.", "there-is-a-new-topic-and-new-posts": "Bir adet yeni konu ve %1 adet yeni yayın var.", diff --git a/public/language/tr/search.json b/public/language/tr/search.json index 1819a07de3..2ffbbfe36e 100644 --- a/public/language/tr/search.json +++ b/public/language/tr/search.json @@ -32,9 +32,9 @@ "category": "Kategori", "descending": "Azalan düzene göre", "ascending": "Artan düzene göre", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "save-preferences": "Tercihleri Kaydet", + "clear-preferences": "Tercihleri Sil", + "search-preferences-saved": "Kaydedilmiş Arama tercihleri", + "search-preferences-cleared": "Silinmiş Arama Tercihleri", + "show-results-as": "Sonuçları göster : " } \ No newline at end of file diff --git a/public/language/tr/tags.json b/public/language/tr/tags.json index 9f614ce38c..344a4bfff6 100644 --- a/public/language/tr/tags.json +++ b/public/language/tr/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Bu etiketli başlık yok.", "tags": "Etiketler", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Etiketleri buraya girin. %1-%2 karakter. Her etiketten sonra enter tuşuna basın.", "enter_tags_here_short": "Etiketleri gir...", "no_tags": "Henüz etiket yok." } \ No newline at end of file diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index fa76fb4ee6..ef6276ca31 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -12,7 +12,7 @@ "notify_me": "Bu konudaki cevaplardan haberdar ol", "quote": "Alıntı", "reply": "Cevap", - "guest-login-reply": "Log in to reply", + "guest-login-reply": "Cevaplamak için giriş yapın", "edit": "Düzenle", "delete": "Sil", "purge": "Temizle", diff --git a/public/language/tr/users.json b/public/language/tr/users.json index 9e38f04530..ed6fd922fe 100644 --- a/public/language/tr/users.json +++ b/public/language/tr/users.json @@ -5,7 +5,7 @@ "search": "Ara", "enter_username": "Aramak için bir kullanıcı adı girin", "load_more": "Daha Fazla Yükle", - "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", + "users-found-search-took": "%1 kullanıcı(lar) bulundu! Arama %2 saniye sürdü.", "filter-by": "Şu şekilde filtrele", "online-only": "Sadece çevrimiçi", "picture-only": "Sadece resim" diff --git a/public/language/vi/category.json b/public/language/vi/category.json index e536a54efb..be80ee1583 100644 --- a/public/language/vi/category.json +++ b/public/language/vi/category.json @@ -1,6 +1,6 @@ { "new_topic_button": "Chủ đề mới", - "guest-login-post": "Log in to post", + "guest-login-post": "Đăng nhập để viết bài", "no_topics": "Không có bài viết trong danh mục này.
Hãy đăng một bài viết mới.", "browsing": "đang xem", "no_replies": "Chưa có bình luận nào", diff --git a/public/language/vi/email.json b/public/language/vi/email.json index d0d376eb34..c7f5fd5b54 100644 --- a/public/language/vi/email.json +++ b/public/language/vi/email.json @@ -9,9 +9,9 @@ "reset.text1": "Chúng tôi nhận được yêu cầu khởi tạo lại mật khẩu của bạn, rất có thể vì bạn đã quên mất nó. Nếu bạn không gởi yêu cầu, hãy bỏ qua email này.", "reset.text2": "Để đặt lại mật khẩu, hãy click vào liên kết sau:", "reset.cta": "Click vào đây để khởi tạo lại mật khẩu", - "reset.notify.subject": "Password successfully changed", - "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", - "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", + "reset.notify.subject": "Thay đổi mật khẩu thành công", + "reset.notify.text1": "Chúng tôi thông báo với bạn trên %1, mật khẩu của bạn đã thay đổi thành công", + "reset.notify.text2": "Nếu bạn không cho phép điều này, vui lòng thông báo cho quản trị viên ngay lập tức", "digest.notifications": "Bạn có thông báo chưa đọc từ %1", "digest.latest_topics": "Chủ đề mới nhất từ %1", "digest.cta": "Click vào đây để truy cập %1", @@ -20,8 +20,8 @@ "notif.chat.subject": "Bạn có tin nhắn mới từ %1", "notif.chat.cta": "Nhấn vào đây để tiếp tục cuộc hội thoại", "notif.chat.unsub.info": "Thông báo tin nhắn này được gửi tới dựa theo cài đặt theo dõi của bạn.", - "notif.post.cta": "Click here to read the full topic", - "notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.", + "notif.post.cta": "Nhấn vào đây để đọc toàn bộ chủ đề", + "notif.post.unsub.info": "Thông báo bài viết này được gửi cho bạn dựa tên thiết lập nhận thông báo của bạn", "test.text1": "Đây là email kiểm tra xem chức năng gửi mail trên hệ thống NodeBB của bạn có hoạt động tốt hay không.", "unsub.cta": "Nhấn vào đây để thay đổi cài đặt.", "closing": "Xin cảm ơn!" diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 65ddf93ba0..56d5a49788 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -18,7 +18,7 @@ "username-taken": "Tên đăng nhập đã tồn tại", "email-taken": "Email đã được đăng kí", "email-not-confirmed": "Email của bạn chưa được xác nhận, xin hãy nhấn vào đây để xác nhận địa chỉ này là của bạn", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed", + "email-not-confirmed-chat": "Bạn không thể trò chuyện cho đến khi thư điện tử của bạn được xác nhận", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "username-too-short": "Tên đăng nhập quá ngắn", diff --git a/public/language/vi/notifications.json b/public/language/vi/notifications.json index d204c2fd0b..d218247ba7 100644 --- a/public/language/vi/notifications.json +++ b/public/language/vi/notifications.json @@ -2,7 +2,7 @@ "title": "Thông báo", "no_notifs": "Bạn không có thông báo nào mới", "see_all": "Xem tất cả thông báo", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "Đánh dấu đã xem tất cả thông báo", "back_to_home": "Quay lại %1", "outgoing_link": "Liên kết ngoài", "outgoing_link_message": "Bạn đang rời khỏi %1.", diff --git a/public/language/vi/tags.json b/public/language/vi/tags.json index 7b8931883f..68f5639c02 100644 --- a/public/language/vi/tags.json +++ b/public/language/vi/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Không có bài viết nào với thẻ này.", "tags": "Thẻ", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "Tên thẻ...", "no_tags": "Chưa có thẻ nào." } \ No newline at end of file diff --git a/public/language/zh_CN/category.json b/public/language/zh_CN/category.json index 21ea5d5acf..1d5d4fb2a5 100644 --- a/public/language/zh_CN/category.json +++ b/public/language/zh_CN/category.json @@ -1,6 +1,6 @@ { "new_topic_button": "新主题", - "guest-login-post": "Log in to post", + "guest-login-post": "登陆后发表", "no_topics": "此版块还没有任何内容。
赶紧来发帖吧!", "browsing": "正在浏览", "no_replies": "尚无回复", diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index 69ea834c58..b156a96793 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -19,8 +19,8 @@ "email-taken": "电子邮箱已被占用", "email-not-confirmed": "您的电子邮箱尚未确认,请点击这里确认您的电子邮箱。", "email-not-confirmed-chat": "在确认您的邮箱之前,您不能使用聊天功能", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "no-email-to-confirm": "本论坛需要电子邮箱确认,请点击这里输入一个电子邮箱地址", + "email-confirm-failed": "我们无法确认您的电子邮箱,请重试", "username-too-short": "用户名太短", "username-too-long": "用户名太长", "user-banned": "用户已禁止", @@ -35,7 +35,7 @@ "no-emailers-configured": "未加载任何电子邮箱插件,无法发送测试邮件", "category-disabled": "版块已禁用", "topic-locked": "主题已锁定", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "您只能在发表后 %1 秒内修改内容", "still-uploading": "请等待上传完成", "content-too-short": "请再输入一些内容,帖子至少要有 %1 个字符。", "content-too-long": "请输入更短的发帖。发帖字数不能超过 %1 个字符。", @@ -43,8 +43,8 @@ "title-too-long": "请输入更短的标题。不超过 %1 字。", "too-many-posts": "发帖间隔至少要 %1 秒 - 请稍候再发帖", "too-many-posts-newbie": "作为新用户,您必须每隔 %1 秒才能发帖一次,直到您有 %2 点威望为止 —— 请稍候再发帖", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", + "tag-too-short": "标签长度过短,标签长度至少为 %1 个字符", + "tag-too-long": "标签长度过长,标签长度至多为 %1 个字符", "file-too-big": "文件不能超过 %1k 字节 - 请上传更小的文件", "cant-vote-self-post": "您不能给自己的帖子投票。", "already-favourited": "您已收藏该帖", @@ -52,7 +52,7 @@ "cant-ban-other-admins": "您不能禁止其他管理员!", "invalid-image-type": "无效的图像类型。允许的类型有:%1", "invalid-image-extension": "无效的图像扩展", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-file-type": "无效文件格式,允许的格式有:%1", "group-name-too-short": "用户组名称太短", "group-already-exists": "用户组已存在", "group-name-change-not-allowed": "不允许更改用户组名称", @@ -76,6 +76,6 @@ "reload-failed": "NodeBB 重新加载时遇到问题: \"%1\"。NodeBB 会继续给已存在的客户端组件服务,虽然您应该撤销在重新加载前执行的操作。", "registration-error": "注册错误", "parse-error": "解析服务器响应时出错", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "wrong-login-type-email": "请输入您的电子邮箱地址登录", + "wrong-login-type-username": "请输入您的用户名登录" } \ No newline at end of file diff --git a/public/language/zh_CN/tags.json b/public/language/zh_CN/tags.json index 9802f9c79a..a50705d3d6 100644 --- a/public/language/zh_CN/tags.json +++ b/public/language/zh_CN/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "此话题还没有主题帖。", "tags": "话题", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "输入话题...", "no_tags": "尚无话题。" } \ No newline at end of file diff --git a/public/language/zh_TW/tags.json b/public/language/zh_TW/tags.json index ce9de5c88b..dc5c1601ba 100644 --- a/public/language/zh_TW/tags.json +++ b/public/language/zh_TW/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "沒有此標籤的主題。", "tags": "標籤", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Enter tags here. %1-%2 characters. Press enter after each tag.", "enter_tags_here_short": "輸入標籤...", "no_tags": "還沒有標籤呢。" } \ No newline at end of file From ca31ac882ca1177afdfb077adf4235c5c48924d0 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 11 Mar 2015 19:47:14 -0400 Subject: [PATCH 083/102] added return true/false --- public/src/ajaxify.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index ee317d9133..2e81d837b6 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -65,8 +65,10 @@ $(document).ready(function() { // If ajaxifying into an admin route from regular site, do a cold load. url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); if (url.indexOf('admin') === 0 && window.location.pathname.indexOf('/admin') !== 0) { - return window.open(RELATIVE_PATH + '/' + url, '_blank'); + window.open(RELATIVE_PATH + '/' + url, '_blank'); + return true; } + return false; } ajaxify.start = function(url, quiet, search) { From f89741636cdad244d38bf2c8dca52054f65c335c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 11 Mar 2015 21:56:33 -0400 Subject: [PATCH 084/102] return false to prevent default --- public/src/ajaxify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 2e81d837b6..e87bee7504 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -24,7 +24,7 @@ $(document).ready(function() { ajaxify.go = function (url, callback, quiet) { if (ajaxify.handleACPRedirect(url)) { - return; + return false; } app.enterRoom(''); From c63d5f4b7a6fab9a3cadec0ecb32a59e2e33ded8 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 11 Mar 2015 22:47:15 -0400 Subject: [PATCH 085/102] test --- src/groups.js | 6 +----- src/posts/user.js | 16 ++++++++++++---- src/topics.js | 42 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/groups.js b/src/groups.js index 3f1ba0ddf7..25c8ff1bdc 100644 --- a/src/groups.js +++ b/src/groups.js @@ -953,11 +953,7 @@ var async = require('async'), var memberOf = []; isMembers.forEach(function(isMember, index) { if (isMember) { - if (uids.length > 1) { - memberOf.push(util._extend({}, groupData[index])); - } else { - memberOf.push(groupData[index]); - } + memberOf.push(groupData[index]); } }); diff --git a/src/posts/user.js b/src/posts/user.js index 494b1dbc6f..8d64aeb621 100644 --- a/src/posts/user.js +++ b/src/posts/user.js @@ -33,10 +33,18 @@ module.exports = function(Posts) { var userData = results.userData; userData.forEach(function(userData, i) { - userData.groups = results.groups[i]; - - userData.groups.forEach(function(group) { - group.selected = group.name === results.userSettings[i].groupTitle; + userData.groups = []; + + results.groups[i].forEach(function(group, index) { + userData.groups[index] = { + name: group.name, + slug: group.slug, + labelColor: group.labelColor, + icon: group.icon, + userTitle: group.userTitle, + userTitleEnabled: group.userTitleEnabled, + selected: group.name === results.userSettings[i].groupTitle + }; }); userData.status = user.getStatus(userData.status, results.online[i]); }); diff --git a/src/topics.js b/src/topics.js index 3c22bcf30c..6dd1a6361a 100644 --- a/src/topics.js +++ b/src/topics.js @@ -216,11 +216,14 @@ var async = require('async'), } async.parallel({ - mainPost: function(next) { - getMainPosts([topicData.mainPid], uid, next); - }, + // mainPost: function(next) { + // getMainPosts([topicData.mainPid], uid, next); + // }, + // posts: function(next) { + // Topics.getTopicPosts(tid, set, start, end, uid, reverse, next); + // }, posts: function(next) { - Topics.getTopicPosts(tid, set, start, end, uid, reverse, next); + getMainPostAndReplies(topicData, set, uid, start, end, reverse, next); }, category: async.apply(Topics.getCategoryData, tid), threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', {topic: topicData, uid: uid, tools: []}), @@ -231,7 +234,8 @@ var async = require('async'), return callback(err); } - topicData.posts = Array.isArray(results.mainPost) && results.mainPost.length ? [results.mainPost[0]].concat(results.posts) : results.posts; + //topicData.posts = Array.isArray(results.mainPost) && results.mainPost.length ? [results.mainPost[0]].concat(results.posts) : results.posts; + topicData.posts = results.posts; topicData.category = results.category; topicData.thread_tools = results.threadTools.tools; topicData.tags = results.tags; @@ -249,6 +253,34 @@ var async = require('async'), }); }; + function getMainPostAndReplies(topic, set, uid, start, end, reverse, callback) { + async.waterfall([ + function(next) { + posts.getPidsFromSet(set, start, end, reverse, next); + }, + function(pids, next) { + if ((!Array.isArray(pids) || !pids.length) && !topic.mainPid) { + return callback(null, []); + } + + if (topic.mainPid) { + pids.unshift(topic.mainPid); + } + posts.getPostsByPids(pids, uid, next); + }, + function(posts, next) { + var indices = Topics.calculatePostIndices(start, end, topic.postcount, reverse); + posts.forEach(function(post, index) { + if (post) { + post.index = indices[index] - 1; + } + }); + + Topics.addPostData(posts, uid, callback); + } + ]); + } + Topics.getMainPost = function(tid, uid, callback) { Topics.getMainPosts([tid], uid, function(err, mainPosts) { callback(err, Array.isArray(mainPosts) && mainPosts.length ? mainPosts[0] : null); From 2878bf6cfe12c4d962b1a4b75da639f00f6c0578 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 11 Mar 2015 23:37:25 -0400 Subject: [PATCH 086/102] removed commented out code --- src/topics.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/topics.js b/src/topics.js index 6dd1a6361a..8f8915ab69 100644 --- a/src/topics.js +++ b/src/topics.js @@ -216,15 +216,7 @@ var async = require('async'), } async.parallel({ - // mainPost: function(next) { - // getMainPosts([topicData.mainPid], uid, next); - // }, - // posts: function(next) { - // Topics.getTopicPosts(tid, set, start, end, uid, reverse, next); - // }, - posts: function(next) { - getMainPostAndReplies(topicData, set, uid, start, end, reverse, next); - }, + posts: async.apply(getMainPostAndReplies, topicData, set, uid, start, end, reverse), category: async.apply(Topics.getCategoryData, tid), threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', {topic: topicData, uid: uid, tools: []}), tags: async.apply(Topics.getTopicTagsObjects, tid), @@ -234,7 +226,6 @@ var async = require('async'), return callback(err); } - //topicData.posts = Array.isArray(results.mainPost) && results.mainPost.length ? [results.mainPost[0]].concat(results.posts) : results.posts; topicData.posts = results.posts; topicData.category = results.category; topicData.thread_tools = results.threadTools.tools; From ec897be3e76fd45fe5eeef03259020197953a471 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 12 Mar 2015 01:34:10 -0400 Subject: [PATCH 087/102] jshint --- public/vendor/autosize.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/vendor/autosize.js b/public/vendor/autosize.js index 645826fcb6..b6a5c39af8 100644 --- a/public/vendor/autosize.js +++ b/public/vendor/autosize.js @@ -3,9 +3,9 @@ license: MIT http://www.jacklmoore.com/autosize */ +'use strict'; +/*globals define*/ (function (root, factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define('autosize', factory); From fd1b7bbd3a5ef1ce4314e7117642fe8e60b6cbe3 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 10:57:23 -0400 Subject: [PATCH 088/102] fix redirection --- public/src/ajaxify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index e87bee7504..0161d8a6ae 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -24,7 +24,7 @@ $(document).ready(function() { ajaxify.go = function (url, callback, quiet) { if (ajaxify.handleACPRedirect(url)) { - return false; + return true; } app.enterRoom(''); From 4cb58d976b5fee5ce0888205b8124330b5b28368 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 11:03:10 -0400 Subject: [PATCH 089/102] fix indices, main post always 0 --- src/topics.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/topics.js b/src/topics.js index 8f8915ab69..aecdcb1000 100644 --- a/src/topics.js +++ b/src/topics.js @@ -260,12 +260,20 @@ var async = require('async'), posts.getPostsByPids(pids, uid, next); }, function(posts, next) { + if (!posts.length) { + return next(null, []); + } + + if (topic.mainPid) { + posts[0].index = 0; + } + var indices = Topics.calculatePostIndices(start, end, topic.postcount, reverse); - posts.forEach(function(post, index) { - if (post) { - post.index = indices[index] - 1; + for (var i=1; i Date: Thu, 12 Mar 2015 12:30:00 -0400 Subject: [PATCH 090/102] closes #2839 and #2840 --- public/src/modules/composer/resize.js | 43 ++++++++++++++++----------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 8f37b0f76e..e353971e2f 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -19,11 +19,13 @@ define('composer/resize', ['autosize'], function(autosize) { env = utils.findBootstrapEnvironment(); } - postContainer.percentage = percentage; - if (percentage) { + var max = getMaximumPercentage(); + if (percentage < 0.25) { percentage = 0.25; + } else if (percentage > max) { + percentage = max; } if (env === 'md' || env === 'lg') { @@ -31,6 +33,8 @@ define('composer/resize', ['autosize'], function(autosize) { } } + postContainer.percentage = percentage; + // todo, lump in browsers that don't support transform (ie8) here // at this point we should use modernizr if (env === 'sm' || env === 'xs' || window.innerHeight < 480) { @@ -94,7 +98,7 @@ define('composer/resize', ['autosize'], function(autosize) { function toggleMaximize(e) { if (e.clientY - resizeDown === 0 || snapToTop) { - var newPercentage = ($(window).height() - $('#header-menu').height() - 1) / $(window).height(); + var newPercentage = getMaximumPercentage(); if (!postContainer.hasClass('maximized') || !snapToTop) { oldPercentage = postContainer.percentage; @@ -132,8 +136,9 @@ define('composer/resize', ['autosize'], function(autosize) { } function resizeSavePosition(px) { - var percentage = px / $(window).height(); - localStorage.setItem('composer:resizePercentage', percentage); + var percentage = px / $(window).height(), + max = getMaximumPercentage(); + localStorage.setItem('composer:resizePercentage', percentage < max ? percentage : max); } var resizeActive = false, @@ -142,23 +147,27 @@ define('composer/resize', ['autosize'], function(autosize) { snapToTop = false, resizeEl = postContainer.find('.resizer'); - resizeEl.on('mousedown', resizeStart); - - resizeEl.on('touchstart', function(e) { - e.preventDefault(); - resizeStart(e.touches[0]); - }); - - resizeEl.on('touchend', function(e) { - e.preventDefault(); - resizeStop(); - }); + resizeEl + .on('mousedown', resizeStart) + .on('touchstart', function(e) { + e.preventDefault(); + resizeStart(e.touches[0]); + }) + .on('touchend', function(e) { + e.preventDefault(); + resizeStop(); + }); }; + function getMaximumPercentage() { + return ($(window).height() - $('#header-menu').height() - 1) / $(window).height(); + } function resizeWritePreview(postContainer) { var total = getFormattingHeight(postContainer); - postContainer.find('.write-preview-container').css('height', postContainer.percentage * $(window).height() - $('#header-menu').height() - total); + postContainer + .find('.write-preview-container') + .css('height', postContainer.percentage * $(window).height() - $('#header-menu').height() - total); } function getFormattingHeight(postContainer) { From dd06e8d7d81b03f684a0c0647889fef728a5bf48 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 13:26:29 -0400 Subject: [PATCH 091/102] return early if falsy --- public/src/utils.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/public/src/utils.js b/public/src/utils.js index 4efad224fd..3daa316117 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -75,7 +75,9 @@ //http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/ slugify: function(str, preserveCase) { - if (!str) { str = ''; } + if (!str) { + return ''; + } str = str.replace(utils.trimRegex, ''); if(utils.isLatin.test(str)) { str = str.replace(utils.invalidLatinChars, '-'); @@ -276,7 +278,7 @@ } if (!hash[key]) { hash[key] = value; - } else { + } else { if (!$.isArray(hash[key])) { hash[key] = [hash[key]]; } From e9f82b7eeea69258dec01fffa61a34e1d0995787 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 13:39:04 -0400 Subject: [PATCH 092/102] updated isLatin check doggy.gif --- public/src/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/utils.js b/public/src/utils.js index 3daa316117..0c58817411 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -70,7 +70,7 @@ collapseDash: /-+/g, trimTrailingDash: /-$/g, trimLeadingDash: /^-/g, - isLatin: /^[\w]+$/, + isLatin: /^[\w\d\s.,\-@]+$/, languageKeyRegex: /\[\[[\w]+:.+\]\]/, //http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/ From dfe48fffb1227604e98d54399a76d5052b5e9323 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 12 Mar 2015 14:49:18 -0400 Subject: [PATCH 093/102] composer fixes when resizing window horizontally --- public/src/modules/composer/resize.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index e353971e2f..66f22462f3 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -5,8 +5,7 @@ define('composer/resize', ['autosize'], function(autosize) { var resize = {}, - oldPercentage = 0, - env; + oldPercentage = 0; resize.reposition = function(postContainer) { var percentage = localStorage.getItem('composer:resizePercentage') || 0.5; @@ -15,8 +14,17 @@ define('composer/resize', ['autosize'], function(autosize) { }; function doResize(postContainer, percentage) { - if (!env) { - env = utils.findBootstrapEnvironment(); + var env = utils.findBootstrapEnvironment(); + + + // todo, lump in browsers that don't support transform (ie8) here + // at this point we should use modernizr + if (env === 'sm' || env === 'xs' || window.innerHeight < 480) { + $('html').addClass('composing mobile'); + autosize(postContainer.find('textarea')[0]); + percentage = 1; + } else { + $('html').removeClass('composing mobile'); } if (percentage) { @@ -30,19 +38,13 @@ define('composer/resize', ['autosize'], function(autosize) { if (env === 'md' || env === 'lg') { postContainer.css('transform', 'translate(0, ' + (Math.abs(1-percentage) * 100) + '%)'); + } else { + postContainer.removeAttr('style'); } } postContainer.percentage = percentage; - // todo, lump in browsers that don't support transform (ie8) here - // at this point we should use modernizr - if (env === 'sm' || env === 'xs' || window.innerHeight < 480) { - $('html').addClass('composing mobile'); - postContainer.percentage = 1; - autosize(postContainer.find('textarea')[0]); - } - if (config.hasImageUploadPlugin) { postContainer.find('.img-upload-btn').removeClass('hide'); postContainer.find('#files.lt-ie9').removeClass('hide'); From 279bb62a3fb1783e36db3d44ba7a17a3d0fea43e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 15:01:50 -0400 Subject: [PATCH 094/102] cache parsed post content clear cache on plugin install/uninstall/activate/deactivate --- package.json | 1 + src/postTools.js | 29 ++++++++++++++++++++++++++--- src/socket.io/admin.js | 8 +++++--- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a1fac5f4de..24bc90bef9 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "heapdump": "^0.3.0", "less": "^2.0.0", "logrotate-stream": "^0.2.3", + "lru-cache": "^2.5.0", "mime": "^1.3.4", "mkdirp": "~0.5.0", "mmmagic": "^0.3.13", diff --git a/src/postTools.js b/src/postTools.js index 0fe8be23f8..9ddc7b999e 100644 --- a/src/postTools.js +++ b/src/postTools.js @@ -14,7 +14,14 @@ var winston = require('winston'), utils = require('../public/src/utils'), plugins = require('./plugins'), events = require('./events'), - meta = require('./meta'); + meta = require('./meta'), + LRU = require('lru-cache'); + +var cache = LRU({ + max: 1048576, + length: function (n) { return n.length }, + maxAge: 1000 * 60 * 60 +}); (function(PostTools) { @@ -100,6 +107,7 @@ var winston = require('winston'), }); }, postData: function(next) { + cache.del(postData.pid); PostTools.parsePost(postData, data.uid, next); } }, function(err, results) { @@ -148,6 +156,7 @@ var winston = require('winston'), } if (isDelete) { + cache.del(postData.pid); posts.delete(pid, callback); } else { posts.restore(pid, function(err, postData) { @@ -165,7 +174,7 @@ var winston = require('winston'), if (err || !canEdit) { return callback(err || new Error('[[error:no-privileges]]')); } - + cache.del(pid); posts.purge(pid, callback); }); }; @@ -173,8 +182,18 @@ var winston = require('winston'), PostTools.parsePost = function(postData, uid, callback) { postData.content = postData.content || ''; + var cachedContent = cache.get(postData.pid); + if (cachedContent) { + postData.content = cachedContent; + return callback(null, postData); + } + plugins.fireHook('filter:parse.post', {postData: postData, uid: uid}, function(err, data) { - callback(err, data ? data.postData : null); + if (err) { + return callback(err); + } + cache.set(data.postData.pid, data.postData.content); + callback(null, data.postData); }); }; @@ -184,4 +203,8 @@ var winston = require('winston'), plugins.fireHook('filter:parse.signature', {userData: userData, uid: uid}, callback); }; + PostTools.resetCache = function() { + cache.reset(); + }; + }(exports)); diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index dcbda783aa..6860fb6e66 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -104,10 +104,12 @@ SocketAdmin.themes.updateBranding = function(socket, data, callback) { }; SocketAdmin.plugins.toggleActive = function(socket, plugin_id, callback) { + require('../postTools').resetCache(); plugins.toggleActive(plugin_id, callback); }; SocketAdmin.plugins.toggleInstall = function(socket, data, callback) { + require('../postTools').resetCache(); plugins.toggleInstall(data.id, data.version, callback); }; @@ -121,7 +123,7 @@ SocketAdmin.plugins.orderActivePlugins = function(socket, data, callback) { db.sortedSetAdd('plugins:active', plugin.order || 0, plugin.name, next); } else { next(); - } + } }, callback); }; @@ -339,12 +341,12 @@ SocketAdmin.getMoreFlags = function(socket, data, callback) { posts.getUserFlags(byUsername, sortBy, socket.uid, start, end, function(err, posts) { callback(err, {posts: posts, next: end + 1}); }); - } else { + } else { var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged'; posts.getFlags(set, socket.uid, start, end, function(err, posts) { callback(err, {posts: posts, next: end + 1}); }); - } + } }; SocketAdmin.takeHeapSnapshot = function(socket, data, callback) { From b37bcc6dfe63c57d0fccbdb3b105030b6231328c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 16:26:33 -0400 Subject: [PATCH 095/102] closes #2853 --- public/src/modules/composer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 8a85846b0b..6c4bb65588 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -397,7 +397,7 @@ define('composer', [ var titleEl = postContainer.find('.title'); if (parseInt(postData.tid, 10) > 0) { - titleEl.translateVal('[[topic:composer.replying_to, ' + postData.title + ']]'); + titleEl.translateVal('[[topic:composer.replying_to, "' + postData.title + '"]]'); titleEl.prop('disabled', true); } else if (parseInt(postData.pid, 10) > 0) { titleEl.val(postData.title); @@ -531,7 +531,7 @@ define('composer', [ $('body').css({'margin-bottom': 0}); $('[data-action="post"]').removeAttr('disabled'); - + $('html').removeClass('composing mobile'); } } From 2f688136d173deb73fd25a357a7de97ff1dd9c66 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 16:30:08 -0400 Subject: [PATCH 096/102] closes #2852 --- public/src/modules/composer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 6c4bb65588..c36c42365e 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -314,12 +314,13 @@ define('composer', [ discard(post_uuid); return; } - + var btn = $(this).prop('disabled', true); translator.translate('[[modules:composer.discard]]', function(translated) { bootbox.confirm(translated, function(confirm) { if (confirm) { discard(post_uuid); } + btn.prop('disabled', false); }); }); }); From d3b2742da01a81bfa017c0aeb2d87c5a31db9c10 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 16:50:46 -0400 Subject: [PATCH 097/102] closes #2746 closes #2747 --- public/src/admin/modules/search.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/public/src/admin/modules/search.js b/public/src/admin/modules/search.js index dec438165d..781f4ade9e 100644 --- a/public/src/admin/modules/search.js +++ b/public/src/admin/modules/search.js @@ -103,11 +103,17 @@ define(function() { if (menuItems.html() !== '') { menuItems.append(''); + } else { + menuItems.append('
'); } } if (value.length > 0) { - menuItems.append('
  • Search the forum for ' + value + '
  • '); + if (config.searchEnabled) { + menuItems.append('
  • Search the forum for ' + value + '
  • '); + } else if (value.length < 3) { + menuItems.append('
  • Type more to see results...
  • '); + } } else { menuItems.append('
  • Start typing to see results...
  • '); } From e6c079406123d53040053803c595f20e2fd23c8d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 17:46:49 -0400 Subject: [PATCH 098/102] create tooltips for users on widgets --- public/src/widgets.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/public/src/widgets.js b/public/src/widgets.js index fea7814c9d..990a42c6f0 100644 --- a/public/src/widgets.js +++ b/public/src/widgets.js @@ -68,11 +68,16 @@ ajaxify.widgets.reposition(location); } } - + var widgetAreas = $('#content [widget-area]'); widgetAreas.find('img:not(.user-img)').addClass('img-responsive'); widgetAreas.find('span.timeago').timeago(); - + widgetAreas.find('img[title].teaser-pic,img[title].user-img').each(function() { + $(this).tooltip({ + placement: 'top', + title: $(this).attr('title') + }); + }); $(window).trigger('action:widgets.loaded', {}); if (typeof callback === 'function') { From 6e25724cfb31dd76273cf18b3368c1e1582d0db2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 19:27:53 -0400 Subject: [PATCH 099/102] removed unused requires --- src/routes/meta.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/routes/meta.js b/src/routes/meta.js index 6a7fe0566b..9f77a8fc7c 100644 --- a/src/routes/meta.js +++ b/src/routes/meta.js @@ -1,11 +1,6 @@ "use strict"; -var path = require('path'), - nconf = require('nconf'), - - meta = require('../meta'), - db = require('../database'), - plugins = require('../plugins'), +var meta = require('../meta'), middleware = require('../middleware'); From 58169aa6d92f0991d6a4dd6874252a43a9daf6c2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 12 Mar 2015 19:28:53 -0400 Subject: [PATCH 100/102] no need for return --- src/routes/meta.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/meta.js b/src/routes/meta.js index 9f77a8fc7c..e028adf63d 100644 --- a/src/routes/meta.js +++ b/src/routes/meta.js @@ -5,7 +5,7 @@ var meta = require('../meta'), function sendMinifiedJS(req, res, next) { - return res.type('text/javascript').send(meta.js.cache); + res.type('text/javascript').send(meta.js.cache); } function sendStylesheet(req, res, next) { From f7f048f06a6b3056c255c88b996ddaf6bbfdf8e4 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 12 Mar 2015 22:52:50 -0400 Subject: [PATCH 101/102] when toggling composer preview, autofocus on composer --- public/src/modules/composer.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index c36c42365e..71706704cb 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -348,7 +348,7 @@ define('composer', [ resize.handleResize(postContainer); handleHelp(postContainer); - handleToggle(postContainer); + handleTogglePreview(postContainer); $(window).trigger('action:composer.loaded', { post_uuid: post_uuid @@ -377,7 +377,7 @@ define('composer', [ }); } - function handleToggle(postContainer) { + function handleTogglePreview(postContainer) { var showBtn = postContainer.find('.write-container .toggle-preview'), hideBtn = postContainer.find('.preview-container .toggle-preview'); @@ -385,12 +385,16 @@ define('composer', [ $('.preview-container').addClass('hide'); $('.write-container').addClass('maximized'); showBtn.removeClass('hide'); + + $('.write').focus(); }); showBtn.on('click', function() { $('.preview-container').removeClass('hide'); $('.write-container').removeClass('maximized'); showBtn.addClass('hide'); + + $('.write').focus(); }); } From 89333ab339a2c371efdf8cff0941375e83827554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 13 Mar 2015 12:43:41 -0400 Subject: [PATCH 102/102] closes #2824 doggy.gif --- public/src/client/search.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/public/src/client/search.js b/public/src/client/search.js index 44477cd06d..900a4d1d6d 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -116,19 +116,13 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco if (!searchQuery) { return; } - var searchTerms = searchQuery.trim().split(' '); - var regexes = []; - for (var i=0; i' + regexes[i].term + ''); - } + var text = result.html().replace(regex, '$1'); result.html(text).find('img').addClass('img-responsive'); }); }
  • No results...