Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Register template #1362

Merged
merged 12 commits into from
Oct 21, 2016
12 changes: 12 additions & 0 deletions imports/plugins/included/email-templates/lib/templates/standard.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { html } from "/lib/core/templates";

// Standard HTML Email templste to be processed by Handlebars
const StandardTemplate = html`
<html>
<body>
"Great!!!" {{title}}
</body>
</html>
`;

export default StandardTemplate;
Empty file.
9 changes: 9 additions & 0 deletions imports/plugins/included/email-templates/server/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Reaction } from "/server/api";
import StandardTemplate from "../lib/templates/standard";

Reaction.registerTemplate({
title: "Standard Email",
name: "standard-email",
type: "email",
template: StandardTemplate
});
41 changes: 41 additions & 0 deletions lib/collections/schemas/templates.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,48 @@
import { SimpleSchema } from "meteor/aldeed:simple-schema";
import { Audience } from "./layouts";

export const Templates = new SimpleSchema({
name: {
type: String,
index: true
},
priority: {
type: Number,
optional: true,
defaultValue: 1
},
enabled: {
type: Boolean,
defaultValue: true
},
route: {
type: String,
optional: true
},
audience: {
type: [Audience],
optional: true
},
type: {
type: String
},
provides: {
type: String,
defaultValue: "template"
},
block: {
type: String,
optional: true
},
defaultData: {
type: Object,
blackbox: true
},
template: {
type: String,
optional: true
},
parser: {
type: String
},
language: {
Expand Down
5 changes: 5 additions & 0 deletions lib/core/templates.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

// Template literal for html strings.
export function html(strings, ...values) {
return strings.raw[0];
}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"fibers": "^1.0.14",
"font-awesome": "^4.6.3",
"griddle-react": "^0.6.1",
"handlebars": "^4.0.5",
"i18next": "^3.4.3",
"i18next-browser-languagedetector": "^1.0.0",
"i18next-localstorage-cache": "^0.3.0",
Expand Down
18 changes: 18 additions & 0 deletions server/api/core/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { Jobs, Packages, Shops } from "/lib/collections";
import { Hooks, Logger } from "/server/api";
import ProcessJobs from "/server/jobs";
import { getRegistryDomain } from "./setDomain";
import { registerTemplate } from "./templates";
import { sendVerificationEmail } from "./accounts";
import { getMailUrl } from "./email/config";

Expand Down Expand Up @@ -46,6 +47,23 @@ export default {
return registeredPackage;
},

registerTemplate(templateInfo, shopIds) {
if (typeof shopIds === "string") {
// Register template with supplied, single shopId
registerTemplate(templateInfo, shopIds);
} else if (Array.isArray(shopIds)) {
// Register template for all supplied shopIds
for (const shopId of shopIds) {
registerTemplate(templateInfo, shopId);
}
}

// Otherwise template for all available shops
return Shops.find().forEach((shop) => {
registerTemplate(templateInfo, shop._id);
});
},

/**
* hasPermission - server
* server permissions checks
Expand Down
18 changes: 18 additions & 0 deletions server/api/core/import.js
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,24 @@ Import.package = function (pkg, shopId) {
// server/startup/i18n.js
//

/**
* @summary Store a template in the import buffer.
* @param {Object} tempalteInfo The template data to be updated
* @param {String} shopId The package data to be updated
* @returns {undefined}
*/
Import.template = function (templateInfo, shopId) {
check(templateInfo, Object);
check(shopId, String);

const key = {
name: templateInfo.name,
shopId: shopId
};

return this.object(Collections.Templates, key, templateInfo);
};

/**
* @summary Store a translation in the import buffer.
* @param {Object} key A key to look up the translation
Expand Down
97 changes: 97 additions & 0 deletions server/api/core/templates.app-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import React from "react";
import { expect } from "meteor/practicalmeteor:chai";
import Reaction from "./";
import {
registerTemplate,
getTemplateByName,
renderTemplate,
resetRegisteredTemplates,
processTemplateInfoForMemoryCache,
TEMPLATE_PARSER_REACT,
TEMPLATE_PARSER_HANDLEBARS
} from "./templates";
import { Templates } from "/lib/collections";


function sampleReactComponent() {
return (
<div>{"Test"}</div>
);
}

describe("Templates:", function () {
beforeEach(function () {
Templates.direct.remove();
resetRegisteredTemplates();
});

it("It should process a handlebars template for memory cache", function () {
const expectedTemplate = processTemplateInfoForMemoryCache({
name: "test-template",
template: "<div>Test</div>"
});

expect(expectedTemplate.name).to.be.equal("test-template");
expect(expectedTemplate.parser).to.be.equal(TEMPLATE_PARSER_HANDLEBARS);
});

it("It should process a react component for memory cache", function () {
const expectedTemplate = processTemplateInfoForMemoryCache({
name: "test-template",
template: sampleReactComponent
});

expect(expectedTemplate.name).to.be.equal("test-template");
expect(expectedTemplate.parser).to.be.equal(TEMPLATE_PARSER_REACT);
expect(expectedTemplate.template).to.be.a("function");
});

it("It should register Handlebars template", function () {
const shopId = Reaction.getShopId();
// Register template
const sampleTemplate = {
name: "test-template",
template: "<div>Test</div>"
};
registerTemplate(sampleTemplate, shopId);

const actualTemplate = getTemplateByName("test-template", shopId);
expect(sampleTemplate.name).to.be.equal(actualTemplate.name);
expect(actualTemplate.parser).to.be.equal(TEMPLATE_PARSER_HANDLEBARS);
});

it("It should register Handlebars template and render to a string", function () {
const shopId = Reaction.getShopId();
// Register template
const sampleTemplate = {
name: "test-template",
template: "<div>Test</div>"
};

registerTemplate(sampleTemplate, shopId);

const actualTemplate = getTemplateByName("test-template", shopId);
expect(sampleTemplate.name).to.be.equal(actualTemplate.name);
expect(actualTemplate.parser).to.be.equal(TEMPLATE_PARSER_HANDLEBARS);

// Compile template to string
const renderedHtmlString = renderTemplate(actualTemplate);
expect(renderedHtmlString).to.be.a("string");
});

it("It should register a React component", function () {
const shopId = Reaction.getShopId();
const sampleTemplate = {
name: "test-template-react",
template: sampleReactComponent
};

registerTemplate(sampleTemplate, shopId);

const actualTemplate = getTemplateByName("test-template-react", shopId);

expect(sampleTemplate.name).to.be.equal(actualTemplate.name);
expect(actualTemplate.parser).to.be.equal(TEMPLATE_PARSER_REACT);
expect(actualTemplate.template).to.be.a("function");
});
});
Loading