generated at
期限付きだけど内容が曖昧なものをkeepするUserScript
これもう使っていない。また今後も使うことはないと思う
tritask-scrapbox-betaを使えば、直接editorにタスクを書き込める
日付ページへ転送する (tritask-scrapbox-beta)機能を使えば簡単にタスクページにタスクをまとめられる
hr
タスクページを作成し、takker-sprintに登録する

仕様
PageMenuから発動
出てきたmodal windowに必要事項を記入して Confirm を押してページを作成する
情報収集用タスクを作成することもできる

このUserScriptを使うと嬉しいこと
templateを使ってタスクを作成できる
定型作業を省くことができる
そうでもなかったtakker
課題に応じて微妙に変えたいことがほとんど
その場その場にあったtemplateを使いたい
というわけでtask-maker-buttonを作った
その週のtakker-sprintに書き込むことができる
タスクリストに手作業で書き込む手間が省ける
タスクの期日から、登録するtakker-sprintページを選択したほうが良さそうtakker
現状は、タスクを作成した週のtakker-sprintに書き込むようになっている

実装
<dialog>を使う
<input> でやることと期日を入力する
実行すると、以下のtabを開く
doneメインページ
done情報集めのタスクページ
期日は翌日のこのscriptを発動した時刻と同じ時刻
期日のほうが速いときは、現在時刻 + 期日までの時間 * 5%とする
上記のページへのリンクを末尾に追記する

2020-10-16 09:41:26
<dialog> をinnerHTMLに入れる
Fetch APIを叩くのは重いのでやめた
2020-10-12 21:11:15
task name に発動したページのタイトルを既定で入れるようにする
そのページからの派生タスクを簡単に作れるようにする
2020-10-10 10:48:56 できた
試してみる
11:37:17 バグ取り終了
11:48:36 takker-sprintを開く処理を追加
テストする
うまく行った
11:56:11 情報集めタスクの作成を任意にする
done12:19:13

modal window
もう使っていない
modal.html
<dialog id="takker-add-task-window"> <form method="dialog"> <p><label> task name: <input type="text" value="" /> </label></p> <p><label> date: <input type="date" /> </label></p> <p><label> time: <input type="time" value="00:00" /> </label></p> <p><label> make collecting task: <input type="checkbox" checked /> </label></p> <menu> <button value="cancel">Cancel</button> <button id="confirmBtn" value="{}">Confirm</button> </menu> </form> </dialog>


