diff --git a/lib/desktop_updater.js b/lib/desktop_updater.js index 45d4a6b7f130251f30a1e3d2299f9763b5f1c051..ae8652ecc947ffd1beea827c59d18902544700e8 100644 --- a/lib/desktop_updater.js +++ b/lib/desktop_updater.js @@ -1,9 +1,58 @@ const ipcRendererUpdateWeb = require('electron').ipcRenderer; console.log(process.versions) + +var isrequestedCheckForUpdate037 = false; ipcRendererUpdateWeb.on('update', function (event, message) { - var msgJSON = JSON.parse(message); console.log(message); + var msgJSON = JSON.parse(message); console.log('[DTU] update event ',message); // // message = {key:'',text:''}; + if (process.env.currentVersion && process.env.currentVersion === '0.3.7') { + console.log('[DTU] update for v0.3.7') + if (msgJSON.message === "Please check update first" && !isrequestedCheckForUpdate037) { + console.log('[DTU] update for v0.3.7', msgJSON.message) + isrequestedCheckForUpdate037 = true; + ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify({ + "type": "action", "payload": { + "AU_ACTION": "check-for-updates", + "AU_AUTO_DOWNLOAD": false, + "AU_AUTO_RESTART": true, + } + })); + } else if (msgJSON.status === 200 && isrequestedCheckForUpdate037) { + console.log('[DTU] update for v0.3.7', 'startDownload') + startDownloading() + } + } else { + + ipcRendererOnUpdateEvent(msgJSON); + } +}) + +function ipcRendererOnUpdateEvent(msgJSON) { + switch (msgJSON.key) { + case 'update-check-menu': + //Update UI button or text + document.getElementById('update-info').style = (msgJSON.upgrade ? '' : (msgJSON.version !== '' ? 'display: none;' : 'display: none;')); + document.getElementById('update-info').innerHTML = (msgJSON.upgrade ? 'Update Available' : (msgJSON.version !== '' ? '' : '')); + document.getElementById('update_latest_version').innerHTML = (msgJSON.upgrade ? 'A new release is available (' + msgJSON.version + ').' : (msgJSON.version !== '' ? 'You are using latest version of Nynja.' : 'Encountered an error while updating, try again later.')); + document.getElementById('update_current_version').innerHTML = 'version ' + msgJSON.currentVersion; + + document.getElementById('update_version_electron').innerHTML = (msgJSON.electron === undefined ? process.versions.electron : msgJSON.electron); + document.getElementById('update_version_chromium').innerHTML = (msgJSON.chromium === undefined ? process.versions.chrome : msgJSON.chromium); + document.getElementById('update_version_nodejs').innerHTML = (msgJSON.nodejs === undefined ? process.versions.node : msgJSON.chromium); + + document.getElementById('update-desc-box').style = 'display: none;'; + // document.getElementById('update-info').style = 'display: none;'; + document.getElementById('update-conf-box').style = 'display: none;'; + document.getElementById('update-conf-yes').style = 'display: none;'; + document.getElementById('update-notify-box').style = 'display: none;'; + + //Handle event + // // document.getElementById('update-info').removeEventListener('click'); + document.getElementById("update-info").addEventListener("click", function () { updateInfoClick(msgJSON) }, false); + document.getElementById("update_version_notes").addEventListener("click", updateVersionNotesClick) + updateInfoClick(msgJSON); + break; case 'update-check': //Update UI button or text @@ -18,40 +67,128 @@ ipcRendererUpdateWeb.on('update', function (event, message) { document.getElementById('update_version_chromium').innerHTML = (msgJSON.chromium === undefined ? process.versions.chrome : msgJSON.chromium); document.getElementById('update_version_nodejs').innerHTML = (msgJSON.nodejs === undefined ? process.versions.node : msgJSON.chromium); - //Handle event - // // document.getElementById('update-info').removeEventListener('click'); - document.getElementById("update-info").addEventListener("click", function () {//alert(1); - //show modal popup - document.getElementById('update-desc-box').style = ''; - if (msgJSON.upgrade) { - // document.getElementById('update-install').removeEventListener('click'); - document.getElementById('update_download_install').style = ''; - document.getElementById('update_download_install').addEventListener("click", startDownloading) + document.getElementById('update-desc-box').style = 'display: none;'; + // document.getElementById('update-info').style = 'display: none;'; + document.getElementById('update-conf-box').style = 'display: none;'; + document.getElementById('update-conf-yes').style = 'display: none;'; + document.getElementById('update-notify-box').style = 'display: none;'; - } - }); + //Handle event + // // document.getElementById('update-info').removeEventListener('click'); + document.getElementById("update-info").addEventListener("click", function () { updateInfoClick(msgJSON) }, false); + document.getElementById("update_version_notes").addEventListener("click", updateVersionNotesClick) break; default: + break; } -}) + + fetch(window.location.origin + '/lib/releaseNotes/releaseNotesDesktop.json', { + cache: 'no-store', + headers: { + 'Cache-Control': 'no-store', + 'Pragma': 'no-cache', + }, + }) + .then(function (res) { + // console.log('[DTU]',res); + // console.log('[DTU]',res.text()); + return res.clone().json(); + }) + .then(function (data) { + console.log('[DTU]', data); + + var releaseNotes = data; + + document.getElementById('releases_info').innerHTML = ''; + + Object.keys(releaseNotes).map(function (releaseNote, i) { + var SPAN_NODE = document.createElement("SPAN"); + SPAN_NODE.style = "font-size: 16px;font-weight: bold;"; + SPAN_NODE.innerText = "Version: " + releaseNote; + + document.getElementById('releases_info').appendChild(SPAN_NODE); + + var UL_NODE = document.createElement("UL"); + UL_NODE.style = "margin: 5px 0 5px 15px;list-style:none;list-style-type: disc;list-style-position: outside;"; + + releaseNotes[releaseNote].content.map(function (note, j) { + + var LI_NODE = document.createElement("LI"); + LI_NODE.innerText = note; + LI_NODE.style = "margin-left: 20px;"; + UL_NODE.appendChild(LI_NODE); + + if ((j + 1) === releaseNotes[releaseNote].content.length) { + + document.getElementById('releases_info').appendChild(UL_NODE) + if ((i + 1) === Object.keys(releaseNotes).length) { + } + } + }); + }) + + }) + .catch(err => console.log('[DTU]', err)); + +} +function updateVersionNotesClick() { + document.getElementById('update-desc-release-notes').style = 'z-index: 1001;'; +} +/** + * Update Available click handler + * Show update popup + */ +function updateInfoClick(msgJSON) {//alert(1); + //show modal popup + document.getElementById('update-desc-box').style = ''; + + if (msgJSON.upgrade) { + // // document.getElementById('update-install').removeEventListener('click'); + document.getElementById('update_download_install').style = ''; + document.getElementById('update_download_install').addEventListener("click", updateConfClick) + } +} + +/** + * Footer Update button click handler + * Show confirmation popup + */ +function updateConfClick(msgJSON) {//alert(1); + //show modal popup + document.getElementById('update-conf-box').style = ''; + document.getElementById('update-conf-box').style = 'z-index: 1002'; + + // document.getElementById('update_download_install').style = ''; + // document.getElementById('update_download_install').addEventListener("click", startDownloading) + document.getElementById('update-conf-yes').style = ''; + document.getElementById('update-conf-yes').addEventListener("click", startDownloading) + +} +/** + * Start Download by sending message to main process + */ function startDownloading() { console.log('start-download') //Update confirm and notify main process ipcRendererUpdateWeb.send('update-main', 'update-start'); - document.getElementById('update-info').style = 'display: none;' + document.getElementById('update-info').style = 'display: none;'; document.getElementById('update-desc-box').style = 'display: none;'; + document.getElementById('update-conf-box').style = 'display: none;'; + document.getElementById('update-conf-yes').style = 'display: none;'; + document.getElementById('update-notify-box').style = ''; } + updateFor035(); /*** * Shows a popup for version 0.3.5 and lower to * download new update */ function updateFor035() { - console.log('[DTU]','updateFor035 > for v0.3.5 and lower', process.env.currentVersion); + console.log('[DTU]', 'updateFor035 > for v0.3.5 and lower', process.env.currentVersion); var currentVersion = process.env.currentVersion; // Checks env contains currentVersion for running application // For app v0.3.5 and lower currentVersion is not deined i.e. this check return true @@ -77,126 +214,181 @@ function updateFor035() { */ if (process.env.currentVersion) { -// window.AU_TOKEN = (window.AU_TOKEN || "71927ed58160df81ea3b24e9cf6ace3494fc2575"); -// window.AU_OWNER = (window.AU_OWNER || "NYNJA-MC"); -// window.AU_REPO = (window.AU_REPO || "electron-desktop-app"); -// window.AU_PROVIDER = (window.AU_PROVIDER || "github"); - -var autoUpdaterConfig = { - "DEV": { - "type": "config", "payload": { - "AU_TOKEN": window.AU_TOKEN || "71927ed58160df81ea3b24e9cf6ace3494fc2575", - "AU_OWNER": window.AU_OWNER || "NYNJA-MC", - "AU_REPO": window.AU_REPO || "electron-desktop-app-dev", - "AU_PROVIDER": window.AU_PROVIDER || "github" + // window.AU_TOKEN = (window.AU_TOKEN || "71927ed58160df81ea3b24e9cf6ace3494fc2575"); + // window.AU_OWNER = (window.AU_OWNER || "NYNJA-MC"); + // window.AU_REPO = (window.AU_REPO || "electron-desktop-app"); + // window.AU_PROVIDER = (window.AU_PROVIDER || "github"); + + var autoUpdaterConfig = { + "DEV": { + "type": "config", "payload": { + "AU_TOKEN": window.AU_TOKEN || "71927ed58160df81ea3b24e9cf6ace3494fc2575", + "AU_OWNER": window.AU_OWNER || "NYNJA-MC", + "AU_REPO": window.AU_REPO || "electron-desktop-app-dev", + "AU_PROVIDER": window.AU_PROVIDER || "github", + "AU_AUTO_DOWNLOAD": false, + "AU_AUTO_RESTART": true + } + }, + "STAGING": { + "type": "config", "payload": { + "AU_TOKEN": window.AU_TOKEN || "71927ed58160df81ea3b24e9cf6ace3494fc2575", + "AU_OWNER": window.AU_OWNER || "NYNJA-MC", + "AU_REPO": window.AU_REPO || "electron-desktop-app-staging", + "AU_PROVIDER": window.AU_PROVIDER || "github", + "AU_AUTO_DOWNLOAD": false, + "AU_AUTO_RESTART": true + } + }, + "PROD": { + "type": "config", "payload": { + "AU_TOKEN": window.AU_TOKEN || "71927ed58160df81ea3b24e9cf6ace3494fc2575", + "AU_OWNER": window.AU_OWNER || "NYNJA-MC", + "AU_REPO": window.AU_REPO || "electron-desktop-app", + "AU_PROVIDER": window.AU_PROVIDER || "github", + "AU_AUTO_DOWNLOAD": false, + "AU_AUTO_RESTART": true + } } - }, - "STAGING": { - "type": "config", "payload": { - "AU_TOKEN": window.AU_TOKEN || "71927ed58160df81ea3b24e9cf6ace3494fc2575", - "AU_OWNER": window.AU_OWNER || "NYNJA-MC", - "AU_REPO": window.AU_REPO || "electron-desktop-app-staging", - "AU_PROVIDER": window.AU_PROVIDER || "github" + } + var autoUpdaterAction = { + "type": "action", "payload": { + "AU_ACTION": "check-for-updates", + "AU_AUTO_DOWNLOAD": false, + "AU_AUTO_RESTART": true, } - }, - "PROD": { - "type": "config", "payload": { - "AU_TOKEN": window.AU_TOKEN || "71927ed58160df81ea3b24e9cf6ace3494fc2575", - "AU_OWNER": window.AU_OWNER || "NYNJA-MC", - "AU_REPO": window.AU_REPO || "electron-desktop-app", - "AU_PROVIDER": window.AU_PROVIDER || "github" + } + + + /*** + * Handle autoUpdter for app v0.3.7 and higher + */ + ipcRendererUpdateWeb.on('auto-updater-config-request', function (event, message) { + //message --> DEV, STAGING, PROD + console.log('[DTU] [ipcRendererUpdateWeb] auto-updater-config-request > for v0.3.7+ message : ', message); + + message = (message && (message === 'DEV' || message === 'STAGING' || message === 'PROD') ? message : "PROD"); + + console.log('[DTU] [ipcRendererUpdateWeb] auto-updater-config-request > for v0.3.7+ message : ', message, 'autoUpdaterConfig[message] : ', autoUpdaterConfig[message]); + + ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify(autoUpdaterConfig[message])); + + if (process.env.currentVersion && process.env.currentVersion === '0.3.7') { + //check releasenotes contain v0.3.8 pending + console.log('[DTU] ipcRendererOnUpdateEvent') + require('electron').remote.require('electron-updater').autoUpdater.autoDownload = false; + + require('electron').remote.require('electron-updater').autoUpdater.checkForUpdates().then(function(resp){ + console.log('[DTU] ipcRendererOnUpdateEvent', 'checkforupdate resolved', resp, 'updateInfo : ',resp.updateInfo.version, 'versionInfo : ',resp.versionInfo.version) + if(resp.updateInfo.version!==process.env.currentVersion){ + + // ipcRendererOnUpdateEvent({key:'update-check', upgrade:true, version:info.version, electron: process.versions.electron, chromium: process.versions.chrome, nodejs: process.versions.node, currentVersion:autoUpdater.currentVersion.version,status: 200}) + ipcRendererOnUpdateEvent({ key: 'update-check', upgrade: true, version: "0.3.8", electron: process.versions.electron, chromium: process.versions.chrome, nodejs: process.versions.node, currentVersion: process.env.currentVersion, status: 200 }) + } + }).catch(function(e){ + console.log('[DTU] ipcRendererOnUpdateEvent', 'checkforupdate reject',e) + + }); + } + + window.onload = function () { + console.log('[DTU] onload') + if (process.env.currentVersion && process.env.currentVersion === '0.3.7') { + console.log('[DTU] [ipcRendererUpdateWeb] auto-updater-config-request > for v0.3.7+ message : ', message, 'autoUpdaterAction : ', autoUpdaterAction); + ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify(autoUpdaterAction)); + } } + }); + /*** + * Handle autoUpdter for app v0.3.6 + */ + if (process.env.currentVersion && process.env.currentVersion === '0.3.6') { + + var app_env = (window.location.host === 'web.dev.nynja.net' ? "DEV" : (window.location.host === 'web.dev.staging.net' ? "STAGING" : "PROD")); + + console.log('[DTU] [ipcRendererUpdateWeb] auto-updater-config > for v0.3.6 : ', 'app_env : ', app_env); + + ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify(autoUpdaterConfig[app_env])); + ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify(autoUpdaterAction)); } -} -var autoUpdaterAction = { - "type": "action", "payload": { - "AU_ACTION": "check-for-updates", - "AU_AUTO_DOWNLOAD": false, - "AU_AUTO_RESTART": true, + window.onload = function () { + console.log('[DTU] onload', new Date()); + if(window.location.href.indexOf('/auth')>=0){ + if (process.env.currentVersion && process.env.currentVersion === '0.3.7') { + console.log('[DTU] onload', process.env.currentVersion); + var app_env = (window.location.host === 'web.dev.nynja.net' ? "DEV" : (window.location.host === 'web.dev.staging.net' ? "STAGING" : "DEV")); + ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify(autoUpdaterConfig[app_env])); + + //check releasenotes contain v0.3.8 pending + console.log('[DTU] onload ipcRendererOnUpdateEvent') + require('electron').remote.require('electron-updater').autoUpdater.autoDownload = false; + + require('electron').remote.require('electron-updater').autoUpdater.checkForUpdates().then(function(resp){ + console.log('[DTU] onload ipcRendererOnUpdateEvent', 'checkforupdate resolved', resp, 'updateInfo : ',resp.updateInfo.version, 'versionInfo : ',resp.versionInfo.version) + if(resp.updateInfo.version!==process.env.currentVersion){ + + // ipcRendererOnUpdateEvent({key:'update-check', upgrade:true, version:info.version, electron: process.versions.electron, chromium: process.versions.chrome, nodejs: process.versions.node, currentVersion:autoUpdater.currentVersion.version,status: 200}) + ipcRendererOnUpdateEvent({ key: 'update-check', upgrade: true, version: "0.3.8", electron: process.versions.electron, chromium: process.versions.chrome, nodejs: process.versions.node, currentVersion: process.env.currentVersion, status: 200 }) + } + }).catch(function(e){ + console.log('[DTU] onload ipcRendererOnUpdateEvent', 'checkforupdate reject',e) + + }); + } + } } -} + //} + /** + * Listerner to receive number of unread messages + * for group and personal + * Send this information to native app to show + * badge on taskbar icon + * {p2p: number, group: boolean} + */ -/*** - * Handle autoUpdter for app v0.3.7 and higher - */ -ipcRendererUpdateWeb.on('auto-updater-config-request', function (event, message) { - //message --> DEV, STAGING, PROD - console.log('[DTU] [ipcRendererUpdateWeb] auto-updater-config-request > for v0.3.7+ message : ', message); - - message = (message && (message === 'DEV' || message === 'STAGING' || message === 'PROD') ? message : "PROD"); - - console.log('[DTU] [ipcRendererUpdateWeb] auto-updater-config-request > for v0.3.7+ message : ', message, 'autoUpdaterConfig[message] : ', autoUpdaterConfig[message]); - - ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify(autoUpdaterConfig[message])); - - console.log('[DTU] [ipcRendererUpdateWeb] auto-updater-config-request > for v0.3.7+ message : ', message, 'autoUpdaterAction : ', autoUpdaterAction); - ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify(autoUpdaterAction)); -}); -/*** - * Handle autoUpdter for app v0.3.6 - */ -if(process.env.currentVersion && process.env.currentVersion==='0.3.6'){ - - var app_env = (window.location.host==='web.dev.nynja.net'?"DEV":(window.location.host==='web.dev.staging.net'?"STAGING":"PROD")); - - console.log('[DTU] [ipcRendererUpdateWeb] auto-updater-config > for v0.3.6 : ', 'app_env : ', app_env); - - ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify(autoUpdaterConfig[app_env])); - ipcRendererUpdateWeb.send('auto-updater-config', JSON.stringify(autoUpdaterAction)); -} -//} + document.addEventListener('electron-notifications', function (e) { + try { -/** - * Listerner to receive number of unread messages - * for group and personal - * Send this information to native app to show - * badge on taskbar icon - * {p2p: number, group: boolean} -*/ + console.log('[DTU]', 'electron-notifications'); + console.log('[DTU]', 'electron-notifications > e.data', e.data); -document.addEventListener('electron-notifications', function (e) { - try { + var electron_notifications_data = e.data; - console.log('[DTU]', 'electron-notifications'); - console.log('[DTU]', 'electron-notifications > e.data', e.data); + if (electron_notifications_data) { - var electron_notifications_data = e.data; + if (navigator.userAgent.indexOf('Win') !== -1) { - if (electron_notifications_data) { + const elecNotifRes = ipcRendererUpdateWeb.sendSync('electron-notifications', JSON.stringify(electron_notifications_data)); + console.log('[DTU]', 'electron-notifications > elecNotifRes', elecNotifRes); + if (elecNotifRes === 'success') { - if (navigator.userAgent.indexOf('Win') !== -1) { + //var count = electron_notifications_data.p2p;//(electron_notifications_data.group?1:electron_notifications_data.p2p); + var count = (electron_notifications_data.group && electron_notifications_data.p2p === 0 ? 1 : electron_notifications_data.p2p); + ipcRendererUpdateWeb.sendSync('update-badge', count); + } else { - const elecNotifRes = ipcRendererUpdateWeb.sendSync('electron-notifications', JSON.stringify(electron_notifications_data)); - console.log('[DTU]', 'electron-notifications > elecNotifRes', elecNotifRes); - if (elecNotifRes === 'success') { - - //var count = electron_notifications_data.p2p;//(electron_notifications_data.group?1:electron_notifications_data.p2p); - var count = (electron_notifications_data.group && electron_notifications_data.p2p===0?1:electron_notifications_data.p2p); - ipcRendererUpdateWeb.sendSync('update-badge', count); - } else { + ipcRendererUpdateWeb.sendSync('update-badge', null); + } + } - ipcRendererUpdateWeb.sendSync('update-badge', null); + if (navigator.userAgent.indexOf('Mac') !== -1) { + const elecNotifRes = ipcRendererUpdateWeb.sendSync('electron-notifications', JSON.stringify(electron_notifications_data)); + console.log('[DTU]', 'electron-notifications > elecNotifRes', elecNotifRes); + // if (elecNotifRes === 'success') { + // } } - } + // ipcRendererUpdateWeb.send('electron-notifications', JSON.stringify(electron_notifications_data)); + } else { - if (navigator.userAgent.indexOf('Mac') !== -1) { - const elecNotifRes = ipcRendererUpdateWeb.sendSync('electron-notifications', JSON.stringify(electron_notifications_data)); - console.log('[DTU]', 'electron-notifications > elecNotifRes', elecNotifRes); - // if (elecNotifRes === 'success') { - // } + console.log('[DTU]', 'electron-notifications', 'electron_notifications_data undefined'); } - // ipcRendererUpdateWeb.send('electron-notifications', JSON.stringify(electron_notifications_data)); - } else { - - console.log('[DTU]', 'electron-notifications', 'electron_notifications_data undefined'); - } - } catch (err) { - console.error('[DTU]', 'electron-notifications', err); + } catch (err) { + console.error('[DTU]', 'electron-notifications', err); - } + } -}); -} + }); +} \ No newline at end of file diff --git a/lib/releaseNotes/releaseNotesDesktop.json b/lib/releaseNotes/releaseNotesDesktop.json new file mode 100644 index 0000000000000000000000000000000000000000..ea67366508c1b3a206ce8aac6fcd70b684516d65 --- /dev/null +++ b/lib/releaseNotes/releaseNotesDesktop.json @@ -0,0 +1,46 @@ +{ + "0.3.8": { + "content": [ + "Updated login page design.", + "Added download guideline in upgrading app process.", + "Added release notes in upgrade popup.", + "Fixed issues on PDF viewer (close button and fullscreen)", + "Fixed issue on Check for Update after reload application.", + "Removed check for update window, Only popup will appear for upgrade option.", + "Added confirmation popup before starting upgrade.", + "Handled application crash on force reload.", + "Fixed Google Login issue.", + "Improvements in upgrading application." + ] + }, + "0.3.7": { + "content": [ + "Added support of maximizing the screen sharing on Mac desktop app", + "Spell check fix in Mac desktop app", + "Improved the screen sharing visiblity to remove the blur", + "Handled video permission request after screen share stop in conference call.", + "Added screen share and video switching in conference call support.", + "Stability improvements" + ] + }, + "0.3.6": { + "content": [ + "Added badge support for unread messages.", + "Screen share support on multiple screen.", + "Default Window Image removed in screen share popup.", + "Improved resolution for entire screen thumbnail in screen share popup.", + "Added .rtf file preview support.", + "Updated upgrade issue using github as provider." + ] + }, + "0.3.5": { + "content": [ + "Directly open the Login page instead of default web page.", + "Microsoft Office files (doc, xls, ppt) preview support (win & mac) with print option.", + "PDF file preview support (win & mac) with print option", + "Added print option in the file menu in both mac and win application.", + "Share file through Email option support.", + "Added \"Invite by email\" (through add contact)." + ] + } +} \ No newline at end of file diff --git a/src/assets/css/desktop-style.css b/src/assets/css/desktop-style.css index c24228c372cd34e7469128fd450182041f76fca0..8dd91b13fe0894a56716f1b19d159dcba7350c67 100644 --- a/src/assets/css/desktop-style.css +++ b/src/assets/css/desktop-style.css @@ -64,8 +64,11 @@ html , body{ color: #fff; border-radius: 10px; overflow: hidden; - min-width: 500px; - padding-left: 0px; + min-width: 550px; + padding-left: 0px; + min-height: 400px; + max-width: 550px; + max-height: 400px; } .modalFooter{ background: #4e4e4e; @@ -283,4 +286,4 @@ html , body{ .singleImg.multipleImg>div .img { max-height: 200px; height: 200px; -} +} \ No newline at end of file diff --git a/src/template.ejs b/src/template.ejs index d35a36244740d62b569560dd5c5c269ccd5a6d76..222d1c43545751e17091d1c1d26847855aa8ec8a 100644 --- a/src/template.ejs +++ b/src/template.ejs @@ -106,7 +106,30 @@ - + + + + + + +