diff --git a/.gitignore b/.gitignore index 5cee57c..9b164f6 100644 --- a/.gitignore +++ b/.gitignore @@ -65,4 +65,5 @@ typings/ config.js tmp/*.png public/assets/ -data/localtest/ +data/bundles/* +!data/bundles/default/ diff --git a/data/default/backgrounds/bg.jpg b/data/backgrounds/bg.jpg similarity index 100% rename from data/default/backgrounds/bg.jpg rename to data/backgrounds/bg.jpg diff --git a/data/backgrounds/talvi.jpg b/data/backgrounds/talvi.jpg new file mode 100644 index 0000000..7d808c3 Binary files /dev/null and b/data/backgrounds/talvi.jpg differ diff --git a/data/default/bundle.json b/data/bundles/default/bundle.json similarity index 100% rename from data/default/bundle.json rename to data/bundles/default/bundle.json diff --git a/data/default/images/.gitkeep b/data/bundles/default/images/.gitkeep similarity index 100% rename from data/default/images/.gitkeep rename to data/bundles/default/images/.gitkeep diff --git a/data/default/render/03191688-bb93-4376-a3ab-53ed790b2155.png b/data/bundles/default/render/03191688-bb93-4376-a3ab-53ed790b2155.png similarity index 100% rename from data/default/render/03191688-bb93-4376-a3ab-53ed790b2155.png rename to data/bundles/default/render/03191688-bb93-4376-a3ab-53ed790b2155.png diff --git a/data/default/render/39e5205f-9ace-4597-9873-f9ea5846dff0.png b/data/bundles/default/render/39e5205f-9ace-4597-9873-f9ea5846dff0.png similarity index 100% rename from data/default/render/39e5205f-9ace-4597-9873-f9ea5846dff0.png rename to data/bundles/default/render/39e5205f-9ace-4597-9873-f9ea5846dff0.png diff --git a/data/default/render/6a298b8c-9246-411f-b364-2d73c7e292d0.png b/data/bundles/default/render/6a298b8c-9246-411f-b364-2d73c7e292d0.png similarity index 100% rename from data/default/render/6a298b8c-9246-411f-b364-2d73c7e292d0.png rename to data/bundles/default/render/6a298b8c-9246-411f-b364-2d73c7e292d0.png diff --git a/data/default/render/f0411f05-a312-44a7-82fd-778328ba390e.png b/data/bundles/default/render/f0411f05-a312-44a7-82fd-778328ba390e.png similarity index 100% rename from data/default/render/f0411f05-a312-44a7-82fd-778328ba390e.png rename to data/bundles/default/render/f0411f05-a312-44a7-82fd-778328ba390e.png diff --git a/data/default/slides.json b/data/bundles/default/slides.json similarity index 97% rename from data/default/slides.json rename to data/bundles/default/slides.json index 34d7b40..f6e50e8 100644 --- a/data/default/slides.json +++ b/data/bundles/default/slides.json @@ -12,7 +12,7 @@ { "uuid": "03191688-bb93-4376-a3ab-53ed790b2155", "name": "2 header", - "duration": 10, + "duration": null, "enabled": true, "displayTime": null, "type": "slide", diff --git a/data/default/slides/03191688-bb93-4376-a3ab-53ed790b2155 b/data/bundles/default/slides/03191688-bb93-4376-a3ab-53ed790b2155 similarity index 100% rename from data/default/slides/03191688-bb93-4376-a3ab-53ed790b2155 rename to data/bundles/default/slides/03191688-bb93-4376-a3ab-53ed790b2155 diff --git a/data/default/slides/39e5205f-9ace-4597-9873-f9ea5846dff0 b/data/bundles/default/slides/39e5205f-9ace-4597-9873-f9ea5846dff0 similarity index 100% rename from data/default/slides/39e5205f-9ace-4597-9873-f9ea5846dff0 rename to data/bundles/default/slides/39e5205f-9ace-4597-9873-f9ea5846dff0 diff --git a/data/default/slides/6a298b8c-9246-411f-b364-2d73c7e292d0 b/data/bundles/default/slides/6a298b8c-9246-411f-b364-2d73c7e292d0 similarity index 100% rename from data/default/slides/6a298b8c-9246-411f-b364-2d73c7e292d0 rename to data/bundles/default/slides/6a298b8c-9246-411f-b364-2d73c7e292d0 diff --git a/data/default/slides/f0411f05-a312-44a7-82fd-778328ba390e b/data/bundles/default/slides/f0411f05-a312-44a7-82fd-778328ba390e similarity index 100% rename from data/default/slides/f0411f05-a312-44a7-82fd-778328ba390e rename to data/bundles/default/slides/f0411f05-a312-44a7-82fd-778328ba390e diff --git a/data/set1/backgrounds/bg.jpg b/data/set1/backgrounds/bg.jpg deleted file mode 100644 index f3cc047..0000000 Binary files a/data/set1/backgrounds/bg.jpg and /dev/null differ diff --git a/data/set1/bundle.json b/data/set1/bundle.json deleted file mode 100644 index 49aa4b3..0000000 --- a/data/set1/bundle.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "displayName": "set1", - "background": "bg.jpg", - "displayTime": true, - "useWebFonts": false, - "duration": 20, - "styleHeader": { - "fill": "#f90", - "fontSize": "56", - "fontWeight": 900, - "fontFamily": "Arial Black", - "stroke": "" - }, - "styleText": { - "fill": "#fff", - "fontFamily": "Arial Black", - "fontSize": "42", - "fontWeight": 900, - "stroke": "" - }, - "transition": "blocks2" -} \ No newline at end of file diff --git a/data/set1/images/.gitkeep b/data/set1/images/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/data/set1/render/21f0451b-52ca-4da2-bdbb-dce3b8092c3e.png b/data/set1/render/21f0451b-52ca-4da2-bdbb-dce3b8092c3e.png deleted file mode 100644 index cd41054..0000000 Binary files a/data/set1/render/21f0451b-52ca-4da2-bdbb-dce3b8092c3e.png and /dev/null differ diff --git a/data/set1/render/5bad8eb1-b377-43b8-82c3-c7f16043f8f1.png b/data/set1/render/5bad8eb1-b377-43b8-82c3-c7f16043f8f1.png deleted file mode 100644 index 982b8a4..0000000 Binary files a/data/set1/render/5bad8eb1-b377-43b8-82c3-c7f16043f8f1.png and /dev/null differ diff --git a/data/set1/render/cfc55645-fd10-4f4d-b6f0-3dd34b68192e.png b/data/set1/render/cfc55645-fd10-4f4d-b6f0-3dd34b68192e.png deleted file mode 100644 index 52c9fd0..0000000 Binary files a/data/set1/render/cfc55645-fd10-4f4d-b6f0-3dd34b68192e.png and /dev/null differ diff --git a/data/set1/slides.json b/data/set1/slides.json deleted file mode 100644 index e1f8cc8..0000000 --- a/data/set1/slides.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "uuid": "cfc55645-fd10-4f4d-b6f0-3dd34b68192e", - "name": "bundle2", - "duration": null, - "transition": null, - "enabled": true, - "displayTime": true, - "type": "slide", - "index": 0 - }, - { - "uuid": "21f0451b-52ca-4da2-bdbb-dce3b8092c3e", - "name": "dia 3", - "duration": null, - "enabled": true, - "transition": null, - "displayTime": true, - "type": "slide", - "index": 1 - }, - { - "uuid": "5bad8eb1-b377-43b8-82c3-c7f16043f8f1", - "name": "header", - "duration": null, - "enabled": true, - "displayTime": false, - "type": "slide", - "index": 2, - "transition": "" - } -] \ No newline at end of file diff --git a/data/set1/slides/21f0451b-52ca-4da2-bdbb-dce3b8092c3e b/data/set1/slides/21f0451b-52ca-4da2-bdbb-dce3b8092c3e deleted file mode 100644 index 67bb21f..0000000 --- a/data/set1/slides/21f0451b-52ca-4da2-bdbb-dce3b8092c3e +++ /dev/null @@ -1 +0,0 @@ -{"version":"2.4.0","objects":[{"type":"i-text","version":"2.4.0","left":150,"top":40,"width":149.38,"height":63.28,"fill":"#f90","shadow":{"color":"rgba(0,0,0,0.8)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"dia 3","fontSize":56,"fontWeight":900,"fontFamily":"Arial Black","id":"header","styles":{}},{"type":"i-text","version":"2.4.0","left":250,"top":113.28,"width":342.89,"height":47.46,"fill":"#fff","shadow":{"color":"rgba(0,0,0,0.8)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"paragraph text","fontSize":42,"fontWeight":900,"fontFamily":"Arial Black","id":"normal","styles":{}},{"type":"i-text","version":"2.4.0","left":250,"top":170.74,"width":342.89,"height":47.46,"fill":"#fff","shadow":{"color":"rgba(0,0,0,0.8)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"paragraph text","fontSize":42,"fontWeight":900,"fontFamily":"Arial Black","id":"normal","styles":{}}]} \ No newline at end of file diff --git a/data/set1/slides/5bad8eb1-b377-43b8-82c3-c7f16043f8f1 b/data/set1/slides/5bad8eb1-b377-43b8-82c3-c7f16043f8f1 deleted file mode 100644 index 1579c43..0000000 --- a/data/set1/slides/5bad8eb1-b377-43b8-82c3-c7f16043f8f1 +++ /dev/null @@ -1 +0,0 @@ -{"version":"2.6.0","objects":[{"type":"i-text","version":"2.6.0","left":250,"top":40,"width":269.47,"height":47.46,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.8)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"paragraph text","fontSize":"42","fontWeight":900,"fontFamily":"Arial Black","id":"normal","styles":{}},{"type":"i-text","version":"2.6.0","left":250,"top":97.46,"width":269.47,"height":47.46,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.8)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"paragraph text","fontSize":"42","fontWeight":900,"fontFamily":"Arial Black","id":"normal","styles":{}},{"type":"i-text","version":"2.6.0","left":150,"top":154.92,"width":164.85,"height":63.28,"fill":"#f90","stroke":"","shadow":{"color":"rgba(0,0,0,0.8)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"header","fontSize":"56","fontWeight":900,"fontFamily":"Arial Black","id":"header","styles":{}}]} \ No newline at end of file diff --git a/data/set1/slides/cfc55645-fd10-4f4d-b6f0-3dd34b68192e b/data/set1/slides/cfc55645-fd10-4f4d-b6f0-3dd34b68192e deleted file mode 100644 index 31ed41c..0000000 --- a/data/set1/slides/cfc55645-fd10-4f4d-b6f0-3dd34b68192e +++ /dev/null @@ -1 +0,0 @@ -{"version":"2.4.0","objects":[{"type":"i-text","version":"2.4.0","left":150,"top":36,"width":242.76,"height":63.28,"fill":"#f90","shadow":{"color":"rgba(0,0,0,0.8)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"bundle2","fontSize":56,"fontWeight":900,"fontFamily":"Arial Black","styles":{}},{"type":"i-text","version":"2.4.0","left":250,"top":113.28,"width":342.89,"height":47.46,"fill":"#fff","shadow":{"color":"rgba(0,0,0,0.8)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"paragraph text","fontSize":42,"fontWeight":900,"fontFamily":"Arial Black","styles":{}}]} \ No newline at end of file diff --git a/modules/admin.js b/modules/admin.js index be902e3..a519604 100644 --- a/modules/admin.js +++ b/modules/admin.js @@ -1,33 +1,31 @@ let fs = require("fs"); -let config = require("../config.js"); -let cli = require('./cli.js'); +let config = require(`../config.js`); +let cli = require(`./cli.js`); /** - * @module infoscreen3/admin - * @class + * */ class admin { /** - * * @param sharedIO * @param dispatcher - * @param screenViews + * @param screenView + * @param displayId * @param bundleManager */ - constructor(sharedIO, dispatcher, screenViews, bundleManager) { - cli.info("Starting admin socket interface"); - + constructor(sharedIO, dispatcher, screenView, displayId, bundleManager) { /** - * @typedef {object} previewInstance + * @typedef {string[]} previewInstance * @property {string} adminId is string from admin socket.Id * @property {object} preview, pure previews socket * - * @type {previewInstance[]} + * @type {object} */ let previewInstances = []; - let io = sharedIO.of("/admin"); + let io = sharedIO.of("/admin-" + displayId); this.io = io; + this.displayId = displayId; this.dispatcher = dispatcher; this.bundleManager = bundleManager; @@ -94,31 +92,31 @@ class admin { // toggle time socket.on('controls.time.toggle', function (data) { - let view = getView(data.displayId); + let view = getView(); let bool = !view.serverOptions.displayTime; view.getBundle().bundleData.displayTime = bool; view.serverOptions.displayTime = bool; view.io.emit("callback.time", bool); - updateDashboard(io, data.displayId); + updateDashboard(io); }); socket.on('controls.previous', function (data) { - let view = getView(data.displayId); + let view = getView(); view.serverOptions.loopIndex -= 2; view.mainLoop(); }); socket.on('controls.play', function (data) { - getServerOptions(data.displayId).loop = true; - getView(data.displayId).mainLoop(); - updateDashboard(io, data.displayId); + getServerOptions().loop = true; + getView().mainLoop(); + updateDashboard(io); }); socket.on('controls.startStream', function (data) { - let view = getView(data.displayId); - let serverOptions = getServerOptions(data.displayId); + let view = getView(); + let serverOptions = getServerOptions(); if (serverOptions.isStreaming === false) { serverOptions.loop = false; @@ -133,27 +131,27 @@ class admin { cli.success("stop stream"); } view.io.emit("callbackLoad", view.getSlideData()); - updateDashboard(io, data.displayId); + updateDashboard(io); }); socket.on('controls.pause', function (data) { - let view = getView(data.displayId); + let view = getView(); view.clearTimers(); - getServerOptions(data.displayId).loop = false; - updateDashboard(io, data.displayId); + getServerOptions().loop = false; + updateDashboard(io); }); socket.on('controls.next', function (data) { - getView(data.displayId).mainLoop(); + getView().mainLoop(); }); socket.on('controls.blackout', function (data) { - let view = getView(data.displayId); + let view = getView(); view.serverOptions.blackout = view.serverOptions.blackout === false; view.io.emit("callback.blackout", {serverOptions: view.serverOptions}); - updateDashboard(io, data.displayId); + updateDashboard(io); }); socket.on("controls.preview", function (data) { @@ -179,19 +177,19 @@ class admin { }); socket.on("controls.skipTo", function (data) { - let bundleSettings = getView(data.displayId).getBundle(); + let bundleSettings = getView().getBundle(); let slides = bundleSettings.enabledSlides; let idx = slides.indexOf(data.fileName); if (idx >= 0) { - getServerOptions(data.displayId).loopIndex = idx; + getServerOptions().loopIndex = idx; } - getView(data.displayId).mainLoop(); + getView().mainLoop(); }); socket.on('controls.toggle', function (data) { let fileName = data.fileName; - let bundleSettings = getView(data.displayId).getBundle(); + let bundleSettings = getView().getBundle(); let idx = bundleSettings.disabledSlides.indexOf(fileName); if (idx > -1) { @@ -200,7 +198,7 @@ class admin { bundleSettings.setSlideStatus(fileName, false); } - updateDashboard(socket, data.displayId); + updateDashboard(socket); }); // override @@ -212,7 +210,7 @@ class admin { } dispatcher.emit("all.override", data); } else { - let view = getView(parseInt(data.displayId)); + let view = getView(); view.overrideSlide(data.json, data.png, data.duration); view.displayCurrentSlide(); } @@ -222,28 +220,23 @@ class admin { }); socket.on('admin.setBundle', function (data) { - let view = getView(data.displayId); + let view = getView(); view.changeBundle(data.bundle); view.displayCurrentSlide(); - updateDashboard(io, data.displayId); + updateDashboard(io); }); - socket.on('admin.dashboard.sync', function (data) { - syncDashboard(socket, data.displayId); - updateDashboard(socket, data.displayId); - }); - - socket.on('admin.setDisplay', function (data) { - syncDashboard(socket, data.display); - updateDashboard(socket, data.display); + socket.on('admin.dashboard.sync', function () { + syncDashboard(socket); + updateDashboard(socket); }); socket.on('admin.listSlides', function (data) { - updateDashboard(socket, data.displayId); + updateDashboard(socket); }); socket.on('admin.listBundles', function (data) { - updateDashboard(socket, data.displayId); + updateDashboard(socket); }); @@ -257,7 +250,7 @@ class admin { } // calculate next slide order for all displays which has the bundle selected - for (let display of screenViews) { + for (let display of screenView) { if (display.serverOptions.currentBundle === data.bundleName) { for (let slide of bundle.allSlides) { // calculate new index for next slide; @@ -288,24 +281,23 @@ class admin { cli.info("@ create Bundle"); try { - if (!fs.existsSync("data/" + data.dir)) { - fs.mkdirSync("data/" + data.dir); - fs.mkdirSync("data/" + data.dir + "/backgrounds"); - fs.mkdirSync("data/" + data.dir + "/images"); - fs.mkdirSync("data/" + data.dir + "/render"); - fs.mkdirSync("data/" + data.dir + "/slides"); + if (!fs.existsSync("data/bundles" + data.dir)) { + fs.mkdirSync("data/bundles/" + data.dir); + fs.mkdirSync("data/bundles/" + data.dir + "/images"); + fs.mkdirSync("data/bundles/" + data.dir + "/render"); + fs.mkdirSync("data/bundles/" + data.dir + "/slides"); - var tempData = JSON.parse(fs.readFileSync("templates/bundle/bundle.json").toString()); + let tempData = JSON.parse(fs.readFileSync("templates/bundle/bundle.json").toString()); tempData.displayName = data.bundle; - fs.writeFileSync("data/" + data.dir + "/bundle.json", JSON.stringify(tempData)); + fs.writeFileSync("data/bundles/" + data.dir + "/bundle.json", JSON.stringify(tempData)); - fs.copyFileSync("templates/bundle/slides.json", "data/" + data.dir + "/slides.json"); - fs.copyFileSync("templates/bundle/backgrounds/bg.jpg", "data/" + data.dir + "/backgrounds/bg.jpg"); + fs.copyFileSync("templates/bundle/slides.json", "data/bundles/" + data.dir + "/slides.json"); + fs.copyFileSync("templates/bundle/backgrounds/bg.jpg", "data/bundles/" + data.dir + "/backgrounds/bg.jpg"); bundleManager.getBundle(data.dir); - syncDashboard(io, data.displayId); + syncDashboard(io); } else { socket.emit("callback.error", "Error: bundle already exists."); - syncDashboard(io, data.displayId); + syncDashboard(io); } } catch (err) { cli.error(err, "Error while creating new bundle"); @@ -333,7 +325,6 @@ class admin { filename = uuidv4(); } - var duration = null; if (data.duration === "") { data.duration = null; } @@ -405,13 +396,13 @@ class admin { /** change transition **/ socket.on('admin.setTransition', function (data) { - var transition = data.transition; + let transition = data.transition; if (data.transition === "null") { transition = null; } - getServerOptions(data.displayId).transition = transition; - updateDashboard(io, data.displayId); + getServerOptions().transition = transition; + updateDashboard(io); }); socket.on('edit.save', function (data) { @@ -421,20 +412,20 @@ class admin { filename = uuidv4(); } - var duration = data.duration; - if (data.duration == "") { + let duration = data.duration; + if (data.duration === "") { duration = null; } - var transition = data.transition; - if (data.transition == "") { + let transition = data.transition; + if (data.transition === "") { transition = null; } try { - fs.writeFileSync("./data/" + data.bundleName + "/render/" + filename + ".png", data.png.replace(/^data:image\/png;base64,/, ""), "base64"); - fs.writeFileSync("./data/" + data.bundleName + "/slides/" + filename, JSON.stringify(data.json)); + fs.writeFileSync("./data/bundles/" + data.bundleName + "/render/" + filename + ".png", data.png.replace(/^data:image\/png;base64,/, ""), "base64"); + fs.writeFileSync("./data/bundles/" + data.bundleName + "/slides/" + filename, JSON.stringify(data.json)); let bundle = self.bundleManager.getBundle(data.bundleName); @@ -488,7 +479,7 @@ class admin { let replace = "^data:" + data.type + ";base64,"; let re = new RegExp(replace, "g"); - fs.writeFileSync("./data/" + data.bundleName + "/images/" + filename + ext, data.imageData.replace(re, ""), "base64"); + fs.writeFileSync(".data/bundles/" + data.bundleName + "/images/" + filename + ext, data.imageData.replace(re, ""), "base64"); cli.success("upload of " + filename + ext); socket.emit("callback.edit.updateFileList", {}); } catch (err) { @@ -500,7 +491,7 @@ class admin { socket.on('edit.deleteImage', function (data) { try { - fs.unlinkSync("./data/" + data.bundleName + "/images/" + data.name); + fs.unlinkSync(".data/bundles/" + data.bundleName + "/images/" + data.name); cli.success("delete " + data.name); socket.emit("callback.edit.updateFileList", {}); } catch (err) { @@ -516,12 +507,9 @@ class admin { /** * @param {object} socket - * @param {number|string} displayId */ - function updateDashboard(socket, displayId) { - displayId = parseInt(displayId); - - let view = getView(displayId); + function updateDashboard(socket) { + let view = getView(); let serverOptions = view.serverOptions; let bundleSettings = view.getBundle(); @@ -540,11 +528,9 @@ class admin { }); } - function syncDashboard(socket, displayId) { - displayId = parseInt(displayId); - + function syncDashboard(socket) { previewInstances.push({adminId: socket.id, preview: {}, currentView: {}}); - let serverOptions = getView(displayId).serverOptions; + let serverOptions = getView().serverOptions; let bundleDirs = self.bundleManager.getBundleInfos(); @@ -582,27 +568,24 @@ class admin { } /** - * @param {number} displayId + * @return infoscreen3/display.serverOptions */ - function getServerOptions(displayId) { - return getView(displayId).serverOptions; + function getServerOptions() { + return getView().serverOptions; } /** - * - * @param displayId + * @return display */ - function getView(displayId) { - try { - return screenViews[parseInt(displayId)]; - } catch (err) { - throw "display not found"; - } + function getView() { + return screenView; } } } // admin - +/** + * @type {admin} + */ module.exports = admin; \ No newline at end of file diff --git a/modules/auth.js b/modules/auth.js deleted file mode 100644 index e69de29..0000000 diff --git a/modules/bundle.js b/modules/bundle.js index 9616e6a..765d92b 100644 --- a/modules/bundle.js +++ b/modules/bundle.js @@ -2,14 +2,14 @@ let cli = require("./cli.js"); let fs = require("fs"); /** - * + * @module infoscreen3/bundle */ class bundleClass { constructor(name, data, slides) { this.name = name; this.bundleData = data; - this.bundleData['bundleName']= this.name; + this.bundleData['bundleName'] = this.name; this.allSlides = slides; this.enabledSlides = []; this.disabledSlides = []; @@ -28,7 +28,7 @@ class bundleClass { getSlideJsonFile(fileName) { try { - return fs.readFileSync("./data/" + this.name + "/slides/" + fileName).toString(); + return fs.readFileSync("./data/bundles/" + this.name + "/slides/" + fileName).toString(); } catch (err) { return "{}"; } @@ -56,7 +56,7 @@ class bundleClass { } if (slide.uuid === uuid) { if (slide.type === "slide") { - let path = "./data/" + this.name; + let path = "./data/bundles/" + this.name; try { if (fs.existsSync(path + "/render/" + uuid + ".png")) { fs.unlinkSync(path + "/render/" + uuid + ".png"); @@ -127,8 +127,8 @@ class bundleClass { save() { this.sync(); try { - fs.writeFileSync("./data/" + this.name + "/slides.json", this.toJson()); - fs.writeFileSync("./data/" + this.name + "/bundle.json", JSON.stringify(this.bundleData, null, "\t")); + fs.writeFileSync("./data/bundles/" + this.name + "/slides.json", this.toJson()); + fs.writeFileSync("./data/bundles/" + this.name + "/bundle.json", JSON.stringify(this.bundleData, null, "\t")); } catch (e) { cli.error("error while saving file:", e); } @@ -162,4 +162,8 @@ function sortByProperty(property) { } } +/** + * + * @type {bundleClass} + */ module.exports = bundleClass; \ No newline at end of file diff --git a/modules/bundleManager.js b/modules/bundleManager.js index 9348177..a767309 100644 --- a/modules/bundleManager.js +++ b/modules/bundleManager.js @@ -1,8 +1,8 @@ "use strict"; -const bundle = require('./bundle.js'); +const bundle = require(`./bundle.js`); let fs = require("fs"); -let cli = require("./cli.js"); +let cli = require(`./cli.js`); /** * @module infoscreen3/bundleManager @@ -18,12 +18,12 @@ class bundleManager { */ syncBundles() { this.bundles = {}; - let dirs = getDirectories("./data"); + let dirs = getDirectories("./data/bundles/"); dirs.sort(); for (let name of dirs) { - let data = getJson("./data/" + name + "/bundle.json"); - let slides = getJson("./data/" + name + "/slides.json"); + let data = getJson("./data/bundles/" + name + "/bundle.json"); + let slides = getJson("./data/bundles/" + name + "/slides.json"); this.bundles[name] = new bundle(name, data, slides); } @@ -40,8 +40,8 @@ class bundleManager { } else { try { cli.info(name + " not in bundles, trying to load from fs..."); - let data = getJson("./data/" + name + "/bundle.json"); - let slides = getJson("./data/" + name + "/slides.json"); + let data = getJson("./data/bundles/" + name + "/bundle.json"); + let slides = getJson("./data/bundles/" + name + "/slides.json"); this.bundles[name] = new bundle(name, data, slides); cli.success(name + " load"); return this.bundles[name]; @@ -81,7 +81,7 @@ function getDirectories(path) { /** * helper function to load and parse json to array * @param file - * @return {any} + * @return {object} */ function getJson(file) { return JSON.parse(fs.readFileSync(file).toString()); diff --git a/modules/display.js b/modules/display.js index b97cd5e..1d8aee9 100644 --- a/modules/display.js +++ b/modules/display.js @@ -1,11 +1,10 @@ let fs = require("fs"); let path = require("path"); -let cli = require("./cli.js"); -let bundleManager = require('./bundleManager.js'); +let cli = require(`./cli.js`); +let bundleManager = require(`./bundleManager.js`); /** * handles one display instance - * @module infoscreen/display */ class display { @@ -14,13 +13,17 @@ class display { * @param {object} dispatcher - dispatcher * @param {object} meta - reads from config.displays * @param {number} displayId - this display instances id - * @param {object} bundleManager + * @param {module:infoscreen3/bundleManager} bundleManager */ constructor(sharedIO, dispatcher, meta, displayId, bundleManager) { cli.info("Starting display with id " + displayId + " ..."); /** @property {Array} timeoutId - holds setTimeout id's for mainLoop */ this.timeoutId = []; + + /** + * @type {bundleManager|module:infoscreen3/bundleManager} + */ this.bundleManager = bundleManager; let self = this; @@ -154,7 +157,7 @@ class display { } /** - * @returns {bundle} + * @return {bundle} */ getBundle() { return this.bundleManager.getBundle(this.serverOptions.currentBundle); @@ -244,5 +247,7 @@ class display { } } -/** @exports display */ +/** + * @type {display} + */ module.exports = display; \ No newline at end of file diff --git a/modules/websocket.js b/modules/websocket.js index 35a60f0..c86ce10 100644 --- a/modules/websocket.js +++ b/modules/websocket.js @@ -1,19 +1,24 @@ -let availableDisplays = require("../config.js").displays; -let display = require("./display.js"); -let admin = require("./admin.js"); -let cli = require('./cli.js'); -let _bundleManager = require('./bundleManager.js'); +let availableDisplays = require(`../config.js`).displays; +let display = require(`./display.js`); +let admin = require(`./admin.js`); +let cli = require(`./cli.js`); +let _bundleManager = require(`./bundleManager.js`); let chalk = require('chalk'); let fs = require('fs'); /** - * * @type {display[]} */ let screenView = []; +/** @type {admin[]} */ +let adminView = []; /** - * @exports websocket + * @param server + * @param app + * @param io + * @param dispatcher + * @return {{screenView: display[], adminView: admin[], bundleManager: bundleManager}} */ module.exports = function (server, app, io, dispatcher) { console.log(chalk.green(">> ") + "InfoScreen3" + chalk.green("<<")); @@ -50,15 +55,17 @@ module.exports = function (server, app, io, dispatcher) { let bundleManager = new _bundleManager(); - cli.info("Starting websocket backends..."); + cli.info("Starting websocket backend..."); let screenId = 0; + for (let metadata of availableDisplays) { - screenView.push(new display(io, dispatcher, metadata, screenId, bundleManager)); + let view = new display(io, dispatcher, metadata, screenId, bundleManager); + screenView.push(view); + adminView.push(new admin(io, dispatcher, view, screenId, bundleManager)); screenId += 1; } - let adminView = new admin(io, dispatcher, screenView, bundleManager); io.of("/lobby").on("connection", function (socket) { cli.info("WS/" + socket.conn.remoteAddress + " connect"); diff --git a/public/js/dashboard.js b/public/js/dashboard.js index 799a404..51477e4 100644 --- a/public/js/dashboard.js +++ b/public/js/dashboard.js @@ -5,9 +5,7 @@ var displayList; socket.on('connect', function () { - emit("admin.setDisplay", {display: displayId}); - var program = document.getElementById('program'); - program.src = "/display/" + displayId; + emit("admin.dashboard.sync"); }); socket.on("callback.update", function (data) { @@ -67,9 +65,7 @@ socket.on("callback.dashboard.sync", function (data) { .dropdown("hide"); displayId = parseInt(value); - emit("admin.setDisplay", {display: value}); - var program = document.getElementById('program'); - program.src = "/display/" + value; + document.location = "/admin/display/" + displayId; } }).dropdown("set selected", displayId); diff --git a/public/js/display.js b/public/js/display.js index b529cbe..5897545 100644 --- a/public/js/display.js +++ b/public/js/display.js @@ -262,7 +262,7 @@ function nextSlide(data) { } function setBackground(background) { - background = "/background/" + bundleData.bundleName + "/" + background; + background = "/background/" + background; if (serverOptions.isStreaming) return; var video = document.getElementById("bgvid"); diff --git a/public/js/displayLite.js b/public/js/displayLite.js index def0551..ce90802 100644 --- a/public/js/displayLite.js +++ b/public/js/displayLite.js @@ -206,7 +206,7 @@ function nextSlide(data) { function setBackground(background) { - background = "/background/" + bundleData.bundleName + "/" + background; + background = "/background/" + background; if (serverOptions.isStreaming) return; var video = document.getElementById("bgvid"); diff --git a/routes/admin.js b/routes/admin.js index 6061ee0..6f3ade5 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -6,10 +6,15 @@ let path = require('path'); let config = require("../config.js"); let busboy = require("connect-busboy"); +function getFiles(path) { + return fs.readdirSync(path).filter(function (file) { + return fs.statSync(path + '/' + file).isFile(); + }); +} + function ensureIsAdmin(req, res, next) { if (!req.isAuthenticated || !req.isAuthenticated()) { - console.log(req.originalUrl); req.session.location = req.originalUrl; return res.redirect("/login"); } else { @@ -28,8 +33,7 @@ module.exports = function (websocket, dispatcher) { router.use(busboy({immediate: true})); router.get('/', function (req, res, next) { - let displayId = req.query['displayId'] || 0; - res.render('admin/dashboard', {config: config, displayId: displayId, permission: req.user.permissions}); + res.render('admin/overview', {config: config}); }); router.get('/preview', function (req, res, next) { @@ -38,8 +42,9 @@ module.exports = function (websocket, dispatcher) { res.render('preview', {config: config, socketId: socketId, displayId: displayId}); }); - router.get('/overview', function (req, res, next) { - res.render('admin/overview', {config: config}); + router.get('/display/:id', function (req, res, next) { + let displayId = parseInt(req.params.id) || 0; + res.render('admin/dashboard', {config: config, displayId: displayId, permission: req.user.permissions}); }); router.get('/edit/slide', function (req, res, next) { @@ -106,7 +111,15 @@ module.exports = function (websocket, dispatcher) { cli.error("error loading bundle", err); } - res.render('admin/editBundleProperties', {config: config, bundle: bundle, bundleData: bundleData}); + let bundleRoot = path.normalize("./data/bundles/" + bundle); + let backgroundImages = getFiles("./data/backgrounds/"); + + res.render('admin/editBundleProperties', { + config: config, + bundle: bundle, + bundleData: bundleData, + backgroundImages: backgroundImages + }); }); router.get('/edit/link', function (req, res, next) { @@ -130,7 +143,7 @@ module.exports = function (websocket, dispatcher) { router.get('/ajax/imagelist', function (req, res, next) { let bundle = req.query['bundle']; - let bundleRoot = path.normalize("./data/" + bundle); + let bundleRoot = path.normalize("./data/bundles" + bundle); let bundleImages = fs.readdirSync(bundleRoot + "/images", { dotfiles: false }); diff --git a/routes/index.js b/routes/index.js index bde1ba8..c863662 100644 --- a/routes/index.js +++ b/routes/index.js @@ -49,7 +49,7 @@ module.exports = function (websocket, dispatcher) { router.get('/images/:dir/:name', function (req, res, next) { let options = { - root: './data/' + req.params.dir + '/images/', + root: './data/bundles/' + req.params.dir + '/images/', dotfiles: 'deny', headers: { 'x-timestamp': Date.now(), @@ -67,7 +67,7 @@ module.exports = function (websocket, dispatcher) { router.get('/render/:dir/:name', function (req, res, next) { let options = { - root: './data/' + req.params.dir + '/render/', + root: './data/bundles/' + req.params.dir + '/render/', dotfiles: 'deny', headers: { 'x-timestamp': Date.now(), @@ -101,9 +101,9 @@ module.exports = function (websocket, dispatcher) { }); }); - router.get('/background/:dir/:name', function (req, res, next) { + router.get('/background/:name', function (req, res, next) { let options = { - root: './data/' + req.params.dir + '/backgrounds/', + root: './data/backgrounds/', dotfiles: 'deny', headers: { 'x-timestamp': Date.now(), diff --git a/views/admin/dashboard.twig b/views/admin/dashboard.twig index 4af13fa..9528566 100644 --- a/views/admin/dashboard.twig +++ b/views/admin/dashboard.twig @@ -13,9 +13,9 @@ {% block body %}