diff --git a/.gitignore b/.gitignore index eb2db86..f53d46c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules/ .idea/ util/ -out/ \ No newline at end of file +out/ +build/ \ No newline at end of file diff --git a/package.json b/package.json index a47f1b4..5548548 100644 --- a/package.json +++ b/package.json @@ -10,15 +10,15 @@ }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "clean": "rm -rf util && rm -rf out", - "build": "tsc -p ./util_src --outDir ./util", - "start": "npm run build && electron .", - "dev": "npm run build && electron . --debug", + "clean": "rm -rf build/*", + "build": "tsc -p ./src/ts_source --outDir ./build/util && rsync -avP ./src/ ./build/ && cp ./package.json ./build/", + "start": "npm run build && electron ./build", + "dev": "npm run build && electron ./build --debug", "package": "npm-run-all package:*", - "package:mac": "electron-packager . --overwrite --platform=darwin --arch=x64 --out=out --icon=assets/app-icon/mac/app.icns --osx-sign.identity='Developer ID Application: GitHub' --extend-info=assets/mac/info.plist", - "package:win32": "electron-packager . --overwrite --platform=win32 --arch=ia32 --out=out --icon=assets/app-icon/win/app.ico", - "package:win64": "electron-packager . --overwrite --platform=win32 --arch=x64 --out=out --icon=assets/app-icon/win/app.ico", - "package:linux": "electron-packager . --overwrite --platform=linux --arch=x64 --out=out", + "package:mac": "electron-packager ./build --overwrite --platform=darwin --arch=x64 --out=out --icon=assets/app-icon/mac/app.icns --osx-sign.identity='Developer ID Application: GitHub' --extend-info=assets/mac/info.plist", + "package:win32": "electron-packager ./build --overwrite --platform=win32 --arch=ia32 --out=out --icon=assets/app-icon/win/app.ico", + "package:win64": "electron-packager ./build --overwrite --platform=win32 --arch=x64 --out=out --icon=assets/app-icon/win/app.ico", + "package:linux": "electron-packager ./build --overwrite --platform=linux --arch=x64 --out=out", "package:installer": "node ./script/installer.js", "release": "node ./script/release.js", "prepack": "check-for-leaks", diff --git a/assets/app-icon/png/512.png b/src/assets/app-icon/png/512.png similarity index 100% rename from assets/app-icon/png/512.png rename to src/assets/app-icon/png/512.png diff --git a/assets/conf/file-extensions.json b/src/assets/conf/file-extensions.json similarity index 100% rename from assets/conf/file-extensions.json rename to src/assets/conf/file-extensions.json diff --git a/assets/conf/user.json b/src/assets/conf/user.json similarity index 64% rename from assets/conf/user.json rename to src/assets/conf/user.json index fa547fa..d09ed5f 100644 --- a/assets/conf/user.json +++ b/src/assets/conf/user.json @@ -1,6 +1,8 @@ { "default-links": [ "https://gmail.com", + "https://drive.google.com", + "https://calendar.google.com", "https://archive.carolina.engineering", "https://www.paycor.com/" ] diff --git a/assets/documents/voicemail-and-vacation-responder.pdf b/src/assets/documents/voicemail-and-vacation-responder.pdf similarity index 100% rename from assets/documents/voicemail-and-vacation-responder.pdf rename to src/assets/documents/voicemail-and-vacation-responder.pdf diff --git a/assets/images/pdf-icon.svg b/src/assets/images/pdf-icon.svg similarity index 100% rename from assets/images/pdf-icon.svg rename to src/assets/images/pdf-icon.svg diff --git a/assets/pages/index.html b/src/assets/pages/index.html similarity index 62% rename from assets/pages/index.html rename to src/assets/pages/index.html index 536dae6..3e32c4d 100644 --- a/assets/pages/index.html +++ b/src/assets/pages/index.html @@ -3,21 +3,25 @@ Landing page - + -
+
Welcome to the landing page.
-
-
-
-Go to the second page -

+
+ + +
+
+ Go to the second page +

+
diff --git a/assets/pages/scripts/index_app.js b/src/assets/pages/scripts/index_app.js similarity index 100% rename from assets/pages/scripts/index_app.js rename to src/assets/pages/scripts/index_app.js diff --git a/assets/pages/second.html b/src/assets/pages/second.html similarity index 100% rename from assets/pages/second.html rename to src/assets/pages/second.html diff --git a/assets/pages/styles/default.css b/src/assets/pages/styles/default.css similarity index 100% rename from assets/pages/styles/default.css rename to src/assets/pages/styles/default.css diff --git a/assets/views/file-card.mustache b/src/assets/views/file-card.mustache similarity index 73% rename from assets/views/file-card.mustache rename to src/assets/views/file-card.mustache index 023597b..3b60ee1 100644 --- a/assets/views/file-card.mustache +++ b/src/assets/views/file-card.mustache @@ -1,8 +1,8 @@ -
+
  • File icon

    {{fileName}}

    -
  • + \ No newline at end of file diff --git a/assets/views/web-card.mustache b/src/assets/views/web-card.mustache similarity index 76% rename from assets/views/web-card.mustache rename to src/assets/views/web-card.mustache index c2efdbe..45bf9f5 100644 --- a/assets/views/web-card.mustache +++ b/src/assets/views/web-card.mustache @@ -1,10 +1,9 @@ -
    +
  • File icon
    -
    -
  • + \ No newline at end of file diff --git a/index.js b/src/index.js similarity index 100% rename from index.js rename to src/index.js diff --git a/util_src/fileutils.ts b/src/ts_source/fileutils.ts similarity index 100% rename from util_src/fileutils.ts rename to src/ts_source/fileutils.ts diff --git a/util_src/preload.ts b/src/ts_source/preload.ts similarity index 100% rename from util_src/preload.ts rename to src/ts_source/preload.ts diff --git a/src/ts_source/templates.ts b/src/ts_source/templates.ts new file mode 100644 index 0000000..65d2e4d --- /dev/null +++ b/src/ts_source/templates.ts @@ -0,0 +1,50 @@ +import {FileUtils} from './fileutils'; +import {CardModel} from "./viewFactory"; + +let fs = require('fs'); +let Mustache = require('mustache'); +const crypto = require('crypto'); +let path = require('path'); + +interface TemplateCallbackType { + (rendered: string[]): void +} + +const templateCache = {}; + +export function cacheTemplates() { + let fu = new FileUtils(); + let basePath = path.join(fu.getPathToAssets(), "views"); + fs.readdirSync(basePath) + .forEach((file) => { + templateCache[file] = fs.readFileSync(path.join(basePath.toString(), file)).toString(); + }); +} + +export function loadTemplate(filename: string, objs: object[], cb: TemplateCallbackType) { + let contents = templateCache[filename]; + if (!contents) throw new Error("No such template: " + filename); + let results: string[] = [] + for (let i = 0, l = objs.length; i < l; i++) { + let obj = objs[i] + let rendered = Mustache.render(contents, obj) + results.push(rendered) + } + cb(results) +} + +export function loadTemplateSingle(filename: string, obj: CardModel, cb: (content: string, id: string) => void) { + let contents = templateCache[filename]; + if (!contents) throw new Error("No such template: " + filename); + obj['id'] = createId(obj.fileName); + let rendered = Mustache.render(contents, obj); + cb(rendered, obj['id']); +} + +function createId(fileName: String) { + return crypto.createHash('md5').update(fileName).digest('hex'); +} + +module.exports = {loadTemplate, loadTemplateSingle} + +cacheTemplates() \ No newline at end of file diff --git a/util_src/tsconfig.json b/src/ts_source/tsconfig.json similarity index 100% rename from util_src/tsconfig.json rename to src/ts_source/tsconfig.json diff --git a/util_src/viewFactory.ts b/src/ts_source/viewFactory.ts similarity index 65% rename from util_src/viewFactory.ts rename to src/ts_source/viewFactory.ts index 121a704..0032baf 100644 --- a/util_src/viewFactory.ts +++ b/src/ts_source/viewFactory.ts @@ -20,7 +20,7 @@ export class CardModel { export function buildFileCard(filePath: string, elem: Element, append: boolean = false) { let model = new CardModel(getImagePathFromDocumentName(filePath), fileNameToPrettyString(filePath)); - loadTemplateSingle("file-card", model, (content: string, id: string) => { + loadTemplateSingle("file-card.mustache", model, (content: string, id: string) => { if (append) { elem.innerHTML = elem.innerHTML + content; } else { @@ -43,10 +43,12 @@ export function buildDefaultWebCards(elem: Element) { } export function buildWebCard(urlText: string, elem: Element, append: boolean = false, $: any = require('jquery')) { + console.log("adding " + urlText) + let url = new URL(urlText); let favicon = WebUtils.getFaviconUrl(url); let model = new CardModel(favicon, urlText); - loadTemplateSingle("web-card", model, (content: string, id: string) => { + loadTemplateSingle("web-card.mustache", model, (content: string, id: string) => { if (append) { elem.innerHTML = elem.innerHTML + content; @@ -54,19 +56,36 @@ export function buildWebCard(urlText: string, elem: Element, append: boolean = f elem.innerHTML = content; } - $.get(url.toString(), (data, status) => { - if ('success' === status) { - let title = $(data).filter('title').text(); - $(`#${id}-title`).html($("

    ", {class: "pr-3 mb-0"}).html(title)); - $(`#${id}`).on("click", () => { - launchWebsite(url.toString()); - }); - } - }) + new Promise((resolve, reject) => { + $.get(url.toString(), (data, status) => { + try { + if ('success' === status) { + console.log(`get ${url.toString()} was successful`); + resolve($(data).filter('title').text()); + } + } catch (a) { + console.error("Error while attempting to fetch page title", a) + } + }).fail((failure) => { + console.log(`get ${url.toString()} failed ${failure}`) + reject(failure); + }) + }).then((value: string) => { + let stubb = $(`#${id}-title`).html($("

    ", {class: "pr-3 mb-0"})); + stubb.html(value); + $(`#${id}`).on("click", () => { + launchWebsite(url.toString()); + }); + }).catch(reason => { + let card = $("

    ", {id:"come on", class: "pr-3 mb-0"}); + card.text(urlText); + $(`#${id}-title`).html(card); + }); }); } + function fileNameToPrettyString(fileName: string): string { let name = fileName.substr(0, fileName.lastIndexOf('.')); name = name.replace(/[.\-_]/ig, " ") diff --git a/util_src/webutils.ts b/src/ts_source/webutils.ts similarity index 100% rename from util_src/webutils.ts rename to src/ts_source/webutils.ts diff --git a/util_src/templates.ts b/util_src/templates.ts deleted file mode 100644 index 946087f..0000000 --- a/util_src/templates.ts +++ /dev/null @@ -1,42 +0,0 @@ -let fs = require('fs') -let Mustache = require('mustache') -const crypto = require('crypto') -import {FileUtils} from './fileutils' -import {CardModel} from "./viewFactory"; - -interface TemplateCallbackType { - (rendered: string[]): void -} - -export function loadTemplate(filename: string, objs: object[], cb: TemplateCallbackType) { - let fu = new FileUtils(); - let path = fu.getPathToView(filename); - fs.readFile(path, 'utf8', (err, contents) => { - if (err) throw err; - let results: string[] = [] - for (let i = 0, l = objs.length; i < l; i++) { - let obj = objs[i] - let rendered = Mustache.render(contents, obj) - results.push(rendered) - } - cb(results) - }) -} - -export function loadTemplateSingle(filename: string, obj: CardModel, cb: (content: string, id: string) => void) { - let fu = new FileUtils(); - let path = fu.getPathToView(filename); - fs.readFile(path, 'utf8', (err, contents) => { - if (err) throw err; - obj['id'] = createId(obj.fileName); - let rendered = Mustache.render(contents, obj) - cb(rendered, obj['id']) - }) -} - -function createId(fileName: String){ - return crypto.createHash('md5').update(fileName).digest('hex'); -} - -module.exports = {loadTemplate, loadTemplateSingle} -