script.js
import {makeSprint} from '/api/code/takker/takker-sprint_template/makeSprint.js'; const zero = n => String(n).padStart(2, '0'); const toYYYYMMDD = d => `${d.getFullYear()}-${zero(d.getMonth() + 1)}-${zero(d.getDate())}`; const toHHMM = d => `${zero(d.getHours())}:${zero(d.getMinutes())}`; const modalId = 'takker-add-task-window'; const confirmId = 'confirmBtn'; const projectName = scrapbox.Project.name; export default async function() { const modal = new ModalWindow(); await modal.create(); modal.show(); } class ModalWindow { constructor() { this.modal = document.getElementById(modalId); this.confirm = document.getElementById(confirmId); this.nameBox = undefined; this.dateBox = undefined; this.timeBox = undefined; this.checkBox = undefined; } // create the modal window async create() { if (this.modal) return; const div = document.createElement('div'); div.innerHTML = `<dialog id="takker-add-task-window"> <form method="dialog"> <p><label> task name: <input type="text" value="" /> </label></p> <p><label> date: <input type="date" /> </label></p> <p><label> time: <input type="time" value="00:00" /> </label></p> <p><label> make collecting task: <input type="checkbox" checked /> </label></p> <menu> <button value="cancel">Cancel</button> <button id="confirmBtn" value="{}">Confirm</button> </menu> </form> </dialog>`; document.body.appendChild(div); this.modal = document.getElementById(modalId); this.confirm = document.getElementById(confirmId); this.nameBox = this.modal.querySelector('input[type="text"]'); this.dateBox = this.modal.querySelector('input[type="date"]'); this.timeBox = this.modal.querySelector('input[type="time"]'); this.checkBox = this.modal.querySelector('input[type="checkbox"]'); this._reset(); this.nameBox.addEventListener('change', () => { let value = this._json; value.name = this.nameBox.value; this._json = value; }); this.dateBox.addEventListener('change', () => { let value = this._json; const [year, month, date] = this.dateBox.value.split('-'); value.year = year; value.month = month; value.date = date; this._json = value; }); this.timeBox.addEventListener('change', () => { let value = this._json; const [hour, minute] = this.timeBox.value.split(':'); value.hour = hour; value.minute = minute; this._json = value; }); this.modal.addEventListener('close', () => { if (this.modal.returnValue === "cancel") return; const result = this._json; makeMainTask(result); if (this._checked) { makeCollectingTask(result); makeSprint([` [🔳${result.name}]`, ` [🔳情報集め | ${result.name}]`]); } else { makeSprint([` [🔳${result.name}]`]); } this._reset(); }); } show() { this.modal.showModal(); } get _checked() { return this.checkBox.checked; } _reset() { // 初期化 const today = new Date(); this.nameBox.value = ` | ${scrapbox.Page.title.replace(/^(🔳|✅)(.*)$/, '$2')}`; // Scriptを発動したページのタイトルが含まれるようにする this.dateBox.value = toYYYYMMDD(today); this.timeBox.value = '00:00'; this._json = { name: this.nameBox.value, year: today.getFullYear(), month: today.getMonth()+1, date: today.getDate(), hour: '00', minute: '00'}; } get _json() { //console.log(`data: ${this.confirm.value}`); const temp = JSON.parse(this.confirm.value) ?? undefined; return {name: temp.name,year: temp.year,month: temp.month, date: temp.date, hour: temp.hour,minute: temp.minute}; } set _json({name,year,month,date,hour,minute}) { this.confirm.value = JSON.stringify({name,year,month,date,hour,minute}); } dispose() { const div = this.modal.parentNode; div.parentNode.removeChild(div); } } function makeMainTask({name,year,month,date,hour,minute}) { const e = array => encodeURIComponent(array.join('\n')); const deadline = new Date(year, month - 1, date, hour, minute, 0); const toTimestamp = d => `[${toYYYYMMDD(d)}] ${toHHMM(d)}`; const now = new Date(); const todayStr = (d => `${toYYYYMMDD(d)} ${toHHMM(d)}`)(now); // main task page const lines = [ '', '', 'やること', ' ', '', '期日', ` ${toTimestamp(deadline)}`, '', `#${todayStr}`]; const title = `🔳${name}`; window.open(`https://scrapbox.io/${projectName}/${title}?body=${e(lines)}`); } // 情報集め task page function makeCollectingTask({name,year,month,date,hour,minute}) { const e = array => encodeURIComponent(array.join('\n')); const deadline = new Date(year, month - 1, date, hour, minute, 0); const toTimestamp = d => `[${toYYYYMMDD(d)}] ${toHHMM(d)}`; const now = new Date(); const todayStr = (d => `${toYYYYMMDD(d)} ${toHHMM(d)}`)(now); // 期日までの残り時間を計算 const duration = deadline.getTime() - now.getTime(); const length = duration < 0 ? 0 : duration / (24*3600*1000) < 1.0 ? // 一日を切っていたら、残り時間の5%に設定する duration * 0.05 : 24*3600*1000; let infoDeadline = new Date(); infoDeadline.setTime(now.getTime() + length); const lines = [ `[🔳${name}]を実行するための情報を集める`, '', 'やること', ' ', '', '期日', ` ${toTimestamp(infoDeadline)}`, '', `#${todayStr}`]; const title = `🔳情報集め | ${name}`; window.open(`https://scrapbox.io/${projectName}/${title}?body=${e(lines)}`); }

#2021-01-06 17:19:55
#2020-10-16 09:42:27
#2020-10-12 17:20:51
#2020-10-10 09:16:25