Skip to content

Commit

Permalink
feat: enhance datetime helper
Browse files Browse the repository at this point in the history
  • Loading branch information
nishantwrp committed Nov 8, 2023
1 parent 33fdc79 commit d7cb463
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 14 deletions.
32 changes: 30 additions & 2 deletions src/helpers/advanced_datetime.ts → src/helpers/datetime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,32 @@ import { AttributeValueType, AttributeDefinition, AttributeParser } from "./util
import * as moment from "moment";

const FORMAT = "format";
const SET_DATE = "set_date";
const SET_TIME = "set_time";
const DELTA_YEARS = "delta_years";
const DELTA_MONTHS = "delta_months";
const DELTA_DAYS = "delta_days";
const DELTA_HOURS = "delta_hours";
const DELTA_MINUTES = "delta_minutes";
const DELTA_SECONDS = "delta_seconds";

export const advancedDatetimeHelper: HelperConstructorBlock = (ctx) => {
export const datetimeHelper: HelperConstructorBlock = (ctx) => {
const schema: AttributeDefinition[] = [
{
name: FORMAT,
valueType: AttributeValueType.String,
defaultValue: ctx.dateAndTimeUtils.getDateTimeFormat()
},
{
name: SET_DATE,
valueType: AttributeValueType.String,
defaultValue: ""
},
{
name: SET_TIME,
valueType: AttributeValueType.String,
defaultValue: ""
},
{
name: DELTA_YEARS,
valueType: AttributeValueType.Number,
Expand Down Expand Up @@ -49,11 +61,27 @@ export const advancedDatetimeHelper: HelperConstructorBlock = (ctx) => {
}
];

return new HandlebarsHelper("advanced_datetime", function (options) {
return new HandlebarsHelper("datetime", function (options) {
const parser = new AttributeParser(schema);
const attrs = parser.parse(options.hash);

const now = moment(new Date().getTime());

if (attrs[SET_DATE]) {
const parsedDate = ctx.dateAndTimeUtils.parseDate(attrs[SET_DATE] as string, ctx.dateAndTimeUtils.getDateFormat());
now.set("date", parsedDate.date);
now.set("month", parsedDate.month);
now.set("year", parsedDate.year);
}

if (attrs[SET_TIME]) {
const parsedTime = ctx.dateAndTimeUtils.parseTime(attrs[SET_TIME] as string, ctx.dateAndTimeUtils.getTimeFormat());
now.set("hours", parsedTime.hours);
now.set("minutes", parsedTime.minutes);
now.set("seconds", 0);
now.set("milliseconds", 0);
}

now.add(attrs[DELTA_YEARS] as number, "years");
now.add(attrs[DELTA_MONTHS] as number, "months");
now.add(attrs[DELTA_DAYS] as number, "days");
Expand Down
4 changes: 2 additions & 2 deletions src/helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { compareHelper } from "./compare";
import { mathHelper } from "./math";
import { conditionHelper } from "./condition";
import { repeatHelper } from "./repeat";
import { advancedDatetimeHelper } from "./advanced_datetime";
import { datetimeHelper } from "./datetime";
import { caseHelper } from "./case";

export class HelperFactory {
Expand All @@ -17,7 +17,7 @@ export class HelperFactory {
mathHelper,
conditionHelper,
repeatHelper,
advancedDatetimeHelper,
datetimeHelper,
caseHelper,
];

Expand Down
41 changes: 41 additions & 0 deletions src/utils/dateAndTime.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
import * as moment from "moment";

// These are meant to parse the date and time formats
// supported by Joplin. It doesn't support seconds or
// milliseconds.
interface ParsedDate {
date: number;
month: number;
year: number;
}

interface ParsedTime {
hours: number;
minutes: number;
}

export class DateAndTimeUtils {
private locale: string;
private dateFormat: string;
Expand Down Expand Up @@ -43,4 +57,31 @@ export class DateAndTimeUtils {
const diff = day >= startIndex ? day - startIndex : 6 - day;
return new Date().setDate(currentDate.getDate() - diff);
}

public parseDate(input: string, format: string): ParsedDate {
const date = moment(input, format, true);

if (!date.isValid()) {
throw new Error(`Was not able to parse ${input} according to format ${format}`);
}

return {
date: date.date(),
month: date.month(),
year: date.year(),
};
}

public parseTime(input: string, format: string): ParsedTime {
const time = moment(input, format, true);

if (!time.isValid()) {
throw new Error(`Was not able to parse ${input} according to format ${format}`);
}

return {
hours: time.hours(),
minutes: time.minutes(),
};
}
}
20 changes: 10 additions & 10 deletions tests/parser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -910,8 +910,8 @@ describe("Template parser", () => {
expect(errorMessagesShown).toEqual(invalidTemplates.length);
});

// Advanced datetime helper.
test("should support advanced datetime helper", async () => {
// Datetime helper.
test("should support datetime helper", async () => {
const template = {
id: "note-id",
title: "Some Template",
Expand All @@ -921,12 +921,12 @@ describe("Template parser", () => {
---
{{ advanced_datetime }}
{{ advanced_datetime format="[]YYYY[-]MM[-]DD[ ]HH[:]mm[:]ss" }}
{{ advanced_datetime delta_years="2" delta_months=-1 }}
{{ advanced_datetime delta_days=(math -1 "*" var1) }}
{{ advanced_datetime delta_days=1 delta_hours=(math -24 "*" var1) delta_minutes="56" }}
{{ advanced_datetime delta_seconds=8 format="HH:mm:ss" }}
{{ datetime }}
{{ datetime format="[]YYYY[-]MM[-]DD[ ]HH[:]mm[:]ss" }}
{{ datetime delta_years="2" delta_months=-1 }}
{{ datetime delta_days=(math -1 "*" var1) }}
{{ datetime delta_days=1 delta_hours=(math -24 "*" var1) delta_minutes="56" }}
{{ datetime delta_seconds=8 format="HH:mm:ss" }}
`
};
testVariableTypes({
Expand All @@ -950,10 +950,10 @@ describe("Template parser", () => {
`);
});

test("should show error with invalid usage of advanced datetime helper", async () => {
test("should show error with invalid usage of datetime helper", async () => {
const invalidTemplates = [];
invalidTemplates.push(dedent`
{{ advanced_datetime delta_hours="abc" }}
{{ datetime delta_hours="abc" }}
`);

let errorMessagesShown = 0;
Expand Down
25 changes: 25 additions & 0 deletions tests/utils/dateAndTime.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,29 @@ describe("Date and time utils", () => {
expect(bows).toEqual("08/08/2021");
expect(bowm).toEqual("09/08/2021");
});

test("should correctly parse date", () => {
const utils = new DateAndTimeUtils(userLocale, dateFormat, timeFormat);
const parsedDate = utils.parseDate("2023/19/12", "YYYY/DD/MM");
expect(parsedDate.date).toEqual(19);
expect(parsedDate.month).toEqual(11);
expect(parsedDate.year).toEqual(2023);
});

test("should throw error if couldn't parse date", () => {
const utils = new DateAndTimeUtils(userLocale, dateFormat, timeFormat);
expect(() => utils.parseDate("abc", "YYYY/DD/MM")).toThrow();
});

test("should correctly parse time", () => {
const utils = new DateAndTimeUtils(userLocale, dateFormat, timeFormat);
const parsedTime = utils.parseTime("04:45 pm", "HH:mm a");
expect(parsedTime.hours).toEqual(16);
expect(parsedTime.minutes).toEqual(45);
});

test("should throw error if couldn't parse time", () => {
const utils = new DateAndTimeUtils(userLocale, dateFormat, timeFormat);
expect(() => utils.parseTime("04:61 pm", "HH:mm a")).toThrow();
});
});

0 comments on commit d7cb463

Please sign in to comment.