diff --git a/src/js/src/tracker/app.html b/src/js/src/tracker/app.html
index 8fad546..13bdcb9 100644
--- a/src/js/src/tracker/app.html
+++ b/src/js/src/tracker/app.html
@@ -76,7 +76,7 @@
- |
+ |
読み込まれました |
|
|
@@ -92,7 +92,7 @@
- |
+ |
|
|
|
diff --git a/src/js/src/tracker/app.js b/src/js/src/tracker/app.js
index a21abb0..f77468e 100644
--- a/src/js/src/tracker/app.js
+++ b/src/js/src/tracker/app.js
@@ -2,10 +2,10 @@
function main(global) {
const tracker = {};
- const domain = createDomain({},q("#record .col-memo").textContent);
-
+ const domain = createDomain({},q("#initial_record .col-memo").textContent);
const app = tracker;
- global.addEventListener("load", initialize);
+
+ global.addEventListener("load", initializeApp);
global.addEventListener("keydown", checkShortKeys);
return;
@@ -30,19 +30,28 @@
return result;
}
+ //恒等写像。array.mapで配列のコピー作るときとかに使う。
+ function id(x) {
+ return x;
+ }
+
function createDomain(domain, firstmemo) {
domain.log = {
+ //publics
+ list: listLog,
start: startLog,
end: endLog,
- getLatest: getLatestLog,
+ getLatest: getLatestLog,
+ toCSV: listAsCsvString,
+
private: {
latest: false,
initialize: initializeLog,
+ list : [],
},
};
domain.latest= Date.now();
domain.log.private.initialize(firstmemo);
- q("#record .col-memo").textContent
return domain;
/*
@@ -56,12 +65,16 @@
return;
}
- log.private.latest = {
+ //ユーザーは末端の処理を気にしないようにこちらで実施。
+ const firstLog = {
memo: memo,
start: new Date(),
end: "",
interval: intervalLog,
};
+
+ log.private.latest = firstLog
+ log.private.list.push(firstLog);
}
function getLatestLog() {
@@ -82,25 +95,59 @@
secondary.end = start;
domain.latest = Date.now();
log.private.latest = primary;
+ log.private.list.push(primary)
return new Promise((resolve, reject) => {
resolve([primary,secondary]);
});
-
- //return primary;
-
}
function intervalLog() {
- return this.end - this.start;
+ if(this.end instanceof Date) {
+ return this.end - this.start;
+ }
+
+ return 0;
}
function endLog(end) {
}
+
+ function listLog() {
+ return domain.log.private.list.map(id)
+
+ }
+
+ function listAsCsvString(list) {
+ // CSVフォーマットはRFC4180を正とする:
+ // https://www.ietf.org/rfc/rfc4180.txt
+ const csvbody = domain.log.list().map(log => {
+ const memo = log.memo.replaceAll('"', '""').replaceAll("\r\n", "\n");
+ const end = log.end instanceof Date ? log.end.toLocaleTimeString() : "";
+ const start = log.start.toLocaleTimeString();
+ return [memo, log.interval(), start, end];
+ }).map(line => line.map(string => '"' + string +'"'))
+ .map(line => line.join(','))
+ .join("\r\n");
+ const header = '"メモ","ラップタイム","開始","終了"\r\n'
+ return header + csvbody;
+ }
}
- function initialize() {
+ function initializeApp() {
+ // 実行するタイミングは後になるけど、
+ // 本関数が最終的に行いたいことを示す部分のため先に記述
+ function setupApp() {
+ Object.defineProperties(tracker, {
+ ui: {value: ui},
+ command: {value: command},
+ key: {value: key},
+ data: {value: data},
+ domain:{value: domain},
+ });
+ return;
+ }
/*
* アプリケーションオブジェクトの設定
* 後でdefinePropertiesでゲッターを設定する
@@ -112,6 +159,7 @@
memo: document.forms.one_event.elements.event_memo,
time: document.forms.one_event.elements.event_time,
addEvent: document.forms.one_event.elements.event_add,
+ logTable: q("#event-logs tbody"),
initRec: q("#initial_record"),
get active() {
return document.activeElement;
@@ -125,7 +173,7 @@
const command = {
readyCommand: readyCommand,
readyMemo: readyMemo,
- addEvent: addEvent,
+ addEvent: addEventLog,
getNow: getNow,
}
@@ -147,19 +195,14 @@
//通常文字
c : "C",
}
- Object.defineProperties(tracker, {
- ui: {value: ui},
- command: {value: command},
- key: {value: key},
- data: {value: data},
- domain:{value: domain},
- });
+
+ setupApp();
// 初期行の変更
- const start = new Date();
+ const start = domain.log.getLatest().start;
const time = start.toLocaleTimeString();
q(tracker.ui.initRec, "td.col-position-start").textContent = time;
-
+
// 現在時刻の初回呼び出し、後は自動で1秒ごとに更新。
updateNow(1000);
@@ -167,14 +210,34 @@
* コントローラの設定
*/
tracker.ui.addEvent.addEventListener('click', (event) => {
- addEvent(tracker.ui.memo.value, tracker.ui.time.value);
+ addEventLog(tracker.ui.memo.value, tracker.ui.time.value);
})
+ tracker.ui.logTable.addEventListener('click', (event) => {
+ if (isDeleteButton(event.target) ) {
+ console.log("todo delete process")
+ }
+ });
+
+ q("#save-as-csv").addEventListener('click', (event) => {
+ const csvWindow = window.open("", "_blank");
+ csvWindow.document.open();
+ csvWindow.document.write("" + domain.log.toCSV() + "
");
+ csvWindow.document.close();
+ console.log();
+ })
+
+ function isDeleteButton(element) {
+ return element.classList.contains("delete-event");
+ }
+
+
+
}
- function addEvent(memo, datetime) {
+ function addEventLog(memo, datetime) {
//ISOString形式の例: 14:02:12T00:12:34.000Z"
- const today = (new Date(Date.now())).toISOString().substr(0, 10);
+ const today = (new Date()).toISOString().substr(0, 10);
let finishTime = ""
if(datetime) {
finishTime = new Date(today + "T" + datetime);
@@ -187,10 +250,10 @@
.then(value => {
const first = value[0];
const second = value[1];
- __addEvent(first, second);
+ _addEventLog(first, second);
})
- function __addEvent(firstLog, secondLog) {
+ function _addEventLog(firstLog, secondLog) {
const newTime = firstLog.start.toLocaleTimeString('ja-JP');
const newMemo = firstLog.memo;