Allow modules to inject parts of views

This commit is contained in:
James Allen 2014-09-08 15:40:46 +01:00
parent 374c0f3d65
commit db9632f8f2
5 changed files with 83 additions and 48 deletions

View file

@ -164,6 +164,7 @@ module.exports = (grunt) ->
moduleUnitTestTasks = []
if fs.existsSync "./modules"
for module in fs.readdirSync "./modules"
if fs.existsSync "./modules/#{module}/index.coffee"
config.coffee["module_#{module}_server"] = {
expand: true,
flatten: false,

View file

@ -6,6 +6,7 @@ SubscriptionFormatters = require('../Features/Subscription/SubscriptionFormatter
querystring = require('querystring')
SystemMessageManager = require("../Features/SystemMessages/SystemMessageManager")
_ = require("underscore")
Modules = require "./Modules"
fingerprints = {}
Path = require 'path'
@ -146,3 +147,9 @@ module.exports = (app)->
res.locals.currentLngCode = req.lng
next()
app.use (req, res, next) ->
if !Settings.cacheModuleViewIncludes
Modules.loadViewIncludes()
res.locals.moduleIncludes = Modules.moduleIncludes
next()

View file

@ -1,13 +1,36 @@
fs = require "fs"
Path = require "path"
jade = require "jade"
MODULE_BASE_PATH = Path.resolve(__dirname + "/../../../modules")
modules = []
for mod in fs.readdirSync(MODULE_BASE_PATH)
modules.push require(Path.join(MODULE_BASE_PATH, mod, "index"))
module.exports = Modules =
modules: []
loadModules: () ->
for moduleName in fs.readdirSync(MODULE_BASE_PATH)
if fs.existsSync(Path.join(MODULE_BASE_PATH, moduleName, "index.js"))
loadedModule = require(Path.join(MODULE_BASE_PATH, moduleName, "index"))
loadedModule.name = moduleName
@modules.push loadedModule
applyRouter: (app) ->
for module in modules
for module in @modules
module.router?.apply(app)
viewIncludes: {}
loadViewIncludes: (app) ->
@viewIncludes = {}
for module in @modules
for view, partial of module.viewIncludes or {}
@viewIncludes[view] ||= []
@viewIncludes[view].push fs.readFileSync(Path.join(MODULE_BASE_PATH, module.name, "app/views", partial + ".jade"))
moduleIncludes: (view, locals) ->
partials = Modules.viewIncludes[view] or []
html = ""
for partial in partials
compiler = jade.compile(partial)
html += compiler(locals)
return html
Modules.loadModules()

View file

@ -19,6 +19,7 @@ ReferalConnect = require('../Features/Referal/ReferalConnect')
RedirectManager = require("./RedirectManager")
OldAssetProxy = require("./OldAssetProxy")
translations = require("translations-sharelatex").setup(Settings.i18n)
Modules = require "./Modules"
metrics.mongodb.monitor(Path.resolve(__dirname + "/../../../node_modules/mongojs/node_modules/mongodb"), logger)
metrics.mongodb.monitor(Path.resolve(__dirname + "/../../../node_modules/mongoose/node_modules/mongodb"), logger)
@ -41,13 +42,13 @@ app.ignoreCsrf = (method, route) ->
ignoreCsrfRoutes.push new express.Route(method, route)
app.configure () ->
if Settings.behindProxy
app.enable('trust proxy')
app.use express.static(__dirname + '/../../../public', {maxAge: staticCacheAge })
app.set 'views', __dirname + '/../../views'
app.set 'view engine', 'jade'
Modules.loadViewIncludes app
app.use express.bodyParser(uploadDir: Settings.path.uploadFolder)
app.use express.bodyParser(uploadDir: __dirname + "/../../../data/uploads")
app.use translations.expressMiddlewear

View file

@ -109,8 +109,11 @@ block content
row
a(href='/dropbox/unlink').btn #{translate("unlink_dropbox")}
- else
p
a.btn.btn-info(href='/dropbox/beginAuth') #{translate("link_to_dropbox")}
| !{moduleIncludes("userSettings", locals)}
hr.soften
p.small