diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..e69de29 diff --git a/manifest.json b/manifest.json index 1ef7939..a341a54 100644 --- a/manifest.json +++ b/manifest.json @@ -1,9 +1,9 @@ { - "id": "tickaway", - "name": "Tickaway", - "version": "2.0.0", + "id": "homework-manager", + "name": "Homework Manager", + "version": "1.1.1", "minAppVersion": "0.15.0", - "description": "Adds a simple task modal so you can tick away your to-dos with ease.", + "description": "Keeps track of homework through a to-do list.", "author": "Kadison McLellan", "authorUrl": "https://github.com/KadisonM", "fundingUrl": "https://www.buymeacoffee.com/kadisonm", diff --git a/src/creation-modal.ts b/src/creation-modal.ts new file mode 100644 index 0000000..0cf5f71 --- /dev/null +++ b/src/creation-modal.ts @@ -0,0 +1,55 @@ +import TickawayPlugin from './main'; +import { App, ButtonComponent, Modal, setIcon, Setting } from 'obsidian'; +import { render } from "preact"; +import { StringTypes } from './data-manager'; +import { Section } from './data-manager'; + +export default class CreationModal extends Modal { + plugin: TickawayPlugin + type: StringTypes + parent: string + finished: () => void; + + constructor(app: App, plugin: TickawayPlugin, type: StringTypes, parent: string, finished: () => void) { + super(app); + this.plugin = plugin; + this.type = type; + this.parent = parent; + this.finished = finished; + } + + async createSection() { + const {contentEl} = this; + + const title = contentEl.createEl("h1", { text: "Add new section" }); + + const inputText = contentEl.createEl("input", {type: "text", placeholder: "Enter section name"}); + inputText.focus(); + + const buttonDiv = contentEl.createEl("div"); + buttonDiv.addClass("creation-modal-footer"); + + new Setting(contentEl) + .addButton((btn) => + btn + .setButtonText("Done") + .setCta() + .onClick(() => { + this.plugin.data.addItem(new Section(inputText.value.trim(), this.parent, "")); + this.finished(); + this.close(); + })); + } + + async onOpen() { + const {contentEl} = this; + + if (this.type === "Section") { + this.createSection(); + } + } + + async onClose() { + this.contentEl.empty(); + } +} \ No newline at end of file diff --git a/src/data-manager.ts b/src/data-manager.ts index ce31f86..d84ee1e 100644 --- a/src/data-manager.ts +++ b/src/data-manager.ts @@ -2,7 +2,7 @@ import TickawayPlugin from './main'; import { v1 as uuidv1 } from 'uuid'; type AllTypes = Project | Section | Task | SubTask; -type StringTypes = "Item" | "Project" | "Section" | "Task" | "SubTask" +export type StringTypes = "Project" | "Section" | "Task" | "SubTask" abstract class Item { id: string; @@ -14,7 +14,7 @@ abstract class Item { } } -class Project extends Item { +export class Project extends Item { type: "Project" = "Project"; children: string[] = []; @@ -23,19 +23,19 @@ class Project extends Item { } } -class Section extends Item { +export class Section extends Item { type: "Section" = "Section"; children: string[] = []; constructor( name: string, public parent: string, - public sort: string + public sort?: string ) { super(name); } } -class Task extends Item { +export class Task extends Item { type: "Task" = "Task"; children: string[] = []; constructor( @@ -49,7 +49,7 @@ class Task extends Item { } } -class SubTask extends Item { +export class SubTask extends Item { type: "SubTask" = "SubTask"; constructor( id: string, @@ -163,6 +163,14 @@ export class DataManager { addItem(item: AllTypes) { this.data.items.push(item); + if (item.type !== "Project") { + const parent = this.getItem(item.parent); + + if (parent && parent.type !== "SubTask") { + parent.children.push(item.id); + } + } + return item.id; } diff --git a/src/ui/components/menu-item.tsx b/src/ui/components/menu-item.tsx index 6a124c5..a9f3151 100644 --- a/src/ui/components/menu-item.tsx +++ b/src/ui/components/menu-item.tsx @@ -11,7 +11,6 @@ interface Props { }; export function MenuItem({ title, icon, onClick, checked, attributeMessage, attributePosition }: Props) { - console.log(checked) const element = useRef(null); useLayoutEffect(() => { @@ -21,7 +20,7 @@ export function MenuItem({ title, icon, onClick, checked, attributeMessage, attr }); return ( -
+
diff --git a/src/ui/modal/body/index.tsx b/src/ui/modal/body/index.tsx index 6bdcef5..be4b7af 100644 --- a/src/ui/modal/body/index.tsx +++ b/src/ui/modal/body/index.tsx @@ -1,4 +1,4 @@ -import { useContext } from 'preact/hooks'; +import { useContext, useLayoutEffect } from 'preact/hooks'; import { Project } from 'src/data-manager'; import { DataContext, ProjectContext } from "src/ui/modal"; @@ -14,8 +14,6 @@ export default function Body() { const project = data.getItem(projectId) as Project; - console.log(project); - if (!project) return (<>) @@ -29,9 +27,12 @@ export default function Body() { } + useLayoutEffect(() => { + console.log("refreshed") + }); + return ( -
-
+
{ sections.map((sectionId: string) => (
{ - + if (modal) { + console.log(projectId); + new CreationModal(modal.app, modal.plugin, "Section", projectId, () => { + print("Set id") + setProjectId(projectId); + }).open(); + } + }; const newTask = () => { diff --git a/styles.css b/styles.css index cc5e680..312df3d 100644 --- a/styles.css +++ b/styles.css @@ -1,182 +1,153 @@ -.tickaway .tickaway-modal { - .icon-button { - width: 12px; - height: 12px; - } - - .header { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - gap: 20px; - } - - .section { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - gap: 20px; - - .section-dropdown { - background-color: none; - border-radius: var(--radius-s); - - padding: var(--size-4-1) var(--size-4-2); - overflow: hidden; - - display: flex; - flex-grow: 1; - justify-content: left; - align-items: center; - gap: 10px; - - .section-name { - font-size: var(--h3-size); - font-weight: var(--font-normal); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - color: var(--text-normal); - } - - .section-icon { - color: var(--icon-color); - opacity: var(--icon-opacity); - } - - & * { - display: flex; - justify-content: center; - align-items: center; - } - - &:hover { - .section-name { - color: var(--text-normal); - } - - background-color: var(--background-modifier-hover); - opacity: 100; - } - } - } - - .footer { - display: flex; - flex-direction: row; - justify-content: left; - align-items: center; - gap: 10px; - - border-top: var(--divider-width) solid var(--divider-color); - - padding: var(--size-4-4) 0 0 0; - } - - .action-button { - width: fit-content; - height: fit-content; - - border-radius: var(--button-radius); - border-style: solid; - border-width: 1px; - border-color: var(--background-modifier-border-hover); - background-color: var(--background-secondary); - box-shadow: none; - font-size: var(--font-ui-small); - justify-content: flex-end; - min-height: 18px; - padding: var(--size-4-1) var(--size-4-2) var(--size-4-1) var(--size-4-2); - user-select: none; - - display: flex; - align-items: center; - justify-content: center; - flex-direction: row; - cursor: var(--cursor); - margin: none; - gap: var(--size-4-2); - - & * { - color: var(--icon-color); - transition: opacity 0.15s ease-in-out; - opacity: var(--icon-opacity); - - display: flex; - align-items: center; - justify-content: center; - } - - &:hover &:hover { - background-color: var(--background-modifier-hover); - } - - - &:hover * { - color: var(--icon-color-hover); - opacity: var(--icon-opacity-hover); - } - - &:active * { - opacity: var(--icon-opacity-hover); - color: var(--icon-color-focused); - } - - .action-button-icon { - stroke: var(--icon-m-stroke-width); - } - } - - .project-switcher { - color: var(--vault-profile-color); - border-radius: var(--radius-s); - display: flex; - flex-grow: 1; - align-items: center; - gap: var(--size-4-2); - overflow: hidden; - padding: var(--size-4-1) var(--size-4-2); - - &:hover { - color: var(--vault-profile-color-hover); - background-color: var(--background-modifier-hover); - - .project-switcher-icon { - color: var(--icon-color-hover); - opacity: var(--icon-opacity-hover); - } - } - - &.is-active { - color: var(--vault-profile-color-hover); - background-color: var(--background-modifier-hover); - - .project-switcher-icon { - color: var(--text-muted); - } - } - - .project-switcher-icon { - height: var(--icon-m); - width: var(--icon-m); - stroke: var(--icon-m-stroke-width); - display: flex; - align-items: center; - justify-content: center; - color: var(--icon-color); - transition: opacity 0.15s ease-in-out; - opacity: var(--icon-opacity); - } - - .project-switcher-name { - font-size: var(--inline-title-size);; - font-weight: var(--font-bold); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - } - } +.subject-box { + font-size: x-large !important; + padding-left: 0px !important; + background-color: tomato !important; + font-weight: 600 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; } +.hidden-textbox { + background-color: transparent !important; + border: none !important; + outline: none !important; + box-shadow: none !important; +} + +.homework-manager h1 { + font-size: xx-large; + margin-top: 0; + margin-bottom: 0; +} +.homework-manager h2 { + font-size: x-large; + margin-top: 0; + margin-bottom: 0; +} +.homework-manager h3 { + font-size: large; + margin-top: 0; + margin-bottom: 0; +} +.homework-manager .clickable-icon { + width: 32px; + height: 32px; +} +.homework-manager #remove-subject { + display: flex; + align-items: center; + justify-content: center; + width: 25px; + height: 25px; + border-radius: 50%; + background-color: var(--interactive-hover); +} +.homework-manager #remove-subject:hover { + background-color: red; +} +.homework-manager #header { + display: flex; + justify-content: space-between; + margin-right: 20px; +} +.homework-manager #header #left-column { + display: flex; + align-items: center; +} +.homework-manager #header *:not(svg) { + margin-right: 10px; +} +.homework-manager #body { + margin-top: 30px; +} +.homework-manager #body *:not(svg) { + margin-right: 10px; +} +.homework-manager #body #subject { + margin-bottom: 30px; +} +.homework-manager #body #title { + display: flex; + align-items: center; + justify-content: flex-start; +} +.homework-manager #body #task { + display: flex; + align-items: center; + margin-top: 15px; +} +.homework-manager #body #task div { + display: flex; + flex-direction: column; + align-items: left; +} +.homework-manager #body #task #check { + background-color: transparent; + width: 25px; + height: 25px; + flex-shrink: 0; + border-style: solid; + border-width: 2px; + border-radius: 50%; + border-color: var(--icon-color); + opacity: var(--icon-opacity); + transition: opacity 0.15s ease-in-out; +} +.homework-manager #body #task #check:hover { + opacity: var(--icon-opacity-hover); + border-color: var(--icon-color-hover); +} +.homework-manager #body #task #check:active { + opacity: var(--icon-opacity-hover); + border-color: var(--icon-color-focused); +} +.homework-manager #body #task p { + font-size: large; + margin: 0; +} +.homework-manager #body #task #date { + color: var(--text-muted); + font-size: small; +} +.homework-manager #menu { + display: flex; + flex-direction: column; +} +.homework-manager #menu .menu-item:hover { + background-color: var(--background-modifier-hover); +} +.homework-manager #subject-prompt { + display: flex; + align-items: center; + margin-top: 30px; + gap: 10px; +} +.homework-manager #subject-prompt input { + width: 50%; +} +.homework-manager #task-prompt { + margin-top: 15px; +} +.homework-manager #task-prompt #top { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 10px; +} +.homework-manager #task-prompt #top input { + width: 50%; +} +.homework-manager #task-prompt #bottom { + display: flex; + align-items: center; + gap: 10px; +} +.homework-manager-hidden { + display: none !important; +} +.homework-manager-link:hover { + cursor: var(--cursor-link); + text-decoration-line: var(--link-decoration-hover); +} + +/*# sourceMappingURL=styles.css.map */