From 2973022f96f23e0d02e28778ff67fd5cfcc2eed2 Mon Sep 17 00:00:00 2001 From: pihart Date: Fri, 13 Nov 2020 17:23:57 -0800 Subject: [PATCH 1/6] Export exported date to JSON as "exported-date" --- src/lib/files.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/files.ts b/src/lib/files.ts index 96757012..691cfed8 100644 --- a/src/lib/files.ts +++ b/src/lib/files.ts @@ -46,6 +46,7 @@ export class JSONWriter { private readonly sourceJSON: { "qboard-version": number; pages: PageJSON[]; + "exported-date": Date; }; private stringified: string; @@ -53,6 +54,7 @@ export class JSONWriter { this.sourceJSON = { "qboard-version": 1, pages: pagesJSON, + "exported-date": new Date(), // this date is only parsed once per new JSONWriter() }; } From 758e8a43246c63cd888f49607219fd3acfd3e3db Mon Sep 17 00:00:00 2001 From: pihart Date: Fri, 13 Nov 2020 17:35:16 -0800 Subject: [PATCH 2/6] Increment qboard-version --- src/lib/files.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/files.ts b/src/lib/files.ts index 691cfed8..8a0cb677 100644 --- a/src/lib/files.ts +++ b/src/lib/files.ts @@ -35,6 +35,7 @@ export class JSONReader { const { "qboard-version": version, pages } = object; switch (version) { case 1: + case 2: return pages; default: return pages; @@ -52,7 +53,7 @@ export class JSONWriter { constructor(pagesJSON: PageJSON[]) { this.sourceJSON = { - "qboard-version": 1, + "qboard-version": 2, pages: pagesJSON, "exported-date": new Date(), // this date is only parsed once per new JSONWriter() }; From bebcf4ea0f525f7053ff08f89808dc4319cdef54 Mon Sep 17 00:00:00 2001 From: pihart Date: Fri, 13 Nov 2020 18:02:39 -0800 Subject: [PATCH 3/6] Move the UI operations and timestring generation to a new class in files.ts --- src/lib/files.ts | 22 ++++++++++++++++++++++ src/lib/pages.ts | 28 +++++++++------------------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/lib/files.ts b/src/lib/files.ts index 8a0cb677..05abc7fb 100644 --- a/src/lib/files.ts +++ b/src/lib/files.ts @@ -75,6 +75,28 @@ export class JSONWriter { }; } +export class FileUI { + static timeString = (): string => { + const offset = new Date().getTimezoneOffset() * 60000; + return new Date(Date.now() - offset) + .toISOString() + .slice(0, -8) + .replace(/\D/g, "-"); + }; + + download = (name: string, fileURL: string, revokeURL = (): void => {}) => { + const elt = document.createElement("a"); + elt.style.display = "none"; + elt.href = fileURL; + elt.download = name; + document.body.appendChild(elt); + elt.click(); + elt.parentElement.removeChild(elt); + + revokeURL(); + }; +} + export type FileHandlerResponse = { action: "none" | "image" | "json"; history?: HistoryCommand; diff --git a/src/lib/pages.ts b/src/lib/pages.ts index b56f5092..8f4acfa9 100644 --- a/src/lib/pages.ts +++ b/src/lib/pages.ts @@ -2,7 +2,7 @@ import pdfMake from "pdfmake/build/pdfmake.min"; import { fabric } from "fabric"; import Page from "./page"; -import { JSONWriter } from "./files"; +import { FileUI, JSONWriter } from "./files"; export type PageJSON = { version: string; @@ -16,14 +16,6 @@ const defaultPageJSON: PageJSON = { background: "white", }; -const timeString = (): string => { - const offset = new Date().getTimezoneOffset() * 60000; - return new Date(Date.now() - offset) - .toISOString() - .slice(0, -8) - .replace(/\D/g, "-"); -}; - export default class Pages { pagesJSON: PageJSON[] = [defaultPageJSON]; currentIndex = 0; @@ -94,7 +86,9 @@ export default class Pages { content, }; - pdfMake.createPdf(docDefinition).download(`qboard-${timeString()}.pdf`); + pdfMake + .createPdf(docDefinition) + .download(`qboard-${FileUI.timeString()}.pdf`); await this.canvas.loadFromJSONAsync(this.pagesJSON[currentIndexCopy]); }; @@ -103,15 +97,11 @@ export default class Pages { this.savePage(); const [fileURL, revokeURL] = new JSONWriter(this.pagesJSON).toURL(); - const elt = document.createElement("a"); - elt.style.display = "none"; - elt.href = fileURL; - elt.download = `qboard-${timeString()}.json`; - document.body.appendChild(elt); - elt.click(); - elt.parentElement.removeChild(elt); - - revokeURL(); + new FileUI().download( + `qboard-${FileUI.timeString()}.json`, + fileURL, + revokeURL + ); this.canvas.modified = false; }; From 6beec65774d14e17a12ffd9fc91765ca5dfe422b Mon Sep 17 00:00:00 2001 From: pihart Date: Fri, 13 Nov 2020 18:06:13 -0800 Subject: [PATCH 4/6] Give JSONWriter a download method --- src/lib/files.ts | 10 ++++++++++ src/lib/pages.ts | 8 +------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/lib/files.ts b/src/lib/files.ts index 05abc7fb..493fc50e 100644 --- a/src/lib/files.ts +++ b/src/lib/files.ts @@ -73,6 +73,16 @@ export class JSONWriter { const revoke = () => window.URL.revokeObjectURL(url); return [url, revoke]; }; + + download = (): void => { + const [fileURL, revokeURL] = this.toURL(); + + new FileUI().download( + `qboard-${FileUI.timeString()}.json`, + fileURL, + revokeURL + ); + }; } export class FileUI { diff --git a/src/lib/pages.ts b/src/lib/pages.ts index 8f4acfa9..d4c034d3 100644 --- a/src/lib/pages.ts +++ b/src/lib/pages.ts @@ -95,13 +95,7 @@ export default class Pages { saveFile = (): void => { this.savePage(); - const [fileURL, revokeURL] = new JSONWriter(this.pagesJSON).toURL(); - - new FileUI().download( - `qboard-${FileUI.timeString()}.json`, - fileURL, - revokeURL - ); + new JSONWriter(this.pagesJSON).download(); this.canvas.modified = false; }; From d4577a857f8620b5a925f7b43d78d16db6f5ed7f Mon Sep 17 00:00:00 2001 From: pihart Date: Fri, 13 Nov 2020 19:13:14 -0800 Subject: [PATCH 5/6] Make timeString less sensitive --- src/lib/files.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/lib/files.ts b/src/lib/files.ts index 493fc50e..e07ab066 100644 --- a/src/lib/files.ts +++ b/src/lib/files.ts @@ -87,11 +87,14 @@ export class JSONWriter { export class FileUI { static timeString = (): string => { - const offset = new Date().getTimezoneOffset() * 60000; - return new Date(Date.now() - offset) - .toISOString() - .slice(0, -8) - .replace(/\D/g, "-"); + const date = new Date(); + return [ + date.getFullYear(), + date.getMonth(), + date.getDate(), + date.getHours(), + date.getMinutes(), + ].join("-"); }; download = (name: string, fileURL: string, revokeURL = (): void => {}) => { From e7f68fb7f7f39dd99445b17d390c8a08116f26b5 Mon Sep 17 00:00:00 2001 From: pihart Date: Fri, 13 Nov 2020 19:14:50 -0800 Subject: [PATCH 6/6] Add static timeStringNow Make timeString now assume Date. Safer, cleaner, unit-testable --- src/lib/files.ts | 6 +++--- src/lib/pages.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/files.ts b/src/lib/files.ts index e07ab066..fc71fb21 100644 --- a/src/lib/files.ts +++ b/src/lib/files.ts @@ -78,7 +78,7 @@ export class JSONWriter { const [fileURL, revokeURL] = this.toURL(); new FileUI().download( - `qboard-${FileUI.timeString()}.json`, + `qboard-${FileUI.timeStringNow()}.json`, fileURL, revokeURL ); @@ -86,8 +86,7 @@ export class JSONWriter { } export class FileUI { - static timeString = (): string => { - const date = new Date(); + static timeString = (date): string => { return [ date.getFullYear(), date.getMonth(), @@ -96,6 +95,7 @@ export class FileUI { date.getMinutes(), ].join("-"); }; + static timeStringNow = (): string => FileUI.timeString(new Date()); download = (name: string, fileURL: string, revokeURL = (): void => {}) => { const elt = document.createElement("a"); diff --git a/src/lib/pages.ts b/src/lib/pages.ts index d4c034d3..49879a6c 100644 --- a/src/lib/pages.ts +++ b/src/lib/pages.ts @@ -88,7 +88,7 @@ export default class Pages { pdfMake .createPdf(docDefinition) - .download(`qboard-${FileUI.timeString()}.pdf`); + .download(`qboard-${FileUI.timeStringNow()}.pdf`); await this.canvas.loadFromJSONAsync(this.pagesJSON[currentIndexCopy]); };