Skip to content

Commit

Permalink
Add more date settings
Browse files Browse the repository at this point in the history
  • Loading branch information
mgmeyers committed May 7, 2021
1 parent 6481871 commit 753a18e
Show file tree
Hide file tree
Showing 16 changed files with 614 additions and 91 deletions.
320 changes: 301 additions & 19 deletions dist/main.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "obsidian-kanban",
"name": "Kanban",
"version": "0.2.4",
"version": "0.2.5",
"minAppVersion": "0.11.13",
"description": "Create markdown-backed Kanban boards in Obsidian.",
"author": "mgmeyers",
Expand Down
8 changes: 8 additions & 0 deletions dist/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,14 @@ button.kanban-plugin__lane-settings-button
color: var(--text-muted);
}

.kanban-plugin__item-metadata > span {
display: block;
}

.kanban-plugin__item-metadata-date-relative::first-letter {
text-transform: uppercase;
}

.kanban-plugin__item-metadata a {
text-decoration: none;
}
Expand Down
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "obsidian-kanban",
"name": "Kanban",
"version": "0.2.4",
"version": "0.2.5",
"minAppVersion": "0.11.13",
"description": "Create markdown-backed Kanban boards in Obsidian.",
"author": "mgmeyers",
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"monkey-around": "^2.1.0",
"react": "^17.0.2",
"react-beautiful-dnd": "^13.1.0",
"react-cool-onclickoutside": "^1.6.1",
"react-dom": "^17.0.2",
"react-is": "^17.0.2",
"react-redux": "^7.2.3",
Expand Down
120 changes: 117 additions & 3 deletions src/Settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,12 @@ export interface KanbanSettings {
"show-checkboxes"?: boolean;
"date-format"?: string;
"date-display-format"?: string;
"hide-date-display"?: boolean;
"show-relative-date"?: boolean;
"date-trigger"?: string;
"link-date-to-daily-note"?: boolean;
"hide-date-in-title"?: boolean;
"max-archive-size"?: number;

"display-tags"?: boolean;
"time-format"?: string;
Expand Down Expand Up @@ -140,21 +143,62 @@ export class SettingsManager {
text.inputEl.value = value ? value.toString() : "";

text.onChange((val) => {
if (numberRegEx.test(val)) {
if (val && numberRegEx.test(val)) {
text.inputEl.removeClass("error");

this.applySettingsUpdate({
"lane-width": {
$set: parseInt(val),
},
});
} else {

return;
}

if (val) {
text.inputEl.addClass("error");
}

this.applySettingsUpdate({
$unset: ["lane-width"],
});
});
});

new Setting(contentEl)
.setName("Maximum number of archived cards")
.setDesc(
"Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely."
)
.addText((text) => {
const [value, globalValue] = this.getSetting("max-archive-size", local);

text.inputEl.setAttr("type", "number");
text.inputEl.placeholder = `${
globalValue ? globalValue : "-1"
} (default)`;
text.inputEl.value = value ? value.toString() : "";

text.onChange((val) => {
if (val && numberRegEx.test(val)) {
text.inputEl.removeClass("error");

this.applySettingsUpdate({
$unset: ["lane-width"],
"max-archive-size": {
$set: parseInt(val),
},
});

return;
}

if (val) {
text.inputEl.addClass("error");
}

this.applySettingsUpdate({
$unset: ["max-archive-size"],
});
});
});

Expand Down Expand Up @@ -324,6 +368,76 @@ export class SettingsManager {
});
});

new Setting(contentEl)
.setName("Hide dates")
.setDesc(
"When toggled, card dates will not be shown. Relative dates will still be displayed if they are enabled."
)
.addToggle((toggle) => {
const [value, globalValue] = this.getSetting(
"hide-date-display",
local
);

if (value !== undefined) {
toggle.setValue(value as boolean);
} else if (globalValue !== undefined) {
toggle.setValue(globalValue as boolean);
}

toggle.onChange((newValue) => {
this.applySettingsUpdate({
"hide-date-display": {
$set: newValue,
},
});
});
})
.addExtraButton((b) => {
b.setIcon("reset")
.setTooltip("Reset to default")
.onClick(() => {
this.applySettingsUpdate({
$unset: ["hide-date-display"],
});
});
});

