From 22616cbed9acb708abb39e7ea5d3b94d9c15a169 Mon Sep 17 00:00:00 2001 From: SuperChamp234 Date: Fri, 14 Jan 2022 17:55:47 +0530 Subject: [PATCH] Commit to dev branch includes - Due date on Todos - Dailies segragation to not include non-due Dailies - Checklist-items are now working - Made a completely new wrapper for markdown+emojis, can render emojis in description as well as task name --- package.json | 1 + src/main.ts | 6 ++- src/settings.ts | 13 ++++++ src/view/App.tsx | 28 +++++++++++-- .../Taskview/Dailiesview/DailyItem.tsx | 4 +- .../Taskview/Dailiesview/DailySubTasks.tsx | 2 +- .../Components/Taskview/Dailiesview/index.tsx | 42 +++++++++++++++++-- .../Components/Taskview/Todoview/TodoItem.tsx | 5 ++- .../Taskview/Todoview/TodoSubTasks.tsx | 2 +- .../Components/Taskview/Todoview/index.tsx | 2 +- src/view/Components/Taskview/index.tsx | 4 +- src/view/habiticaAPI.ts | 14 +++++++ styles.css | 4 ++ 13 files changed, 110 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 7dbcea4..870cee1 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "dependencies": { "markdown-it": "^12.3.2", "markdown-it-emoji": "^2.0.0", + "moment": "^2.29.1", "node": "^16.10.0", "node-emoji": "^1.11.0", "node-fetch": "^3.0.0", diff --git a/src/main.ts b/src/main.ts index 5677142..13cae87 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,10 +7,14 @@ interface HabiticaSyncSettings { apiToken: string showTaskDescription: boolean showSubTasks: boolean + dueDateFormat: string } const DEFAULT_SETTINGS: Partial = { userID: "", - apiToken: "" + apiToken: "", + showTaskDescription: true, + showSubTasks: true, + dueDateFormat: "DD-MM-YYYY" } export default class HabiticaSync extends Plugin { settings: HabiticaSyncSettings; diff --git a/src/settings.ts b/src/settings.ts index b223be2..974fe44 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,5 +1,6 @@ import HabiticaSync from "./main"; import { App, PluginSettingTab, Setting } from "obsidian"; +import moment from "moment"; export class HabiticaSyncSettingsTab extends PluginSettingTab { plugin: HabiticaSync; @@ -62,6 +63,18 @@ export class HabiticaSyncSettingsTab extends PluginSettingTab { await this.plugin.saveSettings(); }) }); + new Setting(containerEl) + .setName("Due Date Format") + .setDesc("Update requires pane re-opening, check moment.js docs for formatting. Current Format: " + moment().format(this.plugin.settings.dueDateFormat)) + .addText((text) => + text + .setPlaceholder("DD-MM-YYYY") + .setValue(this.plugin.settings.dueDateFormat) + .onChange(async (value) => { + this.plugin.settings.dueDateFormat = value; + await this.plugin.saveSettings(); + }) + ); } } \ No newline at end of file diff --git a/src/view/App.tsx b/src/view/App.tsx index 149304c..fdb748d 100644 --- a/src/view/App.tsx +++ b/src/view/App.tsx @@ -1,8 +1,9 @@ import * as React from "react"; import { Notice } from "obsidian"; -import { getStats, scoreTask, makeCronReq, costReward } from "./habiticaAPI" +import { getStats, scoreTask, makeCronReq, costReward, scoreChecklistItem } from "./habiticaAPI" import Statsview from "./Components/Statsview" import Taskview from "./Components/Taskview" +import ReactDOM from "react-dom"; class App extends React.Component { private _username = ""; @@ -44,6 +45,7 @@ class App extends React.Component { this.handleChangeDailys = this.handleChangeDailys.bind(this); this.handleChangeHabits = this.handleChangeHabits.bind(this); this.handleChangeRewards = this.handleChangeRewards.bind(this); + this.handleChangeChecklistItem = this.handleChangeChecklistItem.bind(this); this.runCron = this.runCron.bind(this); } @@ -144,8 +146,6 @@ class App extends React.Component { } }) } - - handleChangeDailys(event: any) { this.state.tasks.dailys.forEach((element: any) => { if (element.id == event.target.id) { @@ -186,6 +186,26 @@ class App extends React.Component { } }) } + async handleChangeChecklistItem(event: any){ + let parentID = event.target.parentNode.parentNode.parentNode.getAttribute("id") + let targetID = event.target.id + console.log(parentID+ " , " + targetID) + try{ + let response = await scoreChecklistItem(this.username, this.credentials, targetID, parentID); + let result = await response.json(); + if (result.success === true) { + new Notice("Checked!"); + this.reloadData(); + } else { + new Notice("Resyncing, please try again"); + this.reloadData(); + } + } catch (e) { + console.log(e); + new Notice("API Error: Please check credentials") + } + } + render() { let content = this.CheckCron(this.state.user_data.lastCron); if (this.state.error) @@ -197,7 +217,7 @@ class App extends React.Component { {content} - + ); diff --git a/src/view/Components/Taskview/Dailiesview/DailyItem.tsx b/src/view/Components/Taskview/Dailiesview/DailyItem.tsx index a59d02c..ac950ee 100644 --- a/src/view/Components/Taskview/Dailiesview/DailyItem.tsx +++ b/src/view/Components/Taskview/Dailiesview/DailyItem.tsx @@ -11,8 +11,8 @@ function DailyItem(props: any) {

- {console.log(props.checklist)} - + {/* {console.log(props.checklist)} */} +
diff --git a/src/view/Components/Taskview/Dailiesview/DailySubTasks.tsx b/src/view/Components/Taskview/Dailiesview/DailySubTasks.tsx index cd30f13..71b2b09 100644 --- a/src/view/Components/Taskview/Dailiesview/DailySubTasks.tsx +++ b/src/view/Components/Taskview/Dailiesview/DailySubTasks.tsx @@ -8,7 +8,7 @@ function DailySubTasks(props: any) { let subtask_text = renderMarkdown(subtask.text); return (
- +

) diff --git a/src/view/Components/Taskview/Dailiesview/index.tsx b/src/view/Components/Taskview/Dailiesview/index.tsx index 27a988a..bf8b952 100644 --- a/src/view/Components/Taskview/Dailiesview/index.tsx +++ b/src/view/Components/Taskview/Dailiesview/index.tsx @@ -7,8 +7,24 @@ export default function Index(props: any){ return
No Dailies Present
} else { + const notDueDailies = props.dailys.map((daily: any) => { + if (!daily.isDue) { + let daily_notes = ''; + let daily_subtasks = ''; + if (props.settings.showTaskDescription) { + daily_notes = daily.notes; + } + + if (props.settings.showSubTasks) { + daily_subtasks = daily.checklist; + } + return + } + }) const incompleteDailies = props.dailys.map((daily: any) => { - if (!daily.completed) { + if (!daily.completed&&daily.isDue) { let daily_notes = ''; let daily_subtasks = ''; if (props.settings.showTaskDescription) { @@ -20,18 +36,33 @@ export default function Index(props: any){ } return + onChange={props.onChange} completed={daily.completed} onChangeChecklistItem={props.onChangeChecklistItem}/> } }) const completedDailies = props.dailys.map((daily: any) => { - if(daily.completed) - return + // if(daily.completed) + // return + if (!daily.completed) { + let daily_notes = ''; + let daily_subtasks = ''; + if (props.settings.showTaskDescription) { + daily_notes = daily.notes; + } + + if (props.settings.showSubTasks) { + daily_subtasks = daily.checklist; + } + return + } }) const display =
Active Completed + Not Due
    {incompleteDailies}
@@ -39,6 +70,9 @@ export default function Index(props: any){
    {completedDailies}
+ +
    {notDueDailies}
+
return(display); diff --git a/src/view/Components/Taskview/Todoview/TodoItem.tsx b/src/view/Components/Taskview/Todoview/TodoItem.tsx index 0843657..7c1653b 100644 --- a/src/view/Components/Taskview/Todoview/TodoItem.tsx +++ b/src/view/Components/Taskview/Todoview/TodoItem.tsx @@ -1,8 +1,10 @@ import * as React from "react"; import TodoSubTasks from "./TodoSubTasks"; import renderMarkdown from "../markdownRender" +import moment from "moment"; function TodoItem(props: any) { + var dueDate = (props.dueDate==null)?"":("Due Date:"+(moment(props.dueDate).format(props.dueDateFormat))); var text_html = renderMarkdown(props.todo_text); var note_html = renderMarkdown(props.todo_notes); return ( @@ -11,7 +13,8 @@ function TodoItem(props: any) {

- + +
{dueDate}
) diff --git a/src/view/Components/Taskview/Todoview/TodoSubTasks.tsx b/src/view/Components/Taskview/Todoview/TodoSubTasks.tsx index ef74d92..0ba83d7 100644 --- a/src/view/Components/Taskview/Todoview/TodoSubTasks.tsx +++ b/src/view/Components/Taskview/Todoview/TodoSubTasks.tsx @@ -7,7 +7,7 @@ function TodoSubTasks(props: any) { let subtask_text = renderMarkdown(subtask.text); return (
- +

) diff --git a/src/view/Components/Taskview/Todoview/index.tsx b/src/view/Components/Taskview/Todoview/index.tsx index 682e2ef..a050528 100644 --- a/src/view/Components/Taskview/Todoview/index.tsx +++ b/src/view/Components/Taskview/Todoview/index.tsx @@ -21,7 +21,7 @@ export default function Index(props: any){ } return + onChange={props.onChange} onChangeChecklistItem={props.onChangeChecklistItem} completed={todo.completed} dueDate={todo.date} dueDateFormat={props.settings.dueDateFormat}/> } }) diff --git a/src/view/Components/Taskview/index.tsx b/src/view/Components/Taskview/index.tsx index 58f95fb..06d2874 100644 --- a/src/view/Components/Taskview/index.tsx +++ b/src/view/Components/Taskview/index.tsx @@ -24,13 +24,13 @@ export default function Index(props: any){ - + - + diff --git a/src/view/habiticaAPI.ts b/src/view/habiticaAPI.ts index 478211b..eae3ab8 100644 --- a/src/view/habiticaAPI.ts +++ b/src/view/habiticaAPI.ts @@ -54,3 +54,17 @@ export async function costReward(username: string, credentials: string, taskID: }) return(response) } + +export async function scoreChecklistItem(username: string, credentials: string, checklistItemID: string, taskID: string) { + const url = "https://habitica.com/api/v3/tasks/".concat(taskID).concat("/checklist/").concat(checklistItemID).concat("/score") + const response = fetch(url, { + method: 'POST', + headers: { + "Content-Type": "application/json", + "x-client": "278e719e-5f9c-43b1-9dba-8b73343dc062-HabiticaSync", + "x-api-user": username, + "x-api-key": credentials, + } + }) + return(response) +} \ No newline at end of file diff --git a/styles.css b/styles.css index 118caa0..c265c56 100644 --- a/styles.css +++ b/styles.css @@ -304,4 +304,8 @@ button { } .emoji { height: 1em; +} +.description>ul { + list-style-type: disc; + margin-left: 10% !important; } \ No newline at end of file