diff --git a/locales/en/translation.json b/locales/en/translation.json index 49adb2c..3de3ed5 100644 --- a/locales/en/translation.json +++ b/locales/en/translation.json @@ -11,6 +11,7 @@ "uploadScale": "Upload and scale 16:9", "save": "Save", "savetemplate": "Save as template", + "loadTemplate": "Template", "cancel": "Cancel", "insert": "Insert", "delete": "Delete", @@ -25,6 +26,7 @@ "forceReload": "Force reload", "createNew": "Create New", "createNewSlide": "Create New Slide", + "addVideo": "Add Video", "addWebPage": "Add Web page", "announce": "Fast Announce", "announceAll": "Global Announce" @@ -100,6 +102,13 @@ "duration": "Display duration (seconds), leave blank for default", "displayTime": "Display time" }, + "addVideo": { + "name": "Name", + "url": "url", + "displayTime": "Display time", + "mute": "Mute video", + "loop": "Loop video" + }, "tooltip": { "header": "Insert header", "paragraph": "Insert text", diff --git a/locales/fi/translation.json b/locales/fi/translation.json index f1f07c0..64329cf 100644 --- a/locales/fi/translation.json +++ b/locales/fi/translation.json @@ -11,6 +11,7 @@ "uploadScale": "Lataa ja skaalaa 16:9", "save": "Tallenna", "savetemplate": "Tallenna malliksi", + "loadTemplate": "Lataa malli", "cancel": "Peruuta", "insert": "Lisää", "delete": "Poista", diff --git a/modules/admin.js b/modules/admin.js index e444a2f..c75a547 100644 --- a/modules/admin.js +++ b/modules/admin.js @@ -439,16 +439,17 @@ class admin { socket.on('admin.editSlide', function (data) { let bundle = self.bundleManager.getBundle(data.bundleName); let bundleData = bundle.getBundleData(); + let templateData = {}; let json = "{}"; if (fs.existsSync("./data/template.json")) { - json = fs.readFileSync("./data/template.json").toString(); + templateData = JSON.parse(fs.readFileSync("./data/template.json").toString()); } - let slide = {displayTime: null}; + let slide = { displayTime: null }; if (data.fileName) { json = bundle.getSlideJsonFile(data.fileName); slide = bundle.findSlideByUuid(data.fileName); } - socket.emit("callback.edit", {bundleData: bundleData, slideData: slide, json: json}); + socket.emit("callback.edit", {bundleData: bundleData, slideData: slide, json: json, templates: templateData}); }); /** rename **/ @@ -474,8 +475,15 @@ class admin { }); socket.on('edit.saveTemplate', function (data) { + let templates = {}; + console.log(data.name); + + if (fs.existsSync("./data/template.json")) { + templates = JSON.parse(fs.readFileSync("./data/template.json").toString()); + } + templates[data.name] = data.json; try { - fs.writeFileSync("./data/template.json", JSON.stringify(data.json)); + fs.writeFileSync("./data/template.json", JSON.stringify(templates)); } catch (e) { cli.error(e, "save template"); } diff --git a/modules/websocket.js b/modules/websocket.js index 71a86e3..2ca1218 100644 --- a/modules/websocket.js +++ b/modules/websocket.js @@ -36,7 +36,7 @@ module.exports = function (pluginManager, io, dispatcher) { cli.error("data directory (./data) is not writable", err); process.exit(1); } - + try { fs.accessSync("./tmp", fs.W_OK); cli.success("temp directory (./tmp) is writable "); diff --git a/public/js/display.js b/public/js/display.js index 4b3c9a9..3ff0c63 100644 --- a/public/js/display.js +++ b/public/js/display.js @@ -244,8 +244,10 @@ function nextSlide(data) { bundleData = data.bundleData; checkTimeDisplay(); updateStatusMessage(); + $("#helperLayer").removeClass("announce"); if (serverOptions.isAnnounce) { + if (serverOptions.announceMeta.type === "webPage") { $("#slider").hide(); $("#" + getWebLayer()).css("transform", "scale(" + serverOptions.announceMeta.zoom + ")"); @@ -289,8 +291,7 @@ function nextSlide(data) { console.log(err); } } - } else { - $("#helperLayer").removeClass("announce"); + } else { switch (serverOptions.currentMeta.type) { case "webpage": $("#slider").hide(); diff --git a/public/js/edit.js b/public/js/edit.js index bbef306..ef8db8f 100644 --- a/public/js/edit.js +++ b/public/js/edit.js @@ -8,6 +8,7 @@ var slideName = "untitled"; var undoData = []; var undoActive = false; +var templates = {}; bundleData = { background: "", @@ -158,7 +159,7 @@ $("#contextmenu .item").click(function () { }); function saveState() { - if (undoData.length >= 10) { + if (undoData.length >= 15) { undoData.shift(); } undoData.push(canvas.toJSON(['id', 'fontSize'])); @@ -299,6 +300,7 @@ socket.on('callback.edit.updateFileList', function (data) { socket.on('callback.edit', function (data) { bundleData = data.bundleData; + templates = data.templates; canvas.clear(); if (data.slideData.name != null) { @@ -306,6 +308,26 @@ socket.on('callback.edit', function (data) { $("#slideName").val(slideName); } + let vals = [{ + name: "Empty", + value: "empty" + }]; + for (let i in templates) { + vals.push({name: i, value: i}); + } + + $('#templates').dropdown({ + values: vals, + action: function (text, value) { + $('#templates').dropdown("hide"); + if (value === "empty") { + nextSlide({}); + } + else { + nextSlide(templates[value]); + } + } + }) $("#duration").val(data.slideData.duration || ""); if (data.slideData.displayTime !== null) { @@ -348,14 +370,14 @@ socket.on('callback.edit', function (data) { }, timeout: 2000, active: function () { - nextSlide(data, true); + nextSlide(data.json); }, inactive: function () { - nextSlide(data, true); + nextSlide(data.json); } }); } else { - nextSlide(data, true); + nextSlide(data.json); } checkTimeDisplay(); setBackground(bundleData.background); @@ -459,9 +481,9 @@ function checkTimeDisplay() { } } -function nextSlide(data) { +function nextSlide(jsonData) { undoActive = false; - canvas.loadFromJSON(data.json, function () { + canvas.loadFromJSON(jsonData, function () { drawGrid(); undoActive = true; saveState(); @@ -676,7 +698,21 @@ function saveTemplate() { canvas.remove(objects[i]); } - socket.emit("edit.saveTemplate", {json: canvas.toJSON(['id', 'fontSize'])}); + let name = $("#slideName").val(); + if (name === "untitled") { + var texts = canvas.getObjects('i-text'); + for (let i in texts) { + if (texts[i].id == "header") { + name = texts[i].text; + break; + } + } + } + + socket.emit("edit.saveTemplate", { + name: name, + json: canvas.toJSON(['id', 'fontSize']) + }); drawGrid(); alert("Template saved."); diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 18cb982..f689cec 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -86,7 +86,10 @@ iframe { width: 100%; height: 100%; z-index: 70; - background: white; + background: black; + animation-duration: 10s; + -moz-animation-duration: 10s; + -webkit-animation-duration: 10s; } .slides .ui.item { @@ -149,12 +152,13 @@ iframe { @-webkit-keyframes announce { from, + 0%, 50% { opacity: 1; } 25%, - 75%, + 100%, to { opacity: 0; } @@ -162,12 +166,13 @@ iframe { @keyframes announce { from, + 0%, 50% { opacity: 1; } 25%, - 75%, + 100%, to { opacity: 0; } @@ -181,10 +186,8 @@ iframe { canvas { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - -moz-font-smoothing: antialiased; - font-smoothing: antialiased; + -moz-font-smoothing: antialiased; text-rendering: geometricPrecision; - font-smooth: always; } #statusMessageOuter { @@ -215,7 +218,7 @@ canvas { right: 2vw; font-family: 'Open Sans', sans-serif; font-weight: bolder; - font-size: 5vw; + font-size: 3.5vw; color: white; text-shadow: 2px 2px 2px black; text-align: right; diff --git a/views/admin/editSlide.twig b/views/admin/editSlide.twig index c9d6f99..da3eaca 100644 --- a/views/admin/editSlide.twig +++ b/views/admin/editSlide.twig @@ -21,11 +21,16 @@ text-rendering: geometricPrecision; font-smooth: always; } + #matchsize { transform-origin: top left; scale: 0.5; } - + + textarea { + top: 0px !important; + left: 0px !important; + } {% endblock %} @@ -75,6 +80,13 @@ + + {% if displayId != null %}
@@ -89,11 +101,9 @@
{% else %} {{ t("actions.announceAll") }} - {% endif %} - -
- {{ t("actions.cancel") }} -
+ {% endif %} + {{ t("actions.cancel") }} + @@ -193,16 +203,14 @@ -
-
- +
+
-
00:00
-
+
00:00