new Setting(contentEl)
.setName("Show relative date")
.setDesc(
"When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'"
)
.addToggle((toggle) => {
const [value, globalValue] = this.getSetting(
"show-relative-date",
local
);

if (value !== undefined) {
toggle.setValue(value as boolean);
} else if (globalValue !== undefined) {
toggle.setValue(globalValue as boolean);
}

toggle.onChange((newValue) => {
this.applySettingsUpdate({
"show-relative-date": {
$set: newValue,
},
});
});
})
.addExtraButton((b) => {
b.setIcon("reset")
.setTooltip("Reset to default")
.onClick(() => {
this.applySettingsUpdate({
$unset: ["show-relative-date"],
});
});
});

// new Setting(contentEl).setName("Time output format").then((setting) => {
// setting.addMomentFormat((mf) => {
// setting.descEl.appendChild(
Expand Down
48 changes: 44 additions & 4 deletions src/components/Item/ItemContent.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { MarkdownRenderer, getLinkpath } from "obsidian";
import { MarkdownRenderer, getLinkpath, moment } from "obsidian";
import React from "react";
import { Item } from "../types";
import { c, getDefaultDateFormat } from "../helpers";
Expand All @@ -13,6 +13,26 @@ export interface ItemContentProps {
onKeyDown?: React.KeyboardEventHandler<HTMLTextAreaElement>;
}

function getRelativeDate(date: moment.Moment) {
const today = moment().startOf("day");

if (today.isSame(date, "day")) {
return "today";
}

const diff = date.diff(today, "day");

if (diff === -1) {
return "yesterday";
}

if (diff === 1) {
return "tomorrow";
}

return date.from(today);
}

export function ItemContent({
item,
isSettingsVisible,
Expand All @@ -28,6 +48,8 @@ export function ItemContent({
const dateDisplayFormat =
view.getSetting("date-display-format") || dateFormat;
const shouldLinkDate = view.getSetting("link-date-to-daily-note");
const shouldShowRelativeDate = view.getSetting("show-relative-date");
const hideDateDisplay = view.getSetting("hide-date-display");

const onAction = () => setIsSettingsVisible && setIsSettingsVisible(false);

Expand Down Expand Up @@ -84,8 +106,12 @@ export function ItemContent({
);
}

const dateStr = item.metadata.date?.format(dateFormat);
const dateDisplayStr = item.metadata.date?.format(dateDisplayFormat);
const dateStr = hideDateDisplay
? null
: item.metadata.date?.format(dateFormat);
const dateDisplayStr = hideDateDisplay
? null
: item.metadata.date?.format(dateDisplayFormat);

const datePath = dateStr ? getLinkpath(dateStr) : null;
const isResolved = dateStr
Expand All @@ -106,6 +132,11 @@ export function ItemContent({
dateDisplayStr
);

const relativeDate =
shouldShowRelativeDate && item.metadata.date
? getRelativeDate(item.metadata.date)
: null;

return (
<div className={c("item-title")}>
<div
Expand Down Expand Up @@ -136,7 +167,16 @@ export function ItemContent({
dangerouslySetInnerHTML={markdownContent.innerHTML}
/>
<div className={c("item-metadata")}>
{dateStr && <span className={c("item-metadata-date")}>{date}</span>}
<>
{relativeDate && (
<span className={c("item-metadata-date-relative")}>
{relativeDate}
</span>
)}
{!hideDateDisplay && dateStr && (
<span className={c("item-metadata-date")}>{date}</span>
)}
</>
</div>
</div>
);
Expand Down
11 changes: 9 additions & 2 deletions src/components/Item/ItemForm.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React from "react";
import useOnclickOutside from "react-cool-onclickoutside";

import { Item } from "../types";
import { c, generateInstanceId } from "../helpers";
Expand All @@ -15,6 +16,12 @@ export function ItemForm({ addItem }: ItemFormProps) {
const [itemTitle, setItemTitle] = React.useState("");
const { view } = React.useContext(ObsidianContext);

const clickOutsideRef = useOnclickOutside(() => {
setIsInputVisible(false);
}, {
ignoreClass: c("ignore-click-outside")
})

const clear = () => {
setItemTitle("");
setIsInputVisible(false);
Expand Down Expand Up @@ -48,7 +55,7 @@ export function ItemForm({ addItem }: ItemFormProps) {

if (isInputVisible) {
return (
<>
<div ref={clickOutsideRef}>
<div className={c("item-input-wrapper")}>
<div data-replicated-value={itemTitle} className={c("grow-wrap")}>
<textarea
Expand All @@ -69,7 +76,7 @@ export function ItemForm({ addItem }: ItemFormProps) {
Cancel
</button>
</div>
</>
</div>
);
}

Expand Down
Loading

0 comments on commit 753a18e

Please sign in to comment.